Map
Changes
ModelData/BusinessModel/BusinessDataManager.cs 42(+22 -20)
ModelData/BusinessModel/RDF/Queries.cs 161(+90 -71)
ModelData/Diagrams/ClassDiagram_pic4.cd 115(+77 -38)
ModelData/Diagrams/ClassDiagram_pic5.cd 203(+203 -0)
ModelData/Diagrams/ClassDiagram_pic7.cd 196(+196 -0)
ModelData/Diagrams/ClassDiagram_pic8.cd 215(+215 -0)
ModelData/ModelData.csproj 7(+6 -1)
ModelData/WebModel/Model.cs 2(+1 -1)
ModelData/WebModel/WebDataManager.cs 13(+11 -2)
Tools/Main/Translit.cs 18(+18 -0)
Tools/packages.config 1(+1 -0)
Tools/Tools.csproj 4(+4 -0)
web-map/App_Data/pics/1.png 0(+0 -0)
web-map/App_Data/pics/10.png 0(+0 -0)
web-map/App_Data/pics/11.png 0(+0 -0)
web-map/App_Data/pics/2.png 0(+0 -0)
web-map/App_Data/pics/3.png 0(+0 -0)
web-map/App_Data/pics/4.png 0(+0 -0)
web-map/App_Data/pics/5.png 0(+0 -0)
web-map/App_Data/pics/6.png 0(+0 -0)
web-map/App_Data/pics/7.png 0(+0 -0)
web-map/App_Data/pics/8.png 0(+0 -0)
web-map/App_Data/pics/9.png 0(+0 -0)
web-map/ClassDiagram1.cd 60(+60 -0)
web-map/Content/delete.png 0(+0 -0)
web-map/Content/Site.css 48(+46 -2)
web-map/Controllers/HomeController.cs 11(+4 -7)
web-map/Controllers/MapController.cs 26(+26 -0)
web-map/Scripts/SiteScripts/AjaxQuery.js 28(+25 -3)
web-map/Scripts/SiteScripts/Events.js 58(+32 -26)
web-map/Scripts/SiteScripts/Init.js 32(+18 -14)
web-map/Scripts/SiteScripts/Output.js 114(+86 -28)
web-map/Views/Home/FAQ.cshtml 277(+261 -16)
web-map/Views/Home/Index.cshtml 56(+24 -32)
web-map/Views/Map/Map.cshtml 47(+44 -3)
web-map/Views/Shared/_Layout.cshtml 2(+1 -1)
web-map/web-map.csproj 15(+14 -1)
Details
ModelData/BusinessModel/BusinessDataManager.cs 42(+22 -20)
diff --git a/ModelData/BusinessModel/BusinessDataManager.cs b/ModelData/BusinessModel/BusinessDataManager.cs
index 3a117f8..a71ec25 100644
--- a/ModelData/BusinessModel/BusinessDataManager.cs
+++ b/ModelData/BusinessModel/BusinessDataManager.cs
@@ -39,6 +39,8 @@ namespace ModelData.BusinessModel
private bool needUpdate;
private List<Settlement> infoAboutSettlements;
+ private List<Region> allRegions;
+ private List<SettlementType> allTypes;
#endregion
@@ -48,6 +50,8 @@ namespace ModelData.BusinessModel
{
needUpdate = true;
infoAboutSettlements = new List<Settlement>();
+ allRegions = new List<Region>();
+ allTypes = new List<SettlementType>();
}
#endregion
@@ -103,32 +107,30 @@ namespace ModelData.BusinessModel
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]
- });
+ if (!needUpdate)
+ {
+ if (allRegions.Count != 0)
+ return allRegions.ToArray();
}
- return result.ToArray();
+ else
+ allRegions = new List<Region>();
+ allRegions = new Context().LoadAllRegions();
+
+ return allRegions.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)
+ if (!needUpdate)
{
- result.Add(new SettlementType()
- {
- URL = elem["settlementType"].ToString().Split('^')[0],
- Title = elem["typeName"].ToString().Split('^')[0]
- });
- }
- return result.ToArray();
+ if (allTypes.Count != 0)
+ return allTypes.ToArray();
+ }
+ else
+ allTypes = new List<SettlementType>();
+ allTypes = new Context().LoadAllTypes();
+
+ return allTypes.ToArray();
}
#endregion
diff --git a/ModelData/BusinessModel/ExtraEntities/Source.cs b/ModelData/BusinessModel/ExtraEntities/Source.cs
new file mode 100644
index 0000000..dd8c0ec
--- /dev/null
+++ b/ModelData/BusinessModel/ExtraEntities/Source.cs
@@ -0,0 +1,82 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using ModelData.BusinessModel.BaseAndInterface;
+using Tools;
+
+namespace ModelData.BusinessModel.ExtraEntities
+{
+ /// \addtogroup Entities
+ /// @{
+
+ /// \class Founder
+ ///
+ /// \brief Отражает сущность основателя поселения Помимо наследуемых свойств, описывает
+ /// дополнительную информацию об основателе.
+ ///
+ /// \author Denis
+ /// \date 30.03.2019
+
+ public class Source : I_MySerializable
+ {
+ /// \property public string Title
+ ///
+ /// \brief Нименование источника.
+ /// Установлен атрибут IndexAttrib со значением 0
+ /// \returns The Title.
+
+ [IndexAttrib(0)] public string Title { set; get; }
+
+
+
+ /// \property public List<string> Name
+ ///
+ /// \brief Ссылки на источник в вебе.
+ /// Установлен атрибут IndexAttrib со значением 1
+ /// \returns The URLs.
+
+ [IndexAttrib(2)] public List<string> URLs { set; get; }
+
+
+ /// \property public string Title
+ ///
+ /// \brief Нименование источника.
+ /// Установлен атрибут IndexAttrib со значением 0
+ /// \returns The Title.
+
+ [IndexAttrib(3)] public string Auther { set; get; }
+
+
+
+ /// \fn public override Dictionary<string, string> Serialize()
+ ///
+ /// \brief Метод записи данных о сущности в Dictionary.
+ ///
+ /// \author Denis
+ /// \date 30.03.2019
+ ///
+ /// \returns A Dictionary<string,string>
+
+ public Dictionary<string, string> Serialize()
+ {
+ string r = "";
+ if (URLs != null)
+ foreach (string s in URLs)
+ if (s != null && s != "")
+ r += s;
+
+ return new Dictionary<string, string>()
+ {
+ ["Название"] = this.Title ?? "",
+ ["URL"] = r,
+ ["Автор"] = this.Auther ?? ""
+ };
+ }
+ }
+
+
+ /// @}
+}
diff --git a/ModelData/BusinessModel/MainEntities/EditedSettlement.cs b/ModelData/BusinessModel/MainEntities/EditedSettlement.cs
index d45d660..fd6dab0 100644
--- a/ModelData/BusinessModel/MainEntities/EditedSettlement.cs
+++ b/ModelData/BusinessModel/MainEntities/EditedSettlement.cs
@@ -55,7 +55,7 @@ namespace ModelData.BusinessModel.MainEntities
/// Обязательное свойство. Установлен атрибут IndexAttrib со значением 4
/// \returns The source.
- [IndexAttrib(4)] public string Source { set; get; }
+ [IndexAttrib(4)] public Source Source { set; get; }
#endregion
@@ -169,7 +169,7 @@ namespace ModelData.BusinessModel.MainEntities
/// \param hasBeginning Точный год.
/// \param Source Источник.
- public EditedSettlement(string URL, string before, InstantTime hasBeginning, string Source)
+ public EditedSettlement(string URL, string before, InstantTime hasBeginning, Source Source)
{
this.URL = URL;
this.before = before;
@@ -209,6 +209,7 @@ namespace ModelData.BusinessModel.MainEntities
{
return new Dictionary<string, string>()
{
+ ["Источник"] = Concat(this.Source?.Serialize()) ?? "",
["URL"] = this.URL ?? "",
["Соответствующий год"] = this.hasBeginning.ToString() ?? "",
["В составе региона"] = Concat(this.Region?.Serialize()) ?? "",
diff --git a/ModelData/BusinessModel/MainEntities/SettlementName.cs b/ModelData/BusinessModel/MainEntities/SettlementName.cs
new file mode 100644
index 0000000..57d032a
--- /dev/null
+++ b/ModelData/BusinessModel/MainEntities/SettlementName.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ModelData.BusinessModel.MainEntities
+{
+ /// \addtogroup Entities
+ /// @{
+
+ /// \class SettlementName
+ ///
+ /// \brief Описывает совокупность имени поселения и его url
+ /// Класс описывает совокупность имени поселения и его url, которая необходима для поиска по имени на стороне клиента.
+ /// Это необходимо, т.к. поиск по имени, а несколько одинаковых имен значат один и тот же url.
+ /// При этом на стороне клиента был поиск среди всех имен, а теперь будет фильтр по имени, а поиск по url.
+ /// \warning Этот класс надо более правильно объявить и отнести к другому пространству имен, но мне уже некогда.
+ /// \author Denis
+ /// \date 12.06.2019
+
+ public class SettlementName
+ {
+ /// \brief Отображаемое имя поселения при поиске.
+ public string label;
+
+ /// \brief URL поселения, которое нужно найти на карте.
+ public string value;
+ }
+ /// @}
+}
ModelData/BusinessModel/RDF/Queries.cs 161(+90 -71)
diff --git a/ModelData/BusinessModel/RDF/Queries.cs b/ModelData/BusinessModel/RDF/Queries.cs
index dcea28e..f0b90af 100644
--- a/ModelData/BusinessModel/RDF/Queries.cs
+++ b/ModelData/BusinessModel/RDF/Queries.cs
@@ -27,11 +27,13 @@ namespace ModelData.BusinessModel.RDF
["rdfs"] = "<http://www.w3.org/2000/01/rdf-schema#>",
["owl"] = "<http://www.w3.org/2002/07/owl#>",
["xsd"] = "<http://www.w3.org/2001/XMLSchema#>",
- ["geo"] = "<http://www.w3.org/2003/01/geo/wgs84_pos#>",
+ ["geo"] = "<http://www.w3.org/2003/01/geo/wgs84_pos:>",
["geonames"] = "<http://www.geonames.org/ontology#>",
["time"] = "<https://www.w3.org/2006/time#>",
["map"] = "<http://jena.denhome.keenetic.link/map#>",
- ["foaf"] = "<http://xmlns.com/foaf/0.1/>"
+ ["foaf"] = "<http://xmlns.com/foaf/0.1/>",
+ ["dc"] = "<http://purl.org/dc/elements/1.1/>",
+ ["dcterms"] = "<http://purl.org/dc/terms/>"
};
#endregion
@@ -45,39 +47,45 @@ namespace ModelData.BusinessModel.RDF
///SELECT DISTINCT (?settlement as ?url) ?title ?lat ?long ?settlementType ?typeName ?region ?regionName (?maxc as ?maxPop)
///WHERE
///{
- /// ?settlement a map:Settlement;
- /// geonames:name ?title;
- /// geo:lat ?lat;
- /// geo:long ?long.
- /// OPTIONAL {?settlement time:hasBeginning ?wasFound. ?wasFound time:year ?wasFoundYear}
- /// FILTER (!bound(?wasFound) || ?wasFoundYear >= "from"^^xsd:gYear )
- /// {
- /// SELECT ?settlement (MAX(?populationNotNULL) AS ?maxc)
- /// WHERE
- /// {
- /// ?editedSettlement a map:EditedSettlement; time:before ?settlement; time:hasBeginning ?date.
- /// ?date time:year ?year.
- /// FILTER (?year >= "from"^^xsd:gYear && ?year <= "to"^^xsd:gYear )
- /// OPTIONAL {?editedSettlement geonames:population ?population.}
- /// OPTIONAL {?editedSettlement map:settlementType ?settlementType. ?settlementType geonames:name ?typeName}
- ///
- /// ## заполни переменную ?populationNotNULL так: если ?population НЕ задан (т.е. NULL), тогда 0, иначе (т.е. задан) ?population
- /// BIND (IF (!BOUND(?population), "0"^^xsd:integer, ?population) as ?populationNotNULL)
- /// }
- /// Group by ?settlement
- /// }
- /// {
- /// SELECT ?settlement ?settlementType ?typeName ?region ?regionName
- /// WHERE
- /// {
- /// ?editedSettlement a map:EditedSettlement; time:before ?settlement; time:hasBeginning ?date.
- /// ?date time:year ?year.
- /// FILTER (?year >= "from"^^xsd:gYear && ?year <= "to"^^xsd:gYear )
- /// OPTIONAL {?editedSettlement map:settlementType ?settlementType. ?settlementType geonames:name ?typeName}
- /// OPTIONAL {?editedSettlement rdfs:partOf ?region. ?region geonames:name ?regionName}
- /// }
- /// }
- ///}
+ /// ?settlement a map:Settlement;
+ /// geonames:name ?title;
+ /// geo:lat ?lat;
+ /// geo:long ?long.
+ /// OPTIONAL {?settlement time:hasBeginning ?wasFound. ?wasFound time:year ?wasFoundYear}
+ /// FILTER (!bound(?wasFound) || ?wasFoundYear <= "to"^^xsd:gYear )
+ /// {
+ /// SELECT ?settlement (MAX(?populationNotNULL) AS ?maxc)
+ /// WHERE
+ /// {
+ /// ?editedSettlement a map:EditedSettlement; time:before ?settlement; time:hasBeginning ?dateBegin.
+ /// ?dateBegin time:year ?yearBegin.
+ /// OPTIONAL {?editedSettlement time:hasEnd ?dateEnd. ?dateEnd time:year ?yearEnd.}
+ /// ## датаНачало должна попадать в промежуток до верхней временной границы
+ /// ## а датаКонец либо не указана, либо попадает в промежуток после нижней временно границы
+ /// FILTER (?yearBegin <= "to"^^xsd:gYear && (!bound(?dateEnd) || ?yearEnd > "from"^^xsd:gYear))
+ /// OPTIONAL {?editedSettlement geonames:population ?population.}
+ /// OPTIONAL {?editedSettlement map:settlementType ?settlementType. ?settlementType geonames:name ?typeName}
+ ///
+ /// ## заполни переменную ?populationNotNULL так: если ?population НЕ задан (т.е. NULL), тогда 0, иначе (т.е. задан) ?population
+ /// BIND (IF (!BOUND(?population), "0"^^xsd:integer, ?population) as ?populationNotNULL)
+ /// }
+ /// Group by ?settlement
+ /// }
+ /// {
+ /// SELECT ?settlement ?settlementType ?typeName ?region ?regionName
+ /// WHERE
+ /// {
+ /// ?editedSettlement a map:EditedSettlement; time:before ?settlement; time:hasBeginning ?dateBegin.
+ /// ?dateBegin time:year ?yearBegin.
+ /// OPTIONAL {?editedSettlement time:hasEnd ?dateEnd. ?dateEnd time:year ?yearEnd.}
+ /// ## датаНачало должна попадать в промежуток до верхней временной границы
+ /// ## а датаКонец либо не указана, либо попадает в промежуток после нижней временно границы
+ /// FILTER (?yearBegin <= "to"^^xsd:gYear && (!bound(?dateEnd) || ?yearEnd > "from"^^xsd:gYear))
+ /// OPTIONAL {?editedSettlement map:settlementType ?settlementType. ?settlementType geonames:name ?typeName}
+ /// OPTIONAL {?editedSettlement rdfs:partOf ?region. ?region geonames:name ?regionName}
+ /// }
+ /// }
+ ///}
/// \endcode
/// \author Denis
/// \date 31.03.2019
@@ -91,41 +99,48 @@ namespace ModelData.BusinessModel.RDF
{
return GetAllPrefixes() +
@"
- SELECT DISTINCT (?settlement as ?url) ?title ?lat ?long ?settlementType ?typeName ?region ?regionName (?maxc as ?maxPop)
+SELECT DISTINCT (?settlement as ?url) ?title ?lat ?long ?settlementType ?typeName ?region ?regionName (?maxc as ?maxPop)
WHERE
- {
- ?settlement a map:Settlement;
- geonames:name ?title;
- geo:lat ?lat; geo:long ?long.
- OPTIONAL {?settlement time:hasBeginning ?wasFound. ?wasFound time:year ?wasFoundYear}
- FILTER (!bound(?wasFound) || ?wasFoundYear >= " + '"' + from + '"' + @"^^xsd:gYear )
- {
- SELECT ?settlement (MAX(?populationNotNULL) AS ?maxc)
- WHERE
- {
- ?editedSettlement a map:EditedSettlement; time:before ?settlement; time:hasBeginning ?date.
- ?date time:year ?year.
- FILTER (?year >= " + '"' + from + '"' + @"^^xsd:gYear && ?year <= " + '"' + to + '"' + @"^^xsd:gYear )
- OPTIONAL {?editedSettlement geonames:population ?population.}
- OPTIONAL {?editedSettlement map:settlementType ?settlementType. ?settlementType geonames:name ?typeName}
-
- ## заполни переменную ?populationNotNULL так: если ?population НЕ задан (т.е. NULL), тогда 0, иначе (т.е. задан) ?population
- BIND (IF (!BOUND(?population), " + "\"0\"" + @"^^xsd:integer, ?population) as ?populationNotNULL)
+{
+ ?settlement a map:Settlement;
+ geonames:name ?title;
+ geo:lat ?lat;
+ geo:long ?long.
+ OPTIONAL {?settlement time:hasBeginning ?wasFound. ?wasFound time:year ?wasFoundYear}
+ FILTER (!bound(?wasFound) || ?wasFoundYear <= " + '"' + to + '"' + @"^^xsd:gYear )
+ {
+ SELECT ?settlement (MAX(?populationNotNULL) AS ?maxc)
+ WHERE
+ {
+ ?editedSettlement a map:EditedSettlement; time:before ?settlement; time:hasBeginning ?dateBegin.
+ ?dateBegin time:year ?yearBegin.
+ OPTIONAL {?editedSettlement time:hasEnd ?dateEnd. ?dateEnd time:year ?yearEnd.}
+ ## датаНачало должна попадать в промежуток до верхней временной границы
+ ## а датаКонец либо не указана, либо попадает в промежуток после нижней временно границы
+ FILTER (?yearBegin <= " + '"' + to + '"' + @"^^xsd:gYear && (!bound(?dateEnd) || ?yearEnd > " + '"' + from + '"' + @"^^xsd:gYear))
+ OPTIONAL {?editedSettlement geonames:population ?population.}
+ OPTIONAL {?editedSettlement map:settlementType ?settlementType. ?settlementType geonames:name ?typeName}
+
+ ## заполни переменную ?populationNotNULL так: если ?population НЕ задан (т.е. NULL), тогда 0, иначе (т.е. задан) ?population
+ BIND (IF (!BOUND(?population), " + "\"0\"" + @"^^xsd:integer, ?population) as ?populationNotNULL)
+ }
+ Group by ?settlement
}
- Group by ?settlement
- }
- {
- SELECT ?settlement ?settlementType ?typeName ?region ?regionName
- WHERE
- {
- ?editedSettlement a map:EditedSettlement; time:before ?settlement; time:hasBeginning ?date.
- ?date time:year ?year.
- FILTER (?year >= " + '"' + from + '"' + @"^^xsd:gYear && ?year <= " + '"' + to + '"' + @"^^xsd:gYear )
- OPTIONAL {?editedSettlement map:settlementType ?settlementType. ?settlementType geonames:name ?typeName}
- OPTIONAL {?editedSettlement rdfs:partOf ?region. ?region geonames:name ?regionName}
+ {
+ SELECT ?settlement ?settlementType ?typeName ?region ?regionName
+ WHERE
+ {
+ ?editedSettlement a map:EditedSettlement; time:before ?settlement; time:hasBeginning ?dateBegin.
+ ?dateBegin time:year ?yearBegin.
+ OPTIONAL {?editedSettlement time:hasEnd ?dateEnd. ?dateEnd time:year ?yearEnd.}
+ ## датаНачало должна попадать в промежуток до верхней временной границы
+ ## а датаКонец либо не указана, либо попадает в промежуток после нижней временно границы
+ FILTER (?yearBegin <= " + '"' + to + '"' + @"^^xsd:gYear && (!bound(?dateEnd) || ?yearEnd > " + '"' + from + '"' + @"^^xsd:gYear))
+ OPTIONAL {?editedSettlement map:settlementType ?settlementType. ?settlementType geonames:name ?typeName}
+ OPTIONAL {?editedSettlement rdfs:partOf ?region. ?region geonames:name ?regionName}
+ }
}
- }
- }
+}
";
}
@@ -135,7 +150,7 @@ WHERE
///
/// \brief Полная информация о поселении
/// \code
- ///SELECT DISTINCT ?title ?lat ?long ?wasFoundYear ?legend ?founder ?person ?foundersRegion ?editedSettlement ?source ?year ?settlementType ?typeName ?region ?regionName ?editedName ?alternateName ?population ?populationFemales ?populationMales
+ ///SELECT DISTINCT ?title ?lat ?long ?wasFoundYear ?legend ?founder ?person ?foundersRegion ?editedSettlement ?sourceURL ?sourceTitle ?sourceCreator ?year ?settlementType ?typeName ?region ?regionName ?editedName ?alternateName ?population ?populationFemales ?populationMales
///WHERE
///{
/// {
@@ -160,9 +175,11 @@ WHERE
/// {
/// ?editedSettlement a map:EditedSettlement;
/// time:before url_;
- /// map:source ?source;
+ /// dc:source ?source;
/// time:hasBeginning ?date.
/// ?date time:year ?year.
+ /// ?source a dcterms:bibliographicResource; dc:identifier ?sourceURL; dc:title ?sourceTitle.
+ /// OPTIONAL {?source dc:creator? sourceCreator.}
/// OPTIONAL {?editedSettlement map:settlementType ?settlementType. ?settlementType geonames:name ?typeName}
/// OPTIONAL {?editedSettlement rdfs:partOf ?region. ?region geonames:name ?regionName}
/// OPTIONAL {?editedSettlement geonames:name ?editedName.}
@@ -187,7 +204,7 @@ WHERE
string url_ = GetObjFromURL(URL);
return GetAllPrefixes() +
-@"SELECT DISTINCT ?title ?lat ?long ?wasFoundYear ?legend ?founder ?person ?foundersRegion ?editedSettlement ?source ?year ?settlementType ?typeName ?region ?regionName ?editedName ?alternateName ?population ?populationFemales ?populationMales
+@"SELECT DISTINCT ?title ?lat ?long ?wasFoundYear ?legend ?founder ?person ?foundersRegion ?editedSettlement ?sourceURL ?sourceTitle ?sourceCreator ?year ?settlementType ?typeName ?region ?regionName ?editedName ?alternateName ?population ?populationFemales ?populationMales
WHERE
{
{
@@ -212,9 +229,11 @@ WHERE
{
?editedSettlement a map:EditedSettlement;
time:before " + url_ + @";
- map:source ?source;
+ dc:source ?source;
time:hasBeginning ?date.
?date time:year ?year.
+ ?source a dcterms:bibliographicResource; dc:identifier ?sourceURL; dc:title ?sourceTitle.
+ OPTIONAL {?source dc:creator ?sourceCreator.}
OPTIONAL {?editedSettlement map:settlementType ?settlementType. ?settlementType geonames:name ?typeName}
OPTIONAL {?editedSettlement rdfs:partOf ?region. ?region geonames:name ?regionName}
OPTIONAL {?editedSettlement geonames:name ?editedName.}
diff --git a/ModelData/BusinessModel/UnitOfWork/Context.cs b/ModelData/BusinessModel/UnitOfWork/Context.cs
index 8a110b0..94147dc 100644
--- a/ModelData/BusinessModel/UnitOfWork/Context.cs
+++ b/ModelData/BusinessModel/UnitOfWork/Context.cs
@@ -46,7 +46,7 @@ namespace ModelData.BusinessModel.UnitOfWork
{
URL = str,
Title = Convert(elem["title"])/*elem["title"].ToString()*/,
- Position = Convert(elem["long"]) + " " + Convert(elem["lat"]),
+ Position = Convert(elem["lat"]) + " " + Convert(elem["long"]),
Population = Int32.Parse(Convert(elem["maxPop"]))
};
MapPoints.Add(mapPoint);
@@ -101,13 +101,14 @@ namespace ModelData.BusinessModel.UnitOfWork
List<EditedSettlement> listEdited = new List<EditedSettlement>();
var lst_query = RDFQuery.GetData(RDFQuery.QueryType.SettlementInfo, new string[] { URL });
+
foreach (var elem in lst_query)
{
- // title lat long wasFoundYear legend founder person foundersRegion editedSettlement source year settlementType typeName region regionName editedName alternateName population populationFemales populationMales
+ // title lat long wasFoundYear legend founder person foundersRegion editedSettlement sourceURL sourceTitle sourceCreator year settlementType typeName region regionName editedName alternateName population populationFemales populationMales
if (elem["editedSettlement"] == null)
{
- settlement = new Settlement(URL, elem["title"].ToString(), new Coordinate(elem["long"], elem["lat"]));
+ settlement = new Settlement(URL, elem["title"].ToString(), new Coordinate(elem["lat"], elem["long"]));
if (elem["wasFoundYear"] != null)
settlement.hasBeginning = new InstantTime(Convert(elem["wasFoundYear"]));
@@ -129,12 +130,18 @@ namespace ModelData.BusinessModel.UnitOfWork
continue;
}
+
edited = new EditedSettlement
(
elem["editedSettlement"].ToString(),
settlement.URL,
new InstantTime(Convert(elem["year"])),
- elem["source"].ToString()
+ new Source
+ {
+ Title = elem["sourceTitle"].ToString(),
+ URLs = new List<string> { elem["sourceURL"].ToString() },
+ Auther = (elem["sourceCreator"] != null) ? Convert(elem["sourceCreator"]) : ""
+ }
);
if (elem["editedName"] != null)
@@ -166,14 +173,48 @@ namespace ModelData.BusinessModel.UnitOfWork
Title = Convert(elem["typeName"])
};
- listEdited.Add(edited);
+ // Если в результате существования нескольких URL у Source происходит дублирование EditedSettlements
+ // То сначала будет добавлен новый экземпляр EditedSettlement'а, а потом наткнемся на его копию, у которой URL источника другой
+ // Тогда просто впишем URL в существующий источник
+ var wasAdded = listEdited.Find(e => e.URL == edited.URL);
+ if (wasAdded == null)
+ listEdited.Add(edited);
+ else
+ wasAdded.Source.URLs.AddRange(edited.Source.URLs);
}
-
settlement.EditedSettlements = listEdited;
return settlement;
}
+ public List<Region> LoadAllRegions()
+ {
+ var query_result = RDFQuery.GetData(RDFQuery.QueryType.AllRegions, new string[] { });
+ foreach (var elem in query_result)
+ {
+ Regions.Add(new Region()
+ {
+ URL = Convert(elem["region"]),
+ Title = Convert(elem["regionName"])
+ });
+ }
+ return Regions;
+ }
+
+ public List<SettlementType> LoadAllTypes()
+ {
+ var query_result = RDFQuery.GetData(RDFQuery.QueryType.AllSettlementTypes, new string[] { });
+ foreach (var elem in query_result)
+ {
+ SettlementTypes.Add(new SettlementType()
+ {
+ URL = Convert(elem["settlementType"]),
+ Title = Convert(elem["typeName"])
+ });
+ }
+ return SettlementTypes;
+ }
+
#region Tools
private string GetValue(VDS.RDF.Query.SparqlResult elem, string value)
ModelData/Diagrams/ClassDiagram_pic5.cd 203(+203 -0)
diff --git a/ModelData/Diagrams/ClassDiagram_pic5.cd b/ModelData/Diagrams/ClassDiagram_pic5.cd
new file mode 100644
index 0000000..a7a7936
--- /dev/null
+++ b/ModelData/Diagrams/ClassDiagram_pic5.cd
@@ -0,0 +1,203 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ClassDiagram MajorVersion="1" MinorVersion="1" MembersFormat="NameAndType">
+ <Class Name="ModelData.BusinessModel.BaseAndInterface.BaseOntologyEntity">
+ <Position X="9.25" Y="3.75" Width="1.5" />
+ <TypeIdentifier>
+ <HashCode>EAAAAAAAAAAAAEAAAAAAAAAAACAAAAAAAAAAAAAAAAA=</HashCode>
+ <FileName>BusinessModel\BaseAndInterface\BaseOntologyEntity.cs</FileName>
+ </TypeIdentifier>
+ <Lollipop Orientation="Bottom" Position="0.589" />
+ </Class>
+ <Class Name="ModelData.BusinessModel.BusinessDataManager">
+ <Position X="21" Y="5.5" Width="3" />
+ <TypeIdentifier>
+ <HashCode>IAQEIABAAAAAAQBAAAIAAAAAAABAIAAAAAACACAAhBA=</HashCode>
+ <FileName>BusinessModel\BusinessDataManager.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.ExtraEntities.Founder">
+ <Position X="12.75" Y="5.5" Width="2.75" />
+ <InheritanceLine Type="ModelData.BusinessModel.BaseAndInterface.BaseOntologyEntity" FixedFromPoint="true" FixedToPoint="true">
+ <Path>
+ <Point X="10.75" Y="5.25" />
+ <Point X="11.125" Y="5.25" />
+ <Point X="11.125" Y="5.812" />
+ <Point X="12.467" Y="5.812" Type="JumpStart" />
+ <Point X="12.633" Y="5.812" Type="JumpEnd" />
+ <Point X="12.75" Y="5.812" />
+ </Path>
+ </InheritanceLine>
+ <TypeIdentifier>
+ <HashCode>AAAAAAAAAAAAAACAAAAAAAQAACAAAAAAAAAAAAAACAA=</HashCode>
+ <FileName>BusinessModel\ExtraEntities\Founder.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.ExtraEntities.Region" Collapsed="true">
+ <Position X="19" Y="6" Width="1.5" />
+ <TypeIdentifier>
+ <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAgAAAAAAAAA=</HashCode>
+ <FileName>BusinessModel\ExtraEntities\Region.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.ExtraEntities.SettlementType" Collapsed="true">
+ <Position X="19" Y="6.75" Width="1.5" />
+ <InheritanceLine Type="ModelData.BusinessModel.BaseAndInterface.BaseOntologyEntity" FixedFromPoint="true" FixedToPoint="true">
+ <Path>
+ <Point X="10.5" Y="3.75" />
+ <Point X="10.5" Y="3.375" />
+ <Point X="18.625" Y="3.375" />
+ <Point X="18.625" Y="7.348" />
+ <Point X="19" Y="7.348" />
+ </Path>
+ </InheritanceLine>
+ <TypeIdentifier>
+ <HashCode>AAAAAAAAAAAgAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQ=</HashCode>
+ <FileName>BusinessModel\ExtraEntities\SettlementType.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.MainEntities.EditedSettlement">
+ <Position X="5.25" Y="0.5" Width="2.75" />
+ <InheritanceLine Type="ModelData.BusinessModel.BaseAndInterface.BaseOntologyEntity" ManuallyRouted="true" FixedFromPoint="true" FixedToPoint="true">
+ <Path>
+ <Point X="9.25" Y="4.25" />
+ <Point X="8.333" Y="4.25" />
+ <Point X="8.333" Y="3.312" />
+ <Point X="8" Y="3.312" />
+ </Path>
+ </InheritanceLine>
+ <TypeIdentifier>
+ <HashCode>BAAAAAAAggAAAAAAABAAAAAAACCAAAAAEQACAAAAAAY=</HashCode>
+ <FileName>BusinessModel\MainEntities\EditedSettlement.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.MainEntities.MapPoint" Collapsed="true">
+ <Position X="19" Y="4.5" Width="1.5" />
+ <InheritanceLine Type="ModelData.BusinessModel.BaseAndInterface.BaseOntologyEntity" FixedFromPoint="true">
+ <Path>
+ <Point X="9.625" Y="3.75" />
+ <Point X="9.625" Y="3.375" />
+ <Point X="18.625" Y="3.375" />
+ <Point X="18.625" Y="4.846" />
+ <Point X="19" Y="4.846" />
+ </Path>
+ </InheritanceLine>
+ <TypeIdentifier>
+ <HashCode>AAAAAAAAgAAAAAQoAAAAAAAAACAAAAAAAQAAAAAAAAA=</HashCode>
+ <FileName>BusinessModel\MainEntities\MapPoint.cs</FileName>
+ </TypeIdentifier>
+ <Lollipop Orientation="Left" Position="0.1" />
+ </Class>
+ <Class Name="ModelData.BusinessModel.MainEntities.Settlement" Collapsed="true">
+ <Position X="19" Y="5.25" Width="1.5" />
+ <TypeIdentifier>
+ <HashCode>BAAAACAAAAAABAAAABAAAAAAACAAAAAAAAACAADAAAA=</HashCode>
+ <FileName>BusinessModel\MainEntities\Settlement.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.RDF.Queries">
+ <Position X="24.25" Y="2.25" Width="2.75" />
+ <TypeIdentifier>
+ <HashCode>IAAEAAAAACAEAgAAAAAAMAAAAAAAIAAAAIAAACAAAAA=</HashCode>
+ <FileName>BusinessModel\RDF\Queries.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.RDF.RDFQuery">
+ <Position X="24.5" Y="5.75" Width="2.25" />
+ <Compartments>
+ <Compartment Name="Nested Types" Collapsed="false" />
+ </Compartments>
+ <NestedTypes>
+ <Enum Name="ModelData.BusinessModel.RDF.RDFQuery.QueryType">
+ <TypeIdentifier>
+ <NewMemberFileName>BusinessModel\RDF\RDFQuery.cs</NewMemberFileName>
+ </TypeIdentifier>
+ </Enum>
+ </NestedTypes>
+ <TypeIdentifier>
+ <HashCode>AAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
+ <FileName>BusinessModel\RDF\RDFQuery.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.Tools.Coordinate">
+ <Position X="10.25" Y="8" Width="2.5" />
+ <TypeIdentifier>
+ <HashCode>AAAAAAEAACAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
+ <FileName>BusinessModel\Tools\Coordinate.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.Tools.InstantTime">
+ <Position X="5.25" Y="8" Width="2.5" />
+ <TypeIdentifier>
+ <HashCode>AAAEAAAABAAAAAAEAAAAAAAAAAAAAAAAAAACAAAAAAA=</HashCode>
+ <FileName>BusinessModel\Tools\InstantTime.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.Tools.Period">
+ <Position X="8.25" Y="8" Width="1.75" />
+ <TypeIdentifier>
+ <HashCode>AAIAAAAAAAAAAAAEAAAAAAAAAAAAEAAAAAAAAAAAAAA=</HashCode>
+ <FileName>BusinessModel\Tools\Period.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.UnitOfWork.Context">
+ <Position X="21" Y="2.25" Width="3" />
+ <TypeIdentifier>
+ <HashCode>AAIAAQAAIAAAAAAAAIAAIACAAAAAIAAAACAAAAAAABA=</HashCode>
+ <FileName>BusinessModel\UnitOfWork\Context.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.WebModel.Model">
+ <Position X="13.75" Y="8" Width="2.75" />
+ <TypeIdentifier>
+ <HashCode>AAAAIAAAAABAAAAAAAAAAAAACACEAAAAAAACAAAAAAA=</HashCode>
+ <FileName>WebModel\Model.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.WebModel.WebDataManager">
+ <Position X="13.75" Y="10.75" Width="3" />
+ <TypeIdentifier>
+ <HashCode>AAEAAAQAAAAAAQBAAAAAAAAAAABAIAAAAAAKAAAAgAA=</HashCode>
+ <FileName>WebModel\WebDataManager.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="Tools.Config.ConfigManager">
+ <Position X="1.25" Y="1.75" Width="2.5" />
+ <TypeIdentifier />
+ </Class>
+ <Class Name="Tools.IndexAttrib">
+ <Position X="3.25" Y="0.75" Width="1.5" />
+ <TypeIdentifier />
+ </Class>
+ <Class Name="Tools.SerializeService">
+ <Position X="1.5" Y="7" Width="2.5" />
+ <TypeIdentifier />
+ </Class>
+ <Class Name="Tools.Users.User">
+ <Position X="1.5" Y="0.5" Width="1.5" />
+ <TypeIdentifier />
+ </Class>
+ <Class Name="Tools.Users.UserContext">
+ <Position X="2.25" Y="3.25" Width="1.5" />
+ <TypeIdentifier />
+ </Class>
+ <Class Name="Tools.Word.DocXWrite">
+ <Position X="1.25" Y="5.5" Width="2.75" />
+ <TypeIdentifier />
+ </Class>
+ <Interface Name="ModelData.BusinessModel.BaseAndInterface.I_URLcs">
+ <Position X="11.25" Y="6.25" Width="1.25" />
+ <TypeIdentifier>
+ <HashCode>AAAAAAAAAAAAAEAAAAAAAAAAACAAAAAAAAAAAAAAAAA=</HashCode>
+ <FileName>BusinessModel\BaseAndInterface\I_URLcs.cs</FileName>
+ </TypeIdentifier>
+ </Interface>
+ <Interface Name="Tools.I_MySerializable">
+ <Position X="8.5" Y="6.25" Width="2.5" />
+ <TypeIdentifier />
+ </Interface>
+ <Interface Name="System.IComparable<T>">
+ <Position X="12.75" Y="0.5" Width="1.5" />
+ <TypeIdentifier />
+ </Interface>
+ <Font Name="Segoe UI" Size="9" />
+</ClassDiagram>
\ No newline at end of file
ModelData/Diagrams/ClassDiagram_pic7.cd 196(+196 -0)
diff --git a/ModelData/Diagrams/ClassDiagram_pic7.cd b/ModelData/Diagrams/ClassDiagram_pic7.cd
new file mode 100644
index 0000000..a118c8c
--- /dev/null
+++ b/ModelData/Diagrams/ClassDiagram_pic7.cd
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ClassDiagram MajorVersion="1" MinorVersion="1" MembersFormat="NameAndType">
+ <Class Name="ModelData.BusinessModel.BaseAndInterface.BaseOntologyEntity">
+ <Position X="9.25" Y="3.75" Width="1.5" />
+ <TypeIdentifier>
+ <HashCode>EAAAAAAAAAAAAEAAAAAAAAAAACAAAAAAAAAAAAAAAAA=</HashCode>
+ <FileName>BusinessModel\BaseAndInterface\BaseOntologyEntity.cs</FileName>
+ </TypeIdentifier>
+ <Lollipop Orientation="Bottom" Position="0.589" />
+ </Class>
+ <Class Name="ModelData.BusinessModel.BusinessDataManager" Collapsed="true">
+ <Position X="20.75" Y="5.5" Width="2.75" />
+ <TypeIdentifier>
+ <HashCode>IAQEIABAAAAAAQBAAAIAAAAAAABAIAAAAAACACAAhBA=</HashCode>
+ <FileName>BusinessModel\BusinessDataManager.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.ExtraEntities.Founder">
+ <Position X="12.75" Y="5.5" Width="2.75" />
+ <InheritanceLine Type="ModelData.BusinessModel.BaseAndInterface.BaseOntologyEntity" FixedFromPoint="true" FixedToPoint="true">
+ <Path>
+ <Point X="10.75" Y="5.25" />
+ <Point X="11.125" Y="5.25" />
+ <Point X="11.125" Y="5.812" />
+ <Point X="12.75" Y="5.812" />
+ </Path>
+ </InheritanceLine>
+ <TypeIdentifier>
+ <HashCode>AAAAAAAAAAAAAACAAAAAAAQAACAAAAAAAAAAAAAACAA=</HashCode>
+ <FileName>BusinessModel\ExtraEntities\Founder.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.ExtraEntities.Region">
+ <Position X="12.75" Y="3.75" Width="2.75" />
+ <TypeIdentifier>
+ <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAgAAAAAAAAA=</HashCode>
+ <FileName>BusinessModel\ExtraEntities\Region.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.ExtraEntities.SettlementType">
+ <Position X="11.25" Y="1.75" Width="3" />
+ <InheritanceLine Type="ModelData.BusinessModel.BaseAndInterface.BaseOntologyEntity" FixedFromPoint="true" FixedToPoint="true">
+ <Path>
+ <Point X="10.5" Y="3.75" />
+ <Point X="10.5" Y="3.375" />
+ <Point X="11.25" Y="3.375" />
+ </Path>
+ </InheritanceLine>
+ <TypeIdentifier>
+ <HashCode>AAAAAAAAAAAgAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQ=</HashCode>
+ <FileName>BusinessModel\ExtraEntities\SettlementType.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.MainEntities.EditedSettlement">
+ <Position X="5.25" Y="0.5" Width="2.75" />
+ <InheritanceLine Type="ModelData.BusinessModel.BaseAndInterface.BaseOntologyEntity" ManuallyRouted="true" FixedFromPoint="true" FixedToPoint="true">
+ <Path>
+ <Point X="9.25" Y="4.25" />
+ <Point X="8.333" Y="4.25" />
+ <Point X="8.333" Y="3.312" />
+ <Point X="8" Y="3.312" />
+ </Path>
+ </InheritanceLine>
+ <TypeIdentifier>
+ <HashCode>BAAAAAAAggAAAAAAABAAAAAAACCAAAAAEQACAAAAAAY=</HashCode>
+ <FileName>BusinessModel\MainEntities\EditedSettlement.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.MainEntities.MapPoint">
+ <Position X="8.25" Y="0.5" Width="2.75" />
+ <InheritanceLine Type="ModelData.BusinessModel.BaseAndInterface.BaseOntologyEntity" FixedFromPoint="true">
+ <Path>
+ <Point X="9.625" Y="3.75" />
+ <Point X="9.625" Y="3.146" />
+ </Path>
+ </InheritanceLine>
+ <TypeIdentifier>
+ <HashCode>AAAAAAAAgAAAAAQoAAAAAAAAACAAAAAAAQAAAAAAAAA=</HashCode>
+ <FileName>BusinessModel\MainEntities\MapPoint.cs</FileName>
+ </TypeIdentifier>
+ <Lollipop Orientation="Right" Position="0.1" />
+ </Class>
+ <Class Name="ModelData.BusinessModel.MainEntities.Settlement">
+ <Position X="5.25" Y="4.5" Width="3" />
+ <TypeIdentifier>
+ <HashCode>BAAAACAAAAAABAAAABAAAAAAACAAAAAAAAACAADAAAA=</HashCode>
+ <FileName>BusinessModel\MainEntities\Settlement.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.RDF.Queries">
+ <Position X="23.75" Y="1.75" Width="2.75" />
+ <TypeIdentifier>
+ <HashCode>IAAEAAAAACAEAgAAAAAAMAAAAAAAIAAAAIAAACAAAAA=</HashCode>
+ <FileName>BusinessModel\RDF\Queries.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.RDF.RDFQuery">
+ <Position X="21" Y="1.75" Width="2.25" />
+ <Compartments>
+ <Compartment Name="Nested Types" Collapsed="false" />
+ </Compartments>
+ <NestedTypes>
+ <Enum Name="ModelData.BusinessModel.RDF.RDFQuery.QueryType">
+ <TypeIdentifier>
+ <NewMemberFileName>BusinessModel\RDF\RDFQuery.cs</NewMemberFileName>
+ </TypeIdentifier>
+ </Enum>
+ </NestedTypes>
+ <TypeIdentifier>
+ <HashCode>AAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
+ <FileName>BusinessModel\RDF\RDFQuery.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.Tools.Coordinate">
+ <Position X="10.25" Y="8" Width="2.5" />
+ <TypeIdentifier>
+ <HashCode>AAAAAAEAACAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
+ <FileName>BusinessModel\Tools\Coordinate.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.Tools.InstantTime">
+ <Position X="5.25" Y="8" Width="2.5" />
+ <TypeIdentifier>
+ <HashCode>AAAEAAAABAAAAAAEAAAAAAAAAAAAAAAAAAACAAAAAAA=</HashCode>
+ <FileName>BusinessModel\Tools\InstantTime.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.Tools.Period">
+ <Position X="8.25" Y="8" Width="1.75" />
+ <TypeIdentifier>
+ <HashCode>AAIAAAAAAAAAAAAEAAAAAAAAAAAAEAAAAAAAAAAAAAA=</HashCode>
+ <FileName>BusinessModel\Tools\Period.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.UnitOfWork.Context">
+ <Position X="24.25" Y="5.5" Width="3" />
+ <TypeIdentifier>
+ <HashCode>AAIAAQAAIAAAAAAAAIAAIACAAAAAIAAAACAAAAAAABA=</HashCode>
+ <FileName>BusinessModel\UnitOfWork\Context.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.WebModel.Model">
+ <Position X="20.75" Y="6.25" Width="2.75" />
+ <TypeIdentifier>
+ <HashCode>AAAAIAAAAABAAAAAAAAAAAAACACEAAAAAAACAAAAAAA=</HashCode>
+ <FileName>WebModel\Model.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.WebModel.WebDataManager">
+ <Position X="17.5" Y="5.5" Width="3" />
+ <TypeIdentifier>
+ <HashCode>AAEAAAQAAAAAAQBAAAAAAAAAAABAIAAAAAAKAAAAgAA=</HashCode>
+ <FileName>WebModel\WebDataManager.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="Tools.Config.ConfigManager">
+ <Position X="1.25" Y="1.75" Width="2.5" />
+ <TypeIdentifier />
+ </Class>
+ <Class Name="Tools.IndexAttrib">
+ <Position X="3.25" Y="0.75" Width="1.5" />
+ <TypeIdentifier />
+ </Class>
+ <Class Name="Tools.SerializeService">
+ <Position X="1.5" Y="7" Width="2.5" />
+ <TypeIdentifier />
+ </Class>
+ <Class Name="Tools.Users.User">
+ <Position X="1.25" Y="0.5" Width="1.5" />
+ <TypeIdentifier />
+ </Class>
+ <Class Name="Tools.Users.UserContext">
+ <Position X="2.25" Y="3.25" Width="1.5" />
+ <TypeIdentifier />
+ </Class>
+ <Class Name="Tools.Word.DocXWrite">
+ <Position X="1.25" Y="5.5" Width="2.75" />
+ <TypeIdentifier />
+ </Class>
+ <Interface Name="ModelData.BusinessModel.BaseAndInterface.I_URLcs">
+ <Position X="11.25" Y="6.25" Width="1.25" />
+ <TypeIdentifier>
+ <HashCode>AAAAAAAAAAAAAEAAAAAAAAAAACAAAAAAAAAAAAAAAAA=</HashCode>
+ <FileName>BusinessModel\BaseAndInterface\I_URLcs.cs</FileName>
+ </TypeIdentifier>
+ </Interface>
+ <Interface Name="Tools.I_MySerializable">
+ <Position X="8.5" Y="6.25" Width="2.5" />
+ <TypeIdentifier />
+ </Interface>
+ <Interface Name="System.IComparable<T>">
+ <Position X="12.75" Y="0.5" Width="1.5" />
+ <TypeIdentifier />
+ </Interface>
+ <Font Name="Segoe UI" Size="9" />
+</ClassDiagram>
\ No newline at end of file
ModelData/Diagrams/ClassDiagram_pic8.cd 215(+215 -0)
diff --git a/ModelData/Diagrams/ClassDiagram_pic8.cd b/ModelData/Diagrams/ClassDiagram_pic8.cd
new file mode 100644
index 0000000..7aa06a7
--- /dev/null
+++ b/ModelData/Diagrams/ClassDiagram_pic8.cd
@@ -0,0 +1,215 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ClassDiagram MajorVersion="1" MinorVersion="1" MembersFormat="NameAndType">
+ <Class Name="ModelData.BusinessModel.BaseAndInterface.BaseOntologyEntity" Collapsed="true">
+ <Position X="7.5" Y="2.25" Width="1.5" />
+ <TypeIdentifier>
+ <HashCode>EAAAAAAAAAAAAEAAAAAAAAAAACAAAAAAAAAAAAAAAAA=</HashCode>
+ <FileName>BusinessModel\BaseAndInterface\BaseOntologyEntity.cs</FileName>
+ </TypeIdentifier>
+ <Lollipop Orientation="Bottom" Position="0.589" Collapsed="true" />
+ </Class>
+ <Class Name="ModelData.BusinessModel.BusinessDataManager" Collapsed="true">
+ <Position X="10" Y="6" Width="1.75" />
+ <TypeIdentifier>
+ <HashCode>IAQEIABAAAAAAQBAAAIAAAAAAABAIAAAAAACACAAhBA=</HashCode>
+ <FileName>BusinessModel\BusinessDataManager.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.ExtraEntities.Founder" Collapsed="true">
+ <Position X="5.25" Y="4.25" Width="1.5" />
+ <InheritanceLine Type="ModelData.BusinessModel.BaseAndInterface.BaseOntologyEntity" FixedFromPoint="true" FixedToPoint="true">
+ <Path>
+ <Point X="7.5" Y="2.5" />
+ <Point X="7.125" Y="2.5" />
+ <Point X="7.125" Y="4.562" />
+ <Point X="6.75" Y="4.562" />
+ </Path>
+ </InheritanceLine>
+ <TypeIdentifier>
+ <HashCode>AAAAAAAAAAAAAACAAAAAAAQAACAAAAAAAAAAAAAACAA=</HashCode>
+ <FileName>BusinessModel\ExtraEntities\Founder.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.ExtraEntities.Region" Collapsed="true">
+ <Position X="5.25" Y="2.75" Width="1.5" />
+ <InheritanceLine Type="ModelData.BusinessModel.BaseAndInterface.BaseOntologyEntity" FixedFromPoint="true">
+ <Path>
+ <Point X="7.5" Y="2.5" />
+ <Point X="7.125" Y="2.5" />
+ <Point X="7.125" Y="3.096" />
+ <Point X="6.75" Y="3.096" />
+ </Path>
+ </InheritanceLine>
+ <TypeIdentifier>
+ <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAgAAAAAAAAA=</HashCode>
+ <FileName>BusinessModel\ExtraEntities\Region.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.ExtraEntities.SettlementType" Collapsed="true">
+ <Position X="5.25" Y="3.5" Width="1.5" />
+ <InheritanceLine Type="ModelData.BusinessModel.BaseAndInterface.BaseOntologyEntity" FixedFromPoint="true" FixedToPoint="true">
+ <Path>
+ <Point X="7.5" Y="2.5" />
+ <Point X="7.125" Y="2.5" />
+ <Point X="7.125" Y="3.875" />
+ <Point X="6.75" Y="3.875" />
+ </Path>
+ </InheritanceLine>
+ <TypeIdentifier>
+ <HashCode>AAAAAAAAAAAgAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQ=</HashCode>
+ <FileName>BusinessModel\ExtraEntities\SettlementType.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.MainEntities.EditedSettlement" Collapsed="true">
+ <Position X="5.25" Y="0.5" Width="1.5" />
+ <InheritanceLine Type="ModelData.BusinessModel.BaseAndInterface.BaseOntologyEntity" ManuallyRouted="true" FixedFromPoint="true" FixedToPoint="true">
+ <Path>
+ <Point X="7.5" Y="2.5" />
+ <Point X="7.125" Y="2.5" />
+ <Point X="7.125" Y="1.011" />
+ <Point X="6.75" Y="1.011" />
+ </Path>
+ </InheritanceLine>
+ <TypeIdentifier>
+ <HashCode>BAAAAAAAggAAAAAAABAAAAAAACCAAAAAEQACAAAAAAY=</HashCode>
+ <FileName>BusinessModel\MainEntities\EditedSettlement.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.MainEntities.MapPoint" Collapsed="true">
+ <Position X="5.25" Y="1.25" Width="1.5" />
+ <InheritanceLine Type="ModelData.BusinessModel.BaseAndInterface.BaseOntologyEntity" FixedFromPoint="true">
+ <Path>
+ <Point X="7.5" Y="2.5" />
+ <Point X="7.125" Y="2.5" />
+ <Point X="7.125" Y="1.596" />
+ <Point X="6.75" Y="1.596" />
+ </Path>
+ </InheritanceLine>
+ <TypeIdentifier>
+ <HashCode>AAAAAAAAgAAAAAQoAAAAAAAAACAAAAAAAQAAAAAAAAA=</HashCode>
+ <FileName>BusinessModel\MainEntities\MapPoint.cs</FileName>
+ </TypeIdentifier>
+ <Lollipop Orientation="Left" Position="0.328" Collapsed="true" />
+ </Class>
+ <Class Name="ModelData.BusinessModel.MainEntities.Settlement" Collapsed="true">
+ <Position X="5.25" Y="2" Width="1.5" />
+ <InheritanceLine Type="ModelData.BusinessModel.BaseAndInterface.BaseOntologyEntity" FixedFromPoint="true">
+ <Path>
+ <Point X="7.5" Y="2.5" />
+ <Point X="7.125" Y="2.5" />
+ <Point X="7.125" Y="2.25" />
+ <Point X="6.75" Y="2.25" />
+ </Path>
+ </InheritanceLine>
+ <TypeIdentifier>
+ <HashCode>BAAAACAAAAAABAAAABAAAAAAACAAAAAAAAACAADAAAA=</HashCode>
+ <FileName>BusinessModel\MainEntities\Settlement.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.RDF.Queries" Collapsed="true">
+ <Position X="10.25" Y="3.75" Width="1.25" />
+ <TypeIdentifier>
+ <HashCode>IAAEAAAAACAEAgAAAAAAMAAAAAAAIAAAAIAAACAAAAA=</HashCode>
+ <FileName>BusinessModel\RDF\Queries.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.RDF.RDFQuery" Collapsed="true">
+ <Position X="10.25" Y="4.5" Width="1.25" />
+ <Compartments>
+ <Compartment Name="Nested Types" Collapsed="false" />
+ </Compartments>
+ <NestedTypes>
+ <Enum Name="ModelData.BusinessModel.RDF.RDFQuery.QueryType">
+ <TypeIdentifier>
+ <NewMemberFileName>BusinessModel\RDF\RDFQuery.cs</NewMemberFileName>
+ </TypeIdentifier>
+ </Enum>
+ </NestedTypes>
+ <TypeIdentifier>
+ <HashCode>AAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
+ <FileName>BusinessModel\RDF\RDFQuery.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.Tools.Coordinate" Collapsed="true">
+ <Position X="5.25" Y="6.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="5.25" Y="5" Width="1.5" />
+ <TypeIdentifier>
+ <HashCode>AAAEAAAABAAAAAAEAAAAAAAAAAAAAAAAAAACAAAAAAA=</HashCode>
+ <FileName>BusinessModel\Tools\InstantTime.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.Tools.Period" Collapsed="true">
+ <Position X="5.25" Y="5.75" Width="1.5" />
+ <TypeIdentifier>
+ <HashCode>AAIAAAAAAAAAAAAEAAAAAAAAAAAAEAAAAAAAAAAAAAA=</HashCode>
+ <FileName>BusinessModel\Tools\Period.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.BusinessModel.UnitOfWork.Context" Collapsed="true">
+ <Position X="10.25" Y="5.25" Width="1.25" />
+ <TypeIdentifier>
+ <HashCode>AAIAAQAAIAAAAAAAAIAAIACAAAAAIAAAACAAAAAAABA=</HashCode>
+ <FileName>BusinessModel\UnitOfWork\Context.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.WebModel.Model" Collapsed="true">
+ <Position X="8.25" Y="5" Width="1.25" />
+ <TypeIdentifier>
+ <HashCode>AAAAIAAAAABAAAAAAAAAAAAACACEAAAAAAACAAAAAAA=</HashCode>
+ <FileName>WebModel\Model.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="ModelData.WebModel.WebDataManager" Collapsed="true">
+ <Position X="8.25" Y="6" Width="1.5" />
+ <TypeIdentifier>
+ <HashCode>AAEAAAQAAAAAAQBAAAAAAAAAAABAIAAAAAAKAAAAgAA=</HashCode>
+ <FileName>WebModel\WebDataManager.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="Tools.Config.ConfigManager" Collapsed="true">
+ <Position X="1.25" Y="1.75" Width="2.5" />
+ <TypeIdentifier />
+ </Class>
+ <Class Name="Tools.IndexAttrib" Collapsed="true">
+ <Position X="3.25" Y="0.75" Width="1.5" />
+ <TypeIdentifier />
+ </Class>
+ <Class Name="Tools.SerializeService" Collapsed="true">
+ <Position X="1.5" Y="7" Width="2.5" />
+ <TypeIdentifier />
+ </Class>
+ <Class Name="Tools.Users.User" Collapsed="true">
+ <Position X="1.25" Y="0.5" Width="1.5" />
+ <TypeIdentifier />
+ </Class>
+ <Class Name="Tools.Users.UserContext" Collapsed="true">
+ <Position X="2.25" Y="3.25" Width="1.5" />
+ <TypeIdentifier />
+ </Class>
+ <Class Name="Tools.Word.DocXWrite" Collapsed="true">
+ <Position X="1.25" Y="5.5" Width="2.75" />
+ <TypeIdentifier />
+ </Class>
+ <Interface Name="ModelData.BusinessModel.BaseAndInterface.I_URLcs" Collapsed="true">
+ <Position X="17.25" Y="0.5" Width="1.25" />
+ <TypeIdentifier>
+ <HashCode>AAAAAAAAAAAAAEAAAAAAAAAAACAAAAAAAAAAAAAAAAA=</HashCode>
+ <FileName>BusinessModel\BaseAndInterface\I_URLcs.cs</FileName>
+ </TypeIdentifier>
+ </Interface>
+ <Interface Name="Tools.I_MySerializable">
+ <Position X="14.5" Y="0.5" Width="2.5" />
+ <TypeIdentifier />
+ </Interface>
+ <Interface Name="System.IComparable<T>">
+ <Position X="12.75" Y="0.5" Width="1.5" />
+ <TypeIdentifier />
+ </Interface>
+ <Font Name="Segoe UI" Size="9" />
+</ClassDiagram>
\ No newline at end of file
ModelData/ModelData.csproj 7(+6 -1)
diff --git a/ModelData/ModelData.csproj b/ModelData/ModelData.csproj
index 7f3d64e..0c4c118 100644
--- a/ModelData/ModelData.csproj
+++ b/ModelData/ModelData.csproj
@@ -62,8 +62,10 @@
<Compile Include="BusinessModel\ExtraEntities\Founder.cs" />
<Compile Include="BusinessModel\ExtraEntities\Region.cs" />
<Compile Include="BusinessModel\ExtraEntities\SettlementType.cs" />
+ <Compile Include="BusinessModel\ExtraEntities\Source.cs" />
<Compile Include="BusinessModel\MainEntities\EditedSettlement.cs" />
<Compile Include="BusinessModel\MainEntities\Settlement.cs" />
+ <Compile Include="BusinessModel\MainEntities\SettlementName.cs" />
<Compile Include="BusinessModel\RDF\Queries.cs" />
<Compile Include="BusinessModel\RDF\RDFQuery.cs" />
<Compile Include="BusinessModel\Tools\Coordinate.cs" />
@@ -77,7 +79,10 @@
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
- <None Include="BusinessModel\ClassDiagram1.cd" />
+ <None Include="Diagrams\ClassDiagram_pic8.cd" />
+ <None Include="Diagrams\ClassDiagram_pic7.cd" />
+ <None Include="Diagrams\ClassDiagram_pic4.cd" />
+ <None Include="Diagrams\ClassDiagram_pic5.cd" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
ModelData/WebModel/Model.cs 2(+1 -1)
diff --git a/ModelData/WebModel/Model.cs b/ModelData/WebModel/Model.cs
index a15b8cd..60b377f 100644
--- a/ModelData/WebModel/Model.cs
+++ b/ModelData/WebModel/Model.cs
@@ -11,7 +11,7 @@ namespace ModelData.WebModel
public class Model
{
public MapPoint[] arraySettlements { set; get; }
- public string[] arrayNameSettlements { set; get; }
+ public SettlementName[] arrayNameSettlements { set; get; }
public string[] arrayNameTypes { set; get; }
public string[] arrayNameRegions { set; get; }
public Dictionary<string, int> ZoomLevel { private set; get; }
ModelData/WebModel/WebDataManager.cs 13(+11 -2)
diff --git a/ModelData/WebModel/WebDataManager.cs b/ModelData/WebModel/WebDataManager.cs
index c0fb68f..8ca2a6f 100644
--- a/ModelData/WebModel/WebDataManager.cs
+++ b/ModelData/WebModel/WebDataManager.cs
@@ -64,9 +64,18 @@ namespace ModelData.WebModel
Array.Sort(model.arrayNameRegions);
temp.Clear();
+
+
+ List<SettlementName> temp2 = new List<SettlementName>(context.MapPoints.Count);
foreach (var settlement in context.MapPoints)
- temp.Add(settlement.Title);
- model.arrayNameSettlements = temp.ToArray();
+ {
+ temp2.Add(new SettlementName()
+ {
+ label = settlement.Title,
+ value = settlement.URL
+ });
+ }
+ model.arrayNameSettlements = temp2.ToArray();
// Инициализация уровней приближения убрана в связи с тем, что не найдено решения для оптимального отображения на карте
// Вместо этого будут отображаться первые 40-50-100 самых крупных поселений (значение регулируется в JS коде)
// Для этого в c# коде производится сортировка списка поселений по количеству населения
Tools/Main/Translit.cs 18(+18 -0)
diff --git a/Tools/Main/Translit.cs b/Tools/Main/Translit.cs
new file mode 100644
index 0000000..a401d3e
--- /dev/null
+++ b/Tools/Main/Translit.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using NickBuhro.Translit;
+
+namespace Tools
+{
+ public class Translit
+ {
+ static string TranslitFromRussian(string input)
+ {
+ return Transliteration.CyrillicToLatin(input, Language.Russian); ;
+ }
+ }
+}
Tools/packages.config 1(+1 -0)
diff --git a/Tools/packages.config b/Tools/packages.config
index 03660bd..a816661 100644
--- a/Tools/packages.config
+++ b/Tools/packages.config
@@ -2,4 +2,5 @@
<packages>
<package id="DocX" version="1.3.0" targetFramework="net47" />
<package id="EPPlus" version="4.5.3.1" targetFramework="net47" />
+ <package id="NickBuhro.Translit" version="1.4.5" targetFramework="net47" />
</packages>
\ No newline at end of file
Tools/Tools.csproj 4(+4 -0)
diff --git a/Tools/Tools.csproj b/Tools/Tools.csproj
index 4ff2472..6eb51ee 100644
--- a/Tools/Tools.csproj
+++ b/Tools/Tools.csproj
@@ -53,6 +53,9 @@
<Reference Include="EPPlus, Version=4.5.3.1, Culture=neutral, PublicKeyToken=ea159fdaa78159a1, processorArchitecture=MSIL">
<HintPath>..\packages\EPPlus.4.5.3.1\lib\net40\EPPlus.dll</HintPath>
</Reference>
+ <Reference Include="NickBuhro.Translit, Version=1.4.5.0, Culture=neutral, processorArchitecture=MSIL">
+ <HintPath>..\packages\NickBuhro.Translit.1.4.5\lib\net45\NickBuhro.Translit.dll</HintPath>
+ </Reference>
<Reference Include="PresentationCore" />
<Reference Include="System" />
<Reference Include="System.configuration" />
@@ -74,6 +77,7 @@
<Compile Include="Main\IndexAttribute.cs" />
<Compile Include="Config\ConfigManager.cs" />
<Compile Include="Interfaces\I_MySerializable.cs" />
+ <Compile Include="Main\Translit.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Main\SerializeService.cs" />
<Compile Include="Users\User.cs" />
web-map/App_Data/pics/1.png 0(+0 -0)
diff --git a/web-map/App_Data/pics/1.png b/web-map/App_Data/pics/1.png
new file mode 100644
index 0000000..aae6df7
Binary files /dev/null and b/web-map/App_Data/pics/1.png differ
web-map/App_Data/pics/10.png 0(+0 -0)
diff --git a/web-map/App_Data/pics/10.png b/web-map/App_Data/pics/10.png
new file mode 100644
index 0000000..56f70f6
Binary files /dev/null and b/web-map/App_Data/pics/10.png differ
web-map/App_Data/pics/11.png 0(+0 -0)
diff --git a/web-map/App_Data/pics/11.png b/web-map/App_Data/pics/11.png
new file mode 100644
index 0000000..7ae0e85
Binary files /dev/null and b/web-map/App_Data/pics/11.png differ
web-map/App_Data/pics/2.png 0(+0 -0)
diff --git a/web-map/App_Data/pics/2.png b/web-map/App_Data/pics/2.png
new file mode 100644
index 0000000..1f8056c
Binary files /dev/null and b/web-map/App_Data/pics/2.png differ
web-map/App_Data/pics/3.png 0(+0 -0)
diff --git a/web-map/App_Data/pics/3.png b/web-map/App_Data/pics/3.png
new file mode 100644
index 0000000..9f4d3b3
Binary files /dev/null and b/web-map/App_Data/pics/3.png differ
web-map/App_Data/pics/4.png 0(+0 -0)
diff --git a/web-map/App_Data/pics/4.png b/web-map/App_Data/pics/4.png
new file mode 100644
index 0000000..2f37913
Binary files /dev/null and b/web-map/App_Data/pics/4.png differ
web-map/App_Data/pics/5.png 0(+0 -0)
diff --git a/web-map/App_Data/pics/5.png b/web-map/App_Data/pics/5.png
new file mode 100644
index 0000000..b86667a
Binary files /dev/null and b/web-map/App_Data/pics/5.png differ
web-map/App_Data/pics/6.png 0(+0 -0)
diff --git a/web-map/App_Data/pics/6.png b/web-map/App_Data/pics/6.png
new file mode 100644
index 0000000..bcea2d0
Binary files /dev/null and b/web-map/App_Data/pics/6.png differ
web-map/App_Data/pics/7.png 0(+0 -0)
diff --git a/web-map/App_Data/pics/7.png b/web-map/App_Data/pics/7.png
new file mode 100644
index 0000000..fb07939
Binary files /dev/null and b/web-map/App_Data/pics/7.png differ
web-map/App_Data/pics/8.png 0(+0 -0)
diff --git a/web-map/App_Data/pics/8.png b/web-map/App_Data/pics/8.png
new file mode 100644
index 0000000..2e8d5a2
Binary files /dev/null and b/web-map/App_Data/pics/8.png differ
web-map/App_Data/pics/9.png 0(+0 -0)
diff --git a/web-map/App_Data/pics/9.png b/web-map/App_Data/pics/9.png
new file mode 100644
index 0000000..31aec3d
Binary files /dev/null and b/web-map/App_Data/pics/9.png differ
web-map/ClassDiagram1.cd 60(+60 -0)
diff --git a/web-map/ClassDiagram1.cd b/web-map/ClassDiagram1.cd
new file mode 100644
index 0000000..74e27a7
--- /dev/null
+++ b/web-map/ClassDiagram1.cd
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ClassDiagram MajorVersion="1" MinorVersion="1" MembersFormat="NameAndType">
+ <Class Name="web_map.Controllers.AccountController" Collapsed="true">
+ <Position X="3.75" Y="4.25" Width="1.5" />
+ <InheritanceLine Type="web_map.Controllers.BaseController" FixedFromPoint="true">
+ <Path>
+ <Point X="5.688" Y="3.441" />
+ <Point X="5.688" Y="4.596" />
+ <Point X="5.25" Y="4.596" />
+ </Path>
+ </InheritanceLine>
+ <TypeIdentifier>
+ <HashCode>BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAAACA=</HashCode>
+ <FileName>Controllers\AccountController.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="web_map.Controllers.BaseController" Collapsed="true">
+ <Position X="5.5" Y="2.75" Width="1.25" />
+ <TypeIdentifier>
+ <HashCode>AAAAAAAAAAAAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
+ <FileName>Controllers\BaseController.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="web_map.Controllers.HomeController" Collapsed="true">
+ <Position X="3.75" Y="3.5" Width="1.5" />
+ <InheritanceLine Type="web_map.Controllers.BaseController" FixedFromPoint="true">
+ <Path>
+ <Point X="5.688" Y="3.441" />
+ <Point X="5.688" Y="3.846" />
+ <Point X="5.25" Y="3.846" />
+ </Path>
+ </InheritanceLine>
+ <TypeIdentifier>
+ <HashCode>AAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAA=</HashCode>
+ <FileName>Controllers\HomeController.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="web_map.Controllers.MapAPIController" Collapsed="true">
+ <Position X="3.75" Y="5" Width="1.5" />
+ <TypeIdentifier>
+ <HashCode>AAEAAAAAAAAAAAAAAAABAAAAAAAAAAAACAAAAAAAgAA=</HashCode>
+ <FileName>Controllers\MapAPIController.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="web_map.Controllers.MapController" Collapsed="true">
+ <Position X="3.75" Y="2.75" Width="1.5" />
+ <TypeIdentifier>
+ <HashCode>AACAAAAAABAAAAAAAAAAAACABAAAAAAAAAAAAAAAAAA=</HashCode>
+ <FileName>Controllers\MapController.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Class Name="web_map.Models.AuthModel">
+ <Position X="8.5" Y="0.75" Width="1.75" />
+ <TypeIdentifier>
+ <HashCode>AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAACAAAQAEAAAAA=</HashCode>
+ <FileName>Models\AuthModel.cs</FileName>
+ </TypeIdentifier>
+ </Class>
+ <Font Name="Segoe UI" Size="9" />
+</ClassDiagram>
\ No newline at end of file
web-map/Content/delete.png 0(+0 -0)
diff --git a/web-map/Content/delete.png b/web-map/Content/delete.png
new file mode 100644
index 0000000..48f1a6c
Binary files /dev/null and b/web-map/Content/delete.png differ
web-map/Content/Site.css 48(+46 -2)
diff --git a/web-map/Content/Site.css b/web-map/Content/Site.css
index 28baf59..109146b 100644
--- a/web-map/Content/Site.css
+++ b/web-map/Content/Site.css
@@ -120,9 +120,9 @@ a[aria-expanded="true"]::before {
ul ul a {
- font-size: 0.9em !important;
+ /*font-size: 0.9em !important;
padding-left: 30px !important;
- background: #6d7fcc;
+ background: #6d7fcc;*/
}
ul.CTAs {
@@ -195,3 +195,47 @@ a.article, a.article:hover {
#sidebar-right-text .sidebar-right-text-element {
padding: 0.5rem 0.5rem;
}
+
+/* цвета для страницы-справки, для выделения текста описания изображений*/
+
+#faq-text {
+ word-wrap: break-word;
+ /*padding: 0.5rem 0.5rem;*/
+}
+
+#faq-text .red {
+ color: #ED1C24;
+}
+
+#faq-text .orange {
+ color: #FF7F27;
+}
+
+#faq-text .yellow {
+ color: #FFF200;
+}
+
+#faq-text .dark-blue {
+ color: #3F48CC;
+}
+
+#faq-text .purple {
+ color: #A349A4;
+}
+
+#faq-text .blue {
+ color: #00A2E8;
+}
+
+#faq-text .green {
+ color: #22B14C;
+}
+
+#faq-text .light-green {
+ color: #B5E61D;
+}
+
+#faq-text .back-ground {
+ font-size: 120%;
+ background: #C3C3C3;
+}
\ No newline at end of file
web-map/Controllers/HomeController.cs 11(+4 -7)
diff --git a/web-map/Controllers/HomeController.cs b/web-map/Controllers/HomeController.cs
index afc3531..169479f 100644
--- a/web-map/Controllers/HomeController.cs
+++ b/web-map/Controllers/HomeController.cs
@@ -25,16 +25,13 @@ namespace web_map.Controllers
return View();
}
- public ActionResult GetDoc(string fileName)
+ public ActionResult Image(string id)
{
- string path = Server.MapPath("~/App_Data") + "/html/index.html";
- System.IO.FileInfo file = new System.IO.FileInfo(path);
- if (file.Exists)
- return File(file.FullName, "text/plain", file.Name);
- return Content("");
+ var dir = Server.MapPath("~/App_Data") + @"\pics\";
+ var path = System.IO.Path.Combine(dir, id + ".png"); //validate the path for security or use other means to generate the path.
+ return base.File(path, "image/jpeg");
}
-
//public FileStreamResult GetFile(string URL)
//{
// var stream = serialazService.EntitysToDocx(new object[3]);
web-map/Controllers/MapController.cs 26(+26 -0)
diff --git a/web-map/Controllers/MapController.cs b/web-map/Controllers/MapController.cs
index d97cd34..b79110a 100644
--- a/web-map/Controllers/MapController.cs
+++ b/web-map/Controllers/MapController.cs
@@ -39,6 +39,10 @@ namespace web_map.Controllers
[HttpPost]
public JsonResult ImportForm(string formData, string type)
{
+ if (User.Identity.IsAuthenticated)
+ {
+
+ }
WebDataManager webData = WebDataManager.Get();
var inputArray = formData.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
@@ -56,6 +60,28 @@ namespace web_map.Controllers
return Json("Import success", JsonRequestBehavior.AllowGet);
}
+ [HttpPost]
+ public JsonResult DeleteSettlement(string type, string url)
+ {
+ if (User.Identity.IsAuthenticated)
+ {
+
+ }
+ WebDataManager webData = WebDataManager.Get();
+
+ string result = "";
+ if (new Random().Next(2) == 0)
+ {
+ result = "Success";
+ }
+ else
+ {
+ result = "Failure|ErrorMessage";
+ }
+
+ return Json(result, JsonRequestBehavior.AllowGet);
+ }
+
[HttpGet]
public JsonResult GetAllOfType(string type)
{
web-map/Scripts/SiteScripts/AjaxQuery.js 28(+25 -3)
diff --git a/web-map/Scripts/SiteScripts/AjaxQuery.js b/web-map/Scripts/SiteScripts/AjaxQuery.js
index d6579cb..60cac4f 100644
--- a/web-map/Scripts/SiteScripts/AjaxQuery.js
+++ b/web-map/Scripts/SiteScripts/AjaxQuery.js
@@ -111,7 +111,7 @@ function GetDate(load = false) {
document.getElementById('slider-label-min').innerHTML = '<b>' + MinYear + '</b>';
document.getElementById('slider-label-max').innerHTML = '<b>' + MaxYear + '</b>';
- if (load == true) {
+ if (load === true) {
SliderInit();
GetAllPoints(CurrentMinYear, CurrentMaxYear);
}
@@ -140,7 +140,7 @@ function ExportData(type) {
}
function ImportForm(formData, type) {
- $.ajax({
+ return $.ajax({
url: '/Map/ImportForm',
type: 'POST',
// из-за этой строки была ошибка 500//contentType: "application/json; charset=utf-8",
@@ -151,7 +151,29 @@ function ImportForm(formData, type) {
type: type
},
success: function (data) {
- console.log(data);
+ },
+
+ error: function (response) {
+ console.log(response.responseText);
+ alert('Ошибка. Не удалось получить данные от сервера');
+ }
+ });
+}
+
+//Получить массив всех точек поселений от сервера
+function DeleteSettlement(type, url) {
+ return $.ajax({
+ url: '/Map/DeleteSettlement',
+ type: 'POST',
+ //contentType: "application/json; charset=utf-8",
+ dataType: 'json',
+ cache: false,
+ //Параметр контроллеру
+ data: {
+ type: type,
+ url: url
+ },
+ success: function (data) {
},
error: function (response) {
web-map/Scripts/SiteScripts/Events.js 58(+32 -26)
diff --git a/web-map/Scripts/SiteScripts/Events.js b/web-map/Scripts/SiteScripts/Events.js
index c719795..0d25bf5 100644
--- a/web-map/Scripts/SiteScripts/Events.js
+++ b/web-map/Scripts/SiteScripts/Events.js
@@ -5,17 +5,19 @@ function SliderOnFinishMoving(data) {
GetAllPoints(CurrentMinYear, CurrentMaxYear);
}
-function OnFindNameUsing(name) {
+function OnFindNameUsing(url) {
// Добавить в коллекцию, чтобы гарантировать что данный объект появится на карте
- Collections.FindName = name;
+ Collections.FindName = url;
// Найти метку в коллекции всех меток
- var placemark = Collections.AllGeoObjects.search('options.Name = "' + name + '"').get(0);
- // Установить новый цвет
- placemark.options.set('preset', 'islands#greenStretchyIcon');
- // Отцентрировать карту и приблизить
- Map.setCenter(placemark.geometry.getCoordinates(), 13);
- // Через 5 секунд вернуть обратно прежний цвет
- setTimeout(changePlacemarkPreset, 5000, placemark, 'islands#redStretchyIcon');
+ var placemark = Collections.AllGeoObjects.search('options.URL = "' + url + '"').get(0);
+ if (placemark !== null) {
+ // Установить новый цвет
+ placemark.options.set('preset', 'islands#greenStretchyIcon');
+ // Отцентрировать карту и приблизить
+ Map.setCenter(placemark.geometry.getCoordinates(), 13);
+ // Через 5 секунд вернуть обратно прежний цвет
+ setTimeout(changePlacemarkPreset, 5000, placemark, 'islands#redStretchyIcon');
+ }
}
function changePlacemarkPreset(placemark, preset) {
@@ -25,7 +27,6 @@ function changePlacemarkPreset(placemark, preset) {
// Заполнение массивов из исходного (response.data)
// В соответствии с параметрами поселения
function FillDataArrays(fromData, isNeedSelect = false) {
-
Collections.AllGeoObjects.removeFromMap(Map);
Collections.All = new Array();
@@ -45,7 +46,7 @@ function FillDataArrays(fromData, isNeedSelect = false) {
filterCollectionInit(Collections.Filters.Region, Collections.Regions, 'filterGroupRegions', 'countRegions');
Collections.All = fromData.arraySettlements;
- LoadCollection(fromData.arraySettlements, isNeedSelect, );
+ LoadCollection(fromData.arraySettlements, isNeedSelect);
}
// Функция заполнения Яндекс-коллекций Яндекс-объектами из JSON массива
@@ -60,7 +61,6 @@ function LoadCollection(fromData, isNeedSelect = false) {
// Согласно текущим установленным фильтрам собрать нужный массив данных
function SelectDataFromArrays() {
var insideMap = Collections.AllGeoObjects.searchInside(Map);
-
var afterFilters = new ymaps.geoQuery();
if (!Collections.isNeedFilters)
afterFilters = insideMap;
@@ -138,7 +138,7 @@ function CreateYandexPlacemark(fromElement) {
}
else
// Панель есть. Выбор, нужно ли её скрывать
- if (targetURL == document.getElementById('settlement-url').innerHTML) {
+ if (targetURL === document.getElementById('settlement-url').innerHTML) {
$('#sidebar-left, #content').addClass('active');
$('.collapse.in').toggleClass('in');
$('a[aria-expanded=true]').attr('aria-expanded', 'false');
@@ -170,7 +170,7 @@ function compareValues(key, order = 'asc') {
comparison = -1;
}
return (
- (order == 'desc') ? (comparison * -1) : comparison
+ (order === 'desc') ? (comparison * -1) : comparison
);
};
}
@@ -265,7 +265,7 @@ function checkBoxChange(e) {
// пользователь убрал отметку экспорта. удаляем поселение из коллекции
// но отрисовку пока не делаем, вдруг он захочет вернуть отметку (т.е. добавить в экспорт)
Collections.Export = jQuery.grep(Collections.Export, function (element) {
- return element.url != e.id;
+ return element.url !== e.id;
});
}
}
@@ -276,7 +276,7 @@ function addToExport() {
element.url = $("#settlement-url")[0].innerHTML;
// нельзя добавить уже добавленное поселение
- if (!Collections.Export.some(currentValue => currentValue.url == element.url)){
+ if (!Collections.Export.some(currentValue => currentValue.url === element.url)){
Collections.Export.push(element);
printExportCollection();
}
@@ -375,7 +375,7 @@ function checkOriginImportForm() {
}
var year = form_data["hasBeginning"].val();
- if (year != '') {
+ if (year !== '') {
var yearValidate = /^\d{1,4}$/;
if (!yearValidate.test(year)) {
// значение не соответствует шаблону
@@ -397,7 +397,7 @@ function checkOriginImportForm() {
for (key in form_data) {
// если поле это url
// ему нужна доп проверка
- if (key == 'url') {
+ if (key === 'url') {
y += '|' + key + '~';
// если НЕ установлен флаг "только чтение", т.е. пользователь ВВЕЛ СВОЙ url
if (!form_data[key][0].readOnly)
@@ -445,7 +445,7 @@ function checkEditedImportForm() {
var year = form_data["hasBeginning"].val();
- if (year != '') {
+ if (year !== '') {
var yearValidate = /^\d{1,4}$/;
if (!yearValidate.test(year)) {
// значение не соответствует шаблону
@@ -466,7 +466,7 @@ function checkEditedImportForm() {
var popMale = form_data["populationMale"].val();
var popFemale = form_data["populationFemale"].val();
- if (popAll != '') {
+ if (popAll !== '') {
if (!digitValidate.test(popAll)) {
// значение не соответствует шаблону
// вывод ошибки
@@ -475,7 +475,7 @@ function checkEditedImportForm() {
}
}
- if (popMale != '') {
+ if (popMale !== '') {
if (!digitValidate.test(popMale)) {
// значение не соответствует шаблону
// вывод ошибки
@@ -484,7 +484,7 @@ function checkEditedImportForm() {
}
}
- if (popFemale != '') {
+ if (popFemale !== '') {
if (!digitValidate.test(popFemale)) {
// значение не соответствует шаблону
// вывод ошибки
@@ -509,14 +509,20 @@ function checkEditedImportForm() {
function importFormSubmit(contentType) {
var data = '';
- if (contentType == 'origin-import') {
+ if (contentType === 'origin-import') {
data = checkOriginImportForm();
}
- else if (contentType == 'edited-import') {
+ else if (contentType === 'edited-import') {
data = checkEditedImportForm();
}
- if (data != null)
- ImportForm(data, contentType);
+ if (data !== null) {
+ $.when(ImportForm(data, contentType)).done(function (data) {
+ console.log(data);
+ var text = '';
+ $('#modal-result-text').html(data);
+ $('#resultDeleteModal').modal();
+ });
+ }
}
web-map/Scripts/SiteScripts/Init.js 32(+18 -14)
diff --git a/web-map/Scripts/SiteScripts/Init.js b/web-map/Scripts/SiteScripts/Init.js
index 0341071..51e4622 100644
--- a/web-map/Scripts/SiteScripts/Init.js
+++ b/web-map/Scripts/SiteScripts/Init.js
@@ -71,7 +71,7 @@ function YandexMapInit()
);
// Найдём область по её iso коду.
- var region = result.features.filter(function (feature) { return feature.properties.iso3166 == 'RU-SAR'; })[0];
+ var region = result.features.filter(function (feature) { return feature.properties.iso3166 === 'RU-SAR'; })[0];
// Добавим координаты этой области в полигон, который накрывает весь мир.
// В полигоне образуется полость, через которую будет видно заданную область.
var masks = region.geometry.coordinates;
@@ -116,7 +116,7 @@ function SliderInit() {
// Обработчик кнопки поиска по имени
$('#buttonSearch').bind('click', function () {
var resultName = document.getElementById('inputName').value;
- if (resultName.length != 0)
+ if (resultName.length !== 0)
OnFindNameUsing(resultName);
});
@@ -154,7 +154,7 @@ function SliderInit() {
// Кнопка экспорта в word
$('#export-to-word').bind('click', function () {
- if (Collections.Export != null && Collections.Export.length > 0) {
+ if (Collections.Export !== null && Collections.Export.length > 0) {
ExportData('word');
}
@@ -162,7 +162,7 @@ function SliderInit() {
// Кнопка экспорта в excel
$('#export-to-excel').bind('click', function () {
- if (Collections.Export != null && Collections.Export.length > 0) {
+ if (Collections.Export !== null && Collections.Export.length > 0) {
ExportData('excel');
}
});
@@ -187,28 +187,32 @@ function AutoCompleteInit(data) {
source: function (request, response) {
var term = request.term;
var pattern = new RegExp("^" + term, "i");
-
var results = $.map(data, function (elem) {
- if (pattern.test(elem)) {
- return elem;
+ if (pattern.test(elem.label)) {
+ return {
+ label: elem.label,
+ value: elem.value
+ };
}
- })
+ });
response(results.slice(0, 10));
},
minLength: 2,
delay: 300,
- select: function(event, ui) {
- OnFindNameUsing(ui.item.value)
+ select: function (event, ui) {
+ event.preventDefault();
+ $('.ui-autocomplete-input').val(ui.item.label);
+ OnFindNameUsing(ui.item.value);
}
});}
function filterCollectionInit(filterCollection, fromData, groupID, header) {
var template = '<li class="list-group-item p-0"><div class="input-group"><div class="input-group-prepend"><div class="input-group-text"><input type="checkbox" checked onchange="FUNC(this)"></div></div><span class="form-control" data-toggle="tooltip" data-placement="top" title="NAME">NAME</span></div></li>';
- if (groupID == 'filterGroupTypes') {
- template = template.replace(/FUNC/g, 'filterTypeChange')
+ if (groupID === 'filterGroupTypes') {
+ template = template.replace(/FUNC/g, 'filterTypeChange');
}
- else if (groupID == 'filterGroupRegions'){
- template = template.replace(/FUNC/g, 'filterRegionChange')
+ else if (groupID === 'filterGroupRegions'){
+ template = template.replace(/FUNC/g, 'filterRegionChange');
}
var text = '';
fromData.forEach(function (element) {
web-map/Scripts/SiteScripts/Output.js 114(+86 -28)
diff --git a/web-map/Scripts/SiteScripts/Output.js b/web-map/Scripts/SiteScripts/Output.js
index 04c1740..b0e6194 100644
--- a/web-map/Scripts/SiteScripts/Output.js
+++ b/web-map/Scripts/SiteScripts/Output.js
@@ -2,7 +2,7 @@
function PrintInfoAboutSettlement(info)
{
function makeButton(buttonHTML, type, id) {
- if (buttonHTML == '')
+ if (buttonHTML === '')
return '';
return buttonHTML.replace(/_ID_/g, id).replace(/_TYPE_/g, type);
}
@@ -25,45 +25,52 @@ function PrintInfoAboutSettlement(info)
var text = '<div class="sidebar-left-text-element">';
text += makeButton(editButtonText, 'constInfo', 'editConstInfoButton');
text += '<p>' + 'Координаты: ' + info.Coordinate.Lat + ' ' + info.Coordinate.Long + '</p>';
- if (info.Founder != null)
+ if (info.Founder !== null)
text += '<p>' + 'Основатель: ' + info.Founder + '</p>';
- if (info.Legend != null)
+ if (info.Legend !== null)
{
//text += '<p>' + 'Легенда:</p>';
// тут часть текста ("показать") выделяется другим цветом
text += '<div class="hideLine"><label for="hideLine1">Легенда: <span style="color: #32CD32">[показать]</span></label><input type="checkbox" id="hideLine1"/>';
text += '<p class="content">' + info.Legend + '</p></div>';
}
- if (info.hasBeginning != null)
+ if (info.hasBeginning !== null)
text += '<p>' + 'Время основания: ' + info.hasBeginning + '</p>';
var i = 0;
text += '</div>';
text += '<hr style="border: none; background-color: #32CD32; color: #32CD32; height: 2px;">';
- if (info.EditedSettlements != null)
+ if (info.EditedSettlements !== null)
info.EditedSettlements.forEach(function (element) {
text += '<div class="sidebar-left-text-element">';
text += makeButton(editButtonText, 'editInfo', 'editEditInfoButton_' + i++);
Collections.CurrentSettlement.editInfo.push(new Object(element));
- if (element.PopulationAll != null)
+ if (element.PopulationAll !== null)
text += '<p>' + 'Количество населения: ' + element.PopulationAll + '</p>';
- if (element.PopulationFemales != null)
+ if (element.PopulationFemales !== null)
text += '<p>' + 'Количество мужского населения: ' + element.PopulationFemales + '</p>';
- if (element.PopulationMales != null)
+ if (element.PopulationMales !== null)
text += '<p>' + 'Количество женского населения: ' + element.PopulationMales + '</p>';
- if (element.Region != null)
+ if (element.Region !== null)
text += '<p>' + 'Регион: ' + element.Region.Title + '</p>';
- if (element.Type != null)
+ if (element.Type !== null)
text += '<p>' + 'Тип поселения: ' + element.Type.Title + '</p>';
- if (element.Title != null)
+ if (element.Title !== null)
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 + '" target="_blank">ссылка</a></p>';
- else
- text += '<p>Источник: ' + element.Source + '</p>';
+
+ text += '<p>Источник: ' + element.Source.Title + '</p>';
+ text += '<p>Доступ: ';
+ element.Source.URLs.forEach(function (_url) {
+ if (_url.includes("www.") || _url.includes("http"))
+ text += '<a href="' + _url + '" target="_blank">ссылка</a> ';
+ else
+ text += _url + ' ';
+ });
+ if (element.Source.Auther !== null && element.Source.Auther !== '')
+ text += '<p>' + 'Автор источника: ' + element.Source.Auther + '</p>';
text += '</div>';
});
@@ -89,7 +96,7 @@ function printExportCollection() {
function printEditImportForm(what, id) {
var element;
- if (what == 'constInfo') {
+ if (what === 'constInfo') {
element = Collections.CurrentSettlement[what];
// вызов создания формы
printImportAddingForm();
@@ -105,7 +112,7 @@ function printEditImportForm(what, id) {
importSidebarButton();
}
- else if (what == 'editInfo') {
+ else if (what === 'editInfo') {
importSidebarButton();
element = Collections.CurrentSettlement.editInfo[id.split('_')[1]];
// вызов создания формы
@@ -114,27 +121,27 @@ function printEditImportForm(what, id) {
$("input#import-edited-url").val(element.URL);
$("input#import-edited-hasBeginning").val(element.hasBeginning.Year);
- $("input#import-edited-source").val(element.Source);
+ $("input#import-edited-source").val(element.Source.Title);
- if (element.PopulationAll != null)
+ if (element.PopulationAll !== null)
$("input#import-edited-populationAll").val(element.PopulationAll);
- if (element.PopulationFemales != null)
+ if (element.PopulationFemales !== null)
$("input#import-edited-populationFemale").val(element.PopulationFemales);
- if (element.PopulationMales != null)
+ if (element.PopulationMales !== null)
$("input#import-edited-populationMale").val(element.PopulationMales);
- if (element.Region != null) {
+ if (element.Region !== null) {
// костыль из-за того, что пытаемся выделить элемент списка, хотя список еще не был наполнен из-за асинхронности работы
// ставлю задержку, чтобы при первой загрузке списка выделение произошло чуть позже. при повторных нажатиях список уже загружен и работает мгновенно
- if (Collections.AllRegions.length == 0)
+ 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)
+ 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)
+ if (element.Title !== null)
$("input#import-edited-title").val(element.Title);
}
else { console.log('printEditImportForm(' + what + ',' + id + ')'); return; }
@@ -212,7 +219,7 @@ function printImportEditingForm() {
}
// нужно выполнить загрузку ВСЕХ тиов поселений за все периоды и ВСЕХ регионов
- if (Collections.AllSettlementTypes.length == 0) {
+ if (Collections.AllSettlementTypes.length === 0) {
$.when(GetAllOfType('type')).done(function (data) {
Collections.AllSettlementTypes = data;
loadSelect(Collections.AllSettlementTypes, 'import-edited-type');
@@ -222,7 +229,7 @@ function printImportEditingForm() {
loadSelect(Collections.AllSettlementTypes, 'import-edited-type');
}
- if (Collections.AllRegions.length == 0) {
+ if (Collections.AllRegions.length === 0) {
$.when(GetAllOfType('region')).done(function (data) {
Collections.AllRegions = data;
loadSelect(Collections.AllRegions, 'import-edited-region');
@@ -233,3 +240,54 @@ function printImportEditingForm() {
}
}
+function deleteElement(what, id) {
+ var element;
+ if (what === 'constInfo') {
+ element = Collections.CurrentSettlement[what];
+ $('#modal-delete-text').html('Подтвердите удаление основной информации [<a href="' + element.URL + '" target="_blank">url</a>]' + ' об основном поселении "' + element.Title + '". <h6 class="bg-warning text-dark">Вы уверены?</h6>');
+ $('#buttonConfirmDelete').data('type', what);
+ $('#buttonConfirmDelete').data('url', element.URL);
+ $('#buttonConfirmDelete').data('title', element.Title);
+ $('#confirmDeleteModal').modal();
+ }
+ else if (what === 'editInfo') {
+ element = Collections.CurrentSettlement.editInfo[id.split('_')[1]];
+ var beforeName = Collections.AllGeoObjects.search('options.URL = "' + element.before + '"').get(0).options.get('Name');
+ $('#modal-delete-text').html('Подтвердите удаление дополнительной информации [<a href="' + element.URL + '" target="_blank">url</a>]' + ' об основном поселении "' + beforeName + '". <h6 class="bg-warning text-dark">Вы уверены?</h6>');
+ $('#buttonConfirmDelete').data('type', what);
+ $('#buttonConfirmDelete').data('url', element.URL);
+ $('#buttonConfirmDelete').data('title', beforeName);
+ $('#confirmDeleteModal').modal();
+ }
+ else { console.log('printEditImportForm(' + what + ',' + id + ')'); return; }
+}
+
+function startDelete(sender) {
+ var url = $(sender).data('url');
+ var type = $(sender).data('type');
+ var title = $(sender).data('title');
+
+ var text = '';
+ if (type === 'constInfo') {
+ text = 'Основное поселение [<a href="' + url + '" target="_blank">url</a>] "';
+ }
+ else {
+ text = 'Дополнительная информация [<a href="' + url + '" target="_blank">url</a>] об основном поселении "';
+ }
+ text += title + '" удалено ';
+
+ $.when(DeleteSettlement(type, url)).done(function (data) {
+ if (new RegExp("^Success", "i").test(data)) {
+ text += '<span class="bg-success text-dark">успешно</span>.';
+ }
+ else {
+ var error = data.split('|')[1];
+ text += '<span class="bg-danger text-white">с ошибкой</span>.<p class="bg-warning text-dark">' + error + '</p>';
+ }
+ $('#modal-result-text').html(text);
+ $('#resultDeleteModal').modal();
+ });
+
+
+}
+
web-map/Views/Home/FAQ.cshtml 277(+261 -16)
diff --git a/web-map/Views/Home/FAQ.cshtml b/web-map/Views/Home/FAQ.cshtml
index 8f39475..96495ba 100644
--- a/web-map/Views/Home/FAQ.cshtml
+++ b/web-map/Views/Home/FAQ.cshtml
@@ -1,24 +1,269 @@
@{
ViewBag.Title = "Инструкция";
}
+<div id="faq-text" class="text-left">
-<h1>Инструкции</h1>
-<h2>На этой странице будут инструкции по работе с картой</h2>
-<a href="~/Content/html/index.html">Doc</a>
+ <div id="accordion" class="mt-4">
-@Html.ActionLink("Инструкция", "Index", "Doc")
+ <!--Следующий раздел-->
+ <div class="card">
+ <div class="card-header" id="label-youtube">
+ <h5 class="mb-0">
+ <button class="btn btn-outline-secondary" data-toggle="collapse" data-target="#id-youtube" aria-expanded="true" aria-controls="id-youtube">
+ Демонстрация работы карты (видео)
+ </button>
+ </h5>
+ </div>
+ <div id="id-youtube" class="collapse" aria-labelledby="label-youtube" data-parent="#accordion">
+ <div class="card-body">
+ <!--Текст-->
+ <div class="embed-responsive embed-responsive-16by9">
+ <iframe class="embed-responsive-item" src="https://www.youtube.com/embed/fjXPdFZwhzM" allowfullscreen></iframe>
+ </div>
+ </div>
+ </div>
+ </div>
+ <!--Следующий раздел-->
+ <div class="card">
+ <div class="card-header" id="label-timeline">
+ <h5 class="mb-0">
+ <button class="btn btn-outline-secondary" data-toggle="collapse" data-target="#id-timeline" aria-expanded="true" aria-controls="id-timeline">
+ Временной промежуток
+ </button>
+ </h5>
+ </div>
+ <div id="id-timeline" class="collapse" aria-labelledby="label-timeline" data-parent="#accordion">
+ <div class="card-body">
+ <!--Текст-->
+ <p>
+ Основным инструментом выборки данных является фильтр выбора временного промежутка, осуществляемый с помощью двух инструментов:
+ </p>
+ <ul>
+ <li>Слайдер временной линии (Timeline)</li>
+ <li>Поля ввода конкретного года</li>
+ </ul>
+ <p>
+ Цифрой <span class="font-weight-bold back-ground red">I</span> на рисунке обозначена временная линия (двухсторонний слайдер), позволяющая задавать временные границы с помощью «ползунков» <span class="font-weight-bold back-ground green">IV</span> и <span class="font-weight-bold back-ground green">V</span>.
+ Цифрами <span class="font-weight-bold back-ground orange">II</span> и <span class="font-weight-bold back-ground orange">III</span> на рисунке обозначены временные границы – от наименьшего года, упоминаемого в онтологии, до текущего.
+ </p>
+ <div class="text-center">
+ <img class="img-fluid" src="@Url.Action("Image", "Home", new { id = "1"})" alt="Временная линия">
+ <p hidden>Название рисунка, если оно нужно</p>
+ </div>
+ <br />
+ <p>
+ Можно воспользоваться вводом конкретного года как для нижней (цифра <span class="font-weight-bold back-ground red">I</span>), так и для верхней (цифра <span class="font-weight-bold back-ground red">II</span>) границы поиска, представленной на рисунке ниже.
+ При вводе некорректного значения изменения не произойдут.
+ </p>
+ <div class="text-center">
+ <img class="img-fluid" src="@Url.Action("Image", "Home", new { id = "2"})" alt="Ввод конкретного года">
+ <p hidden>Название рисунка, если оно нужно</p>
+ </div>
+ </div>
+ </div>
+ </div>
-<!--
-<address>
- One Microsoft Way<br />
- Redmond, WA 98052-6399<br />
- <abbr title="Phone">P:</abbr>
- 425.555.0100
-</address>
+ <!--Следующий раздел-->
+ <div class="card">
+ <div class="card-header" id="label-name-find">
+ <h5 class="mb-0">
+ <button class="btn btn-outline-secondary" data-toggle="collapse" data-target="#id-name-find" aria-expanded="true" aria-controls="id-name-find">
+ Поиск поселения по названию
+ </button>
+ </h5>
+ </div>
+ <div id="id-name-find" class="collapse" aria-labelledby="label-name-find" data-parent="#accordion">
+ <div class="card-body">
+ <!--Текст-->
+ <p>
+ Для поиска поселений по названию используется поле ввода, отмеченное цифрой <span class="font-weight-bold back-ground red">I</span> на рисунке ниже.
+ </p>
+ <div class="text-center">
+ <img class="img-fluid" src="@Url.Action("Image", "Home", new { id = "3"})" alt="Поиск по названию">
+ <p hidden>Название рисунка, если оно нужно</p>
+ </div>
+ <p>
+ При вводе значения в поле поиска, осуществляется подбор возможных поселений, название которых в начале содержит введенное значение (показано на рисунке ниже).
+ Пользователю предоставляется возможность выбрать нужное поселение из выпадающего списка или выполнить поиск по нажатию на кнопку.
+ При выборе поселения произойдет центрирование карты, и увеличится масштаб.
+ </p>
+ <div class="text-center">
+ <img class="img-fluid" src="@Url.Action("Image", "Home", new { id = "4"})" alt="Пример выпадающего списка при поиске поселений по названию">
+ <p hidden>Название рисунка, если оно нужно</p>
+ </div>
+ </div>
+ </div>
+ </div>
-<address>
- <strong>Support:</strong> <a href="mailto:Support@example.com">Support@example.com</a><br />
- <strong>Marketing:</strong> <a href="mailto:Marketing@example.com">Marketing@example.com</a>
-</address>
--->
+ <!--Следующий раздел-->
+ <div class="card">
+ <div class="card-header" id="label-filters">
+ <h5 class="mb-0">
+ <button class="btn btn-outline-secondary" data-toggle="collapse" data-target="#id-filters" aria-expanded="true" aria-controls="id-filters">
+ Фильтрация поселений
+ </button>
+ </h5>
+ </div>
+ <div id="id-filters" class="collapse" aria-labelledby="label-filters" data-parent="#accordion">
+ <div class="card-body">
+ <!--Текст-->
+ <p>
+ Доступна фильтрация поселений на карте по отношению к определенному типу поселения и по вхождению в состав административных единиц. Группа фильтров представлена на рисунке ниже.
+ </p>
+ <div class="text-center">
+ <img class="img-fluid" src="@Url.Action("Image", "Home", new { id = "5"})" alt="Фильтры поселений">
+ <p hidden>Название рисунка, если оно нужно</p>
+ </div>
+ <p>
+ Цифрой <span class="font-weight-bold back-ground red">I</span> отмечена кнопка применения фильтров, а другая кнопка (цифра <span class="font-weight-bold back-ground orange">II</span>) отменит действие фильтров на карте и вернет списки в начальное состояние.
+ По умолчанию списки обоих фильтров находятся в свернутом состоянии и разворачиваются при нажатии на название.
+ Секция фильтра по типу поселений выделена цифрой <span class="font-weight-bold back-ground green">III</span>, а по административным единицам – <span class="font-weight-bold back-ground light-green">IV</span>, при этом цифрами <span class="font-weight-bold back-ground purple">V</span> отмечено количество вариантов фильтрации.
+ С помощью опций выбора <span class="font-weight-bold back-ground blue">VI</span> можно комбинировать фильтры, чтобы затем применить их одной кнопкой <span class="font-weight-bold back-ground red">I</span>.
+ </p>
+ </div>
+ </div>
+ </div>
+
+ <!--Следующий раздел-->
+ <div class="card">
+ <div class="card-header" id="label-info">
+ <h5 class="mb-0">
+ <button class="btn btn-outline-secondary" data-toggle="collapse" data-target="#id-info" aria-expanded="true" aria-controls="id-info">
+ Подробная информация о поселении
+ </button>
+ </h5>
+ </div>
+ <div id="id-info" class="collapse" aria-labelledby="label-info" data-parent="#accordion">
+ <div class="card-body">
+ <!--Текст-->
+ <p>
+ Поселения на карте представлены в качестве маркеров. При нажатии на любой маркер слева появится боковая панель, содержащая подробную информация о выбранном поселении (секция <span class="font-weight-bold back-ground red">I</span> на рисунке ниже).
+ </p>
+ <div class="text-center">
+ <img class="img-fluid" src="@Url.Action("Image", "Home", new { id = "6"})" alt="Левая боковая панель">
+ <p hidden>Название рисунка, если оно нужно</p>
+ </div>
+ <p>
+ На панели подробной информации присутствует кнопка «Добавить в экспорт», отмеченная цифрой <span class="font-weight-bold back-ground orange">II</span>. При нажатии этой кнопки поселение добавится в список экспорта данных.
+ Нажатие на кнопку <span class="font-weight-bold back-ground yellow">III</span> скроет боковую панель, то же самое произойдет при повторном нажатии на маркер того же самого поселения.
+ Информация о поселении разделена <span class="green">зеленой линией</span>, выше которой расположена постоянная информация о поселении. В этом разделе при наличии отображается история города. Так как история может быть весьма большой, она по умолчанию скрыта и разворачивается по нажатию на кнопку <span class="font-weight-bold back-ground dark-blue">IV</span>.
+ Ниже <span class="green">зеленой линии</span> располагаются секции (отмечены цифрами <span class="font-weight-bold back-ground purple">V</span>) с дополинтельной информацией, среди которой есть источник. Если источником является некоторая ссылка (цифры <span class="font-weight-bold back-ground blue">VI</span>), она будет доступна для перехода.
+ </p>
+ </div>
+ </div>
+ </div>
+
+ <!--Следующий раздел-->
+ <div class="card">
+ <div class="card-header" id="label-export">
+ <h5 class="mb-0">
+ <button class="btn btn-outline-secondary" data-toggle="collapse" data-target="#id-export" aria-expanded="true" aria-controls="id-export">
+ Экспорт данных
+ </button>
+ </h5>
+ </div>
+ <div id="id-export" class="collapse" aria-labelledby="label-export" data-parent="#accordion">
+ <div class="card-body">
+ <!--Текст-->
+ <p>
+ Чтобы выполнить экспорт данных в определенный формат, необходимо в первую очередь добавить несколько поселений в список экспорта, как это было описано в разделе "Подробная информация о поселении".
+ Затем нужно нажать кнопку, представленную на рисунке ниже цифрой <span class="font-weight-bold back-ground red">I</span>.
+ </p>
+ <div class="text-center">
+ <img class="img-fluid" src="@Url.Action("Image", "Home", new { id = "7"})" alt="Правая панель в режиме экспорта">
+ <p hidden>Название рисунка, если оно нужно</p>
+ </div>
+ <p>
+ В результате нажатия на кнопку <span class="font-weight-bold back-ground red">I</span> появится боковая панель <span class="font-weight-bold back-ground green">II</span>, содержащая кнопки экспорта в формат Word (<span class="font-weight-bold back-ground purple">IV</span>) и Excel (<span class="font-weight-bold back-ground dark-blue">V</span>).
+ Кроме того, пользователю еще раз предлагается уточнить, информация о всех ли добавленных поселений должна быть экспортирована.
+ По умолчанию, все поселения отмечены для экспорта (отмечено цифрами <span class="font-weight-bold back-ground orange">III</span>), однако пользователь может снять выделение, либо вернуть его, пока открыта панель.
+ </p>
+ </div>
+ </div>
+ </div>
+
+ @if ((bool)ViewBag.isAuth)
+ {
+ <!--Следующий раздел-->
+ <div class="card">
+ <div class="card-header" id="label-moderator">
+ <h5 class="mb-0">
+ <button class="btn btn-outline-secondary" data-toggle="collapse" data-target="#id-moderator" aria-expanded="true" aria-controls="id-moderator">
+ Модерация данных
+ </button>
+ </h5>
+ </div>
+ <div id="id-moderator" class="collapse" aria-labelledby="label-moderator" data-parent="#accordion">
+ <div class="card-body">
+ <!--Текст-->
+ <p>
+ Получив роль модератора появляется возможность добавления нового поселения на карту с помощью кнопки, отмеченной цифрой <span class="font-weight-bold back-ground red">I</span> на рисунке ниже.
+ </p>
+ <div class="text-center">
+ <img class="img-fluid" src="@Url.Action("Image", "Home", new { id = "8"})" alt="Правая панель в режиме добавления нового поселения">
+ <p hidden>Название рисунка, если оно нужно</p>
+ </div>
+ <p>
+ Панель на рисунке содержит форму ввода данных (цифра <span class="font-weight-bold back-ground green">II</span>), которая позволит добавить новое поселение в онтологию.
+ При нажатии на кнопку «Отправить данные» (цифра <span class="font-weight-bold back-ground orange">III</span>) происходит проверка введенных данных и в случае их корректности, данные формы будут отправлены на сервер.
+ Отмеченные цифрой <span class="font-weight-bold back-ground dark-blue">IV</span> данные являются обязательными для заполнения, так как составляют основу любого поселения, а поля ввода с пометкой цифры <span class="font-weight-bold back-ground purple">V</span> являются дополнительными.
+ Поле ввода URL поселения по умолчанию не редактируется, чтобы URL создавался программным образом на стороне сервера, так как он является уникальным ключом поселения.
+ Однако с помощью селектора <span class="font-weight-bold back-ground blue">VI</span> можно ввести свой URL, при этом поле станет обязательным для заполнения.
+ </p>
+ <br />
+ <p>
+ Новый инструментарий также появляется при открытии подробной информации о поселении (см. рисунок ниже).
+ </p>
+ <div class="text-center">
+ <img class="img-fluid" src="@Url.Action("Image", "Home", new { id = "9"})" alt="Левая панель с новым функционалом">
+ <p class="font-weight-bold">Левая панель с новым функционалом</p>
+ </div>
+ <p>
+ Новые элементы отмечены цифрами <span class="font-weight-bold back-ground">I-IV</span>.
+ При нажатии на кнопку <span class="font-weight-bold back-ground red">I</span> появится правое боковое меню с возможность редактирования сведения об основном поселении (см. рисунок <span class="font-italic">"Редактирование информации основного поселения"</span>).
+ При этом поля ввода правой панели будут заполнены соответствующими данными из левой панели.
+ </p>
+ <div class="text-center">
+ <img class="img-fluid" src="@Url.Action("Image", "Home", new { id = "10"})" alt="Левая и правая панели в режиме редактирования информации основного поселения">
+ <p class="font-weight-bold">Редактирование информации основного поселения</p>
+ </div>
+ <br />
+ <p>
+ Воспользовавшись кнопкой, отмеченной цифрой <span class="font-weight-bold back-ground orange">II</span> на рисунке <span class="font-italic">"Левая панель с новым функционалом"</span>, пользователь увидит в правой панели новую форму добавления новых дополнительных сведений, что показано на рисунке ниже.
+ А если нажать кнопки <span class="font-weight-bold back-ground blue">IV</span>, откроется режим редактирования дополнительной информации.
+ </p>
+ <div class="text-center">
+ <img class="img-fluid" src="@Url.Action("Image", "Home", new { id = "11"})" alt="Правая панель в режиме добавления дополнительной информации о поселении">
+ <p hidden>Название рисунка, если оно нужно</p>
+ </div>
+ <p>
+ На рисунке выше параметры формы, отмеченные цифрой <span class="font-weight-bold back-ground red">I</span>, обязательны для заполнения, так как являются основой для создания сведений.
+ Все остальные параметры не обязательные, однако также проходят проверку на корректность, например, в качестве численности населения нельзя ввести слово.
+ Для упрощения работы с большими массивами было решено сделать список выбора типов поселений и административных единиц (цифры <span class="font-weight-bold back-ground green">II</span> на рисунке).
+ </p>
+ </div>
+ </div>
+ </div>
+
+ <!--Следующий раздел-->
+ <div class="card">
+ <div class="card-header" id="label-doxygen">
+ <h5 class="mb-0">
+ <button class="btn btn-outline-secondary" data-toggle="collapse" data-target="#id-doxygen" aria-expanded="true" aria-controls="id-doxygen">
+ Документация к приложению
+ </button>
+ </h5>
+ </div>
+ <div id="id-doxygen" class="collapse" aria-labelledby="label-doxygen" data-parent="#accordion">
+ <div class="card-body">
+ <!--Текст-->
+ <p>
+ Нажмите <a href="~/Content/html/index.html" target="_blank">сюда</a> для перехода к документации, созданной на основе комментариев с помощью Doxygen.
+ </p>
+ </div>
+ </div>
+ </div>
+ }
+ </div>
+</div>
web-map/Views/Home/Index.cshtml 56(+24 -32)
diff --git a/web-map/Views/Home/Index.cshtml b/web-map/Views/Home/Index.cshtml
index 219cd1d..5fb3b5a 100644
--- a/web-map/Views/Home/Index.cshtml
+++ b/web-map/Views/Home/Index.cshtml
@@ -3,36 +3,28 @@
}
<div class="jumbotron">
- <h1>Домашняя страница</h1>
- <h2>Здесь будет описание проекта</h2>
+ <h5>Кафедра «Истории и культуры отечества» <a href="http://sstu.ru" style="color: #212529;" target="_blank"><ins>Саратовского государственного технического университета имени Гагарина Ю.А.</ins></a> заинтересована в разработке информационного ресурса историко-этнографического содержания в виде интерактивной карты о поселениях Саратовской области.</h5>
+ <br/>
+ <h5>На карте должны быть отображены поселения когда-либо существовавшие и ныне существующие на территории Саратовской области, данных о которых указаны в официальных источниках (переписи населения, архивных документы, научные работы). При этом информация о поселении (название, тип, количество и состав населения и т.п.) должна относиться к определенному году или временному интервалу.</h5>
+ <br/>
+ <h5>В качестве источника данных используется онтология "Поселения Саратовской области", разработанная в рамках данного проекта.</h5>
+ <br/>
+ <div>
+ <h6>Авторами являются:</h6>
+ <ul>
+ <li>
+ студенты Саратовского государственного технического университета имени Гагарина Ю.А. института прикладных информационных технологий и коммуникаций
+ <ul>
+ <li><span><a href="mailto:salin.dv@protonmail.com" target="_blank">Салин Денис</a></span> (разработка приложения интерактивной карты)</li>
+ <li>Гипич Никита (разработка и наполнение онтологии)</li>
+ </ul>
+ </li>
+ <li>
+ профессор кафедры «Информационно-коммуникационные системы и программная инженерия» института прикладных информационных технологий и коммуникаций
+ <ul>
+ <li>д.ф-м.н., профессор, Шульга Татьяна Эриковна</li>
+ </ul>
+ </li>
+ </ul>
+ </div>
</div>
-
-<!--
-<div class="jumbotron">
- <h1>ASP.NET</h1>
- <p class="lead">ASP.NET is a free web framework for building great Web sites and Web applications using HTML, CSS and JavaScript.</p>
- <p><a href="https://asp.net" class="btn btn-primary btn-lg">Learn more »</a></p>
-</div>
-
-<div class="row">
- <div class="col-md-4">
- <h2>Getting started</h2>
- <p>
- ASP.NET MVC gives you a powerful, patterns-based way to build dynamic websites that
- enables a clean separation of concerns and gives you full control over markup
- for enjoyable, agile development.
- </p>
- <p><a class="btn btn-default" href="https://go.microsoft.com/fwlink/?LinkId=301865">Learn more »</a></p>
- </div>
- <div class="col-md-4">
- <h2>Get more libraries</h2>
- <p>NuGet is a free Visual Studio extension that makes it easy to add, remove, and update libraries and tools in Visual Studio projects.</p>
- <p><a class="btn btn-default" href="https://go.microsoft.com/fwlink/?LinkId=301866">Learn more »</a></p>
- </div>
- <div class="col-md-4">
- <h2>Web Hosting</h2>
- <p>You can easily find a web hosting company that offers the right mix of features and price for your applications.</p>
- <p><a class="btn btn-default" href="https://go.microsoft.com/fwlink/?LinkId=301867">Learn more »</a></p>
- </div>
-</div>
--->
web-map/Views/Map/Map.cshtml 47(+44 -3)
diff --git a/web-map/Views/Map/Map.cshtml b/web-map/Views/Map/Map.cshtml
index fb0ac19..4428069 100644
--- a/web-map/Views/Map/Map.cshtml
+++ b/web-map/Views/Map/Map.cshtml
@@ -2,6 +2,45 @@
ViewBag.Title = "Map";
}
+<div class="modal fade bd-example-modal-sm" id="confirmDeleteModal" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
+ <div class="modal-dialog modal-sm modal-dialog-centered">
+ <div class="modal-content">
+ <div class="modal-header">
+ <h5 class="modal-title" id="exampleModalLabel">Требуется подтверждение</h5>
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+ <span aria-hidden="true">×</span>
+ </button>
+ </div>
+ <div id="modal-delete-text" class="modal-body">
+
+ </div>
+ <div class="modal-footer">
+ <button type="button" id="buttonConfirmDelete" class="btn btn-danger" data-dismiss="modal" data-type="" data-url="" data-title="" onclick="startDelete(this)">Удалить</button>
+ <button type="button" id="buttonDismissDelete" class="btn btn-success" data-dismiss="modal">Отменить</button>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div class="modal fade bd-example-modal-sm" id="resultDeleteModal" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
+ <div class="modal-dialog modal-sm modal-dialog-centered">
+ <div class="modal-content">
+ <div class="modal-header">
+ <h5 class="modal-title" id="exampleModalLabel">Результат операции</h5>
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+ <span aria-hidden="true">×</span>
+ </button>
+ </div>
+ <div id="modal-result-text" class="modal-body">
+
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-secondary" data-dismiss="modal">Подтвердить</button>
+ </div>
+ </div>
+ </div>
+</div>
+
<div class="wrapper">
<!-- боковая левая панель -->
<nav id="sidebar-left" class="active rounded-right">
@@ -179,7 +218,11 @@
@if ((bool)ViewBag.isAuth)
{
<script>
- editButtonText = '<button type="button" id="_ID_" class="btn btn-outline-light btn-sm" onclick="printEditImportForm(\'_TYPE_\', \'_ID_\')"><img src="/Content/icon.png" width="20" height="20" /> редактировать</button>';
+ editButtonText = '<div class="row"><div class="col">';
+ editButtonText += '<button type="button" id="_ID_" class="btn btn-outline-light btn-sm" onclick="printEditImportForm(\'_TYPE_\', \'_ID_\')"><img src="/Content/icon.png" width="20" height="20" /> редактировать</button>';
+ editButtonText += '</div><div class="col">';
+ editButtonText += '<button type="button" id="_ID_" class="btn btn-outline-light btn-sm" onclick="deleteElement(\'_TYPE_\', \'_ID_\')"><img src="/Content/delete.png" width="20" height="20" /> удалить</button>';
+ editButtonText += '</div></div>';
document.getElementById('addEditInfo').hidden = false;
</script>
}
@@ -194,5 +237,3 @@
"~/Scripts/SiteScripts/Init.js")}
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" />
-<link rel="stylesheet" href="http://bootstraptema.ru/plugins/2018/irs/ion.rangeSlider.css" />
-<link rel="stylesheet" href="http://bootstraptema.ru/plugins/2018/irs/ion.rangeSlider.skin.css" />
web-map/Views/Shared/_Layout.cshtml 2(+1 -1)
diff --git a/web-map/Views/Shared/_Layout.cshtml b/web-map/Views/Shared/_Layout.cshtml
index 79ae6d8..786b87d 100644
--- a/web-map/Views/Shared/_Layout.cshtml
+++ b/web-map/Views/Shared/_Layout.cshtml
@@ -70,7 +70,7 @@
@RenderBody()
<hr />
<footer>
- <p>© @DateTime.Now.Year – приложение ASP.NET</p>
+ <p>© Историческая интерактивная карта "Поселения Саратовской области"</p>
</footer>
</div>
web-map/web-map.csproj 15(+14 -1)
diff --git a/web-map/web-map.csproj b/web-map/web-map.csproj
index 0091248..5d0f6a1 100644
--- a/web-map/web-map.csproj
+++ b/web-map/web-map.csproj
@@ -174,12 +174,25 @@
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
+ <Content Include="App_Data\Config\Config.xml" />
+ <Content Include="App_Data\pics\1.png" />
+ <Content Include="App_Data\pics\10.png" />
+ <Content Include="App_Data\pics\11.png" />
+ <Content Include="App_Data\pics\2.png" />
+ <Content Include="App_Data\pics\3.png" />
+ <Content Include="App_Data\pics\4.png" />
+ <Content Include="App_Data\pics\5.png" />
+ <Content Include="App_Data\pics\6.png" />
+ <Content Include="App_Data\pics\7.png" />
+ <Content Include="App_Data\pics\8.png" />
+ <Content Include="App_Data\pics\9.png" />
<Content Include="Content\bootstrap-grid.css" />
<Content Include="Content\bootstrap-grid.min.css" />
<Content Include="Content\bootstrap-reboot.css" />
<Content Include="Content\bootstrap-reboot.min.css" />
<Content Include="Content\bootstrap.css" />
<Content Include="Content\bootstrap.min.css" />
+ <Content Include="Content\delete.png" />
<Content Include="Content\icon.png" />
<Content Include="Content\jQRangeSlider-iThing.css" />
<Content Include="Content\jquery-ui\jquery-ui.css" />
@@ -200,6 +213,7 @@
<Content Include="Content\bootstrap-reboot.css.map" />
<Content Include="Content\bootstrap-grid.min.css.map" />
<Content Include="Content\bootstrap-grid.css.map" />
+ <Content Include="ClassDiagram1.cd" />
<None Include="packages.config" />
<None Include="Properties\PublishProfiles\FolderProfile.pubxml" />
<Content Include="Scripts\bootstrap.bundle.js" />
@@ -273,7 +287,6 @@
<Content Include="Views\Account\Login.cshtml" />
</ItemGroup>
<ItemGroup>
- <Folder Include="App_Data\" />
<Folder Include="Views\Base\" />
<Folder Include="Views\MapAPI\" />
</ItemGroup>