Map
Changes
ModelData/BusinessModel/ClassDiagram1.cd 157(+157 -0)
ModelData/BusinessModel/RDF/Queries.cs 54(+53 -1)
ModelData/BusinessModel/RDF/RDFQuery.cs 16(+15 -1)
ModelData/ModelData.csproj 2(+1 -1)
ModelData/WebModel/WebDataManager.cs 13(+13 -0)
Tools/Word/DocXWrite.cs 35(+30 -5)
web-map/Content/Site.css 19(+2 -17)
web-map/Controllers/MapController.cs 59(+58 -1)
web-map/Scripts/SiteScripts/AjaxQuery.js 66(+58 -8)
web-map/Scripts/SiteScripts/Events.js 238(+209 -29)
web-map/Scripts/SiteScripts/Init.js 100(+53 -47)
web-map/Scripts/SiteScripts/Output.js 171(+141 -30)
web-map/Views/Map/Map.cshtml 84(+72 -12)
web-map/Views/Shared/_Layout.cshtml 8(+7 -1)
web-map/web-map.csproj 1(+1 -0)
Details
diff --git a/ModelData/BusinessModel/BusinessDataManager.cs b/ModelData/BusinessModel/BusinessDataManager.cs
index 8bd7991..3a117f8 100644
--- a/ModelData/BusinessModel/BusinessDataManager.cs
+++ b/ModelData/BusinessModel/BusinessDataManager.cs
@@ -6,6 +6,7 @@ using System.Threading.Tasks;
using ModelData.BusinessModel.RDF;
using ModelData.BusinessModel.MainEntities;
+using ModelData.BusinessModel.ExtraEntities;
using ModelData.BusinessModel.UnitOfWork;
namespace ModelData.BusinessModel
@@ -94,13 +95,41 @@ namespace ModelData.BusinessModel
public (int min, int max) GetYears()
{
var query_result = RDFQuery.GetData(RDFQuery.QueryType.Years, new string[] { });
- string u = query_result[0]["min"].ToString().Split('^')[0];
- string k = query_result[0]["min"].ToString();
return (
min: int.Parse(query_result[0]["min"].ToString().Split('^')[0]),
max: int.Parse(query_result[0]["max"].ToString().Split('^')[0])
);
- }
+ }
+
+ public Region[] AllRegions()
+ {
+ var query_result = RDFQuery.GetData(RDFQuery.QueryType.AllRegions, new string[] { });
+ List<Region> result = new List<Region>();
+ foreach (var elem in query_result)
+ {
+ result.Add(new Region()
+ {
+ URL = elem["region"].ToString().Split('^')[0],
+ Title = elem["regionName"].ToString().Split('^')[0]
+ });
+ }
+ return result.ToArray();
+ }
+
+ public SettlementType[] AllSettlementTypes()
+ {
+ var query_result = RDFQuery.GetData(RDFQuery.QueryType.AllSettlementTypes, new string[] { });
+ List<SettlementType> result = new List<SettlementType>();
+ foreach (var elem in query_result)
+ {
+ result.Add(new SettlementType()
+ {
+ URL = elem["settlementType"].ToString().Split('^')[0],
+ Title = elem["typeName"].ToString().Split('^')[0]
+ });
+ }
+ return result.ToArray();
+ }
#endregion
ModelData/BusinessModel/ClassDiagram1.cd 157(+157 -0)
diff --git a/ModelData/BusinessModel/ClassDiagram1.cd b/ModelData/BusinessModel/ClassDiagram1.cd
new file mode 100644
index 0000000..75b3259
--- /dev/null
+++ b/ModelData/BusinessModel/ClassDiagram1.cd
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ClassDiagram MajorVersion="1" MinorVersion="1">
+ <Class Name="ModelData.BusinessModel.BaseAndInterface.BaseOntologyEntity" Collapsed="true">
+ <Position X="7.25" Y="0.5" Width="1.5" />
+ <TypeIdentifier>
+ <HashCode>EAAAAAAAAAAAAEAAAAAAAAAAACAAAAAAAAAAAAAAAAA=</HashCode>
+ <FileName>BusinessModel\BaseAndInterface\BaseOntologyEntity.cs</FileName>
+ </TypeIdentifier>
+ <Lollipop Position="0.2" />
+ </Class>
+ <Class Name="ModelData.BusinessModel.BusinessDataManager">
+ <Position X="6" Y="5" Width="2" />
+ <TypeIdentifier>
+ <HashCode>AAQEIABAAAAAAQBAAAIAAAAAAABAIAAAAAACACAAhAA=</HashCode>
+ <FileName>BusinessModel\BusinessDataManager.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.ExtraEntities.Founder">
+ <Position X="8.5" Y="1.75" Width="1.5" />
+ <TypeIdentifier>
+ <HashCode>AAAAAAAAAAAAAACAAAAAAAQAACAAAAAAAAAAAAAACAA=</HashCode>
+ <FileName>BusinessModel\ExtraEntities\Founder.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.ExtraEntities.Region">
+ <Position X="13.75" Y="1.75" Width="1.5" />
+ <TypeIdentifier>
+ <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAgAAAAAAAAA=</HashCode>
+ <FileName>BusinessModel\ExtraEntities\Region.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.ExtraEntities.SettlementType">
+ <Position X="0.5" Y="1.75" Width="1.5" />
+ <TypeIdentifier>
+ <HashCode>AAAAAAAAAAAgAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQ=</HashCode>
+ <FileName>BusinessModel\ExtraEntities\SettlementType.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.MainEntities.EditedSettlement">
+ <Position X="2.75" Y="1.75" Width="2.75" />
+ <TypeIdentifier>
+ <HashCode>BAAAAAAAggAAAAAAABAAAAAAACCAAAAAEQACAAAAAAY=</HashCode>
+ <FileName>BusinessModel\MainEntities\EditedSettlement.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.MainEntities.MapPoint">
+ <Position X="6.25" Y="1.75" Width="1.5" />
+ <TypeIdentifier>
+ <HashCode>AAAAAAAAgAAAAAQoAAAAAAAAACAAAAAAAQAAAAAAAAA=</HashCode>
+ <FileName>BusinessModel\MainEntities\MapPoint.cs</FileName>
+ </TypeIdentifier>
+ <Lollipop Orientation="Bottom" Position="0.142" />
+ </Class>
+ <Class Name="ModelData.BusinessModel.MainEntities.Settlement">
+ <Position X="10.75" Y="1.75" Width="2.25" />
+ <TypeIdentifier>
+ <HashCode>BAAAACAAAAAABAAAABAAAAAAACAAAAAAAAACAADAAAA=</HashCode>
+ <FileName>BusinessModel\MainEntities\Settlement.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.RDF.Queries">
+ <Position X="3.75" Y="5.75" Width="2" />
+ <TypeIdentifier>
+ <HashCode>IAAEAAAAACAEAgAAAAAAMAAAAAAAIAAAAIAAACAAAAA=</HashCode>
+ <FileName>BusinessModel\RDF\Queries.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.RDF.RDFQuery" Collapsed="true">
+ <Position X="21.5" Y="2.5" Width="1.5" />
+ <TypeIdentifier>
+ <HashCode>AAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
+ <FileName>BusinessModel\RDF\RDFQuery.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.Tools.Coordinate" Collapsed="true">
+ <Position X="21.5" Y="0.5" Width="1.5" />
+ <TypeIdentifier>
+ <HashCode>AAAAAAEAACAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
+ <FileName>BusinessModel\Tools\Coordinate.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.Tools.InstantTime" Collapsed="true">
+ <Position X="21.5" Y="1.5" Width="1.5" />
+ <TypeIdentifier>
+ <HashCode>AAAEAAAABAAAAAAEAAAAAAAAAAAAAAAAAAACAAAAAAA=</HashCode>
+ <FileName>BusinessModel\Tools\InstantTime.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.Tools.Period">
+ <Position X="15.5" Y="0.5" Width="1.5" />
+ <TypeIdentifier>
+ <HashCode>AAIAAAAAAAAAAAAEAAAAAAAAAAAAEAAAAAAAAAAAAAA=</HashCode>
+ <FileName>BusinessModel\Tools\Period.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.UnitOfWork.Context">
+ <Position X="15.75" Y="4.5" Width="2" />
+ <TypeIdentifier>
+ <HashCode>AAAAAQAAIAAAAAAAAIAAIACAAAAAAAAAACAAAAAAABA=</HashCode>
+ <FileName>BusinessModel\UnitOfWork\Context.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.WebModel.Model">
+ <Position X="10.75" Y="6.75" Width="2" />
+ <TypeIdentifier>
+ <HashCode>AAAAIAAAAABAAAAAAAAAAAAACACEAAAAAAACAAAAAAA=</HashCode>
+ <FileName>WebModel\Model.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.WebModel.WebDataManager" Collapsed="true">
+ <Position X="21.5" Y="3.5" Width="1.5" />
+ <TypeIdentifier>
+ <HashCode>AAEAAAQAAAAAAQBAAAAAAAAAAABAIAAAAAAKAAAAgAA=</HashCode>
+ <FileName>WebModel\WebDataManager.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="Tools.Config.ConfigManager">
+ <Position X="8.25" Y="5" Width="2.25" />
+ <TypeIdentifier />
+ </Class>
+ <Class Name="Tools.Extensions">
+ <Position X="13.5" Y="4" Width="1.75" />
+ <TypeIdentifier />
+ </Class>
+ <Class Name="Tools.IndexAttrib">
+ <Position X="17.25" Y="0.5" Width="1.5" />
+ <TypeIdentifier />
+ </Class>
+ <Class Name="Tools.SerializeService">
+ <Position X="13.25" Y="5.75" Width="2.25" />
+ <TypeIdentifier />
+ </Class>
+ <Class Name="Tools.Users.User">
+ <Position X="13.25" Y="7.5" Width="1.5" />
+ <TypeIdentifier />
+ </Class>
+ <Class Name="Tools.Users.UserContext">
+ <Position X="17.25" Y="2.5" Width="1.5" />
+ <TypeIdentifier />
+ </Class>
+ <Class Name="Tools.Word.DocXWrite">
+ <Position X="10.75" Y="5" Width="2.25" />
+ <TypeIdentifier />
+ </Class>
+ <Interface Name="ModelData.BusinessModel.BaseAndInterface.I_URLcs">
+ <Position X="15.5" Y="2.5" Width="1.5" />
+ <TypeIdentifier>
+ <HashCode>AAAAAAAAAAAAAEAAAAAAAAAAACAAAAAAAAAAAAAAAAA=</HashCode>
+ <FileName>BusinessModel\BaseAndInterface\I_URLcs.cs</FileName>
+ </TypeIdentifier>
+ </Interface>
+ <Interface Name="Tools.I_MySerializable">
+ <Position X="15" Y="7.5" Width="1.5" />
+ <TypeIdentifier />
+ </Interface>
+ <Font Name="Segoe UI" Size="9" />
+</ClassDiagram>
\ No newline at end of file
ModelData/BusinessModel/RDF/Queries.cs 54(+53 -1)
diff --git a/ModelData/BusinessModel/RDF/Queries.cs b/ModelData/BusinessModel/RDF/Queries.cs
index f8ae1b8..dcea28e 100644
--- a/ModelData/BusinessModel/RDF/Queries.cs
+++ b/ModelData/BusinessModel/RDF/Queries.cs
@@ -299,7 +299,59 @@ WHERE
BIND (IF (?minSetYear < ?minEditedYear, ?minSetYear, ?minEditedYear) as ?min)
BIND (IF (?maxSetYear > ?maxEditedYear, ?maxSetYear, ?maxEditedYear) as ?max)
}
-";// @;
+";
+ }
+
+
+
+ /// \fn public static string AllSettlementTypes()
+ ///
+ /// \brief Запрос всех возможных типов поселений за все периоды
+ /// \code
+ /// SELECT ?settlementType ?typeName WHERE
+ /// {
+ /// ?settlementType a map:SettlementTypes; geonames:name ?typeName.
+ /// }
+ /// \endcode
+ /// \author Denis
+ /// \date 17.05.2019
+ ///
+ /// \returns A string.
+
+ public static string AllSettlementTypes()
+ {
+ return GetAllPrefixes() +
+@"SELECT ?settlementType ?typeName WHERE
+{
+ ?settlementType a map:SettlementTypes; geonames:name ?typeName.
+}
+";
+ }
+
+
+
+ /// \fn public static string AllRegions()
+ ///
+ /// \brief Запрос всех возможных административных единиц (регионов) за все периоды
+ /// \code
+ /// SELECT ?region ?regionName WHERE
+ /// {
+ /// ?region a map:Region; geonames:name ?regionName.
+ /// }
+ /// \endcode
+ /// \author Denis
+ /// \date 17.05.2019
+ ///
+ /// \returns A string.
+
+ public static string AllRegions()
+ {
+ return GetAllPrefixes() +
+@"SELECT ?region ?regionName WHERE
+{
+ ?region a map:Region; geonames:name ?regionName.
+}
+";
}
ModelData/BusinessModel/RDF/RDFQuery.cs 16(+15 -1)
diff --git a/ModelData/BusinessModel/RDF/RDFQuery.cs b/ModelData/BusinessModel/RDF/RDFQuery.cs
index 42ea13e..9936117 100644
--- a/ModelData/BusinessModel/RDF/RDFQuery.cs
+++ b/ModelData/BusinessModel/RDF/RDFQuery.cs
@@ -39,7 +39,9 @@ namespace ModelData.BusinessModel.RDF
Years, ///< Запрос максимального и минимального годов. Параметры не требуются. Вернет одну строку.
AllSettlements, ///< Запрос всех поселений. Нужен для создания точек карты. Два параметра: требуемые года. Вернет большой список.
SettlementInfo, ///< Запрос все информации об одном поселении. Один параметр: URL поселения. Вернет список, где одна строка про поселение и все остальные строки про измененные поселения.
- SubName ///< Запрос всех имен поселений, часть названия которых совпадает с параметром. Один параметр: подстрока для поиска. Вернет большой список.
+ SubName, ///< Запрос всех имен поселений, часть названия которых совпадает с параметром. Один параметр: подстрока для поиска. Вернет большой список.
+ AllSettlementTypes, ///< Запрос всех возможных типов поселений за все периоды. Вернет большой список.
+ AllRegions ///< Запрос всех возможных административных единиц (регионов) за все периоды. Вернет большой список.
};
/// \fn public static List<SparqlResult> GetData(QueryType queryType, string[] args = null)
@@ -86,6 +88,18 @@ namespace ModelData.BusinessModel.RDF
exQuery = Queries.AllSettlementsName(args[0]);
endpointURI = Config.SPARQL_Query_Endpoint;
} break;
+ case QueryType.AllSettlementTypes:
+ {
+ exQuery = Queries.AllSettlementTypes();
+ endpointURI = Config.SPARQL_Query_Endpoint;
+ }
+ break;
+ case QueryType.AllRegions:
+ {
+ exQuery = Queries.AllRegions();
+ endpointURI = Config.SPARQL_Query_Endpoint;
+ }
+ break;
default: throw new Exception("Invalid argument: queryType = " + queryType.ToString());
}
}
ModelData/ModelData.csproj 2(+1 -1)
diff --git a/ModelData/ModelData.csproj b/ModelData/ModelData.csproj
index 731b441..7f3d64e 100644
--- a/ModelData/ModelData.csproj
+++ b/ModelData/ModelData.csproj
@@ -77,7 +77,7 @@
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
- <None Include="BusinessModel\ClassDiagram.cd" />
+ <None Include="BusinessModel\ClassDiagram1.cd" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
ModelData/WebModel/WebDataManager.cs 13(+13 -0)
diff --git a/ModelData/WebModel/WebDataManager.cs b/ModelData/WebModel/WebDataManager.cs
index c10e633..c0fb68f 100644
--- a/ModelData/WebModel/WebDataManager.cs
+++ b/ModelData/WebModel/WebDataManager.cs
@@ -6,6 +6,7 @@ using System.Threading.Tasks;
using ModelData.BusinessModel;
using ModelData.BusinessModel.MainEntities;
+using ModelData.BusinessModel.ExtraEntities;
namespace ModelData.WebModel
{
@@ -104,6 +105,18 @@ namespace ModelData.WebModel
return businessData.GetYears();
}
+ public Region[] GetAllRegions()
+ {
+ BusinessDataManager businessData = BusinessDataManager.Get();
+ return businessData.AllRegions();
+ }
+
+ public SettlementType[] GetAllSettlementTypes()
+ {
+ BusinessDataManager businessData = BusinessDataManager.Get();
+ return businessData.AllSettlementTypes();
+ }
+
#region Tools
private void Init(int Count = 5)
Tools/Word/DocXWrite.cs 35(+30 -5)
diff --git a/Tools/Word/DocXWrite.cs b/Tools/Word/DocXWrite.cs
index a9b53e2..26e74d1 100644
--- a/Tools/Word/DocXWrite.cs
+++ b/Tools/Word/DocXWrite.cs
@@ -16,23 +16,48 @@ namespace Tools.Word
return new System.IO.MemoryStream();
}
- public static void Test(List<I_MySerializable> list, out System.IO.Stream wr, string path = "")
+ //public static DocX GetDocX(List<I_MySerializable> list, out System.IO.MemoryStream wr)
+ //{
+ // wr = new System.IO.MemoryStream();
+ // DocX doc = DocX.Create(wr);
+ // foreach (var elem in list)
+ // Serialize(elem, doc);
+ // return doc;
+ //}
+
+ //public static DocX GetDocX(I_MySerializable elem, out System.IO.MemoryStream wr)
+ //{
+ // wr = new System.IO.MemoryStream();
+ // DocX doc = DocX.Create(wr);
+ // Serialize(elem, doc);
+
+ // return doc;
+ //}
+
+ public static void PrintDocX(IEnumerable<I_MySerializable> list, out System.IO.MemoryStream wr, string path = null)
{
wr = new System.IO.MemoryStream();
DocX doc = DocX.Create(wr);
foreach (var elem in list)
Serialize(elem, doc);
- if (path != "")
- doc.SaveAs(path);
+
+ doc.Save();
+ wr.Position = 0;
+ if (path != null && path != "")
+ doc.SaveAs(path);
+ wr.Position = 0;
}
- public static void Test(I_MySerializable elem, out System.IO.Stream wr, string path = "")
+ public static void PrintDocX(I_MySerializable elem, out System.IO.MemoryStream wr, string path = null)
{
wr = new System.IO.MemoryStream();
DocX doc = DocX.Create(wr);
Serialize(elem, doc);
- if (path != "")
+ doc.Save();
+ wr.Position = 0;
+ if (path != null && path != "")
doc.SaveAs(path);
+ wr.Position = 0;
}
private static void Serialize(I_MySerializable obj, DocX doc)
web-map/Content/Site.css 19(+2 -17)
diff --git a/web-map/Content/Site.css b/web-map/Content/Site.css
index 0b7f1c2..28baf59 100644
--- a/web-map/Content/Site.css
+++ b/web-map/Content/Site.css
@@ -192,21 +192,6 @@ a.article, a.article:hover {
padding: 0.2rem 0.2rem;
}
-.yandexMapsFilterElement {
- box-sizing: border-box !important;
- overflow: hidden;
- padding-right: 13px;
- padding-left: 30px;
- max-width: 250px;
- width: 200px;
- max-height: 250px;
- text-overflow: ellipsis;
- font-size: 13px;
- line-height: 28px;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- position: relative;
- border-bottom: 1px solid #eee;
+#sidebar-right-text .sidebar-right-text-element {
+ padding: 0.5rem 0.5rem;
}
web-map/Controllers/MapController.cs 59(+58 -1)
diff --git a/web-map/Controllers/MapController.cs b/web-map/Controllers/MapController.cs
index b398a78..d97cd34 100644
--- a/web-map/Controllers/MapController.cs
+++ b/web-map/Controllers/MapController.cs
@@ -4,6 +4,10 @@ using System.Linq;
using System.Web;
using System.Web.Mvc;
+using System.IO;
+
+using ModelData.WebModel;
+using Tools.Word;
namespace web_map.Controllers
{
@@ -13,6 +17,59 @@ namespace web_map.Controllers
public ActionResult Map()
{
return View();
- }
+ }
+
+ public FileResult ExportInfo(string data, string type)
+ {
+ //WebDataManager webData = WebDataManager.Get();
+ var inputList = data.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries).ToList<string>();
+ var infoList = new List<ModelData.BusinessModel.MainEntities.Settlement>(inputList.Count);
+
+ WebDataManager webData = WebDataManager.Get();
+ foreach (var item in inputList)
+ infoList.Add(webData.GetSettlement(item));
+
+ DocXWrite.PrintDocX(infoList, out MemoryStream mr);
+
+ string file_name = "info.docx";
+
+ return File(mr, System.Net.Mime.MediaTypeNames.Application.Octet, file_name);
+ }
+
+ [HttpPost]
+ public JsonResult ImportForm(string formData, string type)
+ {
+ WebDataManager webData = WebDataManager.Get();
+
+ var inputArray = formData.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
+ Dictionary<string, string> form = new Dictionary<string, string>();
+ string key, value;
+ foreach (var elem in inputArray)
+ {
+ key = elem.Split('~')[0];
+ value = elem.Split('~')[1];
+ if (value == "null" || value == null)
+ value = "";
+ form.Add(key, value);
+ }
+
+ return Json("Import success", JsonRequestBehavior.AllowGet);
+ }
+
+ [HttpGet]
+ public JsonResult GetAllOfType(string type)
+ {
+ WebDataManager webData = WebDataManager.Get();
+ if (type == "type")
+ {
+ return Json(webData.GetAllSettlementTypes(), JsonRequestBehavior.AllowGet);
+ }
+ else if (type == "region")
+ {
+ return Json(webData.GetAllRegions(), JsonRequestBehavior.AllowGet);
+ }
+ else
+ return Json(""/*webData.GetSettlementsNames(type)*/, JsonRequestBehavior.AllowGet);
+ }
}
}
\ No newline at end of file
web-map/Scripts/SiteScripts/AjaxQuery.js 66(+58 -8)
diff --git a/web-map/Scripts/SiteScripts/AjaxQuery.js b/web-map/Scripts/SiteScripts/AjaxQuery.js
index d191d04..d6579cb 100644
--- a/web-map/Scripts/SiteScripts/AjaxQuery.js
+++ b/web-map/Scripts/SiteScripts/AjaxQuery.js
@@ -36,16 +36,8 @@ function GetAllPoints(YearMin, YearMax) {
YearMax: YearMax
},
success: function (data) {
- // Заполнить массивы из полученного результата
- // Заполнить коллекцию геообъектами
- //
- // Затем:
// Нужно ли делать выборку
// |
- // |
- // |
- // |
- // |
FillDataArrays(data, true);
},
@@ -56,6 +48,28 @@ function GetAllPoints(YearMin, YearMax) {
});
}
+function GetAllOfType(type) {
+ return $.ajax({
+ url: '/Map/GetAllOfType',
+ type: 'GET',
+ contentType: "application/json; charset=utf-8",
+ dataType: 'json',
+ cache: false,
+ //Параметр контроллеру
+ data: {
+ type: type
+ },
+ success: function (data) {
+ },
+
+ error: function (response) {
+ console.log(response.responseText);
+ alert('Ошибка. Не удалось получить данные от сервера');
+ }
+ });
+
+}
+
//Получить все имена поселений, подходящие по маске subName
function GetNames(subName, functionWhatNeedToDoWithInfo) {
$.ajax({
@@ -111,6 +125,42 @@ function GetDate(load = false) {
});
}
+// Функция получения файла экспорта
+function ExportData(type) {
+
+ // Сериализация данных в строку
+ var collectionString = '';
+ Collections.Export.forEach(function (element) {
+ collectionString += '|' + element.url;
+ });
+ collectionString += '|';
+
+ console.log('/Map/ExportInfo?data=' + encodeURIComponent(collectionString) + '&type=' + type);
+ document.getElementById('my_iframe').src = '/Map/ExportInfo?data=' + encodeURIComponent(collectionString) + '&type=' + type;
+}
+
+function ImportForm(formData, type) {
+ $.ajax({
+ url: '/Map/ImportForm',
+ type: 'POST',
+ // из-за этой строки была ошибка 500//contentType: "application/json; charset=utf-8",
+ dataType: 'json',
+ cache: false,
+ data: {
+ formData: formData,
+ type: type
+ },
+ success: function (data) {
+ console.log(data);
+ },
+
+ error: function (response) {
+ console.log(response.responseText);
+ alert('Ошибка. Не удалось получить данные от сервера');
+ }
+ });
+}
+
//function apiConnect(apiKey) {
web-map/Scripts/SiteScripts/Events.js 238(+209 -29)
diff --git a/web-map/Scripts/SiteScripts/Events.js b/web-map/Scripts/SiteScripts/Events.js
index 713ea30..c719795 100644
--- a/web-map/Scripts/SiteScripts/Events.js
+++ b/web-map/Scripts/SiteScripts/Events.js
@@ -85,35 +85,11 @@ function SelectDataFromArrays() {
}
}
afterFilters = typeFilters.intersect(regionFilters).sort('options.Population desc');
- }
-
-
-//filterTypes = all.search('options.Regions regExp "*|gorod|*"')
-// .add(all.search('options.Regions regExp "*|selo|*"'))
-// .add(all.search('options.Regions regExp "*|poselok|*"'))
-
- //for (e in Collections.Filters.Type) {
- // if (Collections.Filters.Type[e])
- // {
- // for
- // }
- // afterFilters = afterFilters.search('options.Name = "' + name + '"');
- //}
- //for (e in Collections.Filters.Region) {
- // Collections.Filters.Region[e] = true;
- //}
+ }
var CollectionVisible = afterFilters.slice(0, Collections.VisibleCount).addToMap(Map);
// Оставшиеся объекты будем удалять с карты.
Collections.AllGeoObjects.remove(CollectionVisible).removeFromMap(Map).getLength();
-
- //for (var i = 0; i < Collections.All.length && i < Collections.VisibleCount; i++) {
- // ResultDataArray.push(Collections.All[i]);
- //}
-
- //if (isNeedPlaceCollection)
- // PlaceFromCollection(geo_query);
- // return ResultDataArray;
}
@@ -228,8 +204,8 @@ function exportSidebarButton() {
$('#sidebar-right, #content').addClass('export');
}
// был открыт экспорт, при повторном нажатии нужно скрыть панель
- else
- CloseRightPanel();
+ //else
+ // CloseRightPanel();
}
}
@@ -247,8 +223,8 @@ function importSidebarButton() {
$('#sidebar-right, #content').addClass('import');
}
// был открыт импорт, при повторном нажатии нужно скрыть панель
- else
- CloseRightPanel();
+ //else
+ // CloseRightPanel();
}
}
@@ -340,3 +316,207 @@ function activeFilters() {
Collections.isNeedFilters = true;
SelectDataFromArrays();
}
+
+function checkOriginImportForm() {
+ // выставить значения по дефолту
+ //$('input').removeClass('is-valid');
+ $('input').removeClass('is-invalid');
+ $("#lat-error")[0].innerHTML = 'Неверное значение.';
+ $("#long-error")[0].innerHTML = 'Неверное значение.';
+ $("#hasBeginning-error")[0].innerHTML = 'Не верный год.';
+
+ var form_data = new Array();
+
+ form_data["url"] = $("input#import-url");
+ form_data["title"] = $("input#import-title");
+ form_data["lat"] = $("input#import-lat");
+ form_data["long"] = $("input#import-long");
+ form_data["founder"] = $("input#import-founder");
+ form_data["hasBeginning"] = $("input#import-hasBeginning");
+ form_data["legend"] = $("textarea#import-legend");
+
+ var valid = true;
+
+ // регулярное выражение:
+ // ^ - с начала строки
+ // \d\d - две цифры
+ // [.] - разделитель точка
+ // \d+ - после разделителя 1 и более цифр
+ // $ - окончание строки
+ // гарантирует, что введенное значение является координатой
+ var coordValidate = /^\d\d[.]\d+$/;
+ var lat = form_data["lat"].val();
+ var long = form_data["long"].val();
+
+ if (!coordValidate.test(lat)) {
+ // значение не соответствует шаблону
+ // вывод ошибки
+ $('#import-lat, #content').addClass('is-invalid');
+ valid = false;
+ }
+ else if (Number(lat) < Collections.MapArea[0][0] || Number(lat) > Collections.MapArea[1][0]) {
+ // значение не попадает в пределы карты
+ $("#lat-error")[0].innerHTML = 'Значение не попадает в пределы карты.';
+ valid = false;
+ $('#import-lat, #content').addClass('is-invalid');
+ }
+
+ if (!coordValidate.test(long)) {
+ // значение не соответствует шаблону
+ // вывод ошибки
+ $('#import-long, #content').addClass('is-invalid');
+ valid = false;
+ }
+ else if (Number(long) < Collections.MapArea[0][1] || Number(long) > Collections.MapArea[1][1]) {
+ // значение не попадает в пределы карты
+ $("#long-error")[0].innerHTML = 'Значение не попадает в пределы карты.';
+ valid = false;
+ $('#import-long, #content').addClass('is-invalid');
+ }
+
+ var year = form_data["hasBeginning"].val();
+ if (year != '') {
+ var yearValidate = /^\d{1,4}$/;
+ if (!yearValidate.test(year)) {
+ // значение не соответствует шаблону
+ // вывод ошибки
+ $('#import-hasBeginning, #content').addClass('is-invalid');
+ valid = false;
+ }
+ else if (Number(year) > MaxYear) {
+ // значение больше текущего года
+ $("#hasBeginning-error")[0].innerHTML = 'Значение больше текущего года';
+ valid = false;
+ $('#import-hasBeginning, #content').addClass('is-invalid');
+ }
+ }
+
+ // если поля формы верны, составляем строку и возвращаем её для отправки на сервер
+ if (valid) {
+ var y = '';
+ for (key in form_data) {
+ // если поле это url
+ // ему нужна доп проверка
+ if (key == 'url') {
+ y += '|' + key + '~';
+ // если НЕ установлен флаг "только чтение", т.е. пользователь ВВЕЛ СВОЙ url
+ if (!form_data[key][0].readOnly)
+ y += form_data[key].val();
+ // иначе url считается пустым и будет создан на сервере
+ }
+ else
+ y += '|' + key + '~' + form_data[key].val();
+ }
+ y += '|';
+ return y;
+ }
+ // если поля не верны, пользователь увидит ошибку, а вместо строки вернем null
+ else
+ return null;
+}
+
+function checkEditedImportForm() {
+ // выставить значения по дефолту
+ //$('input').removeClass('is-valid');
+ $('input').removeClass('is-invalid');
+ $("#edited-hasBeginning-error")[0].innerHTML = 'Не верный год.';
+
+ var form_data = new Array();
+
+ form_data["url"] = $("input#import-edited-url");
+ form_data["beforeTitle"] = $("input#import-before-title");
+ form_data["beforeUrl"] = $("input#import-before-url");
+ form_data["hasBeginning"] = $("input#import-edited-hasBeginning");
+ form_data["source"] = $("input#import-edited-source");
+ form_data["title"] = $("input#import-edited-title");
+ form_data["populationAll"] = $("input#import-edited-populationAll");
+ form_data["populationFemale"] = $("input#import-edited-populationFemale");
+ form_data["populationMale"] = $("input#import-edited-populationMale");
+ form_data["region"] = $("#import-edited-region");
+ form_data["type"] = $("#import-edited-type");
+
+ //Вот так можно получить значение атрибута value, выбранной опции:
+ //console.log($("#test_228").val());
+ //А вот так можно получить текст выбранной опции:
+ //console.log($("#test_228 option:selected").text());
+
+ var valid = true;
+
+
+
+ var year = form_data["hasBeginning"].val();
+ if (year != '') {
+ var yearValidate = /^\d{1,4}$/;
+ if (!yearValidate.test(year)) {
+ // значение не соответствует шаблону
+ // вывод ошибки
+ $('#import-edited-hasBeginning, #content').addClass('is-invalid');
+ valid = false;
+ }
+ else if (Number(year) > MaxYear) {
+ // значение больще текущего года
+ $("#edited-hasBeginning-error")[0].innerHTML = 'Значение больше текущего года';
+ valid = false;
+ $('#import-edited-hasBeginning, #content').addClass('is-invalid');
+ }
+ }
+
+ var digitValidate = /^\d+$/;
+ var popAll = form_data["populationAll"].val();
+ var popMale = form_data["populationMale"].val();
+ var popFemale = form_data["populationFemale"].val();
+
+ if (popAll != '') {
+ if (!digitValidate.test(popAll)) {
+ // значение не соответствует шаблону
+ // вывод ошибки
+ $('#import-edited-populationAll, #content').addClass('is-invalid');
+ valid = false;
+ }
+ }
+
+ if (popMale != '') {
+ if (!digitValidate.test(popMale)) {
+ // значение не соответствует шаблону
+ // вывод ошибки
+ $('#import-edited-populationMale, #content').addClass('is-invalid');
+ valid = false;
+ }
+ }
+
+ if (popFemale != '') {
+ if (!digitValidate.test(popFemale)) {
+ // значение не соответствует шаблону
+ // вывод ошибки
+ $('#import-edited-populationFemale, #content').addClass('is-invalid');
+ valid = false;
+ }
+ }
+
+ // если поля формы верны, составляем строку и возвращаем её для отправки на сервер
+ if (valid) {
+ var y = '';
+ for (key in form_data) {
+ y += '|' + key + '~' + form_data[key].val();
+ }
+ y += '|';
+ return y;
+ }
+ // если поля не верны, пользователь увидит ошибку, а вместо строки вернем null
+ else
+ return null;
+}
+
+function importFormSubmit(contentType) {
+ var data = '';
+ if (contentType == 'origin-import') {
+ data = checkOriginImportForm();
+ }
+ else if (contentType == 'edited-import') {
+ data = checkEditedImportForm();
+ }
+ if (data != null)
+ ImportForm(data, contentType);
+}
+
+
web-map/Scripts/SiteScripts/Init.js 100(+53 -47)
diff --git a/web-map/Scripts/SiteScripts/Init.js b/web-map/Scripts/SiteScripts/Init.js
index 8d96cfb..0341071 100644
--- a/web-map/Scripts/SiteScripts/Init.js
+++ b/web-map/Scripts/SiteScripts/Init.js
@@ -16,7 +16,6 @@ var MinYear;
var MaxYear;
var CurrentMinYear;
var CurrentMaxYear;
-//var clusterer;
// Функция загрузки Яндекс карты
function YandexMapInit()
@@ -30,7 +29,10 @@ function YandexMapInit()
},
{
// Ограничим область карты.
- restrictMapArea: [[48.795, 41.484], [53.823, 51.856]]
+ restrictMapArea: Collections.MapArea
+ // !!! используется значение [[48.795, 41.484], [53.823, 51.856]]
+
+ // это старые, уже не помню зачем их сохраняю
//restrictMapArea: [[49.795, 42.484], [52.823, 50.856]]
}
);
@@ -41,20 +43,7 @@ function YandexMapInit()
// Будем отслеживать зум карты при смене видимых границ (движение карты и смена zoom)
Map.events.add('boundschange', function (event)
{
- // фильтрация поселений в принципе при движении по карте
-
- // Выгрузить коллекцию на карту
- // |
- // |
SelectDataFromArrays();
-
- // фильтрация поселений при зуммировании
- //CurrentZoom = event.get('newZoom');
- //if (CurrentZoom != event.get('oldZoom'))
- //{
- // //console.log(event.get('oldZoom') + " " + CurrentZoom);
- // SelectDataFromArrays(true, true);
- //}
});
// Загрузим регионы.
@@ -90,36 +79,7 @@ function YandexMapInit()
masks.forEach(function (mask) { background.geometry.insert(1, mask); });
// Добавим многоугольник на карту.
Map.geoObjects.add(background);
- });
-
- // центрирование карты
- //myMap.setCenter(coord, 13);
-
- //Создание кластера
- //clusterer = new ymaps.Clusterer({
- // /**
- // * Через кластеризатор можно указать только стили кластеров,
- // * стили для меток нужно назначать каждой метке отдельно.
- // * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/option.presetStorage.xml
- // */
- // preset: 'islands#invertedVioletClusterIcons',
- // /**
- // * Ставим true, если хотим кластеризовать только точки с одинаковыми координатами.
- // */
- // groupByCoordinates: false,
- // /**
- // * Опции кластеров указываем в кластеризаторе с префиксом "cluster".
- // * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/ClusterPlacemark.xml
- // */
- // clusterDisableClickZoom: true,
- // clusterHideIconOnBalloonOpen: false,
- // geoObjectHideIconOnBalloonOpen: false
- //});
- //clusterer.options.set({
- // gridSize: 500,
- // clusterDisableClickZoom: true
- //});
-
+ });
}
// Функция создания слайдера дат и обработчик поля ввода дат
@@ -177,7 +137,49 @@ function SliderInit() {
$('#sidebar-right-export').bind('click', exportSidebarButton);
// Кнопка открытия правой боковой панели для импорта
- $('#sidebar-right-import').bind('click', importSidebarButton);
+ $('#sidebar-right-import').bind('click', function () {
+ // вызов отрисовки формы создания нового поселения
+ printImportAddingForm();
+ // вызов появления панели
+ importSidebarButton();
+ });
+
+ // Кнопка открытия правой боковой панели для импорта
+ $('#addEditInfo').bind('click', function () {
+ // вызов отрисовки формы создания нового ИЗМЕНЕННОГО поселения
+ printImportEditingForm();
+ // вызов появления панели
+ importSidebarButton();
+ });
+
+ // Кнопка экспорта в word
+ $('#export-to-word').bind('click', function () {
+ if (Collections.Export != null && Collections.Export.length > 0) {
+ ExportData('word');
+ }
+
+ });
+
+ // Кнопка экспорта в excel
+ $('#export-to-excel').bind('click', function () {
+ if (Collections.Export != null && Collections.Export.length > 0) {
+ ExportData('excel');
+ }
+ });
+
+ // Отправка формы импорта данных
+ $("#import-form").submit(function (e) {
+ e.preventDefault();
+ var content = '';
+ var form = $('#import-form, #content');
+ if (form.hasClass('edited-import')) {
+ content = 'edited-import';
+ }
+ else if (form.hasClass('origin-import')) {
+ content = 'origin-import';
+ }
+ importFormSubmit(content);
+ });
}
function AutoCompleteInit(data) {
@@ -196,7 +198,6 @@ function AutoCompleteInit(data) {
minLength: 2,
delay: 300,
select: function(event, ui) {
- //$('#sku').val(skus[ui.item.value]);
OnFindNameUsing(ui.item.value)
}
});}
@@ -237,4 +238,9 @@ function CollectionsInit() {
Collections.Filters.Type = new Object();
Collections.Filters.Region = new Object();
Collections.isNeedFilters = false;
+ Collections.MapArea = [[48.795, 41.484], [53.823, 51.856]];
+
+ // Эти коллекции нужно обнулять, но т.к. нет внесения новых данных о них, то пусть будут статичными
+ Collections.AllSettlementTypes = new Array();
+ Collections.AllRegions = new Array();
}
\ No newline at end of file
web-map/Scripts/SiteScripts/Output.js 171(+141 -30)
diff --git a/web-map/Scripts/SiteScripts/Output.js b/web-map/Scripts/SiteScripts/Output.js
index cccf7c3..04c1740 100644
--- a/web-map/Scripts/SiteScripts/Output.js
+++ b/web-map/Scripts/SiteScripts/Output.js
@@ -16,19 +16,12 @@ function PrintInfoAboutSettlement(info)
Collections.CurrentSettlement.constInfo.Founder = info.Founder;
Collections.CurrentSettlement.constInfo.hasBeginning = info.hasBeginning;
Collections.CurrentSettlement.constInfo.Legend = info.Legend;
- Collections.CurrentSettlement.constInfo.URL = info.URL;
Collections.CurrentSettlement.editInfo = new Array();
document.getElementById('settlement-title').innerHTML = info.Title;
document.getElementById('settlement-url').innerHTML = info.URL;
- //jumbotron
-
- /// здесь сохранить в глобал
- /// потом использовать при редактировании
- /// присвоить id каждому элементу и по нему вытаскивать в форму редактирования
- /// сделать 2 класса для осн инф и для редактирования
var text = '<div class="sidebar-left-text-element">';
text += makeButton(editButtonText, 'constInfo', 'editConstInfoButton');
text += '<p>' + 'Координаты: ' + info.Coordinate.Lat + ' ' + info.Coordinate.Long + '</p>';
@@ -67,8 +60,8 @@ function PrintInfoAboutSettlement(info)
text += '<p>' + 'Название поселения: ' + element.Title + '</p>';
text += '<p>' + 'Год: ' + element.hasBeginning.Year + '</p>';
- if (element.Source.includes("www") || element.Source.includes("http"))
- text += '<p>Источник: <a href="' + element.Source + '">ссылка</a></p>';
+ if (element.Source.includes("www.") || element.Source.includes("http"))
+ text += '<p>Источник: <a href="' + element.Source + '" target="_blank">ссылка</a></p>';
else
text += '<p>Источник: ' + element.Source + '</p>';
@@ -95,30 +88,148 @@ function printExportCollection() {
}
function printEditImportForm(what, id) {
- var text = '';
+ var element;
if (what == 'constInfo') {
- console.log(Collections.CurrentSettlement[what]);
- }
+ element = Collections.CurrentSettlement[what];
+ // вызов создания формы
+ printImportAddingForm();
+ // после создания формы, записываем готовые значения в нужные поля
+
+ $("input#import-url").val(element.URL);
+ $("input#import-title").val(element.Title);
+ $("input#import-lat").val(element.Lat);
+ $("input#import-long").val(element.Long);
+ $("input#import-founder").val(element.Founder);
+ $("input#import-hasBeginning").val(element.hasBeginning);
+ $("textarea#import-legend").val(element.Legend);
+
+ importSidebarButton();
+ }
else if (what == 'editInfo') {
- var i = id.split('_')[1];
- console.log(Collections.CurrentSettlement.editInfo[i]);
+ importSidebarButton();
+ element = Collections.CurrentSettlement.editInfo[id.split('_')[1]];
+ // вызов создания формы
+ printImportEditingForm();
+ // после создания формы, записываем готовые значения в нужные поля
+
+ $("input#import-edited-url").val(element.URL);
+ $("input#import-edited-hasBeginning").val(element.hasBeginning.Year);
+ $("input#import-edited-source").val(element.Source);
+
+ if (element.PopulationAll != null)
+ $("input#import-edited-populationAll").val(element.PopulationAll);
+ if (element.PopulationFemales != null)
+ $("input#import-edited-populationFemale").val(element.PopulationFemales);
+ if (element.PopulationMales != null)
+ $("input#import-edited-populationMale").val(element.PopulationMales);
+ if (element.Region != null) {
+ // костыль из-за того, что пытаемся выделить элемент списка, хотя список еще не был наполнен из-за асинхронности работы
+ // ставлю задержку, чтобы при первой загрузке списка выделение произошло чуть позже. при повторных нажатиях список уже загружен и работает мгновенно
+ if (Collections.AllRegions.length == 0)
+ setTimeout(function () { $("#import-edited-region option[value='" + element.Region.URL + "']").attr("selected", "selected"); }, 1000);
+ $("#import-edited-region option[value='" + element.Region.URL + "']").attr("selected", "selected");
+ }
+ if (element.Type != null) {
+ if (Collections.AllSettlementTypes.length == 0)
+ setTimeout(function () { $("#import-edited-type option[value='" + element.Type.URL + "']").attr("selected", "selected"); }, 1000);
+ $("#import-edited-type option[value='" + element.Type.URL + "']").attr("selected", "selected");
+ }
+ if (element.Title != null)
+ $("input#import-edited-title").val(element.Title);
+ }
+ else { console.log('printEditImportForm(' + what + ',' + id + ')'); return; }
+ //importSidebarButton();
+}
+
+function printImportAddingForm() {
+ // здесь создание формы для добавления нового поселения
+ // вызывается при нажатии на кнопку "редактировать" у осн инф или при нажатии на кнопку на веб-странице (Импорт)
+
+ var text = '';
+ text += '<div class="form-group"><div class="form-row"><div class="col"><label for="import-url">Url</label></div><div class="col"><div class="form-check"><input class="form-check-input position-static" type="checkbox" id="checkBoxEditUrl" value="">';
+ text += '</div></div></div><input type="text" class="form-control" id="import-url" placeholder="Идентификатор поселения" readonly value=""><div class="invalid-feedback">Ошибка в наименовании URL поселения.</div></div>';
+ text += '<div class="form-group"><label for="import-title">Название поселения</label><input type="text" class="form-control" id="import-title" placeholder="Отображается на карте" required value=""><div class="invalid-feedback">';
+ text += 'Ошибка в названии поселения.</div></div><div class="form-row"><div class="col"><label for="import-lat">Широта</label><input type="text" class="form-control" id="import-lat" placeholder="51.000000" required value="">';
+ text += '<div id="lat-error" class="invalid-feedback">Неверное значение.</div></div><div class="col"><label for="import-long">Долгота</label><input type="text" class="form-control" id="import-long" placeholder="45.000000" required value="">';
+ text += '<div id="long-error" class="invalid-feedback">Неверное значение.</div></div></div><div class="form-group mt-3"><label for="import-founder">Основатель поселения</label><input type="text" class="form-control" id="import-founder" placeholder="Имя или URL">';
+ text += '</div><div class="form-group"><label for="import-hasBeginning">Дата основания</label><div class="input-group"><input type="text" class="form-control" id="import-hasBeginning" placeholder="Год основания"><div class="input-group-append"><span class="input-group-text">н. э.</span></div>';
+ text += '<div id="hasBeginning-error" class="invalid-feedback">Не верный год.</div></div></div><div class="form-group"><label for="exampleFormControlTextarea1">История основания</label><textarea class="form-control" id="import-legend" rows="2"></textarea></div>';
+
+ // т.к. форма общая и submit тоже, нужно знать, какой тип поселений изменяется
+ $('#import-form, #content').addClass('origin-import');
+ $('#import-form, #content').removeClass('edited-import');
+
+ // записать html
+ $("#import-form")[0].innerHTML = text;
+
+ // чек-бокс выделения url-поля
+ $('#checkBoxEditUrl').change(function () {
+ $('#import-url').prop('required', ($(this)[0].checked));
+ $('#import-url')[0].readOnly = !($(this)[0].checked);
+ });
+}
+
+function printImportEditingForm() {
+ // здесь создание формы для добавления нового ИЗМЕНЕННОГО поселения
+ // вызывается при нажатии на кнопку "редактировать" у измененной инф или при нажатии на кнопку на левой бок панели для добавления новой информации
+
+ var text = '';
+ text += '<input type="text" class="form-control" id="import-edited-url" required="" hidden value="default"><div class="form-group"><label for="import-before-url">Основное поселение</label><input type="text" class="form-control" id="import-before-title"';
+ text += ' placeholder="Название поселения" readonly="" value=""><input type="text" class="form-control" id="import-before-url" placeholder="Идентификатор поселения" hidden required="" value=""></div><div class="form-group">';
+ text += '<label for="import-edited-hasBeginning">Дата сведений</label><div class="input-group"><input type="text" class="form-control" id="import-edited-hasBeginning" placeholder="Год относящейся информации" required=""><div class="input-group-append">';
+ text += '<span class="input-group-text">н. э.</span></div><div id="edited-hasBeginning-error" class="invalid-feedback">Не верный год.</div></div></div><div class="form-group"><label for="import-edited-source">Источник сведений</label>';
+ text += '<input type="text" class="form-control" id="import-edited-source" placeholder="URL или другой идентификатор" value="" required=""><div class="invalid-feedback">Ошибка в источнике сведений.</div></div><div class="form-group">';
+ text += '<label for="import-edited-title">Название поселения</label><input type="text" class="form-control" id="import-edited-title" placeholder="Дополнительное название" value=""><div class="invalid-feedback">Ошибка в названии поселения.</div></div>';
+ text += '<div class="form-group"><label for="import-edited-type">Тип поселения</label><select id="import-edited-type" class="form-control form-control-sm" size="3"></select><button id="btn-type-off" type="button" class="mt-2 btn btn-outline-light';
+ text += ' btn-sm">Снять выделение</button></div><div class="form-group"><label for="import-edited-region">В составе административной единицы</label><select id="import-edited-region" class="form-control form-control-sm" size="3"></select><button';
+ text += ' id="btn-region-off" type="button" class="mt-2 btn btn-outline-light btn-sm">Снять выделение</button></div><div class="form-group"><label for="import-edited-populationAll">Общее количество населения</label><input type="text" class="form-control" ';
+ text += 'id="import-edited-populationAll" placeholder="0" value=""><div class="invalid-feedback">Неверное число.</div></div><div class="form-group"><label for="import-edited-populationFemale">Количество женского населения</label><input type="text" ';
+ text += 'class="form-control" id="import-edited-populationFemale" placeholder="0" value=""><div class="invalid-feedback">Неверное число.</div></div><div class="form-group"><label for="import-edited-populationMale">Количество мужского населения</label>';
+ text += '<input type="text" class="form-control" id="import-edited-populationMale" placeholder="0" value=""><div class="invalid-feedback">Неверное число.</div></div>';
+
+ // т.к. форма общая и submit тоже, нужно знать, какой тип поселений изменяется
+ $('#import-form, #content').addClass('edited-import');
+ $('#import-form, #content').removeClass('origin-import');
+
+ $("#import-form")[0].innerHTML = text;
+ $("#import-before-url").val(Collections.CurrentSettlement.constInfo.URL);
+ $("#import-before-title").val(Collections.CurrentSettlement.constInfo.Title);
+
+ $('#btn-type-off').click(function () {
+ $('#import-edited-type option').prop('selected', false);
+ });
+
+ $('#btn-region-off').click(function () {
+ $('#import-edited-region option').prop('selected', false);
+ });
+
+ function loadSelect(from, what) {
+ var text = '';
+ from.forEach(function (e) {
+ text += '<option value="' + e.URL + '">' + e.Title + '</option>';
+ });
+ $('#' + what)[0].innerHTML = text;
}
+ // нужно выполнить загрузку ВСЕХ тиов поселений за все периоды и ВСЕХ регионов
+ if (Collections.AllSettlementTypes.length == 0) {
+ $.when(GetAllOfType('type')).done(function (data) {
+ Collections.AllSettlementTypes = data;
+ loadSelect(Collections.AllSettlementTypes, 'import-edited-type');
+ });
+ }
+ else {
+ loadSelect(Collections.AllSettlementTypes, 'import-edited-type');
+ }
+
+ if (Collections.AllRegions.length == 0) {
+ $.when(GetAllOfType('region')).done(function (data) {
+ Collections.AllRegions = data;
+ loadSelect(Collections.AllRegions, 'import-edited-region');
+ });
+ }
+ else {
+ loadSelect(Collections.AllRegions, 'import-edited-region');
+ }
}
-// Функция выгружает все гео-объекты из данной коллекции на карту
-function PlaceFromCollection() {
- CollectionVisible.addToMap(Map);
- //Map.geoObjects.add(CollectionVisible);
-
- //var arr = [];
- //var i = 0;
- //var iterator = CollectionVisible.getIterator(),
- // object;
- //while ((object = iterator.getNext()) != iterator.STOP_ITERATION) {
- // arr[i] = object;
- // i++;
- //}
- //clusterer.add(arr);
- //Map.geoObjects.add(clusterer);
-}
\ No newline at end of file
web-map/Views/Map/Map.cshtml 84(+72 -12)
diff --git a/web-map/Views/Map/Map.cshtml b/web-map/Views/Map/Map.cshtml
index 7e1bfe7..fb0ac19 100644
--- a/web-map/Views/Map/Map.cshtml
+++ b/web-map/Views/Map/Map.cshtml
@@ -30,13 +30,74 @@
<button id="sidebar-right-close" class="btn btn-secondary" type="button">Скрыть<br>панель</button>
<button hidden id="export-to-word" class="btn btn-secondary" type="button">Экспорт<br>в Word</button>
<button hidden id="export-to-excel" class="btn btn-secondary" type="button">Экспорт<br>в Excel</button>
- <button hidden id="import-button" class="btn btn-secondary" type="button">Отправить<br>данные</button>
+ <button hidden id="import-button" class="btn btn-secondary" type="submit" form="import-form">Отправить<br>данные</button>
</div>
</div>
<div id="sidebar-right-text" class="sidebar-right-text">
<div hidden id="sidebar-right-text-export"></div>
<div hidden id="sidebar-right-text-import">
- <p>тут импорт</p>
+ <form id="import-form" class="sidebar-right-text-element">
+ <!--начало формы-->
+ <div class="form-group">
+ <label for="import-before-url">Основное поселение</label>
+ <input type="text" class="form-control" id="import-before-url" placeholder="Идентификатор поселения" required="" readonly="" value="">
+ </div>
+ <div class="form-group">
+ <label for="import-edited-hasBeginning">Дата сведений</label>
+ <div class="input-group">
+ <input type="text" class="form-control" id="import-edited-hasBeginning" placeholder="Год относящейся информации" required="">
+ <div class="input-group-append">
+ <span class="input-group-text">н. э.</span>
+ </div>
+ <div id="edited-hasBeginning-error" class="invalid-feedback">Не верный год.</div>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="import-edited-source">Источник сведений</label>
+ <input type="text" class="form-control" id="import-edited-source" placeholder="URL или другой идентификатор" value="" required="">
+ <div class="invalid-feedback">Ошибка в источнике сведений.</div>
+ </div>
+ <!--необязательные поля-->
+ <div class="form-group">
+ <label for="import-edited-title">Название поселения</label>
+ <input type="text" class="form-control" id="import-edited-title" placeholder="Дополнительное название" value="">
+ <div class="invalid-feedback">Ошибка в названии поселения.</div>
+ </div>
+ <div class="form-group">
+ <label for="import-edited-type">Тип поселения</label>
+ <select id="import-edited-type" class="form-control form-control-sm" size="3">
+ <option value="url_t_1">село</option>
+ <option value="url_t_2">город</option>
+ <option value="url_t_3">станция</option>
+ <option value="url_t_1">разъезд</option>
+ </select>
+ </div>
+ <div class="form-group">
+ <label for="import-edited-region">В составе административной единицы</label>
+ <select id="import-edited-region" class="form-control form-control-sm" size="3">
+ <option value="url_r_1">саратовский регион</option>
+ <option value="url_r_2">энгельсский регион</option>
+ <option value="url_r_3">ершовский регион</option>
+ <option value="url_r_1">аткарский регион</option>
+ </select>
+ </div>
+ <div class="form-group">
+ <label for="import-edited-populationAll">Общее количество населения</label>
+ <input type="text" class="form-control" id="import-edited-populationAll" placeholder="0" value="">
+ <div class="invalid-feedback">Неверное число.</div>
+ </div>
+ <div class="form-group">
+ <label for="import-edited-populationFemale">Количество женского населения</label>
+ <input type="text" class="form-control" id="import-edited-populationFemale" placeholder="0" value="">
+ <div class="invalid-feedback">Неверное число.</div>
+ </div>
+ <div class="form-group">
+ <label for="import-edited-populationMale">Количество мужского населения</label>
+ <input type="text" class="form-control" id="import-edited-populationMale" placeholder="0" value="">
+ <div class="invalid-feedback">Неверное число.</div>
+ </div>
+ <!--конец формы-->
+ </form>
</div>
</div>
</nav>
@@ -73,10 +134,10 @@
<div id="map" style="width: 100%; height: 1000px; padding-left: 0px; "></div>
@*<p>
- <a class="btn btn-primary" data-toggle="collapse" href="#multiCollapseExample1" role="button" aria-expanded="false" aria-controls="multiCollapseExample1">Переключить 1-ый элемент</a>
- <button class="btn btn-primary" type="button" data-toggle="collapse" data-target="#multiCollapseExample2" aria-expanded="false" aria-controls="multiCollapseExample2">Переключить 2-ой элемент</button>
- <button class="btn btn-primary" type="button" data-toggle="collapse" data-target=".multi-collapse" aria-expanded="false" aria-controls="multiCollapseExample1 multiCollapseExample2">Переключить оба элемента</button>
-</p>*@
+ <a class="btn btn-primary" data-toggle="collapse" href="#multiCollapseExample1" role="button" aria-expanded="false" aria-controls="multiCollapseExample1">Переключить 1-ый элемент</a>
+ <button class="btn btn-primary" type="button" data-toggle="collapse" data-target="#multiCollapseExample2" aria-expanded="false" aria-controls="multiCollapseExample2">Переключить 2-ой элемент</button>
+ <button class="btn btn-primary" type="button" data-toggle="collapse" data-target=".multi-collapse" aria-expanded="false" aria-controls="multiCollapseExample1 multiCollapseExample2">Переключить оба элемента</button>
+ </p>*@
<div class="container mt-4">
<div class="row">
@@ -99,18 +160,14 @@
<div class="col-3">
<div class="collapse multi-collapse" id="multiCollapseExample1">
<div class="card border-light" style="max-height: 300px; overflow-y: auto;">
- <ul class="list-group list-group-flush" id="filterGroupTypes">
-
- </ul>
+ <ul class="list-group list-group-flush" id="filterGroupTypes"></ul>
</div>
</div>
</div>
<div class="col">
<div class="collapse multi-collapse" id="multiCollapseExample2">
<div class="card border-light" style="max-height: 300px; overflow-y: auto; overflow-x: auto">
- <ul class="list-group bg-transparent list-group-flush" id="filterGroupRegions">
-
- </ul>
+ <ul class="list-group bg-transparent list-group-flush" id="filterGroupRegions"></ul>
</div>
</div>
</div>
@@ -127,6 +184,9 @@
</script>
}
+<!--этот компонент позволяет скачивать файлы (функция экспорта в word, excel)-->
+<iframe id="my_iframe" style="display:none;"></iframe>
+
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU&apikey=0ea4f7d6-01f0-471d-b717-ada9d94faa49&lang=ru_RU" type="text/javascript"></script>
@section Scripts {@Scripts.Render("~/Scripts/SiteScripts/AjaxQuery.js",
"~/Scripts/SiteScripts/Events.js",
web-map/Views/Shared/_Layout.cshtml 8(+7 -1)
diff --git a/web-map/Views/Shared/_Layout.cshtml b/web-map/Views/Shared/_Layout.cshtml
index a1afbee..79ae6d8 100644
--- a/web-map/Views/Shared/_Layout.cshtml
+++ b/web-map/Views/Shared/_Layout.cshtml
@@ -26,7 +26,7 @@
<a class="nav-link" href="/Home/FAQ">Инструкция</a>
</li>
<li class="nav-item dropdown">
- <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown1" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Аккаунт</a>
+ <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown1" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Модерация</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown1">
@if ((bool)ViewBag.isAuth)
@@ -40,6 +40,9 @@
<form class="px-3 py-3" action="/Account/Login" method="post">
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
+ <small class="form-text">
+ Авторизация необходима для изменения данных о поселениях.
+ </small>
<div class="form-group">
<label for="Login"><b>Login</b></label>
<input type="text" class="form-control" id="Login" name="Login" placeholder="Ваш логин" value="">
@@ -49,6 +52,9 @@
<input type="password" class="form-control" id="Password" name="Password" placeholder="Ваш пароль" value="">
</div>
<button type="submit" class="btn btn-secondary">Вход</button>
+ <small class="form-text">
+ Для получения доступа обратитесь к <span><a href="mailto:salin.dv@protonmail.com" target="_blank">ответственному лицу</a></span>.
+ </small>
</form>
}
</div>
web-map/web-map.csproj 1(+1 -0)
diff --git a/web-map/web-map.csproj b/web-map/web-map.csproj
index b986cad..0091248 100644
--- a/web-map/web-map.csproj
+++ b/web-map/web-map.csproj
@@ -180,6 +180,7 @@
<Content Include="Content\bootstrap-reboot.min.css" />
<Content Include="Content\bootstrap.css" />
<Content Include="Content\bootstrap.min.css" />
+ <Content Include="Content\icon.png" />
<Content Include="Content\jQRangeSlider-iThing.css" />
<Content Include="Content\jquery-ui\jquery-ui.css" />
<Content Include="Content\jquery-ui\jquery-ui.min.css" />