diff --git a/lefthook.yml b/lefthook.yml index 6bc0c829..b62f61da 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -35,12 +35,12 @@ # runner: go run pre-commit: - parallel: false + parallel: true commands: lint: glob: "*.{ts,mts,tsx}" - run: npx eslint --fix {staged_files} + run: npx eslint --fix --cache {staged_files} prettier: tags: frontend style glob: "{src,tests,tools,public}/**/*.{js,jsx,ts,tsx,css,scss,html}" - run: npx prettier --write {staged_files} + run: npx prettier --write --cache {staged_files} diff --git a/package-lock.json b/package-lock.json index fd6703c3..3764eedc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "@esri/calcite-components": "^2.9.0", "@types/geojson": "^7946.0.14", + "@wsdot/land-use-codes": "github:WSDOT-GIS/land-use", "@wsdot/web-styles": "github:WSDOT-GIS/wsdot-web-styles", "dms-conversion": "^3.1.3" }, @@ -2629,6 +2630,15 @@ "integrity": "sha512-vRq+GniJAYSBmTRnhCYPAPq6THYqovJ/gzGThWbgEZUQaBccndGTi1hdiUP15HzEco0I6t4RCtXyX0rsSmwgPw==", "dev": true }, + "node_modules/@wsdot/land-use-codes": { + "resolved": "git+ssh://git@github.com/WSDOT-GIS/land-use.git#91f1af72835ae761947276e745d4c90f0d777e17", + "optionalDependencies": { + "jsdom": "^24.1.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + } + }, "node_modules/@wsdot/web-styles": { "version": "1.0.0", "resolved": "git+ssh://git@github.com/WSDOT-GIS/wsdot-web-styles.git#4a41e1f8fdb93432f19be81a22a46d1f34232738", @@ -2682,7 +2692,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "debug": "^4.3.4" @@ -2838,7 +2848,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "devOptional": true }, "node_modules/balanced-match": { "version": "1.0.2", @@ -3174,7 +3184,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, + "devOptional": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -3491,7 +3501,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.0.1.tgz", "integrity": "sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==", - "dev": true, + "devOptional": true, "dependencies": { "rrweb-cssom": "^0.6.0" }, @@ -3511,7 +3521,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", - "dev": true, + "devOptional": true, "dependencies": { "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.0.0" @@ -3527,7 +3537,7 @@ }, "node_modules/debug": { "version": "4.3.4", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "ms": "2.1.2" @@ -3585,7 +3595,7 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true + "devOptional": true }, "node_modules/deep-eql": { "version": "4.1.3", @@ -3608,7 +3618,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.4.0" } @@ -3655,7 +3665,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.12" }, @@ -4706,7 +4716,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, + "devOptional": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -5066,7 +5076,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", - "dev": true, + "devOptional": true, "dependencies": { "whatwg-encoding": "^3.1.1" }, @@ -5084,7 +5094,7 @@ "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "agent-base": "^7.1.0", @@ -5098,7 +5108,7 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "agent-base": "^7.0.2", @@ -5121,7 +5131,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, + "devOptional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -5312,7 +5322,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true + "devOptional": true }, "node_modules/is-stream": { "version": "3.0.0", @@ -5450,7 +5460,7 @@ "version": "24.1.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.0.tgz", "integrity": "sha512-6gpM7pRXCwIOKxX47cgOyvyQDN/Eh0f1MeKySBV2xGdKtqJBLj8P25eY3EVCWo2mglDDzozR2r2MW4T+JiNUZA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "cssstyle": "^4.0.1", @@ -5491,7 +5501,7 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.0.tgz", "integrity": "sha512-KlSv0pm9kgQSRxXEMgtivPJ4h826YHsuob8pSHcfSZsSXGtvpEAie8S0AnXuObEJ7nhikOb4ahwxDm0H2yW17g==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/jsesc": { @@ -5976,7 +5986,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, + "devOptional": true, "engines": { "node": ">= 0.6" } @@ -5985,7 +5995,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, + "devOptional": true, "dependencies": { "mime-db": "1.52.0" }, @@ -6062,7 +6072,7 @@ }, "node_modules/ms": { "version": "2.1.2", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/nanoid": { @@ -6187,7 +6197,7 @@ "version": "2.2.10", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.10.tgz", "integrity": "sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/object-assign": { @@ -6320,7 +6330,7 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, + "devOptional": true, "dependencies": { "entities": "^4.4.0" }, @@ -6580,14 +6590,14 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, + "devOptional": true, "engines": { "node": ">=6" } @@ -6596,7 +6606,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/queue-microtask": { @@ -6827,7 +6837,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/resolve": { @@ -6914,7 +6924,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", - "dev": true + "devOptional": true }, "node_modules/run-parallel": { "version": "1.2.0", @@ -6942,13 +6952,13 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "devOptional": true }, "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, + "devOptional": true, "dependencies": { "xmlchars": "^2.2.0" }, @@ -7206,7 +7216,7 @@ "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true + "devOptional": true }, "node_modules/tabbable": { "version": "6.2.0", @@ -7296,7 +7306,7 @@ "version": "4.1.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "dev": true, + "devOptional": true, "license": "BSD-3-Clause", "dependencies": { "psl": "^1.1.33", @@ -7312,7 +7322,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", - "dev": true, + "devOptional": true, "dependencies": { "punycode": "^2.3.1" }, @@ -7479,7 +7489,6 @@ "version": "5.4.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", - "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -7545,7 +7554,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 4.0.0" @@ -7594,7 +7603,7 @@ "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "querystringify": "^2.1.1", @@ -7937,7 +7946,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", - "dev": true, + "devOptional": true, "dependencies": { "xml-name-validator": "^5.0.0" }, @@ -7957,7 +7966,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, + "devOptional": true, "engines": { "node": ">=12" } @@ -7966,7 +7975,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "dev": true, + "devOptional": true, "dependencies": { "iconv-lite": "0.6.3" }, @@ -7978,7 +7987,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, + "devOptional": true, "engines": { "node": ">=18" } @@ -7987,7 +7996,7 @@ "version": "14.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", - "dev": true, + "devOptional": true, "dependencies": { "tr46": "^5.0.0", "webidl-conversions": "^7.0.0" @@ -8043,7 +8052,7 @@ "version": "8.17.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=10.0.0" @@ -8083,7 +8092,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true, + "devOptional": true, "engines": { "node": ">=18" } @@ -8092,7 +8101,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true + "devOptional": true }, "node_modules/xss": { "version": "1.0.13", diff --git a/package.json b/package.json index 650354d9..219c3ad2 100644 --- a/package.json +++ b/package.json @@ -71,6 +71,7 @@ "dependencies": { "@esri/calcite-components": "^2.9.0", "@types/geojson": "^7946.0.14", + "@wsdot/land-use-codes": "github:WSDOT-GIS/land-use", "@wsdot/web-styles": "github:WSDOT-GIS/wsdot-web-styles", "dms-conversion": "^3.1.3" } diff --git a/src/layers/parcels/colors.ts b/src/layers/parcels/colors.ts new file mode 100644 index 00000000..e571031e --- /dev/null +++ b/src/layers/parcels/colors.ts @@ -0,0 +1,19 @@ +import { rangeDomainProperties } from "@wsdot/land-use-codes"; + +/** + * Colors from https://colorbrewer2.org/?type=diverging&scheme=RdYlBu&n=8 + */ +export const colors = [ + "#b35806", + "#e08214", + "#fdb863", + "#fee0b6", + "#d8daeb", + "#b2abd2", + "#8073ac", + "#542788", +] as const; + +export const landUseCategoryToColorMapping = new Map( + rangeDomainProperties.map((p, i) => [p.name, colors[i]] as const), +); diff --git a/src/layers/ParcelsLayer.ts b/src/layers/parcels/index.ts similarity index 80% rename from src/layers/ParcelsLayer.ts rename to src/layers/parcels/index.ts index 76ae2fb4..a0d6bd43 100644 --- a/src/layers/ParcelsLayer.ts +++ b/src/layers/parcels/index.ts @@ -1,38 +1,20 @@ +import { labelSymbol } from "./label"; +import { renderer } from "./renderer"; + const arcGisOnlineId = "e8f2df3ed92843738f3dd778e92e93fc"; const [ { default: Field }, { default: FeatureLayer }, { default: PortalItem }, - { default: SimpleRenderer }, - { default: SimpleFillSymbol }, - { default: SimpleLineSymbol }, - { default: TextSymbol }, { default: LabelClass }, ] = await Promise.all([ import("@arcgis/core/layers/support/Field"), import("@arcgis/core/layers/FeatureLayer"), import("@arcgis/core/portal/PortalItem"), - import("@arcgis/core/renderers/SimpleRenderer"), - import("@arcgis/core/symbols/SimpleFillSymbol"), - import("@arcgis/core/symbols/SimpleLineSymbol"), - import("@arcgis/core/symbols/TextSymbol"), import("@arcgis/core/layers/support/LabelClass"), ]); -const outlineColor = "light-gray"; - -const renderer = new SimpleRenderer({ - symbol: new SimpleFillSymbol({ - style: "none", - outline: new SimpleLineSymbol({ - color: outlineColor, - style: "dash-dot", - width: 0.5, - }), - }), -}); - const fields = ( [ { @@ -139,16 +121,6 @@ const fields = ( ] as const ).map((field) => new Field(field)); -const labelSymbol = new TextSymbol({ - color: outlineColor, - haloColor: "white", - haloSize: 0.3, - font: { - size: 10, - weight: "normal", - }, -}); - /** * Parcels layer * @see {@link https://www.arcgis.com/home/item.html?id=e8f2df3ed92843738f3dd778e92e93fc} @@ -157,6 +129,7 @@ export const parcelsLayer = new FeatureLayer({ id: "parcels", title: "Parcels From geo.wa.gov", fields, + minScale: 9027.977411, labelsVisible: false, labelingInfo: [ new LabelClass({ diff --git a/src/layers/parcels/label.ts b/src/layers/parcels/label.ts new file mode 100644 index 00000000..b6c354d2 --- /dev/null +++ b/src/layers/parcels/label.ts @@ -0,0 +1,13 @@ +import TextSymbol from "@arcgis/core/symbols/TextSymbol"; + +const outlineColor = "light-gray"; + +export const labelSymbol = new TextSymbol({ + color: outlineColor, + haloColor: "white", + haloSize: 0.3, + font: { + size: 10, + weight: "normal", + }, +}); diff --git a/src/layers/parcels/renderer.ts b/src/layers/parcels/renderer.ts new file mode 100644 index 00000000..3a8ce991 --- /dev/null +++ b/src/layers/parcels/renderer.ts @@ -0,0 +1,44 @@ +import { landUseCategoryToColorMapping } from "./colors"; +import Color from "@arcgis/core/Color"; +import ClassBreaksRenderer from "@arcgis/core/renderers/ClassBreaksRenderer"; +import ClassBreakInfo from "@arcgis/core/renderers/support/ClassBreakInfo"; +import SimpleFillSymbol from "@arcgis/core/symbols/SimpleFillSymbol"; +import { rangeDomainProperties } from "@wsdot/land-use-codes"; + +const defaultSymbol = new SimpleFillSymbol({ + outline: { + color: "black", + width: 2, + }, +}); + +type RangeDomainPropertiesItem = (typeof rangeDomainProperties)[number]; + +const createClassBreak = ({ + name: label, + minValue, + maxValue, +}: RangeDomainPropertiesItem): ClassBreakInfo => { + const symbol = defaultSymbol.clone(); + symbol.outline.color = new Color(landUseCategoryToColorMapping.get(label)); + return new ClassBreakInfo({ label, minValue, maxValue, symbol }); +}; +const classBreaks = rangeDomainProperties.map(createClassBreak); + +export const renderer = new ClassBreaksRenderer({ + defaultSymbol, + defaultLabel: "Unknown", + field: "LANDUSE_CD", + classBreakInfos: classBreaks, +}); + +if (import.meta.hot) { + // Update the colors in the class breaks when "./colors" is modified. + import.meta.hot.accept("./colors", (mod) => { + if (mod) { + console.log("hot module replacement", mod); + } + + renderer.classBreakInfos = rangeDomainProperties.map(createClassBreak); + }); +} diff --git a/src/main.ts b/src/main.ts index 1660a750..f49e406b 100644 --- a/src/main.ts +++ b/src/main.ts @@ -116,7 +116,7 @@ function openPopup(hits: __esri.GraphicHit[], view: MapView) { import("./layers/AccessControlLayer"), import("./layers/CityLimitsLayer"), import("./layers/MilepostLayer"), - import("./layers/ParcelsLayer"), + import("./layers/parcels"), import("./layers/TempLayer"), import("./WAExtent"), import("./widgets/LayerList"), @@ -239,6 +239,14 @@ function openPopup(hits: __esri.GraphicHit[], view: MapView) { console.error("Failed to import Legend module.", error); }); + if (import.meta.env.DEV) { + view.watch(["navigating"], (newValue) => { + if (!newValue) { + /* __PURE__ */ console.debug("scale", view.scale); + } + }); + } + whenOnce(() => map.initialized) .then(() => { const shell = document.querySelector("calcite-shell"); diff --git a/tests/hash.test.ts b/tests/hash.test.ts index d4e3a29a..03fc3192 100644 --- a/tests/hash.test.ts +++ b/tests/hash.test.ts @@ -2,25 +2,6 @@ import { parseMapPositionHash } from "../src/history-api"; import { test, expect, describe } from "vitest"; describe("parseMapPositionHash", () => { - test("Can parse hash with search parameters", () => { - const url = - "http://path/to/my/page.html#map=2.59/39.26/53.07/-24.1/60&foo=bar"; - - const expected = { - zoom: 2.59, - center: [53.07, 39.26], - bearing: -24.1, - pitch: 60, - qs: { - foo: "bar", - }, - }; - - const parsed = parseMapPositionHash(url); - - expect(parsed).toEqual(expected); - }); - test("Can parse hash without search parameters", () => { const url = "http://path/to/my/page.html#map=2.59/39.26/53.07/-24.1/60"; @@ -29,7 +10,6 @@ describe("parseMapPositionHash", () => { center: [53.07, 39.26], bearing: -24.1, pitch: 60, - qs: {}, }; const parsed = parseMapPositionHash(url);