diff --git a/.codacy.yml b/.codacy.yml
index c51b7ff70..6aea04e74 100644
--- a/.codacy.yml
+++ b/.codacy.yml
@@ -1,3 +1,9 @@
---
+engines:
+ eslint:
+ exclude_paths:
+ - app/assets/javascripts/highcharts-maps/tr.js
+ - plugins/tenant/omu/test/dummy/app/assets/javascripts/*
+ - plugins/tenant/acme/test/dummy/app/assets/javascripts/*
exclude_paths:
- '**.md'
diff --git a/.eslintrc.json b/.eslintrc.json
index 7d03cee42..d6622030e 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -1,3 +1,4 @@
{
- "extends": "standard"
-}
\ No newline at end of file
+ "extends": "standard",
+ "parser": "babel-eslint"
+}
diff --git a/Gemfile.lock b/Gemfile.lock
index 5c721b492..d5d64c6d9 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -94,13 +94,13 @@ GEM
authy (2.7.5)
httpclient (>= 2.5.3.3)
aws-eventstream (1.0.3)
- aws-partitions (1.266.0)
- aws-sdk-core (3.88.0)
+ aws-partitions (1.269.0)
+ aws-sdk-core (3.89.1)
aws-eventstream (~> 1.0, >= 1.0.2)
aws-partitions (~> 1, >= 1.239.0)
aws-sigv4 (~> 1.1)
jmespath (~> 1.0)
- aws-sdk-kms (1.27.0)
+ aws-sdk-kms (1.28.0)
aws-sdk-core (~> 3, >= 3.71.0)
aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.60.1)
@@ -130,7 +130,7 @@ GEM
bundler-audit (0.6.1)
bundler (>= 1.2.0, < 3)
thor (~> 0.18)
- byebug (11.1.0)
+ byebug (11.1.1)
capybara (3.30.0)
addressable
mini_mime (>= 0.1.3)
@@ -161,12 +161,12 @@ GEM
dotenv-rails (2.7.5)
dotenv (= 2.7.5)
railties (>= 3.2, < 6.1)
- erb_lint (0.0.30)
+ erb_lint (0.0.31)
activesupport
better_html (~> 1.0.7)
html_tokenizer
rainbow
- rubocop (~> 0.51)
+ rubocop (~> 0.79.0)
smart_properties
erubi (1.9.0)
execjs (2.7.0)
@@ -264,7 +264,7 @@ GEM
parallel (1.19.1)
parser (2.7.0.2)
ast (~> 2.4.0)
- pg (1.2.1)
+ pg (1.2.2)
pg_search (2.3.2)
activerecord (>= 5.2)
activesupport (>= 5.2)
@@ -281,7 +281,7 @@ GEM
pundit (2.1.0)
activesupport (>= 3.0.0)
pwned (2.0.1)
- rack (2.0.8)
+ rack (2.1.1)
rack-attack (6.2.2)
rack (>= 1.0, < 3)
rack-mini-profiler (1.1.4)
@@ -351,13 +351,13 @@ GEM
rubocop (>= 0.74)
rubocop-performance (1.5.2)
rubocop (>= 0.71.0)
- rubocop-rails (2.4.1)
+ rubocop-rails (2.4.2)
rack (>= 1.1)
rubocop (>= 0.72.0)
ruby-progressbar (1.10.1)
ruby-vips (2.0.17)
ffi (~> 1.9)
- rubyzip (2.0.0)
+ rubyzip (2.1.0)
safe_yaml (1.0.5)
sassc (2.2.1)
ffi (~> 1.9)
@@ -402,11 +402,11 @@ GEM
attr_required (>= 0.0.5)
httpclient (>= 2.4)
swearjar (1.3.1)
- telephone_number (1.4.5)
+ telephone_number (1.4.6)
thor (0.20.3)
thread_safe (0.3.6)
tilt (2.0.10)
- twilio-ruby (5.31.2)
+ twilio-ruby (5.31.3)
faraday (~> 1.0.0)
jwt (>= 1.5, <= 2.5)
nokogiri (>= 1.6, < 2.0)
diff --git a/README.md b/README.md
index 96a2f4cd1..90aeb1f8a 100644
--- a/README.md
+++ b/README.md
@@ -20,7 +20,7 @@ services, 50K students and 4K employees as a case.
Installation
------------
-See [installation guide](/doc/development/installation.md) for details.
+See [installation guide](/doc/operations/installation.md) for details.
Documentation
-------------
diff --git a/app.json b/app.json
index fa5d81237..26a167923 100644
--- a/app.json
+++ b/app.json
@@ -7,7 +7,7 @@
"rails"
],
"repository": "https://github.com/omu/nokul",
- "version": "0.7.4",
+ "version": "0.7.5",
"scripts": {
"dokku": {
"predeploy": "bin/plugdo bundle install -j4 --path /app/vendor/bundle --without development:test && bundle exec rails assets:precompile && bundle exec rails db:migrate"
diff --git a/app/assets/config/manifest.js b/app/assets/config/manifest.js
index 55c6085f2..6f144bc23 100644
--- a/app/assets/config/manifest.js
+++ b/app/assets/config/manifest.js
@@ -2,3 +2,5 @@
//= link_directory ../stylesheets .css
//= link application.js
+//= link chart.js
+//= link highcharts-langs/tr.js
diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js
index b70fe4df9..8b150a265 100644
--- a/app/assets/javascripts/application.js
+++ b/app/assets/javascripts/application.js
@@ -1,7 +1,5 @@
// Manifest file for common assets being used in panel
-//= require rails-ujs
-//= require activestorage
//= require coreui
//= require helpers/dynamic_select
//= require toastr/build/toastr.min
diff --git a/app/assets/javascripts/chart.js b/app/assets/javascripts/chart.js
new file mode 100644
index 000000000..cb31f8127
--- /dev/null
+++ b/app/assets/javascripts/chart.js
@@ -0,0 +1,5 @@
+//= require echarts/dist/echarts.min
+//= require highcharts/highcharts
+//= require highcharts/modules/exporting
+//= require highcharts/modules/map
+//= require highcharts-maps/tr
diff --git a/app/assets/javascripts/highcharts-langs/tr.js b/app/assets/javascripts/highcharts-langs/tr.js
new file mode 100644
index 000000000..40509d4bc
--- /dev/null
+++ b/app/assets/javascripts/highcharts-langs/tr.js
@@ -0,0 +1,26 @@
+/* eslint-disable no-undef */
+
+Highcharts.setOptions({
+ lang: {
+ contextButtonTitle: 'Grafik İşlem Menüsü',
+ decimalPoint: ',',
+ downloadJPEG: 'JPEG olarak indir',
+ downloadPDF: 'PDF olarak indir',
+ downloadPNG: 'PNG olarak indir',
+ downloadSVG: 'SVG olarak indir',
+ exportButtonTitle: 'Dışarı Aktar',
+ loading: 'Yükleniyor...',
+ months: ['Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık'],
+ printButtonTitle: 'Yazdır',
+ printChart: 'Yazdır',
+ rangeSelectorFrom: 'Başlangış',
+ rangeSelectorTo: 'Bitiş',
+ rangeSelectorZoom: 'Aralık seç',
+ resetZoom: 'Yakınlaşmayı Sıfırla',
+ resetZoomTitle: 'Yakınlaşmayı Sıfırla',
+ shortMonths: ['Oca', 'Şub', 'Mar', 'Nis', 'May', 'Haz', 'Tem', 'Ağu', 'Eyl', 'Eki', 'Kas', 'Ara'],
+ thousandsSep: '.',
+ viewFullscreen: 'Tam Ekran Görüntüle',
+ weekdays: ['Pazar', 'Pazartesi', 'Salı', 'Çarşamba', 'Perşembe', 'Cuma', 'Cumartesi']
+ }
+})
diff --git a/app/assets/javascripts/highcharts-maps/tr.js b/app/assets/javascripts/highcharts-maps/tr.js
new file mode 100644
index 000000000..7f7a70eac
--- /dev/null
+++ b/app/assets/javascripts/highcharts-maps/tr.js
@@ -0,0 +1,14 @@
+/* global Highcharts */
+/* eslint no-undef: "error" */
+
+Highcharts.maps['countries/tr/tr-all'] = {
+ title: 'Turkey',
+ version: '1.1.2',
+ type: 'FeatureCollection',
+ copyright: 'Copyright (c) 2015 Highsoft AS, Based on data from Natural Earth',
+ copyrightShort: 'Natural Earth',
+ copyrightUrl: 'http://www.naturalearthdata.com',
+ crs: { type: 'name', properties: { name: 'urn:ogc:def:crs:EPSG:32636' } },
+ 'hc-transform': { default: { crs: '+proj=utm +zone=36 +datum=WGS84 +units=m +no_defs', scale: 0.000418317446042, jsonres: 15.5, jsonmarginX: -999, jsonmarginY: 9851.0, xoffset: -125397.473102, yoffset: 4675858.14012 } },
+ features: [{ type: 'Feature', id: 'TR.OR', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.68, 'hc-middle-y': 0.42, 'hc-key': 'tr-or', 'hc-a2': 'OR', labelrank: '7', hasc: 'TR.OR', 'alt-name': 'Ordu', 'woe-id': '2347304', subregion: null, fips: 'TU52', 'postal-code': 'OR', name: 'Ordu', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '37.4229', 'woe-name': 'Ordu', latitude: '40.8376', 'woe-label': 'Ordu, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[5081, 8906], [5147, 8927], [5238, 8997], [5315, 9122], [5376, 9125], [5449, 9101], [5511, 9056], [5553, 9054], [5608, 9132], [5660, 9122], [5663, 9077], [5727, 9024], [5773, 9033], [5847, 9014], [5824, 8931], [5840, 8865], [5834, 8758], [5890, 8702], [5809, 8667], [5808, 8617], [5751, 8608], [5701, 8556], [5638, 8584], [5604, 8641], [5572, 8718], [5498, 8719], [5368, 8800], [5255, 8796], [5079, 8866], [5081, 8906]]] } }, { type: 'Feature', id: 'TR.SS', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.44, 'hc-middle-y': 0.58, 'hc-key': 'tr-ss', 'hc-a2': 'SS', labelrank: '7', hasc: 'TR.SS', 'alt-name': 'Samsun', 'woe-id': '2347307', subregion: null, fips: 'TU55', 'postal-code': 'SS', name: 'Samsun', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '36.0198', 'woe-name': 'Samsun', latitude: '41.2761', 'woe-label': 'Samsun, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[5315, 9122], [5238, 8997], [5147, 8927], [5081, 8906], [5051, 8936], [4937, 8906], [4877, 8946], [4824, 9000], [4803, 8985], [4779, 8922], [4713, 8881], [4670, 8900], [4534, 8898], [4497, 8934], [4398, 9002], [4364, 8995], [4194, 9038], [4132, 9037], [4110, 9118], [4081, 9167], [4106, 9203], [4196, 9253], [4217, 9222], [4303, 9164], [4416, 9186], [4395, 9281], [4386, 9394], [4406, 9443], [4471, 9439], [4617, 9498], [4650, 9519], [4699, 9496], [4741, 9444], [4753, 9325], [4812, 9253], [4867, 9226], [4872, 9205], [4931, 9172], [4995, 9216], [5019, 9273], [5137, 9261], [5220, 9224], [5247, 9188], [5253, 9144], [5315, 9122]]] } }, { type: 'Feature', id: 'TR.GA', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.68, 'hc-middle-y': 0.57, 'hc-key': 'tr-ga', 'hc-a2': 'GA', labelrank: '7', hasc: 'TR.GA', 'alt-name': 'Gaziantep', 'woe-id': '2347284', subregion: null, fips: 'TU83', 'postal-code': 'GA', name: 'Gaziantep', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '37.2462', 'woe-name': 'Gaziantep', latitude: '36.9988', 'woe-label': 'Gaziantep, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[5963, 6042], [5846, 5982], [5751, 5957], [5677, 5911], [5626, 5953], [5527, 6000], [5510, 5988], [5435, 6063], [5350, 6097], [5330, 6137], [5292, 6132], [5288, 6083], [5203, 6032], [5172, 6000], [5135, 6037], [5049, 6092], [5121, 6192], [5150, 6256], [5196, 6321], [5264, 6356], [5290, 6394], [5318, 6377], [5337, 6314], [5382, 6301], [5432, 6359], [5610, 6422], [5682, 6430], [5706, 6447], [5707, 6522], [5832, 6541], [5900, 6519], [5948, 6482], [5910, 6473], [5862, 6409], [5840, 6348], [5863, 6212], [5895, 6188], [5927, 6195], [5923, 6152], [5948, 6129], [5963, 6042]]] } }, { type: 'Feature', id: 'TR.4409', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.42, 'hc-middle-y': 0.43, 'hc-key': 'tr-4409', 'hc-a2': 'NU', labelrank: '20', hasc: '-99', 'alt-name': null, 'woe-id': '-99', subregion: null, fips: null, 'postal-code': null, name: null, country: 'Turkey', 'type-en': null, region: null, longitude: '29.658', 'woe-name': null, latitude: '36.1327', 'woe-label': null, type: null }, geometry: { type: 'Polygon', coordinates: [[[3515, 5497], [3510, 5491], [3512, 5495], [3515, 5497]]] } }, { type: 'Feature', id: 'TR.KC', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.66, 'hc-middle-y': 0.37, 'hc-key': 'tr-kc', 'hc-a2': 'KC', labelrank: '7', hasc: 'TR.KC', 'alt-name': 'Kocaeli', 'woe-id': '2347296', subregion: null, fips: 'TU41', 'postal-code': 'KC', name: 'Kocaeli', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '29.9396', 'woe-name': 'Kocaeli', latitude: '40.9008', 'woe-label': 'Kocaeli, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[1349, 9102], [1498, 9091], [1573, 9137], [1658, 9105], [1636, 9051], [1644, 9014], [1684, 9006], [1669, 8936], [1590, 8949], [1597, 8920], [1561, 8883], [1535, 8776], [1512, 8732], [1407, 8689], [1369, 8687], [1295, 8717], [1154, 8677], [1091, 8688], [1097, 8715], [1099, 8779], [1140, 8805], [1171, 8777], [1278, 8797], [1371, 8787], [1375, 8817], [1285, 8817], [1232, 8841], [1102, 8841], [1062, 8832], [1009, 8916], [1121, 9008], [1149, 9004], [1190, 8945], [1225, 8932], [1240, 8966], [1339, 9014], [1355, 9050], [1349, 9102]]] } }, { type: 'Feature', id: 'TR.BK', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.63, 'hc-middle-y': 0.67, 'hc-key': 'tr-bk', 'hc-a2': 'BK', labelrank: '7', hasc: 'TR.BK', 'alt-name': 'Balıkesir', 'woe-id': '2347267', subregion: null, fips: 'TU10', 'postal-code': 'BK', name: 'Balıkesir', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '27.8355', 'woe-name': 'Balıkesir', latitude: '39.7193', 'woe-label': 'Balıkesir, TR, Turkey', type: 'Il' }, geometry: { type: 'MultiPolygon', coordinates: [[[[113, 8810], [165, 8792], [156, 8772], [95, 8748], [58, 8769], [54, 8796], [113, 8810]]], [[[-430, 7765], [-459, 7834], [-520, 7847], [-398, 7929], [-404, 7954], [-332, 7987], [-321, 8050], [-345, 8059], [-473, 8044], [-471, 8102], [-449, 8157], [-376, 8150], [-264, 8204], [-205, 8207], [-124, 8181], [-30, 8227], [0, 8311], [-17, 8335], [17, 8424], [-25, 8464], [59, 8523], [65, 8561], [185, 8558], [240, 8602], [189, 8610], [135, 8692], [178, 8715], [292, 8683], [326, 8661], [251, 8611], [272, 8585], [366, 8602], [419, 8601], [355, 8531], [380, 8478], [357, 8427], [386, 8351], [424, 8310], [440, 8236], [581, 8121], [625, 8113], [653, 8131], [670, 8057], [707, 8023], [781, 8021], [810, 7997], [774, 7913], [764, 7862], [714, 7786], [631, 7752], [624, 7694], [575, 7704], [522, 7680], [433, 7674], [395, 7643], [321, 7642], [295, 7708], [240, 7776], [176, 7775], [202, 7829], [190, 7852], [70, 7864], [-17, 7913], [-61, 7893], [-98, 7950], [-129, 7958], [-269, 7885], [-304, 7844], [-430, 7765]]]] } }, { type: 'Feature', id: 'TR.CK', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.58, 'hc-middle-y': 0.59, 'hc-key': 'tr-ck', 'hc-a2': 'CK', labelrank: '7', hasc: 'TR.CK', 'alt-name': 'Çanakkale', 'woe-id': '2347274', subregion: null, fips: 'TU17', 'postal-code': 'CK', name: 'Çanakkale', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '26.8233', 'woe-name': 'Çanakkale', latitude: '40.0553', 'woe-label': 'Çanakkale, TR, Turkey', type: 'Il' }, geometry: { type: 'MultiPolygon', coordinates: [[[[-806, 8282], [-783, 8272], [-790, 8237], [-839, 8267], [-806, 8282]]], [[[-347, 8883], [-347, 8885], [-268, 8872], [-272, 8815], [-258, 8760], [-418, 8695], [-459, 8628], [-561, 8550], [-618, 8524], [-603, 8490], [-689, 8432], [-730, 8428], [-665, 8524], [-658, 8569], [-686, 8618], [-622, 8644], [-557, 8693], [-463, 8738], [-422, 8735], [-385, 8771], [-330, 8795], [-354, 8838], [-347, 8883]]], [[[-941, 8555], [-854, 8573], [-823, 8556], [-831, 8510], [-805, 8500], [-944, 8475], [-999, 8501], [-941, 8555]]], [[[-473, 8044], [-592, 8031], [-647, 8006], [-683, 8014], [-765, 7999], [-808, 8013], [-781, 8100], [-759, 8119], [-746, 8175], [-756, 8203], [-739, 8347], [-710, 8393], [-646, 8396], [-596, 8456], [-583, 8517], [-531, 8527], [-392, 8655], [-239, 8637], [-191, 8677], [-76, 8673], [-62, 8609], [-1, 8570], [65, 8561], [59, 8523], [-25, 8464], [17, 8424], [-17, 8335], [0, 8311], [-30, 8227], [-124, 8181], [-205, 8207], [-264, 8204], [-376, 8150], [-449, 8157], [-471, 8102], [-473, 8044]]]] } }, { type: 'Feature', id: 'TR.TT', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.51, 'hc-middle-y': 0.5, 'hc-key': 'tr-tt', 'hc-a2': 'TT', labelrank: '7', hasc: 'TR.TT', 'alt-name': 'Tokat', 'woe-id': '2347311', subregion: null, fips: 'TU60', 'postal-code': 'TT', name: 'Tokat', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '36.5724', 'woe-name': 'Tokat', latitude: '40.4442', 'woe-label': 'Tokat, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[4937, 8906], [5051, 8936], [5081, 8906], [5079, 8866], [5255, 8796], [5368, 8800], [5498, 8719], [5572, 8718], [5604, 8641], [5549, 8534], [5455, 8488], [5312, 8470], [5221, 8438], [5157, 8443], [5117, 8423], [5085, 8309], [4987, 8256], [4896, 8248], [4768, 8217], [4739, 8262], [4741, 8331], [4717, 8353], [4620, 8325], [4525, 8327], [4441, 8398], [4477, 8463], [4536, 8488], [4618, 8631], [4708, 8626], [4780, 8592], [4874, 8654], [4876, 8690], [4920, 8702], [4969, 8817], [4927, 8865], [4937, 8906]]] } }, { type: 'Feature', id: 'TR.GI', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.44, 'hc-middle-y': 0.57, 'hc-key': 'tr-gi', 'hc-a2': 'GI', labelrank: '7', hasc: 'TR.GI', 'alt-name': 'Giresun', 'woe-id': '2347285', subregion: null, fips: 'TU28', 'postal-code': 'GI', name: 'Giresun', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '38.6055', 'woe-name': 'Giresun', latitude: '40.5379', 'woe-label': 'Giresun, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[6337, 8403], [6316, 8392], [6243, 8385], [6127, 8424], [6071, 8407], [5968, 8463], [5890, 8702], [5834, 8758], [5840, 8865], [5824, 8931], [5847, 9014], [5942, 9011], [5967, 8992], [6081, 9005], [6138, 9044], [6177, 9032], [6211, 9068], [6287, 9103], [6349, 9108], [6406, 9133], [6397, 9044], [6407, 8942], [6419, 8915], [6354, 8903], [6294, 8846], [6297, 8805], [6267, 8758], [6268, 8694], [6284, 8677], [6350, 8665], [6395, 8637], [6394, 8610], [6313, 8545], [6318, 8471], [6337, 8403]]] } }, { type: 'Feature', id: 'TR.EN', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.18, 'hc-middle-y': 0.45, 'hc-key': 'tr-en', 'hc-a2': 'EN', labelrank: '7', hasc: 'TR.EN', 'alt-name': 'Erzincan', 'woe-id': '2347281', subregion: null, fips: 'TU24', 'postal-code': 'EN', name: 'Erzincan', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '39.5121', 'woe-name': 'Erzincan', latitude: '39.6874', 'woe-label': 'Erzincan, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[6243, 8385], [6316, 8392], [6337, 8403], [6403, 8384], [6509, 8335], [6529, 8314], [6597, 8292], [6728, 8302], [6818, 8339], [6859, 8400], [6947, 8418], [6993, 8453], [7085, 8441], [7070, 8360], [7101, 8347], [7196, 8354], [7237, 8308], [7262, 8242], [7328, 8201], [7302, 8131], [7304, 8086], [7267, 8095], [7092, 8092], [7059, 8103], [6952, 8057], [6876, 8080], [6795, 8023], [6667, 8000], [6580, 8007], [6506, 7989], [6423, 7957], [6400, 7923], [6319, 7872], [6328, 7814], [6286, 7791], [6262, 7738], [6281, 7652], [6264, 7648], [6250, 7639], [6211, 7680], [6160, 7701], [6107, 7700], [6061, 7720], [6076, 7765], [6053, 7892], [6095, 7946], [6041, 7991], [6047, 8119], [6084, 8182], [6126, 8197], [6118, 8230], [6040, 8214], [6051, 8298], [6075, 8314], [6129, 8293], [6183, 8321], [6234, 8320], [6243, 8385]]] } }, { type: 'Feature', id: 'TR.BG', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.59, 'hc-middle-y': 0.44, 'hc-key': 'tr-bg', 'hc-a2': 'BG', labelrank: '7', hasc: 'TR.BG', 'alt-name': 'Bingöl', 'woe-id': '2347269', subregion: null, fips: 'TU12', 'postal-code': 'BG', name: 'Bingöl', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '40.646', 'woe-name': 'Bingöl', latitude: '39.0743', 'woe-label': 'Bingöl, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[7267, 8095], [7304, 8086], [7354, 8083], [7433, 8133], [7509, 8078], [7587, 8061], [7642, 7995], [7628, 7949], [7651, 7877], [7695, 7818], [7698, 7758], [7663, 7706], [7650, 7648], [7714, 7546], [7520, 7428], [7374, 7429], [7289, 7398], [7288, 7356], [7254, 7319], [7188, 7311], [7174, 7376], [7141, 7418], [7161, 7497], [7198, 7490], [7213, 7565], [7164, 7627], [7146, 7682], [7153, 7733], [7198, 7823], [7178, 7856], [7115, 7824], [6991, 7745], [7002, 7793], [6986, 7846], [6993, 7920], [7026, 7946], [7074, 7951], [7082, 7978], [7133, 7991], [7179, 8054], [7220, 8052], [7267, 8095]]] } }, { type: 'Feature', id: 'TR.HT', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.52, 'hc-middle-y': 0.51, 'hc-key': 'tr-ht', 'hc-a2': 'HT', labelrank: '7', hasc: 'TR.HT', 'alt-name': 'Hatay', 'woe-id': '2347286', subregion: null, fips: 'TU31', 'postal-code': 'HT', name: 'Hatay', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '36.2284', 'woe-name': 'Hatay', latitude: '36.4876', 'woe-label': 'Hatay, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[5049, 6092], [5135, 6037], [5172, 6000], [5142, 5941], [5126, 5849], [5126, 5786], [5110, 5758], [5144, 5637], [5173, 5632], [5192, 5570], [5095, 5565], [5068, 5544], [5022, 5563], [5015, 5519], [5019, 5394], [4972, 5393], [4968, 5367], [4926, 5361], [4895, 5265], [4808, 5303], [4799, 5339], [4759, 5331], [4795, 5405], [4777, 5454], [4686, 5591], [4679, 5618], [4721, 5658], [4752, 5713], [4819, 5772], [4906, 5830], [4920, 5869], [4901, 5972], [4823, 6054], [4780, 6050], [4751, 6019], [4741, 6063], [4797, 6126], [4822, 6119], [4949, 6120], [4991, 6087], [5049, 6092]]] } }, { type: 'Feature', id: 'TR.AA', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.44, 'hc-middle-y': 0.67, 'hc-key': 'tr-aa', 'hc-a2': 'AA', labelrank: '7', hasc: 'TR.AA', 'alt-name': 'Adana', 'woe-id': '2347258', subregion: null, fips: 'TU81', 'postal-code': 'AA', name: 'Adana', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '35.7555', 'woe-name': 'Adana', latitude: '37.4006', 'woe-label': 'Adana, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[4822, 6119], [4797, 6126], [4741, 6063], [4751, 6019], [4679, 5946], [4609, 5936], [4546, 5889], [4599, 5899], [4582, 5822], [4532, 5808], [4513, 5825], [4419, 5773], [4239, 5877], [4175, 5899], [4252, 5950], [4241, 6070], [4257, 6116], [4234, 6138], [4171, 6155], [4154, 6270], [4126, 6291], [4084, 6373], [4085, 6423], [4124, 6492], [4101, 6583], [4119, 6610], [4177, 6600], [4233, 6610], [4306, 6687], [4405, 6682], [4528, 6644], [4558, 6659], [4542, 6791], [4749, 6942], [4815, 7057], [4837, 7118], [4904, 7165], [4950, 7179], [4980, 7167], [5043, 7073], [4996, 6997], [4952, 6774], [4976, 6645], [4932, 6598], [4835, 6591], [4810, 6546], [4744, 6376], [4746, 6321], [4765, 6269], [4814, 6264], [4845, 6201], [4822, 6119]]] } }, { type: 'Feature', id: 'TR.CM', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.48, 'hc-middle-y': 0.47, 'hc-key': 'tr-cm', 'hc-a2': 'CM', labelrank: '7', hasc: 'TR.CM', 'alt-name': 'Çorum', 'woe-id': '2347276', subregion: null, fips: 'TU19', 'postal-code': 'CM', name: 'Çorum', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '34.711', 'woe-name': 'Çorum', latitude: '40.6149', 'woe-label': 'Çorum, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[3639, 8179], [3638, 8216], [3663, 8264], [3655, 8325], [3617, 8351], [3588, 8436], [3652, 8469], [3689, 8551], [3655, 8628], [3628, 8763], [3645, 8820], [3617, 8865], [3742, 8909], [3754, 8945], [3714, 8995], [3756, 9080], [3794, 9119], [3827, 9186], [3855, 9193], [3870, 9175], [3963, 9162], [3993, 9136], [4055, 9118], [4081, 9167], [4110, 9118], [4132, 9037], [4194, 9038], [4174, 8963], [4167, 8844], [4211, 8752], [4320, 8728], [4390, 8698], [4405, 8666], [4395, 8587], [4349, 8513], [4340, 8428], [4265, 8414], [4260, 8331], [4203, 8284], [4130, 8293], [4048, 8251], [3948, 8236], [3863, 8249], [3757, 8206], [3670, 8195], [3639, 8179]]] } }, { type: 'Feature', id: 'TR.KK', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.49, 'hc-middle-y': 0.49, 'hc-key': 'tr-kk', 'hc-a2': 'KK', labelrank: '7', hasc: 'TR.KK', 'alt-name': 'Kırıkkale', 'woe-id': '2347329', subregion: null, fips: 'TU79', 'postal-code': 'KK', name: 'Kırıkkale', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '33.778', 'woe-name': 'Kırıkkale', latitude: '39.9011', 'woe-label': 'Kırıkkale, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[3588, 8436], [3617, 8351], [3655, 8325], [3663, 8264], [3638, 8216], [3639, 8179], [3647, 8150], [3652, 8120], [3563, 8034], [3539, 7960], [3501, 7899], [3411, 7825], [3349, 7716], [3304, 7802], [3282, 7904], [3222, 7986], [3208, 8046], [3238, 8168], [3262, 8230], [3367, 8255], [3370, 8388], [3384, 8488], [3536, 8441], [3588, 8436]]] } }, { type: 'Feature', id: 'TR.NG', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.51, 'hc-middle-y': 0.39, 'hc-key': 'tr-ng', 'hc-a2': 'NG', labelrank: '7', hasc: 'TR.NG', 'alt-name': 'Niğde', 'woe-id': '2347323', subregion: null, fips: 'TU73', 'postal-code': 'NG', name: 'Niğde', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '34.7093', 'woe-name': 'Niğde', latitude: '37.8966', 'woe-label': 'Niğde, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[3716, 6809], [3900, 7090], [4013, 7103], [4082, 7064], [4141, 7087], [4183, 6979], [4217, 6944], [4309, 6945], [4325, 6898], [4324, 6836], [4343, 6786], [4317, 6768], [4306, 6687], [4233, 6610], [4177, 6600], [4119, 6610], [4101, 6583], [4124, 6492], [4085, 6423], [4084, 6373], [4044, 6382], [3968, 6346], [3924, 6344], [3852, 6440], [3854, 6493], [3889, 6565], [3882, 6606], [3798, 6719], [3744, 6743], [3716, 6809]]] } }, { type: 'Feature', id: 'TR.AK', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.48, 'hc-middle-y': 0.62, 'hc-key': 'tr-ak', 'hc-a2': 'AK', labelrank: '6', hasc: 'TR.AK', 'alt-name': 'Aksaray', 'woe-id': '2347325', subregion: null, fips: 'TU75', 'postal-code': 'AK', name: 'Aksaray', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '33.8772', 'woe-name': 'Aksaray', latitude: '38.3566', 'woe-label': 'Aksaray, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[3900, 7090], [3716, 6809], [3674, 6815], [3542, 6775], [3409, 6770], [3316, 6756], [3254, 6825], [3241, 6882], [3206, 6951], [3210, 7009], [3264, 7186], [3319, 7267], [3463, 7321], [3514, 7320], [3582, 7376], [3583, 7418], [3560, 7478], [3578, 7526], [3644, 7502], [3674, 7454], [3751, 7475], [3745, 7446], [3764, 7382], [3736, 7312], [3745, 7276], [3799, 7252], [3835, 7253], [3825, 7149], [3900, 7090]]] } }, { type: 'Feature', id: 'TR.KH', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.51, 'hc-middle-y': 0.48, 'hc-key': 'tr-kh', 'hc-a2': 'KH', labelrank: '7', hasc: 'TR.KH', 'alt-name': 'Kırşehir', 'woe-id': '2347295', subregion: null, fips: 'TU40', 'postal-code': 'KH', name: 'Kırşehir', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '34.1308', 'woe-name': 'Kırşehir', latitude: '39.3548', 'woe-label': 'Kırşehir, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[3751, 7475], [3674, 7454], [3644, 7502], [3578, 7526], [3582, 7550], [3470, 7603], [3361, 7675], [3349, 7716], [3411, 7825], [3501, 7899], [3539, 7960], [3563, 8034], [3652, 8120], [3704, 8099], [3762, 8041], [3832, 8033], [3855, 7987], [3933, 7894], [3986, 7874], [4026, 7820], [3947, 7814], [3969, 7714], [3963, 7668], [3993, 7611], [3970, 7581], [3838, 7516], [3826, 7477], [3836, 7429], [3813, 7423], [3751, 7475]]] } }, { type: 'Feature', id: 'TR.YZ', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.56, 'hc-middle-y': 0.5, 'hc-key': 'tr-yz', 'hc-a2': 'YZ', labelrank: '7', hasc: 'TR.YZ', 'alt-name': 'Yozgat', 'woe-id': '2347317', subregion: null, fips: 'TU66', 'postal-code': 'YZ', name: 'Yozgat', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '35.1328', 'woe-name': 'Yozgat', latitude: '39.5476', 'woe-label': 'Yozgat, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[3652, 8120], [3647, 8150], [3639, 8179], [3670, 8195], [3757, 8206], [3863, 8249], [3948, 8236], [4048, 8251], [4130, 8293], [4203, 8284], [4260, 8331], [4265, 8414], [4340, 8428], [4360, 8404], [4441, 8398], [4525, 8327], [4620, 8325], [4717, 8353], [4741, 8331], [4739, 8262], [4768, 8217], [4785, 8165], [4842, 8076], [4827, 8017], [4741, 7936], [4677, 7833], [4632, 7788], [4587, 7721], [4409, 7599], [4322, 7548], [4194, 7565], [4161, 7670], [4116, 7697], [4096, 7747], [4026, 7820], [3986, 7874], [3933, 7894], [3855, 7987], [3832, 8033], [3762, 8041], [3704, 8099], [3652, 8120]]] } }, { type: 'Feature', id: 'TR.AM', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.53, 'hc-middle-y': 0.47, 'hc-key': 'tr-am', 'hc-a2': 'AM', labelrank: '7', hasc: 'TR.AM', 'alt-name': 'Amasya', 'woe-id': '2347262', subregion: null, fips: 'TU05', 'postal-code': 'AM', name: 'Amasya', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '35.7627', 'woe-name': 'Amasya', latitude: '40.6379', 'woe-label': 'Amasya, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[4441, 8398], [4360, 8404], [4340, 8428], [4349, 8513], [4395, 8587], [4405, 8666], [4390, 8698], [4320, 8728], [4211, 8752], [4167, 8844], [4174, 8963], [4194, 9038], [4364, 8995], [4398, 9002], [4497, 8934], [4534, 8898], [4670, 8900], [4713, 8881], [4779, 8922], [4803, 8985], [4824, 9000], [4877, 8946], [4937, 8906], [4927, 8865], [4969, 8817], [4920, 8702], [4876, 8690], [4874, 8654], [4780, 8592], [4708, 8626], [4618, 8631], [4536, 8488], [4477, 8463], [4441, 8398]]] } }, { type: 'Feature', id: 'TR.MS', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.36, 'hc-middle-y': 0.62, 'hc-key': 'tr-ms', 'hc-a2': 'MS', labelrank: '7', hasc: 'TR.MS', 'alt-name': 'Muş', 'woe-id': '2347302', subregion: null, fips: 'TU49', 'postal-code': 'MS', name: 'Muş', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '41.9034', 'woe-name': 'Muş', latitude: '38.9124', 'woe-label': 'Muş, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[7880, 7427], [7849, 7419], [7818, 7407], [7792, 7429], [7787, 7487], [7714, 7546], [7650, 7648], [7663, 7706], [7698, 7758], [7695, 7818], [7651, 7877], [7628, 7949], [7642, 7995], [7730, 8018], [7776, 8012], [7858, 7952], [7910, 7899], [8008, 7886], [8050, 7921], [8118, 7940], [8179, 7998], [8194, 8093], [8266, 8139], [8319, 8153], [8367, 8072], [8456, 7981], [8467, 7812], [8385, 7752], [8292, 7752], [8200, 7703], [8186, 7657], [8136, 7653], [8128, 7626], [8155, 7569], [8104, 7506], [8066, 7480], [7969, 7478], [7880, 7427]]] } }, { type: 'Feature', id: 'TR.BM', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.44, 'hc-middle-y': 0.35, 'hc-key': 'tr-bm', 'hc-a2': 'BM', labelrank: '7', hasc: 'TR.BM', 'alt-name': 'Batman', 'woe-id': '2347326', subregion: null, fips: 'TU76', 'postal-code': 'BM', name: 'Batman', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '41.4262', 'woe-name': 'Batman', latitude: '37.7343', 'woe-label': 'Batman, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[7818, 7407], [7849, 7419], [7880, 7427], [7930, 7413], [7975, 7279], [7985, 7194], [7929, 7087], [7865, 7063], [7849, 7028], [7858, 6981], [7925, 6930], [8032, 6898], [8100, 6836], [7941, 6697], [7855, 6671], [7790, 6704], [7742, 6784], [7697, 6831], [7671, 6834], [7643, 6902], [7693, 6970], [7729, 7094], [7715, 7212], [7728, 7321], [7739, 7340], [7824, 7383], [7818, 7407]]] } }, { type: 'Feature', id: 'TR.KA', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.6, 'hc-middle-y': 0.53, 'hc-key': 'tr-ka', 'hc-a2': 'KA', labelrank: '7', hasc: 'TR.KA', 'alt-name': 'Kars', 'woe-id': '2347291', subregion: null, fips: 'TU84', 'postal-code': 'KA', name: 'Kars', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '43.074', 'woe-name': 'Kars', latitude: '40.3671', 'woe-label': 'Kars, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[8955, 8678], [8790, 8607], [8775, 8553], [8744, 8562], [8632, 8551], [8467, 8484], [8357, 8493], [8305, 8566], [8241, 8607], [8157, 8624], [8106, 8677], [8119, 8718], [8197, 8753], [8306, 8837], [8284, 8908], [8292, 8959], [8419, 8992], [8428, 9189], [8490, 9231], [8744, 9382], [8763, 9322], [8847, 9289], [8921, 9165], [8940, 9091], [8911, 8979], [8868, 8927], [8906, 8899], [8895, 8843], [8947, 8791], [8981, 8724], [8946, 8698], [8955, 8678]]] } }, { type: 'Feature', id: 'TR.IG', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.43, 'hc-middle-y': 0.51, 'hc-key': 'tr-ig', 'hc-a2': 'IG', labelrank: '7', hasc: 'TR.IG', 'alt-name': 'Iğdır', 'woe-id': '20070183', subregion: null, fips: 'TU88', 'postal-code': 'IG', name: 'Iğdır', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '44.0317', 'woe-name': 'Iğdır', latitude: '39.811', 'woe-label': 'Iğdır, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[8775, 8553], [8790, 8607], [8955, 8678], [9100, 8632], [9168, 8629], [9288, 8670], [9328, 8669], [9411, 8634], [9478, 8570], [9549, 8523], [9599, 8475], [9633, 8419], [9487, 8492], [9434, 8436], [9439, 8395], [9406, 8404], [9309, 8368], [9222, 8376], [9115, 8364], [9105, 8384], [9016, 8405], [8982, 8450], [8904, 8473], [8836, 8424], [8806, 8436], [8775, 8553]]] } }, { type: 'Feature', id: 'TR.DU', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.4, 'hc-middle-y': 0.48, 'hc-key': 'tr-du', 'hc-a2': 'DU', labelrank: '7', hasc: 'TR.DU', 'alt-name': 'Düzce', 'woe-id': '29390030', subregion: null, fips: 'TU93', 'postal-code': 'DU', name: 'Düzce', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '31.3231', 'woe-name': null, latitude: '40.8631', 'woe-label': 'Düzce, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[1943, 9034], [2093, 9038], [2156, 9079], [2177, 9059], [2269, 9011], [2402, 8997], [2391, 8934], [2364, 8903], [2243, 8881], [2216, 8861], [2192, 8772], [2149, 8740], [2096, 8736], [2035, 8763], [1946, 8762], [1901, 8779], [1905, 8879], [1893, 8920], [1945, 8991], [1943, 9034]]] } }, { type: 'Feature', id: 'TR.ZO', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.58, 'hc-middle-y': 0.57, 'hc-key': 'tr-zo', 'hc-a2': 'ZO', labelrank: '7', hasc: 'TR.ZO', 'alt-name': 'Zonguldak', 'woe-id': '20070185', subregion: null, fips: 'TU85', 'postal-code': 'ZO', name: 'Zonguldak', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '31.8206', 'woe-name': 'Zonguldak', latitude: '41.2481', 'woe-label': 'Zonguldak, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[2669, 9202], [2620, 9138], [2593, 9042], [2592, 8978], [2475, 8983], [2402, 8997], [2269, 9011], [2177, 9059], [2156, 9079], [2187, 9116], [2190, 9198], [2329, 9254], [2445, 9329], [2537, 9379], [2588, 9396], [2651, 9350], [2681, 9263], [2669, 9202]]] } }, { type: 'Feature', id: 'TR.KB', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.48, 'hc-middle-y': 0.54, 'hc-key': 'tr-kb', 'hc-a2': 'KB', labelrank: '7', hasc: 'TR.KB', 'alt-name': 'Karabük', 'woe-id': '20070186', subregion: null, fips: 'TU89', 'postal-code': 'KB', name: 'Karabük', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '32.5067', 'woe-name': 'Karabük', latitude: '41.2347', 'woe-label': 'Karabük, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[2592, 8978], [2593, 9042], [2620, 9138], [2669, 9202], [2728, 9198], [2785, 9213], [2851, 9267], [2876, 9320], [2906, 9328], [2958, 9377], [2976, 9356], [3049, 9375], [3088, 9346], [3119, 9247], [3065, 9236], [3012, 9174], [3018, 9072], [3077, 9055], [3094, 9029], [3070, 8970], [3018, 8941], [2965, 8947], [2919, 8888], [2854, 8837], [2797, 8811], [2779, 8868], [2662, 8927], [2666, 8966], [2592, 8978]]] } }, { type: 'Feature', id: 'TR.YL', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.49, 'hc-middle-y': 0.27, 'hc-key': 'tr-yl', 'hc-a2': 'YL', labelrank: '7', hasc: 'TR.YL', 'alt-name': 'Yalova', 'woe-id': '20070182', subregion: null, fips: 'TU92', 'postal-code': 'YL', name: 'Yalova', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '29.2036', 'woe-name': 'Yalova', latitude: '40.6154', 'woe-label': 'Yalova, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[1097, 8715], [1091, 8688], [1057, 8696], [1020, 8661], [985, 8655], [903, 8696], [848, 8705], [846, 8627], [811, 8633], [735, 8674], [746, 8696], [855, 8757], [1018, 8765], [1080, 8792], [1099, 8779], [1097, 8715]]] } }, { type: 'Feature', id: 'TR.SK', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.59, 'hc-middle-y': 0.53, 'hc-key': 'tr-sk', 'hc-a2': 'SK', labelrank: '7', hasc: 'TR.SK', 'alt-name': 'Sakarya', 'woe-id': '2347306', subregion: null, fips: 'TU54', 'postal-code': 'SK', name: 'Sakarya', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '30.4439', 'woe-name': 'Sakarya', latitude: '40.6596', 'woe-label': 'Sakarya, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[1943, 9034], [1945, 8991], [1893, 8920], [1905, 8879], [1901, 8779], [1866, 8753], [1863, 8686], [1789, 8672], [1734, 8583], [1759, 8524], [1748, 8498], [1678, 8506], [1640, 8547], [1574, 8552], [1498, 8534], [1450, 8551], [1409, 8593], [1376, 8655], [1371, 8671], [1369, 8687], [1407, 8689], [1512, 8732], [1535, 8776], [1561, 8883], [1597, 8920], [1590, 8949], [1669, 8936], [1684, 9006], [1644, 9014], [1636, 9051], [1658, 9105], [1804, 9066], [1830, 9044], [1943, 9034]]] } }, { type: 'Feature', id: 'TR.CI', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.6, 'hc-middle-y': 0.55, 'hc-key': 'tr-ci', 'hc-a2': 'CI', labelrank: '7', hasc: 'TR.CI', 'alt-name': 'Çankırı', 'woe-id': '2347275', subregion: null, fips: 'TU82', 'postal-code': 'CI', name: 'Çankırı', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '33.2142', 'woe-name': 'Çankırı', latitude: '40.7087', 'woe-label': 'Çankırı, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[2786, 8751], [2795, 8790], [2797, 8811], [2854, 8837], [2919, 8888], [2965, 8947], [3018, 8941], [3070, 8970], [3094, 9029], [3114, 9006], [3184, 8998], [3279, 8934], [3357, 8976], [3399, 8984], [3487, 9032], [3520, 9006], [3483, 8945], [3504, 8910], [3572, 8870], [3617, 8865], [3645, 8820], [3628, 8763], [3655, 8628], [3689, 8551], [3652, 8469], [3588, 8436], [3536, 8441], [3384, 8488], [3275, 8528], [3246, 8486], [3206, 8481], [3169, 8509], [3151, 8552], [3080, 8603], [3033, 8670], [2873, 8745], [2786, 8751]]] } }, { type: 'Feature', id: 'TR.BL', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.62, 'hc-middle-y': 0.47, 'hc-key': 'tr-bl', 'hc-a2': 'BL', labelrank: '7', hasc: 'TR.BL', 'alt-name': 'Bolu', 'woe-id': '2347271', subregion: null, fips: 'TU14', 'postal-code': 'BL', name: 'Bolu', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '31.6806', 'woe-name': 'Bolu', latitude: '40.5854', 'woe-label': 'Bolu, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[2797, 8811], [2795, 8790], [2786, 8751], [2751, 8728], [2748, 8689], [2769, 8631], [2724, 8566], [2679, 8543], [2603, 8555], [2557, 8532], [2407, 8490], [2317, 8490], [2267, 8471], [2204, 8489], [2186, 8509], [2093, 8501], [1994, 8550], [1957, 8429], [1911, 8404], [1876, 8359], [1840, 8366], [1807, 8379], [1755, 8466], [1748, 8498], [1759, 8524], [1734, 8583], [1789, 8672], [1863, 8686], [1866, 8753], [1901, 8779], [1946, 8762], [2035, 8763], [2096, 8736], [2149, 8740], [2192, 8772], [2216, 8861], [2243, 8881], [2364, 8903], [2391, 8934], [2402, 8997], [2475, 8983], [2592, 8978], [2666, 8966], [2662, 8927], [2779, 8868], [2797, 8811]]] } }, { type: 'Feature', id: 'TR.ED', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.51, 'hc-middle-y': 0.74, 'hc-key': 'tr-ed', 'hc-a2': 'ED', labelrank: '7', hasc: 'TR.ED', 'alt-name': 'Edirne', 'woe-id': '2347279', subregion: null, fips: 'TU22', 'postal-code': 'ED', name: 'Edirne', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '26.4697', 'woe-name': 'Edirne', latitude: '40.9579', 'woe-label': 'Edirne, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[-347, 8885], [-347, 8883], [-354, 8838], [-449, 8830], [-508, 8805], [-540, 8822], [-619, 8815], [-743, 8832], [-760, 8923], [-702, 8942], [-655, 8996], [-645, 9033], [-568, 9075], [-582, 9190], [-567, 9284], [-533, 9285], [-449, 9346], [-422, 9328], [-395, 9361], [-405, 9532], [-416, 9517], [-474, 9563], [-466, 9582], [-541, 9615], [-536, 9670], [-512, 9688], [-431, 9687], [-414, 9760], [-370, 9787], [-310, 9776], [-255, 9783], [-235, 9629], [-234, 9559], [-251, 9490], [-317, 9354], [-303, 9320], [-301, 9206], [-342, 9131], [-375, 9039], [-375, 8980], [-347, 8885]]] } }, { type: 'Feature', id: 'TR.ES', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.49, 'hc-middle-y': 0.55, 'hc-key': 'tr-es', 'hc-a2': 'ES', labelrank: '7', hasc: 'TR.ES', 'alt-name': 'Eskişehir', 'woe-id': '2347283', subregion: null, fips: 'TU26', 'postal-code': 'ES', name: 'Eskişehir', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '31.0894', 'woe-name': 'Eskişehir', latitude: '39.6297', 'woe-label': 'Eskişehir, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[1807, 8379], [1840, 8366], [1876, 8359], [1899, 8328], [1906, 8270], [1942, 8267], [1995, 8288], [2055, 8270], [2087, 8293], [2165, 8291], [2188, 8267], [2352, 8264], [2381, 8168], [2416, 8157], [2435, 8111], [2412, 8085], [2442, 7973], [2470, 7948], [2494, 7883], [2488, 7777], [2521, 7724], [2496, 7693], [2418, 7650], [2403, 7597], [2326, 7595], [2261, 7602], [2188, 7596], [2147, 7629], [2120, 7692], [2082, 7735], [1914, 7647], [1863, 7689], [1806, 7640], [1722, 7603], [1679, 7631], [1659, 7670], [1624, 7691], [1615, 7737], [1561, 7813], [1542, 7912], [1462, 8008], [1520, 8084], [1528, 8158], [1579, 8207], [1637, 8217], [1686, 8270], [1705, 8343], [1751, 8378], [1807, 8379]]] } }, { type: 'Feature', id: 'TR.KO', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.35, 'hc-middle-y': 0.42, 'hc-key': 'tr-ko', 'hc-a2': 'KO', labelrank: '7', hasc: 'TR.KO', 'alt-name': 'Konya', 'woe-id': '2347321', subregion: null, fips: 'TU71', 'postal-code': 'KO', name: 'Konya', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '32.469', 'woe-name': 'Konya', latitude: '38.04', 'woe-label': 'Konya, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[2326, 7595], [2403, 7597], [2418, 7650], [2467, 7624], [2566, 7550], [2653, 7570], [2763, 7522], [2832, 7565], [2874, 7547], [2978, 7636], [3061, 7598], [3091, 7683], [3115, 7683], [3236, 7609], [3266, 7539], [3262, 7378], [3319, 7267], [3264, 7186], [3210, 7009], [3206, 6951], [3241, 6882], [3254, 6825], [3316, 6756], [3409, 6770], [3542, 6775], [3674, 6815], [3716, 6809], [3744, 6743], [3798, 6719], [3882, 6606], [3889, 6565], [3854, 6493], [3852, 6440], [3924, 6344], [3918, 6321], [3835, 6268], [3753, 6233], [3718, 6199], [3664, 6292], [3517, 6448], [3501, 6540], [3421, 6551], [3351, 6474], [3292, 6452], [3118, 6436], [3064, 6414], [2966, 6305], [2842, 6140], [2831, 6067], [2900, 6048], [2907, 6007], [2806, 5899], [2741, 5850], [2745, 5899], [2724, 5964], [2655, 5981], [2666, 6055], [2625, 6076], [2553, 6141], [2499, 6208], [2375, 6303], [2228, 6335], [2146, 6347], [2099, 6396], [2121, 6479], [2100, 6552], [2144, 6582], [2171, 6653], [2159, 6766], [2172, 6813], [2268, 6861], [2272, 6884], [2161, 6982], [2083, 7064], [2068, 7117], [2169, 7181], [2263, 7289], [2272, 7372], [2334, 7476], [2312, 7529], [2326, 7595]]] } }, { type: 'Feature', id: 'TR.BU', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.43, 'hc-middle-y': 0.5, 'hc-key': 'tr-bu', 'hc-a2': 'BU', labelrank: '7', hasc: 'TR.BU', 'alt-name': 'Bursa', 'woe-id': '2347273', subregion: null, fips: 'TU16', 'postal-code': 'BU', name: 'Bursa', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '29.0593', 'woe-name': 'Bursa', latitude: '40.1314', 'woe-label': 'Bursa, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[1369, 8687], [1371, 8671], [1376, 8655], [1323, 8620], [1294, 8542], [1310, 8483], [1244, 8409], [1226, 8302], [1267, 8247], [1274, 8211], [1215, 8209], [1146, 8201], [1089, 8226], [1060, 8208], [1011, 8081], [984, 8063], [965, 7983], [934, 7965], [831, 7980], [810, 7997], [781, 8021], [707, 8023], [670, 8057], [653, 8131], [625, 8113], [581, 8121], [440, 8236], [424, 8310], [386, 8351], [357, 8427], [380, 8478], [355, 8531], [419, 8601], [572, 8594], [654, 8564], [729, 8588], [830, 8555], [890, 8561], [905, 8597], [939, 8601], [894, 8637], [846, 8627], [848, 8705], [903, 8696], [985, 8655], [1020, 8661], [1057, 8696], [1091, 8688], [1154, 8677], [1295, 8717], [1369, 8687]]] } }, { type: 'Feature', id: 'TR.KL', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.43, 'hc-middle-y': 0.49, 'hc-key': 'tr-kl', 'hc-a2': 'KL', labelrank: '7', hasc: 'TR.KL', 'alt-name': 'Kırklareli', 'woe-id': '2347294', subregion: null, fips: 'TU39', 'postal-code': 'KL', name: 'Kırklareli', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '27.4916', 'woe-name': 'Kırklareli', latitude: '41.6201', 'woe-label': 'Kırklareli, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[461, 9423], [435, 9390], [434, 9390], [244, 9379], [130, 9355], [80, 9280], [12, 9251], [-68, 9329], [-220, 9332], [-303, 9320], [-317, 9354], [-251, 9490], [-234, 9559], [-235, 9629], [-255, 9783], [-200, 9795], [-151, 9847], [-70, 9830], [-15, 9851], [58, 9761], [123, 9704], [159, 9740], [221, 9746], [255, 9726], [267, 9762], [379, 9740], [390, 9680], [354, 9680], [348, 9633], [405, 9525], [401, 9502], [461, 9423]]] } }, { type: 'Feature', id: 'TR.IB', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.27, 'hc-middle-y': 0.55, 'hc-key': 'tr-ib', 'hc-a2': 'IB', labelrank: '7', hasc: 'TR.IB', 'alt-name': 'İstanbul', 'woe-id': '2347289', subregion: null, fips: 'TU34', 'postal-code': 'IB', name: 'İstanbul', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '28.8463', 'woe-name': 'İstanbul', latitude: '41.1285', 'woe-label': 'İstanbul, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[434, 9390], [435, 9390], [461, 9423], [556, 9351], [671, 9294], [834, 9206], [942, 9179], [926, 9131], [952, 9161], [1008, 9180], [1217, 9127], [1349, 9102], [1355, 9050], [1339, 9014], [1240, 8966], [1225, 8932], [1190, 8945], [1149, 9004], [1121, 9008], [1009, 8916], [951, 8947], [889, 8998], [880, 9034], [911, 9065], [915, 9100], [865, 9014], [842, 9018], [776, 8989], [735, 9004], [653, 9007], [644, 9071], [624, 9017], [582, 9050], [461, 9094], [428, 9093], [419, 9189], [448, 9290], [434, 9390]]] } }, { type: 'Feature', id: 'TR.KR', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.43, 'hc-middle-y': 0.39, 'hc-key': 'tr-kr', 'hc-a2': 'KR', labelrank: '7', hasc: 'TR.KR', 'alt-name': 'Karaman', 'woe-id': '2347328', subregion: null, fips: 'TU78', 'postal-code': 'KR', name: 'Karaman', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '33.3026', 'woe-name': 'Karaman', latitude: '37.2262', 'woe-label': 'Karaman, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[2854, 5680], [2784, 5749], [2741, 5850], [2806, 5899], [2907, 6007], [2900, 6048], [2831, 6067], [2842, 6140], [2966, 6305], [3064, 6414], [3118, 6436], [3292, 6452], [3351, 6474], [3421, 6551], [3501, 6540], [3517, 6448], [3664, 6292], [3718, 6199], [3613, 6170], [3558, 6128], [3481, 6106], [3413, 6108], [3368, 6090], [3271, 6076], [3172, 6003], [3153, 5950], [3118, 5973], [3044, 5943], [3081, 5849], [3149, 5810], [3190, 5768], [3175, 5749], [3115, 5763], [3086, 5700], [3032, 5699], [2964, 5676], [2854, 5680]]] } }, { type: 'Feature', id: 'TR.AL', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.26, 'hc-middle-y': 0.48, 'hc-key': 'tr-al', 'hc-a2': 'AL', labelrank: '7', hasc: 'TR.AL', 'alt-name': 'Antalya', 'woe-id': '2347264', subregion: null, fips: 'TU07', 'postal-code': 'AL', name: 'Antalya', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '30.9564', 'woe-name': 'Antalya', latitude: '37.1141', 'woe-label': 'Antalya, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[2741, 5850], [2784, 5749], [2854, 5680], [2851, 5559], [2806, 5433], [2772, 5440], [2686, 5494], [2638, 5547], [2635, 5573], [2586, 5624], [2535, 5717], [2491, 5758], [2370, 5793], [2324, 5831], [2134, 5921], [2096, 5955], [1865, 5994], [1770, 5991], [1719, 6022], [1669, 5985], [1650, 5945], [1640, 5828], [1645, 5762], [1616, 5735], [1588, 5673], [1613, 5629], [1540, 5533], [1541, 5563], [1458, 5609], [1402, 5604], [1393, 5572], [1301, 5549], [1256, 5549], [1153, 5485], [1175, 5510], [1135, 5511], [1114, 5487], [1075, 5548], [1013, 5553], [966, 5596], [933, 5574], [879, 5618], [906, 5640], [942, 5738], [1010, 5749], [1013, 5788], [1070, 5831], [1075, 5915], [1143, 6056], [1176, 6066], [1231, 6141], [1242, 6195], [1275, 6237], [1380, 6287], [1502, 6326], [1536, 6320], [1584, 6270], [1782, 6268], [1829, 6336], [1871, 6370], [1921, 6349], [2012, 6372], [2068, 6401], [2099, 6396], [2146, 6347], [2228, 6335], [2375, 6303], [2499, 6208], [2553, 6141], [2625, 6076], [2666, 6055], [2655, 5981], [2724, 5964], [2745, 5899], [2741, 5850]]] } }, { type: 'Feature', id: 'TR.AF', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.56, 'hc-middle-y': 0.33, 'hc-key': 'tr-af', 'hc-a2': 'AF', labelrank: '7', hasc: 'TR.AF', 'alt-name': 'Afyon', 'woe-id': '2347260', subregion: null, fips: 'TU03', 'postal-code': 'AF', name: 'Afyonkarahisar', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '30.6938', 'woe-name': 'Afyon', latitude: '38.6784', 'woe-label': 'Afyonkarahisar, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[1352, 6670], [1301, 6675], [1254, 6661], [1230, 6706], [1153, 6732], [1156, 6805], [1359, 6950], [1368, 7016], [1297, 7139], [1219, 7160], [1253, 7253], [1288, 7285], [1301, 7342], [1421, 7408], [1462, 7465], [1516, 7604], [1583, 7632], [1624, 7691], [1659, 7670], [1679, 7631], [1722, 7603], [1806, 7640], [1863, 7689], [1914, 7647], [2082, 7735], [2120, 7692], [2147, 7629], [2188, 7596], [2261, 7602], [2326, 7595], [2312, 7529], [2334, 7476], [2272, 7372], [2263, 7289], [2169, 7181], [2068, 7117], [1982, 7185], [1870, 7090], [1798, 7018], [1730, 7000], [1654, 6961], [1595, 6904], [1467, 6800], [1458, 6725], [1438, 6691], [1352, 6670]]] } }, { type: 'Feature', id: 'TR.BD', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.51, 'hc-middle-y': 0.4, 'hc-key': 'tr-bd', 'hc-a2': 'BD', labelrank: '7', hasc: 'TR.BD', 'alt-name': 'Burdur', 'woe-id': '2347272', subregion: null, fips: 'TU15', 'postal-code': 'BD', name: 'Burdur', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '30.1627', 'woe-name': 'Burdur', latitude: '37.5001', 'woe-label': 'Burdur, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[1254, 6661], [1301, 6675], [1352, 6670], [1369, 6624], [1412, 6625], [1537, 6714], [1635, 6613], [1711, 6604], [1744, 6582], [1777, 6489], [1825, 6410], [1851, 6408], [1871, 6370], [1829, 6336], [1782, 6268], [1584, 6270], [1536, 6320], [1502, 6326], [1380, 6287], [1275, 6237], [1242, 6195], [1231, 6141], [1176, 6066], [1143, 6056], [1097, 6125], [1027, 6118], [998, 6085], [976, 6094], [975, 6173], [992, 6249], [1096, 6414], [1076, 6467], [1074, 6535], [1148, 6571], [1163, 6603], [1254, 6661]]] } }, { type: 'Feature', id: 'TR.IP', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.57, 'hc-middle-y': 0.54, 'hc-key': 'tr-ip', 'hc-a2': 'IP', labelrank: '7', hasc: 'TR.IP', 'alt-name': 'Isparta', 'woe-id': '2347288', subregion: null, fips: 'TU33', 'postal-code': 'IP', name: 'Isparta', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '30.818', 'woe-name': 'Isparta', latitude: '37.8923', 'woe-label': 'Isparta, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[2099, 6396], [2068, 6401], [2012, 6372], [1921, 6349], [1871, 6370], [1851, 6408], [1825, 6410], [1777, 6489], [1744, 6582], [1711, 6604], [1635, 6613], [1537, 6714], [1412, 6625], [1369, 6624], [1352, 6670], [1438, 6691], [1458, 6725], [1467, 6800], [1595, 6904], [1654, 6961], [1730, 7000], [1798, 7018], [1870, 7090], [1982, 7185], [2068, 7117], [2083, 7064], [2161, 6982], [2272, 6884], [2268, 6861], [2172, 6813], [2159, 6766], [2171, 6653], [2144, 6582], [2100, 6552], [2121, 6479], [2099, 6396]]] } }, { type: 'Feature', id: 'TR.AY', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.62, 'hc-middle-y': 0.49, 'hc-key': 'tr-ay', 'hc-a2': 'AY', labelrank: '7', hasc: 'TR.AY', 'alt-name': 'Aydın', 'woe-id': '2347266', subregion: null, fips: 'TU09', 'postal-code': 'AY', name: 'Aydın', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '27.9573', 'woe-name': 'Aydın', latitude: '37.7292', 'woe-label': 'Aydın, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[533, 6940], [610, 6935], [653, 6879], [664, 6789], [643, 6747], [674, 6691], [710, 6682], [712, 6646], [672, 6634], [612, 6570], [527, 6568], [514, 6542], [538, 6486], [464, 6500], [388, 6557], [347, 6568], [269, 6492], [159, 6494], [136, 6508], [57, 6510], [18, 6540], [-69, 6574], [-107, 6565], [-157, 6476], [-201, 6435], [-250, 6427], [-269, 6443], [-258, 6529], [-284, 6523], [-260, 6616], [-370, 6672], [-303, 6685], [-230, 6720], [-217, 6824], [-131, 6837], [-59, 6879], [-29, 6882], [110, 6863], [244, 6891], [354, 6887], [533, 6940]]] } }, { type: 'Feature', id: 'TR.MN', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.55, 'hc-middle-y': 0.53, 'hc-key': 'tr-mn', 'hc-a2': 'MN', labelrank: '7', hasc: 'TR.MN', 'alt-name': 'Manisa', 'woe-id': '2347299', subregion: null, fips: 'TU45', 'postal-code': 'MN', name: 'Manisa', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '28.1324', 'woe-name': 'Manisa', latitude: '38.7115', 'woe-label': 'Manisa, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[610, 6935], [533, 6940], [474, 7075], [406, 7106], [313, 7097], [278, 7161], [190, 7175], [165, 7129], [136, 7124], [99, 7193], [19, 7246], [-5, 7304], [-119, 7315], [-151, 7346], [-163, 7396], [-198, 7435], [-147, 7515], [-133, 7568], [-65, 7600], [-10, 7645], [-3, 7682], [-30, 7749], [-61, 7893], [-17, 7913], [70, 7864], [190, 7852], [202, 7829], [176, 7775], [240, 7776], [295, 7708], [321, 7642], [395, 7643], [433, 7674], [522, 7680], [575, 7704], [624, 7694], [662, 7652], [761, 7617], [803, 7535], [796, 7491], [824, 7422], [819, 7377], [712, 7288], [740, 7240], [744, 7172], [730, 7116], [696, 7075], [747, 7038], [694, 7028], [660, 6944], [610, 6935]]] } }, { type: 'Feature', id: 'TR.DY', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.62, 'hc-middle-y': 0.47, 'hc-key': 'tr-dy', 'hc-a2': 'DY', labelrank: '7', hasc: 'TR.DY', 'alt-name': 'Diyarbakır', 'woe-id': '2347278', subregion: null, fips: 'TU21', 'postal-code': 'DY', name: 'Diyarbakır', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '40.2706', 'woe-name': 'Diyarbakır', latitude: '38.0261', 'woe-label': 'Diyarbakır, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[6579, 6952], [6612, 7034], [6590, 7070], [6529, 7057], [6544, 7124], [6522, 7165], [6599, 7184], [6696, 7175], [6777, 7207], [6864, 7214], [6899, 7235], [6930, 7306], [6998, 7291], [7188, 7311], [7254, 7319], [7288, 7356], [7289, 7398], [7374, 7429], [7520, 7428], [7714, 7546], [7787, 7487], [7792, 7429], [7818, 7407], [7824, 7383], [7739, 7340], [7728, 7321], [7715, 7212], [7729, 7094], [7693, 6970], [7643, 6902], [7671, 6834], [7637, 6814], [7436, 6802], [7374, 6784], [7344, 6728], [7298, 6721], [7128, 6580], [7077, 6504], [7048, 6532], [7001, 6624], [6979, 6709], [6977, 6788], [6914, 6830], [6904, 6811], [6815, 6852], [6738, 6915], [6625, 6930], [6579, 6952]]] } }, { type: 'Feature', id: 'TR.AD', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.55, 'hc-middle-y': 0.48, 'hc-key': 'tr-ad', 'hc-a2': 'AD', labelrank: '7', hasc: 'TR.AD', 'alt-name': 'Adıyaman', 'woe-id': '2347259', subregion: null, fips: 'TU02', 'postal-code': 'AD', name: 'Adıyaman', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '38.339', 'woe-name': 'Adıyaman', latitude: '37.8102', 'woe-label': 'Adıyaman, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[6529, 7057], [6590, 7070], [6612, 7034], [6579, 6952], [6508, 6907], [6505, 6872], [6465, 6845], [6464, 6740], [6422, 6723], [6442, 6704], [6373, 6688], [6414, 6658], [6288, 6630], [6218, 6544], [6080, 6511], [6033, 6463], [5979, 6489], [5948, 6482], [5900, 6519], [5832, 6541], [5707, 6522], [5608, 6569], [5585, 6643], [5662, 6738], [5844, 6791], [5893, 6782], [5980, 6815], [6013, 6849], [6025, 6916], [6068, 6942], [6140, 7048], [6213, 7063], [6250, 7035], [6223, 6989], [6277, 6972], [6357, 6972], [6429, 6988], [6506, 7025], [6529, 7057]]] } }, { type: 'Feature', id: 'TR.KM', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.51, 'hc-middle-y': 0.54, 'hc-key': 'tr-km', 'hc-a2': 'KM', labelrank: '7', hasc: 'TR.KM', 'alt-name': 'Kahramanmaraş', 'woe-id': '2347300', subregion: null, fips: 'TU46', 'postal-code': 'KM', name: 'Kahramanmaraş', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '37.0013', 'woe-name': 'Kahramanmaraş', latitude: '37.9278', 'woe-label': 'Kahramanmaraş, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[5662, 6738], [5585, 6643], [5608, 6569], [5707, 6522], [5706, 6447], [5682, 6430], [5610, 6422], [5432, 6359], [5382, 6301], [5337, 6314], [5318, 6377], [5290, 6394], [5264, 6356], [5196, 6321], [5169, 6357], [5094, 6403], [4953, 6368], [4929, 6396], [4902, 6480], [4934, 6542], [4932, 6598], [4976, 6645], [4952, 6774], [4996, 6997], [5043, 7073], [5121, 7175], [5154, 7265], [5172, 7278], [5246, 7299], [5349, 7277], [5475, 7294], [5445, 7237], [5453, 7195], [5495, 7202], [5580, 7188], [5654, 7149], [5739, 7121], [5769, 7074], [5738, 6938], [5708, 6889], [5684, 6782], [5662, 6738]]] } }, { type: 'Feature', id: 'TR.KY', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.45, 'hc-middle-y': 0.38, 'hc-key': 'tr-ky', 'hc-a2': 'KY', labelrank: '7', hasc: 'TR.KY', 'alt-name': 'Kayseri', 'woe-id': '2347293', subregion: null, fips: 'TU38', 'postal-code': 'KY', name: 'Kayseri', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '35.9256', 'woe-name': 'Kayseri', latitude: '38.7168', 'woe-label': 'Kayseri, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[5172, 7278], [5154, 7265], [5121, 7175], [5043, 7073], [4980, 7167], [4950, 7179], [4904, 7165], [4837, 7118], [4815, 7057], [4749, 6942], [4542, 6791], [4558, 6659], [4528, 6644], [4405, 6682], [4306, 6687], [4317, 6768], [4343, 6786], [4324, 6836], [4325, 6898], [4309, 6945], [4217, 6944], [4183, 6979], [4141, 7087], [4226, 7224], [4223, 7324], [4155, 7425], [4194, 7565], [4322, 7548], [4409, 7599], [4587, 7721], [4632, 7788], [4689, 7774], [4798, 7701], [4854, 7695], [4896, 7712], [4989, 7702], [5046, 7673], [5096, 7692], [5196, 7688], [5242, 7666], [5265, 7602], [5223, 7479], [5172, 7278]]] } }, { type: 'Feature', id: 'TR.EG', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.38, 'hc-middle-y': 0.7, 'hc-key': 'tr-eg', 'hc-a2': 'EG', labelrank: '7', hasc: 'TR.EG', 'alt-name': 'Elazığ', 'woe-id': '2347280', subregion: null, fips: 'TU23', 'postal-code': 'EG', name: 'Elazığ', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '39.3702', 'woe-name': 'Elazığ', latitude: '38.5718', 'woe-label': 'Elazığ, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[6250, 7639], [6264, 7648], [6281, 7652], [6305, 7621], [6301, 7561], [6327, 7539], [6430, 7560], [6560, 7540], [6706, 7482], [6735, 7515], [6829, 7528], [6880, 7553], [6912, 7593], [6930, 7659], [6917, 7712], [6934, 7732], [6991, 7745], [7115, 7824], [7178, 7856], [7198, 7823], [7153, 7733], [7146, 7682], [7164, 7627], [7213, 7565], [7198, 7490], [7161, 7497], [7141, 7418], [7174, 7376], [7188, 7311], [6998, 7291], [6930, 7306], [6899, 7235], [6864, 7214], [6777, 7207], [6696, 7175], [6599, 7184], [6522, 7165], [6453, 7148], [6391, 7172], [6345, 7224], [6277, 7206], [6206, 7233], [6157, 7238], [6094, 7278], [6077, 7320], [6104, 7378], [6136, 7393], [6161, 7441], [6223, 7439], [6231, 7464], [6217, 7545], [6198, 7584], [6210, 7635], [6250, 7639]]] } }, { type: 'Feature', id: 'TR.IC', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.47, 'hc-middle-y': 0.54, 'hc-key': 'tr-ic', 'hc-a2': 'IC', labelrank: '6', hasc: 'TR.IC', 'alt-name': 'Mersin', 'woe-id': '2347287', subregion: null, fips: 'TU32', 'postal-code': 'IC', name: 'Mersin', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '33.8268', 'woe-name': 'Mersin', latitude: '36.6614', 'woe-label': 'Mersin, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[4175, 5899], [4080, 5961], [4035, 5959], [3956, 5924], [3876, 5848], [3796, 5792], [3740, 5709], [3682, 5666], [3683, 5605], [3638, 5586], [3615, 5521], [3598, 5576], [3563, 5593], [3522, 5533], [3489, 5520], [3456, 5469], [3433, 5504], [3378, 5457], [3323, 5479], [3281, 5464], [3134, 5460], [3107, 5424], [3022, 5439], [2941, 5384], [2864, 5399], [2806, 5433], [2851, 5559], [2854, 5680], [2964, 5676], [3032, 5699], [3086, 5700], [3115, 5763], [3175, 5749], [3190, 5768], [3149, 5810], [3081, 5849], [3044, 5943], [3118, 5973], [3153, 5950], [3172, 6003], [3271, 6076], [3368, 6090], [3413, 6108], [3481, 6106], [3558, 6128], [3613, 6170], [3718, 6199], [3753, 6233], [3835, 6268], [3918, 6321], [3924, 6344], [3968, 6346], [4044, 6382], [4084, 6373], [4126, 6291], [4154, 6270], [4171, 6155], [4234, 6138], [4257, 6116], [4241, 6070], [4252, 5950], [4175, 5899]]] } }, { type: 'Feature', id: 'TR.SP', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.54, 'hc-middle-y': 0.55, 'hc-key': 'tr-sp', 'hc-a2': 'SP', labelrank: '7', hasc: 'TR.SP', 'alt-name': 'Sinop', 'woe-id': '2347308', subregion: null, fips: 'TU57', 'postal-code': 'SP', name: 'Sinop', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '34.8226', 'woe-name': 'Sinop', latitude: '41.5894', 'woe-label': 'Sinop, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[3709, 9658], [3772, 9650], [3853, 9671], [3895, 9655], [3967, 9652], [4022, 9665], [4070, 9699], [4101, 9765], [4141, 9761], [4204, 9710], [4181, 9657], [4255, 9526], [4296, 9493], [4352, 9478], [4406, 9443], [4386, 9394], [4395, 9281], [4416, 9186], [4303, 9164], [4217, 9222], [4196, 9253], [4106, 9203], [4081, 9167], [4055, 9118], [3993, 9136], [3963, 9162], [3870, 9175], [3855, 9193], [3858, 9287], [3848, 9314], [3863, 9367], [3895, 9395], [3913, 9443], [3883, 9483], [3847, 9492], [3706, 9505], [3671, 9518], [3713, 9617], [3709, 9658]]] } }, { type: 'Feature', id: 'TR.AV', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.51, 'hc-middle-y': 0.38, 'hc-key': 'tr-av', 'hc-a2': 'AV', labelrank: '6', hasc: 'TR.AV', 'alt-name': 'Artvin', 'woe-id': '2347265', subregion: null, fips: 'TU08', 'postal-code': 'AV', name: 'Artvin', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '41.8331', 'woe-name': 'Artvin', latitude: '41.0175', 'woe-label': 'Artvin, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[7509, 9390], [7552, 9432], [7607, 9456], [7628, 9511], [7668, 9560], [7728, 9542], [7769, 9552], [7833, 9510], [7900, 9578], [7941, 9567], [8015, 9586], [8179, 9553], [8198, 9483], [8246, 9386], [8237, 9335], [8194, 9307], [8152, 9250], [8125, 9178], [7987, 9154], [7953, 9126], [7956, 9066], [7925, 9011], [7920, 8949], [7899, 8909], [7805, 8938], [7763, 8922], [7671, 8863], [7630, 8892], [7637, 9005], [7548, 9014], [7503, 9034], [7508, 9064], [7626, 9237], [7548, 9300], [7509, 9390]]] } }, { type: 'Feature', id: 'TR.RI', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.43, 'hc-middle-y': 0.53, 'hc-key': 'tr-ri', 'hc-a2': 'RI', labelrank: '7', hasc: 'TR.RI', 'alt-name': 'Rize', 'woe-id': '2347305', subregion: null, fips: 'TU53', 'postal-code': 'RI', name: 'Rize', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '40.8691', 'woe-name': 'Rize', latitude: '40.9466', 'woe-label': 'Rize, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[7067, 9127], [7125, 9173], [7176, 9172], [7249, 9218], [7313, 9297], [7352, 9293], [7417, 9325], [7467, 9375], [7509, 9390], [7548, 9300], [7626, 9237], [7508, 9064], [7503, 9034], [7409, 8950], [7344, 8928], [7331, 8885], [7255, 8860], [7170, 8808], [7161, 8902], [7119, 8987], [7108, 9037], [7067, 9127]]] } }, { type: 'Feature', id: 'TR.TB', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.5, 'hc-middle-y': 0.53, 'hc-key': 'tr-tb', 'hc-a2': 'TB', labelrank: '7', hasc: 'TR.TB', 'alt-name': 'Trabzon', 'woe-id': '2347312', subregion: null, fips: 'TU61', 'postal-code': 'TB', name: 'Trabzon', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '39.8034', 'woe-name': 'Trabzon', latitude: '40.7988', 'woe-label': 'Trabzon, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[6406, 9133], [6475, 9122], [6557, 9173], [6592, 9167], [6650, 9116], [6694, 9103], [6726, 9116], [6799, 9084], [6875, 9103], [6948, 9064], [7067, 9127], [7108, 9037], [7119, 8987], [7161, 8902], [7170, 8808], [7004, 8771], [6910, 8779], [6850, 8826], [6809, 8792], [6779, 8834], [6739, 8856], [6719, 8812], [6667, 8801], [6535, 8843], [6460, 8932], [6419, 8915], [6407, 8942], [6397, 9044], [6406, 9133]]] } }, { type: 'Feature', id: 'TR.AN', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.58, 'hc-middle-y': 0.48, 'hc-key': 'tr-an', 'hc-a2': 'AN', labelrank: '7', hasc: 'TR.AN', 'alt-name': 'Ankara', 'woe-id': '2347263', subregion: null, fips: 'TU68', 'postal-code': 'AN', name: 'Ankara', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '32.578', 'woe-name': 'Ankara', latitude: '39.829', 'woe-label': 'Ankara, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[3319, 7267], [3262, 7378], [3266, 7539], [3236, 7609], [3115, 7683], [3091, 7683], [3061, 7598], [2978, 7636], [2874, 7547], [2832, 7565], [2763, 7522], [2653, 7570], [2566, 7550], [2467, 7624], [2418, 7650], [2496, 7693], [2521, 7724], [2488, 7777], [2494, 7883], [2470, 7948], [2442, 7973], [2412, 8085], [2435, 8111], [2416, 8157], [2381, 8168], [2352, 8264], [2188, 8267], [2165, 8291], [2087, 8293], [2055, 8270], [1995, 8288], [1942, 8267], [1906, 8270], [1899, 8328], [1876, 8359], [1911, 8404], [1957, 8429], [1994, 8550], [2093, 8501], [2186, 8509], [2204, 8489], [2267, 8471], [2317, 8490], [2407, 8490], [2557, 8532], [2603, 8555], [2679, 8543], [2724, 8566], [2769, 8631], [2748, 8689], [2751, 8728], [2786, 8751], [2873, 8745], [3033, 8670], [3080, 8603], [3151, 8552], [3169, 8509], [3206, 8481], [3246, 8486], [3275, 8528], [3384, 8488], [3370, 8388], [3367, 8255], [3262, 8230], [3238, 8168], [3208, 8046], [3222, 7986], [3282, 7904], [3304, 7802], [3349, 7716], [3361, 7675], [3470, 7603], [3582, 7550], [3578, 7526], [3560, 7478], [3583, 7418], [3582, 7376], [3514, 7320], [3463, 7321], [3319, 7267]]] } }, { type: 'Feature', id: 'TR.SU', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.56, 'hc-middle-y': 0.62, 'hc-key': 'tr-su', 'hc-a2': 'SU', labelrank: '7', hasc: 'TR.SU', 'alt-name': 'Şanlıurfa', 'woe-id': '2347314', subregion: null, fips: 'TU63', 'postal-code': 'SU', name: 'Şanlıurfa', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '39.0508', 'woe-name': 'Şanlıurfa', latitude: '37.3189', 'woe-label': 'Şanlıurfa, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[7253, 6189], [7096, 6093], [6975, 6037], [6674, 5958], [6643, 5955], [6551, 5979], [6415, 5960], [6337, 5979], [6254, 6057], [6113, 6098], [6055, 6098], [5963, 6042], [5948, 6129], [5923, 6152], [5927, 6195], [5895, 6188], [5863, 6212], [5840, 6348], [5862, 6409], [5910, 6473], [5948, 6482], [5979, 6489], [6033, 6463], [6080, 6511], [6218, 6544], [6288, 6630], [6414, 6658], [6373, 6688], [6442, 6704], [6422, 6723], [6464, 6740], [6465, 6845], [6505, 6872], [6508, 6907], [6579, 6952], [6625, 6930], [6738, 6915], [6815, 6852], [6904, 6811], [6914, 6830], [6977, 6788], [6979, 6709], [7001, 6624], [7048, 6532], [7077, 6504], [7091, 6419], [7160, 6361], [7167, 6288], [7226, 6200], [7253, 6189]]] } }, { type: 'Feature', id: 'TR.BB', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.42, 'hc-middle-y': 0.45, 'hc-key': 'tr-bb', 'hc-a2': 'BB', labelrank: '6', hasc: 'TR.BB', 'alt-name': 'Bayburt', 'woe-id': '2347327', subregion: null, fips: 'TU77', 'postal-code': 'BB', name: 'Bayburt', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '40.3056', 'woe-name': 'Bayburt', latitude: '40.2859', 'woe-label': 'Bayburt, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[6809, 8792], [6850, 8826], [6910, 8779], [7004, 8771], [7170, 8808], [7191, 8766], [7233, 8626], [7269, 8610], [7359, 8599], [7337, 8537], [7240, 8489], [7196, 8443], [7085, 8441], [6993, 8453], [6947, 8418], [6859, 8400], [6820, 8491], [6839, 8581], [6835, 8687], [6809, 8792]]] } }, { type: 'Feature', id: 'TR.EM', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.5, 'hc-middle-y': 0.57, 'hc-key': 'tr-em', 'hc-a2': 'EM', labelrank: '7', hasc: 'TR.EM', 'alt-name': 'Erzurum', 'woe-id': '2347282', subregion: null, fips: 'TU25', 'postal-code': 'EM', name: 'Erzurum', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '41.403', 'woe-name': 'Erzurum', latitude: '39.9678', 'woe-label': 'Erzurum, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[8292, 8959], [8284, 8908], [8306, 8837], [8197, 8753], [8119, 8718], [8106, 8677], [8157, 8624], [8241, 8607], [8305, 8566], [8357, 8493], [8262, 8424], [8201, 8416], [8252, 8365], [8335, 8342], [8324, 8316], [8336, 8219], [8319, 8153], [8266, 8139], [8194, 8093], [8179, 7998], [8118, 7940], [8050, 7921], [8008, 7886], [7910, 7899], [7858, 7952], [7776, 8012], [7730, 8018], [7642, 7995], [7587, 8061], [7509, 8078], [7433, 8133], [7354, 8083], [7304, 8086], [7302, 8131], [7328, 8201], [7262, 8242], [7237, 8308], [7196, 8354], [7101, 8347], [7070, 8360], [7085, 8441], [7196, 8443], [7240, 8489], [7337, 8537], [7359, 8599], [7269, 8610], [7233, 8626], [7191, 8766], [7170, 8808], [7255, 8860], [7331, 8885], [7344, 8928], [7409, 8950], [7503, 9034], [7548, 9014], [7637, 9005], [7630, 8892], [7671, 8863], [7763, 8922], [7805, 8938], [7899, 8909], [7920, 8949], [7925, 9011], [7956, 9066], [7953, 9126], [7987, 9154], [8125, 9178], [8142, 9124], [8214, 9055], [8292, 8959]]] } }, { type: 'Feature', id: 'TR.MR', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.46, 'hc-middle-y': 0.4, 'hc-key': 'tr-mr', 'hc-a2': 'MR', labelrank: '7', hasc: 'TR.MR', 'alt-name': 'Mardin', 'woe-id': '2347322', subregion: null, fips: 'TU72', 'postal-code': 'MR', name: 'Mardin', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '40.9525', 'woe-name': 'Mardin', latitude: '37.4282', 'woe-label': 'Mardin, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[8184, 6436], [7948, 6357], [7788, 6336], [7608, 6362], [7501, 6337], [7400, 6275], [7348, 6260], [7253, 6189], [7226, 6200], [7167, 6288], [7160, 6361], [7091, 6419], [7077, 6504], [7128, 6580], [7298, 6721], [7344, 6728], [7374, 6784], [7436, 6802], [7637, 6814], [7671, 6834], [7697, 6831], [7742, 6784], [7790, 6704], [7855, 6671], [7941, 6697], [8100, 6836], [8165, 6688], [8162, 6639], [8069, 6580], [8048, 6551], [8060, 6522], [8129, 6507], [8168, 6480], [8184, 6436]]] } }, { type: 'Feature', id: 'TR.SR', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.62, 'hc-middle-y': 0.42, 'hc-key': 'tr-sr', 'hc-a2': 'SR', labelrank: '6', hasc: 'TR.SR', 'alt-name': 'Şırnak', 'woe-id': '2347330', subregion: null, fips: 'TU80', 'postal-code': 'SR', name: 'Şırnak', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '42.5455', 'woe-name': 'Şırnak', latitude: '37.4047', 'woe-label': 'Şırnak, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[9019, 6631], [8961, 6630], [8881, 6663], [8853, 6661], [8772, 6616], [8645, 6631], [8568, 6469], [8453, 6430], [8436, 6473], [8442, 6515], [8403, 6553], [8363, 6551], [8353, 6577], [8271, 6476], [8184, 6436], [8168, 6480], [8129, 6507], [8060, 6522], [8048, 6551], [8069, 6580], [8162, 6639], [8165, 6688], [8100, 6836], [8185, 6804], [8299, 6806], [8340, 6855], [8416, 6860], [8535, 6842], [8756, 6838], [8788, 6878], [8790, 6919], [8833, 6949], [8943, 6933], [8998, 6943], [8995, 6834], [9033, 6751], [9035, 6687], [9019, 6631]]] } }, { type: 'Feature', id: 'TR.SI', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.39, 'hc-middle-y': 0.53, 'hc-key': 'tr-si', 'hc-a2': 'SI', labelrank: '7', hasc: 'TR.SI', 'alt-name': 'Siirt', 'woe-id': '2347324', subregion: null, fips: 'TU74', 'postal-code': 'SI', name: 'Siirt', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '42.2212', 'woe-name': 'Siirt', latitude: '37.9159', 'woe-label': 'Siirt, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[8790, 6919], [8788, 6878], [8756, 6838], [8535, 6842], [8416, 6860], [8340, 6855], [8299, 6806], [8185, 6804], [8100, 6836], [8032, 6898], [7925, 6930], [7858, 6981], [7849, 7028], [7865, 7063], [7929, 7087], [7985, 7194], [8046, 7178], [8108, 7178], [8203, 7220], [8243, 7206], [8319, 7151], [8430, 7124], [8571, 7051], [8607, 7082], [8598, 7160], [8620, 7229], [8664, 7237], [8753, 7222], [8773, 7113], [8771, 7009], [8761, 6970], [8790, 6919]]] } }, { type: 'Feature', id: 'TR.HK', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.42, 'hc-middle-y': 0.44, 'hc-key': 'tr-hk', 'hc-a2': 'HK', labelrank: '7', hasc: 'TR.HK', 'alt-name': 'Hakkari', 'woe-id': '2347320', subregion: null, fips: 'TU70', 'postal-code': 'HK', name: 'Hakkari', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '44.0804', 'woe-name': 'Hakkari', latitude: '37.6097', 'woe-label': 'Hakkâri, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[9453, 7122], [9464, 7102], [9521, 7110], [9556, 7097], [9606, 7039], [9637, 7052], [9694, 7013], [9670, 6949], [9697, 6929], [9701, 6817], [9851, 6722], [9833, 6676], [9844, 6610], [9823, 6626], [9733, 6614], [9655, 6530], [9608, 6508], [9593, 6458], [9550, 6458], [9510, 6529], [9538, 6584], [9520, 6653], [9437, 6685], [9381, 6679], [9332, 6609], [9286, 6585], [9261, 6602], [9173, 6592], [9091, 6595], [9019, 6631], [9035, 6687], [9033, 6751], [8995, 6834], [8998, 6943], [9075, 6953], [9181, 6993], [9230, 6985], [9303, 7001], [9333, 7024], [9361, 7108], [9453, 7122]]] } }, { type: 'Feature', id: 'TR.VA', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.5, 'hc-middle-y': 0.52, 'hc-key': 'tr-va', 'hc-a2': 'VA', labelrank: '7', hasc: 'TR.VA', 'alt-name': 'Van', 'woe-id': '2347316', subregion: null, fips: 'TU65', 'postal-code': 'VA', name: 'Van', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '43.5684', 'woe-name': 'Van', latitude: '38.5212', 'woe-label': 'Van, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[9236, 8146], [9266, 8049], [9332, 8017], [9338, 7937], [9319, 7904], [9358, 7833], [9409, 7805], [9408, 7670], [9441, 7647], [9459, 7473], [9536, 7479], [9561, 7442], [9518, 7383], [9520, 7308], [9457, 7169], [9453, 7122], [9361, 7108], [9333, 7024], [9303, 7001], [9230, 6985], [9181, 6993], [9075, 6953], [8998, 6943], [8943, 6933], [8833, 6949], [8790, 6919], [8761, 6970], [8771, 7009], [8773, 7113], [8753, 7222], [8664, 7237], [8620, 7229], [8589, 7236], [8571, 7325], [8541, 7384], [8551, 7427], [8642, 7496], [8702, 7624], [8767, 7697], [8778, 7751], [8751, 7785], [8680, 7817], [8652, 7907], [8727, 7957], [8720, 8029], [8674, 8046], [8676, 8068], [8740, 8094], [8780, 8144], [8864, 8134], [8927, 8091], [8997, 8089], [9045, 8125], [9160, 8115], [9236, 8146]]] } }, { type: 'Feature', id: 'TR.AR', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.35, 'hc-middle-y': 0.51, 'hc-key': 'tr-ar', 'hc-a2': 'AR', labelrank: '7', hasc: 'TR.AR', 'alt-name': 'Ardahan', 'woe-id': '20070284', subregion: null, fips: 'TU86', 'postal-code': 'AR', name: 'Ardahan', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '42.8342', 'woe-name': 'Ardahan', latitude: '41.1809', 'woe-label': 'Ardahan, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[8179, 9553], [8224, 9616], [8230, 9658], [8280, 9679], [8367, 9678], [8344, 9625], [8381, 9606], [8399, 9629], [8482, 9552], [8589, 9500], [8548, 9462], [8586, 9462], [8624, 9415], [8673, 9435], [8738, 9417], [8744, 9382], [8490, 9231], [8428, 9189], [8419, 8992], [8292, 8959], [8214, 9055], [8142, 9124], [8125, 9178], [8152, 9250], [8194, 9307], [8237, 9335], [8246, 9386], [8198, 9483], [8179, 9553]]] } }, { type: 'Feature', id: 'TR.KI', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.43, 'hc-middle-y': 0.56, 'hc-key': 'tr-ki', 'hc-a2': 'KI', labelrank: '7', hasc: 'TR.KI', 'alt-name': 'Kilis', 'woe-id': '20070285', subregion: null, fips: 'TU90', 'postal-code': 'KI', name: 'Kilis', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '37.0035', 'woe-name': 'Kilis', latitude: '36.8329', 'woe-label': 'Kilis, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[5677, 5911], [5634, 5881], [5515, 5893], [5435, 5884], [5406, 5860], [5383, 5875], [5379, 5931], [5351, 5954], [5172, 6000], [5203, 6032], [5288, 6083], [5292, 6132], [5330, 6137], [5350, 6097], [5435, 6063], [5510, 5988], [5527, 6000], [5626, 5953], [5677, 5911]]] } }, { type: 'Feature', id: 'TR.BR', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.56, 'hc-middle-y': 0.51, 'hc-key': 'tr-br', 'hc-a2': 'BR', labelrank: '7', hasc: 'TR.BR', 'alt-name': 'Bartın', 'woe-id': '20070187', subregion: null, fips: 'TU87', 'postal-code': 'BR', name: 'Bartın', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '32.4688', 'woe-name': 'Bartın', latitude: '41.5857', 'woe-label': 'Bartın, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[2588, 9396], [2659, 9482], [2732, 9498], [2847, 9567], [2948, 9581], [2953, 9538], [2987, 9453], [2953, 9428], [2958, 9377], [2906, 9328], [2876, 9320], [2851, 9267], [2785, 9213], [2728, 9198], [2669, 9202], [2681, 9263], [2651, 9350], [2588, 9396]]] } }, { type: 'Feature', id: 'TR.TG', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.35, 'hc-middle-y': 0.47, 'hc-key': 'tr-tg', 'hc-a2': 'TG', labelrank: '7', hasc: 'TR.TG', 'alt-name': 'Tekirdağ', 'woe-id': '2347310', subregion: null, fips: 'TU59', 'postal-code': 'TG', name: 'Tekirdağ', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '27.4547', 'woe-name': 'Tekirdağ', latitude: '41.0824', 'woe-label': 'Tekirdağ, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[428, 9093], [338, 9069], [306, 9024], [252, 9029], [186, 9058], [69, 9048], [38, 9016], [7, 8938], [-47, 8890], [-73, 8851], [-137, 8803], [-210, 8794], [-258, 8760], [-272, 8815], [-268, 8872], [-347, 8885], [-375, 8980], [-375, 9039], [-342, 9131], [-301, 9206], [-303, 9320], [-220, 9332], [-68, 9329], [12, 9251], [80, 9280], [130, 9355], [244, 9379], [434, 9390], [448, 9290], [419, 9189], [428, 9093]]] } }, { type: 'Feature', id: 'TR.IZ', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.45, 'hc-middle-y': 0.69, 'hc-key': 'tr-iz', 'hc-a2': 'IZ', labelrank: '7', hasc: 'TR.IZ', 'alt-name': 'İzmir', 'woe-id': '2347290', subregion: null, fips: 'TU35', 'postal-code': 'IZ', name: 'İzmir', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '27.3977', 'woe-name': 'İzmir', latitude: '38.2426', 'woe-label': 'İzmir, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[-217, 6824], [-225, 6896], [-295, 6905], [-322, 6941], [-387, 6964], [-436, 6948], [-454, 7025], [-487, 7079], [-559, 7074], [-590, 7007], [-668, 7088], [-783, 7141], [-734, 7183], [-704, 7166], [-641, 7198], [-652, 7242], [-617, 7244], [-676, 7288], [-700, 7387], [-660, 7426], [-610, 7403], [-546, 7302], [-562, 7228], [-532, 7147], [-530, 7204], [-496, 7236], [-476, 7185], [-386, 7189], [-334, 7210], [-292, 7200], [-252, 7239], [-327, 7246], [-377, 7229], [-399, 7289], [-429, 7315], [-419, 7350], [-472, 7368], [-486, 7444], [-428, 7465], [-390, 7447], [-369, 7466], [-381, 7506], [-284, 7550], [-294, 7589], [-328, 7577], [-359, 7594], [-399, 7580], [-425, 7605], [-421, 7666], [-376, 7690], [-430, 7765], [-304, 7844], [-269, 7885], [-129, 7958], [-98, 7950], [-61, 7893], [-30, 7749], [-3, 7682], [-10, 7645], [-65, 7600], [-133, 7568], [-147, 7515], [-198, 7435], [-163, 7396], [-151, 7346], [-119, 7315], [-5, 7304], [19, 7246], [99, 7193], [136, 7124], [165, 7129], [190, 7175], [278, 7161], [313, 7097], [406, 7106], [474, 7075], [533, 6940], [354, 6887], [244, 6891], [110, 6863], [-29, 6882], [-59, 6879], [-131, 6837], [-217, 6824]]] } }, { type: 'Feature', id: 'TR.KS', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.49, 'hc-middle-y': 0.4, 'hc-key': 'tr-ks', 'hc-a2': 'KS', labelrank: '7', hasc: 'TR.KS', 'alt-name': 'Kastamonu', 'woe-id': '2347292', subregion: null, fips: 'TU37', 'postal-code': 'KS', name: 'Kastamonu', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '33.6356', 'woe-name': 'Kastamonu', latitude: '41.5114', 'woe-label': 'Kastamonu, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[2948, 9581], [3016, 9597], [3060, 9622], [3145, 9651], [3230, 9696], [3346, 9690], [3385, 9679], [3525, 9666], [3595, 9673], [3709, 9658], [3713, 9617], [3671, 9518], [3706, 9505], [3847, 9492], [3883, 9483], [3913, 9443], [3895, 9395], [3863, 9367], [3848, 9314], [3858, 9287], [3855, 9193], [3827, 9186], [3794, 9119], [3756, 9080], [3714, 8995], [3754, 8945], [3742, 8909], [3617, 8865], [3572, 8870], [3504, 8910], [3483, 8945], [3520, 9006], [3487, 9032], [3399, 8984], [3357, 8976], [3279, 8934], [3184, 8998], [3114, 9006], [3094, 9029], [3077, 9055], [3018, 9072], [3012, 9174], [3065, 9236], [3119, 9247], [3088, 9346], [3049, 9375], [2976, 9356], [2958, 9377], [2953, 9428], [2987, 9453], [2953, 9538], [2948, 9581]]] } }, { type: 'Feature', id: 'TR.MG', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.5, 'hc-middle-y': 0.37, 'hc-key': 'tr-mg', 'hc-a2': 'MG', labelrank: '7', hasc: 'TR.MG', 'alt-name': 'Muğla', 'woe-id': '2347301', subregion: null, fips: 'TU48', 'postal-code': 'MG', name: 'Muğla', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '28.6482', 'woe-name': 'Muğla', latitude: '37.0501', 'woe-label': 'Muğla, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[879, 5618], [786, 5692], [806, 5706], [788, 5756], [801, 5808], [755, 5804], [761, 5861], [805, 5866], [794, 5889], [705, 5955], [659, 5915], [646, 5876], [566, 5928], [520, 5926], [513, 6010], [432, 6016], [425, 6063], [383, 6044], [410, 6024], [392, 5997], [323, 6045], [300, 6018], [328, 5966], [252, 5919], [220, 5871], [149, 5843], [132, 5875], [175, 5873], [209, 5901], [142, 5939], [227, 5954], [189, 5988], [113, 5975], [8, 5996], [-23, 5973], [-33, 5924], [-100, 5947], [-158, 5934], [-211, 5954], [-152, 6001], [-64, 6003], [-55, 6029], [23, 6010], [47, 6027], [159, 6015], [195, 6020], [169, 6057], [198, 6065], [184, 6106], [275, 6110], [293, 6154], [362, 6172], [348, 6187], [234, 6180], [106, 6182], [43, 6162], [9, 6172], [-84, 6154], [-153, 6198], [-217, 6192], [-231, 6153], [-257, 6158], [-272, 6230], [-216, 6271], [-178, 6273], [-129, 6243], [-81, 6268], [-94, 6314], [-47, 6316], [-40, 6370], [-129, 6359], [-110, 6412], [-164, 6412], [-137, 6459], [-156, 6476], [-107, 6565], [-69, 6574], [18, 6540], [57, 6510], [136, 6508], [159, 6494], [269, 6492], [347, 6568], [388, 6557], [464, 6500], [538, 6486], [545, 6417], [607, 6398], [646, 6305], [689, 6297], [712, 6261], [787, 6205], [799, 6114], [901, 6062], [941, 6105], [947, 6152], [975, 6173], [976, 6094], [998, 6085], [1027, 6118], [1097, 6125], [1143, 6056], [1075, 5915], [1070, 5831], [1013, 5788], [1010, 5749], [942, 5738], [906, 5640], [879, 5618]]] } }, { type: 'Feature', id: 'TR.KU', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.49, 'hc-middle-y': 0.59, 'hc-key': 'tr-ku', 'hc-a2': 'KU', labelrank: '7', hasc: 'TR.KU', 'alt-name': 'Kütahya', 'woe-id': '2347297', subregion: null, fips: 'TU43', 'postal-code': 'KU', name: 'Kütahya', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '29.5498', 'woe-name': 'Kütahya', latitude: '39.3471', 'woe-label': 'Kütahya, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[819, 7377], [824, 7422], [796, 7491], [803, 7535], [761, 7617], [662, 7652], [624, 7694], [631, 7752], [714, 7786], [764, 7862], [774, 7913], [810, 7997], [831, 7980], [934, 7965], [965, 7983], [984, 8063], [1011, 8081], [1060, 8208], [1089, 8226], [1146, 8201], [1215, 8209], [1205, 8118], [1231, 8067], [1332, 7996], [1356, 7989], [1462, 8008], [1542, 7912], [1561, 7813], [1615, 7737], [1624, 7691], [1583, 7632], [1516, 7604], [1462, 7465], [1421, 7408], [1301, 7342], [1304, 7416], [1279, 7447], [1193, 7474], [1127, 7462], [1101, 7389], [996, 7371], [918, 7378], [851, 7402], [819, 7377]]] } }, { type: 'Feature', id: 'TR.NV', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.55, 'hc-middle-y': 0.67, 'hc-key': 'tr-nv', 'hc-a2': 'NV', labelrank: '7', hasc: 'TR.NV', 'alt-name': 'Nevşehir', 'woe-id': '2347303', subregion: null, fips: 'TU50', 'postal-code': 'NV', name: 'Nevşehir', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '34.6408', 'woe-name': 'Nevşehir', latitude: '38.7415', 'woe-label': 'Nevşehir, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[4194, 7565], [4155, 7425], [4223, 7324], [4226, 7224], [4141, 7087], [4082, 7064], [4013, 7103], [3900, 7090], [3825, 7149], [3835, 7253], [3799, 7252], [3745, 7276], [3736, 7312], [3764, 7382], [3745, 7446], [3751, 7475], [3813, 7423], [3836, 7429], [3826, 7477], [3838, 7516], [3970, 7581], [3993, 7611], [3963, 7668], [3969, 7714], [3947, 7814], [4026, 7820], [4096, 7747], [4116, 7697], [4161, 7670], [4194, 7565]]] } }, { type: 'Feature', id: 'TR.SV', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.59, 'hc-middle-y': 0.44, 'hc-key': 'tr-sv', 'hc-a2': 'SV', labelrank: '7', hasc: 'TR.SV', 'alt-name': 'Sivas', 'woe-id': '2347309', subregion: null, fips: 'TU58', 'postal-code': 'SV', name: 'Sivas', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '37.2907', 'woe-name': 'Sivas', latitude: '39.429', 'woe-label': 'Sivas, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[5604, 8641], [5638, 8584], [5701, 8556], [5751, 8608], [5808, 8617], [5809, 8667], [5890, 8702], [5968, 8463], [6071, 8407], [6127, 8424], [6243, 8385], [6234, 8320], [6183, 8321], [6129, 8293], [6075, 8314], [6051, 8298], [6040, 8214], [6118, 8230], [6126, 8197], [6084, 8182], [6047, 8119], [6041, 7991], [6095, 7946], [6053, 7892], [6076, 7765], [6061, 7720], [5980, 7670], [5823, 7643], [5744, 7592], [5697, 7580], [5649, 7601], [5613, 7565], [5644, 7469], [5598, 7396], [5562, 7374], [5508, 7311], [5475, 7294], [5349, 7277], [5246, 7299], [5172, 7278], [5223, 7479], [5265, 7602], [5242, 7666], [5196, 7688], [5096, 7692], [5046, 7673], [4989, 7702], [4896, 7712], [4854, 7695], [4798, 7701], [4689, 7774], [4632, 7788], [4677, 7833], [4741, 7936], [4827, 8017], [4842, 8076], [4785, 8165], [4768, 8217], [4896, 8248], [4987, 8256], [5085, 8309], [5117, 8423], [5157, 8443], [5221, 8438], [5312, 8470], [5455, 8488], [5549, 8534], [5604, 8641]]] } }, { type: 'Feature', id: 'TR.TC', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.38, 'hc-middle-y': 0.58, 'hc-key': 'tr-tc', 'hc-a2': 'TC', labelrank: '7', hasc: 'TR.TC', 'alt-name': 'Tunceli', 'woe-id': '2347313', subregion: null, fips: 'TU62', 'postal-code': 'TC', name: 'Tunceli', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '39.6357', 'woe-name': 'Tunceli', latitude: '39.1519', 'woe-label': 'Tunceli, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[6281, 7652], [6262, 7738], [6286, 7791], [6328, 7814], [6319, 7872], [6400, 7923], [6423, 7957], [6506, 7989], [6580, 8007], [6667, 8000], [6795, 8023], [6876, 8080], [6952, 8057], [7059, 8103], [7092, 8092], [7267, 8095], [7220, 8052], [7179, 8054], [7133, 7991], [7082, 7978], [7074, 7951], [7026, 7946], [6993, 7920], [6986, 7846], [7002, 7793], [6991, 7745], [6934, 7732], [6917, 7712], [6930, 7659], [6912, 7593], [6880, 7553], [6829, 7528], [6735, 7515], [6706, 7482], [6560, 7540], [6430, 7560], [6327, 7539], [6301, 7561], [6305, 7621], [6281, 7652]]] } }, { type: 'Feature', id: 'TR.ML', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.38, 'hc-middle-y': 0.51, 'hc-key': 'tr-ml', 'hc-a2': 'ML', labelrank: '7', hasc: 'TR.ML', 'alt-name': 'Malatya', 'woe-id': '2347298', subregion: null, fips: 'TU44', 'postal-code': 'ML', name: 'Malatya', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '38.1872', 'woe-name': 'Malatya', latitude: '38.5144', 'woe-label': 'Malatya, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[6061, 7720], [6107, 7700], [6160, 7701], [6211, 7680], [6250, 7639], [6210, 7635], [6198, 7584], [6217, 7545], [6231, 7464], [6223, 7439], [6161, 7441], [6136, 7393], [6104, 7378], [6077, 7320], [6094, 7278], [6157, 7238], [6206, 7233], [6277, 7206], [6345, 7224], [6391, 7172], [6453, 7148], [6522, 7165], [6544, 7124], [6529, 7057], [6506, 7025], [6429, 6988], [6357, 6972], [6277, 6972], [6223, 6989], [6250, 7035], [6213, 7063], [6140, 7048], [6068, 6942], [6025, 6916], [6013, 6849], [5980, 6815], [5893, 6782], [5844, 6791], [5662, 6738], [5684, 6782], [5708, 6889], [5738, 6938], [5769, 7074], [5739, 7121], [5654, 7149], [5580, 7188], [5495, 7202], [5453, 7195], [5445, 7237], [5475, 7294], [5508, 7311], [5562, 7374], [5598, 7396], [5644, 7469], [5613, 7565], [5649, 7601], [5697, 7580], [5744, 7592], [5823, 7643], [5980, 7670], [6061, 7720]]] } }, { type: 'Feature', id: 'TR.AG', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.45, 'hc-middle-y': 0.37, 'hc-key': 'tr-ag', 'hc-a2': 'AG', labelrank: '7', hasc: 'TR.AG', 'alt-name': 'Ağrı', 'woe-id': '2347261', subregion: null, fips: 'TU04', 'postal-code': 'AG', name: 'Ağrı', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '43.3647', 'woe-name': 'Ağrı', latitude: '39.5925', 'woe-label': 'Ağrı, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[8319, 8153], [8336, 8219], [8324, 8316], [8335, 8342], [8252, 8365], [8201, 8416], [8262, 8424], [8357, 8493], [8467, 8484], [8632, 8551], [8744, 8562], [8775, 8553], [8806, 8436], [8836, 8424], [8904, 8473], [8982, 8450], [9016, 8405], [9105, 8384], [9115, 8364], [9222, 8376], [9309, 8368], [9406, 8404], [9439, 8395], [9423, 8343], [9428, 8241], [9411, 8216], [9357, 8194], [9316, 8209], [9239, 8192], [9215, 8170], [9236, 8146], [9160, 8115], [9045, 8125], [8997, 8089], [8927, 8091], [8864, 8134], [8780, 8144], [8740, 8094], [8676, 8068], [8674, 8046], [8720, 8029], [8727, 7957], [8652, 7907], [8551, 7872], [8467, 7812], [8456, 7981], [8367, 8072], [8319, 8153]]] } }, { type: 'Feature', id: 'TR.BT', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.52, 'hc-middle-y': 0.51, 'hc-key': 'tr-bt', 'hc-a2': 'BT', labelrank: '7', hasc: 'TR.BT', 'alt-name': 'Bitlis', 'woe-id': '2347270', subregion: null, fips: 'TU13', 'postal-code': 'BT', name: 'Bitlis', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '42.3462', 'woe-name': 'Bitlis', latitude: '38.5155', 'woe-label': 'Bitlis, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[7880, 7427], [7969, 7478], [8066, 7480], [8104, 7506], [8155, 7569], [8128, 7626], [8136, 7653], [8186, 7657], [8200, 7703], [8292, 7752], [8385, 7752], [8467, 7812], [8551, 7872], [8652, 7907], [8680, 7817], [8751, 7785], [8778, 7751], [8767, 7697], [8702, 7624], [8642, 7496], [8551, 7427], [8541, 7384], [8571, 7325], [8589, 7236], [8620, 7229], [8598, 7160], [8607, 7082], [8571, 7051], [8430, 7124], [8319, 7151], [8243, 7206], [8203, 7220], [8108, 7178], [8046, 7178], [7985, 7194], [7975, 7279], [7930, 7413], [7880, 7427]]] } }, { type: 'Feature', id: 'TR.GU', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.53, 'hc-middle-y': 0.57, 'hc-key': 'tr-gu', 'hc-a2': 'GU', labelrank: '7', hasc: 'TR.GU', 'alt-name': 'Gümüşhane', 'woe-id': '2347319', subregion: null, fips: 'TU69', 'postal-code': 'GU', name: 'Gümüşhane', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '39.3544', 'woe-name': 'Gümüşhane', latitude: '40.2812', 'woe-label': 'Gümüşhane, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[6859, 8400], [6818, 8339], [6728, 8302], [6597, 8292], [6529, 8314], [6509, 8335], [6403, 8384], [6337, 8403], [6318, 8471], [6313, 8545], [6394, 8610], [6395, 8637], [6350, 8665], [6284, 8677], [6268, 8694], [6267, 8758], [6297, 8805], [6294, 8846], [6354, 8903], [6419, 8915], [6460, 8932], [6535, 8843], [6667, 8801], [6719, 8812], [6739, 8856], [6779, 8834], [6809, 8792], [6835, 8687], [6839, 8581], [6820, 8491], [6859, 8400]]] } }, { type: 'Feature', id: 'TR.OS', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.44, 'hc-middle-y': 0.64, 'hc-key': 'tr-os', 'hc-a2': 'OS', labelrank: '7', hasc: 'TR.OS', 'alt-name': 'Osmaniye', 'woe-id': '20070184', subregion: null, fips: 'TU91', 'postal-code': 'OS', name: 'Osmaniye', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '36.3011', 'woe-name': 'Osmaniye', latitude: '37.1737', 'woe-label': 'Osmaniye, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[5196, 6321], [5150, 6256], [5121, 6192], [5049, 6092], [4991, 6087], [4949, 6120], [4822, 6119], [4845, 6201], [4814, 6264], [4765, 6269], [4746, 6321], [4744, 6376], [4810, 6546], [4835, 6591], [4932, 6598], [4934, 6542], [4902, 6480], [4929, 6396], [4953, 6368], [5094, 6403], [5169, 6357], [5196, 6321]]] } }, { type: 'Feature', id: 'TR.BC', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.38, 'hc-middle-y': 0.54, 'hc-key': 'tr-bc', 'hc-a2': 'BC', labelrank: '7', hasc: 'TR.BC', 'alt-name': 'Bilecik', 'woe-id': '2347268', subregion: null, fips: 'TU11', 'postal-code': 'BC', name: 'Bilecik', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '30.2002', 'woe-name': 'Bilecik', latitude: '40.0387', 'woe-label': 'Bilecik, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[1376, 8655], [1409, 8593], [1450, 8551], [1498, 8534], [1574, 8552], [1640, 8547], [1678, 8506], [1748, 8498], [1755, 8466], [1807, 8379], [1751, 8378], [1705, 8343], [1686, 8270], [1637, 8217], [1579, 8207], [1528, 8158], [1520, 8084], [1462, 8008], [1356, 7989], [1332, 7996], [1231, 8067], [1205, 8118], [1215, 8209], [1274, 8211], [1267, 8247], [1226, 8302], [1244, 8409], [1310, 8483], [1294, 8542], [1323, 8620], [1376, 8655]]] } }, { type: 'Feature', id: 'TR.DN', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.42, 'hc-middle-y': 0.53, 'hc-key': 'tr-dn', 'hc-a2': 'DN', labelrank: '7', hasc: 'TR.DN', 'alt-name': 'Denizli', 'woe-id': '2347277', subregion: null, fips: 'TU20', 'postal-code': 'DN', name: 'Denizli', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '29.2821', 'woe-name': 'Denizli', latitude: '37.7539', 'woe-label': 'Denizli, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[1219, 7160], [1297, 7139], [1368, 7016], [1359, 6950], [1156, 6805], [1153, 6732], [1230, 6706], [1254, 6661], [1163, 6603], [1148, 6571], [1074, 6535], [1076, 6467], [1096, 6414], [992, 6249], [975, 6173], [947, 6152], [941, 6105], [901, 6062], [799, 6114], [787, 6205], [712, 6261], [689, 6297], [646, 6305], [607, 6398], [545, 6417], [538, 6486], [514, 6542], [527, 6568], [612, 6570], [672, 6634], [712, 6646], [710, 6682], [674, 6691], [643, 6747], [664, 6789], [653, 6879], [610, 6935], [660, 6944], [694, 7028], [747, 7038], [811, 7009], [872, 7026], [910, 7001], [983, 7002], [1021, 7046], [1104, 7040], [1144, 7061], [1148, 7147], [1219, 7160]]] } }, { type: 'Feature', id: 'TR.US', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.44, 'hc-middle-y': 0.55, 'hc-key': 'tr-us', 'hc-a2': 'US', labelrank: '7', hasc: 'TR.US', 'alt-name': 'Uşak', 'woe-id': '2347315', subregion: null, fips: 'TU64', 'postal-code': 'US', name: 'Uşak', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '29.3636', 'woe-name': 'Uşak', latitude: '38.4942', 'woe-label': 'Uşak, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[1301, 7342], [1288, 7285], [1253, 7253], [1219, 7160], [1148, 7147], [1144, 7061], [1104, 7040], [1021, 7046], [983, 7002], [910, 7001], [872, 7026], [811, 7009], [747, 7038], [696, 7075], [730, 7116], [744, 7172], [740, 7240], [712, 7288], [819, 7377], [851, 7402], [918, 7378], [996, 7371], [1101, 7389], [1127, 7462], [1193, 7474], [1279, 7447], [1304, 7416], [1301, 7342]]] } }]
+}
diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss
index f1210d095..7d32270d6 100644
--- a/app/assets/stylesheets/application.scss
+++ b/app/assets/stylesheets/application.scss
@@ -5,7 +5,7 @@
*= require toastr/build/toastr.min
*= require select2/dist/css/select2.min
*= require custom/select2
- *= require custom/loading
+ *= require custom/content_loader
*= require intl-tel-input/build/css/intlTelInput.min
*= require custom/intl_tel_input
*= require flatpickr/dist/flatpickr.min
diff --git a/app/assets/stylesheets/custom/loading.css b/app/assets/stylesheets/custom/content_loader.css
similarity index 56%
rename from app/assets/stylesheets/custom/loading.css
rename to app/assets/stylesheets/custom/content_loader.css
index 48a0dee0e..46ff552c2 100644
--- a/app/assets/stylesheets/custom/loading.css
+++ b/app/assets/stylesheets/custom/content_loader.css
@@ -1,23 +1,24 @@
+
+
.loading {
- position: fixed;
+ position: absolute;
z-index: 1000;
left: 0;
top: 0;
width: 100%;
height: 100%;
overflow: auto;
- background-color: rgb(0, 0, 0);
- background-color: rgba(0, 0, 0, 0.4);
+ background: #d3d3d37a;
+ display: flex;
+ justify-content: center;
+ align-items: center;
}
.loading>.loading-content {
- height: 100%;
- display: flex;
- align-items: center;
- justify-content: center;
+ color: #707070;
+ text-align: center;
}
-.snipper-large {
- width: 3em;
- height: 3em;
+.custom-card-header {
+ padding: .25rem .75rem;
}
diff --git a/app/controllers/studies/dashboard_controller.rb b/app/controllers/detsis/dashboard_controller.rb
similarity index 88%
rename from app/controllers/studies/dashboard_controller.rb
rename to app/controllers/detsis/dashboard_controller.rb
index 485d39463..b379ca022 100644
--- a/app/controllers/studies/dashboard_controller.rb
+++ b/app/controllers/detsis/dashboard_controller.rb
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-module Studies
+module Detsis
class DashboardController < ApplicationController
def index; end
end
diff --git a/app/controllers/detsis/sdp_codes_controller.rb b/app/controllers/detsis/sdp_codes_controller.rb
new file mode 100644
index 000000000..e48041e31
--- /dev/null
+++ b/app/controllers/detsis/sdp_codes_controller.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Detsis
+ class SdpCodesController < ApplicationController
+ include SearchableModule
+
+ def index
+ @sdp_codes = pagy_by_search(SdpCode.order(:main))
+ end
+ end
+end
diff --git a/app/controllers/manager/dashboard_controller.rb b/app/controllers/manager/dashboard_controller.rb
new file mode 100644
index 000000000..21210a6c4
--- /dev/null
+++ b/app/controllers/manager/dashboard_controller.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+module Manager
+ class DashboardController < ApplicationController
+ def stats; end
+ end
+end
diff --git a/app/controllers/manager/stats/articles_controller.rb b/app/controllers/manager/stats/articles_controller.rb
new file mode 100644
index 000000000..d016d46af
--- /dev/null
+++ b/app/controllers/manager/stats/articles_controller.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Manager
+ module Stats
+ class ArticlesController < ApplicationController
+ layout false
+
+ def index; end
+ end
+ end
+end
diff --git a/app/controllers/manager/stats/employees_controller.rb b/app/controllers/manager/stats/employees_controller.rb
new file mode 100644
index 000000000..704e9ae4c
--- /dev/null
+++ b/app/controllers/manager/stats/employees_controller.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Manager
+ module Stats
+ class EmployeesController < ApplicationController
+ layout false
+
+ def index; end
+
+ def academic
+ @series = Employee.active.academic.group('titles.name').count
+ end
+ end
+ end
+end
diff --git a/app/controllers/manager/stats/students_controller.rb b/app/controllers/manager/stats/students_controller.rb
new file mode 100644
index 000000000..01b21859a
--- /dev/null
+++ b/app/controllers/manager/stats/students_controller.rb
@@ -0,0 +1,64 @@
+# frozen_string_literal: true
+
+module Manager
+ module Stats
+ class StudentsController < ApplicationController
+ layout false
+
+ def index; end
+
+ def cities
+ @series = Xokul::Ubs::Statistic::Student.by_cities(
+ schema: {
+ city: :name,
+ total: :value
+ }
+ ).each { |item| item[:name] = item[:name].capitalize_turkish }.to_json
+ end
+
+ def double_major_and_minor
+ @series = Xokul::Ubs::Statistic::Student.double_major_and_minor(
+ schema: {
+ category: :name,
+ number_of_students: :y
+ }
+ ).to_json
+ end
+
+ def genders
+ @series = Xokul::Ubs::Statistic::Student.by_genders(
+ schema: {
+ gender: :name,
+ number_of_students: :y
+ }
+ ).to_json
+ end
+
+ def genders_and_degrees
+ data = Xokul::Ubs::Statistic::Student.by_genders_and_degree
+ @degrees = data.map { |item| item[:degree] }.uniq
+ @series = data.group_by { |item| item[:gender] }.map do |gender, values|
+ {
+ name: gender,
+ data: @degrees.map do |degree|
+ values.find { |v| v[:degree] == degree }&.fetch(:number_of_students, 0)
+ end
+ }
+ end.to_json
+ end
+
+ def non_graduates
+ data = Xokul::Ubs::Statistic::Student.non_graduates
+ @degrees = data.map { |item| item[:degree] }.uniq
+ @series = data.group_by { |item| item[:status] }.map do |status, values|
+ {
+ name: status,
+ data: @degrees.map do |degree|
+ values.find { |v| v[:degree] == degree }&.fetch(:number_of_students, 0)
+ end
+ }
+ end.to_json
+ end
+ end
+ end
+end
diff --git a/app/controllers/studentship/course_enrollments_controller.rb b/app/controllers/studentship/course_enrollments_controller.rb
index 8be1660ba..90190996f 100644
--- a/app/controllers/studentship/course_enrollments_controller.rb
+++ b/app/controllers/studentship/course_enrollments_controller.rb
@@ -33,12 +33,10 @@ def destroy
end
def save
- if @service.course_enrollments.any?
- message = @service.save ? t('.success') : t('.error')
- redirect_to(list_student_course_enrollments_path(@student), flash: { info: message })
- else
- redirect_with(t('.errors.empty_selected_courses_list'))
- end
+ return redirect_with(t('.errors.empty_selected_courses_list')) if @service.course_enrollments.empty?
+ return redirect_with(t('.error')) unless @service.save
+
+ redirect_to(list_student_course_enrollments_path(@student), flash: { info: t('.success') })
end
private
@@ -73,7 +71,7 @@ def check_registration_status
end
def course_enrollment_params
- params.require(:course_enrollment).permit(:available_course_id)
+ params.require(:course_enrollment).permit(:available_course_id, :available_course_group_id)
end
end
end
diff --git a/app/controllers/studies/articles_controller.rb b/app/controllers/studies/articles_controller.rb
deleted file mode 100644
index 2db2c7e13..000000000
--- a/app/controllers/studies/articles_controller.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-module Studies
- class ArticlesController < ApplicationController
- def index; end
- end
-end
diff --git a/app/controllers/studies/certifications_controller.rb b/app/controllers/studies/certifications_controller.rb
deleted file mode 100644
index 9202c5a68..000000000
--- a/app/controllers/studies/certifications_controller.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-module Studies
- class CertificationsController < ApplicationController
- def index; end
- end
-end
diff --git a/app/controllers/studies/projects_controller.rb b/app/controllers/studies/projects_controller.rb
deleted file mode 100644
index 6574c700d..000000000
--- a/app/controllers/studies/projects_controller.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-module Studies
- class ProjectsController < ApplicationController
- def index; end
- end
-end
diff --git a/app/helpers/component_helper.rb b/app/helpers/component_helper.rb
index d29a4b7bc..7ecdcaec7 100644
--- a/app/helpers/component_helper.rb
+++ b/app/helpers/component_helper.rb
@@ -24,6 +24,21 @@ def klass_for_status(status)
STATUSES.fetch(status.to_sym, 'secondary')
end
+ def content_loader_panel_tag(url, header: nil, refresh: {}, &block)
+ render 'layouts/components/content_loader_panel',
+ url: url,
+ header: header,
+ content: (block_given? ? capture(&block) : nil),
+ refresh: OpenStruct.new(
+ auto: refresh.fetch(:auto, false),
+ interval: refresh.fetch(:interval, 10_000)
+ )
+ end
+
+ def content_loader_tag(url)
+ render 'layouts/components/content_loader_basic', url: url
+ end
+
def loading_tag(text = t('loading'))
tag.div(class: 'loading', id: 'loading', style: 'display: none;') do
tag.div(class: 'loading-content') do
diff --git a/app/javascript/channels/consumer.js b/app/javascript/channels/consumer.js
index 0eceb59b1..9f1489fd8 100644
--- a/app/javascript/channels/consumer.js
+++ b/app/javascript/channels/consumer.js
@@ -1,6 +1,6 @@
// Action Cable provides the framework to deal with WebSockets in Rails.
// You can generate new channels where WebSocket features live using the `rails generate channel` command.
-import { createConsumer } from "@rails/actioncable"
+import { createConsumer } from '@rails/actioncable'
export default createConsumer()
diff --git a/app/javascript/controllers/content_loader_controller.js b/app/javascript/controllers/content_loader_controller.js
new file mode 100644
index 000000000..f9b2264b4
--- /dev/null
+++ b/app/javascript/controllers/content_loader_controller.js
@@ -0,0 +1,57 @@
+import { Controller } from 'stimulus'
+import fetchContent from './fetch_content'
+
+export default class extends Controller {
+ static targets = ['content', 'loadingMessage', 'autoRefresh']
+
+ connect () {
+ this.load()
+ if (this.data.has('refreshInterval') && this.hasautoRefreshTarget) {
+ this.startRefreshing()
+ }
+ }
+
+ disconnect () {
+ this.stopRefreshing()
+ }
+
+ load () {
+ fetchContent({
+ url: this.url,
+ targetElement: this.contentTarget,
+ loadingElement: this.loadingMessageTarget
+ })
+ }
+
+ startRefreshing () {
+ this.refreshTimer = setInterval(() => {
+ this.load()
+ }, this.data.get('refreshInterval'))
+ }
+
+ stopRefreshing () {
+ if (this.refreshTimer) {
+ clearInterval(this.refreshTimer)
+ }
+ }
+
+ autoRefreshStart () {
+ if (this.autoRefreshTarget.checked) return this.startRefreshing()
+
+ this.stopRefreshing()
+ }
+
+ showLoading () {
+ this.loadingMessageTarget.classList.remove('d-none')
+ }
+
+ refresh (event) {
+ event.preventDefault()
+ this.showLoading()
+ this.load()
+ }
+
+ get url () {
+ return this.data.get('url')
+ }
+}
diff --git a/app/javascript/controllers/fetch_content.js b/app/javascript/controllers/fetch_content.js
new file mode 100644
index 000000000..7c729e127
--- /dev/null
+++ b/app/javascript/controllers/fetch_content.js
@@ -0,0 +1,26 @@
+/* eslint-disable no-undef */
+export default function ({ url, targetElement, loadingElement }) {
+ const ERROR_MESSAGE = `
+
+
+
+ İşlem sırasında bir hata oluştu! Lütfen tekrardan deneyiniz.
+
+
+ `
+
+ fetch(url)
+ .then(response => {
+ if (response.ok) return response.text()
+
+ throw Error(response.statusText)
+ })
+ .then(html => {
+ $(targetElement).html(html)
+ loadingElement.classList.add('d-none')
+ })
+ .catch(() => {
+ $(targetElement).html(ERROR_MESSAGE)
+ loadingElement.classList.add('d-none')
+ })
+}
diff --git a/app/javascript/controllers/index.js b/app/javascript/controllers/index.js
new file mode 100644
index 000000000..5b50a70b7
--- /dev/null
+++ b/app/javascript/controllers/index.js
@@ -0,0 +1,9 @@
+// Load all the controllers within this directory and all subdirectories.
+// Controller files must be named *_controller.js.
+
+import { Application } from 'stimulus'
+import { definitionsFromContext } from 'stimulus/webpack-helpers'
+
+const application = Application.start()
+const context = require.context('controllers', true, /_controller\.js$/)
+application.load(definitionsFromContext(context))
diff --git a/app/javascript/controllers/manager_dashboard_controller.js b/app/javascript/controllers/manager_dashboard_controller.js
new file mode 100644
index 000000000..59fb6eaa5
--- /dev/null
+++ b/app/javascript/controllers/manager_dashboard_controller.js
@@ -0,0 +1,21 @@
+/* eslint-disable no-undef */
+import { Controller } from 'stimulus'
+import fetchContent from './fetch_content'
+
+export default class extends Controller {
+ static targets = ['content', 'loadingMessage']
+
+ load (event) {
+ this.showLoading()
+
+ fetchContent({
+ url: event.target.dataset.contentUrl,
+ targetElement: this.contentTarget,
+ loadingElement: this.loadingMessageTarget
+ })
+ }
+
+ showLoading () {
+ this.loadingMessageTarget.classList.remove('d-none')
+ }
+}
diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js
index fab885eb6..3456c0f3f 100644
--- a/app/javascript/packs/application.js
+++ b/app/javascript/packs/application.js
@@ -3,16 +3,10 @@
// a relevant structure within app/javascript and only use these pack files to reference
// that code so it'll be compiled.
-require("@rails/ujs").start()
-require("@rails/activestorage").start()
-require("channels")
-require("trix")
-require("@rails/actiontext")
+import 'controllers'
-if (navigator.serviceWorker) {
- navigator.serviceWorker.register('/service-worker.js', { scope: './' })
- .then(function(registration) {
- console.log('[Companion]', 'Service worker registered!')
- console.log(registration)
- })
- }
+require('@rails/ujs').start()
+require('@rails/activestorage').start()
+require('channels')
+require('trix')
+require('@rails/actiontext')
diff --git a/app/models/available_course.rb b/app/models/available_course.rb
index 6035a93c2..cc6858e43 100644
--- a/app/models/available_course.rb
+++ b/app/models/available_course.rb
@@ -56,7 +56,11 @@ class AvailableCourse < ApplicationRecord
# custom methods
def quota_full?
- groups.sum(:quota) == course_enrollments.where(status: :saved).length
+ groups.sum(:quota) == course_enrollments.saved.count
+ end
+
+ def enrollable_groups
+ groups.order(:name).reject(&:quota_full?)
end
private
diff --git a/app/models/available_course_group.rb b/app/models/available_course_group.rb
index 55546c7d3..7a3b9e091 100644
--- a/app/models/available_course_group.rb
+++ b/app/models/available_course_group.rb
@@ -3,6 +3,7 @@
class AvailableCourseGroup < ApplicationRecord
# relations
belongs_to :available_course, counter_cache: :groups_count
+ has_many :course_enrollments, dependent: :destroy
has_many :lecturers, class_name: 'AvailableCourseLecturer', foreign_key: :group_id,
inverse_of: :group, dependent: :destroy
@@ -14,4 +15,9 @@ class AvailableCourseGroup < ApplicationRecord
validates :name, presence: true, uniqueness: { scope: :available_course }, length: { maximum: 255 }
validates :quota, allow_nil: true, numericality: { only_integer: true, greater_than_or_equal_to: 1 }
validates_associated :lecturers
+
+ # custom methods
+ def quota_full?
+ quota == course_enrollments.saved.count
+ end
end
diff --git a/app/models/course_enrollment.rb b/app/models/course_enrollment.rb
index c5af7552f..70d1a131f 100644
--- a/app/models/course_enrollment.rb
+++ b/app/models/course_enrollment.rb
@@ -6,6 +6,7 @@ class CourseEnrollment < ApplicationRecord
# relations
belongs_to :available_course
+ belongs_to :available_course_group
belongs_to :semester_registration
# validations
diff --git a/app/models/sdp_code.rb b/app/models/sdp_code.rb
new file mode 100644
index 000000000..b30dd14ce
--- /dev/null
+++ b/app/models/sdp_code.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class SdpCode < ApplicationRecord
+ include PgSearch::Model
+
+ pg_search_scope(
+ :search, against: %i[main first second third name], using: { tsearch: { prefix: true } }
+ )
+
+ # rubocop:disable Style/FormatStringToken
+ def full_code
+ tmpl = '%03d.%02d.%02d'
+ format(tmpl, main: main, first: first, second: second)
+ end
+ # rubocop:enable Style/FormatStringToken
+end
diff --git a/app/models/semester_registration.rb b/app/models/semester_registration.rb
index 0716851c4..f35feadeb 100644
--- a/app/models/semester_registration.rb
+++ b/app/models/semester_registration.rb
@@ -11,6 +11,7 @@ class SemesterRegistration < ApplicationRecord
belongs_to :academic_term
belongs_to :student
has_many :course_enrollments, dependent: :destroy
+ has_many :available_course_groups, through: :course_enrollments
# validations
validates :semester, uniqueness: { scope: :student_id }, numericality: { greater_than: 0 }
diff --git a/app/services/student_course_enrollment_service.rb b/app/services/student_course_enrollment_service.rb
index bb40b358a..b2d51855b 100644
--- a/app/services/student_course_enrollment_service.rb
+++ b/app/services/student_course_enrollment_service.rb
@@ -37,14 +37,15 @@ def course_enrollments
@course_enrollments ||=
@student.current_registration
.course_enrollments
- .includes(available_course: [curriculum_course: %i[course curriculum_semester]])
+ .includes(:available_course_group, available_course: [curriculum_course: %i[course curriculum_semester]])
end
def enroll(course_enrollment_params)
course_enrollment = @student.current_registration.course_enrollments.new(course_enrollment_params)
- available_course = course_enrollment.available_course
+ available_course = enrollable(course_enrollment.available_course)
+ check_group_quota(available_course, course_enrollment.available_course_group)
- return course_enrollment.save if enrollable(available_course).errors.empty?
+ return course_enrollment.save if available_course.errors.empty?
raise EnrollableError, available_course.errors.full_messages.first
end
@@ -58,7 +59,9 @@ def drop(course_enrollment)
end
def save
- @student.current_registration.course_enrollments.update(status: :saved)
+ return unless savable?
+
+ @course_enrollments.update(status: :saved)
@student.current_registration.update(status: :saved)
end
@@ -76,6 +79,10 @@ def dropable(available_course)
available_course
end
+ def savable?
+ @student.current_registration.available_course_groups.none?(&:quota_full?)
+ end
+
private
def extra_ects
@@ -140,6 +147,10 @@ def check_quota(available_course)
available_course.errors.add(:base, translate('quota_full')) if available_course.quota_full?
end
+ def check_group_quota(available_course, available_course_group)
+ available_course.errors.add(:base, translate('group_quota_full')) if available_course_group.quota_full?
+ end
+
def check_group(available_course)
group_remaining_ects = remaining_ects_for(available_course.curriculum_course.curriculum_course_group)
available_course.errors.add(:base, translate('already_enrolled_at_group')) if group_remaining_ects.zero?
diff --git a/app/services/xokul/detsis.rb b/app/services/xokul/detsis.rb
new file mode 100644
index 000000000..be0cc5710
--- /dev/null
+++ b/app/services/xokul/detsis.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Xokul
+ module Detsis
+ module_function
+
+ def sdp_code_references
+ Connection.request '/detsis/sdp_code_references'
+ end
+ end
+end
diff --git a/app/services/xokul/ubs/statistic/student.rb b/app/services/xokul/ubs/statistic/student.rb
new file mode 100644
index 000000000..011f9e16b
--- /dev/null
+++ b/app/services/xokul/ubs/statistic/student.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+module Xokul
+ module Ubs
+ module Statistic
+ module Student
+ NAMESPACE = '/ubs/api/students/statistics'
+
+ module_function
+
+ def by_genders_and_degree
+ Connection.request("#{NAMESPACE}/genders_and_degree?locale=#{I18n.locale}")
+ end
+
+ def by_genders(schema: {})
+ transform_keys(
+ Connection.request("#{NAMESPACE}/genders?locale=#{I18n.locale}"), schema
+ )
+ end
+
+ def by_cities(schema: {})
+ transform_keys(
+ Connection.request("#{NAMESPACE}/cities?locale=#{I18n.locale}"), schema
+ )
+ end
+
+ def by_units
+ Connection.request("#{NAMESPACE}/units?locale=#{I18n.locale}")
+ end
+
+ def non_graduates
+ Connection.request("#{NAMESPACE}/non_graduates?locale=#{I18n.locale}")
+ end
+
+ def double_major_and_minor(schema: {})
+ transform_keys(
+ Connection.request("#{NAMESPACE}/double_major_and_minor?locale=#{I18n.locale}"), schema
+ )
+ end
+
+ def transform_keys(results, schema)
+ results.map { |item| item.transform_keys { |key| schema.fetch(key, key) } }
+ end
+ end
+ end
+ end
+end
diff --git a/app/views/detsis/dashboard/_card.html.erb b/app/views/detsis/dashboard/_card.html.erb
new file mode 100644
index 000000000..ea4246081
--- /dev/null
+++ b/app/views/detsis/dashboard/_card.html.erb
@@ -0,0 +1,4 @@
+<%= link_to path, class: 'list-group-item d-flex list-group-item-action justify-content-between align-items-center' do %>
+ <%= t(title) %>
+ <%= count %>
+<% end %>
diff --git a/app/views/detsis/dashboard/index.html.erb b/app/views/detsis/dashboard/index.html.erb
new file mode 100644
index 000000000..1f49327f2
--- /dev/null
+++ b/app/views/detsis/dashboard/index.html.erb
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+ <%= render 'card',
+ count: SdpCode.count,
+ path: detsis_sdp_codes_path,
+ title: '.sdp_codes' %>
+
+
+
+
+
diff --git a/app/views/detsis/sdp_codes/_search.html.erb b/app/views/detsis/sdp_codes/_search.html.erb
new file mode 100644
index 000000000..e1d1adaa6
--- /dev/null
+++ b/app/views/detsis/sdp_codes/_search.html.erb
@@ -0,0 +1,45 @@
+
diff --git a/app/views/detsis/sdp_codes/index.html.erb b/app/views/detsis/sdp_codes/index.html.erb
new file mode 100644
index 000000000..af06c2cab
--- /dev/null
+++ b/app/views/detsis/sdp_codes/index.html.erb
@@ -0,0 +1,41 @@
+
+
+
+
+
+ <%= render 'search' %>
+
+
+
+ <%= t('.name') %> |
+ <%= t('.main') %> |
+ <%= t('.first') %> |
+ <%= t('.second') %> |
+ <%= t('.third') %> |
+ <%= t('.full_code') %> |
+
+
+
+ <% @sdp_codes.each do |code| %>
+
+ <%= code.name %> |
+ <%= code.main %> |
+ <%= code.first %> |
+ <%= code.second %> |
+ <%= code.third %> |
+ <%= code.full_code %> |
+
+ <% end %>
+
+
+
+
+
+
+
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb
index a9af83ea1..58e209865 100644
--- a/app/views/layouts/application.html.erb
+++ b/app/views/layouts/application.html.erb
@@ -4,6 +4,7 @@
<%= render 'layouts/shared/meta' %>
<%= stylesheet_link_tag 'application', media: 'all' %>
<%= javascript_include_tag 'application' %>
+ <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload', async: true %>
diff --git a/app/views/layouts/components/_content_loader_basic.html.erb b/app/views/layouts/components/_content_loader_basic.html.erb
new file mode 100644
index 000000000..72dc351fa
--- /dev/null
+++ b/app/views/layouts/components/_content_loader_basic.html.erb
@@ -0,0 +1,5 @@
+
+
+ <%= render 'layouts/components/loading' %>
+
diff --git a/app/views/layouts/components/_content_loader_panel.html.erb b/app/views/layouts/components/_content_loader_panel.html.erb
new file mode 100644
index 000000000..c3bbadeec
--- /dev/null
+++ b/app/views/layouts/components/_content_loader_panel.html.erb
@@ -0,0 +1,49 @@
+
+ data-content-loader-refresh-interval="<%= refresh.interval %>"
+ <% end %>>
+
+
+
+
+ <%= content %>
+ <%= render 'layouts/components/loading' %>
+
+
+
diff --git a/app/views/layouts/components/_loading.html.erb b/app/views/layouts/components/_loading.html.erb
new file mode 100644
index 000000000..2fb7bf773
--- /dev/null
+++ b/app/views/layouts/components/_loading.html.erb
@@ -0,0 +1,8 @@
+
+
+
+ <%= t('loading') %>
+
+
<%= t('loading') %>
+
+
diff --git a/app/views/layouts/shared/_sidebar.html.erb b/app/views/layouts/shared/_sidebar.html.erb
index dcf179e41..6c8a97c8a 100644
--- a/app/views/layouts/shared/_sidebar.html.erb
+++ b/app/views/layouts/shared/_sidebar.html.erb
@@ -6,11 +6,6 @@
<%= fa_icon('home', class: 'nav-icon') %> <%= t('home_nav') %>
<% end %>
-
- <%= link_to :studies, class: 'nav-link' do %>
- <%= fa_icon('book', text: t('.studies'), class: 'nav-icon') %>
- <% end %>
-
<%= link_to :units, class: 'nav-link' do %>
<%= fa_icon('sitemap', text: t('.units'), class: 'nav-icon') %>
@@ -143,9 +138,26 @@
<%= fa_icon('th', text: t('.meksis'), class: 'nav-icon') %>
<% end %>
+
+ <%= link_to :detsis, class: 'nav-link' do %>
+ <%= fa_icon('th', text: t('.detsis'), class: 'nav-icon') %>
+ <% end %>
+
<%= link_to :ldap_entities, class: 'nav-link' do %>
- <%= fa_icon('database', text: t('.ldap_sync'), class: 'nav-icon') %>
+ <%= fa_icon('database', text: t('.ldap'), class: 'nav-icon') %>
+ <% end %>
+
+
+
+
+
+ <%= fa_icon('microchip', class: 'nav-icon') %><%= t('.manager.title') %>
+
+
+ -
+ <%= link_to [:manager, :stats], class: 'nav-link' do %>
+ <%= fa_icon('area-chart', text: t('.manager.stats'), class: 'nav-icon') %>
<% end %>
diff --git a/app/views/manager/dashboard/stats.html.erb b/app/views/manager/dashboard/stats.html.erb
new file mode 100644
index 000000000..c1ba77a32
--- /dev/null
+++ b/app/views/manager/dashboard/stats.html.erb
@@ -0,0 +1,64 @@
+
+
+
+
+
<%= fa_icon 'graduation-cap' %>
+
+
+
<%= Xokul::Ubs::Statistic::Student.by_genders.sum { |item| item[:number_of_students] } %>
+
<%= t('.student') %>
+
+
+
+
+
+
+
+
<%= fa_icon 'users' %>
+
+
+
<%= Employee.active.distinct(:user_id).count %>
+
<%= t('.employee') %>
+
+
+
+
+
+
+
+
<%= fa_icon 'book' %>
+
+
+
<%= Article.count %>
+
<%= t('.academic_publishing') %>
+
+
+
+
+
+
+
+
+ <%= content_loader_tag(manager_students_path) %>
+
+
+
+ <%= render 'layouts/components/loading' %>
+
+
diff --git a/app/views/studies/articles/index.html.erb b/app/views/manager/stats/articles/index.html.erb
similarity index 100%
rename from app/views/studies/articles/index.html.erb
rename to app/views/manager/stats/articles/index.html.erb
diff --git a/app/views/manager/stats/employees/academic.html.erb b/app/views/manager/stats/employees/academic.html.erb
new file mode 100644
index 000000000..9aad28dbb
--- /dev/null
+++ b/app/views/manager/stats/employees/academic.html.erb
@@ -0,0 +1 @@
+<%= column_chart @series, title: t('.title'), adapter: :highcharts %>
diff --git a/app/views/manager/stats/employees/index.html.erb b/app/views/manager/stats/employees/index.html.erb
new file mode 100644
index 000000000..da0873df7
--- /dev/null
+++ b/app/views/manager/stats/employees/index.html.erb
@@ -0,0 +1,5 @@
+
+
+ <%= content_loader_panel_tag(manager_employees_academic_path, refresh: { auto: true }) %>
+
+
diff --git a/app/views/manager/stats/students/cities.html.erb b/app/views/manager/stats/students/cities.html.erb
new file mode 100644
index 000000000..07b1ada47
--- /dev/null
+++ b/app/views/manager/stats/students/cities.html.erb
@@ -0,0 +1,46 @@
+
+
+
diff --git a/app/views/manager/stats/students/double_major_and_minor.html.erb b/app/views/manager/stats/students/double_major_and_minor.html.erb
new file mode 100644
index 000000000..0dbe413ad
--- /dev/null
+++ b/app/views/manager/stats/students/double_major_and_minor.html.erb
@@ -0,0 +1,35 @@
+
+
+
diff --git a/app/views/manager/stats/students/genders.html.erb b/app/views/manager/stats/students/genders.html.erb
new file mode 100644
index 000000000..f7f2d0900
--- /dev/null
+++ b/app/views/manager/stats/students/genders.html.erb
@@ -0,0 +1,37 @@
+
+
+
diff --git a/app/views/manager/stats/students/genders_and_degrees.html.erb b/app/views/manager/stats/students/genders_and_degrees.html.erb
new file mode 100644
index 000000000..9a567c42b
--- /dev/null
+++ b/app/views/manager/stats/students/genders_and_degrees.html.erb
@@ -0,0 +1,34 @@
+
+
+
diff --git a/app/views/manager/stats/students/index.html.erb b/app/views/manager/stats/students/index.html.erb
new file mode 100644
index 000000000..7c7fcd576
--- /dev/null
+++ b/app/views/manager/stats/students/index.html.erb
@@ -0,0 +1,20 @@
+<%= javascript_include_tag 'chart' %>
+<%= javascript_include_tag 'highcharts-langs/tr' if I18n.locale == :tr %>
+
+
+
+ <%= content_loader_panel_tag(manager_students_cities_path, refresh: { auto: true }) %>
+
+
+ <%= content_loader_panel_tag(manager_students_genders_path, refresh: { auto: true }) %>
+
+
+ <%= content_loader_panel_tag(manager_students_genders_and_degrees_path, refresh: { auto: true }) %>
+
+
+ <%= content_loader_panel_tag(manager_students_double_major_and_minor_path, refresh: { auto: true }) %>
+
+
+ <%= content_loader_panel_tag(manager_students_non_graduates_path, refresh: { auto: true }) %>
+
+
diff --git a/app/views/manager/stats/students/non_graduates.html.erb b/app/views/manager/stats/students/non_graduates.html.erb
new file mode 100644
index 000000000..c12fa3691
--- /dev/null
+++ b/app/views/manager/stats/students/non_graduates.html.erb
@@ -0,0 +1,32 @@
+
+
+
diff --git a/app/views/studentship/course_enrollments/_available_courses.html.erb b/app/views/studentship/course_enrollments/_available_courses.html.erb
index ed018f910..cd6310295 100644
--- a/app/views/studentship/course_enrollments/_available_courses.html.erb
+++ b/app/views/studentship/course_enrollments/_available_courses.html.erb
@@ -11,6 +11,7 @@
<%= t('.type') %> |
<%= t('.credit') %> |
<%= t('.ects') %> |
+ <%= t('.group') %> |
<%= t('actions') %> |
@@ -22,15 +23,24 @@
<%= enum_t(available_course.curriculum_course, :type) %> |
<%= available_course.credit.to_i %> |
<%= available_course.ects.to_i %> |
-
+
+ <%= simple_form_for([@student, CourseEnrollment.new()]) do |f| %>
+ <%= f.hidden_field :available_course_id, value: available_course.id %>
<% if available_course.errors.empty? %>
- <%= link_to(t('.add'), student_course_enrollments_path(@student, course_enrollment: { available_course_id: available_course.id }), method: :post, class: 'btn btn-sm btn-outline-success') %>
+ | <%= f.association :available_course_group,
+ collection: available_course.enrollable_groups,
+ include_blank: false,
+ label: false %> |
+ <%= f.button(:submit, t('.add'), class: 'btn btn-outline-success btn-sm') %> |
<% else %>
-
-
-
+ |
+
+
+
+
+ |
<% end %>
-
+ <% end %>
<% end %>
diff --git a/app/views/studentship/course_enrollments/_course_enrollments.html.erb b/app/views/studentship/course_enrollments/_course_enrollments.html.erb
index e3b5d4753..b636cf910 100644
--- a/app/views/studentship/course_enrollments/_course_enrollments.html.erb
+++ b/app/views/studentship/course_enrollments/_course_enrollments.html.erb
@@ -6,6 +6,7 @@
<%= t('.type') %> |
<%= t('.credit') %> |
<%= t('.ects') %> |
+ <%= t('.group') %> |
<%= t('actions') %> |
@@ -18,9 +19,11 @@
<%= enum_t(available_course.curriculum_course, :type) %> |
<%= available_course.credit.to_i %> |
<%= available_course.ects.to_i %> |
+ <%= course_enrollment.available_course_group.name %> |
<% if available_course.errors.empty? %>
- <%= link_to(t('.drop'), student_course_enrollment_path(@student, course_enrollment), method: :delete, class: 'btn btn-sm btn-outline-danger') %>
+ <% drop_button_class = course_enrollment.available_course_group.quota_full? ? 'btn-danger' : 'btn-outline-danger' %>
+ <%= link_to(t('.drop'), student_course_enrollment_path(@student, course_enrollment), method: :delete, class: "btn btn-sm #{drop_button_class}") %>
<% else %>
diff --git a/app/views/studentship/course_enrollments/list.html.erb b/app/views/studentship/course_enrollments/list.html.erb
index 26d9d325d..4ba4a92b0 100644
--- a/app/views/studentship/course_enrollments/list.html.erb
+++ b/app/views/studentship/course_enrollments/list.html.erb
@@ -29,6 +29,7 @@
| <%= t('.sequence') %> |
<%= t('.credit') %> |
<%= t('.ects') %> |
+ <%= t('.group') %> |
@@ -42,6 +43,7 @@
<%= available_course.curriculum_course.curriculum_semester.sequence %> |
<%= available_course.credit.to_i %> |
<%= available_course.ects.to_i %> |
+ <%= course_enrollment.available_course_group.name %> |
<% end %>
diff --git a/app/views/studentship/course_enrollments/new.html.erb b/app/views/studentship/course_enrollments/new.html.erb
index a30f4451a..6c153a2b9 100644
--- a/app/views/studentship/course_enrollments/new.html.erb
+++ b/app/views/studentship/course_enrollments/new.html.erb
@@ -7,12 +7,23 @@
<%= render 'student_info' %>
+
+<% unless save_button_enabled %>
+
+
<%= t('.courses_with_full_quota') %>
+
+<% end %>
+
diff --git a/app/views/studies/certifications/index.html.erb b/app/views/studies/certifications/index.html.erb
deleted file mode 100644
index e69de29bb..000000000
diff --git a/app/views/studies/dashboard/index.html.erb b/app/views/studies/dashboard/index.html.erb
deleted file mode 100644
index 128744b50..000000000
--- a/app/views/studies/dashboard/index.html.erb
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/app/views/studies/projects/index.html.erb b/app/views/studies/projects/index.html.erb
deleted file mode 100644
index e69de29bb..000000000
diff --git a/babel.config.js b/babel.config.js
index f930f3e0a..306ab99f6 100644
--- a/babel.config.js
+++ b/babel.config.js
@@ -1,4 +1,4 @@
-module.exports = function(api) {
+module.exports = function (api) {
var validEnv = ['development', 'test', 'production']
var currentEnv = api.env()
var isDevelopmentEnv = api.env('development')
diff --git a/config/locales/controllers/detsis/dashboard.en.yml b/config/locales/controllers/detsis/dashboard.en.yml
new file mode 100644
index 000000000..f0fd8d6ed
--- /dev/null
+++ b/config/locales/controllers/detsis/dashboard.en.yml
@@ -0,0 +1,7 @@
+en:
+ detsis:
+ dashboard:
+ index:
+ card_header: DETSIS References
+ card:
+ sdp_codes: SDP Codes
diff --git a/config/locales/controllers/detsis/dashboard.tr.yml b/config/locales/controllers/detsis/dashboard.tr.yml
new file mode 100644
index 000000000..74a9100f4
--- /dev/null
+++ b/config/locales/controllers/detsis/dashboard.tr.yml
@@ -0,0 +1,7 @@
+tr:
+ detsis:
+ dashboard:
+ index:
+ card_header: DETSİS Referansları
+ card:
+ sdp_codes: SDP Kodları
diff --git a/config/locales/controllers/detsis/sdp_codes.en.yml b/config/locales/controllers/detsis/sdp_codes.en.yml
new file mode 100644
index 000000000..b64bbeff1
--- /dev/null
+++ b/config/locales/controllers/detsis/sdp_codes.en.yml
@@ -0,0 +1,13 @@
+en:
+ detsis:
+ sdp_codes:
+ index:
+ card_header: SDP Codes
+ first: First code
+ full_code: Full code
+ main: Main Code
+ name: Name
+ second: Second code
+ third: Third code
+ search:
+ smart_search_placeholder: Search
diff --git a/config/locales/controllers/detsis/sdp_codes.tr.yml b/config/locales/controllers/detsis/sdp_codes.tr.yml
new file mode 100644
index 000000000..ef8164f35
--- /dev/null
+++ b/config/locales/controllers/detsis/sdp_codes.tr.yml
@@ -0,0 +1,13 @@
+tr:
+ detsis:
+ sdp_codes:
+ index:
+ card_header: SDP Kodları
+ first: Birinci kod
+ full_code: Tam kod
+ main: Ana kod
+ name: Adı
+ second: İkinci kod
+ third: Üçüncü kod
+ search:
+ smart_search_placeholder: Ara
diff --git a/config/locales/controllers/manager/dashboard.en.yml b/config/locales/controllers/manager/dashboard.en.yml
new file mode 100644
index 000000000..e66cd3f27
--- /dev/null
+++ b/config/locales/controllers/manager/dashboard.en.yml
@@ -0,0 +1,8 @@
+en:
+ manager:
+ dashboard:
+ stats:
+ more_information: More Information
+ academic_publishing: Academic Publishing
+ employee: Employee
+ student: Student
diff --git a/config/locales/controllers/manager/dashboard.tr.yml b/config/locales/controllers/manager/dashboard.tr.yml
new file mode 100644
index 000000000..7ab407162
--- /dev/null
+++ b/config/locales/controllers/manager/dashboard.tr.yml
@@ -0,0 +1,8 @@
+tr:
+ manager:
+ dashboard:
+ stats:
+ academic_publishing: Akademik Yayın
+ employee: Personel
+ more_information: Detaylı Bilgi
+ student: Öğrenci
diff --git a/config/locales/controllers/manager/stats/articles.en.yml b/config/locales/controllers/manager/stats/articles.en.yml
new file mode 100644
index 000000000..79039428b
--- /dev/null
+++ b/config/locales/controllers/manager/stats/articles.en.yml
@@ -0,0 +1,13 @@
+en:
+ manager:
+ stats:
+ articles:
+ index:
+ article: Article
+ number_of_articles_by_years: Number of Articles by Years
+ publications_by_index_types: Publications by Index Types
+ publications_by_language: Publications by Publication Language
+ publications_by_number_of_authors: Publications by Number of Authors
+ publications_by_publication_types: Publications by Publication Types
+ recently_added: Recently Added Articles
+ top_publishers: Top Publishing Academics
diff --git a/config/locales/controllers/manager/stats/articles.tr.yml b/config/locales/controllers/manager/stats/articles.tr.yml
new file mode 100644
index 000000000..1097d6b2a
--- /dev/null
+++ b/config/locales/controllers/manager/stats/articles.tr.yml
@@ -0,0 +1,13 @@
+tr:
+ manager:
+ stats:
+ articles:
+ index:
+ article: Makale
+ number_of_articles_by_years: Yıllara Göre Makale Sayısı
+ publications_by_index_types: Index Türüne Göre Makaleler
+ publications_by_language: Yayın Diline Göre Makaleler
+ publications_by_number_of_authors: Yazar Sayısına Göre Makaleler
+ publications_by_publication_types: Yayın Türüne Göre Makaleler
+ recently_added: En Son Eklenen Makaleler
+ top_publishers: En Çok Makalesi Olanlar
diff --git a/config/locales/controllers/manager/stats/employees.en.yml b/config/locales/controllers/manager/stats/employees.en.yml
new file mode 100644
index 000000000..6f8d98e65
--- /dev/null
+++ b/config/locales/controllers/manager/stats/employees.en.yml
@@ -0,0 +1,6 @@
+en:
+ manager:
+ stats:
+ employees:
+ academic:
+ title: Number of Academic Employee
diff --git a/config/locales/controllers/manager/stats/employees.tr.yml b/config/locales/controllers/manager/stats/employees.tr.yml
new file mode 100644
index 000000000..a3c8df8e0
--- /dev/null
+++ b/config/locales/controllers/manager/stats/employees.tr.yml
@@ -0,0 +1,6 @@
+tr:
+ manager:
+ stats:
+ employees:
+ academic:
+ title: Akademik Personel Sayıları
diff --git a/config/locales/controllers/manager/stats/students.en.yml b/config/locales/controllers/manager/stats/students.en.yml
new file mode 100644
index 000000000..d489c2f5b
--- /dev/null
+++ b/config/locales/controllers/manager/stats/students.en.yml
@@ -0,0 +1,21 @@
+en:
+ manager:
+ stats:
+ students:
+ cities:
+ female: Female
+ male: Male
+ title: Number of Students by Cities
+ total: Total
+ double_major_and_minor:
+ rate: Rate
+ title: Number of Students Studying in Double Major and Minor Programs
+ genders:
+ rate: Rate
+ title: Number of Student by Genders
+ genders_and_degrees:
+ title: Number of Students by Academic Degree and Gender
+ total_number_of_students: Total Number of Students
+ non_graduates:
+ total_number_of_students: Total Number of Students
+ title: Number of Students Not Graduate on Time by Academic Degree
diff --git a/config/locales/controllers/manager/stats/students.tr.yml b/config/locales/controllers/manager/stats/students.tr.yml
new file mode 100644
index 000000000..f23c8c696
--- /dev/null
+++ b/config/locales/controllers/manager/stats/students.tr.yml
@@ -0,0 +1,22 @@
+tr:
+ manager:
+ stats:
+ students:
+ cities:
+ female: Kadın
+ male: Erkek
+ title: Şehirlere Göre Öğrenci Sayıları
+ total: Toplam
+ double_major_and_minor:
+ rate: Oran
+ title: Çift Anadal ve Yandal Programlarında Öğrenim Gören Öğrenci Sayısı
+ genders:
+ rate: Oran
+ title: Cinsiyetlerine Göre Öğrenci Sayıları
+ genders_and_degrees:
+ title: Öğrenim Düzeylerine ve Cinsiyetlerine Göre Öğrenci Sayıları
+ total_number_of_students: Toplam Öğrenci Sayısı
+ non_graduates:
+ total_number_of_students: Toplam Öğrenci Sayısı
+ title: Öğrenim Düzeylerine Göre Zamanında Mezun Olamayan Öğrenci Sayıları
+
diff --git a/config/locales/controllers/studentship/course_enrollments.en.yml b/config/locales/controllers/studentship/course_enrollments.en.yml
index 87bb590ce..8892c20c4 100644
--- a/config/locales/controllers/studentship/course_enrollments.en.yml
+++ b/config/locales/controllers/studentship/course_enrollments.en.yml
@@ -15,6 +15,7 @@ en:
code: Code
credit: Credit
ects: ECTS
+ group: Group
name: Name
type: Type
add: Add
@@ -30,10 +31,11 @@ en:
errors:
already_enrolled_at_group: The maximum amount of ECTS that can be selected from the course group is selected.
empty_selected_courses_list: The list of selected courses is empty.
- quota_full: The course has reached its quota.
+ group_quota_full: The course group has reached its quota.
must_drop_first: Courses taken from the top semester must be dropped first.
not_enough_ects: The amount of ECTS that can be selected is not enough for you to take this course.
not_proper_register_event_range: There is no online course registration activity covering the date range today.
+ quota_full: The course has reached its quota.
registration_completed: You can not perform this action since you have completed the course selection.
index:
course_enrollments: Course Enrollments
@@ -47,6 +49,7 @@ en:
year: Year
new:
available_courses: Available Courses
+ courses_with_full_quota: There are courses reached its quota in your selected courses list. Please remove the course(s) indicated by the red button from your list.
save_enrollments: Save Enrollments
selectable_ects: Selectable ECTS
selected_courses: Selected Courses
diff --git a/config/locales/controllers/studentship/course_enrollments.tr.yml b/config/locales/controllers/studentship/course_enrollments.tr.yml
index 5916503a9..21e871b3c 100644
--- a/config/locales/controllers/studentship/course_enrollments.tr.yml
+++ b/config/locales/controllers/studentship/course_enrollments.tr.yml
@@ -15,6 +15,7 @@ tr:
code: Kodu
credit: Kredi
ects: AKTS
+ group: Grup
name: Adı
type: Türü
add: Ekle
@@ -30,10 +31,11 @@ tr:
errors:
already_enrolled_at_group: Ders grubundan seçilebilecek maksimum AKTS miktarı kadar ders seçilmiş.
empty_selected_courses_list: Seçilen dersler listesi boş.
- quota_full: Ders için belirlenen kontenjan dolmuş.
+ group_quota_full: Ders grubu için belirlenen kontenjan dolmuş.
must_drop_first: Öncelikli olarak en üst dönemden alınan dersler çıkarılmalı.
not_enough_ects: Seçilebilecek AKTS miktarı bu dersi alabilmeniz için yeterli değil.
not_proper_register_event_range: Tarih aralığı bugünü kapsayan çevrimiçi ders kayıtlanma aktivitesi bulunmamaktadır.
+ quota_full: Ders için belirlenen kontenjan dolmuş.
registration_completed: Ders seçimini tamamladığınız için bu işlemi gerçekleştiremezsiniz.
index:
course_enrollments: Ders Kayıtları
@@ -47,6 +49,7 @@ tr:
year: Yıl
new:
available_courses: Açılan Dersler
+ courses_with_full_quota: Seçilen dersler listenizde kotası dolmuş dersler bulunmaktadır. Lütfen kırmızı butonla belirtilen dersi/dersleri listenizden çıkarınız.
save_enrollments: Seçimleri Kaydet
selectable_ects: Seçilebilecek AKTS
selected_courses: Seçilen Dersler
diff --git a/config/locales/defaults/en.yml b/config/locales/defaults/en.yml
index 6a3f8b8f7..19abc7479 100644
--- a/config/locales/defaults/en.yml
+++ b/config/locales/defaults/en.yml
@@ -11,6 +11,7 @@ en:
actions: Actions
active: Active
are_you_sure: Are you sure?
+ toggle_auto_refresh: Toggle Automatic Refresh
created_at: Created At
detailed_search: Detailed Search
home_nav: Home
@@ -18,6 +19,7 @@ en:
loading: Loading... Please wait.
passive: Passive
preview: Preview
+ refresh: Refresh
reset: Reset
save: Save
search: Search
diff --git a/config/locales/defaults/tr.yml b/config/locales/defaults/tr.yml
index de4ae4384..e811ecc1f 100644
--- a/config/locales/defaults/tr.yml
+++ b/config/locales/defaults/tr.yml
@@ -11,6 +11,7 @@ tr:
actions: İşlemler
active: Aktif
are_you_sure: Emin misiniz?
+ toggle_auto_refresh: Otomatik Yenilemeyi Aç / Kapat
created_at: Oluşturulma Tarihi
detailed_search: Detaylı Arama
home_nav: Anasayfa
@@ -18,6 +19,7 @@ tr:
loading: Yükleniyor... Lütfen bekleyiniz.
passive: Pasif
preview: Ön İzleme
+ refresh: Yenile
reset: Sıfırla
save: Kaydet
search: Arama Yap
diff --git a/config/locales/layouts/mailer/en.yml b/config/locales/layouts/mailer/en.yml
index 06ed8aa3d..d04acff92 100644
--- a/config/locales/layouts/mailer/en.yml
+++ b/config/locales/layouts/mailer/en.yml
@@ -1,4 +1,4 @@
en:
layouts:
mailer:
- title: Nokul - University Otomation
+ title: Nokul - University Automation System
diff --git a/config/locales/layouts/shared/meta_en.yml b/config/locales/layouts/shared/meta.en.yml
similarity index 76%
rename from config/locales/layouts/shared/meta_en.yml
rename to config/locales/layouts/shared/meta.en.yml
index 8344be1cb..b7917e00b 100644
--- a/config/locales/layouts/shared/meta_en.yml
+++ b/config/locales/layouts/shared/meta.en.yml
@@ -4,4 +4,4 @@ en:
meta:
author: OMU - BAUM
description: Nokul, is a complete web application and automation for universities and students.
- title: Nokul - University Otomation
+ title: Nokul - University Automation System
diff --git a/config/locales/layouts/shared/meta_tr.yml b/config/locales/layouts/shared/meta.tr.yml
similarity index 100%
rename from config/locales/layouts/shared/meta_tr.yml
rename to config/locales/layouts/shared/meta.tr.yml
diff --git a/config/locales/layouts/shared/sidebar_en.yml b/config/locales/layouts/shared/sidebar.en.yml
similarity index 85%
rename from config/locales/layouts/shared/sidebar_en.yml
rename to config/locales/layouts/shared/sidebar.en.yml
index 2b3e9c9e2..f6be591c5 100644
--- a/config/locales/layouts/shared/sidebar_en.yml
+++ b/config/locales/layouts/shared/sidebar.en.yml
@@ -12,21 +12,24 @@ en:
calendars: Calendars
committee_units: Committee Units
committees: Committees
- courses: Courses
+ course_enrollments: Course Enrollments
course_groups: Course Unit Group
course_management: Course Management
- course_enrollments: Course Enrolments
course_unit_groups: Course Unit Group
+ courses: Courses
curriculums: Curriculums
+ detsis: DETSIS
first_registration: First Registration
high_school_types: High School Types
- ldap_sync: Ldap Sync
+ ldap: LDAP
+ manager:
+ stats: University Stats
+ title: Manager Pages
meksis: MEKSIS
prospective_employees: Prospective Employees
prospective_students: Prospective Students
references: References
registration_documents: Registration Documents
- studies: Academic Studies
units: Units
users: Users
yoksis: YOKSIS
diff --git a/config/locales/layouts/shared/sidebar_tr.yml b/config/locales/layouts/shared/sidebar.tr.yml
similarity index 87%
rename from config/locales/layouts/shared/sidebar_tr.yml
rename to config/locales/layouts/shared/sidebar.tr.yml
index 579474763..e93230d52 100644
--- a/config/locales/layouts/shared/sidebar_tr.yml
+++ b/config/locales/layouts/shared/sidebar.tr.yml
@@ -12,21 +12,24 @@ tr:
calendars: Takvimler
committee_units: Kurul ve Komisyonlar
committees: Kurullar/Komisyonlar
+ course_enrollments: Ders Kayıtları
course_groups: Ders Grupları
course_management: Ders İşlemleri
- course_enrollments: Ders Kayıtları
course_unit_groups: Ders Grupları
courses: Dersler
curriculums: Müfredatlar
+ detsis: DETSİS
first_registration: İlk Kayıt
high_school_types: Lise Türleri
- ldap_sync: Ldap Sync
+ ldap: LDAP
+ manager:
+ stats: Üniversite İstatistikleri
+ title: Yönetici Sayfaları
meksis: MEKSİS
prospective_employees: Aday Personeller
prospective_students: Aday Öğrenciler
references: Tanımlar
registration_documents: İstenen Belgeler
- studies: Akademik Çalışmalar
units: Birimler
users: Kullanıcılar
yoksis: YÖKSİS
diff --git a/config/locales/models/studies/en.yml b/config/locales/models/studies/en.yml
deleted file mode 100644
index 8148c047c..000000000
--- a/config/locales/models/studies/en.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-en:
- studies:
- articles:
- index:
- article: Article
- number_of_articles_by_years: Number of Articles by Years
- publications_by_index_types: Publications by Index Types
- publications_by_language: Publications by Publication Language
- publications_by_number_of_authors: Publications by Number of Authors
- publications_by_publication_types: Publications by Publication Types
- recently_added: Recently Added Articles
- top_publishers: Top Publishing Academics
- dashboard:
- index:
- articles: Articles
- certifications: Certifications
- projects: Projects
diff --git a/config/locales/models/studies/tr.yml b/config/locales/models/studies/tr.yml
deleted file mode 100644
index bed83b445..000000000
--- a/config/locales/models/studies/tr.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-tr:
- studies:
- articles:
- index:
- article: Makale
- number_of_articles_by_years: Yıllara Göre Makale Sayısı
- publications_by_index_types: Index Türüne Göre Makaleler
- publications_by_language: Yayın Dili Göre Makaleler
- publications_by_number_of_authors: Yazar Sayısına Göre Makaleler
- publications_by_publication_types: Yayın Türüne Göre Makaleler
- recently_added: En Son Eklenen Makaleler
- top_publishers: En Çok Makalesi Olanlar
- dashboard:
- index:
- articles: Makaleler
- certifications: Sertifikalar
- projects: Projeler
diff --git a/config/routes.rb b/config/routes.rb
index 7b0e1381f..7ec30fd3d 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -17,11 +17,13 @@
draw :course_management
draw :first_registration
draw :location
+ draw :manager
+ draw :meksis
draw :patron
draw :reference
draw :studentship
draw :yoksis
- draw :meksis
+ draw :detsis
resources :units do
member do
@@ -37,13 +39,6 @@
get 'save_identity_from_mernis', on: :member
end
- scope module: :studies do
- get '/studies', to: 'dashboard#index'
- get '/studies/articles', to: 'articles#index'
- get '/studies/projects', to: 'projects#index'
- get '/studies/certifications', to: 'certifications#index'
- end
-
resources :agenda_types, except: :show, module: :committee
resources :committees, only: :index, controller: 'committee/dashboard' do
diff --git a/config/routes/detsis.rb b/config/routes/detsis.rb
new file mode 100644
index 000000000..a11c2484a
--- /dev/null
+++ b/config/routes/detsis.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+namespace :detsis do
+ get '/', to: 'dashboard#index'
+
+ resources :sdp_codes, only: %i[index]
+end
diff --git a/config/routes/manager.rb b/config/routes/manager.rb
new file mode 100644
index 000000000..d3a41b1fa
--- /dev/null
+++ b/config/routes/manager.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+namespace :manager do
+ get :stats, to: 'dashboard#stats'
+
+ scope module: :stats do
+ get 'articles', to: 'articles#index'
+ namespace :employees do
+ get '/', action: :index
+ get :academic
+ end
+ namespace :students do
+ get '/', action: :index
+ get :cities
+ get :double_major_and_minor
+ get :genders
+ get :genders_and_degrees
+ get :non_graduates
+ end
+ end
+end
diff --git a/db/migrate/20200122124332_create_sdp_codes.rb b/db/migrate/20200122124332_create_sdp_codes.rb
new file mode 100644
index 000000000..37bc7a85d
--- /dev/null
+++ b/db/migrate/20200122124332_create_sdp_codes.rb
@@ -0,0 +1,28 @@
+class CreateSdpCodes < ActiveRecord::Migration[6.0]
+ def change
+ create_table :sdp_codes do |t|
+ t.integer :main
+ t.integer :first
+ t.integer :second
+ t.integer :third
+ t.string :name
+
+ t.timestamps
+ end
+
+ add_presence_constraint :sdp_codes, :name
+
+ add_null_constraint :sdp_codes, :main
+ add_null_constraint :sdp_codes, :first
+ add_null_constraint :sdp_codes, :second
+ add_null_constraint :sdp_codes, :third
+ add_null_constraint :sdp_codes, :name
+
+ add_numericality_constraint :sdp_codes, :main, greater_than_or_equal_to: 0
+ add_numericality_constraint :sdp_codes, :first, greater_than_or_equal_to: 0
+ add_numericality_constraint :sdp_codes, :second, greater_than_or_equal_to: 0
+ add_numericality_constraint :sdp_codes, :third, greater_than_or_equal_to: 0
+
+ add_length_constraint :sdp_codes, :name, less_than_or_equal_to: 255
+ end
+end
diff --git a/db/migrate/20200123164837_available_course_group_reference_to_course_enrollments.rb b/db/migrate/20200123164837_available_course_group_reference_to_course_enrollments.rb
new file mode 100644
index 000000000..74d38112b
--- /dev/null
+++ b/db/migrate/20200123164837_available_course_group_reference_to_course_enrollments.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AvailableCourseGroupReferenceToCourseEnrollments < ActiveRecord::Migration[6.0]
+ def change
+ add_reference :course_enrollments, :available_course_group, foreign_key: true
+ end
+end
diff --git a/db/structure.sql b/db/structure.sql
index c3461ba29..249caecf5 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -1247,6 +1247,7 @@ CREATE TABLE public.course_enrollments (
created_at timestamp(6) without time zone NOT NULL,
updated_at timestamp(6) without time zone NOT NULL,
semester_registration_id bigint,
+ available_course_group_id bigint,
CONSTRAINT course_enrollments_status_numericality CHECK ((status >= 0))
);
@@ -2855,6 +2856,52 @@ CREATE SEQUENCE public.scope_assignments_id_seq
ALTER SEQUENCE public.scope_assignments_id_seq OWNED BY public.scope_assignments.id;
+--
+-- Name: sdp_codes; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE public.sdp_codes (
+ id bigint NOT NULL,
+ main integer,
+ first integer,
+ second integer,
+ third integer,
+ name character varying,
+ created_at timestamp(6) without time zone NOT NULL,
+ updated_at timestamp(6) without time zone NOT NULL,
+ CONSTRAINT sdp_codes_first_null CHECK ((first IS NOT NULL)),
+ CONSTRAINT sdp_codes_first_numericality CHECK ((first >= 0)),
+ CONSTRAINT sdp_codes_main_null CHECK ((main IS NOT NULL)),
+ CONSTRAINT sdp_codes_main_numericality CHECK ((main >= 0)),
+ CONSTRAINT sdp_codes_name_length CHECK ((length((name)::text) <= 255)),
+ CONSTRAINT sdp_codes_name_null CHECK ((name IS NOT NULL)),
+ CONSTRAINT sdp_codes_name_presence CHECK (((name IS NOT NULL) AND ((name)::text !~ '^\s*$'::text))),
+ CONSTRAINT sdp_codes_second_null CHECK ((second IS NOT NULL)),
+ CONSTRAINT sdp_codes_second_numericality CHECK ((second >= 0)),
+ CONSTRAINT sdp_codes_third_null CHECK ((third IS NOT NULL)),
+ CONSTRAINT sdp_codes_third_numericality CHECK ((third >= 0))
+);
+
+
+--
+-- Name: sdp_codes_id_seq; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE public.sdp_codes_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+--
+-- Name: sdp_codes_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
+--
+
+ALTER SEQUENCE public.sdp_codes_id_seq OWNED BY public.sdp_codes.id;
+
+
--
-- Name: semester_registrations; Type: TABLE; Schema: public; Owner: -
--
@@ -4077,6 +4124,13 @@ ALTER TABLE ONLY public.roles ALTER COLUMN id SET DEFAULT nextval('public.roles_
ALTER TABLE ONLY public.scope_assignments ALTER COLUMN id SET DEFAULT nextval('public.scope_assignments_id_seq'::regclass);
+--
+-- Name: sdp_codes id; Type: DEFAULT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY public.sdp_codes ALTER COLUMN id SET DEFAULT nextval('public.sdp_codes_id_seq'::regclass);
+
+
--
-- Name: semester_registrations id; Type: DEFAULT; Schema: public; Owner: -
--
@@ -4881,6 +4935,14 @@ ALTER TABLE ONLY public.scope_assignments
ADD CONSTRAINT scope_assignments_pkey PRIMARY KEY (id);
+--
+-- Name: sdp_codes sdp_codes_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY public.sdp_codes
+ ADD CONSTRAINT sdp_codes_pkey PRIMARY KEY (id);
+
+
--
-- Name: semester_registrations semester_registrations_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
@@ -5517,6 +5579,13 @@ CREATE INDEX index_course_assessment_methods_on_assessment_method_id ON public.c
CREATE INDEX index_course_assessment_methods_on_course_evaluation_type_id ON public.course_assessment_methods USING btree (course_evaluation_type_id);
+--
+-- Name: index_course_enrollments_on_available_course_group_id; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX index_course_enrollments_on_available_course_group_id ON public.course_enrollments USING btree (available_course_group_id);
+
+
--
-- Name: index_course_enrollments_on_available_course_id; Type: INDEX; Schema: public; Owner: -
--
@@ -6180,6 +6249,14 @@ ALTER TABLE ONLY public.curriculum_semesters
ADD CONSTRAINT fk_rails_32e14f7893 FOREIGN KEY (curriculum_id) REFERENCES public.curriculums(id);
+--
+-- Name: course_enrollments fk_rails_32f6a8ca4e; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY public.course_enrollments
+ ADD CONSTRAINT fk_rails_32f6a8ca4e FOREIGN KEY (available_course_group_id) REFERENCES public.available_course_groups(id);
+
+
--
-- Name: curriculum_programs fk_rails_33195b0adb; Type: FK CONSTRAINT; Schema: public; Owner: -
--
@@ -6983,6 +7060,8 @@ INSERT INTO "schema_migrations" (version) VALUES
('20191127055945'),
('20191226074849'),
('20200102083531'),
-('20200102083736');
+('20200102083736'),
+('20200122124332'),
+('20200123164837');
diff --git a/lib/tasks/fetch/sdp_code_references.rake b/lib/tasks/fetch/sdp_code_references.rake
new file mode 100644
index 000000000..d0f7a15bf
--- /dev/null
+++ b/lib/tasks/fetch/sdp_code_references.rake
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+namespace :fetch do
+ desc 'Fetch SDP code references from Detsis'
+ task sdp_code_references: :environment do
+ sdp_codes = Xokul::Detsis.sdp_code_references
+ progress_bar = ProgressBar.spawn 'Detsis - SDP code references', sdp_codes.size
+
+ sdp_codes.each do |code|
+ record = SdpCode.find_or_initialize_by(**code)
+ record.assign_attributes(**code)
+ record.save
+
+ progress_bar&.increment
+ end
+ end
+end
diff --git a/package.json b/package.json
index 477646017..54df6b22f 100644
--- a/package.json
+++ b/package.json
@@ -9,15 +9,19 @@
"@rails/ujs": "^6.0.1",
"@rails/webpacker": "4.2.2",
"chalk": "^3.0.0",
+ "echarts": "^4.5.0",
"flatpickr": "^4.6.3",
+ "highcharts": "^7.2.1",
"intl-tel-input": "^16.0.8",
"jquery.maskedinput": "^1.4.1",
"select2": "^4.0.12",
+ "stimulus": "^1.1.1",
"toastr": "^2.1.4",
"trix": "^1.2.2",
"turbolinks": "^5.2.0"
},
"devDependencies": {
+ "babel-eslint": "^10.0.3",
"eslint": "^6.7.2",
"eslint-config-standard": "^14.1.0",
"eslint-plugin-import": "^2.16.0",
@@ -25,11 +29,11 @@
"eslint-plugin-promise": "^4.0.1",
"eslint-plugin-standard": "^4.0.0",
"htmlhint": "^0.11.0",
- "markdownlint-cli": "^0.19.0",
+ "markdownlint-cli": "^0.21.0",
"webpack-dev-server": "^3.9.0"
},
"scripts": {
- "lint": "eslint ./app/assets --color",
- "lint-fix": "eslint ./app/assets --color --fix"
+ "lint": "eslint ./app/assets ./app/javascript --color",
+ "lint-fix": "eslint ./app/assets ./app/javascript --color --fix"
}
}
diff --git a/test/controllers/detsis/dashboard_controller_test.rb b/test/controllers/detsis/dashboard_controller_test.rb
new file mode 100644
index 000000000..b8be901dd
--- /dev/null
+++ b/test/controllers/detsis/dashboard_controller_test.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+require 'test_helper'
+
+module Detsis
+ class DashboardControllerTest < ActionDispatch::IntegrationTest
+ setup do
+ sign_in users(:john)
+ end
+
+ test 'should get index' do
+ get detsis_path
+
+ assert_response :success
+ assert_equal 'index', @controller.action_name
+ end
+ end
+end
diff --git a/test/controllers/detsis/sdp_codes_controller_test.rb b/test/controllers/detsis/sdp_codes_controller_test.rb
new file mode 100644
index 000000000..98931c9b0
--- /dev/null
+++ b/test/controllers/detsis/sdp_codes_controller_test.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+require 'test_helper'
+
+module Detsis
+ class SdpCodesControllerTest < ActionDispatch::IntegrationTest
+ setup do
+ sign_in users(:john)
+ end
+
+ test 'should get index' do
+ get detsis_sdp_codes_path
+
+ assert_response :success
+ assert_equal 'index', @controller.action_name
+ assert_select '#collapseSearch', t('smart_search')
+ end
+ end
+end
diff --git a/test/controllers/studentship/course_enrollments_controller_test.rb b/test/controllers/studentship/course_enrollments_controller_test.rb
index 2ad98c64a..cb2c2fabe 100644
--- a/test/controllers/studentship/course_enrollments_controller_test.rb
+++ b/test/controllers/studentship/course_enrollments_controller_test.rb
@@ -22,7 +22,10 @@ class CourseEnrollmentsControllerTest < ActionDispatch::IntegrationTest
test 'should create course_enrollment' do
assert_difference('CourseEnrollment.count') do
post student_course_enrollments_path(@student), params: {
- course_enrollment: { available_course_id: available_courses(:compulsory_course_2).id }
+ course_enrollment: {
+ available_course_id: available_courses(:compulsory_course_2).id,
+ available_course_group_id: available_course_groups(:compulsory_course_2_group).id
+ }
}
end
@@ -34,6 +37,7 @@ class CourseEnrollmentsControllerTest < ActionDispatch::IntegrationTest
end
test 'should save' do
+ delete student_course_enrollment_path(@student, course_enrollments(:elective))
get save_student_course_enrollments_path(@student)
assert @student.current_registration.saved?
assert_redirected_to list_student_course_enrollments_path
diff --git a/test/fixtures/available_course_groups.yml b/test/fixtures/available_course_groups.yml
index be9cf0a97..e6a9f4d87 100644
--- a/test/fixtures/available_course_groups.yml
+++ b/test/fixtures/available_course_groups.yml
@@ -10,10 +10,18 @@ course_group_to_delete:
available_course: ati_fall_2018_2019
name: Group 3
quota: 100
+old_course_group:
+ available_course: old_course
+ name: Group 1
+ quota: 1
elective_course_group:
available_course: elective_course
name: Group 1
quota: 1
+elective_course_group_2:
+ available_course: elective_course
+ name: Group 2
+ quota: 10
elective_course_2_group:
available_course: elective_course_2
name: Group 1
diff --git a/test/fixtures/available_course_lecturers.yml b/test/fixtures/available_course_lecturers.yml
index 7c2928fa5..6418876bf 100644
--- a/test/fixtures/available_course_lecturers.yml
+++ b/test/fixtures/available_course_lecturers.yml
@@ -6,3 +6,27 @@ ati_group_1_lecturer_serhat:
group: ati_group_1
lecturer: serhat_active
coordinator: false
+elective_course_group_lecturer:
+ group: elective_course_group
+ lecturer: serhat_active
+ coordinator: true
+elective_course_group_2_lecturer:
+ group: elective_course_group_2
+ lecturer: serhat_active
+ coordinator: true
+elective_course_2_group_lecturer:
+ group: elective_course_2_group
+ lecturer: serhat_active
+ coordinator: true
+elective_course_2_group_lecturer:
+ group: elective_course_group
+ lecturer: serhat_active
+ coordinator: true
+compulsory_course_group_lecturer:
+ group: compulsory_course_group
+ lecturer: serhat_active
+ coordinator: true
+compulsory_course_2_group_lecturer:
+ group: compulsory_course_2_group
+ lecturer: serhat_active
+ coordinator: true
diff --git a/test/fixtures/course_enrollments.yml b/test/fixtures/course_enrollments.yml
index 33b460927..2f451c4f6 100644
--- a/test/fixtures/course_enrollments.yml
+++ b/test/fixtures/course_enrollments.yml
@@ -1,19 +1,23 @@
old:
semester_registration: serhat_first_semester
available_course: test_fall_2018_2019
- status: saved
-elective:
- semester_registration: serhat_third_semester
- available_course: elective_course
+ available_course_group: ati_group_1
status: saved
failed:
semester_registration: serhat_first_semester
available_course: old_course
+ available_course_group: old_course_group
status: saved
+elective:
+ semester_registration: serhat_third_semester
+ available_course: elective_course
+ available_course_group: elective_course_group
compulsory:
semester_registration: serhat_third_semester
available_course: compulsory_course
+ available_course_group: compulsory_course_group
johns_enrollment:
semester_registration: john_third_semester
- available_course: compulsory_course
- status: saved
\ No newline at end of file
+ available_course: elective_course
+ available_course_group: elective_course_group
+ status: saved
diff --git a/test/fixtures/sdp_codes.yml b/test/fixtures/sdp_codes.yml
new file mode 100644
index 000000000..14e735cf2
--- /dev/null
+++ b/test/fixtures/sdp_codes.yml
@@ -0,0 +1,13 @@
+one:
+ main: 10
+ first: 1
+ second: 99
+ third: 5
+ name: GENEL
+
+two:
+ main: 45
+ first: 99
+ second: 0
+ third: 10
+ name: DİĞER
diff --git a/test/fixtures/semester_registrations.yml b/test/fixtures/semester_registrations.yml
index 64cfa78b8..8af49cba5 100644
--- a/test/fixtures/semester_registrations.yml
+++ b/test/fixtures/semester_registrations.yml
@@ -2,6 +2,7 @@ serhat_first_semester:
academic_term: summer_2018_2019
semester: 1
student: serhat
+ status: saved
serhat_third_semester:
academic_term: active_term
semester: 3
@@ -9,4 +10,5 @@ serhat_third_semester:
john_third_semester:
academic_term: active_term
semester: 3
- student: john
\ No newline at end of file
+ student: john
+ status: saved
diff --git a/test/models/available_course_group_test.rb b/test/models/available_course_group_test.rb
index 5374628d8..a65b9192e 100644
--- a/test/models/available_course_group_test.rb
+++ b/test/models/available_course_group_test.rb
@@ -8,6 +8,7 @@ class AvailableCourseGroupTest < ActiveSupport::TestCase
# relations
belongs_to :available_course, counter_cache: :groups_count
+ has_many :course_enrollments, dependent: :destroy
has_many :lecturers, class_name: 'AvailableCourseLecturer',
foreign_key: :group_id,
inverse_of: :group,
@@ -24,4 +25,10 @@ class AvailableCourseGroupTest < ActiveSupport::TestCase
# validations: nested models
validates_presence_of_nested_model :lecturers
+
+ # custom methods
+ test 'quota_full? method' do
+ assert available_course_groups(:elective_course_group).quota_full?
+ assert_not available_course_groups(:elective_course_2_group).quota_full?
+ end
end
diff --git a/test/models/available_course_test.rb b/test/models/available_course_test.rb
index 767913032..3d6fc4047 100644
--- a/test/models/available_course_test.rb
+++ b/test/models/available_course_test.rb
@@ -46,7 +46,13 @@ class AvailableCourseTest < ActiveSupport::TestCase
# custom methods
test 'quota_full? method' do
- assert available_courses(:elective_course).quota_full?
- assert_not available_courses(:compulsory_course).quota_full?
+ assert available_courses(:old_course).quota_full?
+ assert_not available_courses(:elective_course).quota_full?
+ end
+
+ test 'enrollable_groups method' do
+ enrollable_groups = available_courses(:elective_course).enrollable_groups
+ assert_includes enrollable_groups, available_course_groups(:elective_course_group_2)
+ assert_not_includes enrollable_groups, available_course_groups(:elective_course_group)
end
end
diff --git a/test/models/course_enrollment_test.rb b/test/models/course_enrollment_test.rb
index 927f3e497..ab53b6a14 100644
--- a/test/models/course_enrollment_test.rb
+++ b/test/models/course_enrollment_test.rb
@@ -12,6 +12,7 @@ class CourseEnrollmentTest < ActiveSupport::TestCase
# relations
belongs_to :available_course
+ belongs_to :available_course_group
belongs_to :semester_registration
# validations: uniqueness
diff --git a/test/models/sdp_code_test.rb b/test/models/sdp_code_test.rb
new file mode 100644
index 000000000..b22a4d3da
--- /dev/null
+++ b/test/models/sdp_code_test.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+require 'test_helper'
+
+class SdpCodeTest < ActiveSupport::TestCase
+ test 'full_code must return the full of standardized sdp code' do
+ sdp_code_one = sdp_codes(:one)
+ sdp_code_two = sdp_codes(:two)
+
+ assert_equal sdp_code_one.full_code, '010.01.99'
+ assert_equal sdp_code_two.full_code, '045.99.00'
+ end
+end
diff --git a/test/services/student_course_enrollment_service_test.rb b/test/services/student_course_enrollment_service_test.rb
index 452ad47de..6212f8fe9 100644
--- a/test/services/student_course_enrollment_service_test.rb
+++ b/test/services/student_course_enrollment_service_test.rb
@@ -33,7 +33,7 @@ class StudentCourseEnrollmentServiceTest < ActiveSupport::TestCase
test 'enroll method' do
available_course = available_courses(:compulsory_course_2)
- @service.enroll(available_course_id: available_course.id)
+ @service.enroll(available_course_id: available_course.id, available_course_group: available_course.groups.first)
assert_includes @service.course_enrollments.pluck(:available_course_id), available_course.id
end
@@ -43,7 +43,8 @@ class StudentCourseEnrollmentServiceTest < ActiveSupport::TestCase
end
test 'save method' do
- @service.save
+ @service.drop(course_enrollments(:elective))
+ assert @service.save
assert @service.student.current_registration.saved?
end
@@ -75,6 +76,15 @@ class StudentCourseEnrollmentServiceTest < ActiveSupport::TestCase
assert_equal available_course.errors.full_messages.first, translate('must_drop_first')
end
+ test 'savable? method with false return' do
+ assert_not @service.savable?
+ end
+
+ test 'savable? method' do
+ @service.drop(course_enrollments(:elective))
+ assert @service.savable?
+ end
+
private
def translate(key, params = {})
diff --git a/yarn.lock b/yarn.lock
index a49828073..899fa8b15 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -9,6 +9,13 @@
dependencies:
"@babel/highlight" "^7.0.0"
+"@babel/code-frame@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e"
+ integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==
+ dependencies:
+ "@babel/highlight" "^7.8.3"
+
"@babel/core@^7.7.2":
version "7.7.7"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.7.tgz#ee155d2e12300bcc0cff6a8ad46f2af5063803e9"
@@ -39,6 +46,16 @@
lodash "^4.17.13"
source-map "^0.5.0"
+"@babel/generator@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.3.tgz#0e22c005b0a94c1c74eafe19ef78ce53a4d45c03"
+ integrity sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==
+ dependencies:
+ "@babel/types" "^7.8.3"
+ jsesc "^2.5.1"
+ lodash "^4.17.13"
+ source-map "^0.5.0"
+
"@babel/helper-annotate-as-pure@^7.7.4":
version "7.7.4"
resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.4.tgz#bb3faf1e74b74bd547e867e48f551fa6b098b6ce"
@@ -109,6 +126,15 @@
"@babel/template" "^7.7.4"
"@babel/types" "^7.7.4"
+"@babel/helper-function-name@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca"
+ integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==
+ dependencies:
+ "@babel/helper-get-function-arity" "^7.8.3"
+ "@babel/template" "^7.8.3"
+ "@babel/types" "^7.8.3"
+
"@babel/helper-get-function-arity@^7.7.4":
version "7.7.4"
resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz#cb46348d2f8808e632f0ab048172130e636005f0"
@@ -116,6 +142,13 @@
dependencies:
"@babel/types" "^7.7.4"
+"@babel/helper-get-function-arity@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5"
+ integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==
+ dependencies:
+ "@babel/types" "^7.8.3"
+
"@babel/helper-hoist-variables@^7.7.4":
version "7.7.4"
resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.4.tgz#612384e3d823fdfaaf9fce31550fe5d4db0f3d12"
@@ -204,6 +237,13 @@
dependencies:
"@babel/types" "^7.7.4"
+"@babel/helper-split-export-declaration@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9"
+ integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==
+ dependencies:
+ "@babel/types" "^7.8.3"
+
"@babel/helper-wrap-function@^7.7.4":
version "7.7.4"
resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.7.4.tgz#37ab7fed5150e22d9d7266e830072c0cdd8baace"
@@ -232,6 +272,20 @@
esutils "^2.0.2"
js-tokens "^4.0.0"
+"@babel/highlight@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.3.tgz#28f173d04223eaaa59bc1d439a3836e6d1265797"
+ integrity sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==
+ dependencies:
+ chalk "^2.0.0"
+ esutils "^2.0.2"
+ js-tokens "^4.0.0"
+
+"@babel/parser@^7.0.0", "@babel/parser@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.3.tgz#790874091d2001c9be6ec426c2eed47bc7679081"
+ integrity sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==
+
"@babel/parser@^7.7.4", "@babel/parser@^7.7.7":
version "7.7.7"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.7.tgz#1b886595419cf92d811316d5b715a53ff38b4937"
@@ -663,6 +717,30 @@
"@babel/parser" "^7.7.4"
"@babel/types" "^7.7.4"
+"@babel/template@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.3.tgz#e02ad04fe262a657809327f578056ca15fd4d1b8"
+ integrity sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==
+ dependencies:
+ "@babel/code-frame" "^7.8.3"
+ "@babel/parser" "^7.8.3"
+ "@babel/types" "^7.8.3"
+
+"@babel/traverse@^7.0.0":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.3.tgz#a826215b011c9b4f73f3a893afbc05151358bf9a"
+ integrity sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==
+ dependencies:
+ "@babel/code-frame" "^7.8.3"
+ "@babel/generator" "^7.8.3"
+ "@babel/helper-function-name" "^7.8.3"
+ "@babel/helper-split-export-declaration" "^7.8.3"
+ "@babel/parser" "^7.8.3"
+ "@babel/types" "^7.8.3"
+ debug "^4.1.0"
+ globals "^11.1.0"
+ lodash "^4.17.13"
+
"@babel/traverse@^7.7.4":
version "7.7.4"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.4.tgz#9c1e7c60fb679fe4fcfaa42500833333c2058558"
@@ -678,6 +756,15 @@
globals "^11.1.0"
lodash "^4.17.13"
+"@babel/types@^7.0.0", "@babel/types@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c"
+ integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==
+ dependencies:
+ esutils "^2.0.2"
+ lodash "^4.17.13"
+ to-fast-properties "^2.0.0"
+
"@babel/types@^7.7.4":
version "7.7.4"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193"
@@ -806,6 +893,30 @@
webpack-cli "^3.3.10"
webpack-sources "^1.4.3"
+"@stimulus/core@^1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@stimulus/core/-/core-1.1.1.tgz#42b0cfe5b73ca492f41de64b77a03980bae92c82"
+ integrity sha512-PVJv7IpuQx0MVPCBblXc6O2zbCmU8dlxXNH4bC9KK6LsvGaE+PCXXrXQfXUwAsse1/CmRu/iQG7Ov58himjiGg==
+ dependencies:
+ "@stimulus/mutation-observers" "^1.1.1"
+
+"@stimulus/multimap@^1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@stimulus/multimap/-/multimap-1.1.1.tgz#b95e3fd607345ab36e5d5b55486ee1a12d56b331"
+ integrity sha512-26R1fI3a8uUj0WlMmta4qcfIQGlagegdP4PTz6lz852q/dXlG6r+uPS/bx+H8GtfyS+OOXVr3SkZ0Zg0iRqRfQ==
+
+"@stimulus/mutation-observers@^1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@stimulus/mutation-observers/-/mutation-observers-1.1.1.tgz#0f6c6f081308427fed2a26360dda0c173b79cfc0"
+ integrity sha512-/zCnnw1KJlWO2mrx0yxYaRFZWMGnDMdOgSnI4hxDLxdWVuL2HMROU8FpHWVBLjKY3T9A+lGkcrmPGDHF3pfS9w==
+ dependencies:
+ "@stimulus/multimap" "^1.1.1"
+
+"@stimulus/webpack-helpers@^1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@stimulus/webpack-helpers/-/webpack-helpers-1.1.1.tgz#eff60cd4e58b921d1a2764dc5215f5141510f2c2"
+ integrity sha512-XOkqSw53N9072FLHvpLM25PIwy+ndkSSbnTtjKuyzsv8K5yfkFB2rv68jU1pzqYa9FZLcvZWP4yazC0V38dx9A==
+
"@types/color-name@^1.1.1":
version "1.1.1"
resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
@@ -1047,17 +1158,7 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1:
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da"
integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==
-ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2:
- version "6.10.2"
- resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52"
- integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==
- dependencies:
- fast-deep-equal "^2.0.1"
- fast-json-stable-stringify "^2.0.0"
- json-schema-traverse "^0.4.1"
- uri-js "^4.2.2"
-
-ajv@^6.5.5:
+ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5:
version "6.11.0"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.11.0.tgz#c3607cbc8ae392d8a5a536f25b21f8e5f3f87fe9"
integrity sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==
@@ -1327,6 +1428,18 @@ aws4@^1.8.0:
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e"
integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==
+babel-eslint@^10.0.3:
+ version "10.0.3"
+ resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.3.tgz#81a2c669be0f205e19462fed2482d33e4687a88a"
+ integrity sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ "@babel/parser" "^7.0.0"
+ "@babel/traverse" "^7.0.0"
+ "@babel/types" "^7.0.0"
+ eslint-visitor-keys "^1.0.0"
+ resolve "^1.12.0"
+
babel-loader@^8.0.6:
version "8.0.6"
resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb"
@@ -1548,14 +1661,14 @@ browserify-zlib@^0.2.0:
dependencies:
pako "~1.0.5"
-browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.6.4, browserslist@^4.8.0, browserslist@^4.8.2:
- version "4.8.2"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.2.tgz#b45720ad5fbc8713b7253c20766f701c9a694289"
- integrity sha512-+M4oeaTplPm/f1pXDw84YohEv7B1i/2Aisei8s4s6k3QsoSHa7i5sz8u/cGQkkatCPxMASKxPualR4wwYgVboA==
+browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.6.4, browserslist@^4.8.0, browserslist@^4.8.3:
+ version "4.8.5"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.5.tgz#691af4e327ac877b25e7a3f7ee869c4ef36cdea3"
+ integrity sha512-4LMHuicxkabIB+n9874jZX/az1IaZ5a+EUuvD7KFOu9x/Bd5YHyO0DIz2ls/Kl8g0ItS4X/ilEgf4T1Br0lgSg==
dependencies:
- caniuse-lite "^1.0.30001015"
- electron-to-chromium "^1.3.322"
- node-releases "^1.1.42"
+ caniuse-lite "^1.0.30001022"
+ electron-to-chromium "^1.3.338"
+ node-releases "^1.1.46"
buffer-from@^1.0.0:
version "1.1.1"
@@ -1713,11 +1826,16 @@ caniuse-api@^3.0.0:
lodash.memoize "^4.1.2"
lodash.uniq "^4.5.0"
-caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001012, caniuse-lite@^1.0.30001015:
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001012:
version "1.0.30001016"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001016.tgz#16ea48d7d6e8caf3cad3295c2d746fe38c4e7f66"
integrity sha512-yYQ2QfotceRiH4U+h1Us86WJXtVHDmy3nEKIdYPsZCYnOV5/tMgGbmoIlrMzmh2VXlproqYtVaKeGDBkMZifFA==
+caniuse-lite@^1.0.30001022:
+ version "1.0.30001023"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001023.tgz#b82155827f3f5009077bdd2df3d8968bcbcc6fc4"
+ integrity sha512-C5TDMiYG11EOhVOA62W1p3UsJ2z4DsHtMBQtjzp3ZsUglcQn62WOUgW0y795c7A5uZ+GCEIvzkMatLIlAsbNTA==
+
case-sensitive-paths-webpack-plugin@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.2.0.tgz#3371ef6365ef9c25fa4b81c16ace0e9c7dc58c3e"
@@ -2126,11 +2244,11 @@ copy-descriptor@^0.1.0:
integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
core-js-compat@^3.6.0:
- version "3.6.0"
- resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.0.tgz#4eb6cb69d03d99159ed7c860cd5fcf7d23a62ea9"
- integrity sha512-Z3eCNjGgoYluH89Jt4wVkfYsc/VdLrA2/woX5lm0isO/pCT+P+Y+o65bOuEnjDJLthdwTBxbCVzptTXtc18fJg==
+ version "3.6.4"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17"
+ integrity sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==
dependencies:
- browserslist "^4.8.2"
+ browserslist "^4.8.3"
semver "7.0.0"
core-js@^3.1.4, core-js@^3.3.4, core-js@^3.4.0:
@@ -2446,7 +2564,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9:
dependencies:
ms "2.0.0"
-debug@^3.0.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6:
+debug@^3.0.0, debug@^3.1.1, debug@^3.2.5:
version "3.2.6"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
@@ -2580,11 +2698,6 @@ detect-file@^1.0.0:
resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=
-detect-libc@^1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
- integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
-
detect-node@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c"
@@ -2705,15 +2818,22 @@ ecc-jsbn@~0.1.1:
jsbn "~0.1.0"
safer-buffer "^2.1.0"
+echarts@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/echarts/-/echarts-4.5.0.tgz#2111960645a345eb819ddac4792a2c065bdff162"
+ integrity sha512-q9M0errodeX/786uPifro76x0elbrUQkbSHh235QzbkaASuvP9AQoMErhGBno4iC/yq6kFDLqgmm3XCPWQGLzA==
+ dependencies:
+ zrender "4.1.2"
+
ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
-electron-to-chromium@^1.3.322:
- version "1.3.322"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.322.tgz#a6f7e1c79025c2b05838e8e344f6e89eb83213a8"
- integrity sha512-Tc8JQEfGQ1MzfSzI/bTlSr7btJv/FFO7Yh6tanqVmIWOuNCu6/D1MilIEgLtmWqIrsv+o4IjpLAhgMBr/ncNAA==
+electron-to-chromium@^1.3.338:
+ version "1.3.340"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.340.tgz#5d4fe78e984d4211194cf5a52e08069543da146f"
+ integrity sha512-hRFBAglhcj5iVYH+o8QU0+XId1WGoc0VGowJB1cuJAt3exHGrivZvWeAO5BRgBZqwZtwxjm8a5MQeGoT/Su3ww==
elliptic@^6.0.0:
version "6.5.2"
@@ -2847,9 +2967,9 @@ eslint-import-resolver-node@^0.3.2:
resolve "^1.13.1"
eslint-module-utils@^2.4.1:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.5.0.tgz#cdf0b40d623032274ccd2abd7e64c4e524d6e19c"
- integrity sha512-kCo8pZaNz2dsAW7nCUjuVoI11EBXXpIzfNxmaoLhXoRDOnqXLC4iSGVRdZPhOitfbdEfMEfKOiENaK6wDPZEGw==
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz#7878f7504824e1b857dd2505b59a8e5eda26a708"
+ integrity sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q==
dependencies:
debug "^2.6.9"
pkg-dir "^2.0.0"
@@ -2925,7 +3045,7 @@ eslint-utils@^1.4.2, eslint-utils@^1.4.3:
dependencies:
eslint-visitor-keys "^1.1.0"
-eslint-visitor-keys@^1.1.0:
+eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2"
integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==
@@ -3168,11 +3288,6 @@ extsprintf@^1.2.0:
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
-fast-deep-equal@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
- integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=
-
fast-deep-equal@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4"
@@ -3410,13 +3525,6 @@ from2@^2.1.0:
inherits "^2.0.1"
readable-stream "^2.0.0"
-fs-minipass@^1.2.5:
- version "1.2.7"
- resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
- integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==
- dependencies:
- minipass "^2.6.0"
-
fs-minipass@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.0.0.tgz#a6415edab02fae4b9e9230bc87ee2e4472003cd1"
@@ -3446,7 +3554,6 @@ fsevents@^1.2.7:
dependencies:
bindings "^1.5.0"
nan "^2.12.1"
- node-pre-gyp "*"
fstream@^1.0.0, fstream@^1.0.12:
version "1.0.12"
@@ -3764,6 +3871,11 @@ hex-color-regex@^1.1.0:
resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==
+highcharts@^7.2.1:
+ version "7.2.1"
+ resolved "https://registry.yarnpkg.com/highcharts/-/highcharts-7.2.1.tgz#313c434bbfd4525a72b76c6bfbd9c39dfe2d1993"
+ integrity sha512-/fSUZiONmM+x49IQJNf8XwZGiNGOPRmxEOcd0xdJP9Xc3OlG46ZiUWgSLfhYQ9Oyhmzc3V3SKYCLud8+rKLi+w==
+
hmac-drbg@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
@@ -3919,7 +4031,7 @@ https-browserify@^1.0.0:
resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
-iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4:
+iconv-lite@0.4.24, iconv-lite@^0.4.24:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
@@ -3943,19 +4055,12 @@ iferr@^0.1.5:
resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE=
-ignore-walk@^3.0.1:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37"
- integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==
- dependencies:
- minimatch "^3.0.4"
-
ignore@^4.0.6:
version "4.0.6"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
-ignore@^5.1.1:
+ignore@^5.1.1, ignore@~5.1.4:
version "5.1.4"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf"
integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==
@@ -4483,7 +4588,7 @@ js-levenshtein@^1.1.3:
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
-js-yaml@^3.13.1:
+js-yaml@^3.13.1, js-yaml@~3.13.1:
version "3.13.1"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
@@ -4564,6 +4669,11 @@ json5@^2.1.0:
dependencies:
minimist "^1.2.0"
+jsonc-parser@~2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-2.2.0.tgz#f206f87f9d49d644b7502052c04e82dd6392e9ef"
+ integrity sha512-4fLQxW1j/5fWj6p78vAlAafoCKtuBm6ghv+Ij5W2DrDx0qE+ZdEl2c6Ko1mgJNF5ftX1iEWQQ4Ap7+3GlhjkOA==
+
jsprim@^1.2.2:
version "1.4.1"
resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
@@ -4848,32 +4958,34 @@ markdown-it@10.0.0:
mdurl "^1.0.1"
uc.micro "^1.0.5"
-markdownlint-cli@^0.19.0:
- version "0.19.0"
- resolved "https://registry.yarnpkg.com/markdownlint-cli/-/markdownlint-cli-0.19.0.tgz#70ccd7334d667c94b3259b5dfc1978cf2199a6fd"
- integrity sha512-5hUEBAmbCVJflws6841HJ0KTZdgGWYaPThoXPI6Wjn1VkoiYWsprNH0r3PvPmyGXtvbHJ7/7eGPde2a6cx8t0w==
+markdownlint-cli@^0.21.0:
+ version "0.21.0"
+ resolved "https://registry.yarnpkg.com/markdownlint-cli/-/markdownlint-cli-0.21.0.tgz#d792b157e9de63ce1d6b6e13d7cf83d5e552d5e8"
+ integrity sha512-gvnczz3W3Wgex851/cIQ/2y8GNhY+EVK8Ael8kRd8hoSQ0ps9xjhtwPwMyJPoiYbAoPxG6vSBFISiysaAbCEZg==
dependencies:
commander "~2.9.0"
deep-extend "~0.5.1"
get-stdin "~5.0.1"
glob "~7.1.2"
- js-yaml "^3.13.1"
+ ignore "~5.1.4"
+ js-yaml "~3.13.1"
+ jsonc-parser "~2.2.0"
lodash.differencewith "~4.5.0"
lodash.flatten "~4.4.0"
- markdownlint "~0.17.1"
- markdownlint-rule-helpers "~0.5.0"
+ markdownlint "~0.18.0"
+ markdownlint-rule-helpers "~0.6.0"
minimatch "~3.0.4"
rc "~1.2.7"
-markdownlint-rule-helpers@~0.5.0:
- version "0.5.0"
- resolved "https://registry.yarnpkg.com/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.5.0.tgz#316569329f2341b8066817292a6733ef56571301"
- integrity sha512-6bJAV4TjUoDDnqxfb6EKTuZlpYI6vn4kerid7WTrZaEjsWuYDeYDAN+r4o+vbUYFZfJkiBU7NPBqPd4QJ1CZzQ==
+markdownlint-rule-helpers@~0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.6.0.tgz#3a866a340d394d21d40777b787d3ad84489405c5"
+ integrity sha512-LiZVAbg9/cqkBHtLNNqHV3xuy4Y2L/KuGU6+ZXqCT9NnCdEkIoxeI5/96t+ExquBY0iHy2CVWxPH16nG1RKQVQ==
-markdownlint@~0.17.1:
- version "0.17.2"
- resolved "https://registry.yarnpkg.com/markdownlint/-/markdownlint-0.17.2.tgz#de0ab144fbf314fedadcb8a4ce0db9ea819f91a5"
- integrity sha512-vsxopn0qEdm0P2XI3S9sVA+jvjKjR8lHZ+0FKlusth+1UK9tI29mRFkKeZPERmbWsMehJcogfMieBUkMgNEFkQ==
+markdownlint@~0.18.0:
+ version "0.18.0"
+ resolved "https://registry.yarnpkg.com/markdownlint/-/markdownlint-0.18.0.tgz#906ab9229da4c4be074d0b79de23a69bfa8471d3"
+ integrity sha512-nQAfK9Pbq0ZRoMC/abNGterEnV3kL8MZmi0WHhw8WJKoIbsm3cXGufGsxzCRvjW15cxe74KWcxRSKqwplS26Bw==
dependencies:
markdown-it "10.0.0"
@@ -5069,14 +5181,6 @@ minipass-pipeline@^1.2.2:
dependencies:
minipass "^3.0.0"
-minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0:
- version "2.9.0"
- resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
- integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
- dependencies:
- safe-buffer "^5.1.2"
- yallist "^3.0.0"
-
minipass@^3.0.0, minipass@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5"
@@ -5084,13 +5188,6 @@ minipass@^3.0.0, minipass@^3.1.1:
dependencies:
yallist "^4.0.0"
-minizlib@^1.2.1:
- version "1.3.3"
- resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d"
- integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==
- dependencies:
- minipass "^2.9.0"
-
mississippi@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022"
@@ -5199,15 +5296,6 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
-needle@^2.2.1:
- version "2.4.0"
- resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c"
- integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==
- dependencies:
- debug "^3.2.6"
- iconv-lite "^0.4.4"
- sax "^1.2.4"
-
negotiator@0.6.2:
version "0.6.2"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
@@ -5275,26 +5363,10 @@ node-libs-browser@^2.2.1:
util "^0.11.0"
vm-browserify "^1.0.1"
-node-pre-gyp@*:
- version "0.14.0"
- resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83"
- integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==
- dependencies:
- detect-libc "^1.0.2"
- mkdirp "^0.5.1"
- needle "^2.2.1"
- nopt "^4.0.1"
- npm-packlist "^1.1.6"
- npmlog "^4.0.2"
- rc "^1.2.7"
- rimraf "^2.6.1"
- semver "^5.3.0"
- tar "^4.4.2"
-
-node-releases@^1.1.42:
- version "1.1.45"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.45.tgz#4cf7e9175d71b1317f15ffd68ce63bce1d53e9f2"
- integrity sha512-cXvGSfhITKI8qsV116u2FTzH5EWZJfgG7d4cpqwF8I8+1tWpD6AsvvGRKq2onR0DNj1jfqsjkXZsm14JMS7Cyg==
+node-releases@^1.1.46:
+ version "1.1.47"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.47.tgz#c59ef739a1fd7ecbd9f0b7cf5b7871e8a8b591e4"
+ integrity sha512-k4xjVPx5FpwBUj0Gw7uvFOTF4Ep8Hok1I6qjwL3pLfwe7Y0REQSAqOwwv9TWBCUtMHxcXfY4PgRLRozcChvTcA==
dependencies:
semver "^6.3.0"
@@ -5328,14 +5400,6 @@ node-sass@^4.13.0:
dependencies:
abbrev "1"
-nopt@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
- integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=
- dependencies:
- abbrev "1"
- osenv "^0.1.4"
-
normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
version "2.5.0"
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
@@ -5378,26 +5442,6 @@ normalize-url@^3.0.0:
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559"
integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==
-npm-bundled@^1.0.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b"
- integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==
- dependencies:
- npm-normalize-package-bin "^1.0.1"
-
-npm-normalize-package-bin@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2"
- integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==
-
-npm-packlist@^1.1.6:
- version "1.4.7"
- resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.7.tgz#9e954365a06b80b18111ea900945af4f88ed4848"
- integrity sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ==
- dependencies:
- ignore-walk "^3.0.1"
- npm-bundled "^1.0.1"
-
npm-run-path@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
@@ -5405,7 +5449,7 @@ npm-run-path@^2.0.0:
dependencies:
path-key "^2.0.0"
-"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2:
+"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0:
version "4.1.2"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
@@ -5609,7 +5653,7 @@ os-tmpdir@^1.0.0, os-tmpdir@~1.0.2:
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
-osenv@0, osenv@^0.1.4:
+osenv@0:
version "0.1.5"
resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
@@ -5886,9 +5930,9 @@ pbkdf2@^3.0.3:
sha.js "^2.4.8"
perfect-scrollbar@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/perfect-scrollbar/-/perfect-scrollbar-1.4.0.tgz#5d014ef9775e1f43058a1dbae9ed1daf0e7091f1"
- integrity sha512-/2Sk/khljhdrsamjJYS5NjrH+GKEHEwh7zFSiYyxROyYKagkE4kSn2zDQDRTOMo8mpT2jikxx6yI1dG7lNP/hw==
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/perfect-scrollbar/-/perfect-scrollbar-1.5.0.tgz#821d224ed8ff61990c23f26db63048cdc75b6b83"
+ integrity sha512-NrNHJn5mUGupSiheBTy6x+6SXCFbLlm8fVZh9moIzw/LgqElN5q4ncR4pbCBCYuCJ8Kcl9mYM0NgDxvW+b4LxA==
performance-now@^2.1.0:
version "2.1.0"
@@ -6787,7 +6831,7 @@ raw-body@2.4.0:
iconv-lite "0.4.24"
unpipe "1.0.0"
-rc@^1.2.7, rc@~1.2.7:
+rc@~1.2.7:
version "1.2.8"
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
@@ -7107,7 +7151,7 @@ rgba-regex@^1.0.0:
resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3"
integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=
-rimraf@2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3, rimraf@^2.7.1:
+rimraf@2, rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1:
version "2.7.1"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
@@ -7193,7 +7237,7 @@ sass-loader@7.3.1:
pify "^4.0.1"
semver "^6.3.0"
-sax@^1.2.4, sax@~1.2.4:
+sax@~1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
@@ -7240,7 +7284,7 @@ selfsigned@^1.10.7:
dependencies:
node-forge "0.9.0"
-"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0:
+"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
@@ -7619,6 +7663,14 @@ stdout-stream@^1.4.0:
dependencies:
readable-stream "^2.0.1"
+stimulus@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/stimulus/-/stimulus-1.1.1.tgz#53c2fded6849e7b85eed3ed8dd76e33abd74bec5"
+ integrity sha512-R0mBqKp48YnRDZOxZ8hiOH4Ilph3Yj78CIFTBkCwyHs4iGCpe7xlEdQ7cjIxb+7qVCSxFKgxO+mAQbsNgt/5XQ==
+ dependencies:
+ "@stimulus/core" "^1.1.1"
+ "@stimulus/webpack-helpers" "^1.1.1"
+
stream-browserify@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b"
@@ -7879,19 +7931,6 @@ tar@^2.0.0:
fstream "^1.0.12"
inherits "2"
-tar@^4.4.2:
- version "4.4.13"
- resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525"
- integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==
- dependencies:
- chownr "^1.1.1"
- fs-minipass "^1.2.5"
- minipass "^2.8.6"
- minizlib "^1.2.1"
- mkdirp "^0.5.0"
- safe-buffer "^5.1.2"
- yallist "^3.0.3"
-
terser-webpack-plugin@^1.4.3:
version "1.4.3"
resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c"
@@ -8555,7 +8594,7 @@ yallist@^2.1.2:
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
-yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
+yallist@^3.0.2:
version "3.1.1"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
@@ -8648,3 +8687,8 @@ yargs@^7.0.0:
which-module "^1.0.0"
y18n "^3.2.1"
yargs-parser "^5.0.0"
+
+zrender@4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/zrender/-/zrender-4.1.2.tgz#8368deff24c7e237cbcbd3a2ff93017905ae43f7"
+ integrity sha512-MJYEo1ZOVesjxYsfcGtPXnUREmh4ACMV08QZLGZ3S7D1xOd96iz3O6nf6pv5PHb5NSHkbizr7ChSIgtAGwncvA==