From 4518298aafebb4f8288722fc3e320476b5c04b46 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Thu, 28 Jun 2018 23:37:38 +0000 Subject: [PATCH] --- .vscode/launch.json | 46 + .vscode/tasks.json | 16 + Controllers/ApiMetaController.cs | 38 + Controllers/AuthController.cs | 118 + Controllers/AutocompleteController.cs | 97 + Controllers/CustomerController.cs | 271 + Controllers/FetchController.cs | 84 + Controllers/LicenseController.cs | 238 + Controllers/LicenseTemplatesController.cs | 127 + Controllers/MailController.cs | 80 + Controllers/ProductController.cs | 129 + Controllers/PurchaseController.cs | 248 + Controllers/ReportController.cs | 201 + Controllers/RfCaseBlobController.cs | 220 + Controllers/RfCaseController.cs | 230 + Controllers/RfCaseProjectController.cs | 130 + Controllers/RvfController.cs | 60 + Controllers/RvrController.cs | 60 + Controllers/SearchController.cs | 184 + Controllers/SiteController.cs | 212 + Controllers/SubscriptionController.cs | 128 + Controllers/TextTemplateController.cs | 137 + Controllers/UserController.cs | 172 + Models/Customer.cs | 37 + Models/License.cs | 21 + Models/LicenseTemplates.cs | 18 + Models/Product.cs | 15 + Models/Purchase.cs | 29 + Models/RfCase.cs | 29 + Models/RfCaseBlob.cs | 14 + Models/RfCaseProject.cs | 19 + Models/Site.cs | 39 + Models/TextTemplate.cs | 12 + Models/User.cs | 17 + Models/dtoKeyOptions.cs | 68 + Models/dtoKeyRequestResponse.cs | 18 + Models/dtoLicenseListItem.cs | 15 + Models/dtoNameIdActiveItem.cs | 10 + Models/dtoNameIdChildrenItem.cs | 18 + Models/dtoNameIdItem.cs | 9 + Models/rockfishContext.cs | 532 ++ Program.cs | 66 + Startup.cs | 105 + appsettings.Development.json | 10 + appsettings.json | 15 + notes/deploy.txt | 28 + notes/notes.txt | 114 + notes/todo | 0 rockfishCore.csproj | 17 + util/CustomerUtils.cs | 88 + util/DateUtil.cs | 104 + util/FBImporter.cs | 591 ++ util/HexString.cs | 44 + util/KeyFactory.cs | 521 ++ util/MimeTypeMap.cs | 733 ++ util/RavenKeyFactory.cs | 425 ++ util/RfMail.cs | 563 ++ util/RfNotify.cs | 128 + util/RfResponse.cs | 21 + util/RfSchema.cs | 389 ++ util/RfVersion.cs | 8 + util/TrialKeyRequestHandler.cs | 183 + util/fetchkeycode.cs | 35 + util/hasher.cs | 38 + util/rfLogger.cs | 40 + wwwroot/android-chrome-192x192.png | Bin 0 -> 8505 bytes wwwroot/apple-touch-icon.png | Bin 0 -> 7721 bytes wwwroot/browserconfig.xml | 9 + wwwroot/css/app.css | 29 + wwwroot/css/materialdesignicons.min.css | 2 + wwwroot/css/mdi-bs4-compat.css | 40 + wwwroot/default.htm | 127 + wwwroot/favicon-16x16.png | Bin 0 -> 686 bytes wwwroot/favicon-32x32.png | Bin 0 -> 1480 bytes wwwroot/favicon.ico | Bin 0 -> 15086 bytes wwwroot/fonts/materialdesignicons-webfont.eot | Bin 0 -> 292776 bytes wwwroot/fonts/materialdesignicons-webfont.svg | 6150 +++++++++++++++++ wwwroot/fonts/materialdesignicons-webfont.ttf | Bin 0 -> 292556 bytes .../fonts/materialdesignicons-webfont.woff | Bin 0 -> 144072 bytes .../fonts/materialdesignicons-webfont.woff2 | Bin 0 -> 109248 bytes wwwroot/img/flag.png | Bin 0 -> 27125 bytes wwwroot/js/app.api.js | 337 + wwwroot/js/app.authenticate.js | 103 + wwwroot/js/app.customerEdit.js | 143 + wwwroot/js/app.customerSiteEdit.js | 168 + wwwroot/js/app.customerSites.js | 131 + wwwroot/js/app.customers.js | 192 + wwwroot/js/app.fourohfour.js | 56 + wwwroot/js/app.inbox.js | 167 + wwwroot/js/app.license.js | 156 + wwwroot/js/app.licenseRequestEdit.js | 138 + wwwroot/js/app.licenseTemplates.js | 102 + wwwroot/js/app.licenseView.js | 116 + wwwroot/js/app.licenses.js | 108 + wwwroot/js/app.mailEdit.js | 160 + wwwroot/js/app.nav.js | 102 + wwwroot/js/app.purchaseEdit.js | 266 + wwwroot/js/app.purchases.js | 145 + wwwroot/js/app.reportData.js | 67 + wwwroot/js/app.reportDataExpires.js | 79 + wwwroot/js/app.reportDataProdEmail.js | 139 + wwwroot/js/app.rfcaseEdit.js | 283 + wwwroot/js/app.rfcases.js | 196 + wwwroot/js/app.rfsettings.js | 101 + wwwroot/js/app.search.js | 119 + wwwroot/js/app.shell.js | 561 ++ wwwroot/js/app.subnotify.js | 132 + wwwroot/js/app.subscription.js | 69 + wwwroot/js/app.templateEdit.js | 141 + wwwroot/js/app.templates.js | 68 + wwwroot/js/app.util.js | 80 + wwwroot/js/app.utilB.js | 334 + wwwroot/js/index.js | 23 + wwwroot/js/lib/handlebars.runtime-v4.0.5.js | 1240 ++++ wwwroot/js/lib/jquery.autocomplete.min.js | 8 + wwwroot/js/lib/jquery.event.gevent.js | 154 + wwwroot/js/lib/jquery.event.ue.js | 783 +++ wwwroot/js/lib/jquery.gzserialize.js | 87 + wwwroot/js/lib/moment.min.js | 7 + wwwroot/js/lib/page.js | 1113 +++ wwwroot/js/lib/store.min.js | 7 + .../js/templates/app.authenticate.handlebars | 9 + .../js/templates/app.customerEdit.handlebars | 54 + .../templates/app.customerSiteEdit.handlebars | 88 + .../js/templates/app.customerSites.handlebars | 3 + wwwroot/js/templates/app.customers.handlebars | 4 + .../js/templates/app.fourohfour.handlebars | 3 + wwwroot/js/templates/app.inbox.handlebars | 3 + wwwroot/js/templates/app.license.handlebars | 183 + .../app.licenseRequestEdit.handlebars | 26 + .../templates/app.licenseTemplates.handlebars | 75 + .../js/templates/app.licenseView.handlebars | 56 + wwwroot/js/templates/app.licenses.handlebars | 3 + wwwroot/js/templates/app.mailEdit.handlebars | 30 + .../js/templates/app.purchaseEdit.handlebars | 82 + wwwroot/js/templates/app.purchases.handlebars | 3 + .../js/templates/app.reportData.handlebars | 3 + .../app.reportDataExpires.handlebars | 4 + .../app.reportDataProdEmail.handlebars | 32 + .../js/templates/app.rfcaseEdit.handlebars | 109 + wwwroot/js/templates/app.rfcases.handlebars | 50 + .../js/templates/app.rfsettings.handlebars | 15 + wwwroot/js/templates/app.search.handlebars | 18 + wwwroot/js/templates/app.shell.handlebars | 57 + wwwroot/js/templates/app.subnotify.handlebars | 4 + .../js/templates/app.subscription.handlebars | 3 + .../js/templates/app.templateEdit.handlebars | 28 + wwwroot/js/templates/app.templates.handlebars | 3 + wwwroot/js/templates/templates.js | 2 + wwwroot/manifest.json | 13 + wwwroot/mstile-150x150.png | Bin 0 -> 5026 bytes wwwroot/safari-pinned-tab.svg | 1 + 152 files changed, 24114 insertions(+) create mode 100644 .vscode/launch.json create mode 100644 .vscode/tasks.json create mode 100644 Controllers/ApiMetaController.cs create mode 100644 Controllers/AuthController.cs create mode 100644 Controllers/AutocompleteController.cs create mode 100644 Controllers/CustomerController.cs create mode 100644 Controllers/FetchController.cs create mode 100644 Controllers/LicenseController.cs create mode 100644 Controllers/LicenseTemplatesController.cs create mode 100644 Controllers/MailController.cs create mode 100644 Controllers/ProductController.cs create mode 100644 Controllers/PurchaseController.cs create mode 100644 Controllers/ReportController.cs create mode 100644 Controllers/RfCaseBlobController.cs create mode 100644 Controllers/RfCaseController.cs create mode 100644 Controllers/RfCaseProjectController.cs create mode 100644 Controllers/RvfController.cs create mode 100644 Controllers/RvrController.cs create mode 100644 Controllers/SearchController.cs create mode 100644 Controllers/SiteController.cs create mode 100644 Controllers/SubscriptionController.cs create mode 100644 Controllers/TextTemplateController.cs create mode 100644 Controllers/UserController.cs create mode 100644 Models/Customer.cs create mode 100644 Models/License.cs create mode 100644 Models/LicenseTemplates.cs create mode 100644 Models/Product.cs create mode 100644 Models/Purchase.cs create mode 100644 Models/RfCase.cs create mode 100644 Models/RfCaseBlob.cs create mode 100644 Models/RfCaseProject.cs create mode 100644 Models/Site.cs create mode 100644 Models/TextTemplate.cs create mode 100644 Models/User.cs create mode 100644 Models/dtoKeyOptions.cs create mode 100644 Models/dtoKeyRequestResponse.cs create mode 100644 Models/dtoLicenseListItem.cs create mode 100644 Models/dtoNameIdActiveItem.cs create mode 100644 Models/dtoNameIdChildrenItem.cs create mode 100644 Models/dtoNameIdItem.cs create mode 100644 Models/rockfishContext.cs create mode 100644 Program.cs create mode 100644 Startup.cs create mode 100644 appsettings.Development.json create mode 100644 appsettings.json create mode 100644 notes/deploy.txt create mode 100644 notes/notes.txt create mode 100644 notes/todo create mode 100644 rockfishCore.csproj create mode 100644 util/CustomerUtils.cs create mode 100644 util/DateUtil.cs create mode 100644 util/FBImporter.cs create mode 100644 util/HexString.cs create mode 100644 util/KeyFactory.cs create mode 100644 util/MimeTypeMap.cs create mode 100644 util/RavenKeyFactory.cs create mode 100644 util/RfMail.cs create mode 100644 util/RfNotify.cs create mode 100644 util/RfResponse.cs create mode 100644 util/RfSchema.cs create mode 100644 util/RfVersion.cs create mode 100644 util/TrialKeyRequestHandler.cs create mode 100644 util/fetchkeycode.cs create mode 100644 util/hasher.cs create mode 100644 util/rfLogger.cs create mode 100644 wwwroot/android-chrome-192x192.png create mode 100644 wwwroot/apple-touch-icon.png create mode 100644 wwwroot/browserconfig.xml create mode 100644 wwwroot/css/app.css create mode 100644 wwwroot/css/materialdesignicons.min.css create mode 100644 wwwroot/css/mdi-bs4-compat.css create mode 100644 wwwroot/default.htm create mode 100644 wwwroot/favicon-16x16.png create mode 100644 wwwroot/favicon-32x32.png create mode 100644 wwwroot/favicon.ico create mode 100644 wwwroot/fonts/materialdesignicons-webfont.eot create mode 100644 wwwroot/fonts/materialdesignicons-webfont.svg create mode 100644 wwwroot/fonts/materialdesignicons-webfont.ttf create mode 100644 wwwroot/fonts/materialdesignicons-webfont.woff create mode 100644 wwwroot/fonts/materialdesignicons-webfont.woff2 create mode 100644 wwwroot/img/flag.png create mode 100644 wwwroot/js/app.api.js create mode 100644 wwwroot/js/app.authenticate.js create mode 100644 wwwroot/js/app.customerEdit.js create mode 100644 wwwroot/js/app.customerSiteEdit.js create mode 100644 wwwroot/js/app.customerSites.js create mode 100644 wwwroot/js/app.customers.js create mode 100644 wwwroot/js/app.fourohfour.js create mode 100644 wwwroot/js/app.inbox.js create mode 100644 wwwroot/js/app.license.js create mode 100644 wwwroot/js/app.licenseRequestEdit.js create mode 100644 wwwroot/js/app.licenseTemplates.js create mode 100644 wwwroot/js/app.licenseView.js create mode 100644 wwwroot/js/app.licenses.js create mode 100644 wwwroot/js/app.mailEdit.js create mode 100644 wwwroot/js/app.nav.js create mode 100644 wwwroot/js/app.purchaseEdit.js create mode 100644 wwwroot/js/app.purchases.js create mode 100644 wwwroot/js/app.reportData.js create mode 100644 wwwroot/js/app.reportDataExpires.js create mode 100644 wwwroot/js/app.reportDataProdEmail.js create mode 100644 wwwroot/js/app.rfcaseEdit.js create mode 100644 wwwroot/js/app.rfcases.js create mode 100644 wwwroot/js/app.rfsettings.js create mode 100644 wwwroot/js/app.search.js create mode 100644 wwwroot/js/app.shell.js create mode 100644 wwwroot/js/app.subnotify.js create mode 100644 wwwroot/js/app.subscription.js create mode 100644 wwwroot/js/app.templateEdit.js create mode 100644 wwwroot/js/app.templates.js create mode 100644 wwwroot/js/app.util.js create mode 100644 wwwroot/js/app.utilB.js create mode 100644 wwwroot/js/index.js create mode 100644 wwwroot/js/lib/handlebars.runtime-v4.0.5.js create mode 100644 wwwroot/js/lib/jquery.autocomplete.min.js create mode 100644 wwwroot/js/lib/jquery.event.gevent.js create mode 100644 wwwroot/js/lib/jquery.event.ue.js create mode 100644 wwwroot/js/lib/jquery.gzserialize.js create mode 100644 wwwroot/js/lib/moment.min.js create mode 100644 wwwroot/js/lib/page.js create mode 100644 wwwroot/js/lib/store.min.js create mode 100644 wwwroot/js/templates/app.authenticate.handlebars create mode 100644 wwwroot/js/templates/app.customerEdit.handlebars create mode 100644 wwwroot/js/templates/app.customerSiteEdit.handlebars create mode 100644 wwwroot/js/templates/app.customerSites.handlebars create mode 100644 wwwroot/js/templates/app.customers.handlebars create mode 100644 wwwroot/js/templates/app.fourohfour.handlebars create mode 100644 wwwroot/js/templates/app.inbox.handlebars create mode 100644 wwwroot/js/templates/app.license.handlebars create mode 100644 wwwroot/js/templates/app.licenseRequestEdit.handlebars create mode 100644 wwwroot/js/templates/app.licenseTemplates.handlebars create mode 100644 wwwroot/js/templates/app.licenseView.handlebars create mode 100644 wwwroot/js/templates/app.licenses.handlebars create mode 100644 wwwroot/js/templates/app.mailEdit.handlebars create mode 100644 wwwroot/js/templates/app.purchaseEdit.handlebars create mode 100644 wwwroot/js/templates/app.purchases.handlebars create mode 100644 wwwroot/js/templates/app.reportData.handlebars create mode 100644 wwwroot/js/templates/app.reportDataExpires.handlebars create mode 100644 wwwroot/js/templates/app.reportDataProdEmail.handlebars create mode 100644 wwwroot/js/templates/app.rfcaseEdit.handlebars create mode 100644 wwwroot/js/templates/app.rfcases.handlebars create mode 100644 wwwroot/js/templates/app.rfsettings.handlebars create mode 100644 wwwroot/js/templates/app.search.handlebars create mode 100644 wwwroot/js/templates/app.shell.handlebars create mode 100644 wwwroot/js/templates/app.subnotify.handlebars create mode 100644 wwwroot/js/templates/app.subscription.handlebars create mode 100644 wwwroot/js/templates/app.templateEdit.handlebars create mode 100644 wwwroot/js/templates/app.templates.handlebars create mode 100644 wwwroot/js/templates/templates.js create mode 100644 wwwroot/manifest.json create mode 100644 wwwroot/mstile-150x150.png create mode 100644 wwwroot/safari-pinned-tab.svg diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..6679350 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,46 @@ +{ + // Use IntelliSense to find out which attributes exist for C# debugging + // Use hover for the description of the existing attributes + // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md + "version": "0.2.0", + "configurations": [ + { + "name": ".NET Core Launch (web)", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", + // If you have changed target frameworks, make sure to update the program path. + "program": "${workspaceRoot}/bin/Debug/netcoreapp2.1/rockfishCore.dll", + "args": [], + "cwd": "${workspaceRoot}", + "stopAtEntry": false, + "internalConsoleOptions": "openOnSessionStart", + "launchBrowser": { + "enabled": true, + "args": "${auto-detect-url}/", + "windows": { + "command": "cmd.exe", + "args": "/C start http://localhost:5000/" + }, + "osx": { + "command": "open" + }, + "linux": { + "command": "xdg-open" + } + }, + "env": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "sourceFileMap": { + "/Views": "${workspaceRoot}/Views" + } + }, + { + "name": ".NET Core Attach", + "type": "coreclr", + "request": "attach", + "processId": "${command:pickProcess}" + } + ] +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..a852302 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,16 @@ +{ + "version": "0.1.0", + "command": "dotnet", + "isShellCommand": true, + "args": [], + "tasks": [ + { + "taskName": "build", + "args": [ + "${workspaceRoot}/rockfishCore.csproj" + ], + "isBuildCommand": true, + "problemMatcher": "$msCompile" + } + ] +} \ No newline at end of file diff --git a/Controllers/ApiMetaController.cs b/Controllers/ApiMetaController.cs new file mode 100644 index 0000000..78de30a --- /dev/null +++ b/Controllers/ApiMetaController.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using rockfishCore.Util; + +namespace rockfishCore.Controllers +{ + [Produces("application/json")] + [Route("api/meta")] + public class ApiMetaController : Controller + { + //This controller is for fetching information *about* the server and the api itself + + public ApiMetaController() + { + + } + + + + // GET: api/meta/serverversion + [HttpGet("server_version")] + public ActionResult Get() + { + return Ok(new {server_version=RfVersion.NumberOnly}); + + } + + + + + + + } +} \ No newline at end of file diff --git a/Controllers/AuthController.cs b/Controllers/AuthController.cs new file mode 100644 index 0000000..25788e7 --- /dev/null +++ b/Controllers/AuthController.cs @@ -0,0 +1,118 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Mvc; +using rockfishCore.Models; +using rockfishCore.Util; +using System.Linq; +using System; + +//required to inject configuration in constructor +using Microsoft.Extensions.Configuration; + +namespace rockfishCore.Controllers +{ + //Authentication controller + public class AuthController : Controller + { + private readonly rockfishContext _context; + private readonly IConfiguration _configuration; + public AuthController(rockfishContext context, IConfiguration configuration)//these two are injected, see startup.cs + { + _context = context; + _configuration = configuration; + } + + //AUTHENTICATE CREDS + //RETURN JWT + + [HttpPost("/authenticate")] + public JsonResult PostCreds(string login, string password) //if was a json body then //public JsonResult PostCreds([FromBody] string login, [FromBody] string password) + { + int nFailedAuthDelay = 10000; + + if (string.IsNullOrWhiteSpace(login) || string.IsNullOrWhiteSpace(password)) + { + //Make a failed pw wait + System.Threading.Thread.Sleep(nFailedAuthDelay); + return Json(new { msg = "authentication failed", error = 1 }); + } + +//DANGER DANGER - this assumes all logins are different...boo bad code +//FIXME +//BUGBUG +//TODO +//ETC +/*HOW TO FIX: because of the salt during login it must assume multiple users with the same login and + fetch each in turn, get the salt, hash the entered password and compare to the password stored password + + So, instead of singleordefault must be assumed to be a collection of users returned in this code: + */ + var user = _context.User.SingleOrDefault(m => m.Login == login); + + if (user == null) + { + //Make a failed pw wait + System.Threading.Thread.Sleep(nFailedAuthDelay); + return Json(new { msg = "authentication failed", error = 1 }); + } + + // string pwnew=Hasher.hash(user.Salt,"2df5cc611ee485d4aa897350daa045caa4015147ae34c6b7b363f1def605d305"); + + string hashed = Hasher.hash(user.Salt, password); + if (hashed == user.Password) + { + //get teh secret from appsettings.json + var secret = _configuration.GetSection("JWT").GetValue("secret"); + byte[] secretKey = System.Text.Encoding.ASCII.GetBytes(secret); + + var iat = new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds(); + var exp = new DateTimeOffset(DateTime.Now.AddDays(30)).ToUnixTimeSeconds(); + + //Generate a download token and store it with the user account and return it for the client + Guid g = Guid.NewGuid(); + string dlkey = Convert.ToBase64String(g.ToByteArray()); + dlkey = dlkey.Replace("=", ""); + dlkey = dlkey.Replace("+", ""); + + user.DlKey = dlkey; + user.DlKeyExp=exp; + _context.User.Update(user); + _context.SaveChanges(); + + + var payload = new Dictionary() + { + { "iat", iat.ToString() }, + { "exp", exp.ToString() }, + { "iss", "rockfishCore" }, + { "id", user.Id.ToString() } + }; + + + //NOTE: probably don't need Jose.JWT as am using Microsoft jwt stuff to validate routes so it should also be able to + //issue tokens as well, but it looked cmplex and this works so unless need to remove in future keeping it. + string token = Jose.JWT.Encode(payload, secretKey, Jose.JwsAlgorithm.HS256); + //string jsonDecoded = Jose.JWT.Decode(token, secretKey); + + return Json(new + { + ok = 1, + issued = iat, + expires = exp, + token = token, + dlkey = dlkey, + name = user.Name, + id = user.Id + }); + } + else + { + //Make a failed pw wait + System.Threading.Thread.Sleep(nFailedAuthDelay); + return Json(new { msg = "authentication failed", error = 1 }); + } + } + + //------------------------------------------------------ + + }//eoc +}//eons \ No newline at end of file diff --git a/Controllers/AutocompleteController.cs b/Controllers/AutocompleteController.cs new file mode 100644 index 0000000..62f344e --- /dev/null +++ b/Controllers/AutocompleteController.cs @@ -0,0 +1,97 @@ + +using System.Collections.Generic; +using Microsoft.AspNetCore.Mvc; +using rockfishCore.Models; +using rockfishCore.Util; +using System.Linq; +using System; + +//requried to inject configuration in constructor +using Microsoft.Extensions.Configuration; +using Microsoft.AspNetCore.Authorization; + +using Microsoft.EntityFrameworkCore; + +namespace rockfishCore.Controllers +{ + [Produces("application/json")] + [Route("api/autocomplete")] + [Authorize] + public class AutocompleteController : Controller + { + private readonly rockfishContext _context; + private readonly IConfiguration _configuration; + public AutocompleteController(rockfishContext context, IConfiguration configuration)//these two are injected, see startup.cs + { + _context = context; + _configuration = configuration; + } + + + + + [HttpGet] + public JsonResult GetAutocomplete(string acget, string query) //get parameters from url not body + { + //TODO: if, in future need more might want to make acget a csv string for multi table / field search + //ACGET is a collection name and field 'purchase.name' + //QUERY is just the characters typed so far, could be one or more + + //default return value, emtpy suggestions + var ret = new { suggestions = new string[] { } }; + + if (string.IsNullOrWhiteSpace(acget) || string.IsNullOrWhiteSpace(query)) + { + return Json(ret); + } + + + string[] acgetsplit = acget.Split('.'); + string col = acgetsplit[0]; + string fld = acgetsplit[1]; + + List resultList = new List(); + + using (var command = _context.Database.GetDbConnection().CreateCommand()) + { + + command.CommandText = "SELECT DISTINCT " + fld + " From " + col + " where " + fld + " like @q ORDER BY " + fld + ";"; + var parameter = command.CreateParameter(); + parameter.ParameterName = "@q"; + parameter.Value = "%" + query + "%"; + command.Parameters.Add(parameter); + + _context.Database.OpenConnection(); + using (var res = command.ExecuteReader()) + { + + if (res.HasRows) + { + while (res.Read()) + { + resultList.Add(res.GetString(0)); + } + } + } + _context.Database.CloseConnection(); + } + return Json(new { suggestions = resultList }); + } + + + + + //------------------------------------------------------ + + }//eoc +}//eons + + +//enter 'a' in purchase product name get: + +/* +GET request url: +https://rockfish.ayanova.com/api/autocomplete?acget=purchase.name&query=A + +Response: +{"suggestions":["CANCELED Up to 5","CANCELED RI","CANCELED WBI","QBI Renewal","OLI Renewal","MBI Renewal","CANCELED Outlook Schedule Export","Quick Notification Renewal","RI Renewal","WBI Renewal","Up to 5 Renewal","Outlook Schedule Export Renewal","Single Renewal","Export to XLS Renewal","Importexport.csv duplicate Renewal","Export To XLS Renewal","Up to 10 Renewal","Up to 20 RENEWAL","CANCELED Single","Quick Notification","Importexport.csv duplicate","CANCELED MBI","CANCELED OLI","CANCELED QBI","CANCELED Quick Notification","Quick Notification ","Key Administration","AyaNova Lite","PTI - Renewal"]} */ diff --git a/Controllers/CustomerController.cs b/Controllers/CustomerController.cs new file mode 100644 index 0000000..2f5a0c4 --- /dev/null +++ b/Controllers/CustomerController.cs @@ -0,0 +1,271 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; + +using Microsoft.AspNetCore.Authorization; +using rockfishCore.Models; +using rockfishCore.Util; + +namespace rockfishCore.Controllers +{ + [Produces("application/json")] + [Route("api/Customer")] + [Authorize] + public class CustomerController : Controller + { + private readonly rockfishContext _context; + + public CustomerController(rockfishContext context) + { + _context = context; + } + + //Get api/customer/list + [HttpGet("list")] + public IEnumerable GetList() + { + + var res = from c in _context.Customer.OrderBy(c => c.Name) + select new dtoNameIdActiveItem + { + active = c.Active, + id = c.Id, + name = c.Name + }; + return res.ToList(); + } + + + //Get api/customer/77/sitelist + [HttpGet("{id}/sitelist")] + public IEnumerable GetSiteList([FromRoute] long id) + { + + var res = from c in _context.Site + .Where(c => c.CustomerId.Equals(id)).OrderBy(c => c.Name) + select new dtoNameIdItem + { + id = c.Id, + name = c.Name + }; + return res.ToList(); + } + + + //Get api/customer/77/activesubbysite + [HttpGet("{id}/activesubforsites")] + public IEnumerable GetActiveSubsForSites([FromRoute] long id) + { + + var res = from c in _context.Site + .Where(c => c.CustomerId.Equals(id)).OrderBy(c => c.Name) + select new dtoNameIdChildrenItem + { + id = c.Id, + name = c.Name + }; + + //Force immediate query execution + var resList = res.ToList(); + + foreach (dtoNameIdChildrenItem child in resList) + { + var subs = from c in _context.Purchase + .Where(c => c.SiteId.Equals(child.id)) + .Where(c => c.CancelDate == null) + .OrderByDescending(c => c.PurchaseDate) + select new dtoNameIdItem + { + id = c.Id, + name = c.Name + " exp: " + DateUtil.EpochToString(c.ExpireDate, "d") + }; + + foreach (dtoNameIdItem sub in subs) + { + child.children.Add(sub); + } + } + + return resList; + } + + + + //Get api/customer/77/sites + [HttpGet("{id}/sites")] + public IEnumerable GetSites([FromRoute] long id) + { + //from https://docs.microsoft.com/en-us/ef/core/querying/basic + var sites = _context.Site + .Where(b => b.CustomerId.Equals(id)) + .OrderByDescending(b => b.Id) + .ToList(); + return sites; + } + + + // //Get api/customer/77/contacts + // [HttpGet("{id}/contacts")] + // public IEnumerable GetContacts([FromRoute] long id) + // { + // var contacts = _context.Contact + // .Where(b => b.CustomerId.Equals(id)) + // .OrderByDescending(b => b.Id) + // .ToList(); + // return contacts; + // } + + + // //Get api/customer/77/notifications + // [HttpGet("{id}/notifications")] + // public IEnumerable GetNotifications([FromRoute] long id) + // { + // var notifications = _context.Notification + // .Where(b => b.CustomerId.Equals(id)) + // .OrderByDescending(b => b.SentDate) + // .ToList(); + // return notifications; + // } + + + //Get api/customer/77/name + [HttpGet("{id}/name")] + public async Task GetName([FromRoute] long id) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + //BUGBUG: this is bombing once in a while + //System.InvalidOperationException: Sequence contains no elements + //on this client url + //http://localhost:5000/default.htm#!/customerSites/85 + + var ret = await _context.Customer + .Select(r => new { r.Id, r.Name }) + .Where(r => r.Id == id) + .FirstAsync(); + return Ok(ret); + } + + + + + + //------------- + //CRUD ROUTES + //------------- + + // GET: api/Customer + //????? DA FUCK IS THIS ROUTE FOR ????? + [HttpGet] + public IEnumerable GetCustomer() + { + return _context.Customer; + } + + + + + // GET: api/Customer/5 + [HttpGet("{id}")] + public async Task GetCustomer([FromRoute] long id) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + var customer = await _context.Customer.SingleOrDefaultAsync(m => m.Id == id); + + if (customer == null) + { + return NotFound(); + } + + return Ok(customer); + } + + // PUT: api/Customer/5 + [HttpPut("{id}")] + public async Task PutCustomer([FromRoute] long id, [FromBody] Customer customer) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + if (id != customer.Id) + { + return BadRequest(); + } + + _context.Entry(customer).State = EntityState.Modified; + + try + { + await _context.SaveChangesAsync(); + } + catch (DbUpdateConcurrencyException) + { + if (!CustomerExists(id)) + { + return NotFound(); + } + else + { + throw; + } + } + + + return NoContent(); + } + + // POST: api/Customer + [HttpPost] + public async Task PostCustomer([FromBody] Customer customer) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + _context.Customer.Add(customer); + await _context.SaveChangesAsync(); + + return CreatedAtAction("GetCustomer", new { id = customer.Id }, customer); + } + + // DELETE: api/Customer/5 + [HttpDelete("{id}")] + public async Task DeleteCustomer([FromRoute] long id) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + var customer = await _context.Customer.SingleOrDefaultAsync(m => m.Id == id); + if (customer == null) + { + return NotFound(); + } + + _context.Customer.Remove(customer); + await _context.SaveChangesAsync(); + + return Ok(customer); + } + + private bool CustomerExists(long id) + { + return _context.Customer.Any(e => e.Id == id); + } + } +} \ No newline at end of file diff --git a/Controllers/FetchController.cs b/Controllers/FetchController.cs new file mode 100644 index 0000000..f685228 --- /dev/null +++ b/Controllers/FetchController.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Authorization; +using Microsoft.EntityFrameworkCore; +using rockfishCore.Models; +using rockfishCore.Util; + +namespace rockfishCore.Controllers +{ + [Produces("text/plain")] + [Route("fetch")] + + public class FetchController : Controller + { + private readonly rockfishContext _context; + + public FetchController(rockfishContext context) + { + _context = context; + } + + + + // GET: fetch/somecode/bob@bob.com + [HttpGet("{code}/{email}")] + public async Task Get([FromRoute] string code, [FromRoute] string email) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + var rec = await _context.License.SingleOrDefaultAsync(m => m.Code == code.Trim() && m.Email == email.Trim().ToLowerInvariant() && m.Fetched == false); + + if (rec == null) + { + //delay, could be someone fishing for a key, make it painful + //Have verified this is safe, won't affect other jobs on server + //happening concurrently or other requests to server + System.Threading.Thread.Sleep(10000); + return NotFound(); + } + + + rec.Fetched = true; + rec.DtFetched = DateUtil.NowAsEpoch(); + //This might be flaky if behind some other stuff + //rec.FetchFrom = HttpContext.Connection.RemoteIpAddress.ToString(); + _context.Entry(rec).State = EntityState.Modified; + + try + { + await _context.SaveChangesAsync(); + } + catch (DbUpdateConcurrencyException) + { + if (!LicenseExists(rec.Id)) + { + return NotFound(); + } + else + { + throw; + } + } + + return Ok(rec.Key); + //return Ok(new {key=rec.Key}); + } + + + + + + private bool LicenseExists(long id) + { + return _context.License.Any(e => e.Id == id); + } + } +} \ No newline at end of file diff --git a/Controllers/LicenseController.cs b/Controllers/LicenseController.cs new file mode 100644 index 0000000..de0c289 --- /dev/null +++ b/Controllers/LicenseController.cs @@ -0,0 +1,238 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Authorization;//required for authorize attribute +using System.Security.Claims; +using rockfishCore.Models; +using rockfishCore.Util; +using System.Linq; +using System; + +//case 3233 +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; + +//requried to inject configuration in constructor +using Microsoft.Extensions.Configuration; + +//This is an 80 character line of text: +//############################################################################## +namespace rockfishCore.Controllers +{ + //Authentication controller + [Produces("application/json")] + [Route("api/License")] + [Authorize] + public class LicenseController : Controller + { + private readonly rockfishContext _context; + private readonly IConfiguration _configuration; + public LicenseController(rockfishContext context, IConfiguration configuration)//these two are injected, see startup.cs + { + _context = context;//Keeping db context here for future where I will be inserting the keys into the db upon generation + _configuration = configuration; + } + + + /////////////////////////////////////////////////////////////////////// + //KEYGEN ROUTES + + //Given key options return the message ready to send to the user + //Note this returns a key as plain text content result + //called by rockfish client app.license.js (who calls app.api.createLicense) + [HttpPost("generate")] + public ContentResult Generate([FromBody] dtoKeyOptions ko) + { + var templates = _context.LicenseTemplates.ToList()[0]; + ko.authorizedUserKeyGeneratorStamp = GetRFAuthorizedUserStamp(); + string sKey = KeyFactory.GetKeyReply(ko, templates, _context); + return Content(sKey); + } + + + + //Fetch key request emails + [HttpGet("requests")] + public JsonResult GetRequests() + { + return Json(TrialKeyRequestHandler.Requests()); + } + + //Fetch generated responses + //Generate a key from a license key request email + //called by rockfish client app.licenseRequestEdit.js (who calls app.api.generateFromRequest) + [HttpGet("generateFromRequest/{uid}")] + public JsonResult GenerateFromRequest([FromRoute] uint uid) + { + var templates = _context.LicenseTemplates.ToList()[0]; + return Json(TrialKeyRequestHandler.GenerateFromRequest(uid, templates, GetRFAuthorizedUserStamp(), _context)); + } + + // SEND REQUESTED KEY ROUTE + //app.post('/api/license/email_response', function (req, res) { + [HttpPost("email_response")] + public JsonResult EmailResponse([FromBody] dtoKeyRequestResponse k) + { + return Json(TrialKeyRequestHandler.SendTrialRequestResponse(k)); + } + + + + + + /////////////////////////////////////////////////////////// + // STORED LICENSE KEY CRUD ROUTES + // + + //case 3233 Get api/license/list a list of generated licenses + [HttpGet("list")] + public IEnumerable GetList() + { + var res = from c in _context.License.OrderByDescending(c => c.DtCreated) + select new dtoLicenseListItem + { + id = c.Id, + created = c.DtCreated, + regto = c.RegTo, + fetched = c.Fetched, + trial = (c.CustomerId==0) + }; + return res.ToList(); + } + + //case 3233 GET: api/License/5 + [HttpGet("{id}")] + public async Task GetLicense([FromRoute] long id) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + var l = await _context.License.SingleOrDefaultAsync(m => m.Id == id); + + if (l == null) + { + return NotFound(); + } + + string customerName = ""; + + if (l.CustomerId != 0) + { + if (_context.Customer.Any(e => e.Id == l.CustomerId)) + { + + var cust = await _context.Customer + .Select(r => new { r.Id, r.Name }) + .Where(r => r.Id == l.CustomerId) + .FirstAsync(); + customerName=cust.Name; + } + else + { + customerName = "< Customer " + l.CustomerId.ToString() + " not found (deleted?) >"; + } + } + + var ret = new + { + regTo = l.RegTo, + customerName = customerName, + dtcreated = l.DtCreated, + email = l.Email, + code = l.Code, + fetched = l.Fetched, + dtfetched = l.DtFetched, + fetchFrom = l.FetchFrom, + key = l.Key + }; + + return Ok(ret); + } + + // DELETE: api/License/5 + [HttpDelete("{id}")] + public async Task DeleteLicense([FromRoute] long id) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + var rec = await _context.License.SingleOrDefaultAsync(m => m.Id == id); + if (rec == null) + { + return NotFound(); + } + + _context.License.Remove(rec); + await _context.SaveChangesAsync(); + + return Ok(rec); + } + + + // PUT: api/license/5/true + //Update a license and set it's fetched property only + //used by client to make a license fetchable or not ad-hoc + [HttpPut("fetched/{id}/{isFetched}")] + public async Task PutLicenseFetched([FromRoute] long id, [FromRoute] bool isFetched) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + var rec = await _context.License.SingleOrDefaultAsync(m => m.Id == id); + if (rec == null) + { + return NotFound(); + } + rec.Fetched = isFetched; + + _context.Entry(rec).State = EntityState.Modified; + + try + { + await _context.SaveChangesAsync(); + } + catch (DbUpdateConcurrencyException) + { + if (!LicenseExists(id)) + { + return NotFound(); + } + else + { + throw; + } + } + + + return NoContent(); + } + + + + private bool LicenseExists(long id) + { + return _context.License.Any(e => e.Id == id); + } + + //===================== UTILITY ============= + private string GetRFAuthorizedUserStamp() + { + foreach (Claim c in User.Claims) + { + if (c.Type == "id") + { + return "RFID" + c.Value; + } + } + return "RFID unknown"; + } + + //------------------------------------------------------ + + }//eoc +}//eons \ No newline at end of file diff --git a/Controllers/LicenseTemplatesController.cs b/Controllers/LicenseTemplatesController.cs new file mode 100644 index 0000000..1a3eda4 --- /dev/null +++ b/Controllers/LicenseTemplatesController.cs @@ -0,0 +1,127 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Authorization; +using Microsoft.EntityFrameworkCore; +using rockfishCore.Models; + +namespace rockfishCore.Controllers +{ + [Produces("application/json")] + [Route("api/LicenseTemplates")] + [Authorize] + public class LicenseTemplatesController : Controller + { + private readonly rockfishContext _context; + + public LicenseTemplatesController(rockfishContext context) + { + _context = context; + } + + // GET: api/LicenseTemplates + [HttpGet] + public IEnumerable GetLicenseTemplates() + { + return _context.LicenseTemplates; + } + + // GET: api/LicenseTemplates/5 + [HttpGet("{id}")] + public async Task GetLicenseTemplates([FromRoute] long id) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + var licenseTemplates = await _context.LicenseTemplates.SingleOrDefaultAsync(m => m.Id == id); + + if (licenseTemplates == null) + { + return NotFound(); + } + + return Ok(licenseTemplates); + } + + // PUT: api/LicenseTemplates/5 + [HttpPut("{id}")] + public async Task PutLicenseTemplates([FromRoute] long id, [FromBody] LicenseTemplates licenseTemplates) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + if (id != licenseTemplates.Id) + { + return BadRequest(); + } + + _context.Entry(licenseTemplates).State = EntityState.Modified; + + try + { + await _context.SaveChangesAsync(); + } + catch (DbUpdateConcurrencyException) + { + if (!LicenseTemplatesExists(id)) + { + return NotFound(); + } + else + { + throw; + } + } + + return NoContent(); + } + + // POST: api/LicenseTemplates + [HttpPost] + public async Task PostLicenseTemplates([FromBody] LicenseTemplates licenseTemplates) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + _context.LicenseTemplates.Add(licenseTemplates); + await _context.SaveChangesAsync(); + + return CreatedAtAction("GetLicenseTemplates", new { id = licenseTemplates.Id }, licenseTemplates); + } + + // DELETE: api/LicenseTemplates/5 + [HttpDelete("{id}")] + public async Task DeleteLicenseTemplates([FromRoute] long id) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + var licenseTemplates = await _context.LicenseTemplates.SingleOrDefaultAsync(m => m.Id == id); + if (licenseTemplates == null) + { + return NotFound(); + } + + _context.LicenseTemplates.Remove(licenseTemplates); + await _context.SaveChangesAsync(); + + return Ok(licenseTemplates); + } + + private bool LicenseTemplatesExists(long id) + { + return _context.LicenseTemplates.Any(e => e.Id == id); + } + } +} \ No newline at end of file diff --git a/Controllers/MailController.cs b/Controllers/MailController.cs new file mode 100644 index 0000000..1671ddf --- /dev/null +++ b/Controllers/MailController.cs @@ -0,0 +1,80 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Authorization;//required for authorize attribute +using System.Security.Claims; +using rockfishCore.Models; +using rockfishCore.Util; +using System.Linq; +using System; + +//requried to inject configuration in constructor +using Microsoft.Extensions.Configuration; + + + +namespace rockfishCore.Controllers +{ + //Authentication controller + [Produces("application/json")] + [Route("api/Mail")] + [Authorize] + public class MailController : Controller + { + private readonly rockfishContext _context; + private readonly IConfiguration _configuration; + public MailController(rockfishContext context, IConfiguration configuration) + { + _context = context; + _configuration = configuration; + } + + //Fetch inbox emails from sales and support + [HttpGet("salesandsupportsummaries")] + public JsonResult GetSalesAndSupportSummaries() + { + return Json(Util.RfMail.GetSalesAndSupportSummaries()); + } + + //Fetch a preview of a message + [HttpGet("preview/{account}/{folder}/{id}")] + public JsonResult GetPreview([FromRoute] string account, [FromRoute] string folder, [FromRoute] uint id) + { + return new JsonResult(Util.RfMail.GetMessagePreview(account, folder, id)); + //return Json(new { message = Util.RfMail.GetMessagePreview(account, folder, id) }); + } + + + [HttpPost("reply/{account}/{id}")] + public JsonResult Reply([FromRoute] string account, [FromRoute] uint id, [FromBody] dtoReplyMessageItem m) + { + if (string.IsNullOrWhiteSpace(m.composition)) + { + return Json(new { msg = "MailController:Reply->There is no reply text", error = 1 }); + } + RfMail.rfMailAccount acct = RfMail.rfMailAccount.support; + if (account.Contains("sales")) + { + acct = RfMail.rfMailAccount.sales; + } + + try + { + RfMail.ReplyMessage(id, acct, m.composition, true, m.trackDelivery); + return Json(new { msg = "message sent", ok = 1 }); + } + catch (Exception ex) + { + return Json(new { msg = ex.Message, error = 1 }); + } + } + // //------------------------------------------------------ + + public class dtoReplyMessageItem + { + public string composition; + public bool trackDelivery; + + } + + }//eoc +}//eons diff --git a/Controllers/ProductController.cs b/Controllers/ProductController.cs new file mode 100644 index 0000000..aa61bf3 --- /dev/null +++ b/Controllers/ProductController.cs @@ -0,0 +1,129 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Authorization; +using Microsoft.EntityFrameworkCore; +using rockfishCore.Models; + +namespace rockfishCore.Controllers +{ + [Produces("application/json")] + [Route("api/Product")] + [Authorize] + public class ProductController : Controller + { + private readonly rockfishContext _context; + + public ProductController(rockfishContext context) + { + _context = context; + } + + + + // GET: api/Product + [HttpGet] + public IEnumerable GetProduct() + { + return _context.Product; + } + + // GET: api/Product/5 + [HttpGet("{id}")] + public async Task GetProduct([FromRoute] long id) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + var Product = await _context.Product.SingleOrDefaultAsync(m => m.Id == id); + + if (Product == null) + { + return NotFound(); + } + + return Ok(Product); + } + + // PUT: api/Product/5 + [HttpPut("{id}")] + public async Task PutProduct([FromRoute] long id, [FromBody] Product Product) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + if (id != Product.Id) + { + return BadRequest(); + } + + _context.Entry(Product).State = EntityState.Modified; + + try + { + await _context.SaveChangesAsync(); + } + catch (DbUpdateConcurrencyException) + { + if (!ProductExists(id)) + { + return NotFound(); + } + else + { + throw; + } + } + + return NoContent(); + } + + // POST: api/Product + [HttpPost] + public async Task PostProduct([FromBody] Product Product) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + _context.Product.Add(Product); + await _context.SaveChangesAsync(); + + return CreatedAtAction("GetProduct", new { id = Product.Id }, Product); + } + + // DELETE: api/Product/5 + [HttpDelete("{id}")] + public async Task DeleteProduct([FromRoute] long id) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + var Product = await _context.Product.SingleOrDefaultAsync(m => m.Id == id); + if (Product == null) + { + return NotFound(); + } + + _context.Product.Remove(Product); + await _context.SaveChangesAsync(); + + return Ok(Product); + } + + private bool ProductExists(long id) + { + return _context.Product.Any(e => e.Id == id); + } + } +} \ No newline at end of file diff --git a/Controllers/PurchaseController.cs b/Controllers/PurchaseController.cs new file mode 100644 index 0000000..a704b30 --- /dev/null +++ b/Controllers/PurchaseController.cs @@ -0,0 +1,248 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Authorization; +using Microsoft.EntityFrameworkCore; +using rockfishCore.Models; +using System.IO; + +namespace rockfishCore.Controllers +{ + [Produces("application/json")] + [Route("api/Purchase")] + [Authorize] + public class PurchaseController : Controller + { + private readonly rockfishContext _context; + + public PurchaseController(rockfishContext context) + { + _context = context; + } + + //Get unique product code / name combinations + [HttpGet("productcodes")] + public JsonResult GetUniqueProductCodes() + { + //Note: will return dupes as comparer sees misspellings as unique in name, but I'm keeping it that way + //so the name misspellings are apparent and can be fixed up + var l = _context.Purchase.Select(p => new { p.ProductCode, p.Name }).Distinct().OrderBy(p => p.ProductCode); + return Json(l); + } + + // GET: api/Purchase + [HttpGet] + public IEnumerable GetPurchase() + { + return _context.Purchase; + } + + // GET: api/Purchase/5 + [HttpGet("{id}")] + public async Task GetPurchase([FromRoute] long id) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + var purchase = await _context.Purchase.SingleOrDefaultAsync(m => m.Id == id); + + if (purchase == null) + { + return NotFound(); + } + + return Ok(purchase); + } + + // PUT: api/Purchase/5 + [HttpPut("{id}")] + public async Task PutPurchase([FromRoute] long id, [FromBody] Purchase purchase) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + if (id != purchase.Id) + { + return BadRequest(); + } + + _context.Entry(purchase).State = EntityState.Modified; + + try + { + await _context.SaveChangesAsync(); + } + catch (DbUpdateConcurrencyException) + { + if (!PurchaseExists(id)) + { + return NotFound(); + } + else + { + throw; + } + } + updateCustomerActive(purchase.CustomerId); + ParseOrderAndUpdateEmail(purchase); + return NoContent(); + } + + // POST: api/Purchase + [HttpPost] + public async Task PostPurchase([FromBody] Purchase purchase) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + _context.Purchase.Add(purchase); + await _context.SaveChangesAsync(); + + updateCustomerActive(purchase.CustomerId); + ParseOrderAndUpdateEmail(purchase); + + return CreatedAtAction("GetPurchase", new { id = purchase.Id }, purchase); + } + + // DELETE: api/Purchase/5 + [HttpDelete("{id}")] + public async Task DeletePurchase([FromRoute] long id) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + var purchase = await _context.Purchase.SingleOrDefaultAsync(m => m.Id == id); + if (purchase == null) + { + return NotFound(); + } + var customerId = purchase.CustomerId; + + _context.Purchase.Remove(purchase); + await _context.SaveChangesAsync(); + + updateCustomerActive(customerId); + return Ok(purchase); + } + + private bool PurchaseExists(long id) + { + return _context.Purchase.Any(e => e.Id == id); + } + + //check if customer has any active subs and flag accordingly + private void updateCustomerActive(long customerId) + { + var cust = _context.Customer.First(m => m.Id == customerId); + bool active = hasActiveSubs(customerId); + if (cust.Active != active) + { + cust.Active = active; + _context.Customer.Update(cust); + _context.SaveChanges(); + } + } + + //check if a customer has active subscriptions + private bool hasActiveSubs(long customerId) + { + return _context.Purchase.Where(m => m.CustomerId == customerId && m.CancelDate == null).Count() > 0; + } + + + + private void ParseOrderAndUpdateEmail(Purchase purchase) + { + Dictionary d = ParseShareItOrderData(purchase.Notes); + if (d.Count < 1) + return; + + if (d.ContainsKey("E-Mail")) + { + string email = d["E-Mail"]; + if (!string.IsNullOrWhiteSpace(email)) + { + //append or set it to the customer adminAddress if it isn't already present there + //in this way the last address listed is the most recent purchase address there + var cust = _context.Customer.First(m => m.Id == purchase.CustomerId); + Util.CustomerUtils.AddAdminEmailIfNotPresent(cust, email); + _context.SaveChanges(); + } + } + } + + + /// + /// parse out the x=y values in a ShareIt order document + /// + /// + /// + Dictionary ParseShareItOrderData(string order) + { + Dictionary ret = new Dictionary(); + + if (!string.IsNullOrWhiteSpace(order)) + { + //parse the email address out of the order + StringReader sr = new StringReader(order); + string aLine = string.Empty; + while (true) + { + aLine = sr.ReadLine(); + if (aLine != null) + { + if (aLine.Contains("=")) + { + string[] item = aLine.Split("="); + ret.Add(item[0].Trim(), item[1].Trim()); + } + + } + else + { + break; + } + } + } + return ret; + } + /* + Original JS code for this from client end of things: + // Loop through all lines + for (var j = 0; j < lines.length; j++) { + var thisLine = lines[j]; + if (thisLine.includes("=")) { + var thisElement = thisLine.split("="); + purchaseData[thisElement[0].trim()] = thisElement[1].trim(); + } + } + + //Now have an object with the value pairs in it + if (purchaseData["ShareIt Ref #"]) { + $("#salesOrderNumber").val(purchaseData["ShareIt Ref #"]); + } + + // if (purchaseData["E-Mail"]) { + // $("#email").val(purchaseData["E-Mail"]); + // } + + + */ + + + + + + }//eoc +}//eons \ No newline at end of file diff --git a/Controllers/ReportController.cs b/Controllers/ReportController.cs new file mode 100644 index 0000000..04db8f0 --- /dev/null +++ b/Controllers/ReportController.cs @@ -0,0 +1,201 @@ + +using System.Collections.Generic; +using Microsoft.AspNetCore.Mvc; +using rockfishCore.Models; +using rockfishCore.Util; +using System.Linq; +using System; + +//requried to inject configuration in constructor +using Microsoft.Extensions.Configuration; +using Microsoft.AspNetCore.Authorization; + +using Microsoft.EntityFrameworkCore; + +namespace rockfishCore.Controllers +{ + [Produces("application/json")] + [Route("api/report")] + [Authorize] + public class ReportController : Controller + { + private readonly rockfishContext _context; + private readonly IConfiguration _configuration; + public ReportController(rockfishContext context, IConfiguration configuration)//these two are injected, see startup.cs + { + _context = context; + _configuration = configuration; + } + + + + /////////////////////////////////////////////////////// + //Get expiring subscriptions list + // + [HttpGet("expires")] + public JsonResult Get() + { + var customerList = _context.Customer.Select(p => new { p.Id, p.Name }); + + var rawExpiresList = _context.Purchase + .Where(p => p.ExpireDate != null && p.CancelDate == null) + .OrderBy(p => p.ExpireDate) + .Select(p => new expiresResultItem { id = p.Id, expireDate = p.ExpireDate, name = p.Name, site_id = p.SiteId, customerId = p.CustomerId }) + .ToList(); + + foreach (expiresResultItem i in rawExpiresList) + { + i.Customer = customerList.First(p => p.Id == i.customerId).Name; + } + + return Json(rawExpiresList); + } + + //dto classes for route + public class expiresResultItem + { + public long id; + public string name; + public string Customer; + public long customerId; + public long? expireDate; + public long site_id; + + } + + + + /////////////////////////////////////////////////////// + //Get unique product code / name combinations + // + [HttpPost("emailsforproductcodes")] + public JsonResult GetUniqueEmailsByProductCodes([FromBody] requestEmailsForProductCodes req) + { + var customerList = _context.Customer.Select(p => new { p.Id, p.DoNotContact }); + + List rawCustomerIds = new List(); + + foreach (string pcode in req.products) + { + //fetch all customer id's from purchase collection that match product codes submitted + var l = _context.Purchase.Where(p => p.ProductCode == pcode).Select(p => p.CustomerId).Distinct(); + rawCustomerIds.AddRange(l.ToList()); + } + + //uniquify the customer list + List uniqueCustomerIds = rawCustomerIds.Distinct().ToList(); + + //container for the raw email lists built serially + List rawEmails = new List(); + + foreach (long cid in uniqueCustomerIds) + { + //skip if do not contact and not explicitly including do not contact + if (customerList.First(p => p.Id == cid).DoNotContact && req.ckNoContact != true) + continue; + + //get all raw email values for this client from db + //there may be dupes or even multiple in one + rawEmails.AddRange(getEmailsForClient(cid)); + } + + //Now clean up the list and sort and uniquify it + List cleanedEmails = cleanupRawEmailList(rawEmails); + + return Json(cleanedEmails); + } + + + //Given a client id find all unique email address in db for that client + private List getEmailsForClient(long id) + { + List ret = new List(); + + //New for RF 6 + var cust = _context.Customer.Where(p => p.Id == id).FirstOrDefault(); + if (cust != null) + { + if (!string.IsNullOrWhiteSpace(cust.AdminEmail)) + ret.Add(cust.AdminEmail); + if (!string.IsNullOrWhiteSpace(cust.SupportEmail)) + ret.Add(cust.SupportEmail); + } + + //TOASTED for RF 6 + //search contact, trial, purchase, incident (optionally) + // ret.AddRange(_context.Purchase.Where(p => p.CustomerId == id).Select(p => p.Email).Distinct().ToList()); + // ret.AddRange(_context.Contact.Where(p => p.CustomerId == id).Select(p => p.Email).Distinct().ToList()); + // ret.AddRange(_context.Trial.Where(p => p.CustomerId == id).Select(p => p.Email).Distinct().ToList()); + // if (includeIncidentEmails) + // ret.AddRange(_context.Incident.Where(p => p.CustomerId == id).Select(p => p.Email).Distinct().ToList()); + return ret; + } + + + //break out multiple also trim whitespace and lowercase and uniquify them + private List cleanupRawEmailList(List src) + { + List ret = new List(); + foreach (string rawAddress in src) + { + //count the @'s, if there are more than one then get splittn' + int count = rawAddress.Count(f => f == '@'); + + if (count < 1) + continue;//no address, skip this one + + //a little cleanup based on what I had to do in og rockfish + string semiRawAddress = rawAddress.Replace(", ", ",").TrimEnd('>').TrimEnd(',').Trim(); + + //there's at least one address in there, maybe more + if (count == 1) + ret.Add(semiRawAddress.ToLowerInvariant()); + else + { + //there are multiple so break it apart + //determine break character could be a space or a comma + char breakChar; + if (semiRawAddress.Contains(',')) + { + breakChar = ','; + } + else if (semiRawAddress.Contains(' ')) + { + breakChar = ' '; + } + else + { + //no break character, it's a bad address, highlight it so it can be fixed when seen + ret.Add("_BAD_EMAIL_" + semiRawAddress + "_BAD_EMAIL_"); + continue; + } + + //Ok if we made it here then we can split out the emails + string[] splits = semiRawAddress.Split(breakChar); + foreach (string s in splits) + { + if (!string.IsNullOrWhiteSpace(s) && s.Contains("@")) + ret.Add(s.ToLowerInvariant().Trim()); + } + } + } + + //return distinct values only that are ordered by the email domain + return ret.Distinct().OrderBy(email => email.Split('@')[1]).ToList(); + } + + + //dto classes for route + public class requestEmailsForProductCodes + { + public string[] products; + public bool ckIncidental; + public bool ckNoContact; + } + ///////////////////////////////////////////////////////////////////////////////////// + + + + }//eoc +}//eons + diff --git a/Controllers/RfCaseBlobController.cs b/Controllers/RfCaseBlobController.cs new file mode 100644 index 0000000..41bcee4 --- /dev/null +++ b/Controllers/RfCaseBlobController.cs @@ -0,0 +1,220 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Authorization; +using Microsoft.EntityFrameworkCore; +using rockfishCore.Models; + +namespace rockfishCore.Controllers +{ + [Produces("application/json")] + [Route("api/RfCaseBlob")] + public class RfCaseBlobController : Controller + { + private readonly rockfishContext _context; + + public RfCaseBlobController(rockfishContext context) + { + _context = context; + } + + // GET: api/RfCaseBlob + [HttpGet] + [Authorize] + public IEnumerable GetRfCaseBlob() + { + var c = from s in _context.RfCaseBlob select s; + c = c.OrderBy(s => s.Name); + return c; + } + + + + [HttpPost("upload")] + public IActionResult UploadFilesAjax([FromQuery] string rfcaseid) + {//http://www.binaryintellect.net/articles/f1cee257-378a-42c1-9f2f-075a3aed1d98.aspx + + //need a proper case ID to do this + if (string.IsNullOrWhiteSpace(rfcaseid) || rfcaseid == "new") + { + return BadRequest(); + } + + var files = Request.Form.Files; + int nCount=0; + foreach (var file in files) + { + if (file.Length > 0) + { + using (var fileStream = file.OpenReadStream()) + using (var ms = new System.IO.MemoryStream()) + { + fileStream.CopyTo(ms); + var fileBytes = ms.ToArray(); + RfCaseBlob blob=new RfCaseBlob(); + blob.RfCaseId=Convert.ToInt64(rfcaseid); + blob.Name=file.FileName; + blob.File=fileBytes; + _context.RfCaseBlob.Add(blob); + _context.SaveChanges(); + nCount++; + } + } + } + + string message = $"{nCount} file(s) uploaded successfully!"; + + return Json(message); + } + + + + + [HttpGet("download/{id}")] + public ActionResult Download([FromRoute] long id, [FromQuery] string dlkey) + {//https://dotnetcoretutorials.com/2017/03/12/uploading-files-asp-net-core/ + //https://stackoverflow.com/questions/45763149/asp-net-core-jwt-in-uri-query-parameter/45811270#45811270 + + if (string.IsNullOrWhiteSpace(dlkey)) + { + return NotFound(); + } + + //get user by key, if not found then reject + //If user dlkeyexp has not expired then return file + var user = _context.User.SingleOrDefault(m => m.DlKey == dlkey); + if (user == null) + { + return NotFound(); + } + + var unixdtnow = new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds(); + if (user.DlKeyExp < unixdtnow) + { + return NotFound(); + } + + //Ok, user has a valid download key and it's not expired yet so get the file + var f = _context.RfCaseBlob.SingleOrDefault(m => m.Id == id); + if (f == null) + { + return NotFound(); + } + + var extension = System.IO.Path.GetExtension(f.Name); + + string mimetype = "application/x-msdownload"; + if (!string.IsNullOrWhiteSpace(extension)) + { + mimetype = Util.MimeTypeMap.GetMimeType(extension); + } + + Response.Headers.Add("Content-Disposition", "inline; filename=" + f.Name); + return File(f.File, mimetype);//NOTE: if you don't specify a filename here then the above content disposition header takes effect, if you do then the 'File(' method sets it as attachment automatically + + } + + + // GET: api/RfCaseBlob/5 + [HttpGet("{id}")] + [Authorize] + public async Task GetRfCaseBlob([FromRoute] long id) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + var RfCaseBlob = await _context.RfCaseBlob.SingleOrDefaultAsync(m => m.Id == id); + + if (RfCaseBlob == null) + { + return NotFound(); + } + + return Ok(RfCaseBlob); + } + + // PUT: api/RfCaseBlob/5 + [HttpPut("{id}")] + [Authorize] + public async Task PutRfCaseBlob([FromRoute] long id, [FromBody] RfCaseBlob RfCaseBlob) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + if (id != RfCaseBlob.Id) + { + return BadRequest(); + } + + _context.Entry(RfCaseBlob).State = EntityState.Modified; + + try + { + await _context.SaveChangesAsync(); + } + catch (DbUpdateConcurrencyException) + { + if (!RfCaseBlobExists(id)) + { + return NotFound(); + } + else + { + throw; + } + } + + return NoContent(); + } + + // POST: api/RfCaseBlob + [HttpPost] + [Authorize] + public async Task PostRfCaseBlob([FromBody] RfCaseBlob RfCaseBlob) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + _context.RfCaseBlob.Add(RfCaseBlob); + await _context.SaveChangesAsync(); + + return CreatedAtAction("GetRfCaseBlob", new { id = RfCaseBlob.Id }, RfCaseBlob); + } + + // DELETE: api/RfCaseBlob/5 + [HttpDelete("{id}")] + [Authorize] + public async Task DeleteRfCaseBlob([FromRoute] long id) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + var RfCaseBlob = await _context.RfCaseBlob.SingleOrDefaultAsync(m => m.Id == id); + if (RfCaseBlob == null) + { + return NotFound(); + } + + _context.RfCaseBlob.Remove(RfCaseBlob); + await _context.SaveChangesAsync(); + + return Ok(RfCaseBlob); + } + + private bool RfCaseBlobExists(long id) + { + return _context.RfCaseBlob.Any(e => e.Id == id); + } + } +} \ No newline at end of file diff --git a/Controllers/RfCaseController.cs b/Controllers/RfCaseController.cs new file mode 100644 index 0000000..b030182 --- /dev/null +++ b/Controllers/RfCaseController.cs @@ -0,0 +1,230 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Authorization; +using Microsoft.EntityFrameworkCore; +using rockfishCore.Models; +using System.Security.Claims; + +namespace rockfishCore.Controllers +{ + [Produces("application/json")] + [Route("api/RfCase")] + [Authorize] + public class RfCaseController : Controller + { + private readonly rockfishContext _context; + + public RfCaseController(rockfishContext context) + { + _context = context; + } + + //Get api/rfcase/list + [HttpGet("list")] + public JsonResult GetList(long? Project, bool? Open, int? Priority, string Search) + { + //NOTE: Unlike FogBugz, does not open a case directly from the search + //uses a separate route (simple get), so this route doesn't need to worry about it. + + + //FILTERS + var cases = _context.RfCase.AsQueryable(); + + + //TODO: this is case sensitive currently + //need to figure out a way to make it insensitive + if (!string.IsNullOrWhiteSpace(Search)) + { + cases = _context.RfCase.Where(s => s.Notes.Contains(Search) + || s.ReleaseNotes.Contains(Search) + || s.ReleaseVersion.Contains(Search) + || s.Title.Contains(Search) + ); + } + + //project + if (Project != null && Project != 0) + { + cases = cases.Where(s => s.RfCaseProjectId == Project); + } + + //open + if (Open != null) + { + if (Open == true) + { + cases = cases.Where(s => s.DtClosed == null); + } + else + { + cases = cases.Where(s => s.DtClosed != null); + } + } + + //priority + if (Priority != null && Priority > 0 && Priority < 6) + { + cases = cases.Where(s => s.Priority == Priority); + + } + + cases = cases.OrderBy(s => s.Priority).ThenByDescending(s => s.Id); + return new JsonResult(cases); + } + + + + // //Get api/rfcase/77/attachments + // [HttpGet("{id}/attachments")] + // public IEnumerable GetAttachmentList([FromRoute] long id) + // { + // var res = from c in _context.RfCaseBlob + // .Where(c => c.RfCaseId.Equals(id)).OrderBy(c => c.Id)//order by entry order + // select new dtoNameIdItem + // { + // id = c.Id, + // name = c.Name + // }; + // return res.ToList(); + // } + + + //Get api/rfcase/77/attachments + [HttpGet("{id}/attachments")] + public ActionResult GetAttachmentList([FromRoute] long id) + { + var res = from c in _context.RfCaseBlob + .Where(c => c.RfCaseId.Equals(id)).OrderBy(c => c.Id)//order by entry order + select new dtoNameIdItem + { + id = c.Id, + name = c.Name + }; + + //Took forever to find this out + //How to get user id from jwt token in controller + //http://www.jerriepelser.com/blog/aspnetcore-jwt-saving-bearer-token-as-claim/ + var userId = User.FindFirst("id")?.Value; + long luserId=long.Parse(userId); + + + var user = _context.User.SingleOrDefault(m => m.Id == luserId); + if (user == null) + { + return NotFound(); + } + + return new JsonResult(new { dlkey = user.DlKey, attach = res.ToList() }); + } + + + + + // GET: api/RfCase + [HttpGet] + public IEnumerable GetRfCase() + { + return _context.RfCase; + } + + + // GET: api/RfCase/5 + [HttpGet("{id}")] + public async Task GetRfCase([FromRoute] long id) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + var RfCase = await _context.RfCase.SingleOrDefaultAsync(m => m.Id == id); + + if (RfCase == null) + { + return NotFound(); + } + + return Ok(RfCase); + } + + // PUT: api/RfCase/5 + [HttpPut("{id}")] + public async Task PutRfCase([FromRoute] long id, [FromBody] RfCase RfCase) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + if (id != RfCase.Id) + { + return BadRequest(); + } + + _context.Entry(RfCase).State = EntityState.Modified; + + try + { + await _context.SaveChangesAsync(); + } + catch (DbUpdateConcurrencyException) + { + if (!RfCaseExists(id)) + { + return NotFound(); + } + else + { + throw; + } + } + + return NoContent(); + } + + // POST: api/RfCase + [HttpPost] + public async Task PostRfCase([FromBody] RfCase RfCase) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + _context.RfCase.Add(RfCase); + await _context.SaveChangesAsync(); + + return CreatedAtAction("GetRfCase", new { id = RfCase.Id }, RfCase); + } + + // DELETE: api/RfCase/5 + [HttpDelete("{id}")] + public async Task DeleteRfCase([FromRoute] long id) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + var RfCase = await _context.RfCase.SingleOrDefaultAsync(m => m.Id == id); + if (RfCase == null) + { + return NotFound(); + } + + _context.RfCase.Remove(RfCase); + await _context.SaveChangesAsync(); + + return Ok(RfCase); + } + + private bool RfCaseExists(long id) + { + return _context.RfCase.Any(e => e.Id == id); + } + } +} \ No newline at end of file diff --git a/Controllers/RfCaseProjectController.cs b/Controllers/RfCaseProjectController.cs new file mode 100644 index 0000000..cb3b77e --- /dev/null +++ b/Controllers/RfCaseProjectController.cs @@ -0,0 +1,130 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Authorization; +using Microsoft.EntityFrameworkCore; +using rockfishCore.Models; + +namespace rockfishCore.Controllers +{ + [Produces("application/json")] + [Route("api/RfCaseProject")] + [Authorize] + public class RfCaseProjectController : Controller + { + private readonly rockfishContext _context; + + public RfCaseProjectController(rockfishContext context) + { + _context = context; + } + + // GET: api/RfCaseProject + [HttpGet] + public IEnumerable GetRfCaseProject() + { + var c = from s in _context.RfCaseProject select s; + c = c.OrderBy(s => s.Name); + return c; + //return _context.RfCaseProject; + } + + // GET: api/RfCaseProject/5 + [HttpGet("{id}")] + public async Task GetRfCaseProject([FromRoute] long id) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + var RfCaseProject = await _context.RfCaseProject.SingleOrDefaultAsync(m => m.Id == id); + + if (RfCaseProject == null) + { + return NotFound(); + } + + return Ok(RfCaseProject); + } + + // PUT: api/RfCaseProject/5 + [HttpPut("{id}")] + public async Task PutRfCaseProject([FromRoute] long id, [FromBody] RfCaseProject RfCaseProject) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + if (id != RfCaseProject.Id) + { + return BadRequest(); + } + + _context.Entry(RfCaseProject).State = EntityState.Modified; + + try + { + await _context.SaveChangesAsync(); + } + catch (DbUpdateConcurrencyException) + { + if (!RfCaseProjectExists(id)) + { + return NotFound(); + } + else + { + throw; + } + } + + return NoContent(); + } + + // POST: api/RfCaseProject + [HttpPost] + public async Task PostRfCaseProject([FromBody] RfCaseProject RfCaseProject) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + _context.RfCaseProject.Add(RfCaseProject); + await _context.SaveChangesAsync(); + + return CreatedAtAction("GetRfCaseProject", new { id = RfCaseProject.Id }, RfCaseProject); + } + + // DELETE: api/RfCaseProject/5 + [HttpDelete("{id}")] + public async Task DeleteRfCaseProject([FromRoute] long id) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + var RfCaseProject = await _context.RfCaseProject.SingleOrDefaultAsync(m => m.Id == id); + if (RfCaseProject == null) + { + return NotFound(); + } + + _context.RfCaseProject.Remove(RfCaseProject); + await _context.SaveChangesAsync(); + + return Ok(RfCaseProject); + } + + private bool RfCaseProjectExists(long id) + { + return _context.RfCaseProject.Any(e => e.Id == id); + } + } +} \ No newline at end of file diff --git a/Controllers/RvfController.cs b/Controllers/RvfController.cs new file mode 100644 index 0000000..ee98c41 --- /dev/null +++ b/Controllers/RvfController.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Authorization; +using Microsoft.EntityFrameworkCore; +using rockfishCore.Models; +using rockfishCore.Util; + +namespace rockfishCore.Controllers +{ + [Produces("text/plain")] + [Route("rvf")] + + public class RvfController : Controller //RAVEN License fetch route + { + private readonly rockfishContext _context; + + public RvfController(rockfishContext context) + { + _context = context; + } + + + [HttpGet("{dbid}")] + public ActionResult Get([FromRoute] Guid dbid) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + //This is to simulate the scenarios where there is no license to return + //either due to no current account / canceled or simply no license exists + //Changes here must be reflected in RAVEN Util.License.Fetch block + bool bTestStatusOtherThanOk = false; + if (bTestStatusOtherThanOk) + { + return Json(new {Status="NONE", Reason="No license"}); + //return Json(new {Status="Canceled", Reason="Non payment"}); + } + else + { + return Ok(RavenKeyFactory.GetRavenTestKey(dbid)); + } + + } + + + + + + private bool LicenseExists(long id) + { + return _context.License.Any(e => e.Id == id); + } + } +} \ No newline at end of file diff --git a/Controllers/RvrController.cs b/Controllers/RvrController.cs new file mode 100644 index 0000000..fa891f2 --- /dev/null +++ b/Controllers/RvrController.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Authorization; +using Microsoft.EntityFrameworkCore; +using rockfishCore.Models; +using rockfishCore.Util; + +namespace rockfishCore.Controllers +{ + [Produces("text/plain")] + [Route("rvr")] + public class RvrController : Controller //RAVEN trial license request + { + private readonly rockfishContext _context; + + public RvrController(rockfishContext context) + { + _context = context; + } + + + [HttpGet] + public ActionResult Get([FromQuery] Guid dbid, [FromQuery] string email, [FromQuery] string regto) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + if (dbid == Guid.Empty) + { + return BadRequest("The requested DB ID was empty and not valid"); + } + + //TODO: closer to release as ROCKFISH might change before then + + //Attempt to match customer by dbid if not then create new customer of trial type for the indicated dbid and regto + //ensure this email goes into the adminEmail array if not already there + + //Flag customer record has having an unfulfilled trial request + + //If it's a new customer or an existing one with non-matching email then send a verification email to the customer + + //When a response is spotted in email then Rockfish should see it and flag the customer as verified + //Probably some general purpose email Verify code would be helpful here as it would likely be useful for all manner of things + + //When user releases trial in Rockfish a license key will be generated ready for the customers RAVEN to retrieve + + return Ok("Request accepted. Awaiting email verification and approval."); + + + } + + + }//eoc +}//eons \ No newline at end of file diff --git a/Controllers/SearchController.cs b/Controllers/SearchController.cs new file mode 100644 index 0000000..a3b032d --- /dev/null +++ b/Controllers/SearchController.cs @@ -0,0 +1,184 @@ + +using System.Collections.Generic; +using Microsoft.AspNetCore.Mvc; +using rockfishCore.Models; +using rockfishCore.Util; +using System.Linq; +using System; + +//requried to inject configuration in constructor +using Microsoft.Extensions.Configuration; +using Microsoft.AspNetCore.Authorization; + +using Microsoft.EntityFrameworkCore; + +namespace rockfishCore.Controllers +{ + [Produces("application/json")] + [Route("api/search")] + [Authorize] + public class SearchController : Controller + { + private readonly rockfishContext _context; + private readonly IConfiguration _configuration; + public SearchController(rockfishContext context, IConfiguration configuration)//these two are injected, see startup.cs + { + _context = context; + _configuration = configuration; + } + + + + + [HttpGet] + public JsonResult GetSearchResults(string query) //get parameters from url not body + { + + //default return value, emtpy suggestions + var noResults = new resultItem[0]; + + if (string.IsNullOrWhiteSpace(query)) + { + return Json(noResults); + } + + //CACHE CUSTOMER NAME LIST + var custData = _context.Customer.Select(p => new { p.Id, p.Name }); + Dictionary customerDict = new Dictionary(); + customerDict.Add(0, "TRIAL CUSTOMER"); + foreach (var cust in custData) + { + customerDict.Add(cust.Id, cust.Name); + } + + + // List l = searchItems; + List resultList = new List(); + using (var command = _context.Database.GetDbConnection().CreateCommand()) + { + _context.Database.OpenConnection(); + + foreach (SearchItem searchItem in searchItems) + { + string getColumns = "id, " + searchItem.field; + if (searchItem.getCustomer_id) + { + //fuckery due to column name not consistent + if (searchItem.table == "license") + getColumns += ", customerid"; + else + getColumns += ", customer_id"; + } + + if (searchItem.getSite_id) + getColumns += ", site_id"; + + command.CommandText = "select distinct " + getColumns + " from " + searchItem.table + " where " + searchItem.field + " like @q;"; + command.Parameters.Clear(); + var parameter = command.CreateParameter(); + parameter.ParameterName = "@q"; + parameter.Value = "%" + query + "%"; + command.Parameters.Add(parameter); + + using (var res = command.ExecuteReader()) + { + if (res.HasRows) + { + while (res.Read()) + { + var r = new resultItem(); + r.obj = searchItem.table; + r.fld = searchItem.field; + r.id = Convert.ToInt64(res["id"]); + if (searchItem.getCustomer_id) + { + //fucked up the scheme of customer_id as table name with license + //which is customerid instead so have to workaround as don't want to bother + //with the considerable amount of rigamarole to rename the column in the db + if (searchItem.table == "license") + { + r.customerId = Convert.ToInt64(res["customerid"]); + r.name = customerDict[r.customerId];//get name from customer id + } + else + { + r.customerId = Convert.ToInt64(res["customer_id"]); + r.name = customerDict[r.customerId];//get name from customer id + } + } + else + { + r.name = customerDict[r.id];//here id is the customer id + } + if (searchItem.getSite_id) + r.site_id = Convert.ToInt64(res["site_id"]); + + resultList.Add(r); + } + } + } + } + _context.Database.CloseConnection(); + } + + var filteredAndSorted = resultList.GroupBy(o => new { o.id, o.obj }) + .Select(o => o.FirstOrDefault()) + .OrderBy(o => o.name); + return Json(filteredAndSorted); + } + //------------------------------------------------------ + + + + //Full text searchable items + private static List searchItems + { + get + { + List l = new List(); + + l.Add(new SearchItem { table = "customer", field = "name", getCustomer_id = false, getSite_id = false }); + l.Add(new SearchItem { table = "customer", field = "notes", getCustomer_id = false, getSite_id = false }); + //case 3607 + l.Add(new SearchItem { table = "customer", field = "supportEmail", getCustomer_id = false, getSite_id = false }); + l.Add(new SearchItem { table = "customer", field = "adminEmail", getCustomer_id = false, getSite_id = false }); + l.Add(new SearchItem { table = "license", field = "code", getCustomer_id = true, getSite_id = false }); + l.Add(new SearchItem { table = "license", field = "key", getCustomer_id = true, getSite_id = false }); + l.Add(new SearchItem { table = "license", field = "regto", getCustomer_id = true, getSite_id = false }); + l.Add(new SearchItem { table = "license", field = "email", getCustomer_id = true, getSite_id = false }); + + l.Add(new SearchItem { table = "purchase", field = "productCode", getCustomer_id = true, getSite_id = true }); + l.Add(new SearchItem { table = "purchase", field = "salesOrderNumber", getCustomer_id = true, getSite_id = true }); + l.Add(new SearchItem { table = "purchase", field = "notes", getCustomer_id = true, getSite_id = true }); + l.Add(new SearchItem { table = "site", field = "name", getCustomer_id = true, getSite_id = false }); + l.Add(new SearchItem { table = "site", field = "notes", getCustomer_id = true, getSite_id = false }); + + return l; + + } + } + + private class SearchItem + { + public string table; + public string field; + public bool getCustomer_id; + public bool getSite_id; + } + + private class resultItem + { + public long id; + public long site_id; + public long customerId; + public string obj;//Table name basically + public string name;//always customer name + public string fld;//the name of the field the value was found in + + } + + + + }//eoc +}//eons + diff --git a/Controllers/SiteController.cs b/Controllers/SiteController.cs new file mode 100644 index 0000000..87b3272 --- /dev/null +++ b/Controllers/SiteController.cs @@ -0,0 +1,212 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Authorization; +using Microsoft.EntityFrameworkCore; +using rockfishCore.Models; + +namespace rockfishCore.Controllers +{ + [Produces("application/json")] + [Route("api/Site")] + [Authorize] + public class SiteController : Controller + { + private readonly rockfishContext _context; + + public SiteController(rockfishContext context) + { + _context = context; + } + + + //Get api/site/77/purchases + [HttpGet("{id}/purchases")] + public IEnumerable GetPurchases([FromRoute] long id) + { + var l = _context.Purchase + .Where(b => b.SiteId.Equals(id)) + .OrderByDescending(b => b.PurchaseDate) + .ToList(); + return l; + } + + // //Get api/site/77/activepurchases + // [HttpGet("{id}/activepurchases")] + // public IEnumerable GetActivePurchases([FromRoute] long id) + // { + // var l = _context.Purchase + // .Where(b => b.SiteId.Equals(id)) + // .Where(b => b.CancelDate==null) + // .OrderByDescending(b => b.PurchaseDate) + // .ToList(); + // return l; + // } + + //Get api/site/77/activepurchases + [HttpGet("{id}/activepurchases")] + public IEnumerable GetActivePurchases([FromRoute] long id) + { + var res = from c in _context.Purchase + .Where(c => c.SiteId.Equals(id)) + .Where(c => c.CancelDate==null) + .OrderByDescending(c => c.PurchaseDate) + select new dtoNameIdItem + { + id = c.Id, + name = c.Name + }; + return res.ToList(); + } + + // //Get api/site/77/incidents + // [HttpGet("{id}/incidents")] + // public IEnumerable GetIncidents([FromRoute] long id) + // { + // var l = _context.Incident + // .Where(b => b.SiteId.Equals(id)) + // .OrderByDescending(b => b.Id)//no single suitable date to order by + // .ToList(); + // return l; + // } + + + // //Get api/site/77/trials + // [HttpGet("{id}/trials")] + // public IEnumerable GetTrials([FromRoute] long id) + // { + // var l = _context.Trial + // .Where(b => b.SiteId.Equals(id)) + // .OrderByDescending(b => b.Id) + // .ToList(); + // return l; + // } + + //Get api/site/77/name + [HttpGet("{id}/name")] + public async Task GetName([FromRoute] long id) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + var ret = await _context.Site + .Select(r => new { r.Id, r.Name, r.CustomerId }) + .Where(r => r.Id == id) + .FirstAsync(); + return Ok(ret); + } + + + + // GET: api/Site + [HttpGet] + public IEnumerable GetSite() + { + return _context.Site; + } + + // GET: api/Site/5 + [HttpGet("{id}")] + public async Task GetSite([FromRoute] long id) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + var site = await _context.Site.SingleOrDefaultAsync(m => m.Id == id); + + if (site == null) + { + return NotFound(); + } + + return Ok(site); + } + + // PUT: api/Site/5 + [HttpPut("{id}")] + public async Task PutSite([FromRoute] long id, [FromBody] Site site) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + if (id != site.Id) + { + return BadRequest(); + } + + _context.Entry(site).State = EntityState.Modified; + + try + { + await _context.SaveChangesAsync(); + } + catch (DbUpdateConcurrencyException) + { + if (!SiteExists(id)) + { + return NotFound(); + } + else + { + throw; + } + } + + return NoContent(); + } + + // POST: api/Site + [HttpPost] + public async Task PostSite([FromBody] Site site) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + _context.Site.Add(site); + await _context.SaveChangesAsync(); + + return CreatedAtAction("GetSite", new { id = site.Id }, site); + } + + // DELETE: api/Site/5 + [HttpDelete("{id}")] + public async Task DeleteSite([FromRoute] long id) + { + + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + + var site = await _context.Site.SingleOrDefaultAsync(m => m.Id == id); + + if (site == null) + { + return NotFound(); + } + + + _context.Site.Remove(site); + await _context.SaveChangesAsync(); + + return Ok(site); + } + + private bool SiteExists(long id) + { + return _context.Site.Any(e => e.Id == id); + } + } +} \ No newline at end of file diff --git a/Controllers/SubscriptionController.cs b/Controllers/SubscriptionController.cs new file mode 100644 index 0000000..f0983f4 --- /dev/null +++ b/Controllers/SubscriptionController.cs @@ -0,0 +1,128 @@ + +using System.Collections.Generic; +using Microsoft.AspNetCore.Mvc; +using rockfishCore.Models; +using rockfishCore.Util; +using System.Linq; +using System; +using Microsoft.Extensions.Configuration; +using Microsoft.AspNetCore.Authorization; +using Microsoft.EntityFrameworkCore; + +namespace rockfishCore.Controllers +{ + [Produces("application/json")] + [Route("api/subscription")] + [Authorize] + public class SubscriptionController : Controller + { + private readonly rockfishContext _context; + private readonly IConfiguration _configuration; + public SubscriptionController(rockfishContext context, IConfiguration configuration)//these two are injected, see startup.cs + { + _context = context; + _configuration = configuration; + } + + //************************** + //TODO: ASYNCIFY ALL OF THIS + + /////////////////////////////////////////////////////// + //Get notification list for expiring subscriptions + // + [HttpGet("notifylist")] + public JsonResult Get() + { + var customerList = _context.Customer.Select(p => new { p.Id, p.Name }); + + /*Query: purchases with no renewal warning flag set, not cancelled and that are expiring subs in next 30 day window grouped by customer and then by purchase date + Take that list show in UI, with button beside each customer group, press button, it generates a renewal warning email + and puts it into the drafts folder, tags all the purchases with renewal warning sent true. */ + + //from three days ago to a month from now + long windowStart = DateUtil.DateToEpoch(DateTime.Now.AddDays(-3)); + long windowEnd = DateUtil.DateToEpoch(DateTime.Now.AddMonths(1)); + + var rawExpiresList = _context.Purchase + .Where(p => p.RenewNoticeSent == false) + .Where(p => p.ExpireDate != null) + .Where(p => p.ExpireDate > windowStart) + .Where(p => p.ExpireDate < windowEnd) + .Where(p => p.CancelDate == null) + .OrderBy(p => p.CustomerId) + .Select(p => new { id = p.Id, name = p.Name, customerId = p.CustomerId }) + .ToList(); + + + + //Initiate an empty list for return + List retList = new List(); + //Bail if nothing to see here + if (rawExpiresList.Count < 1) + { + return Json(retList); + } + + + long lastCustomerId = -1; + subnotifyResultItem sn = new subnotifyResultItem(); + + //flatten the list and project it into return format + foreach (var i in rawExpiresList) + { + //first loop? + if (lastCustomerId == -1) lastCustomerId = i.customerId; + + //New customer? + if (i.customerId != lastCustomerId) + { + sn.purchasenames = sn.purchasenames.TrimStart(',').Trim(); + retList.Add(sn); + sn = new subnotifyResultItem(); + lastCustomerId = i.customerId; + } + + if (sn.customerId == 0) + { + //get the full data + sn.Customer = customerList.First(p => p.Id == i.customerId).Name; + sn.customerId = i.customerId; + sn.purchaseidlist = new List(); + } + sn.purchasenames += ", " + i.name; + sn.purchaseidlist.Add(i.id); + } + //Add the last one + sn.purchasenames = sn.purchasenames.TrimStart(',').Trim(); + retList.Add(sn); + + return Json(retList); + } + + //dto classes for route + public class subnotifyResultItem + { + public long id; + public string Customer; + public string purchasenames; + public List purchaseidlist; + public long customerId; + + } + + //SEND SELECTED RENEWAL NOTIFICATIONS + [HttpPost("sendnotify")] + public JsonResult Generate([FromBody] List purchaseidlist) + { + return Json(RfNotify.SendSubscriptionRenewalNotice(_context, purchaseidlist)); + } + + + + ///////////////////////////////////////////////////////////////////////////////////// + + + + }//eoc +}//eons + diff --git a/Controllers/TextTemplateController.cs b/Controllers/TextTemplateController.cs new file mode 100644 index 0000000..c4f7fdc --- /dev/null +++ b/Controllers/TextTemplateController.cs @@ -0,0 +1,137 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Authorization; +using Microsoft.EntityFrameworkCore; +using rockfishCore.Models; + +namespace rockfishCore.Controllers +{ + [Produces("application/json")] + [Route("api/TextTemplate")] + [Authorize] + public class TextTemplateController : Controller + { + private readonly rockfishContext _context; + + public TextTemplateController(rockfishContext context) + { + _context = context; + } + + + //ui ordered list + [HttpGet("list")] + public IEnumerable GetList() + { + var tt = from s in _context.TextTemplate select s; + tt = tt.OrderBy(s => s.Name); + return tt; + } + + // GET: api/TextTemplate + [HttpGet] + public IEnumerable GetTextTemplate() + { + return _context.TextTemplate; + } + + // GET: api/TextTemplate/5 + [HttpGet("{id}")] + public async Task GetTextTemplate([FromRoute] long id) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + var TextTemplate = await _context.TextTemplate.SingleOrDefaultAsync(m => m.Id == id); + + if (TextTemplate == null) + { + return NotFound(); + } + + return Ok(TextTemplate); + } + + // PUT: api/TextTemplate/5 + [HttpPut("{id}")] + public async Task PutTextTemplate([FromRoute] long id, [FromBody] TextTemplate TextTemplate) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + if (id != TextTemplate.Id) + { + return BadRequest(); + } + + _context.Entry(TextTemplate).State = EntityState.Modified; + + try + { + await _context.SaveChangesAsync(); + } + catch (DbUpdateConcurrencyException) + { + if (!TextTemplateExists(id)) + { + return NotFound(); + } + else + { + throw; + } + } + + return NoContent(); + } + + // POST: api/TextTemplate + [HttpPost] + public async Task PostTextTemplate([FromBody] TextTemplate TextTemplate) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + _context.TextTemplate.Add(TextTemplate); + await _context.SaveChangesAsync(); + + return CreatedAtAction("GetTextTemplate", new { id = TextTemplate.Id }, TextTemplate); + } + + // DELETE: api/TextTemplate/5 + [HttpDelete("{id}")] + public async Task DeleteTextTemplate([FromRoute] long id) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + var TextTemplate = await _context.TextTemplate.SingleOrDefaultAsync(m => m.Id == id); + if (TextTemplate == null) + { + return NotFound(); + } + + _context.TextTemplate.Remove(TextTemplate); + await _context.SaveChangesAsync(); + + return Ok(TextTemplate); + } + + private bool TextTemplateExists(long id) + { + return _context.TextTemplate.Any(e => e.Id == id); + } + } +} \ No newline at end of file diff --git a/Controllers/UserController.cs b/Controllers/UserController.cs new file mode 100644 index 0000000..e4d5897 --- /dev/null +++ b/Controllers/UserController.cs @@ -0,0 +1,172 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Authorization; +using Microsoft.EntityFrameworkCore; +using rockfishCore.Models; +using rockfishCore.Util; + +namespace rockfishCore.Controllers +{ + [Produces("application/json")] + [Route("api/User")] + [Authorize] + public class UserController : Controller + { + private readonly rockfishContext _context; + + public UserController(rockfishContext context) + { + _context = context; + } + + // GET: api/User + [HttpGet] + public IEnumerable GetUser() + { + return _context.User; + } + + // GET: api/User/5 + [HttpGet("{id}")] + public async Task GetUser([FromRoute] long id) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + var user = await _context.User.SingleOrDefaultAsync(m => m.Id == id); + + if (user == null) + { + return NotFound(); + } + + return Ok(user); + } + + // PUT: api/User/5 + [HttpPut("{id}")] + public async Task PutUser([FromRoute] long id, [FromBody] User user) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + if (id != user.Id) + { + return BadRequest(); + } + + _context.Entry(user).State = EntityState.Modified; + + try + { + await _context.SaveChangesAsync(); + } + catch (DbUpdateConcurrencyException) + { + if (!UserExists(id)) + { + return NotFound(); + } + else + { + throw; + } + } + + return NoContent(); + } + + // POST: api/User + [HttpPost] + public async Task PostUser([FromBody] User user) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + _context.User.Add(user); + await _context.SaveChangesAsync(); + + return CreatedAtAction("GetUser", new { id = user.Id }, user); + } + + // DELETE: api/User/5 + [HttpDelete("{id}")] + public async Task DeleteUser([FromRoute] long id) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + var user = await _context.User.SingleOrDefaultAsync(m => m.Id == id); + if (user == null) + { + return NotFound(); + } + + _context.User.Remove(user); + await _context.SaveChangesAsync(); + + return Ok(user); + } + + private bool UserExists(long id) + { + return _context.User.Any(e => e.Id == id); + } + + + //------------ + + [HttpPost("{id}/changepassword")] + public JsonResult ChangePassword([FromRoute] long id, [FromBody] dtoChangePassword cp) + { + if (string.IsNullOrWhiteSpace(cp.oldpassword) || string.IsNullOrWhiteSpace(cp.newpassword)) + { + return Json(new { msg = "UserController:ChangePassword->A required value is missing", error = 1 }); + } + + try + { + var user = _context.User.SingleOrDefault(m => m.Id == id); + string oldhash = Hasher.hash(user.Salt, cp.oldpassword); + if (oldhash == user.Password) + { + string newhash = Hasher.hash(user.Salt, cp.newpassword); + user.Password = newhash; + _context.User.Update(user); + _context.SaveChanges(); + return Json(new { msg = "success", ok = 1 }); + } + else + { + return Json(new { msg = "UserController:ChangePassword->current password does not match", error = 1 }); + } + } + catch (Exception ex) + { + return Json(new { msg = ex.Message, error = 1 }); + } + } + + public class dtoChangePassword + { + public string oldpassword; + public string newpassword; + + } + + + + } +} \ No newline at end of file diff --git a/Models/Customer.cs b/Models/Customer.cs new file mode 100644 index 0000000..fa6b37e --- /dev/null +++ b/Models/Customer.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; + +namespace rockfishCore.Models +{ + public partial class Customer + { + public Customer() + { + //Contact = new HashSet(); + // Incident = new HashSet(); + // Notification = new HashSet(); + Purchase = new HashSet(); + Site = new HashSet(); + // Trial = new HashSet(); + } + + public long Id { get; set; } + public string Name { get; set; } + public string Country { get; set; } + public string StateProvince { get; set; } + public string AffiliateNumber { get; set; } + public bool DoNotContact { get; set; } + public string Notes { get; set; } + public bool Active { get; set; } + + public string SupportEmail { get; set; } + public string AdminEmail { get; set; } + + // public virtual ICollection Contact { get; set; } + // public virtual ICollection Incident { get; set; } + // public virtual ICollection Notification { get; set; } + public virtual ICollection Purchase { get; set; } + public virtual ICollection Site { get; set; } + // public virtual ICollection Trial { get; set; } + } +} diff --git a/Models/License.cs b/Models/License.cs new file mode 100644 index 0000000..d294370 --- /dev/null +++ b/Models/License.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; + + +namespace rockfishCore.Models +{ + public partial class License + { + public long Id { get; set; } + public long CustomerId { get; set; } + public long DtCreated { get; set; } + public string RegTo { get; set; } + public string Key { get; set; } + public string Email { get; set; } + public string Code { get; set; } + public string FetchFrom { get; set; } + public long? DtFetched { get; set; } + public bool Fetched { get; set; } + + } +} diff --git a/Models/LicenseTemplates.cs b/Models/LicenseTemplates.cs new file mode 100644 index 0000000..0af109f --- /dev/null +++ b/Models/LicenseTemplates.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace rockfishCore.Models +{ + public partial class LicenseTemplates + { + public long Id { get; set; } + public string FullNew { get; set; } + public string FullAddOn { get; set; } + public string FullTrial { get; set; } + public string FullTrialGreeting { get; set; } + public string LiteNew { get; set; } + public string LiteAddOn { get; set; } + public string LiteTrial { get; set; } + public string LiteTrialGreeting { get; set; } + } +} diff --git a/Models/Product.cs b/Models/Product.cs new file mode 100644 index 0000000..0840529 --- /dev/null +++ b/Models/Product.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; + +namespace rockfishCore.Models +{ + public partial class Product + { + public long Id { get; set; } + public string Name { get; set; } + public string ProductCode { get; set; } + public long Price { get; set; }//in cents + public long RenewPrice { get; set; }//in cents + + } +} diff --git a/Models/Purchase.cs b/Models/Purchase.cs new file mode 100644 index 0000000..9521a56 --- /dev/null +++ b/Models/Purchase.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace rockfishCore.Models +{ + public partial class Purchase + { + public long Id { get; set; } + public long CustomerId { get; set; } + public long SiteId { get; set; } + public string Name { get; set; } + public string VendorName { get; set; } + public string Email { get; set; } + public string ProductCode { get; set; } + public string SalesOrderNumber { get; set; } + public long PurchaseDate { get; set; } + public long? ExpireDate { get; set; } + public long? CancelDate { get; set; } + public string CouponCode { get; set; } + public string Notes { get; set; } + //schema v2 + public bool RenewNoticeSent { get; set; } + + [JsonIgnore] + public virtual Customer Customer { get; set; } + public virtual Site Site { get; set; } + } +} diff --git a/Models/RfCase.cs b/Models/RfCase.cs new file mode 100644 index 0000000..30e7d20 --- /dev/null +++ b/Models/RfCase.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; + +namespace rockfishCore.Models +{ + public partial class RfCase + { + + // public RfCase() + // { + // RfCaseBlob = new HashSet(); + // // RfCaseProject = new HashSet(); + + // } + public long Id { get; set; } + public string Title { get; set; } + public long RfCaseProjectId { get; set; } + public int Priority { get; set; } + public string Notes { get; set; } + public long? DtCreated { get; set; } + public long? DtClosed { get; set; } + public string ReleaseVersion { get; set; } + public string ReleaseNotes { get; set; } + + + // public virtual RfCaseProject RfCaseProject { get; set; } + //public virtual ICollection RfCaseBlob { get; set; } + } +} diff --git a/Models/RfCaseBlob.cs b/Models/RfCaseBlob.cs new file mode 100644 index 0000000..ebf9195 --- /dev/null +++ b/Models/RfCaseBlob.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; + +namespace rockfishCore.Models +{ + public partial class RfCaseBlob + { + public long Id { get; set; } + public long? RfCaseId { get; set; } + public string Name { get; set; } + public byte[] File { get; set; } + public virtual RfCase RfCase { get; set; } + } +} diff --git a/Models/RfCaseProject.cs b/Models/RfCaseProject.cs new file mode 100644 index 0000000..d2215ab --- /dev/null +++ b/Models/RfCaseProject.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; + +namespace rockfishCore.Models +{ + public partial class RfCaseProject + { + + // public RfCaseProject() + // { + // RfCase = new HashSet(); + // } + + public long Id { get; set; } + public string Name { get; set; } + + // public virtual ICollection RfCase { get; set; } + } +} diff --git a/Models/Site.cs b/Models/Site.cs new file mode 100644 index 0000000..fe7d702 --- /dev/null +++ b/Models/Site.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace rockfishCore.Models +{ + public partial class Site + { + public Site() + { + // Incident = new HashSet(); + Purchase = new HashSet(); + //TrialNavigation = new HashSet(); + } + + public long Id { get; set; } + + public long CustomerId { get; set; } + public string Name { get; set; } + public string Country { get; set; } + public string StateProvince { get; set; } + public bool Trial { get; set; } + public long? TrialStartDate { get; set; } + public string TrialNotes { get; set; } + public bool Networked { get; set; } + public bool Hosted { get; set; } + public string HostName { get; set; } + public long? HostingStartDate { get; set; } + public long? HostingEndDate { get; set; } + public string DbType { get; set; } + public string ServerOs { get; set; } + public string ServerBits { get; set; } + public string Notes { get; set; } + + // public virtual ICollection Incident { get; set; } + public virtual ICollection Purchase { get; set; } + // public virtual ICollection TrialNavigation { get; set; } + public virtual Customer Customer { get; set; } + } +} diff --git a/Models/TextTemplate.cs b/Models/TextTemplate.cs new file mode 100644 index 0000000..296cee6 --- /dev/null +++ b/Models/TextTemplate.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace rockfishCore.Models +{ + public partial class TextTemplate + { + public long Id { get; set; } + public string Name { get; set; } + public string Template { get; set; } + } +} diff --git a/Models/User.cs b/Models/User.cs new file mode 100644 index 0000000..c293cb7 --- /dev/null +++ b/Models/User.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; + +namespace rockfishCore.Models +{ + public partial class User + { + public long Id { get; set; } + public string Name { get; set; } + public string Login { get; set; } + public string Password { get; set; } + public string Salt { get; set; } + public string DlKey { get; set; } + public long? DlKeyExp { get; set; } + + } +} diff --git a/Models/dtoKeyOptions.cs b/Models/dtoKeyOptions.cs new file mode 100644 index 0000000..2bd5134 --- /dev/null +++ b/Models/dtoKeyOptions.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; + +namespace rockfishCore.Models +{ + public class dtoKeyOptions + { + + public bool keyWillLockout { get; set; } + public long? lockoutDate { get; set; } + public bool isLite { get; set; } + public string licenseType { get; set; } + public string registeredTo { get; set; } + public int users { get; set; } + public long? supportExpiresDate { get; set; } + public bool wbi { get; set; } + public long? wbiSupportExpiresDate { get; set; } + public bool mbi { get; set; } + public long? mbiSupportExpiresDate { get; set; } + public bool ri { get; set; } + public long? riSupportExpiresDate { get; set; } + public bool qbi { get; set; } + public long? qbiSupportExpiresDate { get; set; } + public bool qboi { get; set; } + public long? qboiSupportExpiresDate { get; set; } + public bool pti { get; set; } + public long? ptiSupportExpiresDate { get; set; } + public bool quickNotification { get; set; } + public long? quickNotificationSupportExpiresDate { get; set; } + public bool exportToXls { get; set; } + public long? exportToXlsSupportExpiresDate { get; set; } + public bool outlookSchedule { get; set; } + public long? outlookScheduleSupportExpiresDate { get; set; } + public bool oli { get; set; } + public long? oliSupportExpiresDate { get; set; } + public bool importExportCSVDuplicate { get; set; } + public long? importExportCSVDuplicateSupportExpiresDate { get; set; } + public string key { get; set; } + + //case 3233 + public string emailAddress{get;set;} + public string fetchCode{get;set;} + public long customerId{get;set;}//always a valid ID or zero for a trial (no customer) key + + //dynamically generated, not from request + public string authorizedUserKeyGeneratorStamp { get; set; } + public DateTime installByDate{get;set;} + + + + + + + + } +} + + +/* + +{"keyWillLockout":"false","lockoutDate":"2017-08-10","isLite":"false","licenseType":"new","registeredTo":"MyTestCompany","users":"1", +"supportExpiresDate":"2018-07-10","wbi":"false","wbiSupportExpiresDate":"2018-07-10","mbi":"false","mbiSupportExpiresDate":"2018-07-10", +"ri":"false","riSupportExpiresDate":"2018-07-10","qbi":"false","qbiSupportExpiresDate":"2018-07-10","qboi":"false", +"qboiSupportExpiresDate":"2018-07-10","pti":"false","ptiSupportExpiresDate":"2018-07-10", +"quickNotification":"false","quickNotificationSupportExpiresDate":"2018-07-10","exportToXls":"false","exportToXlsSupportExpiresDate":"2018-07-10", +"outlookSchedule":"false","outlookScheduleSupportExpiresDate":"2018-07-10","oli":"false","oliSupportExpiresDate":"2018-07-10", +"importExportCSVDuplicate":"false","importExportCSVDuplicateSupportExpiresDate":"2018-07-10","key":""} + */ diff --git a/Models/dtoKeyRequestResponse.cs b/Models/dtoKeyRequestResponse.cs new file mode 100644 index 0000000..99d4336 --- /dev/null +++ b/Models/dtoKeyRequestResponse.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace rockfishCore.Models +{ + //DTO class for license request key response form submission handling + public class dtoKeyRequestResponse + { + public string greeting { get; set; } + public string greetingReplySubject { get; set; } + public string keycode { get; set; } + public string request { get; set; } + public string requestReplyToAddress { get; set; } + public string requestFromReplySubject { get; set; } + public uint request_email_uid { get; set; } + + } +} diff --git a/Models/dtoLicenseListItem.cs b/Models/dtoLicenseListItem.cs new file mode 100644 index 0000000..a268a67 --- /dev/null +++ b/Models/dtoLicenseListItem.cs @@ -0,0 +1,15 @@ +namespace rockfishCore.Models +{ + //Used to populate list routes for return + public class dtoLicenseListItem + { + public long id; + public long created; + public string regto; + public bool fetched; + public bool trial; + } +} + + + diff --git a/Models/dtoNameIdActiveItem.cs b/Models/dtoNameIdActiveItem.cs new file mode 100644 index 0000000..fb061b8 --- /dev/null +++ b/Models/dtoNameIdActiveItem.cs @@ -0,0 +1,10 @@ +namespace rockfishCore.Models +{ + //Used to populate list routes for return + public class dtoNameIdActiveItem + { + public bool active; + public long id; + public string name; + } +} \ No newline at end of file diff --git a/Models/dtoNameIdChildrenItem.cs b/Models/dtoNameIdChildrenItem.cs new file mode 100644 index 0000000..839792b --- /dev/null +++ b/Models/dtoNameIdChildrenItem.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; + +namespace rockfishCore.Models +{ + //Used to populate list routes for return + public class dtoNameIdChildrenItem + { + public dtoNameIdChildrenItem() + { + children = new List(); + } + public long id; + public string name; + public List children; + } + + +} \ No newline at end of file diff --git a/Models/dtoNameIdItem.cs b/Models/dtoNameIdItem.cs new file mode 100644 index 0000000..cc445e5 --- /dev/null +++ b/Models/dtoNameIdItem.cs @@ -0,0 +1,9 @@ +namespace rockfishCore.Models +{ + //Used to populate list routes for return + public class dtoNameIdItem + { + public long id; + public string name; + } +} \ No newline at end of file diff --git a/Models/rockfishContext.cs b/Models/rockfishContext.cs new file mode 100644 index 0000000..648ecb0 --- /dev/null +++ b/Models/rockfishContext.cs @@ -0,0 +1,532 @@ +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata; +using rockfishCore.Util; +using Microsoft.Extensions.Logging; + +namespace rockfishCore.Models +{ + public partial class rockfishContext : DbContext + { + + + public virtual DbSet Customer { get; set; } + public virtual DbSet LicenseTemplates { get; set; } + public virtual DbSet Purchase { get; set; } + public virtual DbSet Site { get; set; } + public virtual DbSet User { get; set; } + + //schema 2 + public virtual DbSet Product { get; set; } + + //schema 4 + public virtual DbSet TextTemplate { get; set; } + + //schema 6 + public virtual DbSet RfCase { get; set; } + public virtual DbSet RfCaseBlob { get; set; } + public virtual DbSet RfCaseProject { get; set; } + + //schema 10 case 3233 + public virtual DbSet License { get; set; } + + + + //Note: had to add this constructor to work with the code in startup.cs that gets the connection string from the appsettings.json file + //and commented out the above on configuring + public rockfishContext(DbContextOptions options) : base(options) + { } + + //************************************************ + //add logging to diagnose sql errors + //TODO:comment out this entire method in production + // protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + // { + // var lf = new LoggerFactory(); + // lf.AddProvider(new rfLoggerProvider()); + // optionsBuilder.UseLoggerFactory(lf); + // optionsBuilder.EnableSensitiveDataLogging();//show parameters in log text + // } + //************************************************ + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity(entity => + { + entity.ToTable("customer"); + + entity.Property(e => e.Id).HasColumnName("id"); + + entity.Property(e => e.AffiliateNumber) + .HasColumnName("affiliateNumber") + .HasColumnType("text"); + + entity.Property(e => e.Country) + .HasColumnName("country") + .HasColumnType("text"); + + entity.Property(e => e.DoNotContact) + .IsRequired() + .HasColumnName("doNotContact") + .HasColumnType("boolean"); + + entity.Property(e => e.Name) + .IsRequired() + .HasColumnName("name") + .HasColumnType("text"); + + entity.Property(e => e.Notes) + .HasColumnName("notes") + .HasColumnType("text"); + + entity.Property(e => e.StateProvince) + .HasColumnName("stateProvince") + .HasColumnType("text"); + + entity.Property(e => e.Active) + .IsRequired() + .HasColumnName("active") + .HasColumnType("boolean"); + + entity.Property(e => e.AdminEmail) + .HasColumnName("adminEmail") + .HasColumnType("text"); + + entity.Property(e => e.SupportEmail) + .HasColumnName("supportEmail") + .HasColumnType("text"); + + + }); + + + modelBuilder.Entity(entity => + { + entity.ToTable("licenseTemplates"); + + entity.Property(e => e.Id).HasColumnName("id"); + + entity.Property(e => e.FullAddOn) + .HasColumnName("fullAddOn") + .HasColumnType("text"); + + entity.Property(e => e.FullNew) + .HasColumnName("fullNew") + .HasColumnType("text"); + + entity.Property(e => e.FullTrial) + .HasColumnName("fullTrial") + .HasColumnType("text"); + + entity.Property(e => e.FullTrialGreeting) + .HasColumnName("fullTrialGreeting") + .HasColumnType("text"); + + entity.Property(e => e.LiteAddOn) + .HasColumnName("liteAddOn") + .HasColumnType("text"); + + entity.Property(e => e.LiteNew) + .HasColumnName("liteNew") + .HasColumnType("text"); + + entity.Property(e => e.LiteTrial) + .HasColumnName("liteTrial") + .HasColumnType("text"); + + entity.Property(e => e.LiteTrialGreeting) + .HasColumnName("liteTrialGreeting") + .HasColumnType("text"); + + + }); + + + + modelBuilder.Entity(entity => + { + entity.ToTable("purchase"); + + entity.Property(e => e.Id).HasColumnName("id"); + + entity.Property(e => e.CancelDate) + .HasColumnName("cancelDate") + .HasColumnType("integer"); + + entity.Property(e => e.CouponCode) + .HasColumnName("couponCode") + .HasColumnType("text"); + + entity.Property(e => e.CustomerId) + .HasColumnName("customer_id") + .HasColumnType("integer") + .IsRequired(); + + entity.Property(e => e.Email) + .HasColumnName("email") + .HasColumnType("text"); + + entity.Property(e => e.ExpireDate) + .HasColumnName("expireDate") + .HasColumnType("integer"); + + entity.Property(e => e.Name) + .IsRequired() + .HasColumnName("name") + .HasColumnType("text"); + + entity.Property(e => e.Notes) + .HasColumnName("notes") + .HasColumnType("text"); + + entity.Property(e => e.ProductCode) + .HasColumnName("productCode") + .HasColumnType("text"); + + entity.Property(e => e.PurchaseDate) + .HasColumnName("purchaseDate") + .HasColumnType("integer"); + + entity.Property(e => e.SalesOrderNumber) + .HasColumnName("salesOrderNumber") + .HasColumnType("text"); + + entity.Property(e => e.SiteId) + .HasColumnName("site_id") + .HasColumnType("integer") + .IsRequired(); + + entity.Property(e => e.VendorName) + .HasColumnName("vendorName") + .HasColumnType("text"); + + entity.Property(e => e.RenewNoticeSent) + .IsRequired() + .HasColumnName("renewNoticeSent") + .HasColumnType("boolean"); + + entity.HasOne(d => d.Customer) + .WithMany(p => p.Purchase) + .HasForeignKey(d => d.CustomerId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.Site) + .WithMany(p => p.Purchase) + .HasForeignKey(d => d.SiteId) + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity(entity => + { + entity.ToTable("site"); + + entity.Property(e => e.Id).HasColumnName("id"); + + entity.Property(e => e.Country) + .HasColumnName("country") + .HasColumnType("text"); + + entity.Property(e => e.CustomerId) + .HasColumnName("customer_id") + .HasColumnType("integer") + .IsRequired(); + + entity.Property(e => e.DbType) + .HasColumnName("dbType") + .HasColumnType("text"); + + entity.Property(e => e.HostName) + .HasColumnName("hostName") + .HasColumnType("text"); + + entity.Property(e => e.Hosted) + .IsRequired() + .HasColumnName("hosted") + .HasColumnType("boolean"); + + entity.Property(e => e.HostingEndDate) + .HasColumnName("hostingEndDate") + .HasColumnType("integer"); + + entity.Property(e => e.HostingStartDate) + .HasColumnName("hostingStartDate") + .HasColumnType("integer"); + + + entity.Property(e => e.Name) + .IsRequired() + .HasColumnName("name") + .HasColumnType("text"); + + entity.Property(e => e.Networked) + .IsRequired() + .HasColumnName("networked") + .HasColumnType("boolean"); + + entity.Property(e => e.Notes) + .HasColumnName("notes") + .HasColumnType("text"); + + entity.Property(e => e.ServerBits) + .HasColumnName("serverBits") + .HasColumnType("text"); + + entity.Property(e => e.ServerOs) + .HasColumnName("serverOS") + .HasColumnType("text"); + + entity.Property(e => e.StateProvince) + .HasColumnName("stateProvince") + .HasColumnType("text"); + + entity.Property(e => e.Trial) + .IsRequired() + .HasColumnName("trial") + .HasColumnType("boolean"); + + entity.Property(e => e.TrialNotes) + .HasColumnName("trialNotes") + .HasColumnType("text"); + + entity.Property(e => e.TrialStartDate) + .HasColumnName("trialStartDate") + .HasColumnType("integer"); + + entity.HasOne(d => d.Customer) + .WithMany(p => p.Site) + .HasForeignKey(d => d.CustomerId) + .OnDelete(DeleteBehavior.Cascade); + + //.WillCascadeOnDelete(true); + }); + + + + + modelBuilder.Entity(entity => + { + entity.ToTable("user"); + + entity.Property(e => e.Id).HasColumnName("id"); + + entity.Property(e => e.Login) + .IsRequired() + .HasColumnName("login") + .HasColumnType("text"); + + entity.Property(e => e.Name) + .IsRequired() + .HasColumnName("name") + .HasColumnType("text"); + + entity.Property(e => e.DlKey) + .HasColumnName("dlkey") + .HasColumnType("text"); + + entity.Property(e => e.DlKeyExp) + .HasColumnName("dlkeyexp") + .HasColumnType("integer"); + }); + + + + modelBuilder.Entity(entity => + { + entity.ToTable("Product"); + + entity.Property(e => e.Id).HasColumnName("id"); + + entity.Property(e => e.Name) + .IsRequired() + .HasColumnName("name") + .HasColumnType("text"); + + entity.Property(e => e.ProductCode) + .HasColumnName("productCode") + .HasColumnType("text"); + + entity.Property(e => e.Price) + .HasColumnName("price") + .HasColumnType("integer"); + + entity.Property(e => e.RenewPrice) + .HasColumnName("renewPrice") + .HasColumnType("integer"); + + }); + + + + modelBuilder.Entity(entity => + { + entity.ToTable("TextTemplate"); + + entity.Property(e => e.Id).HasColumnName("id"); + + entity.Property(e => e.Name) + .IsRequired() + .HasColumnName("name") + .HasColumnType("text"); + + entity.Property(e => e.Template) + .HasColumnName("template") + .HasColumnType("text"); + + }); + + + //Schema 6 case 3308 + modelBuilder.Entity(entity => + { + entity.ToTable("rfcaseproject"); + + entity.Property(e => e.Id).HasColumnName("id"); + + entity.Property(e => e.Name) + .IsRequired() + .HasColumnName("name") + .HasColumnType("text"); + + // entity.HasOne(cp => cp.RfCase) + // .WithMany(); + + }); + + + + modelBuilder.Entity(entity => + { + entity.ToTable("rfcaseblob"); + + entity.Property(e => e.Id).HasColumnName("id"); + + entity.Property(e => e.RfCaseId) + .HasColumnName("rfcaseid") + .HasColumnType("integer") + .IsRequired(); + + entity.Property(e => e.Name) + .IsRequired() + .HasColumnName("name") + .HasColumnType("text"); + + entity.Property(e => e.File) + .HasColumnName("file") + .HasColumnType("blob") + .IsRequired(); + + + }); + + + + modelBuilder.Entity(entity => + { + entity.ToTable("rfcase"); + + entity.Property(e => e.Id).HasColumnName("id"); + + entity.Property(e => e.Title) + .HasColumnName("title") + .HasColumnType("text") + .IsRequired(); + + entity.Property(e => e.RfCaseProjectId) + .HasColumnName("rfcaseprojectid") + .HasColumnType("integer") + .IsRequired(); + + entity.Property(e => e.Priority) + .IsRequired() + .HasColumnName("priority") + .HasColumnType("integer"); + + entity.Property(e => e.Notes) + .HasColumnName("notes") + .HasColumnType("text"); + + entity.Property(e => e.DtCreated) + .HasColumnName("dtcreated") + .HasColumnType("integer"); + + entity.Property(e => e.DtClosed) + .HasColumnName("dtclosed") + .HasColumnType("integer"); + + entity.Property(e => e.ReleaseVersion) + .HasColumnName("releaseversion") + .HasColumnType("text"); + + entity.Property(e => e.ReleaseNotes) + .HasColumnName("releasenotes") + .HasColumnType("text"); + + + + }); + + + + + + //case 3233 + modelBuilder.Entity(entity => + { + entity.ToTable("license"); + + entity.Property(e => e.Id).HasColumnName("id"); + + entity.Property(e => e.DtCreated) + .HasColumnName("dtcreated") + .HasColumnType("integer") + .IsRequired(); + + entity.Property(e => e.Code) + .HasColumnName("code") + .HasColumnType("text") + .IsRequired(); + + entity.Property(e => e.CustomerId) + .HasColumnName("customerid") + .HasColumnType("integer") + .IsRequired(); + + entity.Property(e => e.DtFetched) + .HasColumnName("dtfetched") + .HasColumnType("integer"); + + entity.Property(e => e.Email) + .HasColumnName("email") + .HasColumnType("text") + .IsRequired(); + + entity.Property(e => e.RegTo) + .HasColumnName("regto") + .HasColumnType("text") + .IsRequired(); + + entity.Property(e => e.Fetched) + .HasColumnName("fetched") + .HasColumnType("boolean") + .IsRequired(); + + entity.Property(e => e.FetchFrom) + .HasColumnName("fetchfrom") + .HasColumnType("text"); + + entity.Property(e => e.Key) + .HasColumnName("key") + .HasColumnType("text") + .IsRequired(); + + + + + }); + + + + //----------- + } + } +} \ No newline at end of file diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..46e40ba --- /dev/null +++ b/Program.cs @@ -0,0 +1,66 @@ +using Microsoft.AspNetCore; +using Microsoft.AspNetCore.Hosting; + +namespace rockfishCore +{ + public class Program + { + public static void Main(string[] args) + { + BuildWebHost(args).Run(); + } + + public static IWebHost BuildWebHost(string[] args) => + WebHost.CreateDefaultBuilder(args) + .UseUrls("http://*:5000") + .CaptureStartupErrors(true) + .UseSetting("detailedErrors", "true") + .UseKestrel() + .UseContentRoot(System.IO.Directory.GetCurrentDirectory()) + .UseIISIntegration() + .UseStartup() + .Build(); + } +} + + +//OLD .netCORE 1.1 style +// using System; +// using System.Collections.Generic; +// using System.IO; +// using System.Linq; +// using System.Threading.Tasks; +// using Microsoft.AspNetCore.Builder; + +// using Microsoft.AspNetCore; +// using Microsoft.AspNetCore.Hosting; + + + +// namespace rockfishCore +// { +// public class Program +// { +// public static void Main(string[] args) +// { +// BuildWebHost(args).Run(); + +// public static IWebHost BuildWebHost(string[] args) => +// WebHost.CreateDefaultBuilder(args) +// .UseStartup() +// .Build(); + +// // var host = new WebHostBuilder() +// // .UseUrls("http://*:5000") +// // .CaptureStartupErrors(true) +// // .UseSetting("detailedErrors", "true") +// // .UseKestrel() +// // .UseContentRoot(Directory.GetCurrentDirectory()) +// // .UseIISIntegration() +// // .UseStartup() +// // .Build(); + +// // host.Run(); +// } +// } +// } diff --git a/Startup.cs b/Startup.cs new file mode 100644 index 0000000..963fb19 --- /dev/null +++ b/Startup.cs @@ -0,0 +1,105 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; + +//manually added +using Microsoft.EntityFrameworkCore; +using rockfishCore.Models; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.IdentityModel.Tokens; +using rockfishCore.Util; + +//added when upgrade to v2 of .netcore +using Microsoft.AspNetCore.Authentication; +//this comment added in windows with notepad++ +//this comment added in Linux with vscode +namespace rockfishCore +{ + public class Startup + { + public Startup(IHostingEnvironment env) + { + var builder = new ConfigurationBuilder() + .SetBasePath(env.ContentRootPath) + .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) + .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) + .AddEnvironmentVariables(); + Configuration = builder.Build(); + } + + public IConfigurationRoot Configuration { get; } + + // This method gets called by the runtime. Use this method to add services to the container. + public void ConfigureServices(IServiceCollection services) + { + + services.AddDbContext(options => options.UseSqlite(Configuration.GetConnectionString("rfdb"))); + + //Added this so that can access configuration from anywhere else + //See authcontroller for usage + services.AddSingleton(Configuration); + + services.AddMvc(); + + //get the key from the appsettings.json file + var secretKey = Configuration.GetSection("JWT").GetValue("secret"); + var signingKey = new SymmetricSecurityKey(System.Text.Encoding.ASCII.GetBytes(secretKey)); + + services.AddAuthentication(options => + { + options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; + options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; + }).AddJwtBearer(options => + { + // options.AutomaticAuthenticate = true; + // options.AutomaticChallenge = true; + options.TokenValidationParameters = new TokenValidationParameters + { + // Token signature will be verified using a private key. + ValidateIssuerSigningKey = true, + RequireSignedTokens = true, + IssuerSigningKey = signingKey, + ValidateIssuer = true, + ValidIssuer = "rockfishCore", + ValidateAudience = false, + // ValidAudience = "https://yourapplication.example.com", + + // Token will only be valid if not expired yet, with 5 minutes clock skew. + // ValidateLifetime = true, + // RequireExpirationTime = true, + // ClockSkew = new TimeSpan(0, 5, 0), + }; + }); + } + + + public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, rockfishContext dbContext) + { + loggerFactory.AddConsole(Configuration.GetSection("Logging")); + loggerFactory.AddDebug(); + app.UseDefaultFiles(); + app.UseStaticFiles(new StaticFileOptions + { + OnPrepareResponse = context => + { + if (context.File.Name == "default.htm") + { + context.Context.Response.Headers.Add("Cache-Control", "no-cache, no-store"); + context.Context.Response.Headers.Add("Expires", "-1"); + } + } + }); + app.UseAuthentication(); + app.UseMvc(); + //Check schema + RfSchema.CheckAndUpdate(dbContext); + + }//eof + } +} diff --git a/appsettings.Development.json b/appsettings.Development.json new file mode 100644 index 0000000..d26d688 --- /dev/null +++ b/appsettings.Development.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "IncludeScopes": false, + "LogLevel": { + "Default": "Warning", + "System": "Warning", + "Microsoft": "Warning" + } + } +} diff --git a/appsettings.json b/appsettings.json new file mode 100644 index 0000000..7f2802c --- /dev/null +++ b/appsettings.json @@ -0,0 +1,15 @@ +{ + "Logging": { + "IncludeScopes": false, + "LogLevel": { + "Default": "Warning" + } + }, + "ConnectionStrings": { + //"rfdb": "Datasource=../../../db/rockfish.sqlite;" + "rfdb": "Datasource=./db/rockfish.sqlite;" + }, + "JWT": { + "secret": "-------Nothing8utTheRain!-------" + } +} \ No newline at end of file diff --git a/notes/deploy.txt b/notes/deploy.txt new file mode 100644 index 0000000..8dffe97 --- /dev/null +++ b/notes/deploy.txt @@ -0,0 +1,28 @@ + +*********************** +HOW TO DEPLOY TO IIS +https://stackify.com/how-to-deploy-asp-net-core-to-iis/ + +1) SET VERSION + +SET app.api RFVERSION property +RENAME ?RFV5.1 parameter in default.htm to the new version so all files update on mobile + + +2) PUBLISH +publish command line from rockfishCore folder: + +//this will build a release version which is what we use on the server now +dotnet publish -c Release -o ./../rfcpublish/ + +dotnet publish -f netcoreapp2.1 -c Release -o ./../rfcpublish/ + +//if need a debug version +dotnet publish -o ./../rfcpublish/ + +3) COPY +Copy over to production server, only need the .dll and the wwwroot folder contents, +remember not to delete the folders on the server only replace their contents because there are Windows file permissions set +Backup the database + +4) Delete any test data local here \ No newline at end of file diff --git a/notes/notes.txt b/notes/notes.txt new file mode 100644 index 0000000..a86062d --- /dev/null +++ b/notes/notes.txt @@ -0,0 +1,114 @@ + + +b43698c255365ee739c05ba0d42855e96c2365c76bb2f9b9eb149cec7b52174c +********************************************* +Updating Microsoft CODE editor +Download the .deb file for 64 bit +execute it +sudo dpkg -i code_1.8.1-1482159060_i386.deb +** UPDATE: As of October 2017 it now updates when you update Debian apt-get update etc + + + +HANDLEBARS +=-=-=-=-=- +Install: +sudo npm install -g handlebars + +Build handlebars template: +handlebars -m wwwroot/js/templates/> wwwroot/js/templates/templates.js + + + + +3rd party Packages used: +JWT JSON web token support using jose-jwt found here: +https://jwt.io/#libraries + +Mailkit (supposedly system.net.mail will be ported in v2.0 of .net core but for now mailkit is the shit): + + + + + + + + +************************** +//command to scaffold the sqlite db: +dotnet ef dbcontext scaffold "Datasource=/home/john/Documents/rockfishCore/db/rockfish.sqlite" Microsoft.EntityFrameworkCore.Sqlite -o Models -f + +//scaffold all controllers with these commands: +dotnet aspnet-codegenerator controller -api -m rockfishCore.Models.Contact -dc rockfishCore.Models.rockfishContext -name ContactController -outDir ./Controllers +dotnet aspnet-codegenerator controller -api -m rockfishCore.Models.Customer -dc rockfishCore.Models.rockfishContext -name CustomerController -outDir ./Controllers +dotnet aspnet-codegenerator controller -api -m rockfishCore.Models.Incident -dc rockfishCore.Models.rockfishContext -name IncidentController -outDir ./Controllers +dotnet aspnet-codegenerator controller -api -m rockfishCore.Models.LicenseTemplates -dc rockfishCore.Models.rockfishContext -name LicenseTemplatesController -outDir ./Controllers +dotnet aspnet-codegenerator controller -api -m rockfishCore.Models.Notification -dc rockfishCore.Models.rockfishContext -name NotificationController -outDir ./Controllers +dotnet aspnet-codegenerator controller -api -m rockfishCore.Models.Purchase -dc rockfishCore.Models.rockfishContext -name PurchaseController -outDir ./Controllers +dotnet aspnet-codegenerator controller -api -m rockfishCore.Models.Site -dc rockfishCore.Models.rockfishContext -name SiteController -outDir ./Controllers +dotnet aspnet-codegenerator controller -api -m rockfishCore.Models.Trial -dc rockfishCore.Models.rockfishContext -name TrialController -outDir ./Controllers +dotnet aspnet-codegenerator controller -api -m rockfishCore.Models.User -dc rockfishCore.Models.rockfishContext -name UserController -outDir ./Controllers + + +Here is the help command for this: + dotnet aspnet-codegenerator controller --help + + + +*********************************** +EF CORE STUFF NOTES + +To INCLUDE relatives use like this: + + var site = await _context.Site + .Include(m=>m.TrialNavigation) + .Include(m=>m.Purchase) + .Include(m=>m.Incident) + .SingleOrDefaultAsync(m => m.Id == id); + + + +=-=-=-=- +EF Core include queries + + +//ad-hoc: + // var res = from c in _context.Customer.OrderBy(c => c.Name) + // join site in _context.Site.DefaultIfEmpty() on c.Id equals site.CustomerId + // join purchase in _context.Purchase.DefaultIfEmpty() on site.Id equals purchase.SiteId + // where (purchase.CancelDate == null) + // select new infoListCustomer + // { + // active = c.Active, + // id = c.Id, + // name = c.Name, + // siteId = site.Id, + // siteName = site.Name, + // purchaseId = purchase.Id, + // purchaseName = purchase.Name + // }; + + +//Using ef relationships: + +// using (var context = new BloggingContext()) +// { +// var blogs = context.Blogs +// .Include(blog => blog.Posts) +// .ThenInclude(post => post.Author) +// .ThenInclude(author => author.Photo) +// .Include(blog => blog.Owner) +// .ThenInclude(owner => owner.Photo) +// .ToList(); +// } + + var res = _context.Customer + .Include(customer => customer.Site) + .ThenInclude(site => site.Purchase)//or...: + //.Include(customer => customer.Purchase)//this also due to reference in EF + .OrderBy(customer => customer.Name); + //.ToList(); + + +var xtest=res.ToList(); +var xcount=xtest.Count(); diff --git a/notes/todo b/notes/todo new file mode 100644 index 0000000..e69de29 diff --git a/rockfishCore.csproj b/rockfishCore.csproj new file mode 100644 index 0000000..07a05b8 --- /dev/null +++ b/rockfishCore.csproj @@ -0,0 +1,17 @@ + + + netcoreapp2.1 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/util/CustomerUtils.cs b/util/CustomerUtils.cs new file mode 100644 index 0000000..9b541ec --- /dev/null +++ b/util/CustomerUtils.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Authorization; +using Microsoft.EntityFrameworkCore; +using rockfishCore.Models; +using System.IO; + +namespace rockfishCore.Util +{ + + public static class CustomerUtils + { + + /// + /// Adds email if not already present, handles trimming and check for duplicates etc + /// **DOES NOT CALL SAVE ON CONTEXT, CALLER IS RESPONSIBLE** + /// + /// + /// + public static void AddAdminEmailIfNotPresent(Customer cust, string newEmail) + { + AddEmailIfNotPresent(cust, newEmail, true); + } + + /// + /// Adds email if not already present, handles trimming and check for duplicates etc + /// **DOES NOT CALL SAVE ON CONTEXT, CALLER IS RESPONSIBLE** + /// + /// + /// + public static void AddSupportEmailIfNotPresent(Customer cust, string newEmail) + { + AddEmailIfNotPresent(cust, newEmail, false); + } + + /// + /// Adds email if not already present, handles trimming and check for duplicates etc + /// **DOES NOT CALL SAVE ON CONTEXT, CALLER IS RESPONSIBLE** + /// + /// + /// + /// + private static void AddEmailIfNotPresent(Customer cust, string newEmail, bool isAdmin) + { + newEmail = newEmail.Trim(); + string newEmailAsLower = newEmail.ToLowerInvariant(); + string compareTo = cust.AdminEmail; + if (false == isAdmin) + compareTo = cust.SupportEmail; + + bool noPriorAddress = false; + + if (!string.IsNullOrWhiteSpace(compareTo)) + compareTo = compareTo.ToLowerInvariant(); + else + noPriorAddress = true; + + //See if email is already present + if (false == noPriorAddress && compareTo.Contains(newEmailAsLower)) + { + return;//skip this one, it's already there + } + + //It's not in the field already so add it + if (noPriorAddress) + { + if (isAdmin) + cust.AdminEmail = newEmail; + else + cust.SupportEmail = newEmail; + } + else + { + if (isAdmin) + cust.AdminEmail = cust.AdminEmail + ", " + newEmail; + else + cust.SupportEmail = cust.SupportEmail + ", " + newEmail; + } + } + + + }//eoc + +}//eons \ No newline at end of file diff --git a/util/DateUtil.cs b/util/DateUtil.cs new file mode 100644 index 0000000..777dba8 --- /dev/null +++ b/util/DateUtil.cs @@ -0,0 +1,104 @@ +using System; +using System.Text; + + +namespace rockfishCore.Util +{ + public static class DateUtil + { + public const string DATE_TIME_FORMAT = "MMMM dd, yyyy h:mm tt"; + public const string DATE_ONLY_FORMAT = "D"; + + //Unix epoch converters + public static string EpochToString(long? uepoch, string formatString = null) + { + if (uepoch == null) return string.Empty; + if (formatString == null) + formatString = DATE_ONLY_FORMAT; + return DateTimeOffset.FromUnixTimeSeconds(uepoch.Value).DateTime.ToString(formatString); + } + public static DateTime EpochToDate(long? uepoch) + { + DateTime dt = DateTime.Now; + if (uepoch == null) return DateTime.MinValue; + return DateTimeOffset.FromUnixTimeSeconds(uepoch.Value).DateTime; + } + + public static long DateToEpoch(DateTime dt) + { + DateTimeOffset dto = new DateTimeOffset(dt); + return dto.ToUnixTimeSeconds(); + } + + public static long? DateTimeOffSetNullableToEpoch(DateTimeOffset? dt) + { + if (dt == null) + { + return null; + } + DateTimeOffset dto = dt.Value; + return dto.ToUnixTimeSeconds(); + } + + + public static string ISO8601StringToLocalDateTime(string s) + { + if (!string.IsNullOrWhiteSpace(s)) + { + return DateTimeOffset.Parse(s).DateTime.ToLocalTime().ToString(DATE_TIME_FORMAT); + } + return string.Empty; + } + + public static long? ISO8601StringToEpoch(string s) + { + DateTimeOffset? dto = ISO8601StringToDateTimeOffset(s); + if (dto == null) + return null; + return ((DateTimeOffset)dto).ToUnixTimeSeconds(); + + } + + + /////////////////////// + //This method correctly interprets iso8601 strings to a datetimeoffset + public static DateTimeOffset? ISO8601StringToDateTimeOffset(string s) + { + if (!string.IsNullOrWhiteSpace(s)) + { + DateTimeOffset dto = DateTimeOffset.ParseExact(s, new string[] { "yyyy-MM-dd'T'HH:mm:ss.FFFK" }, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None); + return dto; + } + return null; + } + + + + public static long NowAsEpoch() + { + DateTimeOffset dto = new DateTimeOffset(DateTime.Now); + return dto.ToUnixTimeSeconds(); + } + + + /// + /// An internally consistent empty or not relevant date marker: + /// January 1st 5555 + /// Used for RAVEN key generation + /// + /// + public static DateTime EmptyDateValue + { + get + { + return new DateTime(5555, 1, 1); + //Was going to use MaxValue but apparently that varies depending on culture + // and Postgres has issues with year 1 as it interprets as year 2001 + // so to be on safe side just defining one for all usage + } + } + + //eoc + } + //eons +} \ No newline at end of file diff --git a/util/FBImporter.cs b/util/FBImporter.cs new file mode 100644 index 0000000..da43e69 --- /dev/null +++ b/util/FBImporter.cs @@ -0,0 +1,591 @@ +using System; +using System.Text; +using System.Threading.Tasks; +using System.Collections.Generic; +using System.Linq; +using Microsoft.EntityFrameworkCore; +using rockfishCore.Models; + +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +//using System.Xml; +using System.Xml.Linq; +using System.IO; + +namespace rockfishCore.Util +{ + + //Import fogbugz stuff into our own db + //called by schema update 7 + //does not modify FB at all + //can be called any time, won't re-import + public static class FBImporter + { + + public const long LAST_EXISTING_CASE_IN_FOGBUGZ = 3315; + + public static void Import(rockfishContext ct) + { + //fogbugz api token, can get it by using the FB UI, open dev tools, be logged in, do something and watch the token get sent in the network traffic + string sToken = "jvmnpkrvc1i7hc6kn6dggqkibktgcc"; + long nCase = 0; + bool bDone = false; + while (!bDone) + { + //increment until we reach the end (case 3309 as of now) + nCase++; + + if (nCase > LAST_EXISTING_CASE_IN_FOGBUGZ) + { + bDone = true; + break; + } + + //no need for this, we wipe clean before every import now + // //do we already have this record? + // if (ct.RfCase.Any(e => e.Id == nCase)) + // { + // continue; + // } + fbCase fb = getCase(nCase, sToken); + + + //copy over to db + portCase(fb, ct); + + } + } + + private static Dictionary dictProjects = new Dictionary(); + + /////////////////////////////////////////////// + //Port a single case over to Rockfish + // + private static void portCase(fbCase f, rockfishContext ct) + { + + long lProjectId = 0; + + if (f.noRecord) + { + //save as *DELETED* record + //Only setting required fields + RfCase c = new RfCase(); + c.Priority = 5; + c.Title = "deleted from FogBugz"; + c.RfCaseProjectId = 1;//has to be something + ct.RfCase.Add(c); + ct.SaveChanges(); + } + else + { + if (dictProjects.ContainsKey(f.project)) + { + lProjectId = dictProjects[f.project]; + } + else + { + //need to insert it + RfCaseProject t = new RfCaseProject(); + t.Name = f.project; + ct.RfCaseProject.Add(t); + ct.SaveChanges(); + dictProjects.Add(f.project, t.Id); + lProjectId = t.Id; + } + + RfCase c = new RfCase(); + c.DtClosed = f.closed; + c.DtCreated = f.created; + c.Notes = f.notes; + c.Priority = f.priority; + if (c.Priority > 5) + c.Priority = 5; + c.Title = f.title; + c.RfCaseProjectId = lProjectId; + ct.RfCase.Add(c); + ct.SaveChanges(); + + + + if (f.attachments.Count > 0) + { + foreach (fbAttachment att in f.attachments) + { + + RfCaseBlob blob = new RfCaseBlob(); + blob.File = att.blob; + blob.Name = att.fileName; + blob.RfCaseId = c.Id; + ct.RfCaseBlob.Add(blob); + ct.SaveChanges(); + } + } + } + // Console.WriteLine("***************************************************************************"); + Console.WriteLine("~~~~~~~~~~~~~~~~~~~~ PORTCASE: " + f.id); + + } + + + /////////////////////////////////////////////// + //fetch a single case + // + private static fbCase getCase(long caseNumber, string sToken) + { + //Use this url + //https://fog.ayanova.com/api.asp?cmd=search&cols=ixBug,ixBugParent,sTitle,sProject,ixPriority, sPriority,fOpen,ixStatus,sStatus,dtOpened,dtResolved,dtClosed,ixRelatedBugs,events&token=jvmnpkrvc1i7hc6kn6dggqkibktgcc&q=3308 + + + //TEST TEST TEST + // caseNumber = 3279; + + string url = "https://fog.ayanova.com/api.asp?cmd=search&cols=ixBug,ixBugParent,sTitle,sProject,ixPriority,sPriority,fOpen,ixStatus,sStatus,dtOpened,dtResolved,dtClosed,ixRelatedBugs,events&token=" + sToken + "&q=" + caseNumber.ToString(); + + var httpClient = new HttpClient(); + var result = httpClient.GetAsync(url).Result; + var stream = result.Content.ReadAsStreamAsync().Result; + var x = XElement.Load(stream); + fbCase f = new fbCase(); + + //are we done? + string scount = (from el in x.DescendantsAndSelf("cases") select el).First().Attribute("count").Value; + if (scount == "0") + { + f.noRecord = true; + return f; + } + + //Got record, process it... + + f.title = getValue("sTitle", x); + f.project = getValue("sProject", x); + f.id = getValue("ixBug", x); + f.priority = int.Parse(getValue("ixPriority", x)); + + f.created = Util.DateUtil.ISO8601StringToEpoch(getValue("dtOpened", x)); + f.closed = Util.DateUtil.ISO8601StringToEpoch(getValue("dtClosed", x)); + + //string DTB4 = getValue("dtOpened", x); + //string DTAFTER = Util.DateUtil.ISO8601StringToLocalDateTime(DTB4); + + + //NOTES / ATTACHMENTS + StringBuilder sbNotes = new StringBuilder(); + //events + var events = (from el in x.Descendants("event") select el).ToList(); + bool bFirstNoteAdded = false; + foreach (var e in events) + { + string sNote = getValue("s", e); + if (!string.IsNullOrWhiteSpace(sNote)) + { + if (bFirstNoteAdded) + { + sbNotes.AppendLine("===================="); + } + bFirstNoteAdded = true; + sbNotes.Append(Util.DateUtil.ISO8601StringToLocalDateTime(getValue("dt", e))); + sbNotes.Append(" "); + sbNotes.AppendLine(getValue("evtDescription", e)); + sbNotes.AppendLine("____________________"); + sbNotes.AppendLine(sNote); + } + + //GET ATTACHMENTS + var attaches = (from l in e.Descendants("attachment") select l).ToList(); + foreach (var a in attaches) + { + fbAttachment fbat = new fbAttachment(); + fbat.fileName = getValue("sFileName", a); + + string fileUrl = "https://fog.ayanova.com/" + System.Net.WebUtility.HtmlDecode(getValue("sURL", a)) + "&token=" + sToken; + + + ///// + using (var aclient = new HttpClient()) + { + var aresponse = aclient.GetAsync(fileUrl).Result; + + if (aresponse.IsSuccessStatusCode) + { + // by calling .Result you are performing a synchronous call + var responseContent = aresponse.Content; + + // by calling .Result you are synchronously reading the result + var astream = responseContent.ReadAsStreamAsync().Result; + + MemoryStream ams = new MemoryStream(); + astream.CopyTo(ams); + fbat.blob = ams.ToArray(); + } + } + ///// + + //bugbug: Looks like this is always the same size, maybe it's getting an error page? + // result = httpClient.GetAsync(url).Result; + // stream = result.Content.ReadAsStreamAsync().Result; + // MemoryStream ms = new MemoryStream(); + // stream.CopyTo(ms); + // fbat.blob = ms.ToArray(); + + f.attachments.Add(fbat); + } + }//bottom of events loop + if (sbNotes.Length > 0) + { + f.notes = sbNotes.ToString(); + } + return f; + } + + + ///////////////////////////////// + // Get header element value + // + private static string getValue(string sItem, XElement x) + { + return (string)(from el in x.Descendants(sItem) select el).First(); + } + + + + ///////////////////////////////////// + //dto object + public class fbCase + { + public fbCase() + { + attachments = new List(); + } + public bool noRecord; + public string id; + public string title; + public string project; + public int priority; + public string notes; + public long? created; + public long? closed; + public List attachments; + } + + public class fbAttachment + { + public string fileName; + public byte[] blob; + } + + //eoc + } + //eons +} + + + + + +/* + + + + + 3308 + 0 + + + 1 + true + 20 + + 2017-08-06T19:11:54Z + + + 3240 + + + 18150 + 1 + + 3 + 0 +
2017-08-06T19:11:54Z
+ + false + false + false + + + + + false + false + + And porting all existing data to rf including old closed cases etc.
Also must be searchable, generate case numbers, have category / project, and priority, accept file attachments like screenshots etc.
]]>
+
+ + 18151 + 3 + + 3 + 3 +
2017-08-06T19:11:55Z
+ + false + false + false + + + + + false + false + + +
+ + 18152 + 2 + + 3 + 0 +
2017-08-07T21:18:55Z
+ + false + false + false + + + + + false + false + + https://fog.ayanova.com/api.asp?cmd=search&cols=ixBug,sTitle,fOpen,ixStatus,dtOpened,dtResolved,dtClosed,ixRelatedBugs,events&token=jvmnpkrvc1i7hc6kn6dggqkibktgcc&q=3240

This is for case 3240 (q=3240) and the token I got from just viewing the network traffic using Fogbugz (which works fine).


The response is an xml document with a case/cases/case header and then an events collection under that which contains all the text added and other events like chaging the title etc which we don't care about.  Also it contains urls for attachments to download and can use the url directly to get the attachment.

]]>
+
+ + 18153 + 2 + + 3 + 0 +
2017-08-07T21:21:02Z
+ + +Where cases count=0 and would normally be one and the cases branch would have the one case fetched.]]> + false + false + false + + + + + false + false + +
The procedure will be to start at 1 and fetch every case +1 until we get a response like this:
<?xml version="1.0" encoding="UTF-8"?><response><cases count="0"></cases></response>

Where cases count=0 and would normally be one and the cases branch would have the one case fetched.]]>
+
+ + 18154 + 2 + + 3 + 0 +
2017-08-07T21:24:48Z
+ + false + false + false + + + + + false + false + +
PROJECTS - all of these in a table

CASES - every case:

CASE HEADER:
Case # (id), Title, project, priority
  CASE EVENTS:
    - s (string of text (CDATA))
    - Any attachments

]]>
+
+ + 18155 + 2 + + 3 + 0 +
2017-08-07T21:34:27Z
+ + false + false + false + + + + + false + false + + +
+ + 18156 + 2 + + 3 + 0 +
2017-08-07T21:37:37Z
+ + false + false + false + + + + + false + false + +
New db tables:
CASE
CASEPROJECT
CASEBLOB

CASE Fields:
=-=-=-=-=-=-
ID (integer not null, case # autoincrement),
TITLE text not null,
PROJECT (fk CASEPROJECT not null),
PRIORITY (integer 1-5 not null),
NOTES (text nullable),
CREATED (date time as integer, nullable),
CLOSED (date time as integer, nullable, also serves as closed indicator or open indicator if null),
RELEASEVERSION (text nullable, public release version that fixed the item, i.e. if it was qboi 7.5 patch 1 then this would be 7.5.1),
RELEASENOTES (text nullable, single string of text that serves as customer description of fix).

CASEPROJECT fields:
=-=-=-=-=-=-=-=-=-=-
id (integer not null pk autoincrement),
name (text not null, project name i.e. QBOI)

CASEBLOB fields
id (integer not null pk autoincrement)
CASEID (fk not null link to case)
FILE (blob not null)

]]>
+
+ + 18157 + 2 + + 3 + 0 +
2017-08-07T22:13:24Z
+ + false + false + false + + + + + false + false + + +
+ + 18158 + 2 + + 3 + 0 +
2017-08-07T22:13:32Z
+ + false + false + false + + + + + false + false + + +
+ + 18159 + 2 + + 3 + 0 +
2017-08-07T22:29:29Z
+ + false + false + false + + + + + false + false + + +
+ + 18160 + 2 + + 3 + 0 +
2017-08-07T22:49:22Z
+ + false + false + false + + + + + false + false + + +
+
+
+
+
+ */ diff --git a/util/HexString.cs b/util/HexString.cs new file mode 100644 index 0000000..9958246 --- /dev/null +++ b/util/HexString.cs @@ -0,0 +1,44 @@ +using System; +using System.Text; + + +namespace rockfishCore.Util +{ + + public static class HexString + { + + + public static string ToHex(string str) + { + var sb = new StringBuilder(); + + var bytes = Encoding.ASCII.GetBytes(str); + foreach (var t in bytes) + { + sb.Append(t.ToString("X2")); + } + + return sb.ToString(); // returns: "48656C6C6F20776F726C64" for "Hello world" + } + + + + public static string FromHex(string hexString) + { + var bytes = new byte[hexString.Length / 2]; + for (var i = 0; i < bytes.Length; i++) + { + bytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); + } + + return Encoding.ASCII.GetString(bytes); // returns: "Hello world" for "48656C6C6F20776F726C64" + } + + + + + //eoc + } + //eons +} \ No newline at end of file diff --git a/util/KeyFactory.cs b/util/KeyFactory.cs new file mode 100644 index 0000000..139e5b7 --- /dev/null +++ b/util/KeyFactory.cs @@ -0,0 +1,521 @@ +using System; +using System.Text; +using System.Collections.Generic; +using System.IO; +using Org.BouncyCastle.Security; +using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.OpenSsl; +using rockfishCore.Models; +using rockfishCore.Util; + + + +namespace rockfishCore.Util +{ + //Key generator controller + public static class KeyFactory + { + + public const string PLUGIN_MBI_KEY = "MBI - Minimal browser interface"; + public const string PLUGIN_WBI_KEY = "WBI - Web browser interface"; + public const string PLUGIN_QBI_KEY = "QBI - QuickBooks interface"; + public const string PLUGIN_QBOI_KEY = "QBOI - QuickBooks Online interface"; + public const string PLUGIN_PTI_KEY = "PTI - US Sage 50/Peachtree interface"; + public const string PLUGIN_QUICK_NOTIFICATION_KEY = "QuickNotification"; + public const string PLUGIN_EXPORT_TO_XLS_KEY = "ExportToXls"; + public const string PLUGIN_OUTLOOK_SCHEDULE_KEY = "OutlookSchedule"; + public const string PLUGIN_OLI_KEY = "AyaNovaOLI"; + public const string PLUGIN_IMPORT_EXPORT_CSV_DUPLICATE_KEY = "ImportExportCSVDuplicate"; + public const string PLUGIN_RI_KEY = "RI - Responsive Interface"; + + + private static Dictionary _plugins; + + //Generate a key message reply from a key selection object + //CALLED BY LicenseController Generate route + public static string GetKeyReply(dtoKeyOptions ko, LicenseTemplates t, rockfishContext ct) + { + + //case 3542 + ko.installByDate = System.DateTime.Now.AddYears(1);//changed from one month to one year + string sKey = genKey(ko, ct); + string sMsg = genMessage(sKey, ko, t); + return sMsg; + } + + + + //called by trialkeyrequesthandler.GenerateFromRequest + //get a trial key for named regTo + public static string GetTrialKey(string regTo, bool lite, LicenseTemplates t, string authorizedUserKeyGeneratorStamp, + string emailAddress, rockfishContext ct)//case 3233 + { + DateTime dtoneMonth = System.DateTime.Now.AddMonths(1); + long oneMonth = DateUtil.DateToEpoch(System.DateTime.Now.AddMonths(1)); + + dtoKeyOptions ko = new dtoKeyOptions(); + + //case 3233 + ko.emailAddress = emailAddress; + ko.customerId = 0; //not a customer so trial 0 + + ko.registeredTo = regTo; + ko.supportExpiresDate = oneMonth; + ko.isLite = lite; + ko.installByDate = dtoneMonth; + ko.authorizedUserKeyGeneratorStamp = authorizedUserKeyGeneratorStamp; + if (lite) + { + ko.users = 1; + } + else + { + ko.users = 5; + } + + ko.licenseType = "webRequestedTrial"; + + ko.qbi = true; + ko.qbiSupportExpiresDate = oneMonth; + + ko.qboi = true; + ko.qboiSupportExpiresDate = oneMonth; + + ko.pti = true; + ko.ptiSupportExpiresDate = oneMonth; + + ko.exportToXls = true; + ko.exportToXlsSupportExpiresDate = oneMonth; + + ko.outlookSchedule = true; + ko.outlookScheduleSupportExpiresDate = oneMonth; + + ko.oli = true; + ko.oliSupportExpiresDate = oneMonth; + + ko.importExportCSVDuplicate = true; + ko.importExportCSVDuplicateSupportExpiresDate = oneMonth; + + if (!lite) + { + ko.quickNotification = true; + ko.quickNotificationSupportExpiresDate = oneMonth; + + ko.mbi = true; + ko.mbiSupportExpiresDate = oneMonth; + + ko.wbi = true; + ko.wbiSupportExpiresDate = oneMonth; + + ko.ri = true; + ko.riSupportExpiresDate = oneMonth; + } + + string sKey = genKey(ko, ct); + string sMsg = genMessage(sKey, ko, t); + return sMsg; + + } + + + //Take the key and the options and make a return message ready to send + private static string genMessage(string sKey, dtoKeyOptions ko, LicenseTemplates template) + { + string sMessage = ""; + + if (ko.licenseType == "new") + { + if (ko.isLite) + { + sMessage = template.LiteNew; + } + else + { + sMessage = template.FullNew; + } + } + else if (ko.licenseType == "addon") + { + if (ko.isLite) + { + sMessage = template.LiteAddOn; + } + else + { + sMessage = template.FullAddOn; + } + } + else//licensed trial + { + if (ko.isLite) + { + sMessage = template.LiteTrial; + } + else + { + sMessage = template.FullTrial; + } + } + + //token substitutions + sMessage = sMessage.Replace("[LicenseExpiryDate]", ko.installByDate.ToString("D"));//https://github.com/dotnet/coreclr/issues/2317 + sMessage = sMessage.Replace("[LicenseDescription]", LicenseInfo(ko)); + sMessage = sMessage.Replace("[LicenseKey]", sKey); + + return sMessage; + + } + + + + + // Extra info to display about key at top of key message + private static string LicenseInfo(dtoKeyOptions ko) + { + StringBuilder sb = new StringBuilder(); + sb.Append("LICENSE DETAILS\r\n"); + sb.Append("This key must be installed before: "); + sb.Append(ko.installByDate.ToString("D")); + sb.Append("\r\n"); + + //if (kg.SelectedLicenseType == "Web requested trial") + //{ + // sb.Append("*** This temporary license key has been provided for limited evaluation purposes only *** \r\n"); + // sb.Append("This license will expire and AyaNova usage will be restricted after: " + kg.Expires.ToLongDateString() + "\r\n\r\n"); + //} + + if (ko.keyWillLockout) + { + sb.Append("*** This temporary license key is provided for evaluation use only pending payment ***\r\n"); + sb.Append("This license will expire and AyaNova usage will be restricted after: " + DateUtil.EpochToString(ko.lockoutDate) + "\r\n"); + sb.Append("\r\n"); + sb.Append("A permanent license key will be sent to you when payment \r\n" + + "has been received and processed. There will be no extensions or \r\n" + + "exceptions. Please send in payment early enough to allow for \r\n" + + "mail and processing time to ensure uninterrupted use of AyaNova" + (ko.isLite ? " Lite" : "") + ". \r\n\r\n"); + } + + + + + sb.Append("Registered to: "); + sb.Append(ko.registeredTo); + sb.Append("\r\n"); + + //case 3233 + sb.Append("Fetch address: "); + sb.Append(ko.emailAddress); + sb.Append("\r\n"); + + sb.Append("Fetch code: "); + sb.Append(ko.fetchCode); + sb.Append("\r\n"); + + + sb.Append("Scheduleable resources: "); + switch (ko.users) + { + case 1: + sb.AppendLine("1"); + break; + case 5: + sb.AppendLine("Up to 5"); + break; + case 10: + sb.AppendLine("Up to 10"); + break; + case 15: + sb.AppendLine("Up to 15");//case 3550 + break; + case 20: + sb.AppendLine("Up to 20"); + break; + case 50: + sb.AppendLine("Up to 50"); + break; + case 999: + sb.AppendLine("Up to 999"); + break; + } + + sb.AppendLine("Support and updates until: " + DateUtil.EpochToString(ko.supportExpiresDate) + "\r\n"); + + if (_plugins.Count > 0) + { + sb.Append("\r\n"); + sb.Append("Plugins:\r\n"); + foreach (KeyValuePair kv in _plugins) + { + sb.Append("\t"); + sb.Append(kv.Key); + sb.Append(" support and updates until: "); + sb.Append(kv.Value.ToString("D")); + sb.Append("\r\n"); + } + } + + return sb.ToString(); + } + + + + + + + /// + /// Generate keycode based on passed in data + /// This is called by both regular and trial license key routes + /// + /// + private static string genKey(dtoKeyOptions ko, rockfishContext ct) + { + _plugins = new Dictionary(); + + if (ko.registeredTo == null || ko.registeredTo == "") + throw new ArgumentException("RegisteredTo is required", "RegisteredTo"); + + if (string.IsNullOrWhiteSpace(ko.emailAddress)) + throw new ArgumentException("Email address is required", "emailAddress"); + + try + { + + StringBuilder sbKey = new StringBuilder(); + StringWriter sw = new StringWriter(sbKey); + + //case 3233 + ko.fetchCode = FetchKeyCode.generate(); + + using (Newtonsoft.Json.JsonWriter w = new Newtonsoft.Json.JsonTextWriter(sw)) + { + w.Formatting = Newtonsoft.Json.Formatting.Indented; + + //outer object start + w.WriteStartObject(); + + if (ko.isLite) + w.WritePropertyName("AyaNovaLiteLicenseKey"); + else + w.WritePropertyName("AyaNovaLicenseKey"); + + w.WriteStartObject();//start of key object + + w.WritePropertyName("SchemaVersion"); + w.WriteValue("7"); + + //stamp a unique value in the key so it can be revoked later + //used to use the digest value of the key for this with xml key + //whole unix timestamp seconds but kept as a double to work beyond 2038 + w.WritePropertyName("Id"); + var vv = Math.Truncate((DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds); + string sId = vv.ToString(); + if (sId.Contains(",")) + sId = sId.Split('.')[0]; + w.WriteValue(sId); + + w.WritePropertyName("Created"); + w.WriteValue(System.DateTime.Now); + + w.WritePropertyName("Sub"); + w.WriteValue("true"); + + w.WritePropertyName("RegisteredTo"); + w.WriteValue(ko.registeredTo);//unicode test string + + //case 3233 + w.WritePropertyName("EmailAddress"); + w.WriteValue(ko.emailAddress); + + w.WritePropertyName("FetchCode"); + + w.WriteValue(ko.fetchCode); + + //case 3187 - Source here + //rockfish + w.WritePropertyName("Source"); + w.WriteValue(rockfishCore.Util.HexString.ToHex(ko.authorizedUserKeyGeneratorStamp)); + + + w.WritePropertyName("InstallableUntil"); + w.WriteValue(ko.installByDate);//case 3542, respect the KO option + + w.WritePropertyName("TotalScheduleableUsers"); + w.WriteValue(ko.users.ToString());//Needs to be a string to match rockfish format + + w.WritePropertyName("Expires"); + w.WriteValue(DateUtil.EpochToDate(ko.supportExpiresDate)); + + if (ko.keyWillLockout) + { + w.WritePropertyName("LockDate"); + w.WriteValue(DateUtil.EpochToDate(ko.lockoutDate)); + + } + + w.WritePropertyName("RequestedTrial"); + bool bRequestedTrial = ko.licenseType == "webRequestedTrial"; + w.WriteValue(bRequestedTrial.ToString()); + + //PLUGINS + w.WritePropertyName("Plugins"); + w.WriteStartObject();//start of key object + w.WritePropertyName("Plugin"); + w.WriteStartArray(); + + if (ko.mbi) + AddLicensePlugin(w, PLUGIN_MBI_KEY, DateUtil.EpochToDate(ko.mbiSupportExpiresDate)); + + if (ko.wbi) + AddLicensePlugin(w, PLUGIN_WBI_KEY, DateUtil.EpochToDate(ko.wbiSupportExpiresDate)); + + if (ko.qbi) + AddLicensePlugin(w, PLUGIN_QBI_KEY, DateUtil.EpochToDate(ko.qbiSupportExpiresDate)); + + if (ko.qboi) + AddLicensePlugin(w, PLUGIN_QBOI_KEY, DateUtil.EpochToDate(ko.qboiSupportExpiresDate)); + + if (ko.pti) + AddLicensePlugin(w, PLUGIN_PTI_KEY, DateUtil.EpochToDate(ko.ptiSupportExpiresDate)); + + if (ko.quickNotification) + AddLicensePlugin(w, PLUGIN_QUICK_NOTIFICATION_KEY, DateUtil.EpochToDate(ko.quickNotificationSupportExpiresDate)); + + + if (ko.exportToXls) + AddLicensePlugin(w, PLUGIN_EXPORT_TO_XLS_KEY, DateUtil.EpochToDate(ko.exportToXlsSupportExpiresDate)); + + + if (ko.outlookSchedule) + AddLicensePlugin(w, PLUGIN_OUTLOOK_SCHEDULE_KEY, DateUtil.EpochToDate(ko.outlookScheduleSupportExpiresDate)); + + + if (ko.oli) + AddLicensePlugin(w, PLUGIN_OLI_KEY, DateUtil.EpochToDate(ko.oliSupportExpiresDate)); + + + if (ko.importExportCSVDuplicate) + AddLicensePlugin(w, PLUGIN_IMPORT_EXPORT_CSV_DUPLICATE_KEY, DateUtil.EpochToDate(ko.importExportCSVDuplicateSupportExpiresDate)); + + + if (ko.ri) + AddLicensePlugin(w, PLUGIN_RI_KEY, DateUtil.EpochToDate(ko.riSupportExpiresDate)); + + + //end of plugins array + w.WriteEnd(); + + //end of plugins object + w.WriteEndObject(); + + //end of AyaNova/AyaNovaLite key object + w.WriteEndObject(); + + //close outer 'wrapper' object brace } + w.WriteEndObject(); + + }//end of using statement + + + // ## CALCULATE SIGNATURE + + //GET JSON as a string with whitespace stripped outside of delimited strings + //http://stackoverflow.com/questions/8913138/minify-indented-json-string-in-net + string keyNoWS = System.Text.RegularExpressions.Regex.Replace(sbKey.ToString(), "(\"(?:[^\"\\\\]|\\\\.)*\")|\\s+", "$1"); + + + //**** Note this is our real 2016 private key + var privatePEM = @"-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEAz7wrvLDcKVMZ31HFGBnLWL08IodYIV5VJkKy1Z0n2snprhSi +u3izxTyz+SLpftvKHJpky027ii7l/pL9Bo3JcjU5rKrxXavnE7TuYPjXn16dNLd0 +K/ERSU+pXLmUaVN0nUWuGuUMoGJMEXoulS6pJiG11yu3BM9fL2Nbj0C6a+UwzEHF +mns3J/daZOb4gAzMUdJfh9OJ0+wRGzR8ZxyC99Na2gDmqYglUkSMjwLTL/HbgwF4 +OwmoQYJBcET0Wa6Gfb17SaF8XRBV5ZtpCsbStkthGeoXZkFriB9c1eFQLKpBYQo2 +DW3H1MPG2nAlQZLbkJj5cSh7/t1bRF08m6P+EQIDAQABAoIBAQCGvTpxLRXgB/Kk +EtmQBEsMx9EVZEwZeKIqKuDsBP8wvf4/10ql5mhT6kehtK9WhSDW5J2z8DtQKZMs +SBKuCZE77qH2CPp9E17SPWzQoRbaW/gDlWpYhgf8URs89XH5zxO4XtXKw/4omRlV +zLYiNR2pifv0EHqpOAg5KGzewdEo4VgXgtRWpHZLMpH2Q0/5ZIKMhstI6vFHP1p7 +jmU4YI6uxiu7rVrZDmIUsAGoTdMabNqK/N8hKaoBiIto0Jn1ck26g+emLg8m160y +Xciu5yFUU+PP1SJMUs+k1UnAWf4p46X9jRLQCBRue9o0Ntiq/75aljRoDvgdwDsR +mg4ZANqxAoGBAPBoM5KoMZ4sv8ZFv8V+V8hgL5xiLgGoiwQl91mRsHRM/NQU5A/w +tH8nmwUrJOrksV7kX9228smKmoliTptyGGyi1NPmSkA7cN9YYnENoOEBHCVNK9vh +P+bkbMYUDNMW4fgOj09oXtQtMl5E2B3OTGoNwZ2w13YQJ8RIniLPsX7nAoGBAN01 +eQNcUzQk9YrFGTznOs8udDLBfigDxaNnawvPueulJdBy6ZXDDrKmkQQA7xxl8YPr +dNtBq2lOgnb6+smC15TaAfV/fb8BLmkSwdn4Fy0FApIXIEOnLq+wjkte98nuezl8 +9KXDzaqNI9hPuk2i36tJuLLMH8hzldveWbWjSlRHAoGBAKRPE7CQtBjfjNL+qOta +RrT0yJWhpMANabYUHNJi+K8ET2jEPnuGkFa3wwPtUPYaCABLJhprB9Unnid3wTIM +8RSO1ddd9jGgbqy3w9Bw+BvQnmQAMpG9iedNB+r5mSpM4XSgvuIO+4EYwuwbMXpt +nVx+um4Eh75xnDxTRYGVYkLRAoGAaZVpUlpR+HSfooHbPv+bSWKB4ewLPCw4vHrT +VErtEfW8q9b9eRcmP81TMFcFykc6VN4g47pfh58KlKHM7DwAjDLWdohIy89TiKGE +V3acEUfv5y0UoFX+6ara8Ey+9upWdKUY3Lotw3ckoc3EPeQ84DQK7YSSswnAgLaL +mS/8fWcCgYBjRefVbEep161d2DGruk4X7eNI9TFJ278h6ydW5kK9aTJuxkrtKIp4 +CYf6emoB4mLXFPvAmnsalkhN2iB29hUZCXXSUjpKZrpijL54Wdu2S6ynm7aT97NF +oArP0E2Vbow3JMxq/oeXmHbrLMLQfYyXwFmciLFigOtkd45bfHdrbA== +-----END RSA PRIVATE KEY-----"; + + PemReader pr = new PemReader(new StringReader(privatePEM)); + AsymmetricCipherKeyPair keys = (AsymmetricCipherKeyPair)pr.ReadObject(); + var encoder = new UTF8Encoding(false, true); + var inputData = encoder.GetBytes(keyNoWS); + var signer = SignerUtilities.GetSigner("SHA256WITHRSA"); + signer.Init(true, keys.Private); + signer.BlockUpdate(inputData, 0, inputData.Length); + var sign = signer.GenerateSignature(); + var signature = Convert.ToBase64String(sign); + + + System.Text.StringBuilder sbOut = new StringBuilder(); + sbOut.AppendLine("[KEY"); + sbOut.AppendLine(sbKey.ToString()); + sbOut.AppendLine("KEY]"); + sbOut.AppendLine("[SIGNATURE"); + sbOut.AppendLine(signature); + sbOut.AppendLine("SIGNATURE]"); + + //case 3233 insert into db + License l = new License(); + l.DtCreated = DateUtil.NowAsEpoch(); + l.Code = ko.fetchCode; + l.CustomerId = ko.customerId; + l.Email = ko.emailAddress.ToLowerInvariant(); + l.Key = sbOut.ToString(); + l.RegTo = ko.registeredTo; + ct.License.Add(l); + ct.SaveChanges(); + + return sbOut.ToString(); + + + } + catch (Exception ex) + { + return (ex.Message); + } + } + + + + private static void AddLicensePlugin(Newtonsoft.Json.JsonWriter w, string pluginName, DateTime pluginExpires) + { + + //this dictionary is used by the additional message code to + //make the human readable portion of the license + _plugins.Add(pluginName, pluginExpires); + + //this is adding it to the actual key + w.WriteStartObject(); + w.WritePropertyName("Item"); + w.WriteValue(pluginName); + + w.WritePropertyName("SubscriptionExpires"); + w.WriteValue(pluginExpires); + + w.WriteEndObject(); + //---------------- + } + + + + //eoc + } + //eons +} \ No newline at end of file diff --git a/util/MimeTypeMap.cs b/util/MimeTypeMap.cs new file mode 100644 index 0000000..cf2b082 --- /dev/null +++ b/util/MimeTypeMap.cs @@ -0,0 +1,733 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace rockfishCore.Util +{ + //https://github.com/HelmGlobal/MimeTypeMap/blob/master/src/MimeTypes/MimeTypeMap.cs + public static class MimeTypeMap + { + private static readonly Lazy> _mappings = new Lazy>(BuildMappings); + + private static IDictionary BuildMappings() + { + var mappings = new Dictionary(StringComparer.CurrentCultureIgnoreCase) { + + #region Big freaking list of mime types + + // maps both ways, + // extension -> mime type + // and + // mime type -> extension + // + // any mime types on left side not pre-loaded on right side, are added automatically + // some mime types can map to multiple extensions, so to get a deterministic mapping, + // add those to the dictionary specifcially + // + // combination of values from Windows 7 Registry and + // from C:\Windows\System32\inetsrv\config\applicationHost.config + // some added, including .7z and .dat + // + // Some added based on http://www.iana.org/assignments/media-types/media-types.xhtml + // which lists mime types, but not extensions + // + {".323", "text/h323"}, + {".3g2", "video/3gpp2"}, + {".3gp", "video/3gpp"}, + {".3gp2", "video/3gpp2"}, + {".3gpp", "video/3gpp"}, + {".7z", "application/x-7z-compressed"}, + {".aa", "audio/audible"}, + {".AAC", "audio/aac"}, + {".aaf", "application/octet-stream"}, + {".aax", "audio/vnd.audible.aax"}, + {".ac3", "audio/ac3"}, + {".aca", "application/octet-stream"}, + {".accda", "application/msaccess.addin"}, + {".accdb", "application/msaccess"}, + {".accdc", "application/msaccess.cab"}, + {".accde", "application/msaccess"}, + {".accdr", "application/msaccess.runtime"}, + {".accdt", "application/msaccess"}, + {".accdw", "application/msaccess.webapplication"}, + {".accft", "application/msaccess.ftemplate"}, + {".acx", "application/internet-property-stream"}, + {".AddIn", "text/xml"}, + {".ade", "application/msaccess"}, + {".adobebridge", "application/x-bridge-url"}, + {".adp", "application/msaccess"}, + {".ADT", "audio/vnd.dlna.adts"}, + {".ADTS", "audio/aac"}, + {".afm", "application/octet-stream"}, + {".ai", "application/postscript"}, + {".aif", "audio/aiff"}, + {".aifc", "audio/aiff"}, + {".aiff", "audio/aiff"}, + {".air", "application/vnd.adobe.air-application-installer-package+zip"}, + {".amc", "application/mpeg"}, + {".anx", "application/annodex"}, + {".apk", "application/vnd.android.package-archive" }, + {".application", "application/x-ms-application"}, + {".art", "image/x-jg"}, + {".asa", "application/xml"}, + {".asax", "application/xml"}, + {".ascx", "application/xml"}, + {".asd", "application/octet-stream"}, + {".asf", "video/x-ms-asf"}, + {".ashx", "application/xml"}, + {".asi", "application/octet-stream"}, + {".asm", "text/plain"}, + {".asmx", "application/xml"}, + {".aspx", "application/xml"}, + {".asr", "video/x-ms-asf"}, + {".asx", "video/x-ms-asf"}, + {".atom", "application/atom+xml"}, + {".au", "audio/basic"}, + {".avi", "video/x-msvideo"}, + {".axa", "audio/annodex"}, + {".axs", "application/olescript"}, + {".axv", "video/annodex"}, + {".bas", "text/plain"}, + {".bcpio", "application/x-bcpio"}, + {".bin", "application/octet-stream"}, + {".bmp", "image/bmp"}, + {".c", "text/plain"}, + {".cab", "application/octet-stream"}, + {".caf", "audio/x-caf"}, + {".calx", "application/vnd.ms-office.calx"}, + {".cat", "application/vnd.ms-pki.seccat"}, + {".cc", "text/plain"}, + {".cd", "text/plain"}, + {".cdda", "audio/aiff"}, + {".cdf", "application/x-cdf"}, + {".cer", "application/x-x509-ca-cert"}, + {".cfg", "text/plain"}, + {".chm", "application/octet-stream"}, + {".class", "application/x-java-applet"}, + {".clp", "application/x-msclip"}, + {".cmd", "text/plain"}, + {".cmx", "image/x-cmx"}, + {".cnf", "text/plain"}, + {".cod", "image/cis-cod"}, + {".config", "application/xml"}, + {".contact", "text/x-ms-contact"}, + {".coverage", "application/xml"}, + {".cpio", "application/x-cpio"}, + {".cpp", "text/plain"}, + {".crd", "application/x-mscardfile"}, + {".crl", "application/pkix-crl"}, + {".crt", "application/x-x509-ca-cert"}, + {".cs", "text/plain"}, + {".csdproj", "text/plain"}, + {".csh", "application/x-csh"}, + {".csproj", "text/plain"}, + {".css", "text/css"}, + {".csv", "text/csv"}, + {".cur", "application/octet-stream"}, + {".cxx", "text/plain"}, + {".dat", "application/octet-stream"}, + {".datasource", "application/xml"}, + {".dbproj", "text/plain"}, + {".dcr", "application/x-director"}, + {".def", "text/plain"}, + {".deploy", "application/octet-stream"}, + {".der", "application/x-x509-ca-cert"}, + {".dgml", "application/xml"}, + {".dib", "image/bmp"}, + {".dif", "video/x-dv"}, + {".dir", "application/x-director"}, + {".disco", "text/xml"}, + {".divx", "video/divx"}, + {".dll", "application/x-msdownload"}, + {".dll.config", "text/xml"}, + {".dlm", "text/dlm"}, + {".doc", "application/msword"}, + {".docm", "application/vnd.ms-word.document.macroEnabled.12"}, + {".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"}, + {".dot", "application/msword"}, + {".dotm", "application/vnd.ms-word.template.macroEnabled.12"}, + {".dotx", "application/vnd.openxmlformats-officedocument.wordprocessingml.template"}, + {".dsp", "application/octet-stream"}, + {".dsw", "text/plain"}, + {".dtd", "text/xml"}, + {".dtsConfig", "text/xml"}, + {".dv", "video/x-dv"}, + {".dvi", "application/x-dvi"}, + {".dwf", "drawing/x-dwf"}, + {".dwp", "application/octet-stream"}, + {".dxr", "application/x-director"}, + {".eml", "message/rfc822"}, + {".emz", "application/octet-stream"}, + {".eot", "application/vnd.ms-fontobject"}, + {".eps", "application/postscript"}, + {".etl", "application/etl"}, + {".etx", "text/x-setext"}, + {".evy", "application/envoy"}, + {".exe", "application/octet-stream"}, + {".exe.config", "text/xml"}, + {".fdf", "application/vnd.fdf"}, + {".fif", "application/fractals"}, + {".filters", "application/xml"}, + {".fla", "application/octet-stream"}, + {".flac", "audio/flac"}, + {".flr", "x-world/x-vrml"}, + {".flv", "video/x-flv"}, + {".fsscript", "application/fsharp-script"}, + {".fsx", "application/fsharp-script"}, + {".generictest", "application/xml"}, + {".gif", "image/gif"}, + {".group", "text/x-ms-group"}, + {".gsm", "audio/x-gsm"}, + {".gtar", "application/x-gtar"}, + {".gz", "application/x-gzip"}, + {".h", "text/plain"}, + {".hdf", "application/x-hdf"}, + {".hdml", "text/x-hdml"}, + {".hhc", "application/x-oleobject"}, + {".hhk", "application/octet-stream"}, + {".hhp", "application/octet-stream"}, + {".hlp", "application/winhlp"}, + {".hpp", "text/plain"}, + {".hqx", "application/mac-binhex40"}, + {".hta", "application/hta"}, + {".htc", "text/x-component"}, + {".htm", "text/html"}, + {".html", "text/html"}, + {".htt", "text/webviewhtml"}, + {".hxa", "application/xml"}, + {".hxc", "application/xml"}, + {".hxd", "application/octet-stream"}, + {".hxe", "application/xml"}, + {".hxf", "application/xml"}, + {".hxh", "application/octet-stream"}, + {".hxi", "application/octet-stream"}, + {".hxk", "application/xml"}, + {".hxq", "application/octet-stream"}, + {".hxr", "application/octet-stream"}, + {".hxs", "application/octet-stream"}, + {".hxt", "text/html"}, + {".hxv", "application/xml"}, + {".hxw", "application/octet-stream"}, + {".hxx", "text/plain"}, + {".i", "text/plain"}, + {".ico", "image/x-icon"}, + {".ics", "application/octet-stream"}, + {".idl", "text/plain"}, + {".ief", "image/ief"}, + {".iii", "application/x-iphone"}, + {".inc", "text/plain"}, + {".inf", "application/octet-stream"}, + {".ini", "text/plain"}, + {".inl", "text/plain"}, + {".ins", "application/x-internet-signup"}, + {".ipa", "application/x-itunes-ipa"}, + {".ipg", "application/x-itunes-ipg"}, + {".ipproj", "text/plain"}, + {".ipsw", "application/x-itunes-ipsw"}, + {".iqy", "text/x-ms-iqy"}, + {".isp", "application/x-internet-signup"}, + {".ite", "application/x-itunes-ite"}, + {".itlp", "application/x-itunes-itlp"}, + {".itms", "application/x-itunes-itms"}, + {".itpc", "application/x-itunes-itpc"}, + {".IVF", "video/x-ivf"}, + {".jar", "application/java-archive"}, + {".java", "application/octet-stream"}, + {".jck", "application/liquidmotion"}, + {".jcz", "application/liquidmotion"}, + {".jfif", "image/pjpeg"}, + {".jnlp", "application/x-java-jnlp-file"}, + {".jpb", "application/octet-stream"}, + {".jpe", "image/jpeg"}, + {".jpeg", "image/jpeg"}, + {".jpg", "image/jpeg"}, + {".js", "application/javascript"}, + {".json", "application/json"}, + {".jsx", "text/jscript"}, + {".jsxbin", "text/plain"}, + {".latex", "application/x-latex"}, + {".library-ms", "application/windows-library+xml"}, + {".lit", "application/x-ms-reader"}, + {".loadtest", "application/xml"}, + {".lpk", "application/octet-stream"}, + {".lsf", "video/x-la-asf"}, + {".lst", "text/plain"}, + {".lsx", "video/x-la-asf"}, + {".lzh", "application/octet-stream"}, + {".m13", "application/x-msmediaview"}, + {".m14", "application/x-msmediaview"}, + {".m1v", "video/mpeg"}, + {".m2t", "video/vnd.dlna.mpeg-tts"}, + {".m2ts", "video/vnd.dlna.mpeg-tts"}, + {".m2v", "video/mpeg"}, + {".m3u", "audio/x-mpegurl"}, + {".m3u8", "audio/x-mpegurl"}, + {".m4a", "audio/m4a"}, + {".m4b", "audio/m4b"}, + {".m4p", "audio/m4p"}, + {".m4r", "audio/x-m4r"}, + {".m4v", "video/x-m4v"}, + {".mac", "image/x-macpaint"}, + {".mak", "text/plain"}, + {".man", "application/x-troff-man"}, + {".manifest", "application/x-ms-manifest"}, + {".map", "text/plain"}, + {".master", "application/xml"}, + {".mda", "application/msaccess"}, + {".mdb", "application/x-msaccess"}, + {".mde", "application/msaccess"}, + {".mdp", "application/octet-stream"}, + {".me", "application/x-troff-me"}, + {".mfp", "application/x-shockwave-flash"}, + {".mht", "message/rfc822"}, + {".mhtml", "message/rfc822"}, + {".mid", "audio/mid"}, + {".midi", "audio/mid"}, + {".mix", "application/octet-stream"}, + {".mk", "text/plain"}, + {".mmf", "application/x-smaf"}, + {".mno", "text/xml"}, + {".mny", "application/x-msmoney"}, + {".mod", "video/mpeg"}, + {".mov", "video/quicktime"}, + {".movie", "video/x-sgi-movie"}, + {".mp2", "video/mpeg"}, + {".mp2v", "video/mpeg"}, + {".mp3", "audio/mpeg"}, + {".mp4", "video/mp4"}, + {".mp4v", "video/mp4"}, + {".mpa", "video/mpeg"}, + {".mpe", "video/mpeg"}, + {".mpeg", "video/mpeg"}, + {".mpf", "application/vnd.ms-mediapackage"}, + {".mpg", "video/mpeg"}, + {".mpp", "application/vnd.ms-project"}, + {".mpv2", "video/mpeg"}, + {".mqv", "video/quicktime"}, + {".ms", "application/x-troff-ms"}, + {".msi", "application/octet-stream"}, + {".mso", "application/octet-stream"}, + {".mts", "video/vnd.dlna.mpeg-tts"}, + {".mtx", "application/xml"}, + {".mvb", "application/x-msmediaview"}, + {".mvc", "application/x-miva-compiled"}, + {".mxp", "application/x-mmxp"}, + {".nc", "application/x-netcdf"}, + {".nsc", "video/x-ms-asf"}, + {".nws", "message/rfc822"}, + {".ocx", "application/octet-stream"}, + {".oda", "application/oda"}, + {".odb", "application/vnd.oasis.opendocument.database"}, + {".odc", "application/vnd.oasis.opendocument.chart"}, + {".odf", "application/vnd.oasis.opendocument.formula"}, + {".odg", "application/vnd.oasis.opendocument.graphics"}, + {".odh", "text/plain"}, + {".odi", "application/vnd.oasis.opendocument.image"}, + {".odl", "text/plain"}, + {".odm", "application/vnd.oasis.opendocument.text-master"}, + {".odp", "application/vnd.oasis.opendocument.presentation"}, + {".ods", "application/vnd.oasis.opendocument.spreadsheet"}, + {".odt", "application/vnd.oasis.opendocument.text"}, + {".oga", "audio/ogg"}, + {".ogg", "audio/ogg"}, + {".ogv", "video/ogg"}, + {".ogx", "application/ogg"}, + {".one", "application/onenote"}, + {".onea", "application/onenote"}, + {".onepkg", "application/onenote"}, + {".onetmp", "application/onenote"}, + {".onetoc", "application/onenote"}, + {".onetoc2", "application/onenote"}, + {".opus", "audio/ogg"}, + {".orderedtest", "application/xml"}, + {".osdx", "application/opensearchdescription+xml"}, + {".otf", "application/font-sfnt"}, + {".otg", "application/vnd.oasis.opendocument.graphics-template"}, + {".oth", "application/vnd.oasis.opendocument.text-web"}, + {".otp", "application/vnd.oasis.opendocument.presentation-template"}, + {".ots", "application/vnd.oasis.opendocument.spreadsheet-template"}, + {".ott", "application/vnd.oasis.opendocument.text-template"}, + {".oxt", "application/vnd.openofficeorg.extension"}, + {".p10", "application/pkcs10"}, + {".p12", "application/x-pkcs12"}, + {".p7b", "application/x-pkcs7-certificates"}, + {".p7c", "application/pkcs7-mime"}, + {".p7m", "application/pkcs7-mime"}, + {".p7r", "application/x-pkcs7-certreqresp"}, + {".p7s", "application/pkcs7-signature"}, + {".pbm", "image/x-portable-bitmap"}, + {".pcast", "application/x-podcast"}, + {".pct", "image/pict"}, + {".pcx", "application/octet-stream"}, + {".pcz", "application/octet-stream"}, + {".pdf", "application/pdf"}, + {".pfb", "application/octet-stream"}, + {".pfm", "application/octet-stream"}, + {".pfx", "application/x-pkcs12"}, + {".pgm", "image/x-portable-graymap"}, + {".pic", "image/pict"}, + {".pict", "image/pict"}, + {".pkgdef", "text/plain"}, + {".pkgundef", "text/plain"}, + {".pko", "application/vnd.ms-pki.pko"}, + {".pls", "audio/scpls"}, + {".pma", "application/x-perfmon"}, + {".pmc", "application/x-perfmon"}, + {".pml", "application/x-perfmon"}, + {".pmr", "application/x-perfmon"}, + {".pmw", "application/x-perfmon"}, + {".png", "image/png"}, + {".pnm", "image/x-portable-anymap"}, + {".pnt", "image/x-macpaint"}, + {".pntg", "image/x-macpaint"}, + {".pnz", "image/png"}, + {".pot", "application/vnd.ms-powerpoint"}, + {".potm", "application/vnd.ms-powerpoint.template.macroEnabled.12"}, + {".potx", "application/vnd.openxmlformats-officedocument.presentationml.template"}, + {".ppa", "application/vnd.ms-powerpoint"}, + {".ppam", "application/vnd.ms-powerpoint.addin.macroEnabled.12"}, + {".ppm", "image/x-portable-pixmap"}, + {".pps", "application/vnd.ms-powerpoint"}, + {".ppsm", "application/vnd.ms-powerpoint.slideshow.macroEnabled.12"}, + {".ppsx", "application/vnd.openxmlformats-officedocument.presentationml.slideshow"}, + {".ppt", "application/vnd.ms-powerpoint"}, + {".pptm", "application/vnd.ms-powerpoint.presentation.macroEnabled.12"}, + {".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"}, + {".prf", "application/pics-rules"}, + {".prm", "application/octet-stream"}, + {".prx", "application/octet-stream"}, + {".ps", "application/postscript"}, + {".psc1", "application/PowerShell"}, + {".psd", "application/octet-stream"}, + {".psess", "application/xml"}, + {".psm", "application/octet-stream"}, + {".psp", "application/octet-stream"}, + {".pub", "application/x-mspublisher"}, + {".pwz", "application/vnd.ms-powerpoint"}, + {".qht", "text/x-html-insertion"}, + {".qhtm", "text/x-html-insertion"}, + {".qt", "video/quicktime"}, + {".qti", "image/x-quicktime"}, + {".qtif", "image/x-quicktime"}, + {".qtl", "application/x-quicktimeplayer"}, + {".qxd", "application/octet-stream"}, + {".ra", "audio/x-pn-realaudio"}, + {".ram", "audio/x-pn-realaudio"}, + {".rar", "application/x-rar-compressed"}, + {".ras", "image/x-cmu-raster"}, + {".rat", "application/rat-file"}, + {".rc", "text/plain"}, + {".rc2", "text/plain"}, + {".rct", "text/plain"}, + {".rdlc", "application/xml"}, + {".reg", "text/plain"}, + {".resx", "application/xml"}, + {".rf", "image/vnd.rn-realflash"}, + {".rgb", "image/x-rgb"}, + {".rgs", "text/plain"}, + {".rm", "application/vnd.rn-realmedia"}, + {".rmi", "audio/mid"}, + {".rmp", "application/vnd.rn-rn_music_package"}, + {".roff", "application/x-troff"}, + {".rpm", "audio/x-pn-realaudio-plugin"}, + {".rqy", "text/x-ms-rqy"}, + {".rtf", "application/rtf"}, + {".rtx", "text/richtext"}, + {".ruleset", "application/xml"}, + {".s", "text/plain"}, + {".safariextz", "application/x-safari-safariextz"}, + {".scd", "application/x-msschedule"}, + {".scr", "text/plain"}, + {".sct", "text/scriptlet"}, + {".sd2", "audio/x-sd2"}, + {".sdp", "application/sdp"}, + {".sea", "application/octet-stream"}, + {".searchConnector-ms", "application/windows-search-connector+xml"}, + {".setpay", "application/set-payment-initiation"}, + {".setreg", "application/set-registration-initiation"}, + {".settings", "application/xml"}, + {".sgimb", "application/x-sgimb"}, + {".sgml", "text/sgml"}, + {".sh", "application/x-sh"}, + {".shar", "application/x-shar"}, + {".shtml", "text/html"}, + {".sit", "application/x-stuffit"}, + {".sitemap", "application/xml"}, + {".skin", "application/xml"}, + {".sldm", "application/vnd.ms-powerpoint.slide.macroEnabled.12"}, + {".sldx", "application/vnd.openxmlformats-officedocument.presentationml.slide"}, + {".slk", "application/vnd.ms-excel"}, + {".sln", "text/plain"}, + {".slupkg-ms", "application/x-ms-license"}, + {".smd", "audio/x-smd"}, + {".smi", "application/octet-stream"}, + {".smx", "audio/x-smd"}, + {".smz", "audio/x-smd"}, + {".snd", "audio/basic"}, + {".snippet", "application/xml"}, + {".snp", "application/octet-stream"}, + {".sol", "text/plain"}, + {".sor", "text/plain"}, + {".spc", "application/x-pkcs7-certificates"}, + {".spl", "application/futuresplash"}, + {".spx", "audio/ogg"}, + {".src", "application/x-wais-source"}, + {".srf", "text/plain"}, + {".SSISDeploymentManifest", "text/xml"}, + {".ssm", "application/streamingmedia"}, + {".sst", "application/vnd.ms-pki.certstore"}, + {".stl", "application/vnd.ms-pki.stl"}, + {".sv4cpio", "application/x-sv4cpio"}, + {".sv4crc", "application/x-sv4crc"}, + {".svc", "application/xml"}, + {".svg", "image/svg+xml"}, + {".swf", "application/x-shockwave-flash"}, + {".t", "application/x-troff"}, + {".tar", "application/x-tar"}, + {".tcl", "application/x-tcl"}, + {".testrunconfig", "application/xml"}, + {".testsettings", "application/xml"}, + {".tex", "application/x-tex"}, + {".texi", "application/x-texinfo"}, + {".texinfo", "application/x-texinfo"}, + {".tgz", "application/x-compressed"}, + {".thmx", "application/vnd.ms-officetheme"}, + {".thn", "application/octet-stream"}, + {".tif", "image/tiff"}, + {".tiff", "image/tiff"}, + {".tlh", "text/plain"}, + {".tli", "text/plain"}, + {".toc", "application/octet-stream"}, + {".tr", "application/x-troff"}, + {".trm", "application/x-msterminal"}, + {".trx", "application/xml"}, + {".ts", "video/vnd.dlna.mpeg-tts"}, + {".tsv", "text/tab-separated-values"}, + {".ttf", "application/font-sfnt"}, + {".tts", "video/vnd.dlna.mpeg-tts"}, + {".txt", "text/plain"}, + {".u32", "application/octet-stream"}, + {".uls", "text/iuls"}, + {".user", "text/plain"}, + {".ustar", "application/x-ustar"}, + {".vb", "text/plain"}, + {".vbdproj", "text/plain"}, + {".vbk", "video/mpeg"}, + {".vbproj", "text/plain"}, + {".vbs", "text/vbscript"}, + {".vcf", "text/x-vcard"}, + {".vcproj", "application/xml"}, + {".vcs", "text/plain"}, + {".vcxproj", "application/xml"}, + {".vddproj", "text/plain"}, + {".vdp", "text/plain"}, + {".vdproj", "text/plain"}, + {".vdx", "application/vnd.ms-visio.viewer"}, + {".vml", "text/xml"}, + {".vscontent", "application/xml"}, + {".vsct", "text/xml"}, + {".vsd", "application/vnd.visio"}, + {".vsi", "application/ms-vsi"}, + {".vsix", "application/vsix"}, + {".vsixlangpack", "text/xml"}, + {".vsixmanifest", "text/xml"}, + {".vsmdi", "application/xml"}, + {".vspscc", "text/plain"}, + {".vss", "application/vnd.visio"}, + {".vsscc", "text/plain"}, + {".vssettings", "text/xml"}, + {".vssscc", "text/plain"}, + {".vst", "application/vnd.visio"}, + {".vstemplate", "text/xml"}, + {".vsto", "application/x-ms-vsto"}, + {".vsw", "application/vnd.visio"}, + {".vsx", "application/vnd.visio"}, + {".vtx", "application/vnd.visio"}, + {".wav", "audio/wav"}, + {".wave", "audio/wav"}, + {".wax", "audio/x-ms-wax"}, + {".wbk", "application/msword"}, + {".wbmp", "image/vnd.wap.wbmp"}, + {".wcm", "application/vnd.ms-works"}, + {".wdb", "application/vnd.ms-works"}, + {".wdp", "image/vnd.ms-photo"}, + {".webarchive", "application/x-safari-webarchive"}, + {".webm", "video/webm"}, + {".webp", "image/webp"}, /* https://en.wikipedia.org/wiki/WebP */ + {".webtest", "application/xml"}, + {".wiq", "application/xml"}, + {".wiz", "application/msword"}, + {".wks", "application/vnd.ms-works"}, + {".WLMP", "application/wlmoviemaker"}, + {".wlpginstall", "application/x-wlpg-detect"}, + {".wlpginstall3", "application/x-wlpg3-detect"}, + {".wm", "video/x-ms-wm"}, + {".wma", "audio/x-ms-wma"}, + {".wmd", "application/x-ms-wmd"}, + {".wmf", "application/x-msmetafile"}, + {".wml", "text/vnd.wap.wml"}, + {".wmlc", "application/vnd.wap.wmlc"}, + {".wmls", "text/vnd.wap.wmlscript"}, + {".wmlsc", "application/vnd.wap.wmlscriptc"}, + {".wmp", "video/x-ms-wmp"}, + {".wmv", "video/x-ms-wmv"}, + {".wmx", "video/x-ms-wmx"}, + {".wmz", "application/x-ms-wmz"}, + {".woff", "application/font-woff"}, + {".wpl", "application/vnd.ms-wpl"}, + {".wps", "application/vnd.ms-works"}, + {".wri", "application/x-mswrite"}, + {".wrl", "x-world/x-vrml"}, + {".wrz", "x-world/x-vrml"}, + {".wsc", "text/scriptlet"}, + {".wsdl", "text/xml"}, + {".wvx", "video/x-ms-wvx"}, + {".x", "application/directx"}, + {".xaf", "x-world/x-vrml"}, + {".xaml", "application/xaml+xml"}, + {".xap", "application/x-silverlight-app"}, + {".xbap", "application/x-ms-xbap"}, + {".xbm", "image/x-xbitmap"}, + {".xdr", "text/plain"}, + {".xht", "application/xhtml+xml"}, + {".xhtml", "application/xhtml+xml"}, + {".xla", "application/vnd.ms-excel"}, + {".xlam", "application/vnd.ms-excel.addin.macroEnabled.12"}, + {".xlc", "application/vnd.ms-excel"}, + {".xld", "application/vnd.ms-excel"}, + {".xlk", "application/vnd.ms-excel"}, + {".xll", "application/vnd.ms-excel"}, + {".xlm", "application/vnd.ms-excel"}, + {".xls", "application/vnd.ms-excel"}, + {".xlsb", "application/vnd.ms-excel.sheet.binary.macroEnabled.12"}, + {".xlsm", "application/vnd.ms-excel.sheet.macroEnabled.12"}, + {".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}, + {".xlt", "application/vnd.ms-excel"}, + {".xltm", "application/vnd.ms-excel.template.macroEnabled.12"}, + {".xltx", "application/vnd.openxmlformats-officedocument.spreadsheetml.template"}, + {".xlw", "application/vnd.ms-excel"}, + {".xml", "text/xml"}, + {".xmta", "application/xml"}, + {".xof", "x-world/x-vrml"}, + {".XOML", "text/plain"}, + {".xpm", "image/x-xpixmap"}, + {".xps", "application/vnd.ms-xpsdocument"}, + {".xrm-ms", "text/xml"}, + {".xsc", "application/xml"}, + {".xsd", "text/xml"}, + {".xsf", "text/xml"}, + {".xsl", "text/xml"}, + {".xslt", "text/xml"}, + {".xsn", "application/octet-stream"}, + {".xss", "application/xml"}, + {".xspf", "application/xspf+xml"}, + {".xtp", "application/octet-stream"}, + {".xwd", "image/x-xwindowdump"}, + {".z", "application/x-compress"}, + {".zip", "application/zip"}, + + {"application/fsharp-script", ".fsx"}, + {"application/msaccess", ".adp"}, + {"application/msword", ".doc"}, + {"application/octet-stream", ".bin"}, + {"application/onenote", ".one"}, + {"application/postscript", ".eps"}, + {"application/vnd.ms-excel", ".xls"}, + {"application/vnd.ms-powerpoint", ".ppt"}, + {"application/vnd.ms-works", ".wks"}, + {"application/vnd.visio", ".vsd"}, + {"application/x-director", ".dir"}, + {"application/x-shockwave-flash", ".swf"}, + {"application/x-x509-ca-cert", ".cer"}, + {"application/x-zip-compressed", ".zip"}, + {"application/xhtml+xml", ".xhtml"}, + {"application/xml", ".xml"}, // anomoly, .xml -> text/xml, but application/xml -> many thingss, but all are xml, so safest is .xml + {"audio/aac", ".AAC"}, + {"audio/aiff", ".aiff"}, + {"audio/basic", ".snd"}, + {"audio/mid", ".midi"}, + {"audio/wav", ".wav"}, + {"audio/x-m4a", ".m4a"}, + {"audio/x-mpegurl", ".m3u"}, + {"audio/x-pn-realaudio", ".ra"}, + {"audio/x-smd", ".smd"}, + {"image/bmp", ".bmp"}, + {"image/jpeg", ".jpg"}, + {"image/pict", ".pic"}, + {"image/png", ".png"}, + {"image/tiff", ".tiff"}, + {"image/x-macpaint", ".mac"}, + {"image/x-quicktime", ".qti"}, + {"message/rfc822", ".eml"}, + {"text/html", ".html"}, + {"text/plain", ".txt"}, + {"text/scriptlet", ".wsc"}, + {"text/xml", ".xml"}, + {"video/3gpp", ".3gp"}, + {"video/3gpp2", ".3gp2"}, + {"video/mp4", ".mp4"}, + {"video/mpeg", ".mpg"}, + {"video/quicktime", ".mov"}, + {"video/vnd.dlna.mpeg-tts", ".m2t"}, + {"video/x-dv", ".dv"}, + {"video/x-la-asf", ".lsf"}, + {"video/x-ms-asf", ".asf"}, + {"x-world/x-vrml", ".xof"}, + + #endregion + + }; + + var cache = mappings.ToList(); // need ToList() to avoid modifying while still enumerating + + foreach (var mapping in cache) + { + if (!mappings.ContainsKey(mapping.Value)) + { + mappings.Add(mapping.Value, mapping.Key); + } + } + + return mappings; + } + + public static string GetMimeType(string extension) + { + if (extension == null) + { + throw new ArgumentNullException("extension"); + } + + if (!extension.StartsWith(".")) + { + extension = "." + extension; + } + + string mime; + + return _mappings.Value.TryGetValue(extension, out mime) ? mime : "application/octet-stream"; + } + + public static string GetExtension(string mimeType) + { + if (mimeType == null) + { + throw new ArgumentNullException("mimeType"); + } + + if (mimeType.StartsWith(".")) + { + throw new ArgumentException("Requested mime type is not valid: " + mimeType); + } + + string extension; + + if (_mappings.Value.TryGetValue(mimeType, out extension)) + { + return extension; + } + + throw new ArgumentException("Requested mime type is not registered: " + mimeType); + } + } +} diff --git a/util/RavenKeyFactory.cs b/util/RavenKeyFactory.cs new file mode 100644 index 0000000..421e4e1 --- /dev/null +++ b/util/RavenKeyFactory.cs @@ -0,0 +1,425 @@ +using System; +using System.Text; +using System.Collections.Generic; +using System.IO; +using Org.BouncyCastle.Security; +using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.OpenSsl; +using rockfishCore.Models; +using rockfishCore.Util; + + + +namespace rockfishCore.Util +{ + //Key generator controller + public static class RavenKeyFactory + { + //Scheduleable users + private const string SERVICE_TECHS_FEATURE_NAME = "ServiceTechs"; + + //Accounting add-on + private const string ACCOUNTING_FEATURE_NAME = "Accounting"; + + //This feature name means it's a trial key + private const string TRIAL_FEATURE_NAME = "TrialMode"; + + //This feature name means it's a SAAS or rental mode key for month to month hosted service + private const string RENTAL_FEATURE_NAME = "ServiceMode"; + + #region license classes + + //DTO object returned on license query + internal class LicenseFeature + { + //name of feature / product + public string Feature { get; set; } + + //Optional count for items that require it + public long Count { get; set; } + + } + + //DTO object for parsed key + internal class AyaNovaLicenseKey + { + public AyaNovaLicenseKey() + { + Features = new List(); + RegisteredTo = "UNLICENSED"; + Id = RegisteredTo; + } + + public bool IsEmpty + { + get + { + //Key is empty if it's not registered to anyone or there are no features in it + return string.IsNullOrWhiteSpace(RegisteredTo) || (Features == null || Features.Count == 0); + } + } + + /// + /// Fetch the license status of the feature in question + /// + /// + /// LicenseFeature object or null if there is no license + public LicenseFeature GetLicenseFeature(string Feature) + { + if (IsEmpty) + return null; + + string lFeature = Feature.ToLowerInvariant(); + + foreach (LicenseFeature l in Features) + { + if (l.Feature.ToLowerInvariant() == lFeature) + { + return l; + } + } + return null; + } + + + /// + /// Check for the existance of license feature + /// + /// + /// bool + public bool HasLicenseFeature(string Feature) + { + if (IsEmpty) + return false; + + string lFeature = Feature.ToLowerInvariant(); + + foreach (LicenseFeature l in Features) + { + if (l.Feature.ToLowerInvariant() == lFeature) + { + return true; + } + } + return false; + } + + + public bool WillExpire + { + get + { + return LicenseExpiration < DateUtil.EmptyDateValue; + } + } + + + public bool LicenseExpired + { + get + { + return LicenseExpiration > DateTime.Now; + } + } + + public bool MaintenanceExpired + { + get + { + return MaintenanceExpiration > DateTime.Now; + } + } + + + public bool TrialLicense + { + get + { + return HasLicenseFeature(TRIAL_FEATURE_NAME); + } + } + + public bool RentalLicense + { + get + { + return HasLicenseFeature(RENTAL_FEATURE_NAME); + } + } + + public string LicenseFormat { get; set; } + public string Id { get; set; } + public string RegisteredTo { get; set; } + public Guid DbId { get; set; } + public DateTime LicenseExpiration { get; set; } + public DateTime MaintenanceExpiration { get; set; } + public List Features { get; set; } + + + } + #endregion + + #region sample v8 key + // private static string SAMPLE_KEY = @"[KEY + // { + // ""Key"": { + // ""LicenseFormat"": ""2018"", + // ""Id"": ""34-1516288681"", <----Customer id followed by key serial id + // ""RegisteredTo"": ""Super TestCo"", + // ""DBID"": ""df558559-7f8a-4c7b-955c-959ebcdf71f3"", + // ""LicenseExpiration"": ""2019-01-18T07:18:01.2329138-08:00"", <--- UTC,special 1/1/5555 DateTime if perpetual license, applies to all features 1/1/5555 indicates not expiring + // ""MaintenanceExpiration"": ""2019-01-18T07:18:01.2329138-08:00"", <-- UTC, DateTime support and updates subscription runs out, applies to all features + // ""Features"": { <-- deprecate, collection doesn't need to be inside a property? + // ""Feature"": [ + // { + // ""Name"": ""ServiceTechs"", + // ""Count"":""10"", + // }, + // { + // ""Name"": ""Accounting"" + // }, + // { + // ""Name"": ""TrialMode""<---means is a trial key + // }, + // { + // ""Name"": ""ServiceMode"" <----Means it's an SAAS/Rental key + // } + + // ] + // } + // } + // } + // KEY] + // [SIGNATURE + // HEcY3JCVwK9HFXEFnldUEPXP4Q7xoZfMZfOfx1cYmfVF3MVWePyZ9dqVZcY7pk3RmR1BbhQdhpljsYLl+ZLTRhNa54M0EFa/bQnBnbwYZ70EQl8fz8WOczYTEBo7Sm5EyC6gSHtYZu7yRwBvhQzpeMGth5uWnlfPb0dMm0DQM7PaqhdWWW9GCSOdZmFcxkFQ8ERLDZhVMbd8PJKyLvZ+sGMrmYTAIoL0tqa7nrxYkM71uJRTAmQ0gEl4bJdxiV825U1J+buNQuTZdacZKEPSjQQkYou10jRbReUmP2vDpvu+nA1xdJe4b5LlyQL+jiIXH17lf93xlCUb0UkDpu8iNQ== + // SIGNATURE]\"; + + #endregion + + #region RAVEN test code for development + + //Trial key magic number for development and testing, all other guids will be fully licensed + private static Guid TEST_TRIAL_KEY_DBID = new Guid("{A6D18A8A-5613-4979-99DA-80D07641A2FE}"); + + + + public static string GetRavenTestKey(Guid dbid) + { + + //Build a sample test key, sign it and return it + AyaNovaLicenseKey k = new AyaNovaLicenseKey(); + k.LicenseFormat = "2018"; + + var vv = Math.Truncate((DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds); + string sId = vv.ToString(); + if (sId.Contains(",")) + sId = sId.Split('.')[0]; + k.Id = $"00-{sId}"; + k.RegisteredTo = "Test Testerson Inc."; + k.DbId = dbid; + + //add accounting and user features either way + k.Features.Add(new LicenseFeature() { Feature = ACCOUNTING_FEATURE_NAME, Count = 0 }); + k.Features.Add(new LicenseFeature() { Feature = SERVICE_TECHS_FEATURE_NAME, Count = 100 }); + + + //fake trial key or fake licensed key + if (dbid == TEST_TRIAL_KEY_DBID) + { + k.MaintenanceExpiration = k.LicenseExpiration = DateTime.UtcNow.AddMonths(1); + k.Features.Add(new LicenseFeature() { Feature = TRIAL_FEATURE_NAME, Count = 0 }); + } + else + { + k.MaintenanceExpiration = DateTime.UtcNow.AddYears(1); + k.LicenseExpiration = DateUtil.EmptyDateValue;//1/1/5555 as per spec + } + + return genKey(k); + } + + #endregion + + + /// + /// New RAVEN key generator, so far just for testing purposes + /// + /// + private static string genKey(AyaNovaLicenseKey k) + { + + + if (string.IsNullOrWhiteSpace(k.RegisteredTo)) + throw new ArgumentException("RegisteredTo is required", "RegisteredTo"); + + + try + { + + StringBuilder sbKey = new StringBuilder(); + StringWriter sw = new StringWriter(sbKey); + + using (Newtonsoft.Json.JsonWriter w = new Newtonsoft.Json.JsonTextWriter(sw)) + { + w.Formatting = Newtonsoft.Json.Formatting.Indented; + + //outer object start + w.WriteStartObject(); + + w.WritePropertyName("Key"); + + w.WriteStartObject();//start of key object + + w.WritePropertyName("LicenseFormat"); + w.WriteValue(k.LicenseFormat); + + w.WritePropertyName("Id"); + w.WriteValue(k.Id); + + w.WritePropertyName("RegisteredTo"); + w.WriteValue(k.RegisteredTo); + + w.WritePropertyName("DBID"); + w.WriteValue(k.DbId); + + w.WritePropertyName("LicenseExpiration"); + w.WriteValue(k.LicenseExpiration); + + w.WritePropertyName("MaintenanceExpiration"); + w.WriteValue(k.MaintenanceExpiration); + + + + //FEATURES + // w.WritePropertyName("Features"); + // w.WriteStartObject(); + w.WritePropertyName("Features"); + w.WriteStartArray(); + + foreach (LicenseFeature lf in k.Features) + { + + w.WriteStartObject(); + + w.WritePropertyName("Name"); + w.WriteValue(lf.Feature); + + if (lf.Count > 0) + { + w.WritePropertyName("Count"); + w.WriteValue(lf.Count); + } + + w.WriteEndObject(); + + } + + + //end of features array + w.WriteEnd(); + + //end of features object + // w.WriteEndObject(); + + //end of AyaNova/AyaNovaLite key object + w.WriteEndObject(); + + //close outer 'wrapper' object brace } + w.WriteEndObject(); + + }//end of using statement + + + // ## CALCULATE SIGNATURE + + //GET JSON as a string with whitespace stripped outside of delimited strings + //http://stackoverflow.com/questions/8913138/minify-indented-json-string-in-net + string keyNoWS = System.Text.RegularExpressions.Regex.Replace(sbKey.ToString(), "(\"(?:[^\"\\\\]|\\\\.)*\")|\\s+", "$1"); + + + //**** Note this is our real 2016 private key + var privatePEM = @"-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEAz7wrvLDcKVMZ31HFGBnLWL08IodYIV5VJkKy1Z0n2snprhSi +u3izxTyz+SLpftvKHJpky027ii7l/pL9Bo3JcjU5rKrxXavnE7TuYPjXn16dNLd0 +K/ERSU+pXLmUaVN0nUWuGuUMoGJMEXoulS6pJiG11yu3BM9fL2Nbj0C6a+UwzEHF +mns3J/daZOb4gAzMUdJfh9OJ0+wRGzR8ZxyC99Na2gDmqYglUkSMjwLTL/HbgwF4 +OwmoQYJBcET0Wa6Gfb17SaF8XRBV5ZtpCsbStkthGeoXZkFriB9c1eFQLKpBYQo2 +DW3H1MPG2nAlQZLbkJj5cSh7/t1bRF08m6P+EQIDAQABAoIBAQCGvTpxLRXgB/Kk +EtmQBEsMx9EVZEwZeKIqKuDsBP8wvf4/10ql5mhT6kehtK9WhSDW5J2z8DtQKZMs +SBKuCZE77qH2CPp9E17SPWzQoRbaW/gDlWpYhgf8URs89XH5zxO4XtXKw/4omRlV +zLYiNR2pifv0EHqpOAg5KGzewdEo4VgXgtRWpHZLMpH2Q0/5ZIKMhstI6vFHP1p7 +jmU4YI6uxiu7rVrZDmIUsAGoTdMabNqK/N8hKaoBiIto0Jn1ck26g+emLg8m160y +Xciu5yFUU+PP1SJMUs+k1UnAWf4p46X9jRLQCBRue9o0Ntiq/75aljRoDvgdwDsR +mg4ZANqxAoGBAPBoM5KoMZ4sv8ZFv8V+V8hgL5xiLgGoiwQl91mRsHRM/NQU5A/w +tH8nmwUrJOrksV7kX9228smKmoliTptyGGyi1NPmSkA7cN9YYnENoOEBHCVNK9vh +P+bkbMYUDNMW4fgOj09oXtQtMl5E2B3OTGoNwZ2w13YQJ8RIniLPsX7nAoGBAN01 +eQNcUzQk9YrFGTznOs8udDLBfigDxaNnawvPueulJdBy6ZXDDrKmkQQA7xxl8YPr +dNtBq2lOgnb6+smC15TaAfV/fb8BLmkSwdn4Fy0FApIXIEOnLq+wjkte98nuezl8 +9KXDzaqNI9hPuk2i36tJuLLMH8hzldveWbWjSlRHAoGBAKRPE7CQtBjfjNL+qOta +RrT0yJWhpMANabYUHNJi+K8ET2jEPnuGkFa3wwPtUPYaCABLJhprB9Unnid3wTIM +8RSO1ddd9jGgbqy3w9Bw+BvQnmQAMpG9iedNB+r5mSpM4XSgvuIO+4EYwuwbMXpt +nVx+um4Eh75xnDxTRYGVYkLRAoGAaZVpUlpR+HSfooHbPv+bSWKB4ewLPCw4vHrT +VErtEfW8q9b9eRcmP81TMFcFykc6VN4g47pfh58KlKHM7DwAjDLWdohIy89TiKGE +V3acEUfv5y0UoFX+6ara8Ey+9upWdKUY3Lotw3ckoc3EPeQ84DQK7YSSswnAgLaL +mS/8fWcCgYBjRefVbEep161d2DGruk4X7eNI9TFJ278h6ydW5kK9aTJuxkrtKIp4 +CYf6emoB4mLXFPvAmnsalkhN2iB29hUZCXXSUjpKZrpijL54Wdu2S6ynm7aT97NF +oArP0E2Vbow3JMxq/oeXmHbrLMLQfYyXwFmciLFigOtkd45bfHdrbA== +-----END RSA PRIVATE KEY-----"; + + PemReader pr = new PemReader(new StringReader(privatePEM)); + AsymmetricCipherKeyPair keys = (AsymmetricCipherKeyPair)pr.ReadObject(); + var encoder = new UTF8Encoding(false, true); + var inputData = encoder.GetBytes(keyNoWS); + var signer = SignerUtilities.GetSigner("SHA256WITHRSA"); + signer.Init(true, keys.Private); + signer.BlockUpdate(inputData, 0, inputData.Length); + var sign = signer.GenerateSignature(); + var signature = Convert.ToBase64String(sign); + + + System.Text.StringBuilder sbOut = new StringBuilder(); + sbOut.AppendLine("[KEY"); + sbOut.AppendLine(sbKey.ToString()); + sbOut.AppendLine("KEY]"); + sbOut.AppendLine("[SIGNATURE"); + sbOut.AppendLine(signature); + sbOut.AppendLine("SIGNATURE]"); + + + return sbOut.ToString(); + + + } + catch (Exception ex) + { + return (ex.Message); + } + } + + + + // private static void AddLicensePlugin(Newtonsoft.Json.JsonWriter w, string pluginName, DateTime pluginExpires) + // { + + // //this dictionary is used by the additional message code to + // //make the human readable portion of the license + // _plugins.Add(pluginName, pluginExpires); + + // //this is adding it to the actual key + // w.WriteStartObject(); + // w.WritePropertyName("Item"); + // w.WriteValue(pluginName); + + // w.WritePropertyName("SubscriptionExpires"); + // w.WriteValue(pluginExpires); + + // w.WriteEndObject(); + // //---------------- + // } + + + + //eoc + } + //eons +} \ No newline at end of file diff --git a/util/RfMail.cs b/util/RfMail.cs new file mode 100644 index 0000000..d706c8e --- /dev/null +++ b/util/RfMail.cs @@ -0,0 +1,563 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Linq; +using System.IO; + +using MailKit.Net.Smtp; +using MailKit.Net.Imap; +using MailKit.Search; +using MailKit; +using MimeKit; + +namespace rockfishCore.Util +{ + //http://www.mimekit.net/ + public static class RfMail + { + + public const string MAIL_SMPT_ADDRESS = "smtp.ayanova.com"; + public const int MAIL_SMPT_PORT = 465; + public const string MAIL_IMAP_ADDRESS = "mail.ayanova.com"; + public const int MAIL_IMAP_PORT = 993; + + public const string MAIL_ACCOUNT_SUPPORT = "support@ayanova.com"; + public const string MAIL_ACCOUNT_PASSWORD_SUPPORT = "e527b6c5a00c27bb61ca694b3de0ee178cbe3f1541a772774762ed48e9caf5ce"; + + public const string MAIL_ACCOUNT_SALES = "sales@ayanova.com"; + public const string MAIL_ACCOUNT_PASSWORD_SALES = "6edbae5eb616a975abf86bcd9f45616f5c70c4f05189af60a1caaa62b406149d"; + + public enum rfMailAccount + { + support = 1, + sales = 2 + } + + + public class rfMailMessage + { + public MimeMessage message; + public uint uid; + } + + + class DeliverStatusSmtpClient : SmtpClient + { + protected override DeliveryStatusNotification? GetDeliveryStatusNotifications(MimeMessage message, MailboxAddress mailbox) + { + return DeliveryStatusNotification.Delay | + DeliveryStatusNotification.Failure | + DeliveryStatusNotification.Success; + + } + } + + + ///////////////////////////////////////////////////////// + // + // Do the sending with optional deliver status receipt + // + public static void DoSend(MimeMessage message, string MailAccount, string MailAccountPassword, bool trackDeliveryStatus) + { + + if (trackDeliveryStatus) + { + //set the return receipt and disposition to headers + message.Headers.Add("Return-Receipt-To", "<" + MailAccount + ">"); + message.Headers.Add("Disposition-Notification-To", "<" + MailAccount + ">"); + using (var client = new DeliverStatusSmtpClient()) + { + //Accept all SSL certificates (in case the server supports STARTTLS) + //(we have a funky cert on the mail server) + client.ServerCertificateValidationCallback = (s, c, h, e) => true; + client.Connect(MAIL_SMPT_ADDRESS, MAIL_SMPT_PORT, true); + + // Note: since we don't have an OAuth2 token, disable + // the XOAUTH2 authentication mechanism. + client.AuthenticationMechanisms.Remove("XOAUTH2"); + + // Note: only needed if the SMTP server requires authentication + client.Authenticate(MAIL_ACCOUNT_SUPPORT, MAIL_ACCOUNT_PASSWORD_SUPPORT); + + client.Send(message); + client.Disconnect(true); + } + } + else + { + using (var client = new SmtpClient()) + { + //Accept all SSL certificates (in case the server supports STARTTLS) + //(we have a funky cert on the mail server) + client.ServerCertificateValidationCallback = (s, c, h, e) => true; + client.Connect(MAIL_SMPT_ADDRESS, MAIL_SMPT_PORT, true); + + // Note: since we don't have an OAuth2 token, disable + // the XOAUTH2 authentication mechanism. + client.AuthenticationMechanisms.Remove("XOAUTH2"); + + // Note: only needed if the SMTP server requires authentication + client.Authenticate(MAIL_ACCOUNT_SUPPORT, MAIL_ACCOUNT_PASSWORD_SUPPORT); + + client.Send(message); + client.Disconnect(true); + } + } + } + + + public static void SendMessage(string MessageFrom, string MessageTo, string MessageSubject, string MessageBody, + bool trackDeliveryStatus = false, string CustomHeader = "", string CustomHeaderValue = "") + { + var message = new MimeMessage(); + message.From.Add(new MailboxAddress(MessageFrom)); + message.To.Add(new MailboxAddress(MessageTo)); + message.Subject = MessageSubject; + + message.Body = new TextPart("plain") + { + Text = MessageBody + }; + + message.Headers["X-Mailer"] = RfVersion.Full; + + if (CustomHeader != "" && CustomHeaderValue != "") + { + message.Headers["X-Rockfish-" + CustomHeader] = CustomHeaderValue; + } + + //send with optional tracking + DoSend(message, MAIL_ACCOUNT_SUPPORT, MAIL_ACCOUNT_PASSWORD_SUPPORT, trackDeliveryStatus); + + // using (var client = new SmtpClient()) + // { + // //Accept all SSL certificates (in case the server supports STARTTLS) + // //(we have a funky cert on the mail server) + // client.ServerCertificateValidationCallback = (s, c, h, e) => true; + // client.Connect(MAIL_SMPT_ADDRESS, MAIL_SMPT_PORT, true); + + // // Note: since we don't have an OAuth2 token, disable + // // the XOAUTH2 authentication mechanism. + // client.AuthenticationMechanisms.Remove("XOAUTH2"); + + // // Note: only needed if the SMTP server requires authentication + // client.Authenticate(MAIL_ACCOUNT_SUPPORT, MAIL_ACCOUNT_PASSWORD_SUPPORT); + + // client.Send(message); + // client.Disconnect(true); + // } + }//send message + + + public static void ReplyMessage(uint replyToMessageId, rfMailAccount replyFromAccount, string replyBody, + bool replyToAll, bool trackDeliveryStatus = false, string CustomHeader = "", string CustomHeaderValue = "") + { + //get the original to reply to it: + MimeMessage message = GetMessage(replyToMessageId, replyFromAccount); + if (message == null) + { + throw new System.ArgumentException("RfMail:ReplyMessage->source message not found (id=" + replyToMessageId.ToString() + ")"); + } + //construct the new message + + var reply = new MimeMessage(); + MailboxAddress from = null; + string from_account = ""; + string from_account_password = ""; + switch (replyFromAccount) + { + case rfMailAccount.sales: + from_account = MAIL_ACCOUNT_SALES; + from_account_password = MAIL_ACCOUNT_PASSWORD_SALES; + from = new MailboxAddress(from_account); + break; + default: + from_account = MAIL_ACCOUNT_SUPPORT; + from_account_password = MAIL_ACCOUNT_PASSWORD_SUPPORT; + from = new MailboxAddress(from_account); + break; + } + reply.From.Add(from); + + // reply to the sender of the message + if (message.ReplyTo.Count > 0) + { + reply.To.AddRange(message.ReplyTo); + } + else if (message.From.Count > 0) + { + reply.To.AddRange(message.From); + } + else if (message.Sender != null) + { + reply.To.Add(message.Sender); + } + + if (replyToAll) + { + // include all of the other original recipients (removing ourselves from the list) + reply.To.AddRange(message.To.Mailboxes.Where(x => x.Address != from.Address)); + reply.Cc.AddRange(message.Cc.Mailboxes.Where(x => x.Address != from.Address)); + } + + + // set the reply subject + if (!message.Subject.StartsWith("Re:", StringComparison.OrdinalIgnoreCase)) + reply.Subject = "Re: " + message.Subject; + else + reply.Subject = message.Subject; + + // construct the In-Reply-To and References headers + if (!string.IsNullOrEmpty(message.MessageId)) + { + reply.InReplyTo = message.MessageId; + foreach (var id in message.References) + reply.References.Add(id); + reply.References.Add(message.MessageId); + } + + // quote the original message text + using (var quoted = new StringWriter()) + { + var sender = message.Sender ?? message.From.Mailboxes.FirstOrDefault(); + var name = sender != null ? (!string.IsNullOrEmpty(sender.Name) ? sender.Name : sender.Address) : "someone"; + + quoted.WriteLine("On {0}, {1} wrote:", message.Date.ToString("f"), name); + using (var reader = new StringReader(message.TextBody)) + { + string line; + + while ((line = reader.ReadLine()) != null) + { + quoted.Write("> "); + quoted.WriteLine(line); + } + } + + reply.Body = new TextPart("plain") + { + Text = replyBody + "\r\n\r\n\r\n" + quoted.ToString() + }; + } + + reply.Headers["X-Mailer"] = RfVersion.Full; + + if (CustomHeader != "" && CustomHeaderValue != "") + { + reply.Headers["X-Rockfish-" + CustomHeader] = CustomHeaderValue; + } + + + //send with optional tracking + DoSend(reply, from_account, from_account_password, trackDeliveryStatus); + + // using (var client = new SmtpClient()) + // { + // //Accept all SSL certificates (in case the server supports STARTTLS) + // //(we have a funky cert on the mail server) + // client.ServerCertificateValidationCallback = (s, c, h, e) => true; + // client.Connect(MAIL_SMPT_ADDRESS, MAIL_SMPT_PORT, true); + + // // Note: since we don't have an OAuth2 token, disable + // // the XOAUTH2 authentication mechanism. + // client.AuthenticationMechanisms.Remove("XOAUTH2"); + + // // Note: only needed if the SMTP server requires authentication + // client.Authenticate(from_account, from_account_password); + + // client.Send(reply); + // client.Disconnect(true); + // } + + //flag the message as having been replied to + FlagInboxMessageSeenReplied(replyToMessageId, replyFromAccount); + + }//send message + + + //Fetch message by UID + public static MimeMessage GetMessage(uint uid, rfMailAccount fromAccount = rfMailAccount.support) + { + using (var client = new ImapClient()) + { + // Accept all SSL certificates + client.ServerCertificateValidationCallback = (s, c, h, e) => true; + client.Connect(MAIL_IMAP_ADDRESS, MAIL_IMAP_PORT, true); + // Note: since we don't have an OAuth2 token, disable + // the XOAUTH2 authentication mechanism. + client.AuthenticationMechanisms.Remove("XOAUTH2"); + if (fromAccount == rfMailAccount.support) + { + client.Authenticate(MAIL_ACCOUNT_SUPPORT, MAIL_ACCOUNT_PASSWORD_SUPPORT); + } + else + { + client.Authenticate(MAIL_ACCOUNT_SALES, MAIL_ACCOUNT_PASSWORD_SALES); + } + + var inbox = client.Inbox; + inbox.Open(FolderAccess.ReadOnly); + var m = inbox.GetMessage(new UniqueId(uid)); + client.Disconnect(true); + return m; + } + }//get message + + + + //Fetch messages by Search query + public static List GetMessages(SearchQuery query) + { + List ret = new List(); + using (var client = new ImapClient()) + { + // Accept all SSL certificates + client.ServerCertificateValidationCallback = (s, c, h, e) => true; + client.Connect(MAIL_IMAP_ADDRESS, MAIL_IMAP_PORT, true); + // Note: since we don't have an OAuth2 token, disable + // the XOAUTH2 authentication mechanism. + client.AuthenticationMechanisms.Remove("XOAUTH2"); + client.Authenticate(MAIL_ACCOUNT_SUPPORT, MAIL_ACCOUNT_PASSWORD_SUPPORT); + + var inbox = client.Inbox; + inbox.Open(FolderAccess.ReadOnly); + foreach (var uid in inbox.Search(query)) + { + ret.Add(new rfMailMessage { message = inbox.GetMessage(uid), uid = uid.Id }); + } + client.Disconnect(true); + } + return ret; + }//get message + + + //Flag message as seen and replied by UID + public static bool FlagInboxMessageSeenReplied(uint uid, rfMailAccount inAccount = rfMailAccount.support) + { + using (var client = new ImapClient()) + { + // Accept all SSL certificates + client.ServerCertificateValidationCallback = (s, c, h, e) => true; + client.Connect(MAIL_IMAP_ADDRESS, MAIL_IMAP_PORT, true); + // Note: since we don't have an OAuth2 token, disable + // the XOAUTH2 authentication mechanism. + client.AuthenticationMechanisms.Remove("XOAUTH2"); + + if (inAccount == rfMailAccount.support) + { + client.Authenticate(MAIL_ACCOUNT_SUPPORT, MAIL_ACCOUNT_PASSWORD_SUPPORT); + } + else + { + client.Authenticate(MAIL_ACCOUNT_SALES, MAIL_ACCOUNT_PASSWORD_SALES); + } + + var inbox = client.Inbox; + inbox.Open(FolderAccess.ReadWrite); + inbox.AddFlags(new UniqueId(uid), MessageFlags.Seen, true); + inbox.AddFlags(new UniqueId(uid), MessageFlags.Answered, true); + client.Disconnect(true); + return true; + } + }//get message + + + //////////////////////////////////////////////////// + //Put a message in the drafts folder of support + // + public static void DraftMessage(string MessageFrom, string MessageTo, string MessageSubject, string MessageBody, + string CustomHeader = "", string CustomHeaderValue = "") + { + var message = new MimeMessage(); + message.From.Add(new MailboxAddress(MessageFrom)); + + + //case 3512 handle more than one email in the address + if (MessageTo.Contains(",")) + { + List mbAll = new List(); + var addrs = MessageTo.Split(','); + foreach (string addr in addrs) + { + mbAll.Add(new MailboxAddress(addr.Trim())); + } + message.To.AddRange(mbAll); + } + else + { + message.To.Add(new MailboxAddress(MessageTo)); + } + + + message.Subject = MessageSubject; + + message.Body = new TextPart("plain") + { + Text = MessageBody + }; + + if (CustomHeader != "" && CustomHeaderValue != "") + { + message.Headers["X-Rockfish-" + CustomHeader] = CustomHeaderValue; + } + + //adapted from https://stackoverflow.com/questions/33365072/mailkit-sending-drafts + using (var client = new ImapClient()) + { + try + { + // Accept all SSL certificates + client.ServerCertificateValidationCallback = (s, c, h, e) => true; + client.Connect(MAIL_IMAP_ADDRESS, MAIL_IMAP_PORT, true); + // Note: since we don't have an OAuth2 token, disable + // the XOAUTH2 authentication mechanism. + client.AuthenticationMechanisms.Remove("XOAUTH2"); + client.Authenticate(MAIL_ACCOUNT_SUPPORT, MAIL_ACCOUNT_PASSWORD_SUPPORT); + + + var draftFolder = client.GetFolder("Drafts");//Our surgemail server works with this other servers in future might not + if (draftFolder != null) + { + draftFolder.Open(FolderAccess.ReadWrite); + draftFolder.Append(message, MessageFlags.Draft); + //draftFolder.Expunge(); + } + } + catch (Exception ex) + { + throw new System.Exception("RfMail->DraftMessage() - Exception has occured: " + ex.Message); + } + + client.Disconnect(true); + } + + }//draft message + + + ///////////////////////////////////////////////////////////////// + //Fetch summaries of unread messages in sales and support + //inboxes + // + public static List GetSalesAndSupportSummaries() + { + List ret = new List(); + + ret.AddRange(getInboxSummariesFor(MAIL_ACCOUNT_SUPPORT, MAIL_ACCOUNT_PASSWORD_SUPPORT)); + ret.AddRange(getInboxSummariesFor(MAIL_ACCOUNT_SALES, MAIL_ACCOUNT_PASSWORD_SALES)); + + return ret; + } + + private static List getInboxSummariesFor(string sourceAccount, string sourcePassword) + { + List ret = new List(); + using (var client = new ImapClient()) + { + // Accept all SSL certificates + client.ServerCertificateValidationCallback = (s, c, h, e) => true; + client.Connect(MAIL_IMAP_ADDRESS, MAIL_IMAP_PORT, true); + // Note: since we don't have an OAuth2 token, disable + // the XOAUTH2 authentication mechanism. + client.AuthenticationMechanisms.Remove("XOAUTH2"); + + client.Authenticate(sourceAccount, sourcePassword); + + var inbox = client.Inbox; + inbox.Open(FolderAccess.ReadOnly); + + var summaries = inbox.Fetch(0, -1, MessageSummaryItems.Full | MessageSummaryItems.UniqueId); + client.Disconnect(true); + foreach (var summary in summaries) + { + //Sometimes bad hombres don't set a from address so don't expect one + string sFrom = "UNKNOWN / NOT SET"; + if (summary.Envelope.From.Count > 0) + { + sFrom = summary.Envelope.From[0].ToString().Replace("\"", "").Replace("<", "").Replace(">", "").Trim(); + } + ret.Add(new rfMessageSummary + { + account = sourceAccount, + id = summary.UniqueId.Id, + subject = summary.Envelope.Subject, + sent = DateUtil.DateTimeOffSetNullableToEpoch(summary.Envelope.Date), + from = sFrom, + flags = summary.Flags.ToString().ToLowerInvariant() + }); + } + } + //reverse the results array as emails come in oldest first order but we want oldest last + ret.Reverse(); + return ret; + } + + + public class rfMessageSummary + { + public string account; + public uint id; + public string from; + public string subject; + public long? sent; + public string flags; + } + + //Fetch a single string preview of message by Account / folder / UID + public static rfMessagePreview GetMessagePreview(string mailAccount, string mailFolder, uint uid) + { + using (var client = new ImapClient()) + { + // Accept all SSL certificates + client.ServerCertificateValidationCallback = (s, c, h, e) => true; + client.Connect(MAIL_IMAP_ADDRESS, MAIL_IMAP_PORT, true); + // Note: since we don't have an OAuth2 token, disable + // the XOAUTH2 authentication mechanism. + client.AuthenticationMechanisms.Remove("XOAUTH2"); + + //TODO: make accounts reside in dictionary in future + if (mailAccount == "support@ayanova.com") + { + client.Authenticate(MAIL_ACCOUNT_SUPPORT, MAIL_ACCOUNT_PASSWORD_SUPPORT); + } + if (mailAccount == "sales@ayanova.com") + { + client.Authenticate(MAIL_ACCOUNT_SALES, MAIL_ACCOUNT_PASSWORD_SALES); + } + + var fldr = client.GetFolder(mailFolder); + fldr.Open(FolderAccess.ReadOnly); + var m = fldr.GetMessage(new UniqueId(uid)); + client.Disconnect(true); + + StringBuilder sb = new StringBuilder(); + sb.Append("From: "); + sb.AppendLine(m.From[0].ToString().Replace("\"", "").Replace("<", "").Replace(">", "").Trim()); + sb.Append("To: "); + sb.AppendLine(mailAccount); + sb.Append("Subject: "); + sb.AppendLine(m.Subject); + sb.AppendLine(); + sb.AppendLine(); + sb.AppendLine(m.GetTextBody(MimeKit.Text.TextFormat.Plain)); + rfMessagePreview preview = new rfMessagePreview(); + preview.id = uid; + preview.preview = sb.ToString(); + preview.isKeyRequest = m.Subject.StartsWith("Request for 30 day temporary"); + return preview; + } + }//get message + + public class rfMessagePreview + { + public bool isKeyRequest; + public string preview; + public uint id; + } + + + + + + //---------------- + }//eoc +}//eons diff --git a/util/RfNotify.cs b/util/RfNotify.cs new file mode 100644 index 0000000..aeb9db5 --- /dev/null +++ b/util/RfNotify.cs @@ -0,0 +1,128 @@ +using System; +using System.Text; +using System.Text.RegularExpressions;//now there's at least 'two problems' :) +using System.Collections.Generic; +using System.Linq; +using Microsoft.EntityFrameworkCore; +using rockfishCore.Models; + +namespace rockfishCore.Util +{ + /* + This class handles formatting and sending various notifications + */ + + public static class RfNotify + { + //template key magic strings + public const string KEY_SUB_RENEW_NOTICE_TEMPLATE = "SubRenewNotice"; + + + /////////////////////////////////////////////////////////// + //SUBSCRIPTION RENEWAL NOTICE + // + public static object SendSubscriptionRenewalNotice(rockfishContext ct, List purchaseidlist) + { + + try + { + var template = ct.TextTemplate.SingleOrDefault(m => m.Name == KEY_SUB_RENEW_NOTICE_TEMPLATE); + + if (template == null) + { + return RfResponse.fail("couldn't find template SubRenewNotice"); + } + + + //parse out tokens + //we expect TITLE and BODY tokens here + Dictionary tempTokens = parseTemplateTokens(template.Template); + + //get a list of all the products + var products = ct.Product.ToList(); + + //Get a list of all purchases that are in the list of purchase id's + var purchases = ct.Purchase.Where(c => purchaseidlist.Contains(c.Id)).ToList(); + + //rf6 + // string emailTO = purchases[0].Email; + var cust = ct.Customer.AsNoTracking().First(r => r.Id == purchases[0].CustomerId); + string emailTO = cust.AdminEmail; + + //get company name + //rf6 + // string companyName = ct.Customer.Select(r => new { r.Id, r.Name }) + // .Where(r => r.Id == purchases[0].CustomerId) + // .First().Name; + string companyName=cust.Name; + + //TAGS EXPECTED: {{BODY=}}, {{TITLE=}} + //REPLACEMENT TOKENS EXPECTED: {{SUBLIST}} + StringBuilder sublist = new StringBuilder(); + foreach (Purchase pc in purchases) + { + var pr = products.Where(p => p.ProductCode == pc.ProductCode).First(); + decimal dRenew = Convert.ToDecimal(pr.RenewPrice) / 100m; + decimal dMonthly = Convert.ToDecimal(pr.RenewPrice) / 1200m; + string sRenew = String.Format("{0:C}", dRenew); + string sMonthly = String.Format("{0:C}", dMonthly); + string sRenewDate = DateUtil.EpochToDate(pc.ExpireDate).ToString("D"); + + sublist.Append("\t- "); + sublist.Append(pr.Name); + sublist.Append(" will renew on "); + sublist.Append(sRenewDate); + sublist.Append(" at US"); + sublist.Append(sRenew); + sublist.Append(" for the year + taxes (which works out to only "); + sublist.Append(sMonthly); + sublist.Append(" per month)"); + sublist.AppendLine(); + } + + + string emailFrom = "support@ayanova.com"; + string emailSubject = companyName + " " + tempTokens["TITLE"]; + string emailBody = tempTokens["BODY"].Replace("<>", sublist.ToString()); + + //put email in drafts + RfMail.DraftMessage(emailFrom, emailTO, emailSubject, emailBody, "MsgType", "SubRenewNotice"); + + //tag purchase as notified + foreach (Purchase pc in purchases) + { + pc.RenewNoticeSent = true; + } + ct.SaveChanges(); + + } + catch (Exception ex) + { + return RfResponse.fail(ex.Message); + } + + return RfResponse.ok(); + } + /////////////////////////////////////////////////////////// + + + //parse out all tokens and values in the template + private static Dictionary parseTemplateTokens(string src) + { + Dictionary ret = new Dictionary(); + var roughmatches = Regex.Matches(src, @"{{.*?}}", RegexOptions.Singleline); + foreach (Match roughmatch in roughmatches) + { + //capture the token name which is a regex group between {{ and = + var token = Regex.Match(roughmatch.Value, @"{{(.*?)=", RegexOptions.Singleline).Groups[1].Value; + //capture the token value which is a regex group between {{TOKENNAME= and }} + var tokenValue = Regex.Match(roughmatch.Value, @"{{" + token + "=(.*?)}}", RegexOptions.Singleline).Groups[1].Value; + ret.Add(token, tokenValue); + } + return ret; + } + + //eoc + } + //eons +} \ No newline at end of file diff --git a/util/RfResponse.cs b/util/RfResponse.cs new file mode 100644 index 0000000..bc5cd5a --- /dev/null +++ b/util/RfResponse.cs @@ -0,0 +1,21 @@ +using System; +using System.Text; +using Microsoft.AspNetCore.Mvc; + + +namespace rockfishCore.Util +{ + public static class RfResponse + { + public static object fail(string msg) + { + return new { error = 1, msg = msg }; + } + + public static object ok() + { + return new { ok = 1 }; + } + + } +} \ No newline at end of file diff --git a/util/RfSchema.cs b/util/RfSchema.cs new file mode 100644 index 0000000..86b346f --- /dev/null +++ b/util/RfSchema.cs @@ -0,0 +1,389 @@ +using System; +using System.Text; +using System.Linq; +using Microsoft.EntityFrameworkCore; +using rockfishCore.Models; + +namespace rockfishCore.Util +{ + //Key generator controller + public static class RfSchema + { + private static rockfishContext ctx; + + ///////////////////////////////////////////////////////////////// + /////////// CHANGE THIS ON NEW SCHEMA UPDATE //////////////////// + public const int DESIRED_SCHEMA_LEVEL = 15; + ///////////////////////////////////////////////////////////////// + + + static int startingSchema = -1; + static int currentSchema = -1; + + //check and update schema + public static void CheckAndUpdate(rockfishContext context) + { + ctx = context; + bool rfSetExists = false; + + //update schema here? + using (var command = ctx.Database.GetDbConnection().CreateCommand()) + { + //first of all, do we have a schema table yet (v0?) + command.CommandText = "SELECT name FROM sqlite_master WHERE type='table' AND name='rfset';"; + ctx.Database.OpenConnection(); + using (var result = command.ExecuteReader()) + { + if (result.HasRows) + { + rfSetExists = true; + } + ctx.Database.CloseConnection(); + } + } + //Create schema table (v1) + if (!rfSetExists) + { + //nope, no schema table, add it now and set to v1 + using (var cmCreateRfSet = ctx.Database.GetDbConnection().CreateCommand()) + { + context.Database.OpenConnection(); + //first of all, do we have a schema table yet (v0?) + cmCreateRfSet.CommandText = "CREATE TABLE rfset (id INTEGER PRIMARY KEY, schema INTEGER NOT NULL);"; + cmCreateRfSet.ExecuteNonQuery(); + + cmCreateRfSet.CommandText = "insert into rfset (schema) values (1);"; + cmCreateRfSet.ExecuteNonQuery(); + + context.Database.CloseConnection(); + startingSchema = 1; + currentSchema = 1; + } + } + else + { + //get current schema level + using (var cm = ctx.Database.GetDbConnection().CreateCommand()) + { + cm.CommandText = "SELECT schema FROM rfset WHERE id=1;"; + ctx.Database.OpenConnection(); + using (var result = cm.ExecuteReader()) + { + if (result.HasRows) + { + result.Read(); + currentSchema = startingSchema = result.GetInt32(0); + ctx.Database.CloseConnection(); + } + else + { + ctx.Database.CloseConnection(); + throw new System.Exception("rockfish->RfSchema->CheckAndUpdate: Error reading schema version"); + } + } + } + } + + //Bail early no update? + if (currentSchema == DESIRED_SCHEMA_LEVEL) + return; + + + + //************* SCHEMA UPDATES ****************** + + ////////////////////////////////////////////////// + //schema 2 case 3283 + if (currentSchema < 2) + { + //add renewal flag to purchase + exec("alter table purchase add renewNoticeSent boolean default 0 NOT NULL CHECK (renewNoticeSent IN (0,1))"); + //Add product table with prices + exec("CREATE TABLE product (id INTEGER PRIMARY KEY, name text not null, productCode text, price integer, renewPrice integer )"); + currentSchema = 2; + setSchemaLevel(currentSchema); + } + + ////////////////////////////////////////////////// + //schema 3 case 3283 + if (currentSchema < 3) + { + //add products current as of 2017-July-18 + exec("insert into product (name, productCode, price, renewPrice) values ('Key administration','300093112',3500, 3500);"); + exec("insert into product (name, productCode, price, renewPrice) values ('Custom work','300151145',0, 0);"); + exec("insert into product (name, productCode, price, renewPrice) values ('AyaNova RI sub (old / unused?)','300740314',19900, 6965);"); + exec("insert into product (name, productCode, price, renewPrice) values ('Single AyaNova schedulable resource 1 year subscription license','300740315',15900, 5565);"); + exec("insert into product (name, productCode, price, renewPrice) values ('Single AyaNova Lite 1 year subscription license','300740316',6900, 2415);"); + exec("insert into product (name, productCode, price, renewPrice) values ('Up to 5 AyaNova schedulable resource 1 year subscription license','300740317', 69500, 24325);"); + exec("insert into product (name, productCode, price, renewPrice) values ('Up to 10 AyaNova schedulable resource 1 year subscription license','300740318',119000, 41650);"); + exec("insert into product (name, productCode, price, renewPrice) values ('Up to 20 AyaNova schedulable resource 1 year subscription license','300740319',198000, 69300);"); + exec("insert into product (name, productCode, price, renewPrice) values ('AyaNova WBI (web browser interface) 1 year subscription license','300740321',9900, 3465);"); + exec("insert into product (name, productCode, price, renewPrice) values ('AyaNova MBI (minimal browser interface) 1 year subscription license','300740322', 9900, 3465);"); + exec("insert into product (name, productCode, price, renewPrice) values ('AyaNova QBI(QuickBooks interface) 1 year subscription license','300740323',9900, 3465);"); + exec("insert into product (name, productCode, price, renewPrice) values ('AyaNova PTI(US Peachtree/Sage 50 interface) 1 year subscription license','300740324',9900, 3465);"); + exec("insert into product (name, productCode, price, renewPrice) values ('AyaNova OLI(Outlook interface) 1 year subscription license','300740325',9900, 3465);"); + exec("insert into product (name, productCode, price, renewPrice) values ('Plug-in Outlook Schedule Export 1 year subscription license','300740326',1900, 665);"); + exec("insert into product (name, productCode, price, renewPrice) values ('Plug-in Export to XLS 1 year subscription license','300740327',1900, 665);"); + exec("insert into product (name, productCode, price, renewPrice) values ('Plug-in Quick Notification 1 year subscription license','300740328',1900, 665);"); + exec("insert into product (name, productCode, price, renewPrice) values ('Plug-in importexport.csv duplicate 1 year subscription license','300740329',1900, 665);"); + exec("insert into product (name, productCode, price, renewPrice) values ('Up to 999 AyaNova schedulable resource 1 year subscription license','300741264',15000, 5250);"); + + currentSchema = 3; + setSchemaLevel(currentSchema); + } + + + ////////////////////////////////////////////////// + //schema 4 case 3283 + if (currentSchema < 4) + { + //Add template table to store email and other templates + exec("CREATE TABLE texttemplate (id INTEGER PRIMARY KEY, name text not null, template text)"); + currentSchema = 4; + setSchemaLevel(currentSchema); + } + + + ////////////////////////////////////////////////// + //schema 5 case 3253 + if (currentSchema < 5) + { + exec("alter table customer add active boolean default 1 NOT NULL CHECK (active IN (0,1))"); + currentSchema = 5; + setSchemaLevel(currentSchema); + } + + + + ////////////////////////////////////////////////// + //schema 6 case 3308 + if (currentSchema < 6) + { + + exec("CREATE TABLE rfcaseproject (id INTEGER PRIMARY KEY, name text not null)"); + + exec("CREATE TABLE rfcase (id INTEGER PRIMARY KEY, title text not null, rfcaseprojectid integer not null, " + + "priority integer default 3 NOT NULL CHECK (priority IN (1,2,3,4,5)), notes text, dtcreated integer, dtclosed integer, " + + "releaseversion text, releasenotes text, " + + "FOREIGN KEY (rfcaseprojectid) REFERENCES rfcaseproject(id))"); + + exec("CREATE TABLE rfcaseblob (id INTEGER PRIMARY KEY, rfcaseid integer not null, name text not null, file blob not null, " + + "FOREIGN KEY (rfcaseid) REFERENCES rfcase(id) ON DELETE CASCADE )"); + + currentSchema = 6; + setSchemaLevel(currentSchema); + } + + + ////////////////////////////////////////////////// + //schema 7 case 3308 + if (currentSchema < 7) + { + + //empty any prior import data + exec("delete from rfcaseblob"); + exec("delete from rfcase"); + exec("delete from rfcaseproject"); + + //Trigger import of all fogbugz cases into rockfish + Util.FBImporter.Import(ctx); + + //now get rid of the delete records + exec("delete from rfcase where title='deleted from FogBugz'"); + + currentSchema = 7;//<<-------------------- TESTING, CHANGE TO 7 BEFORE PRODUCTION + setSchemaLevel(currentSchema); + } + + + ////////////////////////////////////////////////// + //schema 8 + if (currentSchema < 8) + { + exec("alter table user add dlkey text"); + currentSchema = 8; + setSchemaLevel(currentSchema); + } + + + ////////////////////////////////////////////////// + //schema 9 + if (currentSchema < 9) + { + exec("alter table user add dlkeyexp integer"); + currentSchema = 9; + setSchemaLevel(currentSchema); + } + + + + ////////////////////////////////////////////////// + //schema 10 case 3233 + if (currentSchema < 10) + { + + exec("CREATE TABLE license (" + + "id INTEGER PRIMARY KEY, dtcreated integer not null, customerid integer not null, regto text not null, key text not null, code text not null, email text not null, " + + "fetchfrom text, dtfetched integer, fetched boolean default 0 NOT NULL CHECK (fetched IN (0,1))" + + ")"); + + currentSchema = 10; + setSchemaLevel(currentSchema); + } + + + + ////////////////////////////////////////////////// + //schema 11 case 3550 + if (currentSchema < 11) + { + //add 15 level product code + exec("insert into product (name, productCode, price, renewPrice) values ('Up to 15 AyaNova schedulable resource 1 year subscription license','300807973',165000, 57750);"); + currentSchema = 11; + setSchemaLevel(currentSchema); + } + + ////////////////////////////////////////////////// + //schema 12 + if (currentSchema < 12) + { + exec("alter table customer add supportEmail text"); + exec("alter table customer add adminEmail text"); + currentSchema = 12; + setSchemaLevel(currentSchema); + } + + ////////////////////////////////////////////////// + //schema 13 + if (currentSchema < 13) + { + //Put all the purchase emails into the customer adminEmail field as CSV + //These will get all notification types + foreach (var purchase in ctx.Purchase.AsNoTracking()) + { + if (!string.IsNullOrWhiteSpace(purchase.Email)) + { + var cust = ctx.Customer.SingleOrDefault(m => m.Id == purchase.CustomerId); + if (cust == null) + { + throw new ArgumentNullException($"RFSCHEMA UPDATE 13 (purchases) CUSTOMER {purchase.CustomerId.ToString()} not found!!"); + } + + var purchaseEmails = purchase.Email.Split(","); + foreach (var email in purchaseEmails) + { + Util.CustomerUtils.AddAdminEmailIfNotPresent(cust, email); + } + ctx.SaveChanges(); + } + } + + // //Put all the contact emails into the customer adminEmail field and the support field as CSV + // //These will get all notification types + // foreach (var contact in ctx.Contact.AsNoTracking()) + // { + // if (!string.IsNullOrWhiteSpace(contact.Email)) + // { + // var cust = ctx.Customer.SingleOrDefault(m => m.Id == contact.CustomerId); + // if (cust == null) + // { + // throw new ArgumentNullException($"RFSCHEMA UPDATE 13 (contacts) CUSTOMER {contact.CustomerId.ToString()} not found!!"); + // } + + // var contactEmails = contact.Email.Split(","); + // foreach (var email in contactEmails) + // { + // Util.CustomerUtils.AddAdminEmailIfNotPresent(cust, email); + // } + // ctx.SaveChanges(); + // } + // } + + + // //Put all the incident emails into the customer supportEmail field unless already in teh admin field or support field field and the support field as CSV + // //These will get only support related (updates/bug reports) notification types + // foreach (var incident in ctx.Incident.AsNoTracking()) + // { + // if (!string.IsNullOrWhiteSpace(incident.Email)) + // { + // var cust = ctx.Customer.SingleOrDefault(m => m.Id == incident.CustomerId); + // if (cust == null) + // { + // throw new ArgumentNullException($"RFSCHEMA UPDATE 13 (incidents) CUSTOMER {incident.CustomerId.ToString()} not found!!"); + // } + + // var incidentEmails = incident.Email.Split(","); + // foreach (var email in incidentEmails) + // { + + // //See if incident email is already in adminEmail field: + // if (cust.AdminEmail != null && cust.AdminEmail.ToLowerInvariant().Contains(email.Trim().ToLowerInvariant())) + // { + // continue;//skip this one, it's already there + // } + + // //It's not in the adminEmail field already so add it to the supportEmail + // //field (assumption: all incidents are support related and particularly ones that are not already in admin) + // Util.CustomerUtils.AddSupportEmailIfNotPresent(cust, email); + // } + // ctx.SaveChanges(); + // } + // } + + + //NOTE: NOTIFICATION AND TRIAL tables have emails but they are dupes, empty or not required based on actual data so not going to import them + + currentSchema = 13; + setSchemaLevel(currentSchema); + } + + ////////////////////////////////////////////////// + //schema 14 + if (currentSchema < 14) + { + exec("update license set fetchfrom = 'redacted'"); + currentSchema = 14; + setSchemaLevel(currentSchema); + } + + + ////////////////////////////////////////////////// + //schema 15 + if (currentSchema < 15) + { + exec("drop table contact"); + exec("drop table incident"); + exec("drop table notification"); + exec("drop table trial"); + currentSchema = 15; + setSchemaLevel(currentSchema); + } + + //************************************************************************************* + + + }//eofunction + + + + private static void setSchemaLevel(int nCurrentSchema) + { + exec("UPDATE RFSET SET schema=" + nCurrentSchema.ToString()); + } + + //execute command query + private static void exec(string q) + { + using (var cmCreateRfSet = ctx.Database.GetDbConnection().CreateCommand()) + { + ctx.Database.OpenConnection(); + cmCreateRfSet.CommandText = q; + cmCreateRfSet.ExecuteNonQuery(); + ctx.Database.CloseConnection(); + } + } + + //eoclass + } + //eons +} \ No newline at end of file diff --git a/util/RfVersion.cs b/util/RfVersion.cs new file mode 100644 index 0000000..8162821 --- /dev/null +++ b/util/RfVersion.cs @@ -0,0 +1,8 @@ +namespace rockfishCore.Util +{ + public static class RfVersion + { + public const string NumberOnly="6.3"; + public const string Full = "Rockfish server " + NumberOnly; + } +} \ No newline at end of file diff --git a/util/TrialKeyRequestHandler.cs b/util/TrialKeyRequestHandler.cs new file mode 100644 index 0000000..d80cf13 --- /dev/null +++ b/util/TrialKeyRequestHandler.cs @@ -0,0 +1,183 @@ +using System; +using System.Text; +using System.Collections.Generic; +using rockfishCore.Models; +using rockfishCore.Util; + +using MailKit.Net.Imap; +using MailKit.Search; +using MailKit; +using MimeKit; + + + + +namespace rockfishCore.Util +{ + //Trial Key request handler + public static class TrialKeyRequestHandler + { + //non anonymous return object for array + //https://stackoverflow.com/a/3202396 + private class retObject + { + public string from; + public string subject; + public string date; + public uint uid; + } + + //MAILKIT DOCS + //https://github.com/jstedfast/MailKit#using-mailkit + + public static dynamic Requests() + { + try + { + List ret = new List(); + List msgs = RfMail.GetMessages(SearchQuery.SubjectContains("Request for 30 day temporary").And(SearchQuery.NotAnswered).And(SearchQuery.NotDeleted)); + + + foreach (RfMail.rfMailMessage m in msgs) + { + ret.Add(new retObject() + { + uid = m.uid, + subject = m.message.Subject, + date = m.message.Date.LocalDateTime.ToString("g"), + from = m.message.From.ToString() + }); + } + + + return new { ok = 1, requests = ret }; + } + catch (Exception e) + { + return new + { + error = 1, + msg = "Error @ TrialKeyRequestHandler->Requests()", + error_detail = new { message = e.Message, stack = e.StackTrace } + }; + } + }//requests + + + + + public static dynamic GenerateFromRequest(uint uid, LicenseTemplates licenseTemplates, string authUser, rockfishContext ct) + { + try + { + using (var client = new ImapClient()) + { + var m = RfMail.GetMessage(uid); + + string greetingReplySubject = "re: " + m.Subject; + + //Extract request message fields + string replyTo = m.From.ToString(); + + //get request message body + string request = m.TextBody; + + //Parse request message for deets + if (string.IsNullOrWhiteSpace(request)) + { + throw new System.NotSupportedException("TrialKeyRequestHandler->GenerateFromRequest: error text body of request email is empty"); + } + bool bLite = m.Subject.Contains("AyaNova Lite"); + int nNameStart = request.IndexOf("Name:\r\n") + 7; + int nNameEnd = request.IndexOf("Company:\r\n"); + int nCompanyStart = nNameEnd + 10; + int nCompanyEnd = request.IndexOf("Referrer:\r\n"); + string sName = request.Substring(nNameStart, nNameEnd - nNameStart).Trim(); + if (sName.Contains(" ")) + sName = sName.Split(' ')[0]; + string sRegTo = request.Substring(nCompanyStart, nCompanyEnd - nCompanyStart).Trim(); + + //make keycode + string keyCode = KeyFactory.GetTrialKey(sRegTo, bLite, licenseTemplates, authUser, replyTo, ct);//case 3233 + + //get greeting and subject + string greeting = string.Empty; + string keyEmailSubject = string.Empty; + + if (bLite) + { + //No lite trial greeting but text looks ok to just use full trial greeting so going with that + //(the column is in the DB but there is no UI for it and it's null) + //greeting = licenseTemplates.LiteTrialGreeting.Replace("[FirstName]", sName); + greeting = licenseTemplates.FullTrialGreeting.Replace("[FirstName]", sName); + keyEmailSubject = "AyaNova Lite and all add-ons temporary 30 day Activation key"; + } + else + { + greeting = licenseTemplates.FullTrialGreeting.Replace("[FirstName]", sName); + keyEmailSubject = "AyaNova and all add-on's temporary 30 day Activation key"; + } + + return new + { + ok = 1, + uid = uid, + requestReplyToAddress = replyTo, + requestFromReplySubject = keyEmailSubject, + requestKeyIsLite = bLite, + keycode = keyCode, + greeting = greeting, + greetingReplySubject = greetingReplySubject, + request = request + }; + } + } + catch (Exception e) + { + + return new + { + error = 1, + ok = 0, + msg = "Error @ TrialKeyRequestHandler->GenerateFromRequest()", + error_detail = new { message = e.Message, stack = e.StackTrace } + }; + } + }//requests + + + public static dynamic SendTrialRequestResponse(dtoKeyRequestResponse k) + { + try + { + //----------------- + //Send both responses + + //Send the greeting email + RfMail.SendMessage("support@ayanova.com", k.requestReplyToAddress, k.greetingReplySubject, k.greeting, true, "MsgType", "TrialRequestGreet"); + + //Send the license key email + RfMail.SendMessage("support@ayanova.com", k.requestReplyToAddress, k.requestFromReplySubject, k.keycode, true, "MsgType", "TrialRequestKey"); + + // Flag original request message as read and replied + RfMail.FlagInboxMessageSeenReplied(k.request_email_uid); + + + //------------------ + return new { ok = 1 }; + } + catch (Exception e) + { + return new + { + error = 1, + msg = "Error @ TrialKeyRequestHandler->SendTrialRequestResponse()", + error_detail = new { message = e.Message, stack = e.StackTrace } + }; + } + }//requests + + + }//eoc + +}//eons \ No newline at end of file diff --git a/util/fetchkeycode.cs b/util/fetchkeycode.cs new file mode 100644 index 0000000..4283d68 --- /dev/null +++ b/util/fetchkeycode.cs @@ -0,0 +1,35 @@ +using System; + +namespace rockfishCore.Util +{ + //Generate a random code for license key fetching + //doesn't have to be perfect, it's only temporary and + //requires knowledge of the customer / trial user + //email address to use it so it's kind of 2 factor + public static class FetchKeyCode + { + + public static string generate() + { + + //sufficient for this purpose + //https://stackoverflow.com/a/1344258/8939 + + var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + var stringChars = new char[10]; + var random = new Random(); + + for (int i = 0; i < stringChars.Length; i++) + { + stringChars[i] = chars[random.Next(chars.Length)]; + } + + var finalString = new String(stringChars); + return finalString; + } + + + + }//eoc + +}//eons \ No newline at end of file diff --git a/util/hasher.cs b/util/hasher.cs new file mode 100644 index 0000000..e2e5fdf --- /dev/null +++ b/util/hasher.cs @@ -0,0 +1,38 @@ +using System; +using System.Security.Cryptography; +using Microsoft.AspNetCore.Cryptography.KeyDerivation; +namespace rockfishCore.Util +{ + //Authentication controller + public static class Hasher + { + + public static string hash(string Salt, string Password) + { + + //adapted from here: + //https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/consumer-apis/password-hashing + string hashed = Convert.ToBase64String(KeyDerivation.Pbkdf2( + password: Password, + salt: StringToByteArray(Salt), + prf: KeyDerivationPrf.HMACSHA512, + iterationCount: 10000, + numBytesRequested: 512 / 8)); + return hashed; + } + + + + //https://stackoverflow.com/questions/311165/how-do-you-convert-a-byte-array-to-a-hexadecimal-string-and-vice-versa/24343727#24343727 + public static byte[] StringToByteArray(String hex) + { + int NumberChars = hex.Length; + byte[] bytes = new byte[NumberChars / 2]; + for (int i = 0; i < NumberChars; i += 2) + bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16); + return bytes; + } + + }//eoc + +}//eons \ No newline at end of file diff --git a/util/rfLogger.cs b/util/rfLogger.cs new file mode 100644 index 0000000..b35f4a5 --- /dev/null +++ b/util/rfLogger.cs @@ -0,0 +1,40 @@ +using Microsoft.Extensions.Logging; +using System; +using System.IO; + +namespace rockfishCore.Util +{ +//from a comment here: https://github.com/aspnet/EntityFramework/issues/6482 + + public class rfLoggerProvider : ILoggerProvider + { + public ILogger CreateLogger(string categoryName) + { + return new rfLogger(); + } + + public void Dispose() + { } + + private class rfLogger : ILogger + { + public bool IsEnabled(LogLevel logLevel) + { + return true; + } + + public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) + { + // File.AppendAllText(@"log.txt", formatter(state, exception)); + Console.WriteLine("------------------------------------------------------------"); + Console.WriteLine(formatter(state, exception)); + Console.WriteLine("------------------------------------------------------------"); + } + + public IDisposable BeginScope(TState state) + { + return null; + } + } + } +} \ No newline at end of file diff --git a/wwwroot/android-chrome-192x192.png b/wwwroot/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..ae58f210cf41f60cf4216f2ccb2b298d84ccca69 GIT binary patch literal 8505 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 literal 0 HcmV?d00001 diff --git a/wwwroot/browserconfig.xml b/wwwroot/browserconfig.xml new file mode 100644 index 0000000..5cd27e3 --- /dev/null +++ b/wwwroot/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #603cba + + + diff --git a/wwwroot/css/app.css b/wwwroot/css/app.css new file mode 100644 index 0000000..7bd3c54 --- /dev/null +++ b/wwwroot/css/app.css @@ -0,0 +1,29 @@ + + +ul{ + padding:0; +} + +.rf-list, .list-unstyled{ + list-style: none; +} + +.rf-content{ + margin-top:64px; +} + +.rf-larger{ + font-size: larger; +} + +.rf-smaller{ + font-size: smaller; +} + +@media screen and (max-width: 576px){ /* bump up font on smaller screen */ + html{font-size: 20px} + + .rf-content{ + margin-top:80px; + } +} \ No newline at end of file diff --git a/wwwroot/css/materialdesignicons.min.css b/wwwroot/css/materialdesignicons.min.css new file mode 100644 index 0000000..cf83760 --- /dev/null +++ b/wwwroot/css/materialdesignicons.min.css @@ -0,0 +1,2 @@ +/* MaterialDesignIcons.com */@font-face{font-family:"Material Design Icons";src:url("../fonts/materialdesignicons-webfont.eot?v=2.0.46");src:url("../fonts/materialdesignicons-webfont.eot?#iefix&v=2.0.46") format("embedded-opentype"),url("../fonts/materialdesignicons-webfont.woff2?v=2.0.46") format("woff2"),url("../fonts/materialdesignicons-webfont.woff?v=2.0.46") format("woff"),url("../fonts/materialdesignicons-webfont.ttf?v=2.0.46") format("truetype"),url("../fonts/materialdesignicons-webfont.svg?v=2.0.46#materialdesigniconsregular") format("svg");font-weight:normal;font-style:normal}.mdi:before,.mdi-set{display:inline-block;font:normal normal normal 24px/1 "Material Design Icons";font-size:inherit;text-rendering:auto;line-height:inherit;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.mdi-access-point:before{content:"\F002"}.mdi-access-point-network:before{content:"\F003"}.mdi-account:before{content:"\F004"}.mdi-account-alert:before{content:"\F005"}.mdi-account-box:before{content:"\F006"}.mdi-account-box-outline:before{content:"\F007"}.mdi-account-card-details:before{content:"\F5D2"}.mdi-account-check:before{content:"\F008"}.mdi-account-circle:before{content:"\F009"}.mdi-account-convert:before{content:"\F00A"}.mdi-account-edit:before{content:"\F6BB"}.mdi-account-key:before{content:"\F00B"}.mdi-account-location:before{content:"\F00C"}.mdi-account-minus:before{content:"\F00D"}.mdi-account-multiple:before{content:"\F00E"}.mdi-account-multiple-minus:before{content:"\F5D3"}.mdi-account-multiple-outline:before{content:"\F00F"}.mdi-account-multiple-plus:before{content:"\F010"}.mdi-account-network:before{content:"\F011"}.mdi-account-off:before{content:"\F012"}.mdi-account-outline:before{content:"\F013"}.mdi-account-plus:before{content:"\F014"}.mdi-account-remove:before{content:"\F015"}.mdi-account-search:before{content:"\F016"}.mdi-account-settings:before{content:"\F630"}.mdi-account-settings-variant:before{content:"\F631"}.mdi-account-star:before{content:"\F017"}.mdi-account-switch:before{content:"\F019"}.mdi-adjust:before{content:"\F01A"}.mdi-air-conditioner:before{content:"\F01B"}.mdi-airballoon:before{content:"\F01C"}.mdi-airplane:before{content:"\F01D"}.mdi-airplane-landing:before{content:"\F5D4"}.mdi-airplane-off:before{content:"\F01E"}.mdi-airplane-takeoff:before{content:"\F5D5"}.mdi-airplay:before{content:"\F01F"}.mdi-alarm:before{content:"\F020"}.mdi-alarm-bell:before{content:"\F78D"}.mdi-alarm-check:before{content:"\F021"}.mdi-alarm-light:before{content:"\F78E"}.mdi-alarm-multiple:before{content:"\F022"}.mdi-alarm-off:before{content:"\F023"}.mdi-alarm-plus:before{content:"\F024"}.mdi-alarm-snooze:before{content:"\F68D"}.mdi-album:before{content:"\F025"}.mdi-alert:before{content:"\F026"}.mdi-alert-box:before{content:"\F027"}.mdi-alert-circle:before{content:"\F028"}.mdi-alert-circle-outline:before{content:"\F5D6"}.mdi-alert-decagram:before{content:"\F6BC"}.mdi-alert-octagon:before{content:"\F029"}.mdi-alert-octagram:before{content:"\F766"}.mdi-alert-outline:before{content:"\F02A"}.mdi-all-inclusive:before{content:"\F6BD"}.mdi-alpha:before{content:"\F02B"}.mdi-alphabetical:before{content:"\F02C"}.mdi-altimeter:before{content:"\F5D7"}.mdi-amazon:before{content:"\F02D"}.mdi-amazon-clouddrive:before{content:"\F02E"}.mdi-ambulance:before{content:"\F02F"}.mdi-amplifier:before{content:"\F030"}.mdi-anchor:before{content:"\F031"}.mdi-android:before{content:"\F032"}.mdi-android-debug-bridge:before{content:"\F033"}.mdi-android-head:before{content:"\F78F"}.mdi-android-studio:before{content:"\F034"}.mdi-angular:before{content:"\F6B1"}.mdi-angularjs:before{content:"\F6BE"}.mdi-animation:before{content:"\F5D8"}.mdi-apple:before{content:"\F035"}.mdi-apple-finder:before{content:"\F036"}.mdi-apple-ios:before{content:"\F037"}.mdi-apple-keyboard-caps:before{content:"\F632"}.mdi-apple-keyboard-command:before{content:"\F633"}.mdi-apple-keyboard-control:before{content:"\F634"}.mdi-apple-keyboard-option:before{content:"\F635"}.mdi-apple-keyboard-shift:before{content:"\F636"}.mdi-apple-mobileme:before{content:"\F038"}.mdi-apple-safari:before{content:"\F039"}.mdi-application:before{content:"\F614"}.mdi-approval:before{content:"\F790"}.mdi-apps:before{content:"\F03B"}.mdi-archive:before{content:"\F03C"}.mdi-arrange-bring-forward:before{content:"\F03D"}.mdi-arrange-bring-to-front:before{content:"\F03E"}.mdi-arrange-send-backward:before{content:"\F03F"}.mdi-arrange-send-to-back:before{content:"\F040"}.mdi-arrow-all:before{content:"\F041"}.mdi-arrow-bottom-left:before{content:"\F042"}.mdi-arrow-bottom-right:before{content:"\F043"}.mdi-arrow-collapse:before{content:"\F615"}.mdi-arrow-collapse-all:before{content:"\F044"}.mdi-arrow-collapse-down:before{content:"\F791"}.mdi-arrow-collapse-left:before{content:"\F792"}.mdi-arrow-collapse-right:before{content:"\F793"}.mdi-arrow-collapse-up:before{content:"\F794"}.mdi-arrow-down:before{content:"\F045"}.mdi-arrow-down-bold:before{content:"\F72D"}.mdi-arrow-down-bold-box:before{content:"\F72E"}.mdi-arrow-down-bold-box-outline:before{content:"\F72F"}.mdi-arrow-down-bold-circle:before{content:"\F047"}.mdi-arrow-down-bold-circle-outline:before{content:"\F048"}.mdi-arrow-down-bold-hexagon-outline:before{content:"\F049"}.mdi-arrow-down-box:before{content:"\F6BF"}.mdi-arrow-down-drop-circle:before{content:"\F04A"}.mdi-arrow-down-drop-circle-outline:before{content:"\F04B"}.mdi-arrow-down-thick:before{content:"\F046"}.mdi-arrow-expand:before{content:"\F616"}.mdi-arrow-expand-all:before{content:"\F04C"}.mdi-arrow-expand-down:before{content:"\F795"}.mdi-arrow-expand-left:before{content:"\F796"}.mdi-arrow-expand-right:before{content:"\F797"}.mdi-arrow-expand-up:before{content:"\F798"}.mdi-arrow-left:before{content:"\F04D"}.mdi-arrow-left-bold:before{content:"\F730"}.mdi-arrow-left-bold-box:before{content:"\F731"}.mdi-arrow-left-bold-box-outline:before{content:"\F732"}.mdi-arrow-left-bold-circle:before{content:"\F04F"}.mdi-arrow-left-bold-circle-outline:before{content:"\F050"}.mdi-arrow-left-bold-hexagon-outline:before{content:"\F051"}.mdi-arrow-left-box:before{content:"\F6C0"}.mdi-arrow-left-drop-circle:before{content:"\F052"}.mdi-arrow-left-drop-circle-outline:before{content:"\F053"}.mdi-arrow-left-thick:before{content:"\F04E"}.mdi-arrow-right:before{content:"\F054"}.mdi-arrow-right-bold:before{content:"\F733"}.mdi-arrow-right-bold-box:before{content:"\F734"}.mdi-arrow-right-bold-box-outline:before{content:"\F735"}.mdi-arrow-right-bold-circle:before{content:"\F056"}.mdi-arrow-right-bold-circle-outline:before{content:"\F057"}.mdi-arrow-right-bold-hexagon-outline:before{content:"\F058"}.mdi-arrow-right-box:before{content:"\F6C1"}.mdi-arrow-right-drop-circle:before{content:"\F059"}.mdi-arrow-right-drop-circle-outline:before{content:"\F05A"}.mdi-arrow-right-thick:before{content:"\F055"}.mdi-arrow-top-left:before{content:"\F05B"}.mdi-arrow-top-right:before{content:"\F05C"}.mdi-arrow-up:before{content:"\F05D"}.mdi-arrow-up-bold:before{content:"\F736"}.mdi-arrow-up-bold-box:before{content:"\F737"}.mdi-arrow-up-bold-box-outline:before{content:"\F738"}.mdi-arrow-up-bold-circle:before{content:"\F05F"}.mdi-arrow-up-bold-circle-outline:before{content:"\F060"}.mdi-arrow-up-bold-hexagon-outline:before{content:"\F061"}.mdi-arrow-up-box:before{content:"\F6C2"}.mdi-arrow-up-drop-circle:before{content:"\F062"}.mdi-arrow-up-drop-circle-outline:before{content:"\F063"}.mdi-arrow-up-thick:before{content:"\F05E"}.mdi-assistant:before{content:"\F064"}.mdi-asterisk:before{content:"\F6C3"}.mdi-at:before{content:"\F065"}.mdi-atom:before{content:"\F767"}.mdi-attachment:before{content:"\F066"}.mdi-audiobook:before{content:"\F067"}.mdi-auto-fix:before{content:"\F068"}.mdi-auto-upload:before{content:"\F069"}.mdi-autorenew:before{content:"\F06A"}.mdi-av-timer:before{content:"\F06B"}.mdi-baby:before{content:"\F06C"}.mdi-baby-buggy:before{content:"\F68E"}.mdi-backburger:before{content:"\F06D"}.mdi-backspace:before{content:"\F06E"}.mdi-backup-restore:before{content:"\F06F"}.mdi-bandcamp:before{content:"\F674"}.mdi-bank:before{content:"\F070"}.mdi-barcode:before{content:"\F071"}.mdi-barcode-scan:before{content:"\F072"}.mdi-barley:before{content:"\F073"}.mdi-barrel:before{content:"\F074"}.mdi-basecamp:before{content:"\F075"}.mdi-basket:before{content:"\F076"}.mdi-basket-fill:before{content:"\F077"}.mdi-basket-unfill:before{content:"\F078"}.mdi-battery:before{content:"\F079"}.mdi-battery-10:before{content:"\F07A"}.mdi-battery-20:before{content:"\F07B"}.mdi-battery-30:before{content:"\F07C"}.mdi-battery-40:before{content:"\F07D"}.mdi-battery-50:before{content:"\F07E"}.mdi-battery-60:before{content:"\F07F"}.mdi-battery-70:before{content:"\F080"}.mdi-battery-80:before{content:"\F081"}.mdi-battery-90:before{content:"\F082"}.mdi-battery-alert:before{content:"\F083"}.mdi-battery-charging:before{content:"\F084"}.mdi-battery-charging-100:before{content:"\F085"}.mdi-battery-charging-20:before{content:"\F086"}.mdi-battery-charging-30:before{content:"\F087"}.mdi-battery-charging-40:before{content:"\F088"}.mdi-battery-charging-60:before{content:"\F089"}.mdi-battery-charging-80:before{content:"\F08A"}.mdi-battery-charging-90:before{content:"\F08B"}.mdi-battery-minus:before{content:"\F08C"}.mdi-battery-negative:before{content:"\F08D"}.mdi-battery-outline:before{content:"\F08E"}.mdi-battery-plus:before{content:"\F08F"}.mdi-battery-positive:before{content:"\F090"}.mdi-battery-unknown:before{content:"\F091"}.mdi-beach:before{content:"\F092"}.mdi-beaker:before{content:"\F68F"}.mdi-beats:before{content:"\F097"}.mdi-beer:before{content:"\F098"}.mdi-behance:before{content:"\F099"}.mdi-bell:before{content:"\F09A"}.mdi-bell-off:before{content:"\F09B"}.mdi-bell-outline:before{content:"\F09C"}.mdi-bell-plus:before{content:"\F09D"}.mdi-bell-ring:before{content:"\F09E"}.mdi-bell-ring-outline:before{content:"\F09F"}.mdi-bell-sleep:before{content:"\F0A0"}.mdi-beta:before{content:"\F0A1"}.mdi-bible:before{content:"\F0A2"}.mdi-bike:before{content:"\F0A3"}.mdi-bing:before{content:"\F0A4"}.mdi-binoculars:before{content:"\F0A5"}.mdi-bio:before{content:"\F0A6"}.mdi-biohazard:before{content:"\F0A7"}.mdi-bitbucket:before{content:"\F0A8"}.mdi-black-mesa:before{content:"\F0A9"}.mdi-blackberry:before{content:"\F0AA"}.mdi-blender:before{content:"\F0AB"}.mdi-blinds:before{content:"\F0AC"}.mdi-block-helper:before{content:"\F0AD"}.mdi-blogger:before{content:"\F0AE"}.mdi-bluetooth:before{content:"\F0AF"}.mdi-bluetooth-audio:before{content:"\F0B0"}.mdi-bluetooth-connect:before{content:"\F0B1"}.mdi-bluetooth-off:before{content:"\F0B2"}.mdi-bluetooth-settings:before{content:"\F0B3"}.mdi-bluetooth-transfer:before{content:"\F0B4"}.mdi-blur:before{content:"\F0B5"}.mdi-blur-linear:before{content:"\F0B6"}.mdi-blur-off:before{content:"\F0B7"}.mdi-blur-radial:before{content:"\F0B8"}.mdi-bomb:before{content:"\F690"}.mdi-bomb-off:before{content:"\F6C4"}.mdi-bone:before{content:"\F0B9"}.mdi-book:before{content:"\F0BA"}.mdi-book-minus:before{content:"\F5D9"}.mdi-book-multiple:before{content:"\F0BB"}.mdi-book-multiple-variant:before{content:"\F0BC"}.mdi-book-open:before{content:"\F0BD"}.mdi-book-open-page-variant:before{content:"\F5DA"}.mdi-book-open-variant:before{content:"\F0BE"}.mdi-book-plus:before{content:"\F5DB"}.mdi-book-secure:before{content:"\F799"}.mdi-book-unsecure:before{content:"\F79A"}.mdi-book-variant:before{content:"\F0BF"}.mdi-bookmark:before{content:"\F0C0"}.mdi-bookmark-check:before{content:"\F0C1"}.mdi-bookmark-music:before{content:"\F0C2"}.mdi-bookmark-outline:before{content:"\F0C3"}.mdi-bookmark-plus:before{content:"\F0C5"}.mdi-bookmark-plus-outline:before{content:"\F0C4"}.mdi-bookmark-remove:before{content:"\F0C6"}.mdi-boombox:before{content:"\F5DC"}.mdi-bootstrap:before{content:"\F6C5"}.mdi-border-all:before{content:"\F0C7"}.mdi-border-bottom:before{content:"\F0C8"}.mdi-border-color:before{content:"\F0C9"}.mdi-border-horizontal:before{content:"\F0CA"}.mdi-border-inside:before{content:"\F0CB"}.mdi-border-left:before{content:"\F0CC"}.mdi-border-none:before{content:"\F0CD"}.mdi-border-outside:before{content:"\F0CE"}.mdi-border-right:before{content:"\F0CF"}.mdi-border-style:before{content:"\F0D0"}.mdi-border-top:before{content:"\F0D1"}.mdi-border-vertical:before{content:"\F0D2"}.mdi-bow-tie:before{content:"\F677"}.mdi-bowl:before{content:"\F617"}.mdi-bowling:before{content:"\F0D3"}.mdi-box:before{content:"\F0D4"}.mdi-box-cutter:before{content:"\F0D5"}.mdi-box-shadow:before{content:"\F637"}.mdi-bridge:before{content:"\F618"}.mdi-briefcase:before{content:"\F0D6"}.mdi-briefcase-check:before{content:"\F0D7"}.mdi-briefcase-download:before{content:"\F0D8"}.mdi-briefcase-upload:before{content:"\F0D9"}.mdi-brightness-1:before{content:"\F0DA"}.mdi-brightness-2:before{content:"\F0DB"}.mdi-brightness-3:before{content:"\F0DC"}.mdi-brightness-4:before{content:"\F0DD"}.mdi-brightness-5:before{content:"\F0DE"}.mdi-brightness-6:before{content:"\F0DF"}.mdi-brightness-7:before{content:"\F0E0"}.mdi-brightness-auto:before{content:"\F0E1"}.mdi-broom:before{content:"\F0E2"}.mdi-brush:before{content:"\F0E3"}.mdi-buffer:before{content:"\F619"}.mdi-bug:before{content:"\F0E4"}.mdi-bulletin-board:before{content:"\F0E5"}.mdi-bullhorn:before{content:"\F0E6"}.mdi-bullseye:before{content:"\F5DD"}.mdi-burst-mode:before{content:"\F5DE"}.mdi-bus:before{content:"\F0E7"}.mdi-bus-articulated-end:before{content:"\F79B"}.mdi-bus-articulated-front:before{content:"\F79C"}.mdi-bus-double-decker:before{content:"\F79D"}.mdi-bus-school:before{content:"\F79E"}.mdi-bus-side:before{content:"\F79F"}.mdi-cached:before{content:"\F0E8"}.mdi-cake:before{content:"\F0E9"}.mdi-cake-layered:before{content:"\F0EA"}.mdi-cake-variant:before{content:"\F0EB"}.mdi-calculator:before{content:"\F0EC"}.mdi-calendar:before{content:"\F0ED"}.mdi-calendar-blank:before{content:"\F0EE"}.mdi-calendar-check:before{content:"\F0EF"}.mdi-calendar-clock:before{content:"\F0F0"}.mdi-calendar-multiple:before{content:"\F0F1"}.mdi-calendar-multiple-check:before{content:"\F0F2"}.mdi-calendar-plus:before{content:"\F0F3"}.mdi-calendar-question:before{content:"\F691"}.mdi-calendar-range:before{content:"\F678"}.mdi-calendar-remove:before{content:"\F0F4"}.mdi-calendar-text:before{content:"\F0F5"}.mdi-calendar-today:before{content:"\F0F6"}.mdi-call-made:before{content:"\F0F7"}.mdi-call-merge:before{content:"\F0F8"}.mdi-call-missed:before{content:"\F0F9"}.mdi-call-received:before{content:"\F0FA"}.mdi-call-split:before{content:"\F0FB"}.mdi-camcorder:before{content:"\F0FC"}.mdi-camcorder-box:before{content:"\F0FD"}.mdi-camcorder-box-off:before{content:"\F0FE"}.mdi-camcorder-off:before{content:"\F0FF"}.mdi-camera:before{content:"\F100"}.mdi-camera-burst:before{content:"\F692"}.mdi-camera-enhance:before{content:"\F101"}.mdi-camera-front:before{content:"\F102"}.mdi-camera-front-variant:before{content:"\F103"}.mdi-camera-gopro:before{content:"\F7A0"}.mdi-camera-iris:before{content:"\F104"}.mdi-camera-metering-center:before{content:"\F7A1"}.mdi-camera-metering-matrix:before{content:"\F7A2"}.mdi-camera-metering-partial:before{content:"\F7A3"}.mdi-camera-metering-spot:before{content:"\F7A4"}.mdi-camera-off:before{content:"\F5DF"}.mdi-camera-party-mode:before{content:"\F105"}.mdi-camera-rear:before{content:"\F106"}.mdi-camera-rear-variant:before{content:"\F107"}.mdi-camera-switch:before{content:"\F108"}.mdi-camera-timer:before{content:"\F109"}.mdi-cancel:before{content:"\F739"}.mdi-candle:before{content:"\F5E2"}.mdi-candycane:before{content:"\F10A"}.mdi-cannabis:before{content:"\F7A5"}.mdi-car:before{content:"\F10B"}.mdi-car-battery:before{content:"\F10C"}.mdi-car-connected:before{content:"\F10D"}.mdi-car-convertable:before{content:"\F7A6"}.mdi-car-estate:before{content:"\F7A7"}.mdi-car-hatchback:before{content:"\F7A8"}.mdi-car-pickup:before{content:"\F7A9"}.mdi-car-side:before{content:"\F7AA"}.mdi-car-sports:before{content:"\F7AB"}.mdi-car-wash:before{content:"\F10E"}.mdi-caravan:before{content:"\F7AC"}.mdi-cards:before{content:"\F638"}.mdi-cards-outline:before{content:"\F639"}.mdi-cards-playing-outline:before{content:"\F63A"}.mdi-cards-variant:before{content:"\F6C6"}.mdi-carrot:before{content:"\F10F"}.mdi-cart:before{content:"\F110"}.mdi-cart-off:before{content:"\F66B"}.mdi-cart-outline:before{content:"\F111"}.mdi-cart-plus:before{content:"\F112"}.mdi-case-sensitive-alt:before{content:"\F113"}.mdi-cash:before{content:"\F114"}.mdi-cash-100:before{content:"\F115"}.mdi-cash-multiple:before{content:"\F116"}.mdi-cash-usd:before{content:"\F117"}.mdi-cast:before{content:"\F118"}.mdi-cast-connected:before{content:"\F119"}.mdi-cast-off:before{content:"\F789"}.mdi-castle:before{content:"\F11A"}.mdi-cat:before{content:"\F11B"}.mdi-cctv:before{content:"\F7AD"}.mdi-ceiling-light:before{content:"\F768"}.mdi-cellphone:before{content:"\F11C"}.mdi-cellphone-android:before{content:"\F11D"}.mdi-cellphone-basic:before{content:"\F11E"}.mdi-cellphone-dock:before{content:"\F11F"}.mdi-cellphone-iphone:before{content:"\F120"}.mdi-cellphone-link:before{content:"\F121"}.mdi-cellphone-link-off:before{content:"\F122"}.mdi-cellphone-settings:before{content:"\F123"}.mdi-certificate:before{content:"\F124"}.mdi-chair-school:before{content:"\F125"}.mdi-chart-arc:before{content:"\F126"}.mdi-chart-areaspline:before{content:"\F127"}.mdi-chart-bar:before{content:"\F128"}.mdi-chart-bar-stacked:before{content:"\F769"}.mdi-chart-bubble:before{content:"\F5E3"}.mdi-chart-donut:before{content:"\F7AE"}.mdi-chart-donut-variant:before{content:"\F7AF"}.mdi-chart-gantt:before{content:"\F66C"}.mdi-chart-histogram:before{content:"\F129"}.mdi-chart-line:before{content:"\F12A"}.mdi-chart-line-stacked:before{content:"\F76A"}.mdi-chart-line-variant:before{content:"\F7B0"}.mdi-chart-pie:before{content:"\F12B"}.mdi-chart-scatterplot-hexbin:before{content:"\F66D"}.mdi-chart-timeline:before{content:"\F66E"}.mdi-check:before{content:"\F12C"}.mdi-check-all:before{content:"\F12D"}.mdi-check-circle:before{content:"\F5E0"}.mdi-check-circle-outline:before{content:"\F5E1"}.mdi-checkbox-blank:before{content:"\F12E"}.mdi-checkbox-blank-circle:before{content:"\F12F"}.mdi-checkbox-blank-circle-outline:before{content:"\F130"}.mdi-checkbox-blank-outline:before{content:"\F131"}.mdi-checkbox-marked:before{content:"\F132"}.mdi-checkbox-marked-circle:before{content:"\F133"}.mdi-checkbox-marked-circle-outline:before{content:"\F134"}.mdi-checkbox-marked-outline:before{content:"\F135"}.mdi-checkbox-multiple-blank:before{content:"\F136"}.mdi-checkbox-multiple-blank-circle:before{content:"\F63B"}.mdi-checkbox-multiple-blank-circle-outline:before{content:"\F63C"}.mdi-checkbox-multiple-blank-outline:before{content:"\F137"}.mdi-checkbox-multiple-marked:before{content:"\F138"}.mdi-checkbox-multiple-marked-circle:before{content:"\F63D"}.mdi-checkbox-multiple-marked-circle-outline:before{content:"\F63E"}.mdi-checkbox-multiple-marked-outline:before{content:"\F139"}.mdi-checkerboard:before{content:"\F13A"}.mdi-chemical-weapon:before{content:"\F13B"}.mdi-chevron-double-down:before{content:"\F13C"}.mdi-chevron-double-left:before{content:"\F13D"}.mdi-chevron-double-right:before{content:"\F13E"}.mdi-chevron-double-up:before{content:"\F13F"}.mdi-chevron-down:before{content:"\F140"}.mdi-chevron-left:before{content:"\F141"}.mdi-chevron-right:before{content:"\F142"}.mdi-chevron-up:before{content:"\F143"}.mdi-chili-hot:before{content:"\F7B1"}.mdi-chili-medium:before{content:"\F7B2"}.mdi-chili-mild:before{content:"\F7B3"}.mdi-chip:before{content:"\F61A"}.mdi-church:before{content:"\F144"}.mdi-circle:before{content:"\F764"}.mdi-circle-outline:before{content:"\F765"}.mdi-cisco-webex:before{content:"\F145"}.mdi-city:before{content:"\F146"}.mdi-clipboard:before{content:"\F147"}.mdi-clipboard-account:before{content:"\F148"}.mdi-clipboard-alert:before{content:"\F149"}.mdi-clipboard-arrow-down:before{content:"\F14A"}.mdi-clipboard-arrow-left:before{content:"\F14B"}.mdi-clipboard-check:before{content:"\F14C"}.mdi-clipboard-flow:before{content:"\F6C7"}.mdi-clipboard-outline:before{content:"\F14D"}.mdi-clipboard-plus:before{content:"\F750"}.mdi-clipboard-text:before{content:"\F14E"}.mdi-clippy:before{content:"\F14F"}.mdi-clock:before{content:"\F150"}.mdi-clock-alert:before{content:"\F5CE"}.mdi-clock-end:before{content:"\F151"}.mdi-clock-fast:before{content:"\F152"}.mdi-clock-in:before{content:"\F153"}.mdi-clock-out:before{content:"\F154"}.mdi-clock-start:before{content:"\F155"}.mdi-close:before{content:"\F156"}.mdi-close-box:before{content:"\F157"}.mdi-close-box-outline:before{content:"\F158"}.mdi-close-circle:before{content:"\F159"}.mdi-close-circle-outline:before{content:"\F15A"}.mdi-close-network:before{content:"\F15B"}.mdi-close-octagon:before{content:"\F15C"}.mdi-close-octagon-outline:before{content:"\F15D"}.mdi-close-outline:before{content:"\F6C8"}.mdi-closed-caption:before{content:"\F15E"}.mdi-cloud:before{content:"\F15F"}.mdi-cloud-braces:before{content:"\F7B4"}.mdi-cloud-check:before{content:"\F160"}.mdi-cloud-circle:before{content:"\F161"}.mdi-cloud-download:before{content:"\F162"}.mdi-cloud-off-outline:before{content:"\F164"}.mdi-cloud-outline:before{content:"\F163"}.mdi-cloud-print:before{content:"\F165"}.mdi-cloud-print-outline:before{content:"\F166"}.mdi-cloud-sync:before{content:"\F63F"}.mdi-cloud-tags:before{content:"\F7B5"}.mdi-cloud-upload:before{content:"\F167"}.mdi-code-array:before{content:"\F168"}.mdi-code-braces:before{content:"\F169"}.mdi-code-brackets:before{content:"\F16A"}.mdi-code-equal:before{content:"\F16B"}.mdi-code-greater-than:before{content:"\F16C"}.mdi-code-greater-than-or-equal:before{content:"\F16D"}.mdi-code-less-than:before{content:"\F16E"}.mdi-code-less-than-or-equal:before{content:"\F16F"}.mdi-code-not-equal:before{content:"\F170"}.mdi-code-not-equal-variant:before{content:"\F171"}.mdi-code-parentheses:before{content:"\F172"}.mdi-code-string:before{content:"\F173"}.mdi-code-tags:before{content:"\F174"}.mdi-code-tags-check:before{content:"\F693"}.mdi-codepen:before{content:"\F175"}.mdi-coffee:before{content:"\F176"}.mdi-coffee-outline:before{content:"\F6C9"}.mdi-coffee-to-go:before{content:"\F177"}.mdi-coin:before{content:"\F178"}.mdi-coins:before{content:"\F694"}.mdi-collage:before{content:"\F640"}.mdi-color-helper:before{content:"\F179"}.mdi-comment:before{content:"\F17A"}.mdi-comment-account:before{content:"\F17B"}.mdi-comment-account-outline:before{content:"\F17C"}.mdi-comment-alert:before{content:"\F17D"}.mdi-comment-alert-outline:before{content:"\F17E"}.mdi-comment-check:before{content:"\F17F"}.mdi-comment-check-outline:before{content:"\F180"}.mdi-comment-multiple-outline:before{content:"\F181"}.mdi-comment-outline:before{content:"\F182"}.mdi-comment-plus-outline:before{content:"\F183"}.mdi-comment-processing:before{content:"\F184"}.mdi-comment-processing-outline:before{content:"\F185"}.mdi-comment-question-outline:before{content:"\F186"}.mdi-comment-remove-outline:before{content:"\F187"}.mdi-comment-text:before{content:"\F188"}.mdi-comment-text-outline:before{content:"\F189"}.mdi-compare:before{content:"\F18A"}.mdi-compass:before{content:"\F18B"}.mdi-compass-outline:before{content:"\F18C"}.mdi-console:before{content:"\F18D"}.mdi-console-line:before{content:"\F7B6"}.mdi-contact-mail:before{content:"\F18E"}.mdi-contacts:before{content:"\F6CA"}.mdi-content-copy:before{content:"\F18F"}.mdi-content-cut:before{content:"\F190"}.mdi-content-duplicate:before{content:"\F191"}.mdi-content-paste:before{content:"\F192"}.mdi-content-save:before{content:"\F193"}.mdi-content-save-all:before{content:"\F194"}.mdi-content-save-settings:before{content:"\F61B"}.mdi-contrast:before{content:"\F195"}.mdi-contrast-box:before{content:"\F196"}.mdi-contrast-circle:before{content:"\F197"}.mdi-cookie:before{content:"\F198"}.mdi-copyright:before{content:"\F5E6"}.mdi-corn:before{content:"\F7B7"}.mdi-counter:before{content:"\F199"}.mdi-cow:before{content:"\F19A"}.mdi-creation:before{content:"\F1C9"}.mdi-credit-card:before{content:"\F19B"}.mdi-credit-card-multiple:before{content:"\F19C"}.mdi-credit-card-off:before{content:"\F5E4"}.mdi-credit-card-plus:before{content:"\F675"}.mdi-credit-card-scan:before{content:"\F19D"}.mdi-crop:before{content:"\F19E"}.mdi-crop-free:before{content:"\F19F"}.mdi-crop-landscape:before{content:"\F1A0"}.mdi-crop-portrait:before{content:"\F1A1"}.mdi-crop-rotate:before{content:"\F695"}.mdi-crop-square:before{content:"\F1A2"}.mdi-crosshairs:before{content:"\F1A3"}.mdi-crosshairs-gps:before{content:"\F1A4"}.mdi-crown:before{content:"\F1A5"}.mdi-cube:before{content:"\F1A6"}.mdi-cube-outline:before{content:"\F1A7"}.mdi-cube-send:before{content:"\F1A8"}.mdi-cube-unfolded:before{content:"\F1A9"}.mdi-cup:before{content:"\F1AA"}.mdi-cup-off:before{content:"\F5E5"}.mdi-cup-water:before{content:"\F1AB"}.mdi-currency-btc:before{content:"\F1AC"}.mdi-currency-chf:before{content:"\F7B8"}.mdi-currency-cny:before{content:"\F7B9"}.mdi-currency-eth:before{content:"\F7BA"}.mdi-currency-eur:before{content:"\F1AD"}.mdi-currency-gbp:before{content:"\F1AE"}.mdi-currency-inr:before{content:"\F1AF"}.mdi-currency-jpy:before{content:"\F7BB"}.mdi-currency-krw:before{content:"\F7BC"}.mdi-currency-ngn:before{content:"\F1B0"}.mdi-currency-rub:before{content:"\F1B1"}.mdi-currency-sign:before{content:"\F7BD"}.mdi-currency-try:before{content:"\F1B2"}.mdi-currency-twd:before{content:"\F7BE"}.mdi-currency-usd:before{content:"\F1B3"}.mdi-currency-usd-off:before{content:"\F679"}.mdi-cursor-default:before{content:"\F1B4"}.mdi-cursor-default-outline:before{content:"\F1B5"}.mdi-cursor-move:before{content:"\F1B6"}.mdi-cursor-pointer:before{content:"\F1B7"}.mdi-cursor-text:before{content:"\F5E7"}.mdi-database:before{content:"\F1B8"}.mdi-database-minus:before{content:"\F1B9"}.mdi-database-plus:before{content:"\F1BA"}.mdi-debug-step-into:before{content:"\F1BB"}.mdi-debug-step-out:before{content:"\F1BC"}.mdi-debug-step-over:before{content:"\F1BD"}.mdi-decagram:before{content:"\F76B"}.mdi-decagram-outline:before{content:"\F76C"}.mdi-decimal-decrease:before{content:"\F1BE"}.mdi-decimal-increase:before{content:"\F1BF"}.mdi-delete:before{content:"\F1C0"}.mdi-delete-circle:before{content:"\F682"}.mdi-delete-empty:before{content:"\F6CB"}.mdi-delete-forever:before{content:"\F5E8"}.mdi-delete-sweep:before{content:"\F5E9"}.mdi-delete-variant:before{content:"\F1C1"}.mdi-delta:before{content:"\F1C2"}.mdi-deskphone:before{content:"\F1C3"}.mdi-desktop-classic:before{content:"\F7BF"}.mdi-desktop-mac:before{content:"\F1C4"}.mdi-desktop-tower:before{content:"\F1C5"}.mdi-details:before{content:"\F1C6"}.mdi-developer-board:before{content:"\F696"}.mdi-deviantart:before{content:"\F1C7"}.mdi-dialpad:before{content:"\F61C"}.mdi-diamond:before{content:"\F1C8"}.mdi-dice-1:before{content:"\F1CA"}.mdi-dice-2:before{content:"\F1CB"}.mdi-dice-3:before{content:"\F1CC"}.mdi-dice-4:before{content:"\F1CD"}.mdi-dice-5:before{content:"\F1CE"}.mdi-dice-6:before{content:"\F1CF"}.mdi-dice-d10:before{content:"\F76E"}.mdi-dice-d20:before{content:"\F5EA"}.mdi-dice-d4:before{content:"\F5EB"}.mdi-dice-d6:before{content:"\F5EC"}.mdi-dice-d8:before{content:"\F5ED"}.mdi-dice-multiple:before{content:"\F76D"}.mdi-dictionary:before{content:"\F61D"}.mdi-dip-switch:before{content:"\F7C0"}.mdi-directions:before{content:"\F1D0"}.mdi-directions-fork:before{content:"\F641"}.mdi-discord:before{content:"\F66F"}.mdi-disk:before{content:"\F5EE"}.mdi-disk-alert:before{content:"\F1D1"}.mdi-disqus:before{content:"\F1D2"}.mdi-disqus-outline:before{content:"\F1D3"}.mdi-division:before{content:"\F1D4"}.mdi-division-box:before{content:"\F1D5"}.mdi-dna:before{content:"\F683"}.mdi-dns:before{content:"\F1D6"}.mdi-do-not-disturb:before{content:"\F697"}.mdi-do-not-disturb-off:before{content:"\F698"}.mdi-dolby:before{content:"\F6B2"}.mdi-domain:before{content:"\F1D7"}.mdi-donkey:before{content:"\F7C1"}.mdi-dots-horizontal:before{content:"\F1D8"}.mdi-dots-horizontal-circle:before{content:"\F7C2"}.mdi-dots-vertical:before{content:"\F1D9"}.mdi-dots-vertical-circle:before{content:"\F7C3"}.mdi-douban:before{content:"\F699"}.mdi-download:before{content:"\F1DA"}.mdi-download-network:before{content:"\F6F3"}.mdi-drag:before{content:"\F1DB"}.mdi-drag-horizontal:before{content:"\F1DC"}.mdi-drag-vertical:before{content:"\F1DD"}.mdi-drawing:before{content:"\F1DE"}.mdi-drawing-box:before{content:"\F1DF"}.mdi-dribbble:before{content:"\F1E0"}.mdi-dribbble-box:before{content:"\F1E1"}.mdi-drone:before{content:"\F1E2"}.mdi-dropbox:before{content:"\F1E3"}.mdi-drupal:before{content:"\F1E4"}.mdi-duck:before{content:"\F1E5"}.mdi-dumbbell:before{content:"\F1E6"}.mdi-ear-hearing:before{content:"\F7C4"}.mdi-earth:before{content:"\F1E7"}.mdi-earth-box:before{content:"\F6CC"}.mdi-earth-box-off:before{content:"\F6CD"}.mdi-earth-off:before{content:"\F1E8"}.mdi-edge:before{content:"\F1E9"}.mdi-eject:before{content:"\F1EA"}.mdi-elephant:before{content:"\F7C5"}.mdi-elevation-decline:before{content:"\F1EB"}.mdi-elevation-rise:before{content:"\F1EC"}.mdi-elevator:before{content:"\F1ED"}.mdi-email:before{content:"\F1EE"}.mdi-email-alert:before{content:"\F6CE"}.mdi-email-open:before{content:"\F1EF"}.mdi-email-open-outline:before{content:"\F5EF"}.mdi-email-outline:before{content:"\F1F0"}.mdi-email-secure:before{content:"\F1F1"}.mdi-email-variant:before{content:"\F5F0"}.mdi-emby:before{content:"\F6B3"}.mdi-emoticon:before{content:"\F1F2"}.mdi-emoticon-cool:before{content:"\F1F3"}.mdi-emoticon-dead:before{content:"\F69A"}.mdi-emoticon-devil:before{content:"\F1F4"}.mdi-emoticon-excited:before{content:"\F69B"}.mdi-emoticon-happy:before{content:"\F1F5"}.mdi-emoticon-neutral:before{content:"\F1F6"}.mdi-emoticon-poop:before{content:"\F1F7"}.mdi-emoticon-sad:before{content:"\F1F8"}.mdi-emoticon-tongue:before{content:"\F1F9"}.mdi-engine:before{content:"\F1FA"}.mdi-engine-outline:before{content:"\F1FB"}.mdi-equal:before{content:"\F1FC"}.mdi-equal-box:before{content:"\F1FD"}.mdi-eraser:before{content:"\F1FE"}.mdi-eraser-variant:before{content:"\F642"}.mdi-escalator:before{content:"\F1FF"}.mdi-ethernet:before{content:"\F200"}.mdi-ethernet-cable:before{content:"\F201"}.mdi-ethernet-cable-off:before{content:"\F202"}.mdi-etsy:before{content:"\F203"}.mdi-ev-station:before{content:"\F5F1"}.mdi-eventbrite:before{content:"\F7C6"}.mdi-evernote:before{content:"\F204"}.mdi-exclamation:before{content:"\F205"}.mdi-exit-to-app:before{content:"\F206"}.mdi-export:before{content:"\F207"}.mdi-eye:before{content:"\F208"}.mdi-eye-off:before{content:"\F209"}.mdi-eye-off-outline:before{content:"\F6D0"}.mdi-eye-outline:before{content:"\F6CF"}.mdi-eyedropper:before{content:"\F20A"}.mdi-eyedropper-variant:before{content:"\F20B"}.mdi-face:before{content:"\F643"}.mdi-face-profile:before{content:"\F644"}.mdi-facebook:before{content:"\F20C"}.mdi-facebook-box:before{content:"\F20D"}.mdi-facebook-messenger:before{content:"\F20E"}.mdi-factory:before{content:"\F20F"}.mdi-fan:before{content:"\F210"}.mdi-fast-forward:before{content:"\F211"}.mdi-fast-forward-outline:before{content:"\F6D1"}.mdi-fax:before{content:"\F212"}.mdi-feather:before{content:"\F6D2"}.mdi-ferry:before{content:"\F213"}.mdi-file:before{content:"\F214"}.mdi-file-account:before{content:"\F73A"}.mdi-file-chart:before{content:"\F215"}.mdi-file-check:before{content:"\F216"}.mdi-file-cloud:before{content:"\F217"}.mdi-file-delimited:before{content:"\F218"}.mdi-file-document:before{content:"\F219"}.mdi-file-document-box:before{content:"\F21A"}.mdi-file-excel:before{content:"\F21B"}.mdi-file-excel-box:before{content:"\F21C"}.mdi-file-export:before{content:"\F21D"}.mdi-file-find:before{content:"\F21E"}.mdi-file-hidden:before{content:"\F613"}.mdi-file-image:before{content:"\F21F"}.mdi-file-import:before{content:"\F220"}.mdi-file-lock:before{content:"\F221"}.mdi-file-multiple:before{content:"\F222"}.mdi-file-music:before{content:"\F223"}.mdi-file-outline:before{content:"\F224"}.mdi-file-pdf:before{content:"\F225"}.mdi-file-pdf-box:before{content:"\F226"}.mdi-file-plus:before{content:"\F751"}.mdi-file-powerpoint:before{content:"\F227"}.mdi-file-powerpoint-box:before{content:"\F228"}.mdi-file-presentation-box:before{content:"\F229"}.mdi-file-restore:before{content:"\F670"}.mdi-file-send:before{content:"\F22A"}.mdi-file-tree:before{content:"\F645"}.mdi-file-video:before{content:"\F22B"}.mdi-file-word:before{content:"\F22C"}.mdi-file-word-box:before{content:"\F22D"}.mdi-file-xml:before{content:"\F22E"}.mdi-film:before{content:"\F22F"}.mdi-filmstrip:before{content:"\F230"}.mdi-filmstrip-off:before{content:"\F231"}.mdi-filter:before{content:"\F232"}.mdi-filter-outline:before{content:"\F233"}.mdi-filter-remove:before{content:"\F234"}.mdi-filter-remove-outline:before{content:"\F235"}.mdi-filter-variant:before{content:"\F236"}.mdi-find-replace:before{content:"\F6D3"}.mdi-fingerprint:before{content:"\F237"}.mdi-fire:before{content:"\F238"}.mdi-firefox:before{content:"\F239"}.mdi-fish:before{content:"\F23A"}.mdi-flag:before{content:"\F23B"}.mdi-flag-checkered:before{content:"\F23C"}.mdi-flag-outline:before{content:"\F23D"}.mdi-flag-outline-variant:before{content:"\F23E"}.mdi-flag-triangle:before{content:"\F23F"}.mdi-flag-variant:before{content:"\F240"}.mdi-flash:before{content:"\F241"}.mdi-flash-auto:before{content:"\F242"}.mdi-flash-off:before{content:"\F243"}.mdi-flash-outline:before{content:"\F6D4"}.mdi-flash-red-eye:before{content:"\F67A"}.mdi-flashlight:before{content:"\F244"}.mdi-flashlight-off:before{content:"\F245"}.mdi-flask:before{content:"\F093"}.mdi-flask-empty:before{content:"\F094"}.mdi-flask-empty-outline:before{content:"\F095"}.mdi-flask-outline:before{content:"\F096"}.mdi-flattr:before{content:"\F246"}.mdi-flip-to-back:before{content:"\F247"}.mdi-flip-to-front:before{content:"\F248"}.mdi-floppy:before{content:"\F249"}.mdi-flower:before{content:"\F24A"}.mdi-folder:before{content:"\F24B"}.mdi-folder-account:before{content:"\F24C"}.mdi-folder-download:before{content:"\F24D"}.mdi-folder-google-drive:before{content:"\F24E"}.mdi-folder-image:before{content:"\F24F"}.mdi-folder-lock:before{content:"\F250"}.mdi-folder-lock-open:before{content:"\F251"}.mdi-folder-move:before{content:"\F252"}.mdi-folder-multiple:before{content:"\F253"}.mdi-folder-multiple-image:before{content:"\F254"}.mdi-folder-multiple-outline:before{content:"\F255"}.mdi-folder-open:before{content:"\F76F"}.mdi-folder-outline:before{content:"\F256"}.mdi-folder-plus:before{content:"\F257"}.mdi-folder-remove:before{content:"\F258"}.mdi-folder-star:before{content:"\F69C"}.mdi-folder-upload:before{content:"\F259"}.mdi-font-awesome:before{content:"\F03A"}.mdi-food:before{content:"\F25A"}.mdi-food-apple:before{content:"\F25B"}.mdi-food-croissant:before{content:"\F7C7"}.mdi-food-fork-drink:before{content:"\F5F2"}.mdi-food-off:before{content:"\F5F3"}.mdi-food-variant:before{content:"\F25C"}.mdi-football:before{content:"\F25D"}.mdi-football-australian:before{content:"\F25E"}.mdi-football-helmet:before{content:"\F25F"}.mdi-forklift:before{content:"\F7C8"}.mdi-format-align-bottom:before{content:"\F752"}.mdi-format-align-center:before{content:"\F260"}.mdi-format-align-justify:before{content:"\F261"}.mdi-format-align-left:before{content:"\F262"}.mdi-format-align-middle:before{content:"\F753"}.mdi-format-align-right:before{content:"\F263"}.mdi-format-align-top:before{content:"\F754"}.mdi-format-annotation-plus:before{content:"\F646"}.mdi-format-bold:before{content:"\F264"}.mdi-format-clear:before{content:"\F265"}.mdi-format-color-fill:before{content:"\F266"}.mdi-format-color-text:before{content:"\F69D"}.mdi-format-float-center:before{content:"\F267"}.mdi-format-float-left:before{content:"\F268"}.mdi-format-float-none:before{content:"\F269"}.mdi-format-float-right:before{content:"\F26A"}.mdi-format-font:before{content:"\F6D5"}.mdi-format-header-1:before{content:"\F26B"}.mdi-format-header-2:before{content:"\F26C"}.mdi-format-header-3:before{content:"\F26D"}.mdi-format-header-4:before{content:"\F26E"}.mdi-format-header-5:before{content:"\F26F"}.mdi-format-header-6:before{content:"\F270"}.mdi-format-header-decrease:before{content:"\F271"}.mdi-format-header-equal:before{content:"\F272"}.mdi-format-header-increase:before{content:"\F273"}.mdi-format-header-pound:before{content:"\F274"}.mdi-format-horizontal-align-center:before{content:"\F61E"}.mdi-format-horizontal-align-left:before{content:"\F61F"}.mdi-format-horizontal-align-right:before{content:"\F620"}.mdi-format-indent-decrease:before{content:"\F275"}.mdi-format-indent-increase:before{content:"\F276"}.mdi-format-italic:before{content:"\F277"}.mdi-format-line-spacing:before{content:"\F278"}.mdi-format-line-style:before{content:"\F5C8"}.mdi-format-line-weight:before{content:"\F5C9"}.mdi-format-list-bulleted:before{content:"\F279"}.mdi-format-list-bulleted-type:before{content:"\F27A"}.mdi-format-list-checks:before{content:"\F755"}.mdi-format-list-numbers:before{content:"\F27B"}.mdi-format-page-break:before{content:"\F6D6"}.mdi-format-paint:before{content:"\F27C"}.mdi-format-paragraph:before{content:"\F27D"}.mdi-format-pilcrow:before{content:"\F6D7"}.mdi-format-quote-close:before{content:"\F27E"}.mdi-format-quote-open:before{content:"\F756"}.mdi-format-rotate-90:before{content:"\F6A9"}.mdi-format-section:before{content:"\F69E"}.mdi-format-size:before{content:"\F27F"}.mdi-format-strikethrough:before{content:"\F280"}.mdi-format-strikethrough-variant:before{content:"\F281"}.mdi-format-subscript:before{content:"\F282"}.mdi-format-superscript:before{content:"\F283"}.mdi-format-text:before{content:"\F284"}.mdi-format-textdirection-l-to-r:before{content:"\F285"}.mdi-format-textdirection-r-to-l:before{content:"\F286"}.mdi-format-title:before{content:"\F5F4"}.mdi-format-underline:before{content:"\F287"}.mdi-format-vertical-align-bottom:before{content:"\F621"}.mdi-format-vertical-align-center:before{content:"\F622"}.mdi-format-vertical-align-top:before{content:"\F623"}.mdi-format-wrap-inline:before{content:"\F288"}.mdi-format-wrap-square:before{content:"\F289"}.mdi-format-wrap-tight:before{content:"\F28A"}.mdi-format-wrap-top-bottom:before{content:"\F28B"}.mdi-forum:before{content:"\F28C"}.mdi-forward:before{content:"\F28D"}.mdi-foursquare:before{content:"\F28E"}.mdi-fridge:before{content:"\F28F"}.mdi-fridge-filled:before{content:"\F290"}.mdi-fridge-filled-bottom:before{content:"\F291"}.mdi-fridge-filled-top:before{content:"\F292"}.mdi-fuel:before{content:"\F7C9"}.mdi-fullscreen:before{content:"\F293"}.mdi-fullscreen-exit:before{content:"\F294"}.mdi-function:before{content:"\F295"}.mdi-gamepad:before{content:"\F296"}.mdi-gamepad-variant:before{content:"\F297"}.mdi-garage:before{content:"\F6D8"}.mdi-garage-open:before{content:"\F6D9"}.mdi-gas-cylinder:before{content:"\F647"}.mdi-gas-station:before{content:"\F298"}.mdi-gate:before{content:"\F299"}.mdi-gauge:before{content:"\F29A"}.mdi-gavel:before{content:"\F29B"}.mdi-gender-female:before{content:"\F29C"}.mdi-gender-male:before{content:"\F29D"}.mdi-gender-male-female:before{content:"\F29E"}.mdi-gender-transgender:before{content:"\F29F"}.mdi-gesture:before{content:"\F7CA"}.mdi-gesture-double-tap:before{content:"\F73B"}.mdi-gesture-swipe-down:before{content:"\F73C"}.mdi-gesture-swipe-left:before{content:"\F73D"}.mdi-gesture-swipe-right:before{content:"\F73E"}.mdi-gesture-swipe-up:before{content:"\F73F"}.mdi-gesture-tap:before{content:"\F740"}.mdi-gesture-two-double-tap:before{content:"\F741"}.mdi-gesture-two-tap:before{content:"\F742"}.mdi-ghost:before{content:"\F2A0"}.mdi-gift:before{content:"\F2A1"}.mdi-git:before{content:"\F2A2"}.mdi-github-box:before{content:"\F2A3"}.mdi-github-circle:before{content:"\F2A4"}.mdi-github-face:before{content:"\F6DA"}.mdi-glass-flute:before{content:"\F2A5"}.mdi-glass-mug:before{content:"\F2A6"}.mdi-glass-stange:before{content:"\F2A7"}.mdi-glass-tulip:before{content:"\F2A8"}.mdi-glassdoor:before{content:"\F2A9"}.mdi-glasses:before{content:"\F2AA"}.mdi-gmail:before{content:"\F2AB"}.mdi-gnome:before{content:"\F2AC"}.mdi-gondola:before{content:"\F685"}.mdi-google:before{content:"\F2AD"}.mdi-google-analytics:before{content:"\F7CB"}.mdi-google-assistant:before{content:"\F7CC"}.mdi-google-cardboard:before{content:"\F2AE"}.mdi-google-chrome:before{content:"\F2AF"}.mdi-google-circles:before{content:"\F2B0"}.mdi-google-circles-communities:before{content:"\F2B1"}.mdi-google-circles-extended:before{content:"\F2B2"}.mdi-google-circles-group:before{content:"\F2B3"}.mdi-google-controller:before{content:"\F2B4"}.mdi-google-controller-off:before{content:"\F2B5"}.mdi-google-drive:before{content:"\F2B6"}.mdi-google-earth:before{content:"\F2B7"}.mdi-google-glass:before{content:"\F2B8"}.mdi-google-keep:before{content:"\F6DB"}.mdi-google-maps:before{content:"\F5F5"}.mdi-google-nearby:before{content:"\F2B9"}.mdi-google-pages:before{content:"\F2BA"}.mdi-google-photos:before{content:"\F6DC"}.mdi-google-physical-web:before{content:"\F2BB"}.mdi-google-play:before{content:"\F2BC"}.mdi-google-plus:before{content:"\F2BD"}.mdi-google-plus-box:before{content:"\F2BE"}.mdi-google-translate:before{content:"\F2BF"}.mdi-google-wallet:before{content:"\F2C0"}.mdi-gradient:before{content:"\F69F"}.mdi-grease-pencil:before{content:"\F648"}.mdi-grid:before{content:"\F2C1"}.mdi-grid-large:before{content:"\F757"}.mdi-grid-off:before{content:"\F2C2"}.mdi-group:before{content:"\F2C3"}.mdi-guitar-acoustic:before{content:"\F770"}.mdi-guitar-electric:before{content:"\F2C4"}.mdi-guitar-pick:before{content:"\F2C5"}.mdi-guitar-pick-outline:before{content:"\F2C6"}.mdi-hackernews:before{content:"\F624"}.mdi-hamburger:before{content:"\F684"}.mdi-hand-pointing-right:before{content:"\F2C7"}.mdi-hanger:before{content:"\F2C8"}.mdi-hangouts:before{content:"\F2C9"}.mdi-harddisk:before{content:"\F2CA"}.mdi-headphones:before{content:"\F2CB"}.mdi-headphones-box:before{content:"\F2CC"}.mdi-headphones-off:before{content:"\F7CD"}.mdi-headphones-settings:before{content:"\F2CD"}.mdi-headset:before{content:"\F2CE"}.mdi-headset-dock:before{content:"\F2CF"}.mdi-headset-off:before{content:"\F2D0"}.mdi-heart:before{content:"\F2D1"}.mdi-heart-box:before{content:"\F2D2"}.mdi-heart-box-outline:before{content:"\F2D3"}.mdi-heart-broken:before{content:"\F2D4"}.mdi-heart-half:before{content:"\F6DE"}.mdi-heart-half-full:before{content:"\F6DD"}.mdi-heart-half-outline:before{content:"\F6DF"}.mdi-heart-off:before{content:"\F758"}.mdi-heart-outline:before{content:"\F2D5"}.mdi-heart-pulse:before{content:"\F5F6"}.mdi-help:before{content:"\F2D6"}.mdi-help-box:before{content:"\F78A"}.mdi-help-circle:before{content:"\F2D7"}.mdi-help-circle-outline:before{content:"\F625"}.mdi-help-network:before{content:"\F6F4"}.mdi-hexagon:before{content:"\F2D8"}.mdi-hexagon-multiple:before{content:"\F6E0"}.mdi-hexagon-outline:before{content:"\F2D9"}.mdi-high-definition:before{content:"\F7CE"}.mdi-highway:before{content:"\F5F7"}.mdi-history:before{content:"\F2DA"}.mdi-hololens:before{content:"\F2DB"}.mdi-home:before{content:"\F2DC"}.mdi-home-assistant:before{content:"\F7CF"}.mdi-home-automation:before{content:"\F7D0"}.mdi-home-circle:before{content:"\F7D1"}.mdi-home-map-marker:before{content:"\F5F8"}.mdi-home-modern:before{content:"\F2DD"}.mdi-home-outline:before{content:"\F6A0"}.mdi-home-variant:before{content:"\F2DE"}.mdi-hook:before{content:"\F6E1"}.mdi-hook-off:before{content:"\F6E2"}.mdi-hops:before{content:"\F2DF"}.mdi-hospital:before{content:"\F2E0"}.mdi-hospital-building:before{content:"\F2E1"}.mdi-hospital-marker:before{content:"\F2E2"}.mdi-hotel:before{content:"\F2E3"}.mdi-houzz:before{content:"\F2E4"}.mdi-houzz-box:before{content:"\F2E5"}.mdi-human:before{content:"\F2E6"}.mdi-human-child:before{content:"\F2E7"}.mdi-human-female:before{content:"\F649"}.mdi-human-greeting:before{content:"\F64A"}.mdi-human-handsdown:before{content:"\F64B"}.mdi-human-handsup:before{content:"\F64C"}.mdi-human-male:before{content:"\F64D"}.mdi-human-male-female:before{content:"\F2E8"}.mdi-human-pregnant:before{content:"\F5CF"}.mdi-humble-bundle:before{content:"\F743"}.mdi-image:before{content:"\F2E9"}.mdi-image-album:before{content:"\F2EA"}.mdi-image-area:before{content:"\F2EB"}.mdi-image-area-close:before{content:"\F2EC"}.mdi-image-broken:before{content:"\F2ED"}.mdi-image-broken-variant:before{content:"\F2EE"}.mdi-image-filter:before{content:"\F2EF"}.mdi-image-filter-black-white:before{content:"\F2F0"}.mdi-image-filter-center-focus:before{content:"\F2F1"}.mdi-image-filter-center-focus-weak:before{content:"\F2F2"}.mdi-image-filter-drama:before{content:"\F2F3"}.mdi-image-filter-frames:before{content:"\F2F4"}.mdi-image-filter-hdr:before{content:"\F2F5"}.mdi-image-filter-none:before{content:"\F2F6"}.mdi-image-filter-tilt-shift:before{content:"\F2F7"}.mdi-image-filter-vintage:before{content:"\F2F8"}.mdi-image-multiple:before{content:"\F2F9"}.mdi-import:before{content:"\F2FA"}.mdi-inbox:before{content:"\F686"}.mdi-inbox-arrow-down:before{content:"\F2FB"}.mdi-inbox-arrow-up:before{content:"\F3D1"}.mdi-incognito:before{content:"\F5F9"}.mdi-infinity:before{content:"\F6E3"}.mdi-information:before{content:"\F2FC"}.mdi-information-outline:before{content:"\F2FD"}.mdi-information-variant:before{content:"\F64E"}.mdi-instagram:before{content:"\F2FE"}.mdi-instapaper:before{content:"\F2FF"}.mdi-internet-explorer:before{content:"\F300"}.mdi-invert-colors:before{content:"\F301"}.mdi-itunes:before{content:"\F676"}.mdi-jeepney:before{content:"\F302"}.mdi-jira:before{content:"\F303"}.mdi-jsfiddle:before{content:"\F304"}.mdi-json:before{content:"\F626"}.mdi-keg:before{content:"\F305"}.mdi-kettle:before{content:"\F5FA"}.mdi-key:before{content:"\F306"}.mdi-key-change:before{content:"\F307"}.mdi-key-minus:before{content:"\F308"}.mdi-key-plus:before{content:"\F309"}.mdi-key-remove:before{content:"\F30A"}.mdi-key-variant:before{content:"\F30B"}.mdi-keyboard:before{content:"\F30C"}.mdi-keyboard-backspace:before{content:"\F30D"}.mdi-keyboard-caps:before{content:"\F30E"}.mdi-keyboard-close:before{content:"\F30F"}.mdi-keyboard-off:before{content:"\F310"}.mdi-keyboard-return:before{content:"\F311"}.mdi-keyboard-tab:before{content:"\F312"}.mdi-keyboard-variant:before{content:"\F313"}.mdi-kickstarter:before{content:"\F744"}.mdi-kodi:before{content:"\F314"}.mdi-label:before{content:"\F315"}.mdi-label-outline:before{content:"\F316"}.mdi-lambda:before{content:"\F627"}.mdi-lamp:before{content:"\F6B4"}.mdi-lan:before{content:"\F317"}.mdi-lan-connect:before{content:"\F318"}.mdi-lan-disconnect:before{content:"\F319"}.mdi-lan-pending:before{content:"\F31A"}.mdi-language-c:before{content:"\F671"}.mdi-language-cpp:before{content:"\F672"}.mdi-language-csharp:before{content:"\F31B"}.mdi-language-css3:before{content:"\F31C"}.mdi-language-go:before{content:"\F7D2"}.mdi-language-html5:before{content:"\F31D"}.mdi-language-javascript:before{content:"\F31E"}.mdi-language-php:before{content:"\F31F"}.mdi-language-python:before{content:"\F320"}.mdi-language-python-text:before{content:"\F321"}.mdi-language-r:before{content:"\F7D3"}.mdi-language-swift:before{content:"\F6E4"}.mdi-language-typescript:before{content:"\F6E5"}.mdi-laptop:before{content:"\F322"}.mdi-laptop-chromebook:before{content:"\F323"}.mdi-laptop-mac:before{content:"\F324"}.mdi-laptop-off:before{content:"\F6E6"}.mdi-laptop-windows:before{content:"\F325"}.mdi-lastfm:before{content:"\F326"}.mdi-launch:before{content:"\F327"}.mdi-lava-lamp:before{content:"\F7D4"}.mdi-layers:before{content:"\F328"}.mdi-layers-off:before{content:"\F329"}.mdi-lead-pencil:before{content:"\F64F"}.mdi-leaf:before{content:"\F32A"}.mdi-led-off:before{content:"\F32B"}.mdi-led-on:before{content:"\F32C"}.mdi-led-outline:before{content:"\F32D"}.mdi-led-strip:before{content:"\F7D5"}.mdi-led-variant-off:before{content:"\F32E"}.mdi-led-variant-on:before{content:"\F32F"}.mdi-led-variant-outline:before{content:"\F330"}.mdi-library:before{content:"\F331"}.mdi-library-books:before{content:"\F332"}.mdi-library-music:before{content:"\F333"}.mdi-library-plus:before{content:"\F334"}.mdi-lightbulb:before{content:"\F335"}.mdi-lightbulb-on:before{content:"\F6E7"}.mdi-lightbulb-on-outline:before{content:"\F6E8"}.mdi-lightbulb-outline:before{content:"\F336"}.mdi-link:before{content:"\F337"}.mdi-link-off:before{content:"\F338"}.mdi-link-variant:before{content:"\F339"}.mdi-link-variant-off:before{content:"\F33A"}.mdi-linkedin:before{content:"\F33B"}.mdi-linkedin-box:before{content:"\F33C"}.mdi-linux:before{content:"\F33D"}.mdi-loading:before{content:"\F771"}.mdi-lock:before{content:"\F33E"}.mdi-lock-open:before{content:"\F33F"}.mdi-lock-open-outline:before{content:"\F340"}.mdi-lock-outline:before{content:"\F341"}.mdi-lock-pattern:before{content:"\F6E9"}.mdi-lock-plus:before{content:"\F5FB"}.mdi-lock-reset:before{content:"\F772"}.mdi-locker:before{content:"\F7D6"}.mdi-locker-multiple:before{content:"\F7D7"}.mdi-login:before{content:"\F342"}.mdi-login-variant:before{content:"\F5FC"}.mdi-logout:before{content:"\F343"}.mdi-logout-variant:before{content:"\F5FD"}.mdi-looks:before{content:"\F344"}.mdi-loop:before{content:"\F6EA"}.mdi-loupe:before{content:"\F345"}.mdi-lumx:before{content:"\F346"}.mdi-magnet:before{content:"\F347"}.mdi-magnet-on:before{content:"\F348"}.mdi-magnify:before{content:"\F349"}.mdi-magnify-minus:before{content:"\F34A"}.mdi-magnify-minus-outline:before{content:"\F6EB"}.mdi-magnify-plus:before{content:"\F34B"}.mdi-magnify-plus-outline:before{content:"\F6EC"}.mdi-mail-ru:before{content:"\F34C"}.mdi-mailbox:before{content:"\F6ED"}.mdi-map:before{content:"\F34D"}.mdi-map-marker:before{content:"\F34E"}.mdi-map-marker-circle:before{content:"\F34F"}.mdi-map-marker-minus:before{content:"\F650"}.mdi-map-marker-multiple:before{content:"\F350"}.mdi-map-marker-off:before{content:"\F351"}.mdi-map-marker-outline:before{content:"\F7D8"}.mdi-map-marker-plus:before{content:"\F651"}.mdi-map-marker-radius:before{content:"\F352"}.mdi-margin:before{content:"\F353"}.mdi-markdown:before{content:"\F354"}.mdi-marker:before{content:"\F652"}.mdi-marker-check:before{content:"\F355"}.mdi-martini:before{content:"\F356"}.mdi-material-ui:before{content:"\F357"}.mdi-math-compass:before{content:"\F358"}.mdi-matrix:before{content:"\F628"}.mdi-maxcdn:before{content:"\F359"}.mdi-medical-bag:before{content:"\F6EE"}.mdi-medium:before{content:"\F35A"}.mdi-memory:before{content:"\F35B"}.mdi-menu:before{content:"\F35C"}.mdi-menu-down:before{content:"\F35D"}.mdi-menu-down-outline:before{content:"\F6B5"}.mdi-menu-left:before{content:"\F35E"}.mdi-menu-right:before{content:"\F35F"}.mdi-menu-up:before{content:"\F360"}.mdi-menu-up-outline:before{content:"\F6B6"}.mdi-message:before{content:"\F361"}.mdi-message-alert:before{content:"\F362"}.mdi-message-bulleted:before{content:"\F6A1"}.mdi-message-bulleted-off:before{content:"\F6A2"}.mdi-message-draw:before{content:"\F363"}.mdi-message-image:before{content:"\F364"}.mdi-message-outline:before{content:"\F365"}.mdi-message-plus:before{content:"\F653"}.mdi-message-processing:before{content:"\F366"}.mdi-message-reply:before{content:"\F367"}.mdi-message-reply-text:before{content:"\F368"}.mdi-message-settings:before{content:"\F6EF"}.mdi-message-settings-variant:before{content:"\F6F0"}.mdi-message-text:before{content:"\F369"}.mdi-message-text-outline:before{content:"\F36A"}.mdi-message-video:before{content:"\F36B"}.mdi-meteor:before{content:"\F629"}.mdi-metronome:before{content:"\F7D9"}.mdi-metronome-tick:before{content:"\F7DA"}.mdi-micro-sd:before{content:"\F7DB"}.mdi-microphone:before{content:"\F36C"}.mdi-microphone-off:before{content:"\F36D"}.mdi-microphone-outline:before{content:"\F36E"}.mdi-microphone-settings:before{content:"\F36F"}.mdi-microphone-variant:before{content:"\F370"}.mdi-microphone-variant-off:before{content:"\F371"}.mdi-microscope:before{content:"\F654"}.mdi-microsoft:before{content:"\F372"}.mdi-minecraft:before{content:"\F373"}.mdi-minus:before{content:"\F374"}.mdi-minus-box:before{content:"\F375"}.mdi-minus-box-outline:before{content:"\F6F1"}.mdi-minus-circle:before{content:"\F376"}.mdi-minus-circle-outline:before{content:"\F377"}.mdi-minus-network:before{content:"\F378"}.mdi-mixcloud:before{content:"\F62A"}.mdi-mixer:before{content:"\F7DC"}.mdi-monitor:before{content:"\F379"}.mdi-monitor-multiple:before{content:"\F37A"}.mdi-more:before{content:"\F37B"}.mdi-motorbike:before{content:"\F37C"}.mdi-mouse:before{content:"\F37D"}.mdi-mouse-off:before{content:"\F37E"}.mdi-mouse-variant:before{content:"\F37F"}.mdi-mouse-variant-off:before{content:"\F380"}.mdi-move-resize:before{content:"\F655"}.mdi-move-resize-variant:before{content:"\F656"}.mdi-movie:before{content:"\F381"}.mdi-movie-roll:before{content:"\F7DD"}.mdi-multiplication:before{content:"\F382"}.mdi-multiplication-box:before{content:"\F383"}.mdi-mushroom:before{content:"\F7DE"}.mdi-mushroom-outline:before{content:"\F7DF"}.mdi-music:before{content:"\F759"}.mdi-music-box:before{content:"\F384"}.mdi-music-box-outline:before{content:"\F385"}.mdi-music-circle:before{content:"\F386"}.mdi-music-note:before{content:"\F387"}.mdi-music-note-bluetooth:before{content:"\F5FE"}.mdi-music-note-bluetooth-off:before{content:"\F5FF"}.mdi-music-note-eighth:before{content:"\F388"}.mdi-music-note-half:before{content:"\F389"}.mdi-music-note-off:before{content:"\F38A"}.mdi-music-note-quarter:before{content:"\F38B"}.mdi-music-note-sixteenth:before{content:"\F38C"}.mdi-music-note-whole:before{content:"\F38D"}.mdi-music-off:before{content:"\F75A"}.mdi-nature:before{content:"\F38E"}.mdi-nature-people:before{content:"\F38F"}.mdi-navigation:before{content:"\F390"}.mdi-near-me:before{content:"\F5CD"}.mdi-needle:before{content:"\F391"}.mdi-nest-protect:before{content:"\F392"}.mdi-nest-thermostat:before{content:"\F393"}.mdi-netflix:before{content:"\F745"}.mdi-network:before{content:"\F6F2"}.mdi-new-box:before{content:"\F394"}.mdi-newspaper:before{content:"\F395"}.mdi-nfc:before{content:"\F396"}.mdi-nfc-tap:before{content:"\F397"}.mdi-nfc-variant:before{content:"\F398"}.mdi-ninja:before{content:"\F773"}.mdi-nintendo-switch:before{content:"\F7E0"}.mdi-nodejs:before{content:"\F399"}.mdi-note:before{content:"\F39A"}.mdi-note-multiple:before{content:"\F6B7"}.mdi-note-multiple-outline:before{content:"\F6B8"}.mdi-note-outline:before{content:"\F39B"}.mdi-note-plus:before{content:"\F39C"}.mdi-note-plus-outline:before{content:"\F39D"}.mdi-note-text:before{content:"\F39E"}.mdi-notification-clear-all:before{content:"\F39F"}.mdi-npm:before{content:"\F6F6"}.mdi-nuke:before{content:"\F6A3"}.mdi-null:before{content:"\F7E1"}.mdi-numeric:before{content:"\F3A0"}.mdi-numeric-0-box:before{content:"\F3A1"}.mdi-numeric-0-box-multiple-outline:before{content:"\F3A2"}.mdi-numeric-0-box-outline:before{content:"\F3A3"}.mdi-numeric-1-box:before{content:"\F3A4"}.mdi-numeric-1-box-multiple-outline:before{content:"\F3A5"}.mdi-numeric-1-box-outline:before{content:"\F3A6"}.mdi-numeric-2-box:before{content:"\F3A7"}.mdi-numeric-2-box-multiple-outline:before{content:"\F3A8"}.mdi-numeric-2-box-outline:before{content:"\F3A9"}.mdi-numeric-3-box:before{content:"\F3AA"}.mdi-numeric-3-box-multiple-outline:before{content:"\F3AB"}.mdi-numeric-3-box-outline:before{content:"\F3AC"}.mdi-numeric-4-box:before{content:"\F3AD"}.mdi-numeric-4-box-multiple-outline:before{content:"\F3AE"}.mdi-numeric-4-box-outline:before{content:"\F3AF"}.mdi-numeric-5-box:before{content:"\F3B0"}.mdi-numeric-5-box-multiple-outline:before{content:"\F3B1"}.mdi-numeric-5-box-outline:before{content:"\F3B2"}.mdi-numeric-6-box:before{content:"\F3B3"}.mdi-numeric-6-box-multiple-outline:before{content:"\F3B4"}.mdi-numeric-6-box-outline:before{content:"\F3B5"}.mdi-numeric-7-box:before{content:"\F3B6"}.mdi-numeric-7-box-multiple-outline:before{content:"\F3B7"}.mdi-numeric-7-box-outline:before{content:"\F3B8"}.mdi-numeric-8-box:before{content:"\F3B9"}.mdi-numeric-8-box-multiple-outline:before{content:"\F3BA"}.mdi-numeric-8-box-outline:before{content:"\F3BB"}.mdi-numeric-9-box:before{content:"\F3BC"}.mdi-numeric-9-box-multiple-outline:before{content:"\F3BD"}.mdi-numeric-9-box-outline:before{content:"\F3BE"}.mdi-numeric-9-plus-box:before{content:"\F3BF"}.mdi-numeric-9-plus-box-multiple-outline:before{content:"\F3C0"}.mdi-numeric-9-plus-box-outline:before{content:"\F3C1"}.mdi-nut:before{content:"\F6F7"}.mdi-nutrition:before{content:"\F3C2"}.mdi-oar:before{content:"\F67B"}.mdi-octagon:before{content:"\F3C3"}.mdi-octagon-outline:before{content:"\F3C4"}.mdi-octagram:before{content:"\F6F8"}.mdi-octagram-outline:before{content:"\F774"}.mdi-odnoklassniki:before{content:"\F3C5"}.mdi-office:before{content:"\F3C6"}.mdi-oil:before{content:"\F3C7"}.mdi-oil-temperature:before{content:"\F3C8"}.mdi-omega:before{content:"\F3C9"}.mdi-onedrive:before{content:"\F3CA"}.mdi-onenote:before{content:"\F746"}.mdi-opacity:before{content:"\F5CC"}.mdi-open-in-app:before{content:"\F3CB"}.mdi-open-in-new:before{content:"\F3CC"}.mdi-openid:before{content:"\F3CD"}.mdi-opera:before{content:"\F3CE"}.mdi-orbit:before{content:"\F018"}.mdi-ornament:before{content:"\F3CF"}.mdi-ornament-variant:before{content:"\F3D0"}.mdi-owl:before{content:"\F3D2"}.mdi-package:before{content:"\F3D3"}.mdi-package-down:before{content:"\F3D4"}.mdi-package-up:before{content:"\F3D5"}.mdi-package-variant:before{content:"\F3D6"}.mdi-package-variant-closed:before{content:"\F3D7"}.mdi-page-first:before{content:"\F600"}.mdi-page-last:before{content:"\F601"}.mdi-page-layout-body:before{content:"\F6F9"}.mdi-page-layout-footer:before{content:"\F6FA"}.mdi-page-layout-header:before{content:"\F6FB"}.mdi-page-layout-sidebar-left:before{content:"\F6FC"}.mdi-page-layout-sidebar-right:before{content:"\F6FD"}.mdi-palette:before{content:"\F3D8"}.mdi-palette-advanced:before{content:"\F3D9"}.mdi-panda:before{content:"\F3DA"}.mdi-pandora:before{content:"\F3DB"}.mdi-panorama:before{content:"\F3DC"}.mdi-panorama-fisheye:before{content:"\F3DD"}.mdi-panorama-horizontal:before{content:"\F3DE"}.mdi-panorama-vertical:before{content:"\F3DF"}.mdi-panorama-wide-angle:before{content:"\F3E0"}.mdi-paper-cut-vertical:before{content:"\F3E1"}.mdi-paperclip:before{content:"\F3E2"}.mdi-parking:before{content:"\F3E3"}.mdi-passport:before{content:"\F7E2"}.mdi-pause:before{content:"\F3E4"}.mdi-pause-circle:before{content:"\F3E5"}.mdi-pause-circle-outline:before{content:"\F3E6"}.mdi-pause-octagon:before{content:"\F3E7"}.mdi-pause-octagon-outline:before{content:"\F3E8"}.mdi-paw:before{content:"\F3E9"}.mdi-paw-off:before{content:"\F657"}.mdi-pen:before{content:"\F3EA"}.mdi-pencil:before{content:"\F3EB"}.mdi-pencil-box:before{content:"\F3EC"}.mdi-pencil-box-outline:before{content:"\F3ED"}.mdi-pencil-circle:before{content:"\F6FE"}.mdi-pencil-circle-outline:before{content:"\F775"}.mdi-pencil-lock:before{content:"\F3EE"}.mdi-pencil-off:before{content:"\F3EF"}.mdi-pentagon:before{content:"\F6FF"}.mdi-pentagon-outline:before{content:"\F700"}.mdi-percent:before{content:"\F3F0"}.mdi-periodic-table-co2:before{content:"\F7E3"}.mdi-periscope:before{content:"\F747"}.mdi-pharmacy:before{content:"\F3F1"}.mdi-phone:before{content:"\F3F2"}.mdi-phone-bluetooth:before{content:"\F3F3"}.mdi-phone-classic:before{content:"\F602"}.mdi-phone-forward:before{content:"\F3F4"}.mdi-phone-hangup:before{content:"\F3F5"}.mdi-phone-in-talk:before{content:"\F3F6"}.mdi-phone-incoming:before{content:"\F3F7"}.mdi-phone-locked:before{content:"\F3F8"}.mdi-phone-log:before{content:"\F3F9"}.mdi-phone-minus:before{content:"\F658"}.mdi-phone-missed:before{content:"\F3FA"}.mdi-phone-outgoing:before{content:"\F3FB"}.mdi-phone-paused:before{content:"\F3FC"}.mdi-phone-plus:before{content:"\F659"}.mdi-phone-settings:before{content:"\F3FD"}.mdi-phone-voip:before{content:"\F3FE"}.mdi-pi:before{content:"\F3FF"}.mdi-pi-box:before{content:"\F400"}.mdi-piano:before{content:"\F67C"}.mdi-pig:before{content:"\F401"}.mdi-pill:before{content:"\F402"}.mdi-pillar:before{content:"\F701"}.mdi-pin:before{content:"\F403"}.mdi-pin-off:before{content:"\F404"}.mdi-pine-tree:before{content:"\F405"}.mdi-pine-tree-box:before{content:"\F406"}.mdi-pinterest:before{content:"\F407"}.mdi-pinterest-box:before{content:"\F408"}.mdi-pipe:before{content:"\F7E4"}.mdi-pipe-disconnected:before{content:"\F7E5"}.mdi-pistol:before{content:"\F702"}.mdi-pizza:before{content:"\F409"}.mdi-plane-shield:before{content:"\F6BA"}.mdi-play:before{content:"\F40A"}.mdi-play-box-outline:before{content:"\F40B"}.mdi-play-circle:before{content:"\F40C"}.mdi-play-circle-outline:before{content:"\F40D"}.mdi-play-pause:before{content:"\F40E"}.mdi-play-protected-content:before{content:"\F40F"}.mdi-playlist-check:before{content:"\F5C7"}.mdi-playlist-minus:before{content:"\F410"}.mdi-playlist-play:before{content:"\F411"}.mdi-playlist-plus:before{content:"\F412"}.mdi-playlist-remove:before{content:"\F413"}.mdi-playstation:before{content:"\F414"}.mdi-plex:before{content:"\F6B9"}.mdi-plus:before{content:"\F415"}.mdi-plus-box:before{content:"\F416"}.mdi-plus-box-outline:before{content:"\F703"}.mdi-plus-circle:before{content:"\F417"}.mdi-plus-circle-multiple-outline:before{content:"\F418"}.mdi-plus-circle-outline:before{content:"\F419"}.mdi-plus-network:before{content:"\F41A"}.mdi-plus-one:before{content:"\F41B"}.mdi-plus-outline:before{content:"\F704"}.mdi-pocket:before{content:"\F41C"}.mdi-pokeball:before{content:"\F41D"}.mdi-polaroid:before{content:"\F41E"}.mdi-poll:before{content:"\F41F"}.mdi-poll-box:before{content:"\F420"}.mdi-polymer:before{content:"\F421"}.mdi-pool:before{content:"\F606"}.mdi-popcorn:before{content:"\F422"}.mdi-pot:before{content:"\F65A"}.mdi-pot-mix:before{content:"\F65B"}.mdi-pound:before{content:"\F423"}.mdi-pound-box:before{content:"\F424"}.mdi-power:before{content:"\F425"}.mdi-power-plug:before{content:"\F6A4"}.mdi-power-plug-off:before{content:"\F6A5"}.mdi-power-settings:before{content:"\F426"}.mdi-power-socket:before{content:"\F427"}.mdi-power-socket-eu:before{content:"\F7E6"}.mdi-power-socket-uk:before{content:"\F7E7"}.mdi-power-socket-us:before{content:"\F7E8"}.mdi-prescription:before{content:"\F705"}.mdi-presentation:before{content:"\F428"}.mdi-presentation-play:before{content:"\F429"}.mdi-printer:before{content:"\F42A"}.mdi-printer-3d:before{content:"\F42B"}.mdi-printer-alert:before{content:"\F42C"}.mdi-printer-settings:before{content:"\F706"}.mdi-priority-high:before{content:"\F603"}.mdi-priority-low:before{content:"\F604"}.mdi-professional-hexagon:before{content:"\F42D"}.mdi-projector:before{content:"\F42E"}.mdi-projector-screen:before{content:"\F42F"}.mdi-publish:before{content:"\F6A6"}.mdi-pulse:before{content:"\F430"}.mdi-puzzle:before{content:"\F431"}.mdi-qqchat:before{content:"\F605"}.mdi-qrcode:before{content:"\F432"}.mdi-qrcode-scan:before{content:"\F433"}.mdi-quadcopter:before{content:"\F434"}.mdi-quality-high:before{content:"\F435"}.mdi-quicktime:before{content:"\F436"}.mdi-radar:before{content:"\F437"}.mdi-radiator:before{content:"\F438"}.mdi-radio:before{content:"\F439"}.mdi-radio-handheld:before{content:"\F43A"}.mdi-radio-tower:before{content:"\F43B"}.mdi-radioactive:before{content:"\F43C"}.mdi-radiobox-blank:before{content:"\F43D"}.mdi-radiobox-marked:before{content:"\F43E"}.mdi-raspberrypi:before{content:"\F43F"}.mdi-ray-end:before{content:"\F440"}.mdi-ray-end-arrow:before{content:"\F441"}.mdi-ray-start:before{content:"\F442"}.mdi-ray-start-arrow:before{content:"\F443"}.mdi-ray-start-end:before{content:"\F444"}.mdi-ray-vertex:before{content:"\F445"}.mdi-rdio:before{content:"\F446"}.mdi-react:before{content:"\F707"}.mdi-read:before{content:"\F447"}.mdi-readability:before{content:"\F448"}.mdi-receipt:before{content:"\F449"}.mdi-record:before{content:"\F44A"}.mdi-record-rec:before{content:"\F44B"}.mdi-recycle:before{content:"\F44C"}.mdi-reddit:before{content:"\F44D"}.mdi-redo:before{content:"\F44E"}.mdi-redo-variant:before{content:"\F44F"}.mdi-refresh:before{content:"\F450"}.mdi-regex:before{content:"\F451"}.mdi-relative-scale:before{content:"\F452"}.mdi-reload:before{content:"\F453"}.mdi-remote:before{content:"\F454"}.mdi-rename-box:before{content:"\F455"}.mdi-reorder-horizontal:before{content:"\F687"}.mdi-reorder-vertical:before{content:"\F688"}.mdi-repeat:before{content:"\F456"}.mdi-repeat-off:before{content:"\F457"}.mdi-repeat-once:before{content:"\F458"}.mdi-replay:before{content:"\F459"}.mdi-reply:before{content:"\F45A"}.mdi-reply-all:before{content:"\F45B"}.mdi-reproduction:before{content:"\F45C"}.mdi-resize-bottom-right:before{content:"\F45D"}.mdi-responsive:before{content:"\F45E"}.mdi-restart:before{content:"\F708"}.mdi-restore:before{content:"\F6A7"}.mdi-rewind:before{content:"\F45F"}.mdi-rewind-outline:before{content:"\F709"}.mdi-rhombus:before{content:"\F70A"}.mdi-rhombus-outline:before{content:"\F70B"}.mdi-ribbon:before{content:"\F460"}.mdi-rice:before{content:"\F7E9"}.mdi-ring:before{content:"\F7EA"}.mdi-road:before{content:"\F461"}.mdi-road-variant:before{content:"\F462"}.mdi-robot:before{content:"\F6A8"}.mdi-rocket:before{content:"\F463"}.mdi-roomba:before{content:"\F70C"}.mdi-rotate-3d:before{content:"\F464"}.mdi-rotate-left:before{content:"\F465"}.mdi-rotate-left-variant:before{content:"\F466"}.mdi-rotate-right:before{content:"\F467"}.mdi-rotate-right-variant:before{content:"\F468"}.mdi-rounded-corner:before{content:"\F607"}.mdi-router-wireless:before{content:"\F469"}.mdi-routes:before{content:"\F46A"}.mdi-rowing:before{content:"\F608"}.mdi-rss:before{content:"\F46B"}.mdi-rss-box:before{content:"\F46C"}.mdi-ruler:before{content:"\F46D"}.mdi-run:before{content:"\F70D"}.mdi-run-fast:before{content:"\F46E"}.mdi-sale:before{content:"\F46F"}.mdi-sass:before{content:"\F7EB"}.mdi-satellite:before{content:"\F470"}.mdi-satellite-variant:before{content:"\F471"}.mdi-saxophone:before{content:"\F609"}.mdi-scale:before{content:"\F472"}.mdi-scale-balance:before{content:"\F5D1"}.mdi-scale-bathroom:before{content:"\F473"}.mdi-scanner:before{content:"\F6AA"}.mdi-school:before{content:"\F474"}.mdi-screen-rotation:before{content:"\F475"}.mdi-screen-rotation-lock:before{content:"\F476"}.mdi-screwdriver:before{content:"\F477"}.mdi-script:before{content:"\F478"}.mdi-sd:before{content:"\F479"}.mdi-seal:before{content:"\F47A"}.mdi-search-web:before{content:"\F70E"}.mdi-seat-flat:before{content:"\F47B"}.mdi-seat-flat-angled:before{content:"\F47C"}.mdi-seat-individual-suite:before{content:"\F47D"}.mdi-seat-legroom-extra:before{content:"\F47E"}.mdi-seat-legroom-normal:before{content:"\F47F"}.mdi-seat-legroom-reduced:before{content:"\F480"}.mdi-seat-recline-extra:before{content:"\F481"}.mdi-seat-recline-normal:before{content:"\F482"}.mdi-security:before{content:"\F483"}.mdi-security-home:before{content:"\F689"}.mdi-security-network:before{content:"\F484"}.mdi-select:before{content:"\F485"}.mdi-select-all:before{content:"\F486"}.mdi-select-inverse:before{content:"\F487"}.mdi-select-off:before{content:"\F488"}.mdi-selection:before{content:"\F489"}.mdi-selection-off:before{content:"\F776"}.mdi-send:before{content:"\F48A"}.mdi-send-secure:before{content:"\F7EC"}.mdi-serial-port:before{content:"\F65C"}.mdi-server:before{content:"\F48B"}.mdi-server-minus:before{content:"\F48C"}.mdi-server-network:before{content:"\F48D"}.mdi-server-network-off:before{content:"\F48E"}.mdi-server-off:before{content:"\F48F"}.mdi-server-plus:before{content:"\F490"}.mdi-server-remove:before{content:"\F491"}.mdi-server-security:before{content:"\F492"}.mdi-set-all:before{content:"\F777"}.mdi-set-center:before{content:"\F778"}.mdi-set-center-right:before{content:"\F779"}.mdi-set-left:before{content:"\F77A"}.mdi-set-left-center:before{content:"\F77B"}.mdi-set-left-right:before{content:"\F77C"}.mdi-set-none:before{content:"\F77D"}.mdi-set-right:before{content:"\F77E"}.mdi-settings:before{content:"\F493"}.mdi-settings-box:before{content:"\F494"}.mdi-shape-circle-plus:before{content:"\F65D"}.mdi-shape-plus:before{content:"\F495"}.mdi-shape-polygon-plus:before{content:"\F65E"}.mdi-shape-rectangle-plus:before{content:"\F65F"}.mdi-shape-square-plus:before{content:"\F660"}.mdi-share:before{content:"\F496"}.mdi-share-variant:before{content:"\F497"}.mdi-shield:before{content:"\F498"}.mdi-shield-half-full:before{content:"\F77F"}.mdi-shield-outline:before{content:"\F499"}.mdi-shopping:before{content:"\F49A"}.mdi-shopping-music:before{content:"\F49B"}.mdi-shovel:before{content:"\F70F"}.mdi-shovel-off:before{content:"\F710"}.mdi-shredder:before{content:"\F49C"}.mdi-shuffle:before{content:"\F49D"}.mdi-shuffle-disabled:before{content:"\F49E"}.mdi-shuffle-variant:before{content:"\F49F"}.mdi-sigma:before{content:"\F4A0"}.mdi-sigma-lower:before{content:"\F62B"}.mdi-sign-caution:before{content:"\F4A1"}.mdi-sign-direction:before{content:"\F780"}.mdi-sign-text:before{content:"\F781"}.mdi-signal:before{content:"\F4A2"}.mdi-signal-2g:before{content:"\F711"}.mdi-signal-3g:before{content:"\F712"}.mdi-signal-4g:before{content:"\F713"}.mdi-signal-hspa:before{content:"\F714"}.mdi-signal-hspa-plus:before{content:"\F715"}.mdi-signal-off:before{content:"\F782"}.mdi-signal-variant:before{content:"\F60A"}.mdi-silverware:before{content:"\F4A3"}.mdi-silverware-fork:before{content:"\F4A4"}.mdi-silverware-spoon:before{content:"\F4A5"}.mdi-silverware-variant:before{content:"\F4A6"}.mdi-sim:before{content:"\F4A7"}.mdi-sim-alert:before{content:"\F4A8"}.mdi-sim-off:before{content:"\F4A9"}.mdi-sitemap:before{content:"\F4AA"}.mdi-skip-backward:before{content:"\F4AB"}.mdi-skip-forward:before{content:"\F4AC"}.mdi-skip-next:before{content:"\F4AD"}.mdi-skip-next-circle:before{content:"\F661"}.mdi-skip-next-circle-outline:before{content:"\F662"}.mdi-skip-previous:before{content:"\F4AE"}.mdi-skip-previous-circle:before{content:"\F663"}.mdi-skip-previous-circle-outline:before{content:"\F664"}.mdi-skull:before{content:"\F68B"}.mdi-skype:before{content:"\F4AF"}.mdi-skype-business:before{content:"\F4B0"}.mdi-slack:before{content:"\F4B1"}.mdi-sleep:before{content:"\F4B2"}.mdi-sleep-off:before{content:"\F4B3"}.mdi-smoking:before{content:"\F4B4"}.mdi-smoking-off:before{content:"\F4B5"}.mdi-snapchat:before{content:"\F4B6"}.mdi-snowflake:before{content:"\F716"}.mdi-snowman:before{content:"\F4B7"}.mdi-soccer:before{content:"\F4B8"}.mdi-sofa:before{content:"\F4B9"}.mdi-solid:before{content:"\F68C"}.mdi-sort:before{content:"\F4BA"}.mdi-sort-alphabetical:before{content:"\F4BB"}.mdi-sort-ascending:before{content:"\F4BC"}.mdi-sort-descending:before{content:"\F4BD"}.mdi-sort-numeric:before{content:"\F4BE"}.mdi-sort-variant:before{content:"\F4BF"}.mdi-soundcloud:before{content:"\F4C0"}.mdi-source-branch:before{content:"\F62C"}.mdi-source-commit:before{content:"\F717"}.mdi-source-commit-end:before{content:"\F718"}.mdi-source-commit-end-local:before{content:"\F719"}.mdi-source-commit-local:before{content:"\F71A"}.mdi-source-commit-next-local:before{content:"\F71B"}.mdi-source-commit-start:before{content:"\F71C"}.mdi-source-commit-start-next-local:before{content:"\F71D"}.mdi-source-fork:before{content:"\F4C1"}.mdi-source-merge:before{content:"\F62D"}.mdi-source-pull:before{content:"\F4C2"}.mdi-soy-sauce:before{content:"\F7ED"}.mdi-speaker:before{content:"\F4C3"}.mdi-speaker-off:before{content:"\F4C4"}.mdi-speaker-wireless:before{content:"\F71E"}.mdi-speedometer:before{content:"\F4C5"}.mdi-spellcheck:before{content:"\F4C6"}.mdi-spotify:before{content:"\F4C7"}.mdi-spotlight:before{content:"\F4C8"}.mdi-spotlight-beam:before{content:"\F4C9"}.mdi-spray:before{content:"\F665"}.mdi-square:before{content:"\F763"}.mdi-square-inc:before{content:"\F4CA"}.mdi-square-inc-cash:before{content:"\F4CB"}.mdi-square-outline:before{content:"\F762"}.mdi-square-root:before{content:"\F783"}.mdi-stackexchange:before{content:"\F60B"}.mdi-stackoverflow:before{content:"\F4CC"}.mdi-stadium:before{content:"\F71F"}.mdi-stairs:before{content:"\F4CD"}.mdi-standard-definition:before{content:"\F7EE"}.mdi-star:before{content:"\F4CE"}.mdi-star-circle:before{content:"\F4CF"}.mdi-star-half:before{content:"\F4D0"}.mdi-star-off:before{content:"\F4D1"}.mdi-star-outline:before{content:"\F4D2"}.mdi-steam:before{content:"\F4D3"}.mdi-steering:before{content:"\F4D4"}.mdi-step-backward:before{content:"\F4D5"}.mdi-step-backward-2:before{content:"\F4D6"}.mdi-step-forward:before{content:"\F4D7"}.mdi-step-forward-2:before{content:"\F4D8"}.mdi-stethoscope:before{content:"\F4D9"}.mdi-sticker:before{content:"\F5D0"}.mdi-sticker-emoji:before{content:"\F784"}.mdi-stocking:before{content:"\F4DA"}.mdi-stop:before{content:"\F4DB"}.mdi-stop-circle:before{content:"\F666"}.mdi-stop-circle-outline:before{content:"\F667"}.mdi-store:before{content:"\F4DC"}.mdi-store-24-hour:before{content:"\F4DD"}.mdi-stove:before{content:"\F4DE"}.mdi-subdirectory-arrow-left:before{content:"\F60C"}.mdi-subdirectory-arrow-right:before{content:"\F60D"}.mdi-subway:before{content:"\F6AB"}.mdi-subway-variant:before{content:"\F4DF"}.mdi-summit:before{content:"\F785"}.mdi-sunglasses:before{content:"\F4E0"}.mdi-surround-sound:before{content:"\F5C5"}.mdi-surround-sound-2-0:before{content:"\F7EF"}.mdi-surround-sound-3-1:before{content:"\F7F0"}.mdi-surround-sound-5-1:before{content:"\F7F1"}.mdi-surround-sound-7-1:before{content:"\F7F2"}.mdi-svg:before{content:"\F720"}.mdi-swap-horizontal:before{content:"\F4E1"}.mdi-swap-vertical:before{content:"\F4E2"}.mdi-swim:before{content:"\F4E3"}.mdi-switch:before{content:"\F4E4"}.mdi-sword:before{content:"\F4E5"}.mdi-sword-cross:before{content:"\F786"}.mdi-sync:before{content:"\F4E6"}.mdi-sync-alert:before{content:"\F4E7"}.mdi-sync-off:before{content:"\F4E8"}.mdi-tab:before{content:"\F4E9"}.mdi-tab-plus:before{content:"\F75B"}.mdi-tab-unselected:before{content:"\F4EA"}.mdi-table:before{content:"\F4EB"}.mdi-table-column-plus-after:before{content:"\F4EC"}.mdi-table-column-plus-before:before{content:"\F4ED"}.mdi-table-column-remove:before{content:"\F4EE"}.mdi-table-column-width:before{content:"\F4EF"}.mdi-table-edit:before{content:"\F4F0"}.mdi-table-large:before{content:"\F4F1"}.mdi-table-row-height:before{content:"\F4F2"}.mdi-table-row-plus-after:before{content:"\F4F3"}.mdi-table-row-plus-before:before{content:"\F4F4"}.mdi-table-row-remove:before{content:"\F4F5"}.mdi-tablet:before{content:"\F4F6"}.mdi-tablet-android:before{content:"\F4F7"}.mdi-tablet-ipad:before{content:"\F4F8"}.mdi-taco:before{content:"\F761"}.mdi-tag:before{content:"\F4F9"}.mdi-tag-faces:before{content:"\F4FA"}.mdi-tag-heart:before{content:"\F68A"}.mdi-tag-multiple:before{content:"\F4FB"}.mdi-tag-outline:before{content:"\F4FC"}.mdi-tag-plus:before{content:"\F721"}.mdi-tag-remove:before{content:"\F722"}.mdi-tag-text-outline:before{content:"\F4FD"}.mdi-target:before{content:"\F4FE"}.mdi-taxi:before{content:"\F4FF"}.mdi-teamviewer:before{content:"\F500"}.mdi-telegram:before{content:"\F501"}.mdi-television:before{content:"\F502"}.mdi-television-classic:before{content:"\F7F3"}.mdi-television-guide:before{content:"\F503"}.mdi-temperature-celsius:before{content:"\F504"}.mdi-temperature-fahrenheit:before{content:"\F505"}.mdi-temperature-kelvin:before{content:"\F506"}.mdi-tennis:before{content:"\F507"}.mdi-tent:before{content:"\F508"}.mdi-terrain:before{content:"\F509"}.mdi-test-tube:before{content:"\F668"}.mdi-text-shadow:before{content:"\F669"}.mdi-text-to-speech:before{content:"\F50A"}.mdi-text-to-speech-off:before{content:"\F50B"}.mdi-textbox:before{content:"\F60E"}.mdi-textbox-password:before{content:"\F7F4"}.mdi-texture:before{content:"\F50C"}.mdi-theater:before{content:"\F50D"}.mdi-theme-light-dark:before{content:"\F50E"}.mdi-thermometer:before{content:"\F50F"}.mdi-thermometer-lines:before{content:"\F510"}.mdi-thought-bubble:before{content:"\F7F5"}.mdi-thought-bubble-outline:before{content:"\F7F6"}.mdi-thumb-down:before{content:"\F511"}.mdi-thumb-down-outline:before{content:"\F512"}.mdi-thumb-up:before{content:"\F513"}.mdi-thumb-up-outline:before{content:"\F514"}.mdi-thumbs-up-down:before{content:"\F515"}.mdi-ticket:before{content:"\F516"}.mdi-ticket-account:before{content:"\F517"}.mdi-ticket-confirmation:before{content:"\F518"}.mdi-ticket-percent:before{content:"\F723"}.mdi-tie:before{content:"\F519"}.mdi-tilde:before{content:"\F724"}.mdi-timelapse:before{content:"\F51A"}.mdi-timer:before{content:"\F51B"}.mdi-timer-10:before{content:"\F51C"}.mdi-timer-3:before{content:"\F51D"}.mdi-timer-off:before{content:"\F51E"}.mdi-timer-sand:before{content:"\F51F"}.mdi-timer-sand-empty:before{content:"\F6AC"}.mdi-timer-sand-full:before{content:"\F78B"}.mdi-timetable:before{content:"\F520"}.mdi-toggle-switch:before{content:"\F521"}.mdi-toggle-switch-off:before{content:"\F522"}.mdi-tooltip:before{content:"\F523"}.mdi-tooltip-edit:before{content:"\F524"}.mdi-tooltip-image:before{content:"\F525"}.mdi-tooltip-outline:before{content:"\F526"}.mdi-tooltip-outline-plus:before{content:"\F527"}.mdi-tooltip-text:before{content:"\F528"}.mdi-tooth:before{content:"\F529"}.mdi-tor:before{content:"\F52A"}.mdi-tower-beach:before{content:"\F680"}.mdi-tower-fire:before{content:"\F681"}.mdi-trackpad:before{content:"\F7F7"}.mdi-traffic-light:before{content:"\F52B"}.mdi-train:before{content:"\F52C"}.mdi-tram:before{content:"\F52D"}.mdi-transcribe:before{content:"\F52E"}.mdi-transcribe-close:before{content:"\F52F"}.mdi-transfer:before{content:"\F530"}.mdi-transit-transfer:before{content:"\F6AD"}.mdi-translate:before{content:"\F5CA"}.mdi-treasure-chest:before{content:"\F725"}.mdi-tree:before{content:"\F531"}.mdi-trello:before{content:"\F532"}.mdi-trending-down:before{content:"\F533"}.mdi-trending-neutral:before{content:"\F534"}.mdi-trending-up:before{content:"\F535"}.mdi-triangle:before{content:"\F536"}.mdi-triangle-outline:before{content:"\F537"}.mdi-trophy:before{content:"\F538"}.mdi-trophy-award:before{content:"\F539"}.mdi-trophy-outline:before{content:"\F53A"}.mdi-trophy-variant:before{content:"\F53B"}.mdi-trophy-variant-outline:before{content:"\F53C"}.mdi-truck:before{content:"\F53D"}.mdi-truck-delivery:before{content:"\F53E"}.mdi-truck-fast:before{content:"\F787"}.mdi-truck-trailer:before{content:"\F726"}.mdi-tshirt-crew:before{content:"\F53F"}.mdi-tshirt-v:before{content:"\F540"}.mdi-tumblr:before{content:"\F541"}.mdi-tumblr-reblog:before{content:"\F542"}.mdi-tune:before{content:"\F62E"}.mdi-tune-vertical:before{content:"\F66A"}.mdi-twitch:before{content:"\F543"}.mdi-twitter:before{content:"\F544"}.mdi-twitter-box:before{content:"\F545"}.mdi-twitter-circle:before{content:"\F546"}.mdi-twitter-retweet:before{content:"\F547"}.mdi-uber:before{content:"\F748"}.mdi-ubuntu:before{content:"\F548"}.mdi-ultra-high-definition:before{content:"\F7F8"}.mdi-umbraco:before{content:"\F549"}.mdi-umbrella:before{content:"\F54A"}.mdi-umbrella-outline:before{content:"\F54B"}.mdi-undo:before{content:"\F54C"}.mdi-undo-variant:before{content:"\F54D"}.mdi-unfold-less-horizontal:before{content:"\F54E"}.mdi-unfold-less-vertical:before{content:"\F75F"}.mdi-unfold-more-horizontal:before{content:"\F54F"}.mdi-unfold-more-vertical:before{content:"\F760"}.mdi-ungroup:before{content:"\F550"}.mdi-unity:before{content:"\F6AE"}.mdi-untappd:before{content:"\F551"}.mdi-update:before{content:"\F6AF"}.mdi-upload:before{content:"\F552"}.mdi-upload-network:before{content:"\F6F5"}.mdi-usb:before{content:"\F553"}.mdi-van-passenger:before{content:"\F7F9"}.mdi-van-utility:before{content:"\F7FA"}.mdi-vanish:before{content:"\F7FB"}.mdi-vector-arrange-above:before{content:"\F554"}.mdi-vector-arrange-below:before{content:"\F555"}.mdi-vector-circle:before{content:"\F556"}.mdi-vector-circle-variant:before{content:"\F557"}.mdi-vector-combine:before{content:"\F558"}.mdi-vector-curve:before{content:"\F559"}.mdi-vector-difference:before{content:"\F55A"}.mdi-vector-difference-ab:before{content:"\F55B"}.mdi-vector-difference-ba:before{content:"\F55C"}.mdi-vector-intersection:before{content:"\F55D"}.mdi-vector-line:before{content:"\F55E"}.mdi-vector-point:before{content:"\F55F"}.mdi-vector-polygon:before{content:"\F560"}.mdi-vector-polyline:before{content:"\F561"}.mdi-vector-radius:before{content:"\F749"}.mdi-vector-rectangle:before{content:"\F5C6"}.mdi-vector-selection:before{content:"\F562"}.mdi-vector-square:before{content:"\F001"}.mdi-vector-triangle:before{content:"\F563"}.mdi-vector-union:before{content:"\F564"}.mdi-verified:before{content:"\F565"}.mdi-vibrate:before{content:"\F566"}.mdi-video:before{content:"\F567"}.mdi-video-3d:before{content:"\F7FC"}.mdi-video-off:before{content:"\F568"}.mdi-video-switch:before{content:"\F569"}.mdi-view-agenda:before{content:"\F56A"}.mdi-view-array:before{content:"\F56B"}.mdi-view-carousel:before{content:"\F56C"}.mdi-view-column:before{content:"\F56D"}.mdi-view-dashboard:before{content:"\F56E"}.mdi-view-day:before{content:"\F56F"}.mdi-view-grid:before{content:"\F570"}.mdi-view-headline:before{content:"\F571"}.mdi-view-list:before{content:"\F572"}.mdi-view-module:before{content:"\F573"}.mdi-view-parallel:before{content:"\F727"}.mdi-view-quilt:before{content:"\F574"}.mdi-view-sequential:before{content:"\F728"}.mdi-view-stream:before{content:"\F575"}.mdi-view-week:before{content:"\F576"}.mdi-vimeo:before{content:"\F577"}.mdi-vine:before{content:"\F578"}.mdi-violin:before{content:"\F60F"}.mdi-visualstudio:before{content:"\F610"}.mdi-vk:before{content:"\F579"}.mdi-vk-box:before{content:"\F57A"}.mdi-vk-circle:before{content:"\F57B"}.mdi-vlc:before{content:"\F57C"}.mdi-voice:before{content:"\F5CB"}.mdi-voicemail:before{content:"\F57D"}.mdi-volume-high:before{content:"\F57E"}.mdi-volume-low:before{content:"\F57F"}.mdi-volume-medium:before{content:"\F580"}.mdi-volume-minus:before{content:"\F75D"}.mdi-volume-mute:before{content:"\F75E"}.mdi-volume-off:before{content:"\F581"}.mdi-volume-plus:before{content:"\F75C"}.mdi-vpn:before{content:"\F582"}.mdi-walk:before{content:"\F583"}.mdi-wall:before{content:"\F7FD"}.mdi-wallet:before{content:"\F584"}.mdi-wallet-giftcard:before{content:"\F585"}.mdi-wallet-membership:before{content:"\F586"}.mdi-wallet-travel:before{content:"\F587"}.mdi-wan:before{content:"\F588"}.mdi-washing-machine:before{content:"\F729"}.mdi-watch:before{content:"\F589"}.mdi-watch-export:before{content:"\F58A"}.mdi-watch-import:before{content:"\F58B"}.mdi-watch-vibrate:before{content:"\F6B0"}.mdi-water:before{content:"\F58C"}.mdi-water-off:before{content:"\F58D"}.mdi-water-percent:before{content:"\F58E"}.mdi-water-pump:before{content:"\F58F"}.mdi-watermark:before{content:"\F612"}.mdi-waves:before{content:"\F78C"}.mdi-weather-cloudy:before{content:"\F590"}.mdi-weather-fog:before{content:"\F591"}.mdi-weather-hail:before{content:"\F592"}.mdi-weather-lightning:before{content:"\F593"}.mdi-weather-lightning-rainy:before{content:"\F67D"}.mdi-weather-night:before{content:"\F594"}.mdi-weather-partlycloudy:before{content:"\F595"}.mdi-weather-pouring:before{content:"\F596"}.mdi-weather-rainy:before{content:"\F597"}.mdi-weather-snowy:before{content:"\F598"}.mdi-weather-snowy-rainy:before{content:"\F67E"}.mdi-weather-sunny:before{content:"\F599"}.mdi-weather-sunset:before{content:"\F59A"}.mdi-weather-sunset-down:before{content:"\F59B"}.mdi-weather-sunset-up:before{content:"\F59C"}.mdi-weather-windy:before{content:"\F59D"}.mdi-weather-windy-variant:before{content:"\F59E"}.mdi-web:before{content:"\F59F"}.mdi-webcam:before{content:"\F5A0"}.mdi-webhook:before{content:"\F62F"}.mdi-webpack:before{content:"\F72A"}.mdi-wechat:before{content:"\F611"}.mdi-weight:before{content:"\F5A1"}.mdi-weight-kilogram:before{content:"\F5A2"}.mdi-whatsapp:before{content:"\F5A3"}.mdi-wheelchair-accessibility:before{content:"\F5A4"}.mdi-white-balance-auto:before{content:"\F5A5"}.mdi-white-balance-incandescent:before{content:"\F5A6"}.mdi-white-balance-iridescent:before{content:"\F5A7"}.mdi-white-balance-sunny:before{content:"\F5A8"}.mdi-widgets:before{content:"\F72B"}.mdi-wifi:before{content:"\F5A9"}.mdi-wifi-off:before{content:"\F5AA"}.mdi-wii:before{content:"\F5AB"}.mdi-wiiu:before{content:"\F72C"}.mdi-wikipedia:before{content:"\F5AC"}.mdi-window-close:before{content:"\F5AD"}.mdi-window-closed:before{content:"\F5AE"}.mdi-window-maximize:before{content:"\F5AF"}.mdi-window-minimize:before{content:"\F5B0"}.mdi-window-open:before{content:"\F5B1"}.mdi-window-restore:before{content:"\F5B2"}.mdi-windows:before{content:"\F5B3"}.mdi-wordpress:before{content:"\F5B4"}.mdi-worker:before{content:"\F5B5"}.mdi-wrap:before{content:"\F5B6"}.mdi-wrench:before{content:"\F5B7"}.mdi-wunderlist:before{content:"\F5B8"}.mdi-xaml:before{content:"\F673"}.mdi-xbox:before{content:"\F5B9"}.mdi-xbox-controller:before{content:"\F5BA"}.mdi-xbox-controller-battery-alert:before{content:"\F74A"}.mdi-xbox-controller-battery-empty:before{content:"\F74B"}.mdi-xbox-controller-battery-full:before{content:"\F74C"}.mdi-xbox-controller-battery-low:before{content:"\F74D"}.mdi-xbox-controller-battery-medium:before{content:"\F74E"}.mdi-xbox-controller-battery-unknown:before{content:"\F74F"}.mdi-xbox-controller-off:before{content:"\F5BB"}.mdi-xda:before{content:"\F5BC"}.mdi-xing:before{content:"\F5BD"}.mdi-xing-box:before{content:"\F5BE"}.mdi-xing-circle:before{content:"\F5BF"}.mdi-xml:before{content:"\F5C0"}.mdi-xmpp:before{content:"\F7FE"}.mdi-yammer:before{content:"\F788"}.mdi-yeast:before{content:"\F5C1"}.mdi-yelp:before{content:"\F5C2"}.mdi-yin-yang:before{content:"\F67F"}.mdi-youtube-play:before{content:"\F5C3"}.mdi-zip-box:before{content:"\F5C4"}.mdi-blank:before{content:"\F68C";visibility:hidden}.mdi-18px.mdi-set,.mdi-18px.mdi:before{font-size:18px}.mdi-24px.mdi-set,.mdi-24px.mdi:before{font-size:24px}.mdi-36px.mdi-set,.mdi-36px.mdi:before{font-size:36px}.mdi-48px.mdi-set,.mdi-48px.mdi:before{font-size:48px}.mdi-dark:before{color:rgba(0,0,0,0.54)}.mdi-dark.mdi-inactive:before{color:rgba(0,0,0,0.26)}.mdi-light:before{color:#fff}.mdi-light.mdi-inactive:before{color:rgba(255,255,255,0.3)}.mdi-rotate-45:before{-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.mdi-rotate-90:before{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.mdi-rotate-135:before{-webkit-transform:rotate(135deg);-ms-transform:rotate(135deg);transform:rotate(135deg)}.mdi-rotate-180:before{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.mdi-rotate-225:before{-webkit-transform:rotate(225deg);-ms-transform:rotate(225deg);transform:rotate(225deg)}.mdi-rotate-270:before{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.mdi-rotate-315:before{-webkit-transform:rotate(315deg);-ms-transform:rotate(315deg);transform:rotate(315deg)}.mdi-flip-h:before{-webkit-transform:scaleX(-1);transform:scaleX(-1);filter:FlipH;-ms-filter:"FlipH"}.mdi-flip-v:before{-webkit-transform:scaleY(-1);transform:scaleY(-1);filter:FlipV;-ms-filter:"FlipV"}.mdi-spin:before{-webkit-animation:mdi-spin 2s infinite linear;animation:mdi-spin 2s infinite linear}@-webkit-keyframes mdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes mdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}} +/*# sourceMappingURL=materialdesignicons.min.css.map */ diff --git a/wwwroot/css/mdi-bs4-compat.css b/wwwroot/css/mdi-bs4-compat.css new file mode 100644 index 0000000..9162ed0 --- /dev/null +++ b/wwwroot/css/mdi-bs4-compat.css @@ -0,0 +1,40 @@ +.alert.mdi::before { + margin: 0 3px 0 -3px; + } + + .btn.mdi:not(:empty)::before { + margin: 0 3px 0 -3px; + } + + .breadcrumb-item a.mdi::before, .breadcrumb-item span.mdi::before { + margin: 0 2px 0 -2px; + } + + .dropdown-item.mdi::before { + margin: 0 8px 0 -10px; + } + + .list-group-item.mdi::before { + margin: 0 6px 0 -6px; + } + + .modal-title.mdi::before { + margin: 0 4px 0 0; + } + + .nav-link.mdi::before { + margin: 0 4px 0 -4px; + } + + .navbar-brand.mdi::before { + margin: 0 4px 0 0; + } + + .popover-title.mdi::before { + margin: 0 4px 0 -4px; + } + + .btn.mdi-chevron-up.collapsed::before { + content: '\f140'; + } + \ No newline at end of file diff --git a/wwwroot/default.htm b/wwwroot/default.htm new file mode 100644 index 0000000..d2c94ab --- /dev/null +++ b/wwwroot/default.htm @@ -0,0 +1,127 @@ + + + + + + + + + + + Rockfish loading.... + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + \ No newline at end of file diff --git a/wwwroot/favicon-16x16.png b/wwwroot/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..608aeece30f251992681aa793cc7a42063c6a090 GIT binary patch literal 686 zcmV;f0#W^mP)Px$8caZd#_8kc)R@ z!n?MyYhAv7Z?|z$wTgAhtgo4IWW8 zW>~6GI;VSQbzo5JaMJf3rFzLtm3o|W0u z&BKIrno&WVdTxnFHQtSL)s%+Tk9_ROugi{q>($GJb!*d>ipgY7vtdlmZB%wwPIPBo zp~5+~2#d@72S^bxVhFWag}q(SK%(abUGjH-J7Z(Mc%I zN-4o=Q_my;-Oj>uEg1CQ%%~~|>9?TlvY66QF~^R0;fZbDXGM!eE9j$%u53}PYg{G( z002gGQchCv@G3o?EN$fq+8Zx{ z;=riQ8LsQf5B@9V^Zlt@m;Ax2+Gtt@_S%!JbpQYWeMv+?R2b7^U?3m37|J6!TIQzC z4vt20U=Fh=gSLr>WOxVadp z1ppxS5foIg>EZwY09SfcSaechcOY6Cgx@G{a;ABePT>%h=S&#LUDT#0SfONT5nC0O}VJ Ubn-$ql>h($07*qoM6N<$f(5-Z&Hw-a literal 0 HcmV?d00001 diff --git a/wwwroot/favicon-32x32.png b/wwwroot/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..930d9b3aa8b59d368c8330da8e72564dde2635dc GIT binary patch literal 1480 zcmV;(1vmPMP)Px&08mU+MNDaN!I*`*d}-det=7V~=ik)x?&iFsqUq+~ zqMDk;osyn;Z|2|D-`v;c;n~xUdYFQAs%2V?abBsCg@kcpXH7n$MKQpFakie9j)#NC zl!B^YOmIOher{pO#lU(o9Ik?MYAzqMc4Sp49;0z)Vo^ukuc)|-b=Hx8ifvfT(Z=uD z&YOE>ql0m5RYc{!t@G*K=dGaAt(eAGK+beu;J2&2j)r_-OOI<|(xje-URB+$q;Y0n z?&8+ep_j^YU&v!h->R0BbYGTnWbD<(i*jGeX;ks&+=XUO@Z{H+c5T(kz1VhGghJF73|E`>rrjCQElZ&dAjqcaYz^R_dgm>4zw%yjv z)n!bSIwi-suWMCN(#pflwX5WtgY@v@-kXJpeRQ6Jcbbri!L_Z0VpfV>QIm&(ql$so zBLK}I0EI6SpehaW-O2FDwEO(%{`%))O+m4jjLIegnNL9Q;M2r04#Gkt@zue%8~{=% z9G5f`av}~`PfC?OA9XDinN&B2HX4yE6QF%(mS06?T~d*6Uz%u7s7EK&igB?z7g|g~ zu#0!5mWE+gPk2H#)QW7(LLkyM4#Y_<%%O|FF%bCg+rupk^w_@Gh;QI*PsgH-)-nt2 zyrlf`-|N-H)?q-|Ed=M1bCrX5!;*dAgk<2ep4Leuy(rbzo_cKLubSzp zkjR>cVpL4!m3X6ABHoH=?75qyBnH@YQSrm8onIWreP!c%T69lEb5K9aWlQ9qg}@*I zmyU+{^WC&pK+r)Rm}FJDAp)9GLdK=i=3B83&|mT$VE&(8s&Eer?fw zWtbHJg*YgJPe9qBj>uZFVT;tCKmCDC~t_!T$bZ-sAJ%Xo>n+Chh)n zv(tC7@u|>)Mm_x6m2Um|l@r>|mm>(H1L3@`*A4CLe}&2E+zzz$Zx3IjTvZwj;n`aa6H217( z+rG2;ROi`9eus`19-MhezjHr%Ye4bnoqB?bpxmTd59Iz?*TzIgGocs-f=Nzqe0ru9(^~Ywnz7 zd%90t+P_v;m=mZV)PftRj;FTz@4K#(%co7A(K2)Xyd_;%eO)z$1b{)xBF72#O!4>k zkFVIsiipa{D=Mq%nR__tFmfQrKzMReu$3fdIt!PC(rg7SEMd)HrUEvLfk&!UnjK$s zvWbfc;*W4fCU%BVKq>$LEO3l@WwSls00012dQ@0+Qek%>aB^>EX>4U6ba`-PAZc)P zV*mhnoa6Eg2ys>@D9TUE%t_@^00ScnE@KN5BNI!L6ay0=M1VBIWCJ6!R3OXP)X2ol i#2my2%YaCrN-hBE7ZG&wLN%2D0000= literal 0 HcmV?d00001 diff --git a/wwwroot/favicon.ico b/wwwroot/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..fe6674fb30d0dbedd834ee68b47321aca7930595 GIT binary patch literal 15086 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 literal 0 HcmV?d00001 diff --git a/wwwroot/fonts/materialdesignicons-webfont.eot b/wwwroot/fonts/materialdesignicons-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..df4d4521cbcb1a9184ee9e1cb70c2e50c4b3c083 GIT binary patch literal 292776 zcmeFaf1FfTdB^{pdv|B{$Lx=p+4-@*W@mrSG6TEI{v?6GB!TcFgg|5w4KYhXBFPdZ z1|o@=jEYJOR#X-d`X_EYW|K6xvRJnC(VGifc>^qMLz)1^bYc=E?lCWBVAL^5Ja{KnUHcF%cw*}X)z6T9N}dseSMS?PaD zq;WHGi{8BMfjfV;@mDvCTysS1gR=IH)oXmqAF3wpG0?x32>aK?-zK~tw5+{n!=|%Q zLSix^4QJQA_4d`}Uwh^ik)|U;o$pz_X?<~{9OiiuiQ;crea{_t?0adh*#E_I>#OVE zdf$ex@B8>svHzR$A6TMwHDl+-q(jHy+=OL0wI`hW=RN1dkS_6yn{K?dV%E!2>Wb*Yb1Tz{C2{vJLO)_L$_4X^0bDRak&pJ^T1^uxXc5WdEhb+T;_qx zJaCx@F7v=;9=OZ{mwDha4_xMf%RF$I2QKr#WgfW91DAQ=G7ntlfy+E_nFlWOz-1n| z%mbHs;4%;V|C0we_E$d=MP1e(0N)2ER3`kgRhF8JpPj+0m1>w2v&hLfV9C^M5=gR zML0AIU!GOqph#p0XAsJW9uld3T%?A2)f^M4C0`xkI?Ar+c|G}Kn*j71+5!0*_JS8g z;-ri328RL98<&F&;CUl;YoaXmy=g82>%nul=@fveU;}twq;)aa21wr)1!=GqoWZMx zvJ!hl+R4-24oKThUD`G7q{tM?n{pU0B%UYN0>UY-sTV}1E(N5SHUp5pgR~vTL^>-0 zWp`3u*DUb3$aL!2O}g$KB0Z$(oeQAV$F*+@Ag;eoU5>z$A_D@b%fK%1g2;?6uoavT zxq|Q&wC4)SzLNY`Qua*J&m02#MP?NN>N4wq$W_q1YOl!bso;pnoH%$~Bu&2bA#hgY zYG_{53wDcK>jRrb=2imgF|P$|2WLdCdsdx#fvfJ!#jEiQKyY91?lk4Dh(feFb1D7y_ib?@4f4WCQKpum!v%vT+t5 z@BMSZQIWT=0w+Z_@qE)6{Kv@q0M8$U_JfB--mx4&XY*E(cS7@_c0idAlkefPBANXn z?I|0v}@x(Sf(QR=siG~1}_wxc2+i~`E~AmKlWgAL$Wkq<%dLwmtDd{h8*KYCJR$7XOwWMnNkA+nQt?mQy$F=*`C4$g{ve5=Tx z&IN}>KCu8$?(QP67C`@#y@0YlMV?RX0#azyh#C>1KOL%O500QETflE{xJ>qm3JUXdRc0P6eW!ykexC62r1^)8$UnA#=S2RAGG16E^2;KT zf8HkYFKLmJbzmJh3aHD!Li=B-*Ndcik@y!M2QP`d6a_Dc{2THAwjR)se_sq<5&4g$ zfOP-C^V7tgre6P90O;rcq}*Sv75Q}>tN}+v&JaFB8E4Llyu1>S?l-+)J2)xw+aYjN zI3h;of}`LSF=iIn z4$k6x+9k#&u3)VgPZ8J;o)zO=47Q3Xih~8&ERasfCX#vcW1z?hgo3)lqChzTwQPl~DHTJ?gMPzD?o z6DEC_^kJSw2uD@|@_5<>^64yrB zw$0#qF^Rc=dL*6|gN|d`cZiunUUVCSUSm?Ud1?V5JoTuUX{4WaQVcqc>7?vV@^w+> zbe>O#UN_IX*MT!)ddS<`0y1Lyy1*_m{oMDT5HmoU8C8J%S8Nq?C242!Y$k1(H5F_J zlylW`F|*sjCh&@wIXlFpNuTD~)my||lLpl5+F5{l%!Te;?&m>g-XSs9kq`aE%!khW zV`3Kcf+xi+B;UeqxOxkK&Z6hVT)!3^7PELR;MrozxB)shoDj350IUSW-$>kz2gEF$ z1-M_z^JP9j{$<23J0s?%&ESZb*R_N70J_VUg8gC!TL5u`r^T!w|Lf~O2J98H5;`l7 ziFw20V%}H;)`4fm+#Clx#H^wYt9W(`@wbeLdDB`kx6TzaG!^Uul)ZX4I4kBh(%g1Z z%;uv^UfO0Y)Ez0kXta_^;%_mcN*O95%`px z0O>O)#Jr32@7f{e-D?5#-ctk~7qg`fY!mZduJ48JdryjaUoW5z?>i>u{m^

9#^^ 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%0DUem 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%0AVGJoQ*r%>5U{PvxTn}xpmljiSsg^nl_r8 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

sN-6iyaCK?e4{` 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 literal 0 HcmV?d00001 diff --git a/wwwroot/fonts/materialdesignicons-webfont.svg b/wwwroot/fonts/materialdesignicons-webfont.svg new file mode 100644 index 0000000..293fcc2 --- /dev/null +++ b/wwwroot/fonts/materialdesignicons-webfont.svg @@ -0,0 +1,6150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wwwroot/fonts/materialdesignicons-webfont.ttf b/wwwroot/fonts/materialdesignicons-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..69404e3d9758bf3d6a7e4ce27e5362089366542f GIT binary patch literal 292556 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໶Mi^<6`|6 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

YP+mSoyJ z)Tu4Q_-o95a~Y3=e`1)1duf1&AppJa`^F3vcxL3^vj|oYVZbmKHC?Ew!hBev+6O&> zai$4@yjw449Na;i$Mi_rix1N<+Ei>z76?w!5MK!#WC%?+aIpl5ZiV!jG|@$)Q6>3d zl3F@F0(zUYA{>CMyTiIwZe%<_Ek+vBoVijZlY^9R9X(2cMBTUn9l-*QuX1u}qPC_F zEWztc{7GR&h=DR@?e4O!!6*cGPr_@MR~fn(4@I|~HEG9ck=wx+$4Q6i@}y6I{MMTl zbWve|G1lL%sDX4gaqaKflQLKO6jAH9O6`ofLe#>elQvC@(k(<`r4n-mvqtn(+NGg* zP7ITlE@v&mcE!vn;7NolVWq^iwuBQIt*3ag1|j{Ru?)+kA^w;9$@&B4kg2*cHI@xk zvQ?TML(KyfC9dJ_#kERza;y;X`!!>j9;Di0QUmRAU*#TM0K>up%G<(T7L!&5n5ehW z%VgAaflHY>>?g$BphQiNr2R}v!PScD$hl!s9hh^_G?I;=vVjI8N~9Zgb9ECY2)Y6= zQM=)uZ%4~~cfDKEyOa5Pr2>afBdX$WIgLM3j<8lzlr;7ZO(~M~Os*C5GKBMz9MXo& zP5Fcg@G@a1xd95srX)Xvh%aXcAXZLc0Cb~XA2WCW!w54m0Q{70#Fe^eBCf8PGgsd! z43@17{_wfRrX?b8ErcWI$y zxqfzl>(n}hA+X$o+iYe9TqJowB6tm4bJE_>)5H%*y-hm|tT}iwl_|o!0X-nWBS~+* zg&Wvu4L7)d6BMT#(MS%#bzXsE6ClkU9YCNpJQOJHdX0+Y$Kdw#7-%0+%{uJq-Q}FS zWA(?4WB^%h)aTK}NEtl{(%jtSAm!iBA-5pB*!lUgCgGYhF$z%IOfi@@+ol*L4BCN)rQCI>11qO8T(PY{R-skbGr=mr32Kdunic(dPHl2E^~L{j!vjN6J*P#<#c zZYO@$L-dU(QipT8&swEU8hlx4jvlqSCucJV(MzR7~u<`U#xzd&`bXmWJTML#D4ueHMMHl0P zu_@A4(gtVPqB6;T2lphwO31l8Xg92USr3tsZIES%SHWkwSvKY2p&@_pKsV|%mj?w5 zWER7qdRiGXz5)XLkPfOa=7=cw9zl8TJzC67!PO(hMixoR zpp$qWa|Dujxm%j=2}2ACwvtTNrksau6c{$&l*LRlq2RE<)?uQWaQA`5o@2D46s&g? z`P_&^EAGR$XRh>dIh%5=n;e5EALSS7=n<>QlP3cFVrm?uWt1}OmQs_0RM8Dz)?)0p zq%A;pJXeyE#fWr^T49)3td*MccrRqYqA6iUVhECQL3;W~iKGq*7J6iDVg$JeDJGKb z5~zNZv$tX=ieWHFw@V9k3Y3Gzx*bJeR9OV*AnXAl5s(E71|Sn<3$lKxrw|Hhz7%(G zA86?>&lhVHHxWgG6c-3g~=XKmZlh0U1du0_{#;P#Tfvd3D zE34Q#R)v8MT!qbES;e-oDhzbsDs1-3Dz=YRVW0z7VY63Ov16uo4vA%onuuP z=)hIj?3GoVI97#$4qS!JURlLSV^tXFz*X36SH+Z{a3|TQKupmi_C@Ve*}?lM<7!N` z;g2v|GL(xLD6EJa$iz2__hPBCKtZ$>K|%f{WJ7pE({RVFRYEzNfO#dU!Ot;0Kn&es zlLMT0a}7%^!XS_EE0}?&3}qu1^uQaIGAIfv!Hc^MsB~xsm}*t73z0g~@3<_?1?aGiyv>5$F$U+Yx{~zLsFJdIko_FGWugn+Bbc*Q#8db@ z^TidH=LLndtzjXqcfw9xcIx!8tW&S@4vb?+v=#n{`KEA>;75p}+#p4T2@l=}W<_|L zBE0C-_v|Tg>{MEwpbO!KT}KGZgQrcVP5b<`!I=iHwn@tdA>UKn0D3o1Xk$b*;z(`) zQeqT>U1pHy6gq;vF^>43rVBMMV-mJ0hmNH8p%7>@o)~X)*5I53WUIv5mK_=>Oa|CM z$OV7|qQbGqi6dd4CcRk!S_VhOy@T-2wlEgyl)2i@Bv(qlLstYq+Su)^1I-(HO4wV5k5VRxx6_lj!)chdHwx{g zoMlK%$btQ>hbJp>mM)%VqX5EGlA7p7)o3Y?Jt&a>5Hv$RX?lvHw{e5G9HCkw{4^DS z=^(TL7`oBQM00EsRGD%y+^74q!5F+&AVttmM*^85&=w@(kU!SC~25T8J8lBYkDN@AHdV5q zAL2tQnD)g47TsvdV4D$)yx8{#vASED9z%g+wo1*JF&w5!A8gh>i@5~b092FVvmRxi z)h6Bo6B12A-~}x=M~h@)%*kncquG#mNn^hL&)SN6;snl4GSG3U~j3KtyYTZ{HPs^$|k>S>s(I+2my1X-@4oVofzmasg6 zO62X$a}S-s3JhLU1>Pn=z@fSUPfHP0HmUXJ=bO=lyOY(7f;}n)k8mQ9z&UuWQkG7` zLpVs^XlDeJn(3t8L@&U<6cvU^io|G4jKEk^&`?JZu40zdTPgfuG(cMvrO;crLqIHb za!CX3blS#7{;RBkoS=|0KpWG*76PGPs6&euNdrE_yt%^Kjfg`mBazS^BV1t!O_{5G zOADcP2q;SIop3s7mpZV9qAA#I1>?6&Vr=-v@i_5(372kfk}hcOaEEW+ViE{D#>Qws z#Ai7;YhWizTflvMIw5zf34F~U32Djnn@@wWG*tqM2CGoU-KmX~2K9uG9Bd5fX46D$ zqA01T%PG1Wn_Pa7Dq`%+Rl>6ajL6^a^88aSNVAt{ct#C{Wyjm%>jQ!-Ct1 zP#uU6szY<)jxbvpQ8Vl(#Vy+qEY`=-H9gv34rlEm@hH2|DxLHpIYax1l0vcw+ucy+ z&KVfrYPJ?}?AZW4G#fWWLh&vljz-F|@T*=(t zZ?(-LEy8*fb=U5TpF1RB=H=l7;Y(T%7HkBfw4+^*w9D+tI6545t$|km&0tm$d zH?o)nBW#dnz;oCtLvcoS{!flUwoeeGh;t*d*k?)iBF#lSWC3dz_K^FYnH8{E4}<5a zj|EEfY7A>Q2LXT#1GbX|pn99*in&34eFz(KnC*k4)x@h8Vowzk38ZSDJRu8dV*_7s)gkha(BozsN*Y`bLm; zio+oat{j0>cEZ5}q0txc6U{ z8isupbkwFpBYFxX+!n@6YoO7sDCVHHQMk~M3k{l`DctPvv4v(i1#3##1VLvOh&5vV zK=Dnxv>AVkwoWXcL7aA>)8+^dX-FF*Qn0ro#r9B$&7_0j_M-5x8Uj%r2DAa8L~OCt z7T9`#gJ#T?JmV1C9AKUAl#j?~bERHK4S?Z>FjlLygZiyb9&rOi?TPyIE6W)V&coW| z)7Uf7ob-U<7;Tb(Jf=;Klo=1fVApFxBc|F410*Dw(MO0BE)OaoX>5M(jtmRm+*uLDlx^e zHKU<<(C7$0a?q&IX4AcoI5ZeL%qhcPDNsw81*~Ei#L2=#abZOS9bx90&9ji8^EMs` zodRVL!WJTOA-!~S-rQh@pN`3*?M!9|6WF2ItFqc7y)0?9>IqCGd>}M@Tu7Z7B6?7S zFyb>tRa{|o#92)w-q3RiIv~?XaRmo6hyEo2`5A9_|KR9;fiVcR@}8{b^_eqj5guwpYjQa39_W zojjq~H%KwY?1`wfY7JT!!pT70hY=5mQ!2*@ujs`RvMegFQ5?ql0TKd3y65hI&_oZ8 zI*tb(g0&-#;{lTT4?Y}>CFJ3x2X_dP6gT6X2H1-NVpJyEF3ziPHdok&9Yk90#TS#J z5BoE=;g~gKtm+7)>cZ@XC0~VEZOH{6SYwB8rd5}*?Zbpkt%2rgqka*BVQr`8G@`Zp z!P^iF8fHv335x~R9oT&W3z0c{i)w|XTGA;1{9ebFYe zcXmZ-xD&8;XI5Y#2O-o46AOWeCFqiZL?!HyrmOFaSql*lA(rFF!+Jx?=*a;!HvR-h z+&2Edvwbc5IeUO+FfA(+_k8re)r{r)dT3KT_KlO-1^ZwzzpGJU5LS=CZ4j$G2r>+( zzK1!PCd_^@3KT);Wt5_e@zVL&_);4o9ERpujg&&s%Ot+T5SpWX;&7WrI1+Tmq|!n&yB!+%tVvh0*e|8-*nUtL3(f>*q2NUsioyng%Jc1N{SD| ztR93+5zfX#8M|19_V_?wBoD^)NZNM^+`@}QBs12rY1p81a#BqUMnX8*z~OMh7EW0R z!a|H81sqYepoP&A6i}QOLK!4%kjMnuiP3;<+DtbmFCtXaN0koaMa!KIUn;fecs1C3 zalG2tu5IcrS*Lc9D6)w9v1=Q%h>rCs8Z~+X&I}SXmy6iwOaq&P-v!&%AX*e5uP~e= z1Wz+U4%T>~exQb+0_YM$1%Y%4i_;(i#bvZMV?2vwCWa(y)3oC*=Y$X2!`RkaO4aDt zO3*^=hQRh>IB|uExR~mKp3?4(Ay1g_DBsg?d^nE`i3`T0Xk-c4>>+gtY{aiuaCRo5 z1&Yvj;yn<;aJC(UsA?65(-}KBI9qFOcyy6JD8Qe%V}v$rsYl=htdUsXB%uj9OaX^5 zz;I(dU7#kAtgtr^%{4l59##+#2XcSF05~@_4pL`hH*+5YH{5?)!Ac%(&xI%e1*YP6 z$&pdqi`pPy*pY4oJI5HEu>o5i;OK>g(gyB3N<86%BK=0GL6oFNP;+>@--y!I?Tx8Z zbq;Y#Qnu>g5EcZTz_Dr+7}3R%f`ffi&hdECW`*gEh-rBBjOl!0Xdo<_Gv%!1jdt>q z1r9=lpiL^vF!f+Nd_?+kxmI*G3>;Z%ejiC-O3W>D=;g~CEVnah!cB=%`ZZZFn4$eM zXQJ*r-n-}2bcY^oUhFsq>m^!>$uYAE zj!~Gnz{|i`-00$*5jyL`gXTyGIPw!OgQtc`-|Pv$4aUz8 zY;3{Vm~^2o(byva{k^w54Bdy-4Bqzv1*RQ^)@kkI?eQ35&0)@<;B^Fo&x`{8y*9GE zW2k={ap-Yp)<=dLPU_3ecq|cck5r^sN!~ZNiBsXc47u8SL} zR1?8bHu}hC+dv{WIZarP2|j?}iy$0hwjD$OA4fWQK z7dAM|5&y`9cP#sm6PR#ldqRuhC+Re~^k`V%h{UcsMBu>B>O4`-P71dZ_NK$r0r?re zGvc_=!L8#1#1TSx*P5GYw=TB(H4DZJonTWkrUj%ti(gst22hNd~+8e-ZI zK{dD&f5(x&ikz*&uoLW~8-wWKgZ9DrC&{D)7pN66ozgjlJ(=XIgqhczw+0`~00jz& zP!Z~@6)5_&Y5$-tW!gG1j_Y@@_tw^qYF7`^i}A?Y3ZrNgBRvSFE(mL6{>n691~gL* zaw6yxjzw5fhyo<$p2Ex_p&1)&yi?pL1~qRyi*}vrW4UTGvYY7w3WlDpHQNz*87W707(!a z_JWxMgHC12Vo1;ODD7oDIz!0_dw!MVj78Lo3C>V@!e%d$Q;+#w#b`Pm9Z^=qOY#1+ zv1db8j(P%ao86@e-%MZmES^RjwBu+V3w?(6Cxamon^1Th)+}%i+^xw9A!t5nNd*OW z*^|nB!j(iYnavm}N1IF$ht{(w#As27*HCcE6SINJLRvVQV0e?!GZ2zxxDeWuaU%py zhd3!~n}=*4@2*4UCq|Sp5if8_ zF!sRPV%G3!DjUa8Rqn?HTp3f5;|LA~l4m>wMnR2oCQV*7I=N{YqC*igvu=*tC2hN1 znO%vSr=LQYB&g*I9#v*v10)_@V|5$_%VN8t}3*?xAtIcRfpbmNCpdputDQ*2V6pM(L!E8!?S3@LH zNsQq665^C$h6LGz$$g~vr^das#Vy6nD^XjEC#*zm-xswLsF6@PH$f3SXZ%URnhpzlVCqbfJx_?g8%QusGlOqm>(x~b6|ww56Xfxi^$FOi0I36Ui@ UF${6<6sghVORY|aen0vD14G(^TmS$7 literal 0 HcmV?d00001 diff --git a/wwwroot/fonts/materialdesignicons-webfont.woff b/wwwroot/fonts/materialdesignicons-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..56b9a358a8648a69cedc922150ecb337aa41dd6f GIT binary patch literal 144072 zcmV)kK%l>OPew)n0RR910y4+|3IG5A1a`~-0RR91000000000000000000000000_ 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ʜ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 literal 0 HcmV?d00001 diff --git a/wwwroot/js/app.api.js b/wwwroot/js/app.api.js new file mode 100644 index 0000000..c44c788 --- /dev/null +++ b/wwwroot/js/app.api.js @@ -0,0 +1,337 @@ +/* + * app.api.js + * Ajax api helper module + */ + +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ +/*global $, io, app */ + +app.api = (function() { + "use strict"; + var initModule, + getAuthHeaderObject, + RockFishVersion, + get, + remove, + create, + update, + uploadFile, + putAction, + createLicense, + getLicenseRequests, + generateFromRequest, + licenseEmailResponse; + + RockFishVersion = "6.1"; + + ////////////////////////////////////////////////////////////////////////////////////// + // NOT AUTHORIZED ERROR HANDLER + + $(document).ajaxError(function(event, jqxhr, settings, thrownError) { + //unauthorized? Trigger logout which will trigger login after clearing creds + if (jqxhr.status == 401) { + window.location.replace("#!/logout"); + } + }); + + ////////////////////////////////////////////////////////////////////////////////////// + // UTILITY + + /////////////////////////////////////////////////////////// + // Return the auth token header + // + // + getAuthHeaderObject = function() { + return { + Authorization: "Bearer " + app.shell.stateMap.user.token + }; + }; + + ////////////////////////////////////////////////////////////////////////////////////// + // ROCKFISH CORE ROUTES + + /////////////////////////////////////////////////////////// + //Create + //Route app.post('/api/:obj_type/create', function (req, res) { + // + create = function(apiRoute, objData, callback) { + $.ajax({ + method: "post", + dataType: "json", + url: app.shell.stateMap.apiUrl + apiRoute, + headers: getAuthHeaderObject(), + contentType: "application/json; charset=utf-8", + data: JSON.stringify(objData), + success: function(data, textStatus) { + callback(data); + }, + error: function(jqXHR, textStatus, errorThrown) { + callback({ + error: 1, + msg: textStatus + "\n" + errorThrown, + error_detail: {} + }); + } + }); + }; + + ///////////////// + //Get - get anything, the caller provides the route, this should replace most legacy get + // + get = function(apiRoute, callback) { + $.ajax({ + method: "GET", + dataType: "json", + url: app.shell.stateMap.apiUrl + apiRoute, + headers: getAuthHeaderObject(), + + success: function(data, textStatus) { + callback(data); + }, + error: function(jqXHR, textStatus, errorThrown) { + callback({ + error: 1, + msg: textStatus + "\n" + errorThrown, + error_detail: {} + }); + } + }); + }; + //////////////////// + + /////////////////////////////////////////////////////////// + //Update + //route: app.post('/api/:obj_type/update/:id', function (req, res) { + // + update = function(objType, objData, callback) { + var theId; + if (!objData.id) { + return callback({ + error: 1, + msg: "app.api.js::update->Error: missing id field in update document", + error_detail: objData + }); + } + theId = objData.id; + $.ajax({ + method: "put", + dataType: "json", + url: app.shell.stateMap.apiUrl + objType + "/" + theId, + headers: getAuthHeaderObject(), + contentType: "application/json; charset=utf-8", + data: JSON.stringify(objData), + success: function(data, textStatus) { + if (data == null) { + data = { ok: 1 }; + } + + callback(data); + }, + error: function(jqXHR, textStatus, errorThrown) { + callback({ + error: 1, + msg: textStatus + "\n" + errorThrown, + error_detail: {} + }); + } + }); + }; + + /////////////////////////////////////////////////////////// + //remove Item + remove = function(apiRoute, callback) { + $.ajax({ + method: "DELETE", + dataType: "json", + url: app.shell.stateMap.apiUrl + apiRoute, + headers: getAuthHeaderObject(), + success: function(data, textStatus) { + callback(data); + }, + error: function(jqXHR, textStatus, errorThrown) { + callback({ + error: 1, + msg: textStatus + "\n" + errorThrown, + error_detail: {} + }); + } + }); + }; + + /////////////////////////////////////////////////////////// + // uploadFile + // (ajax route to upload a file) + // + uploadFile = function(apiRoute, objData, callback) { + $.ajax({ + method: "post", + dataType: "json", + url: app.shell.stateMap.apiUrl + apiRoute, + headers: getAuthHeaderObject(), + contentType: false, + processData: false, + data: objData, + success: function(data, textStatus) { + callback(data); + }, + error: function(jqXHR, textStatus, errorThrown) { + callback({ + error: 1, + msg: textStatus + "\n" + errorThrown, + error_detail: {} + }); + } + }); + }; + + ////////////////////////////////////////////////////////////// + //putAction - ad-hoc put method used to trigger actions etc + // + putAction = function(apiRoute, callback) { + $.ajax({ + method: "put", + dataType: "json", + url: app.shell.stateMap.apiUrl + apiRoute, + headers: getAuthHeaderObject(), + contentType: "application/json; charset=utf-8", + //data: JSON.stringify(objData), + success: function(data, textStatus) { + if (data == null) { + data = { ok: 1 }; + } + + callback(data); + }, + error: function(jqXHR, textStatus, errorThrown) { + callback({ + error: 1, + msg: textStatus + "\n" + errorThrown, + error_detail: {} + }); + } + }); + }; + ////////////////////////////////////////////////////////////////////////////////////// + // LICENSE KEY RELATED API METHODS + + /////////////////////////////////////////////////////////// + //CreateLicense + //Route app.post('/api/license/create', function (req, res) { + // + createLicense = function(objData, callback) { + $.ajax({ + method: "post", + dataType: "text", + url: app.shell.stateMap.apiUrl + "license/generate", + headers: getAuthHeaderObject(), + contentType: "application/json; charset=utf-8", + data: JSON.stringify(objData), + success: function(data, textStatus) { + callback(data); + }, + error: function(jqXHR, textStatus, errorThrown) { + callback({ + error: 1, + msg: textStatus + "\n" + errorThrown, + error_detail: {} + }); + } + }); + }; + + /////////////////////////////////////////////////////////// + //GetLicenseRequests + //Fetch license requests + //route: app.get('/api/license/requests', function (req, res) { + // + getLicenseRequests = function(callback) { + $.ajax({ + method: "GET", + dataType: "json", + url: app.shell.stateMap.apiUrl + "license/requests", + headers: getAuthHeaderObject(), + success: function(data, textStatus) { + callback(data); + }, + error: function(jqXHR, textStatus, errorThrown) { + callback({ + error: 1, + msg: textStatus + "\n" + errorThrown, + error_detail: {} + }); + } + }); + }; + + /////////////////////////////////////////////////////////// + //GenerateFromRequest + //Fetch generated response to license request + //route: app.get('/api/license/generateFromRequest/:uid', function (req, res) { + // + generateFromRequest = function(uid, callback) { + $.ajax({ + method: "GET", + dataType: "json", + url: app.shell.stateMap.apiUrl + "license/generateFromRequest/" + uid, + headers: getAuthHeaderObject(), + success: function(data, textStatus) { + callback(data); + }, + error: function(jqXHR, textStatus, errorThrown) { + callback({ + error: 1, + msg: textStatus + "\n" + errorThrown, + error_detail: {} + }); + } + }); + }; + + /////////////////////////////////////////////////////////// + //Email license request response + //app.post('/api/license/email_response', function (req, res) { + // + licenseEmailResponse = function(objData, callback) { + $.ajax({ + method: "post", + dataType: "text", + url: app.shell.stateMap.apiUrl + "license/email_response", + headers: getAuthHeaderObject(), + contentType: "application/json; charset=utf-8", + data: JSON.stringify(objData), + success: function(data, textStatus) { + callback(data); + }, + error: function(jqXHR, textStatus, errorThrown) { + callback({ + error: 1, + msg: textStatus + "\n" + errorThrown, + error_detail: {} + }); + } + }); + }; + + initModule = function() {}; + + return { + initModule: initModule, + getAuthHeaderObject: getAuthHeaderObject, + RockFishVersion: RockFishVersion, + get: get, + remove: remove, + create: create, + update: update, + uploadFile: uploadFile, + putAction: putAction, + createLicense: createLicense, + getLicenseRequests: getLicenseRequests, + generateFromRequest: generateFromRequest, + licenseEmailResponse: licenseEmailResponse + }; +})(); diff --git a/wwwroot/js/app.authenticate.js b/wwwroot/js/app.authenticate.js new file mode 100644 index 0000000..60481d6 --- /dev/null +++ b/wwwroot/js/app.authenticate.js @@ -0,0 +1,103 @@ +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.authenticate = (function() { + 'use strict'; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var + stateMap = {}, + onSubmit, + configModule, + initModule; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + //-------------------- END UTILITY METHODS ------------------- + + //------------------- BEGIN EVENT HANDLERS ------------------- + onSubmit = function(event) { + event.preventDefault(); + + //get creds + var login = $('#login').val(); + var password = $('#password').val(); + + + $.ajax({ + method: "post", + dataType: "json", + url: app.shell.stateMap.apiUrl.replace('/api/', '/authenticate'), + data: { + login: login, + password: password + }, + success: function(data, textStatus, jqXHR) { + if (data.ok == 1) { + app.shell.stateMap.user.authenticated = true; + app.shell.stateMap.user.token = data.token; + app.shell.stateMap.user.name = data.name; + app.shell.stateMap.user.id=data.id; + //token expiry date + app.shell.stateMap.user.expires = data.expires; + + //tell the shell we've logged in successfully + $.gevent.publish('app-login', { + name: login + }); + } else { + if (data.error) { + $.gevent.publish('app-show-error',data.error); + } + app.shell.stateMap.user.authenticated = false; + app.shell.stateMap.user.token = ''; + app.shell.stateMap.user.name = 'please sign in'; + $.gevent.publish('app-logout'); + } + }, + error: function(jqXHR, textStatus, errorThrown) { + app.shell.stateMap.user.authenticated = false; + app.shell.stateMap.user.token = ''; + app.shell.stateMap.user.name = 'please sign in'; + $.gevent.publish('app-logout'); + $.gevent.publish('app-show-error',textStatus + " " + errorThrown); + } + }); + return false; //prevent default? + }; + + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + //CONFIGMODULE + // + configModule = function(context) { + stateMap.context = context.context; + if (stateMap.context.params.id) { + stateMap.id = stateMap.context.params.id; + } + }; + + //INITMODULE + // + initModule = function($container) { + if (typeof $container === 'undefined') { + $container = $('#app-shell-main-content'); + } + $container.html(Handlebars.templates['app.authenticate']({})); + $('#btnSubmit').bind('click', onSubmit); + }; + + + // return public methods + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +}()); \ No newline at end of file diff --git a/wwwroot/js/app.customerEdit.js b/wwwroot/js/app.customerEdit.js new file mode 100644 index 0000000..6887946 --- /dev/null +++ b/wwwroot/js/app.customerEdit.js @@ -0,0 +1,143 @@ +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.customerEdit = (function () { + 'use strict'; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var + stateMap = {}, + onSave, onDelete, + configModule, initModule; + //----------------- END MODULE SCOPE VARIABLES --------------- + + + //------------------- BEGIN EVENT HANDLERS ------------------- + + //ONSAVE + // + onSave = function (event) { + event.preventDefault(); + $.gevent.publish('app-clear-error'); + + //get form data + var formData = $("form").serializeArray({ + checkboxesAsBools: true + }); + + var submitData = app.utilB.objectifyFormDataArray(formData); + + //is this a new record? + if (stateMap.id != 'new') { + //put id into the form data + submitData.id = stateMap.id; + + + app.api.update('customer', submitData, function (res) { + if (res.error) { + $.gevent.publish('app-show-error',res.msg); + } + }); + } else { + //it's a new record - create + app.api.create('customer', submitData, function (res) { + if (res.error) { + $.gevent.publish('app-show-error',res.msg); + } else { + page('#!/customerEdit/' + res.id); + } + }); + } + return false; //prevent default? + }; + + //ONDELETE + // + onDelete = function (event) { + event.preventDefault(); + $.gevent.publish('app-clear-error'); + var r = confirm("Are you sure you want to delete this record?"); + if (r == true) { + //Delete customer and children + app.api.remove('customer/' + stateMap.id, function (res) { + if (res.error) { + $.gevent.publish('app-show-error',res.msg); + } else { + //deleted, return to customers list + page('#!/customers'); + return false; + } + }); + + } else { + return false; + } + return false; //prevent default? + }; + + + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + + + //CONFIGMODULE + // + configModule = function (context) { + stateMap.context = context.context; + if (stateMap.context.params.id) { + stateMap.id = stateMap.context.params.id; + } + }; + + //INITMODULE + // + initModule = function ($container) { + if (typeof $container === 'undefined') { + $container = $('#app-shell-main-content'); + } + + $container.html(Handlebars.templates['app.customerEdit']({})); + + ////app.nav.setContextTitle("Customer"); + + //id should always have a value, either a record id or the keyword 'new' for making a new object + if (stateMap.id != 'new') { + //fetch existing record + app.api.get('customer/' + stateMap.id, function (res) { + if (res.error) { + $.gevent.publish('app-show-error',res.msg); + } else { + //fill out form + app.utilB.formData(res); + } + }); + //Context menu + app.nav.contextClear(); + app.nav.contextAddLink("customerSites/" + stateMap.id, "Sites", "city");//url title icon + + + } else { + $('#btn-delete').hide(); + app.nav.contextClear(); + } + + // bind actions + $('#btn-save').bind('click', onSave); + $('#btn-delete').bind('click', onDelete); + }; + + + // RETURN PUBLIC METHODS + // + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +}()); \ No newline at end of file diff --git a/wwwroot/js/app.customerSiteEdit.js b/wwwroot/js/app.customerSiteEdit.js new file mode 100644 index 0000000..5012ada --- /dev/null +++ b/wwwroot/js/app.customerSiteEdit.js @@ -0,0 +1,168 @@ +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.customerSiteEdit = (function () { + 'use strict'; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var + stateMap = {}, + onSave, onDelete, configModule, initModule; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + //-------------------- END UTILITY METHODS ------------------- + + //------------------- BEGIN EVENT HANDLERS ------------------- + + onSave = function (event) { + + event.preventDefault(); + $.gevent.publish('app-clear-error'); + //get form data + var formData = $("form").serializeArray({ + checkboxesAsBools: true + }); + + var submitData = app.utilB.objectifyFormDataArray(formData); + + + //is this a new record? + if (stateMap.id != 'new') { + //put id into the form data + submitData.id = stateMap.id; + + app.api.update('site', submitData, function (res) { + if (res.error) { + $.gevent.publish('app-show-error',res.msg); + } + }); + } else { + //create new record + app.api.create('site', submitData, function (res) { + if (res.error) { + $.gevent.publish('app-show-error',res.msg); + } else { + page('#!/customerSiteEdit/' + res.id + '/' + stateMap.context.params.cust_id); + return false; + } + }); + } + return false; //prevent default + }; + + + //ONDELETE + // + onDelete = function (event) { + event.preventDefault(); + $.gevent.publish('app-clear-error'); + + var r = confirm("Are you sure you want to delete this record?"); + if (r == true) { + //-------------------------------------------- + //==== DELETE THE site and it's children ==== + app.api.remove('site/' + stateMap.id, function (res) { + if (res.error) { + $.gevent.publish('app-show-error',res.msg); + } else { + //deleted, return to customers list + page('#!/customerSites/' + stateMap.context.params.cust_id); + return false; + } + }); + //-------------------- + + } else { + return false; + } + return false; //prevent default? + }; + + + + + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + //CONFIGMODULE + // + configModule = function (context) { + stateMap.context = context.context; + if (stateMap.context.params.id) { + stateMap.id = stateMap.context.params.id; + } + }; + + //INITMODULE + // + initModule = function ($container) { + if (typeof $container === 'undefined') { + $container = $('#app-shell-main-content'); + } + + $container.html(Handlebars.templates['app.customerSiteEdit']({})); + var title = "Site"; + + if (stateMap.context.params.cust_id) { + //Append customer id as a hidden form field for referential integrity + $('').attr('type', 'hidden') + .attr('name', "customerId") + .attr('value', stateMap.context.params.cust_id) + .appendTo('#frm'); + + //fetch existing record + app.api.get('customer/' + stateMap.context.params.cust_id + '/name', function (res) { + if (res.error) { + $.gevent.publish('app-show-error',res.msg); + } else { + title = 'Site - ' + res.name; + if (stateMap.id != 'new') { + //fetch existing record + app.api.get('site/' + stateMap.id, function (res) { + if (res.error) { + $.gevent.publish('app-show-error',res.msg); + } else { + //fill out form + app.utilB.formData(res); + } + }); + } + //set customer name + //app.nav.setContextTitle(title); + } + }); + } + + // bind actions + $('#btn-save').bind('click', onSave); + $('#btn-delete').bind('click', onDelete); + + + //Context menu + app.nav.contextClear(); + app.nav.contextAddLink("customerEdit/" + stateMap.context.params.cust_id, "Customer", "account"); + app.nav.contextAddLink("customerSites/" + stateMap.context.params.cust_id, "Sites", "city"); + + if (stateMap.id != 'new') { + app.nav.contextAddLink("purchases/" + stateMap.id, "Purchases", "basket"); + + } + + }; + + + + + // return public methods + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +}()); \ No newline at end of file diff --git a/wwwroot/js/app.customerSites.js b/wwwroot/js/app.customerSites.js new file mode 100644 index 0000000..be67b3f --- /dev/null +++ b/wwwroot/js/app.customerSites.js @@ -0,0 +1,131 @@ +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.customerSites = (function () { + 'use strict'; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var + + configMap = { + //main_html: '', + + settable_map: {} + }, + stateMap = { + $append_target: null + }, + onSubmit, + configModule, initModule; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + //-------------------- END UTILITY METHODS ------------------- + + //--------------------- BEGIN DOM METHODS -------------------- + + + + + // Begin private DOM methods + + + + // End private DOM methods + //---------------------- END DOM METHODS --------------------- + + //------------------- BEGIN EVENT HANDLERS ------------------- + + + + + + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + //CONFIGMODULE + // + configModule = function (context) { + stateMap.context = context.context; + if (stateMap.context.params.id) { + stateMap.id = stateMap.context.params.id; + } + }; + + // Begin public method /initModule/ + // Example : app.customer.initModule( $('#div_id') ); + // Purpose : directs the module to being offering features + // Arguments : $container - container to use + // Action : Provides interface + // Returns : none + // Throws : none + // + initModule = function ($container) { + if (typeof $container === 'undefined') { + $container = $('#app-shell-main-content'); + } + + $container.html(Handlebars.templates['app.customerSites']({})); + + var title = "Sites"; + + if (stateMap.id) { + + + app.api.get('customer/' + stateMap.id + '/name', function (res) { + if (res.error) { + $.gevent.publish('app-show-error',res.msg); + } else { + //set customer name + title = 'Sites - ' + res.name; + //app.nav.setContextTitle(title); + + + if (stateMap.id) { + + //fetch sites list + + //fetch existing record + app.api.get('customer/' + stateMap.id + '/sites', function (res) { + if (res.error) { + $.gevent.publish('app-show-error',res.msg); + } else { + //get the list ul + var $appList = $('#rf-list'); + + $.each(res, function (i, obj) { + $appList.append("

  • " + + app.utilB.genListColumn(obj.name) + + "
  • ") + }); + + } + }); + } + } + }); + } + + //Context menu + app.nav.contextClear(); + app.nav.contextAddLink('customerSiteEdit/new/' + stateMap.id, "New", "plus"); + app.nav.contextAddLink("customerEdit/" + stateMap.id, "Customer", "account"); + + + }; + // End public method /initModule/ + + + + // return public methods + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +}()); \ No newline at end of file diff --git a/wwwroot/js/app.customers.js b/wwwroot/js/app.customers.js new file mode 100644 index 0000000..edc1f35 --- /dev/null +++ b/wwwroot/js/app.customers.js @@ -0,0 +1,192 @@ +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.customers = (function() { + "use strict"; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var stateMap = {}, + configModule, + initModule, + generateCard, + onShowMore; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + ////////////////// + //Generate a card with collapsible middle section with more details + // + generateCard = function(obj) { + var editUrl = "#!/customerEdit/" + obj.id; + var cardClass = obj.active + ? "border-primary text-primary" + : "border-secondary text-secondary"; + var urlClass = obj.active ? "" : "text-secondary"; + + return ( + '" + ); + }; + //-------------------- END UTILITY METHODS ------------------- + + //------------------- BEGIN EVENT HANDLERS ------------------- + + //////////////////////////////////////////// + //ONMORE + // + onShowMore = function(event) { + event.preventDefault(); + + var customerId = event.data; + var $cardbody = $("#card-body" + customerId); + var $collapseDiv = $("#card-collapse" + customerId); + + var isOpen = $collapseDiv.hasClass("show"); + + //either way we don't want the old contents hanging around + $cardbody.empty(); + + //Reload the data? + if (!isOpen) { + //=================== + //Get sites + app.api.get("customer/" + customerId + "/activesubforsites", function( + sites + ) { + if (sites.error) { + $.gevent.publish("app-show-error", sites.msg); + } else { + var cardDisplay = '
      '; + + //Iterate the sites + for (var y = 0; y < sites.length; y++) { + //append the site name + cardDisplay += + '
    • ' + sites[y].name + "
    • "; + + //append the active subs + //purchase link for future + //https://rockfish.ayanova.com/default.htm#!/purchaseEdit// + if (sites[y].children.length > 0) { + cardDisplay += '
        '; + for (var x = 0; x < sites[y].children.length; x++) { + cardDisplay += "
      • " + sites[y].children[x].name + "
      • "; + } + cardDisplay += "
      "; + } else { + cardDisplay += + '
      • NO ACTIVE SUBS
      '; + } + } + cardDisplay += "
    "; + $cardbody.append(cardDisplay); + //Toggle open after populating the card + $collapseDiv.collapse("toggle"); + } + }); + //=========/sites============== + } else { + //Toggle closed + $collapseDiv.collapse("toggle"); + } + + return false; + }; + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + //CONFIGMODULE + // + configModule = function(context) { + stateMap.context = context.context; + if (stateMap.context.params.id) { + stateMap.id = stateMap.context.params.id; + } + }; + + //INITMODULE + // + initModule = function($container) { + if (typeof $container === "undefined") { + $container = $("#app-shell-main-content"); + } + $container.html(Handlebars.templates["app.customers"]({})); + + //=================== + //Get customers + app.api.get("customer/list", function(res) { + if (res.error) { + $.gevent.publish("app-show-error", res.msg); + } else { + var $appList = $("#rf-list"); + + var activeCount = 0; + var inactiveCount = 0; + + $.each(res, function(i, obj) { + if (obj.active) { + activeCount++; + } else { + inactiveCount++; + } + + $appList.append(generateCard(obj)); + $("#btnMore" + obj.id).bind("click", obj.id, onShowMore); + }); + + //Show the count of customers active and inactive + $("#rf-list-count") + .empty() + .append( + res.length + + " items (" + + activeCount + + " active, " + + inactiveCount + + " inactive)" + ); + } + }); + //=========/customers============== + + app.nav.contextClear(); + app.nav.contextAddLink("customerEdit/new", "New", "plus"); + app.nav.contextAddLink("search", "Search", "magnify"); + }; + + //PUBLIC METHODS + // + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +})(); diff --git a/wwwroot/js/app.fourohfour.js b/wwwroot/js/app.fourohfour.js new file mode 100644 index 0000000..8a2bfd9 --- /dev/null +++ b/wwwroot/js/app.fourohfour.js @@ -0,0 +1,56 @@ +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.fourohfour = (function() { + 'use strict'; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var + + stateMap = {}, + configModule, + initModule; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + //-------------------- END UTILITY METHODS ------------------- + + //------------------- BEGIN EVENT HANDLERS ------------------- + + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + //CONFIGMODULE + // + configModule = function(context) { + stateMap.context = context.context; + if (stateMap.context.params.id) { + stateMap.id = stateMap.context.params.id; + } + }; + + //INITMODULE + // + initModule = function($container) { + if (typeof $container === 'undefined') { + $container = $('#app-shell-main-content'); + } + $container.html(Handlebars.templates['app.fourohfour']({})); + + + + }; + + //PUBLIC METHODS + // + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +}()); \ No newline at end of file diff --git a/wwwroot/js/app.inbox.js b/wwwroot/js/app.inbox.js new file mode 100644 index 0000000..53eea47 --- /dev/null +++ b/wwwroot/js/app.inbox.js @@ -0,0 +1,167 @@ +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.inbox = (function() { + "use strict"; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var stateMap = {}, + configModule, + initModule, + terminateModule, + getMessages, + timerVar=null; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + getMessages = function() { + stateMap.$appList.html("

    Checking...

    "); + + app.api.get("mail/salesandsupportsummaries", function(res) { + if (res.error) { + $.gevent.publish("app-show-error", res.msg); + } else { + stateMap.$appList.empty(); + var newMessageCount = 0; + var lastAccount = ""; + //The list + var displayedItems = 0; + var generatedHtml = '
      '; + + //Iterate the results + for (var y = 0; y < res.length; y++) { + var obj = res[y]; + if (!obj.flags.includes("deleted")) { + if (!obj.flags.includes("seen")) { + newMessageCount++; + } + var displayClass = obj.flags.includes("seen") + ? "border-secondary text-secondary" + : "border-primary text-primary"; + var answeredIconClass = obj.flags.includes("answered") + ? " mdi mdi-reply" + : ""; + + //Make a group on change of account + if (lastAccount !== obj.account) { + lastAccount = obj.account; + //Insert as 'header' in list + generatedHtml += + '
    • ' + lastAccount + "
    • "; + } + + //LIST ITEM + generatedHtml += + '
    • " + + obj.subject + + " - " + + obj.from + + "
    • "; + displayedItems++; + } //if not deleted + } //loop + + //Nothing to display? + if (!displayedItems) { + generatedHtml += + '
    • NO MESSAGES - ' + + moment().format("YYYY-MM-DD LT") + + "
    • "; + } + + //close list group + generatedHtml += "
    "; + + generatedHtml += + '
    Last check: ' + + moment().format("YYYY-MM-DD LT") + + "
    "; + //SET IT + stateMap.$appList.append(generatedHtml); + + //case 3516 + if (newMessageCount > 0) { + document.title = + newMessageCount + + " NEW message" + + (newMessageCount == 1 ? "" : "s"); + } else { + document.title = "No new messages"; + } + } + //do it every 5 minutes + timerVar=setTimeout(getMessages,5*60*1000); + console.log("INBOX.GETMESSAGES - started timer " + timerVar); + }); + }; + //-------------------- END UTILITY METHODS ------------------- + + //------------------- BEGIN EVENT HANDLERS ------------------- + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + //CONFIGMODULE + // + configModule = function(context) { + stateMap.context = context.context; + if (stateMap.context.params.id) { + stateMap.id = stateMap.context.params.id; + } + }; + + //INITMODULE + // + initModule = function($container) { + if (typeof $container === "undefined") { + $container = $("#app-shell-main-content"); + } + $container.html(Handlebars.templates["app.inbox"]({})); + stateMap.$appList = $("#rf-list-div"); + + getMessages(); + + //auto refresh every 10 minutes + + // intervalRef = setInterval(function() { + // getMessages(); + // }, 10 * 60 * 1000); + + app.nav.contextClear(); + ////app.nav.setContextTitle("inbox"); + }; + + // TERMINATE MODULE + // + terminateModule = function() { + + if(timerVar!=null){ + clearTimeout(timerVar); + console.log("INBOX.TERMINATEMODULE - cleared timer" + timerVar); + } + //clear up event handler + // clearInterval(intervalRef); + // intervalRef=null; + //console.log("INBOX.TERMINATEMODULE"); + }; + + //PUBLIC METHODS + // + return { + configModule: configModule, + initModule: initModule, + terminateModule: terminateModule + }; + //------------------- END PUBLIC METHODS --------------------- +})(); diff --git a/wwwroot/js/app.license.js b/wwwroot/js/app.license.js new file mode 100644 index 0000000..f3bfc67 --- /dev/null +++ b/wwwroot/js/app.license.js @@ -0,0 +1,156 @@ +/* + * app.license.js + * License key generator + */ + +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.license = (function () { + 'use strict'; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var + + stateMap = {}, + configModule, initModule, onGenerate, onSelectAllAddOns; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + //-------------------- END UTILITY METHODS ------------------- + + + //------------------- BEGIN EVENT HANDLERS ------------------- + onGenerate = function (event) { + + event.preventDefault(); + $.gevent.publish('app-clear-error'); + //get form data + var formData = $("form").serializeArray({ + checkboxesAsBools: true + }); + + var submitData = app.utilB.objectifyFormDataArray(formData); + + app.api.createLicense(submitData, function (res) { + if (res.error) { + $.gevent.publish('app-show-error', res.msg); + } else { + $('#key').val(res); + return false; + } + }); + + return false; //prevent default + }; + + + onSelectAllAddOns = function (event) { + event.preventDefault(); + $('#wbi').prop('checked', true); + $('#mbi').prop('checked', true); + $('#ri').prop('checked', true); + $('#qbi').prop('checked', true); + $('#qboi').prop('checked', true); + $('#pti').prop('checked', true); + $('#quickNotification').prop('checked', true); + $('#exportToXls').prop('checked', true); + $('#outlookSchedule').prop('checked', true); + $('#oli').prop('checked', true); + $('#importExportCSVDuplicate').prop('checked', true); + + + + return false; //prevent default + }; + + // onTemplates = function(event) { + // event.preventDefault(); + // alert("STUB: templates"); + + + // return false; //prevent default + // }; + + + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + //CONFIGMODULE + // + configModule = function (context) { + stateMap.context = context.context; + if (stateMap.context.params.id) { + stateMap.id = stateMap.context.params.id; + } + }; + + //INITMODULE + // + initModule = function ($container) { + if (typeof $container === 'undefined') { + $container = $('#app-shell-main-content'); + } + $container.html(Handlebars.templates['app.license']({})); + + + //case 3233 customer list + //Fill customer list combo + var customerList = {}; + + + //get customers + app.api.get('customer/list', function (res) { + if (res.error) { + $.gevent.publish('app-show-error', res.msg); + } else { + + var html = ''; + + for (var i = 0, len = res.length; i < len; ++i) { + html += (''); + customerList[res[i]['id']] = res[i]['name']; + } + $('#customerId').append(html); + } + }); + + + //Context menu + app.nav.contextClear(); + + ////app.nav.setContextTitle("License"); + + //make context menu + + + //Context menu + app.nav.contextClear(); + app.nav.contextAddButton('btn-generate', 'Make', 'key', onGenerate); + app.nav.contextAddButton('btn-select-all-addons', 'All', 'check-all', onSelectAllAddOns); + // app.nav.contextAddLink("licenseRequests/", "Requests", "voice"); + app.nav.contextAddLink("licenseTemplates/", "", "layers"); + //case 3233 + app.nav.contextAddLink("licenses/", "List", ""); + + + //set all date inputs to today plus one year + var oneYearFromNow = moment().add(1, 'years').toISOString().substring(0, 10); + var oneMonthFromNow = moment().add(1, 'months').toISOString().substring(0, 10); + $('input[type="date"]').val(oneYearFromNow); + $('#lockoutDate').val(oneMonthFromNow); + + }; + + // return public methods + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +}()); \ No newline at end of file diff --git a/wwwroot/js/app.licenseRequestEdit.js b/wwwroot/js/app.licenseRequestEdit.js new file mode 100644 index 0000000..6be95e0 --- /dev/null +++ b/wwwroot/js/app.licenseRequestEdit.js @@ -0,0 +1,138 @@ +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.licenseRequestEdit = (function () { + 'use strict'; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var + stateMap = {}, + onSend, onCancel, onRegenerate, configModule, initModule; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + //-------------------- END UTILITY METHODS ------------------- + + //------------------- BEGIN EVENT HANDLERS ------------------- + + //////////////////// + // + onSend = function (event) { + + event.preventDefault(); + $.gevent.publish('app-clear-error'); + //get form data + var formData = $("form").serializeArray({ + checkboxesAsBools: true + }); + + var submitData = app.utilB.objectifyFormDataArray(formData); + + app.api.licenseEmailResponse(submitData, function (res) { + if (res.error) { + $.gevent.publish('app-show-error',res.msg); + } else { + //navigate back to licenseRequests + //alert("key has been sent!"); + window.location.href = "#!/inbox/"; + + //$('#key').val(res); + return false; + } + }); + + return false; //prevent default + }; + + + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + //CONFIGMODULE + // + configModule = function (context) { + stateMap.context = context.context; + if (stateMap.context.params.id) { + stateMap.id = stateMap.context.params.id; + } + }; + + //INITMODULE + // + initModule = function ($container) { + if (typeof $container === 'undefined') { + $container = $('#app-shell-main-content'); + } + + $container.html(Handlebars.templates['app.licenseRequestEdit']({})); + ////app.nav.setContextTitle("Request"); + + //Append key hidden values for submit and processing by server + //This is set from the original click to open this form + $('').attr('type', 'hidden') + .attr('name', "request_email_uid") + .attr('value', stateMap.id) + .appendTo('#frm'); + + //These are empty but will be filled in when the server responds with the "record" + //They are for re-submission back to the server to save a step of refetching the original info + //and recalculating stuff that was already done + + $('').attr('type', 'hidden') + .attr('name', "requestReplyToAddress") + .attr('value', '') + .appendTo('#frm'); + + $('').attr('type', 'hidden') + .attr('name', "requestFromReplySubject") + .attr('value', '') + .appendTo('#frm'); + + //rfcore unused? + $('').attr('type', 'hidden') + .attr('name', "greetingReplySubject") + .attr('value', '') + .appendTo('#frm'); + + $('').attr('type', 'hidden') + .attr('name', "requestFromReplySubject") + .attr('value', '') + .appendTo('#frm'); + + + + + //fetch existing record + app.api.generateFromRequest(stateMap.id, function (res) { + if (res.error) { + $.gevent.publish('app-show-error',res.msg); + } else { + //fill out form + app.utilB.formData(res); + } + }); + + //Context menu + app.nav.contextClear(); + app.nav.contextAddButton('btn-generate', 'Send', 'send', onSend); + app.nav.contextAddLink("inbox/", "Inbox", "inbox"); + + + + }; + + + + + // return public methods + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +}()); \ No newline at end of file diff --git a/wwwroot/js/app.licenseTemplates.js b/wwwroot/js/app.licenseTemplates.js new file mode 100644 index 0000000..3597ca6 --- /dev/null +++ b/wwwroot/js/app.licenseTemplates.js @@ -0,0 +1,102 @@ +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.licenseTemplates = (function () { + + 'use strict'; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var + stateMap = {}, + onSave, configModule, initModule; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + //-------------------- END UTILITY METHODS ------------------- + + //------------------- BEGIN EVENT HANDLERS ------------------- + + + //different than the other edit routes because it's global and there is only one + //so no ID + onSave = function (event) { + + event.preventDefault(); + $.gevent.publish('app-clear-error'); + //get form data + var formData = $("form").serializeArray({ + checkboxesAsBools: true + }); + + var submitData = app.utilB.objectifyFormDataArray(formData); + submitData["id"] = '1'; + + app.api.update('licenseTemplates', submitData, function (res) { + if (res.error) { + $.gevent.publish('app-show-error',res.msg); + } + }); + + return false; //prevent default + }; + + + + + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + //CONFIGMODULE + // + configModule = function (context) { + stateMap.context = context.context; + // if (stateMap.context.params.id) { + // stateMap.id = stateMap.context.params.id; + // } + }; + + //INITMODULE + // + initModule = function ($container) { + if (typeof $container === 'undefined') { + $container = $('#app-shell-main-content'); + } + + $container.html(Handlebars.templates['app.licenseTemplates']({})); + + //fetch existing record + //Note license templates record id is always 1 as there is only ever one record in db + app.api.get('licenseTemplates/' + '1', function (res) { + if (res.error) { + $.gevent.publish('app-show-error',res.msg); + } else { + //fill out form + app.utilB.formData(res); + } + }); + + //set title + // var title = "License message templates"; + // //app.nav.setContextTitle(title); + + // bind actions + $('#btn-save').bind('click', onSave); + + //Context menu + app.nav.contextClear(); + app.nav.contextAddLink("license/", "License", "key"); + }; + + + // return public methods + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +}()); \ No newline at end of file diff --git a/wwwroot/js/app.licenseView.js b/wwwroot/js/app.licenseView.js new file mode 100644 index 0000000..57f0c5d --- /dev/null +++ b/wwwroot/js/app.licenseView.js @@ -0,0 +1,116 @@ +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.licenseView = (function () { + 'use strict'; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var + stateMap = {}, + onSave, onDelete, + configModule, initModule; + //----------------- END MODULE SCOPE VARIABLES --------------- + + + //------------------- BEGIN EVENT HANDLERS ------------------- + + //ONSAVE + // + onSave = function (event) { + event.preventDefault(); + $.gevent.publish('app-clear-error'); + + var isFetched=$('#fetched').prop('checked') + + // var submitData = { isFetched: isFetched }; + app.api.putAction('license/fetched/' + stateMap.id + "/" + isFetched, function (res) { + if (res.error) { + $.gevent.publish('app-show-error', res.msg); + } + }); + + return false; //prevent default? + }; + + //ONDELETE + // + onDelete = function (event) { + event.preventDefault(); + $.gevent.publish('app-clear-error'); + var r = confirm("Are you sure you want to delete this record?"); + if (r == true) { + app.api.remove('license/' + stateMap.id, function (res) { + if (res.error) { + $.gevent.publish('app-show-error', res.msg); + } else { + page('#!/licenses'); + return false; + } + }); + + } else { + return false; + } + return false; //prevent default? + }; + + + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + + + //CONFIGMODULE + // + configModule = function (context) { + stateMap.context = context.context; + if (stateMap.context.params.id) { + stateMap.id = stateMap.context.params.id; + } + }; + + //INITMODULE + // + initModule = function ($container) { + if (typeof $container === 'undefined') { + $container = $('#app-shell-main-content'); + } + + $container.html(Handlebars.templates['app.licenseView']({})); + + document.title = 'License '; + + //fetch existing record + app.api.get('license/' + stateMap.id, function (res) { + if (res.error) { + $.gevent.publish('app-show-error', res.msg); + } else { + //fill out form + app.utilB.formData(res); + } + }); + //Context menu + app.nav.contextClear(); + app.nav.contextAddLink("licenses/", "List", ""); + + + + // bind actions + $('#btn-save').bind('click', onSave); + $('#btn-delete').bind('click', onDelete); + }; + + + // RETURN PUBLIC METHODS + // + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +}()); \ No newline at end of file diff --git a/wwwroot/js/app.licenses.js b/wwwroot/js/app.licenses.js new file mode 100644 index 0000000..51b4e96 --- /dev/null +++ b/wwwroot/js/app.licenses.js @@ -0,0 +1,108 @@ +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.licenses = (function() { + "use strict"; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var stateMap = {}, + configModule, + initModule; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + + //-------------------- END UTILITY METHODS ------------------- + + //------------------- BEGIN EVENT HANDLERS ------------------- + + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + //CONFIGMODULE + // + configModule = function(context) { + stateMap.context = context.context; + if (stateMap.context.params.id) { + stateMap.id = stateMap.context.params.id; + } + }; + + //INITMODULE + // + initModule = function($container) { + if (typeof $container === "undefined") { + $container = $("#app-shell-main-content"); + } + $container.html(Handlebars.templates["app.licenses"]({})); + + //case 3513 + document.title = "Licenses"; + + //=================== + //Get licenses + app.api.get("license/list", function(res) { + if (res.error) { + $.gevent.publish("app-show-error", res.msg); + } else { + var $appList = $("#rf-list"); + + $appList.append('"); + } + }); + //=========/licenses============== + + app.nav.contextClear(); + }; + + //PUBLIC METHODS + // + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +})(); diff --git a/wwwroot/js/app.mailEdit.js b/wwwroot/js/app.mailEdit.js new file mode 100644 index 0000000..51b4e2d --- /dev/null +++ b/wwwroot/js/app.mailEdit.js @@ -0,0 +1,160 @@ +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.mailEdit = (function () { + 'use strict'; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var + stateMap = {}, + onSave, onDelete, onSend, + configModule, initModule; + //----------------- END MODULE SCOPE VARIABLES --------------- + + + //------------------- BEGIN EVENT HANDLERS ------------------- + + /////////////////////////////////// + // SEND A REPLY OR NEW MESSAGE + // + onSend = function (event) { + event.preventDefault(); + + $.gevent.publish('app-clear-error'); + + //get form data + var formData = $("form").serializeArray({ + checkboxesAsBools: true + }); + + //var submitData = {composition:$("#composition").val()}; + var submitData = app.utilB.objectifyFormDataArray(formData); + + //is this a new record? + if (stateMap.id != 'new') { + //put id into the form data + // submitData.id = stateMap.id; + + app.api.create('mail/reply/' + + stateMap.context.params.mail_account + + '/' + stateMap.context.params.mail_id, submitData, function (res) { + if (res.error) { + $.gevent.publish('app-show-error', res.msg); + } else { + page('#!/inbox'); + } + }); + } else { + alert("STUB: New message composition not implemented yet"); + // //it's a new record - create + // app.api.create('customer', submitData, function (res) { + // if (res.error) { + // $.gevent.publish('app-show-error',res.msg); + // } else { + // page('#!/inbox'); + // } + // }); + } + + + return false; + }; + + //ONDELETE + // + //removed + + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + + + //CONFIGMODULE + // + configModule = function (context) { + stateMap.context = context.context; + if (stateMap.context.params.id) { + stateMap.id = stateMap.context.params.id; + } + }; + + //INITMODULE + // + initModule = function ($container) { + if (typeof $container === 'undefined') { + $container = $('#app-shell-main-content'); + } + + $container.html(Handlebars.templates['app.mailEdit']({})); + // stateMap.replyMode = false; + // if (stateMap.context.querystring.endsWith('reply')) { + // stateMap.replyMode = true; + // } + + app.nav.contextClear(); + app.nav.contextAddLink("inbox/", "Inbox", "inbox"); + + //id should always have a value, either a record id or the keyword 'new' for making a new object + if (stateMap.id != 'new') { + + //fetch existing record + app.api.get( + 'mail/preview/' + + stateMap.context.params.mail_account + + '/' + stateMap.context.params.mail_folder + + '/' + stateMap.context.params.mail_id, function (res) { + if (res.error) { + // app.nav.contextClear(); + // app.nav.contextAddLink("inbox/", "Inbox", "inbox"); + $.gevent.publish('app-show-error', res.msg); + } else { + //fill out form + // app.nav.contextClear(); + //app.nav.contextAddLink("inbox/", "Inbox", "inbox"); + $('#message').text(res.preview); + if(res.isKeyRequest){ + app.nav.contextAddLink("licenseRequestEdit/" + res.id, "Make", "key"); + }else{ + $('#composition').text("\n\n- John\nwww.ayanova.com"); + } + } + }); + + $('#btn-send').bind('click', onSend); + + //Context menu + + //app.nav.contextAddButton('btn-send', 'Send reply', 'send', onSend); + + // app.nav.contextAddButton('btn-generate', 'Build', 'key', onReply); + // app.nav.contextAddLink("customerSites/" + stateMap.id, "Sites", "city");//url title icon + + + + } else { + //NEW email options + var $group = $("#sendToGroup"); + $group.removeClass("invisible"); + + // app.nav.contextClear(); + // app.nav.contextAddLink("inbox/", "Inbox", "inbox"); + // app.nav.contextAddButton('btn-send', 'Send', 'send', onSend); + } + + + }; + + + // RETURN PUBLIC METHODS + // + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +}()); \ No newline at end of file diff --git a/wwwroot/js/app.nav.js b/wwwroot/js/app.nav.js new file mode 100644 index 0000000..4e0e466 --- /dev/null +++ b/wwwroot/js/app.nav.js @@ -0,0 +1,102 @@ +/* + * app.nav.js + * Handle dynamic navigation related operations + * toobar, menu, fab etc + * +*/ + +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ +/*global $, app */ + +app.nav = (function () { + var contextClear, contextAddButton, contextAddLink, backUrl, backRemove, moreMenuInitialized, + setContextTitle, setSelectedMenuItem; + + + + // /////////////////////////////////////////// + // //Set context menu title + // // + // var setContextTitle = function (title) { + // $("#rf-context-title").html(title + "..."); + // } + + //////////////////////////////////////////////// + //Clear the contents of the context menu (reset it) + // + contextClear = function () { + $("#rf-context-group").empty(); + $("#rf-context-group").addClass("invisible"); + + }; + + + + //////////////////////////////////////////////// + //Add a non nav button item to the context menu + // + contextAddButton = function (id, title, icon, clickHandler) { + var $group=$("#rf-context-group"); + $group.removeClass("invisible"); + + var iconClass = ''; + if (icon) { + iconClass = "mdi mdi-" + icon; + } + $group.append( + ' + + //////////////////////////////////////////////// + //Add an url item to the context menu handling + //phone vs larger sizes + // + contextAddLink = function (url, title, icon) { + var $group=$("#rf-context-group"); + $group.removeClass("invisible"); + var iconClass = ''; + if (icon) { + iconClass = "mdi mdi-" + icon; + } + $group.append( + '' + title + '' + ); + }; + + + //////////////////////////////////////////////// + //Set the active class on the selected menu item + // + setSelectedMenuItem = function (selectedMenuItem) { + $(".nav-item").removeClass("active"); + if (selectedMenuItem) { + $("#" + selectedMenuItem).addClass("active"); + } + + + }; + + + + + + return { + contextClear: contextClear, + contextAddButton: contextAddButton, + contextAddLink: contextAddLink, + setContextTitle: setContextTitle, + setSelectedMenuItem: setSelectedMenuItem + + }; +}()); diff --git a/wwwroot/js/app.purchaseEdit.js b/wwwroot/js/app.purchaseEdit.js new file mode 100644 index 0000000..442517d --- /dev/null +++ b/wwwroot/js/app.purchaseEdit.js @@ -0,0 +1,266 @@ +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.purchaseEdit = (function() { + "use strict"; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var stateMap = {}, + onSave, + onDelete, + onRenew, + configModule, + initModule, + onPasteNotes; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + //-------------------- END UTILITY METHODS ------------------- + + //------------------- BEGIN EVENT HANDLERS ------------------- + + onSave = function(event) { + event.preventDefault(); + $.gevent.publish("app-clear-error"); + //get form data + var formData = $("form").serializeArray({ + checkboxesAsBools: true + }); + + var submitData = app.utilB.objectifyFormDataArray(formData); + + //is this a new record? + if (stateMap.id != "new") { + //put id into the form data + submitData.id = stateMap.id; + + app.api.update("purchase", submitData, function(res) { + if (res.error) { + $.gevent.publish("app-show-error", res.msg); + } + }); + } else { + //create new record + app.api.create("purchase", submitData, function(res) { + if (res.error) { + $.gevent.publish("app-show-error", res.msg); + } else { + page( + "#!/purchaseEdit/" + res.id + "/" + stateMap.context.params.site_id + ); + return false; + } + }); + } + return false; //prevent default + }; + + onRenew = function(event) { + event.preventDefault(); + $.gevent.publish("app-clear-error"); + + if (stateMap.id == "new") { + $.gevent.publish( + "app-show-error", + "Save this record before attempting to renew it" + ); + return false; + } + stateMap.id = "new"; + + //case 3396, no more renewal or dupe names + // var nm = $('#name').val(); + // nm = "DUPE-" + nm; + // $('#name').val(nm); + + //case 3396, set values accordingly + + //Clear salesOrderNumber + $("#salesOrderNumber").val(""); + + //set purchaseDate to today + $("#purchaseDate").val( + moment() + .toISOString() + .substring(0, 10) + ); + + //set expireDate to plus one year from today + $("#expireDate").val( + moment() + .add(1, "years") + .toISOString() + .substring(0, 10) + ); + + //clear the couponCode + $("#couponCode").val(""); + + //clear the notes + $("#notes").val(""); + + $("#renewNoticeSent").prop("checked", false); + $("#cancelDate").val(""); + + return false; //prevent default + }; + + //ONDELETE + // + onDelete = function(event) { + event.preventDefault(); + $.gevent.publish("app-clear-error"); + + var r = confirm("Are you sure you want to delete this record?"); + if (r == true) { + //==== DELETE ==== + app.api.remove("purchase/" + stateMap.id, function(res) { + if (res.error) { + $.gevent.publish("app-show-error", res.msg); + } else { + //deleted, return to master list + page("#!/purchases/" + stateMap.context.params.site_id); + return false; + } + }); + } else { + return false; + } + return false; //prevent default? + }; + + onPasteNotes = function(event) { + var clipboardData, pastedData; + var e = event.originalEvent; + + // // Stop data actually being pasted into div + // e.stopPropagation(); + // e.preventDefault(); + + // Get pasted data via clipboard API + clipboardData = e.clipboardData || window.clipboardData; + pastedData = clipboardData.getData("Text"); + + //Iterate through the lines looking for the SHareIt name=value lines (they all contain equal signs) + var lines = pastedData.split("\n"); // lines is an array of strings + var purchaseData = {}; + + // Loop through all lines + for (var j = 0; j < lines.length; j++) { + var thisLine = lines[j]; + if (thisLine.includes("=")) { + var thisElement = thisLine.split("="); + purchaseData[thisElement[0].trim()] = thisElement[1].trim(); + } + } + + //Now have an object with the value pairs in it + if (purchaseData["ShareIt Ref #"]) { + $("#salesOrderNumber").val(purchaseData["ShareIt Ref #"]); + } + + // if (purchaseData["E-Mail"]) { + // $("#email").val(purchaseData["E-Mail"]); + // } + }; + + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + //CONFIGMODULE + // + configModule = function(context) { + stateMap.context = context.context; + if (stateMap.context.params.id) { + stateMap.id = stateMap.context.params.id; + } + }; + + //INITMODULE + // + initModule = function($container) { + if (typeof $container === "undefined") { + $container = $("#app-shell-main-content"); + } + + $container.html(Handlebars.templates["app.purchaseEdit"]({})); + var title = "Purchase"; + + if (!stateMap.context.params.site_id) { + throw "app.purchaseEdit.js::initModule - There is no stateMap.context.params.site_id!"; + } + + //Append master record id as a hidden form field for referential integrity + $("") + .attr("type", "hidden") + .attr("name", "siteId") + .attr("value", stateMap.context.params.site_id) + .appendTo("#frm"); + + //fetch entire site record to get name *and* customer id which is required for redundancy + + //RFC - get site name and customer name for form + + app.api.get("site/" + stateMap.context.params.site_id, function(res) { + if (res.error) { + $.gevent.publish("app-show-error", res.msg); + } else { + //Also append customer ID redundantly + $("") + .attr("type", "hidden") + .attr("name", "customerId") + .attr("value", res.customerId) + .appendTo("#frm"); + + title = "Purchase - " + res.name; + if (stateMap.id != "new") { + //fetch existing record + app.api.get("purchase/" + stateMap.id, function(res) { + if (res.error) { + $.gevent.publish("app-show-error", res.msg); + } else { + //fill out form + app.utilB.formData(res); + } + }); + } else { + //it's a new record, set default + $("#purchaseDate").val(new Date().toISOString().substring(0, 10)); + } + //set title + //app.nav.setContextTitle(title); + } + }); + + //Context menu + app.nav.contextClear(); + app.nav.contextAddLink( + "purchases/" + stateMap.context.params.site_id, + "Purchases", + "basket" + ); + + // bind actions + $("#btn-save").bind("click", onSave); + $("#btn-delete").bind("click", onDelete); + $("#btn-renew").bind("click", onRenew); + $("#notes").bind("paste", onPasteNotes); + + //Autocomplete + app.utilB.autoComplete("name", "purchase.name"); + app.utilB.autoComplete("productCode", "purchase.productCode"); + app.utilB.autoComplete("vendorName", "purchase.vendorName"); + }; + + // return public methods + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +})(); diff --git a/wwwroot/js/app.purchases.js b/wwwroot/js/app.purchases.js new file mode 100644 index 0000000..f8913ed --- /dev/null +++ b/wwwroot/js/app.purchases.js @@ -0,0 +1,145 @@ +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.purchases = (function () { + 'use strict'; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var + + configMap = { + //main_html: '', + + settable_map: {} + }, + stateMap = { + $append_target: null + }, + onSubmit, loadList, configModule, initModule; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + loadList = function () { + //---- + //fetch + app.api.get('site/' + stateMap.id + '/purchases', function (res) { + if (res.error) { + $.gevent.publish('app-show-error',res.msg); + } else { + //get the list ul + var $appList = $('#rf-list'); + $appList.empty(); + $.each(res, function (i, obj) { + + if (obj.cancelDate) { + $appList.append("
  • " + + // app.utilB.genListColumn(app.utilB.epochToShortDate(obj.purchaseDate)) + + // ' ' + + ""+ + app.utilB.genListColumn(obj.name) + + " cancelled " + + app.utilB.genListColumn(app.utilB.epochToShortDate(obj.cancelDate)) + + ""+ + "
  • "); + } else { + $appList.append("
  • " + + // app.utilB.genListColumn(app.utilB.epochToShortDate(obj.purchaseDate)) + + // ' ' + + app.utilB.genListColumn(obj.name) + + " expires " + + app.utilB.genListColumn(app.utilB.epochToShortDate(obj.expireDate)) + + "
  • "); + + // + } + + + + + }); + } + }); + //------ + } + //-------------------- END UTILITY METHODS ------------------- + + //--------------------- BEGIN DOM METHODS -------------------- + + + + + // Begin private DOM methods + + + + // End private DOM methods + //---------------------- END DOM METHODS --------------------- + + //------------------- BEGIN EVENT HANDLERS ------------------- + + + + + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + //CONFIGMODULE + // + configModule = function (context) { + stateMap.context = context.context; + if (stateMap.context.params.id) { + stateMap.id = stateMap.context.params.id; + } + }; + + // Begin public method /initModule/ + // Example : app.customer.initModule( $('#div_id') ); + // Purpose : directs the module to being offering features + // Arguments : $container - container to use + // Action : Provides interface + // Returns : none + // Throws : none + // + initModule = function ($container) { + if (typeof $container === 'undefined') { + $container = $('#app-shell-main-content'); + } + stateMap.sortOrder = 'd'; + $container.html(Handlebars.templates['app.purchases']({})); + + if (!stateMap.id) { + throw ('app.purchases.js::initModule - There is no stateMap.id!'); + } + + app.api.get('site/' + stateMap.id, function (res) { + if (res.error) { + $.gevent.publish('app-show-error',res.msg); + } else { + + //Context menu + app.nav.contextClear(); + app.nav.contextAddLink('purchaseEdit/new/' + stateMap.id, "New", "plus"); + app.nav.contextAddLink("customerEdit/" + res.customerId, "Customer", "account"); + app.nav.contextAddLink("customerSiteEdit/" + stateMap.id + '/' + res.customerId, "Site", "city"); + if (stateMap.id) { + loadList(); + } + } + }); + }; + // End public method /initModule/ + + + + // return public methods + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +}()); \ No newline at end of file diff --git a/wwwroot/js/app.reportData.js b/wwwroot/js/app.reportData.js new file mode 100644 index 0000000..cd31970 --- /dev/null +++ b/wwwroot/js/app.reportData.js @@ -0,0 +1,67 @@ +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.reportData = (function () { + 'use strict'; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var + + stateMap = {}, + configModule, + initModule; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + //-------------------- END UTILITY METHODS ------------------- + + //------------------- BEGIN EVENT HANDLERS ------------------- + + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + //CONFIGMODULE + // + configModule = function (context) { + stateMap.context = context.context; + if (stateMap.context.params.id) { + stateMap.id = stateMap.context.params.id; + } + }; + + //INITMODULE + // + initModule = function ($container) { + if (typeof $container === 'undefined') { + $container = $('#app-shell-main-content'); + } + $container.html(Handlebars.templates['app.reportData']({})); + + //Context menu + app.nav.contextClear(); + ////app.nav.setContextTitle("Reports"); + app.nav.contextAddLink("templates", "Templates", "widgets");//url title icon + + + + + var $appList = $('#rf-list'); + $appList.empty(); + $appList.append("
  • " + app.utilB.genListColumn("Get emails CSV by product code") + "
  • "); + $appList.append("
  • " + app.utilB.genListColumn("Expiring subscriptions") + "
  • "); + + }; + + //PUBLIC METHODS + // + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +}()); \ No newline at end of file diff --git a/wwwroot/js/app.reportDataExpires.js b/wwwroot/js/app.reportDataExpires.js new file mode 100644 index 0000000..a9f0c87 --- /dev/null +++ b/wwwroot/js/app.reportDataExpires.js @@ -0,0 +1,79 @@ +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.reportDataExpires = (function () { + + 'use strict'; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var + stateMap = {}, + configModule, + initModule; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + //-------------------- END UTILITY METHODS ------------------- + + //------------------- BEGIN EVENT HANDLERS ------------------- + + + + + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + //CONFIGMODULE + // + configModule = function (context) { + stateMap.context = context.context; + }; + + //INITMODULE + // + initModule = function ($container) { + if (typeof $container === 'undefined') { + $container = $('#app-shell-main-content'); + } + + $container.html(Handlebars.templates['app.reportDataExpires']({})); + + //fetch data + app.api.get('report/expires', function (res) { + if (res.error) { + $.gevent.publish('app-show-error',res.msg); + } else { + + //get the list ul + var $appList = $('#rf-list'); + $appList.empty(); + $.each(res, function (i, obj) { + $appList.append("
  • " + + app.utilB.genListColumn(app.utilB.epochToShortDate(obj.expireDate)) + + app.utilB.genListColumn(obj.customer) + + app.utilB.genListColumn(obj.name) + + "
  • ") + }); + + } + }); + + //Context menu + app.nav.contextClear(); + app.nav.contextAddLink("reportData/", "Reports", "book-open-variant");//url title icon + + }; + + + // return public methods + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +}()); \ No newline at end of file diff --git a/wwwroot/js/app.reportDataProdEmail.js b/wwwroot/js/app.reportDataProdEmail.js new file mode 100644 index 0000000..24195eb --- /dev/null +++ b/wwwroot/js/app.reportDataProdEmail.js @@ -0,0 +1,139 @@ +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.reportDataProdEmail = (function () { + + 'use strict'; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var + stateMap = {}, + onGenerate, configModule, initModule; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + //-------------------- END UTILITY METHODS ------------------- + + //------------------- BEGIN EVENT HANDLERS ------------------- + + onGenerate = function (event) { + + event.preventDefault(); + $.gevent.publish('app-clear-error'); + //get form data + var formData = $("form").serializeArray({ + checkboxesAsBools: true + }); + + //var submitData = app.utilB.objectifyFormDataArray(formData); + + //Now convert this specially for this method into a clean object to send with only what is required + var submitData = {}; + submitData.products = []; + var l = formData.length; + for (var i = 0; i < l; i++) { + var fname = formData[i].name; + var fvalue = formData[i].value; + + if (fname == 'ckIncidental') { + submitData.ckIncidental = (fvalue == 'true'); + } else if (fname == 'ckNoContact') { + submitData.ckNoContact = (fvalue == 'true'); + } else if (fname == 'csvdata') { + ;//do nothing + } else { + //it's a product key + if (fvalue == 'true') { + submitData.products.push(fname); + } + } + } + + + app.api.create('report/emailsforproductcodes',submitData, function (res) { + if (res.error) { + $.gevent.publish('app-show-error',res.msg); + } else { + $('#csvdata').val(res); + return false; + } + }); + + return false; //prevent default + }; + + + + + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + //CONFIGMODULE + // + configModule = function (context) { + stateMap.context = context.context; + // if (stateMap.context.params.id) { + // stateMap.id = stateMap.context.params.id; + // } + }; + + //INITMODULE + // + initModule = function ($container) { + if (typeof $container === 'undefined') { + $container = $('#app-shell-main-content'); + } + + $container.html(Handlebars.templates['app.reportDataProdEmail']({})); + + //fetch data + app.api.get('purchase/productcodes',function (res) { + if (res.error) { + $.gevent.publish('app-show-error',res.msg); + } else { + + $.each(res, function (i, obj) { + + var pcode = obj.productCode; + var badCode = (!pcode); + + //----------- + $('', { + type: 'checkbox', + id: 'id' + i, + name: obj.productCode, + disabled: badCode + }).appendTo("#cbdiv"); + + $('#cbdiv').append(''); + $('#cbdiv').append('
    '); + + //-------------- + }); + } + }); + + //set title + var title="Email addresses by product code"; + //app.nav.setContextTitle(title); + + //Context menu + app.nav.contextClear(); + app.nav.contextAddButton('btn-generate', 'Build list', 'build', onGenerate); + app.nav.contextAddLink("reportData/", "Reports", "book-open-variant"); + + }; + + + // return public methods + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +}()); \ No newline at end of file diff --git a/wwwroot/js/app.rfcaseEdit.js b/wwwroot/js/app.rfcaseEdit.js new file mode 100644 index 0000000..2a2abd3 --- /dev/null +++ b/wwwroot/js/app.rfcaseEdit.js @@ -0,0 +1,283 @@ +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.rfcaseEdit = (function () { + 'use strict'; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var + stateMap = {}, + onSave, onDelete, + configModule, initModule, onAttachment, onUpload, onAppend; + //----------------- END MODULE SCOPE VARIABLES --------------- + + + //------------------- BEGIN EVENT HANDLERS ------------------- + + //ONSAVE + // + onSave = function (event) { + event.preventDefault(); + $.gevent.publish('app-clear-error'); + + //get form data + var formData = $("form").serializeArray({ + checkboxesAsBools: true + }); + + var submitData = app.utilB.objectifyFormDataArray(formData); + + //is this a new record? + if (stateMap.id != 'new') { + //put id into the form data + submitData.id = stateMap.id; + + + app.api.update('rfcase', submitData, function (res) { + if (res.error) { + $.gevent.publish('app-show-error', res.msg); + } + }); + } else { + //it's a new record - create + + //set dtCreated as it's not a form field + submitData.dtCreated = app.utilB.getCurrentDateTimeAsEpoch(); + + app.api.create('rfcase', submitData, function (res) { + if (res.error) { + $.gevent.publish('app-show-error', res.msg); + } else { + page('#!/rfcaseEdit/' + res.id); + } + }); + } + return false; //prevent default? + }; + + //ONDELETE + // + onDelete = function (event) { + event.preventDefault(); + $.gevent.publish('app-clear-error'); + + var r = confirm("Are you sure you want to delete this record?"); + if (r == true) { + //Delete + app.api.remove('rfCase/' + stateMap.id, function (res) { + if (res.error) { + $.gevent.publish('app-show-error', res.msg); + } else { + //deleted, return to list + page('#!/rfcases'); + return false; + } + }); + + } else { + return false; + } + return false; //prevent default? + }; + + + + //////////////////////////////////////////// + //Handle click on attachment + // + onAttachment = function (event) { + event.preventDefault(); + + var attachmentId = event.data; + alert("STUB: Attachment click id = " + attachmentId); + app.api.get('rfcase/' + stateMap.id, function (res) { + if (res.error) { + $.gevent.publish('app-show-error', res.msg); + } else { + ; + } + }); + + return false; + }; + + + + + //////////////////////////////////////////// + //Handle upload click + // + onUpload = function (event) { + event.preventDefault(); + $.gevent.publish('app-clear-error'); + + var fileUpload = $("#files").get(0); + var files = fileUpload.files; + var fileData = new FormData(); + for (var i = 0; i < files.length; i++) { + fileData.append(files[i].name, files[i]); + } + + app.api.uploadFile('rfcaseblob/upload?rfcaseid=' + stateMap.id, fileData, function (res) { + if (res.error) { + $.gevent.publish('app-show-error', res.msg); + } else { + page('#!/rfcaseEdit/' + stateMap.id); + } + }); + + + + return false; + }; + + //////////////////////////////////// + //ONAPPEND + // Append date and time and a horizontal line to make a new entry + // + onAppend = function (event) { + event.preventDefault(); + var $notes = $('#notes'); + var txt = $notes.val(); + txt += "\r\n====================\r\n"; + txt += moment().format('MMM Do YYYY H:mm A');//"Aug 28th 2017 11:01 AM" + txt += ' Edited by ' + app.shell.stateMap.user.name; + txt += '\r\n\r\n'; + + $notes.focus() + .val("") + .val(txt); + + return false; //prevent default? + }; + + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + + + //CONFIGMODULE + // + configModule = function (context) { + stateMap.context = context.context; + if (stateMap.context.params.id) { + stateMap.id = stateMap.context.params.id; + } + }; + + //INITMODULE + // + initModule = function ($container) { + if (typeof $container === 'undefined') { + $container = $('#app-shell-main-content'); + } + + $container.html(Handlebars.templates['app.rfcaseEdit']({})); + + ////app.nav.setContextTitle("Case"); + + var $cbProjects = $('#rfCaseProjectId'); + var projectList = {}; + + //get projects + app.api.get('rfcaseproject', function (res) { + if (res.error) { + $.gevent.publish('app-show-error', res.msg); + } else { + + var html = ''; + + for (var i = 0, len = res.length; i < len; ++i) { + html += (''); + projectList[res[i]['id']] = res[i]['name']; + } + $cbProjects.append(html); + + //Context menu + app.nav.contextClear(); + app.nav.contextAddLink("rfcases/", "Cases", "bug"); + app.nav.contextAddLink("rfcaseEdit/new", "New", "plus"); + app.nav.contextAddButton('btn-save-top', 'Save', '', onSave); + + //##### + //Now load the case itself + //------------ + //id should always have a value, either a record id or the keyword 'new' for making a new object + if (stateMap.id != 'new') { + //case 3513 (ironically I can't see it yet) + document.title = 'Case ' + stateMap.id; + //fetch existing record + app.api.get('rfcase/' + stateMap.id, function (res) { + if (res.error) { + $.gevent.publish('app-show-error', res.msg); + } else { + + //set the caseid header //New + $('#caseid').html(stateMap.id); + $('#dtcreated').html('created ' + app.utilB.epochToLocalShortDateTime(res.dtCreated)); + //fill out form + app.utilB.formData(res); + + //Get attachments separately + //=============== + + app.api.get('rfcase/' + stateMap.id + '/attachments', function (attachments) { + if (attachments.error) { + $.gevent.publish('app-show-error', attachments.msg); + } else { + + //Create a list item for each attachment + var alist = ''; + for (var x = 0; x < attachments.attach.length; x++) { + var attachment = attachments.attach[x]; + alist += '' + attachment.name + '' + } + + $('#attachments').html(alist); + } + }); + + //================ + } + }); + + + $('#btn-upload').bind('click', onUpload); + $('#frmUpload').removeClass('invisible'); + + } else { + $('#btn-delete').hide(); + //select rockfish as the default project + $cbProjects.val(44); + //3 is the default new item priority + $('#priority').val(3); + + //case 3513 + document.title = 'NEW CASE'; + } + //------------- + //##### + } + }); + + + // bind actions + $('#btn-save').bind('click', onSave); + $('#btn-delete').bind('click', onDelete); + $('#btn-append').bind('click', onAppend); + }; + + + // RETURN PUBLIC METHODS + // + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +}()); \ No newline at end of file diff --git a/wwwroot/js/app.rfcases.js b/wwwroot/js/app.rfcases.js new file mode 100644 index 0000000..a47aa7a --- /dev/null +++ b/wwwroot/js/app.rfcases.js @@ -0,0 +1,196 @@ +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.rfcases = (function () { + 'use strict'; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var + stateMap = {}, + configModule, initModule, + $cbProjects, $appList, $open, $priority, $search, + projectList, + onFilterChange, loadCases, getPriorityColorClass, + restoreSelections; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + + + + getPriorityColorClass = function (priority) { + switch (priority) { + case 1: + return 'success'; + break; + case 2: + return 'warning'; + break; + case 3: + return 'danger'; + break; + default: + return 'secondary'; + break; + } + } + + + //case 3363 + restoreSelections = function () { + //if there are selections then restore them + if (stateMap.savedSelections) { + $cbProjects.val(stateMap.savedSelections.project); + $open.prop('checked', stateMap.savedSelections.open); + $priority.val(stateMap.savedSelections.priority); + $search.val(stateMap.savedSelections.search); + } else { + //Defaults + //select Rockfish as the default project + $cbProjects.val(44); + + } + } + + loadCases = function (projects) { + + $appList.empty(); + + //get the filters + // public JsonResult GetList(long? Project, bool? Open, int? Priority, string Search) + var selectedProject = $cbProjects.val(); + var selectedOpen = $open.prop('checked') + var selectedPriority = $priority.val(); + var selectedSearch = $search.val(); + + stateMap.savedSelections = { + project: selectedProject, + open: selectedOpen, + priority: selectedPriority, + search: selectedSearch + } + + if (selectedSearch) { + selectedSearch = encodeURI(selectedSearch); + } + + + //case 3363 save settings here + + var filterUrl = '?project=' + selectedProject + '&open=' + selectedOpen + '&priority=' + selectedPriority + '&search=' + selectedSearch; + var that = this; + //get the cases + app.api.get('rfcase/list' + filterUrl, function (res) { + + if (res.error) { + $.gevent.publish('app-show-error', res.msg); + } else { + + //case 3450 count + $('#rf-list-count').empty().append(res.length+" items"); + + $.each(res, function (i, obj) { + + var badgeClass = getPriorityColorClass(obj.priority); + var idColumn = '' + obj.id + '' + obj.priority + ''; + + + + $appList.append("
  • " + + app.utilB.genListColumn(idColumn) + + ' ' + + (selectedProject == 0 ? app.utilB.genListColumn(projects[obj.rfCaseProject_Id]) : '') + + ' ' + + app.utilB.genListColumn(obj.title) + + ' ' + + app.utilB.genListColumn(app.utilB.epochToLocalShortDateTime(obj.dtCreated)) + + "
  • "); + }); + } + }); + } + //-------------------- END UTILITY METHODS ------------------- + + + //------------------- BEGIN EVENT HANDLERS ------------------- + onFilterChange = function (event) { + event.preventDefault(); + loadCases(projectList); + return false; //prevent default + }; + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + //CONFIGMODULE + // + configModule = function (context) { + stateMap.context = context.context; + if (stateMap.context.params.id) { + stateMap.id = stateMap.context.params.id; + } + }; + + //INITMODULE + // + initModule = function ($container) { + + if (typeof $container === 'undefined') { + $container = $('#app-shell-main-content'); + } + $container.html(Handlebars.templates['app.rfcases']({})); + + //cache dom items + $appList = $('#rf-list'); + $cbProjects = $('#projects'); + $open = $('#open'); + $priority = $("#priority"); + $search = $("#csearch"); + + projectList = {}; + + //get projects + app.api.get('rfcaseproject', function (res) { + if (res.error) { + $.gevent.publish('app-show-error', res.msg); + } else { + + var html = ''; + + for (var i = 0, len = res.length; i < len; ++i) { + html += (''); + projectList[res[i]['id']] = res[i]['name']; + } + $cbProjects.append(html); + + + //case 3363 re-hydrate settings here + restoreSelections(); + + //subscribe to change event + $cbProjects.change(onFilterChange); + $open.change(onFilterChange); + $priority.change(onFilterChange); + $search.change(onFilterChange); + + + loadCases(projectList); + } + }); + + app.nav.contextClear(); + app.nav.contextAddLink("rfcaseEdit/new", "New", "plus"); + }; + + //PUBLIC METHODS + // + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +}()); \ No newline at end of file diff --git a/wwwroot/js/app.rfsettings.js b/wwwroot/js/app.rfsettings.js new file mode 100644 index 0000000..c2ca588 --- /dev/null +++ b/wwwroot/js/app.rfsettings.js @@ -0,0 +1,101 @@ +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.rfsettings = (function() { + "use strict"; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var stateMap = {}, + configModule, + onChangePassword, + initModule; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + //-------------------- END UTILITY METHODS ------------------- + + //------------------- BEGIN EVENT HANDLERS ------------------- + + /////////////////////////////// + //ONUPDATE + // + onChangePassword = function(event) { + event.preventDefault(); + $.gevent.publish("app-clear-error"); + //get form data + var formData = $("form").serializeArray({ + checkboxesAsBools: true + }); + + var submitData = app.utilB.objectifyFormDataArray(formData); + + app.api.create( + "user/" + app.shell.stateMap.user.id + "/changepassword", + submitData, + function(res) { + if (res.error) { + $.gevent.publish("app-show-error", res.msg); + } else { + page("#!/logout"); + } + } + ); + + return false; //prevent default? + }; + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + //CONFIGMODULE + // + configModule = function(context) { + stateMap.context = context.context; + if (stateMap.context.params.id) { + stateMap.id = stateMap.context.params.id; + } + }; + + //INITMODULE + // + initModule = function($container) { + if (typeof $container === "undefined") { + $container = $("#app-shell-main-content"); + } + $container.html(Handlebars.templates["app.rfsettings"]({})); + + // bind actions + $("#btn-change-password").bind("click", onChangePassword); + + //Context menu + app.nav.contextClear(); + + app.api.get("meta/server_version/", function(res) { + if (res.error) { + $.gevent.publish("app-show-error", res.msg); + } else { + $("#about").append( + "

    Rockfish client version: " + + app.api.RockFishVersion + + "

    Rockfish server version: " + + res.server_version + + "

    " + ); + } + }); + + ////app.nav.setContextTitle("Search"); + }; + + //PUBLIC METHODS + // + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +})(); diff --git a/wwwroot/js/app.search.js b/wwwroot/js/app.search.js new file mode 100644 index 0000000..8ecc7aa --- /dev/null +++ b/wwwroot/js/app.search.js @@ -0,0 +1,119 @@ +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.search = (function() { + "use strict"; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var stateMap = {}, + configModule, + onSearch, + initModule; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + //-------------------- END UTILITY METHODS ------------------- + + //------------------- BEGIN EVENT HANDLERS ------------------- + //ONSEARCH + // + onSearch = function(event) { + event.preventDefault(); + $.gevent.publish("app-clear-error"); + + //get form data + var query = $("#searchquery").val(); + //app.api.get('customer/' + stateMap.id, function (res) { + //app.get('/api/search?query=querytext' + app.api.get("search?query=" + query, function(res) { + if (res.error) { + $.gevent.publish("app-show-error", res.msg); + return false; + } + + var $appList = $("#rf-list"); + $appList.empty(); + $.each(res, function(i, obj) { + var editUrl = ""; + switch (obj.obj) { + case "customer": + editUrl = "customerEdit/" + obj.id; + break; + case "site": + editUrl = "customerSiteEdit/" + obj.id + "/" + obj.customerId; + break; + case "purchase": + editUrl = "purchaseEdit/" + obj.id + "/" + obj.site_id; + break; + case "license": + editUrl = "licenseView/" + obj.id; + break; + default: + alert("UNKNOWN SEARCH TYPE OBJECT RESULT: " + obj.obj + " WHUPS!"); + } + + $appList.append( + '
  • ' + + app.utilB.genListColumn( + obj.name + " @ " + obj.obj + "." + obj.fld + ) + + "
  • " + ); + + //cache it + app.shell.stateMap.search_cache.has_cache = true; + app.shell.stateMap.search_cache.html = $("#rf-list").html(); + app.shell.stateMap.search_cache.query = query; + }); + }); + + return false; //prevent default? + }; + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + //CONFIGMODULE + // + configModule = function(context) { + stateMap.context = context.context; + if (stateMap.context.params.id) { + stateMap.id = stateMap.context.params.id; + } + }; + + //INITMODULE + // + initModule = function($container) { + if (typeof $container === "undefined") { + $container = $("#app-shell-main-content"); + } + $container.html(Handlebars.templates["app.search"]({})); + + // bind actions + $("#searchbutton").bind("click", onSearch); + + //reconstitute from last search cache + if (app.shell.stateMap.search_cache.has_cache == true) { + $("#rf-list").html(app.shell.stateMap.search_cache.html); + $("#searchquery").val(app.shell.stateMap.search_cache.query); + } + //Context menu + app.nav.contextClear(); + ////app.nav.setContextTitle("Search"); + }; + + //PUBLIC METHODS + // + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +})(); diff --git a/wwwroot/js/app.shell.js b/wwwroot/js/app.shell.js new file mode 100644 index 0000000..bf47286 --- /dev/null +++ b/wwwroot/js/app.shell.js @@ -0,0 +1,561 @@ +/* + * app.shell.js + * Shell module for SPA + */ + +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ +/*global $, app */ + +app.shell = (function () { + 'use strict'; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + + var + + stateMap = { + $container: undefined, + anchor_map: {}, + user: { + authenticated: false, + token: '', + name: '', + id: 0 + }, + apiUrl: '', + search_cache: { + has_cache: false + } + }, + tokenExpired, + //onUPdate, + onLogin, onLogout, onShowError, onClearError, + initModule; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + + + tokenExpired = function () { + //fetch stored creds if available + var creds = store.get('rockfish.usercreds'); + if (creds) { + //check if token has expired + //is the date greater than the expires date + var rightNowUtc = new Date(); + var expDate = new Date(creds.expires * 1000); + if (rightNowUtc > expDate) { + return true; + } else { + return false; + } + } else { + return true; + } + } + //-------------------- END UTILITY METHODS ------------------- + + + + //------------------- BEGIN EVENT HANDLERS ------------------- + + onLogin = function (event, login_user) { + //store creds + store.set('rockfish.usercreds', stateMap.user); + //New token needs to reset lastNav + stateMap.lastNav = new Date(); + //Go to the home page + page('#!/customers/'); + return false; + }; + + onLogout = function (event) { + store.clear(); + stateMap.user.authenticated = false; + stateMap.user.name = ''; + stateMap.user.token = ''; + stateMap.user.id = 0; + page('#!/authenticate/'); + return false; + }; + + // onUpdate = function (event) { + + // window.location.reload(true); + // return false; + // }; + + + onShowError = function (event, msg) { + $("#app-error-div").removeClass("d-none"); + $('#app-error-message').text(msg); + return false; + }; + + onClearError = function (event) { + $("#app-error-div").addClass("d-none"); + return false; + }; + + + //-------------------- END EVENT HANDLERS -------------------- + + + + //------------------- BEGIN PUBLIC METHODS ------------------- + initModule = function ($container) { + + document.title = 'Rockfish ' + app.api.RockFishVersion; + + + //PRE FLIGHT CHECK + //================ + + + + //local storage required + if (!store.enabled) { + alert('Local storage is not supported by your browser. Please disable "Private Mode", or upgrade to a modern browser.'); + return; + } + + //wait indicator for ajax functions + $(document).ajaxStart(function () { + + //disable all buttons + $('.app-frm-buttons button').prop('disabled', true).addClass('disabled'); + //$('.app-frm-buttons button').attr('disabled', 'disabled'); + $("body").css("cursor", "progress"); + //add app-ajax-busy style to buttons div where user clicked + $('.app-frm-buttons').addClass('app-ajax-busy'); + + }).ajaxStop(function () { + + //with delay in case it's too fast to see + setTimeout(function () { + $('.app-frm-buttons button').prop('disabled', false).removeClass('disabled'); + //$('.app-frm-buttons button').removeAttr('disabled'); + $("body").css("cursor", "default"); + $('.app-frm-buttons').removeClass('app-ajax-busy'); + }, 250); + + }); + + + //save on app so can call from anywhere + // app.mdInit = mdInit; + + // load HTML and map jQuery collections + stateMap.$container = $container; + $container.html(Handlebars.templates['app.shell']({})); + + //auto hide navbar on click + //rfac is a class only on the items that should trigger collapse + $('.rfac').on('click', function () { + $('.navbar-collapse').collapse('hide'); + }); + + //SEARCH + // $('#searchbutton').bind('click', onSearch); + + //determine API url and save it + stateMap.apiUrl = app.utilB.getApiUrl(); + + + //fetch stored creds if available + var creds = store.get('rockfish.usercreds'); + // if (creds) { + + //check if token has expired + + + if (tokenExpired()) { + stateMap.user.authenticated = false; + stateMap.user.name = ''; + stateMap.user.token = ''; + stateMap.user.id = 0; + + } else { + //Show the logout item in the menu + $(".app-mnu-logout").removeClass("app-hidden"); + stateMap.user.authenticated = true; + stateMap.user.name = creds.name; + stateMap.user.token = creds.token; + stateMap.user.id = creds.id; + } + //} + + + //EVENT SUBSCRIPTIONS + $.gevent.subscribe($container, 'app-login', onLogin); + $.gevent.subscribe($container, 'app-logout', onLogout); + //$.gevent.subscribe($container, 'rf-update', onUpdate); + $.gevent.subscribe($container, 'app-show-error', onShowError); + $.gevent.subscribe($container, 'app-clear-error', onClearError); + + + //ROUTES + // + page.base('/default.htm'); + page('*', beforeUrlChange); + page('/authenticate', authenticate); + page('/', inbox); + page('/reportData', reportData); + page('/reportDataProdEmails', reportDataProdEmail); + page('/reportDataExpires', reportDataExpires); + page('/search', search); + page('/logout', function () { + $.gevent.publish('app-logout'); + }); + page('/customers', customers); + page('/customerEdit/:id', customerEdit); + page('/customerSites/:id', customerSites); + page('/customerSiteEdit/:id/:cust_id', customerSiteEdit); + page('/purchases/:id', purchases); + page('/purchaseEdit/:id/:site_id', purchaseEdit); + page('/license', license); + page('/licenseTemplates', licenseTemplates); + page('/licenseRequests', licenseRequests); + page('/licenseRequestEdit/:id', licenseRequestEdit); + //case 3233 + page('/licenses', licenses); + page('/licenseView/:id', licenseView); + page('/subscription', subscription); + page('/subnotify', subnotify); + page('/templates', templates); + page('/templateEdit/:id', templateEdit); + page('/inbox', inbox); + page.exit('/inbox', function(ctx,next) { + app.inbox.terminateModule(); + next(); + }); + page('/mailEdit/:mail_account/:mail_folder/:mail_id', mailEdit); + page('/rfcases', rfcases); + page('/rfcaseEdit/:id', rfcaseEdit); + page('/rfsettings', rfsettings); + page('*', notFound); + page({ + hashbang: true + }); + // /ROUTES + + + + + + }; + // End PUBLIC method /initModule/ + + + + + + var beforeUrlChange = function (ctx, next) { + $.gevent.publish('app-clear-error'); + app.shell.stateMap.mediaSize = app.utilB.getMediaSize(); + + //case 3513 + document.title = 'Rockfish ' + app.api.RockFishVersion; + + //bypass stuff below if about to logout + if (ctx.path == '/logout') { + return next(); + } + + + + + + //================================================================ + //Check authentication token to see if expired, but only if it's been a few minutes since last navigation + if (stateMap.user.authenticated) { + //This first bit sets the last nav in cases where it's never been set before + //default to one hour ago in case it hasn't ever been set yet or isn't in statemap + if (!stateMap.lastNav) { + //Isn't this sketchy? Is this a date or a moment being set here + stateMap.lastNav = moment().subtract(3600, 's').toDate();//60 minutes ago + } + + + var mNow = moment(new Date()); //todays date + var mLastNav = moment(stateMap.lastNav); // another date + var duration = moment.duration(mNow.diff(mLastNav)); + var secondsSinceLastNav = duration.asSeconds(); + + if (secondsSinceLastNav > 300)//have we checked in the last 5 minutes? + { + if (tokenExpired()) { + stateMap.user.authenticated = false; + } + + } + stateMap.lastNav = new Date(); + } + //=============================================================== + + //Not logged in and trying to go somewhere but authenticate? + if (!stateMap.user.authenticated) { + //hide nav + $("#rf-nav").hide({ + duration: 200 + }); + + + //page nav to authenticate + if (ctx.path != '/authenticate/') + return page('#!/authenticate/'); + + } else { + //logged in so make sure to show toolbar here + $("#rf-nav").show({ + duration: 200 + }); + } + + next(); + } + + + + //TODO: Clean up this coral reef steaming mess + //replace with a function that generates these functions since they are all (nearly) identical + + var authenticate = function (ctx) { + + app.authenticate.configModule({ + context: ctx + }); + app.authenticate.initModule(); + } + + var reportData = function (ctx) { + app.nav.setSelectedMenuItem('reportData'); + app.reportData.configModule({ + context: ctx + }); + app.reportData.initModule(); + } + + var reportDataProdEmail = function (ctx) { + app.nav.setSelectedMenuItem('reportData'); + app.reportDataProdEmail.configModule({ + context: ctx + }); + app.reportDataProdEmail.initModule(); + } + + var reportDataExpires = function (ctx) { + app.nav.setSelectedMenuItem('reportData'); + app.reportDataExpires.configModule({ + context: ctx + }); + app.reportDataExpires.initModule(); + } + + var search = function (ctx) { + app.nav.setSelectedMenuItem('search'); + app.search.configModule({ + context: ctx + }); + app.search.initModule(); + } + + var customers = function (ctx) { + app.nav.setSelectedMenuItem('customers'); + app.customers.configModule({ + context: ctx + }); + app.customers.initModule(); + } + + var customerEdit = function (ctx) { + app.nav.setSelectedMenuItem('customers'); + app.customerEdit.configModule({ + context: ctx + }); + app.customerEdit.initModule(); + } + + var customerSites = function (ctx) { + app.nav.setSelectedMenuItem('customers'); + app.customerSites.configModule({ + context: ctx + }); + app.customerSites.initModule(); + } + + var customerSiteEdit = function (ctx) { + app.nav.setSelectedMenuItem('customers'); + app.customerSiteEdit.configModule({ + context: ctx + }); + app.customerSiteEdit.initModule(); + } + + var purchases = function (ctx) { + app.nav.setSelectedMenuItem('customers'); + app.purchases.configModule({ + context: ctx + }); + app.purchases.initModule(); + } + + var purchaseEdit = function (ctx) { + app.nav.setSelectedMenuItem('customers'); + app.purchaseEdit.configModule({ + context: ctx + }); + app.purchaseEdit.initModule(); + } + + + var license = function (ctx) { + app.nav.setSelectedMenuItem('license'); + app.license.configModule({ + context: ctx + }); + app.license.initModule(); + } + + var licenseTemplates = function (ctx) { + app.nav.setSelectedMenuItem('license'); + app.licenseTemplates.configModule({ + context: ctx + }); + app.licenseTemplates.initModule(); + } + + var licenseRequests = function (ctx) { + app.nav.setSelectedMenuItem('license'); + app.licenseRequests.configModule({ + context: ctx + }); + app.licenseRequests.initModule(); + } + + var licenseRequestEdit = function (ctx) { + app.nav.setSelectedMenuItem('license'); + app.licenseRequestEdit.configModule({ + context: ctx + }); + app.licenseRequestEdit.initModule(); + } + + //case 3233 + var licenses = function (ctx) { + app.nav.setSelectedMenuItem('license'); + app.licenses.configModule({ + context: ctx + }); + app.licenses.initModule(); + } + + //case 3233 + var licenseView = function (ctx) { + app.nav.setSelectedMenuItem('license'); + app.licenseView.configModule({ + context: ctx + }); + app.licenseView.initModule(); + } + + + + var subscription = function (ctx) { + app.nav.setSelectedMenuItem('subscription'); + app.subscription.configModule({ + context: ctx + }); + app.subscription.initModule(); + } + + var subnotify = function (ctx) { + app.nav.setSelectedMenuItem('subscription'); + app.subnotify.configModule({ + context: ctx + }); + app.subnotify.initModule(); + } + + var templates = function (ctx) { + app.nav.setSelectedMenuItem('templates'); + app.templates.configModule({ + context: ctx + }); + app.templates.initModule(); + } + + var templateEdit = function (ctx) { + app.nav.setSelectedMenuItem('templates'); + app.templateEdit.configModule({ + context: ctx + }); + app.templateEdit.initModule(); + } + + + var inbox = function (ctx) { + app.nav.setSelectedMenuItem('inbox'); + app.inbox.configModule({ + context: ctx + }); + app.inbox.initModule(); + } + + var mailEdit = function (ctx) { + app.nav.setSelectedMenuItem('inbox'); + app.mailEdit.configModule({ + context: ctx + }); + app.mailEdit.initModule(); + } + + + var rfcases = function (ctx) { + app.nav.setSelectedMenuItem('rfcases'); + app.rfcases.configModule({ + context: ctx + }); + app.rfcases.initModule(); + } + + var rfcaseEdit = function (ctx) { + app.nav.setSelectedMenuItem('rfcases'); + app.rfcaseEdit.configModule({ + context: ctx + }); + app.rfcaseEdit.initModule(); + } + + var rfsettings = function (ctx) { + app.nav.setSelectedMenuItem('rfsettings'); + app.rfsettings.configModule({ + context: ctx + }); + app.rfsettings.initModule(); + } + + + + + var notFound = function (ctx) { + app.fourohfour.configModule({ + context: ctx + }); + app.fourohfour.initModule(); + } + + + + + + return { + initModule: initModule, + stateMap: stateMap + }; + //------------------- END PUBLIC METHODS --------------------- +}()); \ No newline at end of file diff --git a/wwwroot/js/app.subnotify.js b/wwwroot/js/app.subnotify.js new file mode 100644 index 0000000..59cf573 --- /dev/null +++ b/wwwroot/js/app.subnotify.js @@ -0,0 +1,132 @@ +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.subnotify = (function () { + + 'use strict'; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var + stateMap = {}, + configModule, + initModule, + onSend; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + //-------------------- END UTILITY METHODS ------------------- + + //------------------- BEGIN EVENT HANDLERS ------------------- + ///////////////////////// + //SEND (create draft) of renewal warning notification email + // + onSend = function (event) { + event.preventDefault(); + + //Gather purchase id's + var s = $(this).data("purchaseidlist"); + + if(s==undefined || s==null){ + return false; + } + + //Convert string of comma separate numeric values to numeric array + var ids = new Array(); + if (typeof s == 'string') { + ids = s.split(","); + var arrayLength = ids.length; + for (var i = 0; i < arrayLength; i++) { + ids[i] = parseInt(ids[i], 10); + } + } else { + //it's a number + ids[0] = s; + } + + + + //post to a route that will make the draft emails then tag the purchase as notified + app.api.create('subscription/sendnotify', ids, function (res) { + if (res.error) { + $.gevent.publish('app-show-error',res.msg); + } else { + page('#!/subnotify'); + } + }); + + + return false; //prevent default + }; + + + + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + //CONFIGMODULE + // + configModule = function (context) { + stateMap.context = context.context; + }; + + //INITMODULE + // + initModule = function ($container) { + if (typeof $container === 'undefined') { + $container = $('#app-shell-main-content'); + } + + $container.html(Handlebars.templates['app.subnotify']({})); + + //fetch data + app.api.get('subscription/notifylist', function (res) { + if (res.error) { + $.gevent.publish('app-show-error',res.msg); + } else { + + //get the list ul + var $appList = $('#rf-list'); + $appList.empty(); + var displayedItems = 0; + $.each(res, function (i, obj) { + $appList.append("
  • " + + app.utilB.genListColumnNoLink(obj.customer + ' -> ') + + ' ' + + app.utilB.genListColumnNoLink(obj.purchasenames) + + ' ' + + app.utilB.genListColumnNoLink("Send") + + "
  • "); + + displayedItems++; + }); + + if(displayedItems==0){ + $appList.append('
  • NO RENEWALS IMMINENT - ' + moment().format('YYYY-MM-DD LT') + '
  • '); + } + + + //event handler for buttons added dynamically + $('.RFSEND').bind('click', onSend); + + } + }); + + //Context menu + app.nav.contextClear(); + app.nav.contextAddLink("subscription/", "Subscriptions", "basket"); + + }; + + + // return public methods + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +}()); \ No newline at end of file diff --git a/wwwroot/js/app.subscription.js b/wwwroot/js/app.subscription.js new file mode 100644 index 0000000..362b15f --- /dev/null +++ b/wwwroot/js/app.subscription.js @@ -0,0 +1,69 @@ +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.subscription = (function () { + 'use strict'; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var + + stateMap = {}, + configModule, + initModule; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + //-------------------- END UTILITY METHODS ------------------- + + //------------------- BEGIN EVENT HANDLERS ------------------- + + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + //CONFIGMODULE + // + configModule = function (context) { + stateMap.context = context.context; + if (stateMap.context.params.id) { + stateMap.id = stateMap.context.params.id; + } + }; + + //INITMODULE + // + initModule = function ($container) { + if (typeof $container === 'undefined') { + $container = $('#app-shell-main-content'); + } + $container.html(Handlebars.templates['app.subscription']({})); + + //Context menu + app.nav.contextClear(); + ////app.nav.setContextTitle("Subscriptions"); + + var $appList = $('#rf-list'); + $appList.empty(); + $appList.append(''); + //not implemented yet + // $appList.append("
  • " + app.utilB.genListColumn("Renew") + "
  • "); + + + }; + + //PUBLIC METHODS + // + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +}()); \ No newline at end of file diff --git a/wwwroot/js/app.templateEdit.js b/wwwroot/js/app.templateEdit.js new file mode 100644 index 0000000..5459dab --- /dev/null +++ b/wwwroot/js/app.templateEdit.js @@ -0,0 +1,141 @@ +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.templateEdit = (function () { + 'use strict'; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var + stateMap = {}, + onSave, onDelete, + configModule, initModule; + //----------------- END MODULE SCOPE VARIABLES --------------- + + + //------------------- BEGIN EVENT HANDLERS ------------------- + + //ONSAVE + // + onSave = function (event) { + event.preventDefault(); + $.gevent.publish('app-clear-error'); + + //get form data + var formData = $("form").serializeArray({ + checkboxesAsBools: true + }); + + var submitData = app.utilB.objectifyFormDataArray(formData); + + //is this a new record? + if (stateMap.id != 'new') { + //put id into the form data + submitData.id = stateMap.id; + + + app.api.update('textTemplate', submitData, function (res) { + if (res.error) { + $.gevent.publish('app-show-error',res.msg); + } + }); + } else { + //it's a new record - create + app.api.create('textTemplate', submitData, function (res) { + if (res.error) { + $.gevent.publish('app-show-error',res.msg); + } else { + page('#!/templateEdit/' + res.id); + } + }); + } + return false; //prevent default? + }; + + //ONDELETE + // + onDelete = function (event) { + event.preventDefault(); + $.gevent.publish('app-clear-error'); + + var r = confirm("Are you sure you want to delete this record?"); + if (r == true) { + app.api.remove('textTemplate/' + stateMap.id, function (res) { + if (res.error) { + $.gevent.publish('app-show-error',res.msg); + } else { + //deleted, return to list + page('#!/templates'); + return false; + } + }); + + } else { + return false; + } + return false; //prevent default? + }; + + + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + + + //CONFIGMODULE + // + configModule = function (context) { + stateMap.context = context.context; + if (stateMap.context.params.id) { + stateMap.id = stateMap.context.params.id; + } + }; + + //INITMODULE + // + initModule = function ($container) { + if (typeof $container === 'undefined') { + $container = $('#app-shell-main-content'); + } + + $container.html(Handlebars.templates['app.templateEdit']({})); + + //id should always have a value, either a record id or the keyword 'new' for making a new object + if (stateMap.id != 'new') { + //fetch existing record + app.api.get('textTemplate/' + stateMap.id, function (res) { + if (res.error) { + $.gevent.publish('app-show-error',res.msg); + } else { + //fill out form + app.utilB.formData(res); + } + }); + + } else { + $('#btn-delete').hide(); + } + + + //Context menu + app.nav.contextClear(); + app.nav.contextAddLink("templates/", "Templates", "layers"); + + // bind actions + $('#btn-save').bind('click', onSave); + $('#btn-delete').bind('click', onDelete); + }; + + + // RETURN PUBLIC METHODS + // + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +}()); \ No newline at end of file diff --git a/wwwroot/js/app.templates.js b/wwwroot/js/app.templates.js new file mode 100644 index 0000000..deb3ad6 --- /dev/null +++ b/wwwroot/js/app.templates.js @@ -0,0 +1,68 @@ +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.templates = (function () { + 'use strict'; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var + stateMap = {}, + configModule, initModule; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + //-------------------- END UTILITY METHODS ------------------- + + + //------------------- BEGIN EVENT HANDLERS ------------------- + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + //CONFIGMODULE + // + configModule = function (context) { + stateMap.context = context.context; + if (stateMap.context.params.id) { + stateMap.id = stateMap.context.params.id; + } + }; + + //INITMODULE + // + initModule = function ($container) { + if (typeof $container === 'undefined') { + $container = $('#app-shell-main-content'); + } + $container.html(Handlebars.templates['app.templates']({})); + + app.api.get('texttemplate/list', function (res) { + if (res.error) { + $.gevent.publish('app-show-error',res.msg); + } else { + var $appList = $('#rf-list'); + $.each(res, function (i, obj) { + $appList.append("
  • " + + app.utilB.genListColumn(obj.name) + + "
  • ") + }); + } + }); + + //Context menu + app.nav.contextClear(); + app.nav.contextAddLink("templateEdit/new", "New", "plus"); + }; + + //PUBLIC METHODS + // + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +}()); \ No newline at end of file diff --git a/wwwroot/js/app.util.js b/wwwroot/js/app.util.js new file mode 100644 index 0000000..59197db --- /dev/null +++ b/wwwroot/js/app.util.js @@ -0,0 +1,80 @@ +/* + * app.util.js + * General JavaScript utilities + * + * Michael S. Mikowski - mmikowski at gmail dot com + * These are routines I have created, compiled, and updated + * since 1998, with inspiration from around the web. + * + * MIT License + * +*/ + +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ +/*global $, app */ + +app.util = (function () { + var makeError, setConfigMap; + + // Begin Public constructor /makeError/ + // Purpose: a convenience wrapper to create an error object + // Arguments: + // * name_text - the error name + // * msg_text - long error message + // * data - optional data attached to error object + // Returns : newly constructed error object + // Throws : none + // + makeError = function ( name_text, msg_text, data ) { + var error = new Error(); + error.name = name_text; + error.message = msg_text; + + if ( data ){ error.data = data; } + + return error; + }; + // End Public constructor /makeError/ + + // Begin Public method /setConfigMap/ + // Purpose: Common code to set configs in feature modules + // Arguments: + // * input_map - map of key-values to set in config + // * settable_map - map of allowable keys to set + // * config_map - map to apply settings to + // Returns: true + // Throws : Exception if input key not allowed + // + setConfigMap = function ( arg_map ){ + var + input_map = arg_map.input_map, + settable_map = arg_map.settable_map, + config_map = arg_map.config_map, + key_name, error; + + for ( key_name in input_map ){ + if ( input_map.hasOwnProperty( key_name ) ){ + if ( settable_map.hasOwnProperty( key_name ) ){ + config_map[key_name] = input_map[key_name]; + } + else { + error = makeError( 'Bad Input', + 'Setting config key |' + key_name + '| is not supported' + ); + throw error; + } + } + } + }; + // End Public method /setConfigMap/ + + return { + makeError : makeError, + setConfigMap : setConfigMap + }; +}()); diff --git a/wwwroot/js/app.utilB.js b/wwwroot/js/app.utilB.js new file mode 100644 index 0000000..ae1d255 --- /dev/null +++ b/wwwroot/js/app.utilB.js @@ -0,0 +1,334 @@ +/** + * app.utilB.js + * JavaScript browser utilities + * + */ + +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ +/*global $, app, getComputedStyle */ + +app.utilB = (function () { + 'use strict'; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var + configMap = { + regex_encode_html: /[&"'><]/g, + regex_encode_noamp: /["'><]/g, + html_encode_map: { + '&': '&', + '"': '"', + "'": ''', + '>': '>', + '<': '<' + } + }, + + decodeHtml, encodeHtml, getEmSize, getApiUrl, getUrlParams, formData, objectifyFormDataArray, + getMediaSize, prepareObjectForClient, fixDatesToStrings, + epochToShortDate, epochToLocalShortDate, epochToLocalShortDateTime, getCurrentDateTimeAsEpoch, + genListColumn, + genListColumnNoLink, autoComplete, prepareObjectDatesForServer, + fixStringToServerDate; + + configMap.encode_noamp_map = $.extend({}, configMap.html_encode_map); + delete configMap.encode_noamp_map['&']; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + + + // Begin decodeHtml + // Decodes HTML entities in a browser-friendly way + // See http://stackoverflow.com/questions/1912501/\ + // unescape-html-entities-in-javascript + // + decodeHtml = function (str) { + return $('
    ').html(str || '').text(); + }; + // End decodeHtml + + + // Begin encodeHtml + // This is single pass encoder for html entities and handles + // an arbitrary number of characters + // + encodeHtml = function (input_arg_str, exclude_amp) { + var + input_str = String(input_arg_str), + regex, lookup_map; + + if (exclude_amp) { + lookup_map = configMap.encode_noamp_map; + regex = configMap.regex_encode_noamp; + } else { + lookup_map = configMap.html_encode_map; + regex = configMap.regex_encode_html; + } + return input_str.replace(regex, + function (match, name) { + return lookup_map[match] || ''; + } + ); + }; + // End encodeHtml + + // Begin getEmSize + // returns size of ems in pixels + // + getEmSize = function (elem) { + return Number( + getComputedStyle(elem, '').fontSize.match(/\d*\.?\d*/)[0] + ); + }; + // End getEmSize + + + //Begin getApiUrl + //returns url for api methods by parsing current window location url + // + getApiUrl = function () { + var u = window.location.href.replace(window.location.hash, "").replace('default.htm', '') + "api/"; + //is it a dev local url? + if (u.indexOf("localhost:8080") != -1) { + u = u.replace("8080", "8081"); + } + // End getApiUrl + + //fix for random recurrence of extraneous ? on iPhone when using api + //(Cannot post to http://gl-gztw.rhcloud.com/?api/list (404)) + u = u.replace("?", ""); + + return u; + } + + + + + + // Begin formData + // Get or set all form fields + // + formData = function (data) { + + //fix dates into strings + prepareObjectForClient(data); + + + var inps = $(":input").get(); + + if (typeof data != "object") { + // return all data + data = {}; + + $.each(inps, function () { + if (this.name && (this.checked || /select|textarea/i.test(this.nodeName) || /text|hidden|password/i.test(this.type))) { + data[this.name] = $(this).val(); + } + }); + return data; + } else { + $.each(inps, function () { + if (this.name && data[this.name]) { + if (this.type == "checkbox" || this.type == "radio") { + $(this).prop("checked", (data[this.name])); + } else { + $(this).val(data[this.name]); + } + } else if (this.type == "checkbox") { + $(this).prop("checked", false); + } + }); + return $(this); + } + }; + // End formdata + + // Begin getMediaSize + // Retrieves results of css media query in hidden pseudo element + // :after body element + //objectifyFormDataArray + getMediaSize = function () { + return window.getComputedStyle(document.querySelector('body'), ':after').getPropertyValue('content').replace(/\"/g, ''); + }; + // End getMediaSize + + + + + + //Begin objectifyFormDataArray + //takes name value form input pairs in array and turns into a keyed object + //suitable for sending as json object + // + objectifyFormDataArray = function (arr) { + var rv = {}; + for (var i = 0; i < arr.length; ++i) + if (arr[i] !== undefined) { + rv[arr[i].name] = arr[i].value.trim();//case 3205 added trim + } + return prepareObjectDatesForServer(rv); + } + + + + + + //Prepare an object for server needed format before submission + //called by objectifyFormDataArray + prepareObjectDatesForServer = function (obj) { + if (Array.isArray(obj)) { + for (var i = 0; i < obj.length; i++) { + fixStringToServerDate(obj[i]); + } + } else { + fixStringToServerDate(obj); + } + return obj; + } + // + + //Turn string date fields from client into server compatible format (Unix epoch like this: 1498262400 1499904000) + fixStringToServerDate = function (obj) { + var keys = Object.keys(obj); + keys.forEach(function (key) { + if (key.endsWith('Date') || key.startsWith('dt')) { + var value = obj[key]; + if (value == null) { + obj[key] = ''; + } else { + //this is the sample format we will see: 2017-07-13 + //TODO: is this assuming UTC? + obj[key] = moment.utc(value, "YYYY-MM-DD").unix(); + } + } + }); + } + + + + //This function exists to change the properties of the passed in object + //to values compatible with jquery form filling functions (mostly dates to strings for now) + // + prepareObjectForClient = function (obj) { + if (Array.isArray(obj)) { + for (var i = 0; i < obj.length; i++) { + fixDatesToStrings(obj[i]); + } + } else { + fixDatesToStrings(obj); + } + return obj; + } + // + + //Turn date fields of object coming from db into stringified values for consumption by client + //turn null dates into empty strings and iso date values into strings in iso format + fixDatesToStrings = function (obj) { + var keys = Object.keys(obj); + keys.forEach(function (key) { + if (key.endsWith('Date') || key.startsWith('dt')) { + var value = obj[key]; + if (value == null) { + obj[key] = ''; + } else { + //Now with sqlite they come and go as unix epoch seconds + //needs to be yyyy-MM-dd + obj[key] = moment.utc(new Date(value * 1000)).format("YYYY-MM-DD"); + } + } + }); + } + // + + //Turn date values coming in from server into displayable short date format + //used to display dates in various lists (where the source epoch is already localized) + epochToShortDate = function (epoch) { + if (epoch == null || epoch == 0) return ''; + return moment.utc(new Date(epoch * 1000)).format("YYYY-MM-DD"); + } + // + + //LOCAL VERSION: Turn date values coming in from server into displayable short date format + //used to display dates in various lists where the source epoch is in UTC + epochToLocalShortDate = function (epoch) { + if (epoch == null || epoch == 0) return ''; + var utdate = moment.utc(new Date(epoch * 1000)); + var localdate = moment(utdate).local(); + return localdate.format("YYYY-MM-DD"); + } + + //LOCAL VERSION: Turn date values coming in from server into displayable short date AND TIME format + //used to display dates in various lists where the source epoch is in UTC + epochToLocalShortDateTime = function (epoch) { + if (epoch == null || epoch == 0) return ''; + var utdate = moment.utc(new Date(epoch * 1000)); + var localdate = moment(utdate).local(); + return localdate.format("YYYY-MM-DD LT"); + } + + ////////////////////////// + //Get current date and time as a utc unix epoch + getCurrentDateTimeAsEpoch = function () { + return moment().utc().unix(); + } + + // Begin genListColumn + // This function is used to demarcate 'columns' of fields in basic list forms by wrapping each column field in html + // + genListColumn = function (val) { + return '' + val + '' + }; + // End genListColumn + + // Begin genListColumnNoLink + // This function is used to demarcate and style 'columns' of fields in basic list forms by wrapping each column field in html + // that are not link columns + genListColumnNoLink = function (val) { + return '' + val + '' + }; + // End genListColumn + + + // Begin autoComplete + // This function is used to attach an autocomplete method to an input + // + autoComplete = function (controlId, acGetToken) { + $('#' + controlId).autocomplete({ + serviceUrl: app.shell.stateMap.apiUrl + 'autocomplete', + params: { + acget: acGetToken + }, + ajaxSettings: { + headers: app.api.getAuthHeaderObject() + } + }); + }; + // End autoComplete + + + + // export methods + return { + decodeHtml: decodeHtml, + encodeHtml: encodeHtml, + getEmSize: getEmSize, + getApiUrl: getApiUrl, + getUrlParams: getUrlParams, + formData: formData, + getMediaSize: getMediaSize, + objectifyFormDataArray: objectifyFormDataArray, + epochToShortDate: epochToShortDate, + epochToLocalShortDate: epochToLocalShortDate, + epochToLocalShortDateTime: epochToLocalShortDateTime, + getCurrentDateTimeAsEpoch: getCurrentDateTimeAsEpoch, + genListColumn: genListColumn, + genListColumnNoLink: genListColumnNoLink, + autoComplete: autoComplete + }; + //------------------- END PUBLIC METHODS --------------------- +}()); \ No newline at end of file diff --git a/wwwroot/js/index.js b/wwwroot/js/index.js new file mode 100644 index 0000000..bb8beda --- /dev/null +++ b/wwwroot/js/index.js @@ -0,0 +1,23 @@ +/* + * app.js + * Root namespace module +*/ + +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ +/*global $, app */ + +var app = (function () { + 'use strict'; + var initModule = function ( $container ) { + app.api.initModule(); + // app.model.initModule(); + app.shell.initModule( $container ); + }; + + return { initModule: initModule }; +}()); \ No newline at end of file diff --git a/wwwroot/js/lib/handlebars.runtime-v4.0.5.js b/wwwroot/js/lib/handlebars.runtime-v4.0.5.js new file mode 100644 index 0000000..95049f3 --- /dev/null +++ b/wwwroot/js/lib/handlebars.runtime-v4.0.5.js @@ -0,0 +1,1240 @@ +/*! + + handlebars v4.0.5 + +Copyright (C) 2011-2015 by Yehuda Katz + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +@license +*/ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["Handlebars"] = factory(); + else + root["Handlebars"] = factory(); +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; + +/******/ // The require function +/******/ function __webpack_require__(moduleId) { + +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; + +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; + +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); + +/******/ // Flag the module as loaded +/******/ module.loaded = true; + +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } + + +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; + +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; + +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; + +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireWildcard = __webpack_require__(1)['default']; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + + var _handlebarsBase = __webpack_require__(3); + + var base = _interopRequireWildcard(_handlebarsBase); + + // Each of these augment the Handlebars object. No need to setup here. + // (This is done to easily share code between commonjs and browse envs) + + var _handlebarsSafeString = __webpack_require__(17); + + var _handlebarsSafeString2 = _interopRequireDefault(_handlebarsSafeString); + + var _handlebarsException = __webpack_require__(5); + + var _handlebarsException2 = _interopRequireDefault(_handlebarsException); + + var _handlebarsUtils = __webpack_require__(4); + + var Utils = _interopRequireWildcard(_handlebarsUtils); + + var _handlebarsRuntime = __webpack_require__(18); + + var runtime = _interopRequireWildcard(_handlebarsRuntime); + + var _handlebarsNoConflict = __webpack_require__(19); + + var _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict); + + // For compatibility and usage outside of module systems, make the Handlebars object a namespace + function create() { + var hb = new base.HandlebarsEnvironment(); + + Utils.extend(hb, base); + hb.SafeString = _handlebarsSafeString2['default']; + hb.Exception = _handlebarsException2['default']; + hb.Utils = Utils; + hb.escapeExpression = Utils.escapeExpression; + + hb.VM = runtime; + hb.template = function (spec) { + return runtime.template(spec, hb); + }; + + return hb; + } + + var inst = create(); + inst.create = create; + + _handlebarsNoConflict2['default'](inst); + + inst['default'] = inst; + + exports['default'] = inst; + module.exports = exports['default']; + +/***/ }, +/* 1 */ +/***/ function(module, exports) { + + "use strict"; + + exports["default"] = function (obj) { + if (obj && obj.__esModule) { + return obj; + } else { + var newObj = {}; + + if (obj != null) { + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; + } + } + + newObj["default"] = obj; + return newObj; + } + }; + + exports.__esModule = true; + +/***/ }, +/* 2 */ +/***/ function(module, exports) { + + "use strict"; + + exports["default"] = function (obj) { + return obj && obj.__esModule ? obj : { + "default": obj + }; + }; + + exports.__esModule = true; + +/***/ }, +/* 3 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + exports.HandlebarsEnvironment = HandlebarsEnvironment; + + var _utils = __webpack_require__(4); + + var _exception = __webpack_require__(5); + + var _exception2 = _interopRequireDefault(_exception); + + var _helpers = __webpack_require__(6); + + var _decorators = __webpack_require__(14); + + var _logger = __webpack_require__(16); + + var _logger2 = _interopRequireDefault(_logger); + + var VERSION = '4.0.5'; + exports.VERSION = VERSION; + var COMPILER_REVISION = 7; + + exports.COMPILER_REVISION = COMPILER_REVISION; + var REVISION_CHANGES = { + 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it + 2: '== 1.0.0-rc.3', + 3: '== 1.0.0-rc.4', + 4: '== 1.x.x', + 5: '== 2.0.0-alpha.x', + 6: '>= 2.0.0-beta.1', + 7: '>= 4.0.0' + }; + + exports.REVISION_CHANGES = REVISION_CHANGES; + var objectType = '[object Object]'; + + function HandlebarsEnvironment(helpers, partials, decorators) { + this.helpers = helpers || {}; + this.partials = partials || {}; + this.decorators = decorators || {}; + + _helpers.registerDefaultHelpers(this); + _decorators.registerDefaultDecorators(this); + } + + HandlebarsEnvironment.prototype = { + constructor: HandlebarsEnvironment, + + logger: _logger2['default'], + log: _logger2['default'].log, + + registerHelper: function registerHelper(name, fn) { + if (_utils.toString.call(name) === objectType) { + if (fn) { + throw new _exception2['default']('Arg not supported with multiple helpers'); + } + _utils.extend(this.helpers, name); + } else { + this.helpers[name] = fn; + } + }, + unregisterHelper: function unregisterHelper(name) { + delete this.helpers[name]; + }, + + registerPartial: function registerPartial(name, partial) { + if (_utils.toString.call(name) === objectType) { + _utils.extend(this.partials, name); + } else { + if (typeof partial === 'undefined') { + throw new _exception2['default']('Attempting to register a partial called "' + name + '" as undefined'); + } + this.partials[name] = partial; + } + }, + unregisterPartial: function unregisterPartial(name) { + delete this.partials[name]; + }, + + registerDecorator: function registerDecorator(name, fn) { + if (_utils.toString.call(name) === objectType) { + if (fn) { + throw new _exception2['default']('Arg not supported with multiple decorators'); + } + _utils.extend(this.decorators, name); + } else { + this.decorators[name] = fn; + } + }, + unregisterDecorator: function unregisterDecorator(name) { + delete this.decorators[name]; + } + }; + + var log = _logger2['default'].log; + + exports.log = log; + exports.createFrame = _utils.createFrame; + exports.logger = _logger2['default']; + +/***/ }, +/* 4 */ +/***/ function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + exports.extend = extend; + exports.indexOf = indexOf; + exports.escapeExpression = escapeExpression; + exports.isEmpty = isEmpty; + exports.createFrame = createFrame; + exports.blockParams = blockParams; + exports.appendContextPath = appendContextPath; + var escape = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`', + '=': '=' + }; + + var badChars = /[&<>"'`=]/g, + possible = /[&<>"'`=]/; + + function escapeChar(chr) { + return escape[chr]; + } + + function extend(obj /* , ...source */) { + for (var i = 1; i < arguments.length; i++) { + for (var key in arguments[i]) { + if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { + obj[key] = arguments[i][key]; + } + } + } + + return obj; + } + + var toString = Object.prototype.toString; + + exports.toString = toString; + // Sourced from lodash + // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt + /* eslint-disable func-style */ + var isFunction = function isFunction(value) { + return typeof value === 'function'; + }; + // fallback for older versions of Chrome and Safari + /* istanbul ignore next */ + if (isFunction(/x/)) { + exports.isFunction = isFunction = function (value) { + return typeof value === 'function' && toString.call(value) === '[object Function]'; + }; + } + exports.isFunction = isFunction; + + /* eslint-enable func-style */ + + /* istanbul ignore next */ + var isArray = Array.isArray || function (value) { + return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false; + }; + + exports.isArray = isArray; + // Older IE versions do not directly support indexOf so we must implement our own, sadly. + + function indexOf(array, value) { + for (var i = 0, len = array.length; i < len; i++) { + if (array[i] === value) { + return i; + } + } + return -1; + } + + function escapeExpression(string) { + if (typeof string !== 'string') { + // don't escape SafeStrings, since they're already safe + if (string && string.toHTML) { + return string.toHTML(); + } else if (string == null) { + return ''; + } else if (!string) { + return string + ''; + } + + // Force a string conversion as this will be done by the append regardless and + // the regex test will do this transparently behind the scenes, causing issues if + // an object's to string has escaped characters in it. + string = '' + string; + } + + if (!possible.test(string)) { + return string; + } + return string.replace(badChars, escapeChar); + } + + function isEmpty(value) { + if (!value && value !== 0) { + return true; + } else if (isArray(value) && value.length === 0) { + return true; + } else { + return false; + } + } + + function createFrame(object) { + var frame = extend({}, object); + frame._parent = object; + return frame; + } + + function blockParams(params, ids) { + params.path = ids; + return params; + } + + function appendContextPath(contextPath, id) { + return (contextPath ? contextPath + '.' : '') + id; + } + +/***/ }, +/* 5 */ +/***/ function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + + var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack']; + + function Exception(message, node) { + var loc = node && node.loc, + line = undefined, + column = undefined; + if (loc) { + line = loc.start.line; + column = loc.start.column; + + message += ' - ' + line + ':' + column; + } + + var tmp = Error.prototype.constructor.call(this, message); + + // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. + for (var idx = 0; idx < errorProps.length; idx++) { + this[errorProps[idx]] = tmp[errorProps[idx]]; + } + + /* istanbul ignore else */ + if (Error.captureStackTrace) { + Error.captureStackTrace(this, Exception); + } + + if (loc) { + this.lineNumber = line; + this.column = column; + } + } + + Exception.prototype = new Error(); + + exports['default'] = Exception; + module.exports = exports['default']; + +/***/ }, +/* 6 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + exports.registerDefaultHelpers = registerDefaultHelpers; + + var _helpersBlockHelperMissing = __webpack_require__(7); + + var _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing); + + var _helpersEach = __webpack_require__(8); + + var _helpersEach2 = _interopRequireDefault(_helpersEach); + + var _helpersHelperMissing = __webpack_require__(9); + + var _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing); + + var _helpersIf = __webpack_require__(10); + + var _helpersIf2 = _interopRequireDefault(_helpersIf); + + var _helpersLog = __webpack_require__(11); + + var _helpersLog2 = _interopRequireDefault(_helpersLog); + + var _helpersLookup = __webpack_require__(12); + + var _helpersLookup2 = _interopRequireDefault(_helpersLookup); + + var _helpersWith = __webpack_require__(13); + + var _helpersWith2 = _interopRequireDefault(_helpersWith); + + function registerDefaultHelpers(instance) { + _helpersBlockHelperMissing2['default'](instance); + _helpersEach2['default'](instance); + _helpersHelperMissing2['default'](instance); + _helpersIf2['default'](instance); + _helpersLog2['default'](instance); + _helpersLookup2['default'](instance); + _helpersWith2['default'](instance); + } + +/***/ }, +/* 7 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(4); + + exports['default'] = function (instance) { + instance.registerHelper('blockHelperMissing', function (context, options) { + var inverse = options.inverse, + fn = options.fn; + + if (context === true) { + return fn(this); + } else if (context === false || context == null) { + return inverse(this); + } else if (_utils.isArray(context)) { + if (context.length > 0) { + if (options.ids) { + options.ids = [options.name]; + } + + return instance.helpers.each(context, options); + } else { + return inverse(this); + } + } else { + if (options.data && options.ids) { + var data = _utils.createFrame(options.data); + data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name); + options = { data: data }; + } + + return fn(context, options); + } + }); + }; + + module.exports = exports['default']; + +/***/ }, +/* 8 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + + var _utils = __webpack_require__(4); + + var _exception = __webpack_require__(5); + + var _exception2 = _interopRequireDefault(_exception); + + exports['default'] = function (instance) { + instance.registerHelper('each', function (context, options) { + if (!options) { + throw new _exception2['default']('Must pass iterator to #each'); + } + + var fn = options.fn, + inverse = options.inverse, + i = 0, + ret = '', + data = undefined, + contextPath = undefined; + + if (options.data && options.ids) { + contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; + } + + if (_utils.isFunction(context)) { + context = context.call(this); + } + + if (options.data) { + data = _utils.createFrame(options.data); + } + + function execIteration(field, index, last) { + if (data) { + data.key = field; + data.index = index; + data.first = index === 0; + data.last = !!last; + + if (contextPath) { + data.contextPath = contextPath + field; + } + } + + ret = ret + fn(context[field], { + data: data, + blockParams: _utils.blockParams([context[field], field], [contextPath + field, null]) + }); + } + + if (context && typeof context === 'object') { + if (_utils.isArray(context)) { + for (var j = context.length; i < j; i++) { + if (i in context) { + execIteration(i, i, i === context.length - 1); + } + } + } else { + var priorKey = undefined; + + for (var key in context) { + if (context.hasOwnProperty(key)) { + // We're running the iterations one step out of sync so we can detect + // the last iteration without have to scan the object twice and create + // an itermediate keys array. + if (priorKey !== undefined) { + execIteration(priorKey, i - 1); + } + priorKey = key; + i++; + } + } + if (priorKey !== undefined) { + execIteration(priorKey, i - 1, true); + } + } + } + + if (i === 0) { + ret = inverse(this); + } + + return ret; + }); + }; + + module.exports = exports['default']; + +/***/ }, +/* 9 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + + var _exception = __webpack_require__(5); + + var _exception2 = _interopRequireDefault(_exception); + + exports['default'] = function (instance) { + instance.registerHelper('helperMissing', function () /* [args, ]options */{ + if (arguments.length === 1) { + // A missing field in a {{foo}} construct. + return undefined; + } else { + // Someone is actually trying to call something, blow up. + throw new _exception2['default']('Missing helper: "' + arguments[arguments.length - 1].name + '"'); + } + }); + }; + + module.exports = exports['default']; + +/***/ }, +/* 10 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(4); + + exports['default'] = function (instance) { + instance.registerHelper('if', function (conditional, options) { + if (_utils.isFunction(conditional)) { + conditional = conditional.call(this); + } + + // Default behavior is to render the positive path if the value is truthy and not empty. + // The `includeZero` option may be set to treat the condtional as purely not empty based on the + // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. + if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) { + return options.inverse(this); + } else { + return options.fn(this); + } + }); + + instance.registerHelper('unless', function (conditional, options) { + return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash }); + }); + }; + + module.exports = exports['default']; + +/***/ }, +/* 11 */ +/***/ function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + + exports['default'] = function (instance) { + instance.registerHelper('log', function () /* message, options */{ + var args = [undefined], + options = arguments[arguments.length - 1]; + for (var i = 0; i < arguments.length - 1; i++) { + args.push(arguments[i]); + } + + var level = 1; + if (options.hash.level != null) { + level = options.hash.level; + } else if (options.data && options.data.level != null) { + level = options.data.level; + } + args[0] = level; + + instance.log.apply(instance, args); + }); + }; + + module.exports = exports['default']; + +/***/ }, +/* 12 */ +/***/ function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + + exports['default'] = function (instance) { + instance.registerHelper('lookup', function (obj, field) { + return obj && obj[field]; + }); + }; + + module.exports = exports['default']; + +/***/ }, +/* 13 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(4); + + exports['default'] = function (instance) { + instance.registerHelper('with', function (context, options) { + if (_utils.isFunction(context)) { + context = context.call(this); + } + + var fn = options.fn; + + if (!_utils.isEmpty(context)) { + var data = options.data; + if (options.data && options.ids) { + data = _utils.createFrame(options.data); + data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]); + } + + return fn(context, { + data: data, + blockParams: _utils.blockParams([context], [data && data.contextPath]) + }); + } else { + return options.inverse(this); + } + }); + }; + + module.exports = exports['default']; + +/***/ }, +/* 14 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + exports.registerDefaultDecorators = registerDefaultDecorators; + + var _decoratorsInline = __webpack_require__(15); + + var _decoratorsInline2 = _interopRequireDefault(_decoratorsInline); + + function registerDefaultDecorators(instance) { + _decoratorsInline2['default'](instance); + } + +/***/ }, +/* 15 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(4); + + exports['default'] = function (instance) { + instance.registerDecorator('inline', function (fn, props, container, options) { + var ret = fn; + if (!props.partials) { + props.partials = {}; + ret = function (context, options) { + // Create a new partials stack frame prior to exec. + var original = container.partials; + container.partials = _utils.extend({}, original, props.partials); + var ret = fn(context, options); + container.partials = original; + return ret; + }; + } + + props.partials[options.args[0]] = options.fn; + + return ret; + }); + }; + + module.exports = exports['default']; + +/***/ }, +/* 16 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(4); + + var logger = { + methodMap: ['debug', 'info', 'warn', 'error'], + level: 'info', + + // Maps a given level value to the `methodMap` indexes above. + lookupLevel: function lookupLevel(level) { + if (typeof level === 'string') { + var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase()); + if (levelMap >= 0) { + level = levelMap; + } else { + level = parseInt(level, 10); + } + } + + return level; + }, + + // Can be overridden in the host environment + log: function log(level) { + level = logger.lookupLevel(level); + + if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) { + var method = logger.methodMap[level]; + if (!console[method]) { + // eslint-disable-line no-console + method = 'log'; + } + + for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + message[_key - 1] = arguments[_key]; + } + + console[method].apply(console, message); // eslint-disable-line no-console + } + } + }; + + exports['default'] = logger; + module.exports = exports['default']; + +/***/ }, +/* 17 */ +/***/ function(module, exports) { + + // Build out our basic SafeString type + 'use strict'; + + exports.__esModule = true; + function SafeString(string) { + this.string = string; + } + + SafeString.prototype.toString = SafeString.prototype.toHTML = function () { + return '' + this.string; + }; + + exports['default'] = SafeString; + module.exports = exports['default']; + +/***/ }, +/* 18 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireWildcard = __webpack_require__(1)['default']; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + exports.checkRevision = checkRevision; + exports.template = template; + exports.wrapProgram = wrapProgram; + exports.resolvePartial = resolvePartial; + exports.invokePartial = invokePartial; + exports.noop = noop; + + var _utils = __webpack_require__(4); + + var Utils = _interopRequireWildcard(_utils); + + var _exception = __webpack_require__(5); + + var _exception2 = _interopRequireDefault(_exception); + + var _base = __webpack_require__(3); + + function checkRevision(compilerInfo) { + var compilerRevision = compilerInfo && compilerInfo[0] || 1, + currentRevision = _base.COMPILER_REVISION; + + if (compilerRevision !== currentRevision) { + if (compilerRevision < currentRevision) { + var runtimeVersions = _base.REVISION_CHANGES[currentRevision], + compilerVersions = _base.REVISION_CHANGES[compilerRevision]; + throw new _exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); + } else { + // Use the embedded version info since the runtime doesn't know about this revision yet + throw new _exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); + } + } + } + + function template(templateSpec, env) { + /* istanbul ignore next */ + if (!env) { + throw new _exception2['default']('No environment passed to template'); + } + if (!templateSpec || !templateSpec.main) { + throw new _exception2['default']('Unknown template object: ' + typeof templateSpec); + } + + templateSpec.main.decorator = templateSpec.main_d; + + // Note: Using env.VM references rather than local var references throughout this section to allow + // for external users to override these as psuedo-supported APIs. + env.VM.checkRevision(templateSpec.compiler); + + function invokePartialWrapper(partial, context, options) { + if (options.hash) { + context = Utils.extend({}, context, options.hash); + if (options.ids) { + options.ids[0] = true; + } + } + + partial = env.VM.resolvePartial.call(this, partial, context, options); + var result = env.VM.invokePartial.call(this, partial, context, options); + + if (result == null && env.compile) { + options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); + result = options.partials[options.name](context, options); + } + if (result != null) { + if (options.indent) { + var lines = result.split('\n'); + for (var i = 0, l = lines.length; i < l; i++) { + if (!lines[i] && i + 1 === l) { + break; + } + + lines[i] = options.indent + lines[i]; + } + result = lines.join('\n'); + } + return result; + } else { + throw new _exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); + } + } + + // Just add water + var container = { + strict: function strict(obj, name) { + if (!(name in obj)) { + throw new _exception2['default']('"' + name + '" not defined in ' + obj); + } + return obj[name]; + }, + lookup: function lookup(depths, name) { + var len = depths.length; + for (var i = 0; i < len; i++) { + if (depths[i] && depths[i][name] != null) { + return depths[i][name]; + } + } + }, + lambda: function lambda(current, context) { + return typeof current === 'function' ? current.call(context) : current; + }, + + escapeExpression: Utils.escapeExpression, + invokePartial: invokePartialWrapper, + + fn: function fn(i) { + var ret = templateSpec[i]; + ret.decorator = templateSpec[i + '_d']; + return ret; + }, + + programs: [], + program: function program(i, data, declaredBlockParams, blockParams, depths) { + var programWrapper = this.programs[i], + fn = this.fn(i); + if (data || depths || blockParams || declaredBlockParams) { + programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); + } else if (!programWrapper) { + programWrapper = this.programs[i] = wrapProgram(this, i, fn); + } + return programWrapper; + }, + + data: function data(value, depth) { + while (value && depth--) { + value = value._parent; + } + return value; + }, + merge: function merge(param, common) { + var obj = param || common; + + if (param && common && param !== common) { + obj = Utils.extend({}, common, param); + } + + return obj; + }, + + noop: env.VM.noop, + compilerInfo: templateSpec.compiler + }; + + function ret(context) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + var data = options.data; + + ret._setup(options); + if (!options.partial && templateSpec.useData) { + data = initData(context, data); + } + var depths = undefined, + blockParams = templateSpec.useBlockParams ? [] : undefined; + if (templateSpec.useDepths) { + if (options.depths) { + depths = context !== options.depths[0] ? [context].concat(options.depths) : options.depths; + } else { + depths = [context]; + } + } + + function main(context /*, options*/) { + return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths); + } + main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams); + return main(context, options); + } + ret.isTop = true; + + ret._setup = function (options) { + if (!options.partial) { + container.helpers = container.merge(options.helpers, env.helpers); + + if (templateSpec.usePartial) { + container.partials = container.merge(options.partials, env.partials); + } + if (templateSpec.usePartial || templateSpec.useDecorators) { + container.decorators = container.merge(options.decorators, env.decorators); + } + } else { + container.helpers = options.helpers; + container.partials = options.partials; + container.decorators = options.decorators; + } + }; + + ret._child = function (i, data, blockParams, depths) { + if (templateSpec.useBlockParams && !blockParams) { + throw new _exception2['default']('must pass block params'); + } + if (templateSpec.useDepths && !depths) { + throw new _exception2['default']('must pass parent depths'); + } + + return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); + }; + return ret; + } + + function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { + function prog(context) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + var currentDepths = depths; + if (depths && context !== depths[0]) { + currentDepths = [context].concat(depths); + } + + return fn(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths); + } + + prog = executeDecorators(fn, prog, container, depths, data, blockParams); + + prog.program = i; + prog.depth = depths ? depths.length : 0; + prog.blockParams = declaredBlockParams || 0; + return prog; + } + + function resolvePartial(partial, context, options) { + if (!partial) { + if (options.name === '@partial-block') { + partial = options.data['partial-block']; + } else { + partial = options.partials[options.name]; + } + } else if (!partial.call && !options.name) { + // This is a dynamic partial that returned a string + options.name = partial; + partial = options.partials[partial]; + } + return partial; + } + + function invokePartial(partial, context, options) { + options.partial = true; + if (options.ids) { + options.data.contextPath = options.ids[0] || options.data.contextPath; + } + + var partialBlock = undefined; + if (options.fn && options.fn !== noop) { + options.data = _base.createFrame(options.data); + partialBlock = options.data['partial-block'] = options.fn; + + if (partialBlock.partials) { + options.partials = Utils.extend({}, options.partials, partialBlock.partials); + } + } + + if (partial === undefined && partialBlock) { + partial = partialBlock; + } + + if (partial === undefined) { + throw new _exception2['default']('The partial ' + options.name + ' could not be found'); + } else if (partial instanceof Function) { + return partial(context, options); + } + } + + function noop() { + return ''; + } + + function initData(context, data) { + if (!data || !('root' in data)) { + data = data ? _base.createFrame(data) : {}; + data.root = context; + } + return data; + } + + function executeDecorators(fn, prog, container, depths, data, blockParams) { + if (fn.decorator) { + var props = {}; + prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths); + Utils.extend(prog, props); + } + return prog; + } + +/***/ }, +/* 19 */ +/***/ function(module, exports) { + + /* WEBPACK VAR INJECTION */(function(global) {/* global window */ + 'use strict'; + + exports.__esModule = true; + + exports['default'] = function (Handlebars) { + /* istanbul ignore next */ + var root = typeof global !== 'undefined' ? global : window, + $Handlebars = root.Handlebars; + /* istanbul ignore next */ + Handlebars.noConflict = function () { + if (root.Handlebars === Handlebars) { + root.Handlebars = $Handlebars; + } + return Handlebars; + }; + }; + + module.exports = exports['default']; + /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) + +/***/ } +/******/ ]) +}); +; \ No newline at end of file diff --git a/wwwroot/js/lib/jquery.autocomplete.min.js b/wwwroot/js/lib/jquery.autocomplete.min.js new file mode 100644 index 0000000..c45363f --- /dev/null +++ b/wwwroot/js/lib/jquery.autocomplete.min.js @@ -0,0 +1,8 @@ +/** +* Ajax Autocomplete for jQuery, version 1.2.25 +* (c) 2014 Tomas Kirda +* +* Ajax Autocomplete for jQuery is freely distributable under the terms of an MIT-style license. +* For details, see the web site: https://github.com/devbridge/jQuery-Autocomplete +*/ +!function(a){"use strict";"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports&&"function"==typeof require?require("jquery"):jQuery)}(function(a){"use strict";function b(c,d){var e=function(){},f=this,g={ajaxSettings:{},autoSelectFirst:!1,appendTo:document.body,serviceUrl:null,lookup:null,onSelect:null,width:"auto",minChars:1,maxHeight:300,deferRequestBy:0,params:{},formatResult:b.formatResult,delimiter:null,zIndex:9999,type:"GET",noCache:!1,onSearchStart:e,onSearchComplete:e,onSearchError:e,preserveInput:!1,containerClass:"autocomplete-suggestions",tabDisabled:!1,dataType:"text",currentRequest:null,triggerSelectOnValidInput:!0,preventBadQueries:!0,lookupFilter:function(a,b,c){return-1!==a.value.toLowerCase().indexOf(c)},paramName:"query",transformResult:function(b){return"string"==typeof b?a.parseJSON(b):b},showNoSuggestionNotice:!1,noSuggestionNotice:"No results",orientation:"bottom",forceFixPosition:!1};f.element=c,f.el=a(c),f.suggestions=[],f.badQueries=[],f.selectedIndex=-1,f.currentValue=f.element.value,f.intervalId=0,f.cachedResponse={},f.onChangeInterval=null,f.onChange=null,f.isLocal=!1,f.suggestionsContainer=null,f.noSuggestionsContainer=null,f.options=a.extend({},g,d),f.classes={selected:"autocomplete-selected",suggestion:"autocomplete-suggestion"},f.hint=null,f.hintValue="",f.selection=null,f.initialize(),f.setOptions(d)}var c=function(){return{escapeRegExChars:function(a){return a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},createNode:function(a){var b=document.createElement("div");return b.className=a,b.style.position="absolute",b.style.display="none",b}}}(),d={ESC:27,TAB:9,RETURN:13,LEFT:37,UP:38,RIGHT:39,DOWN:40};b.utils=c,a.Autocomplete=b,b.formatResult=function(a,b){if(!b)return a.value;var d="("+c.escapeRegExChars(b)+")";return a.value.replace(new RegExp(d,"gi"),"$1").replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/<(\/?strong)>/g,"<$1>")},b.prototype={killerFn:null,initialize:function(){var c,d=this,e="."+d.classes.suggestion,f=d.classes.selected,g=d.options;d.element.setAttribute("autocomplete","off"),d.killerFn=function(b){0===a(b.target).closest("."+d.options.containerClass).length&&(d.killSuggestions(),d.disableKillerFn())},d.noSuggestionsContainer=a('
    ').html(this.options.noSuggestionNotice).get(0),d.suggestionsContainer=b.utils.createNode(g.containerClass),c=a(d.suggestionsContainer),c.appendTo(g.appendTo),"auto"!==g.width&&c.width(g.width),c.on("mouseover.autocomplete",e,function(){d.activate(a(this).data("index"))}),c.on("mouseout.autocomplete",function(){d.selectedIndex=-1,c.children("."+f).removeClass(f)}),c.on("click.autocomplete",e,function(){return d.select(a(this).data("index")),!1}),d.fixPositionCapture=function(){d.visible&&d.fixPosition()},a(window).on("resize.autocomplete",d.fixPositionCapture),d.el.on("keydown.autocomplete",function(a){d.onKeyPress(a)}),d.el.on("keyup.autocomplete",function(a){d.onKeyUp(a)}),d.el.on("blur.autocomplete",function(){d.onBlur()}),d.el.on("focus.autocomplete",function(){d.onFocus()}),d.el.on("change.autocomplete",function(a){d.onKeyUp(a)}),d.el.on("input.autocomplete",function(a){d.onKeyUp(a)})},onFocus:function(){var a=this;a.fixPosition(),a.el.val().length>=a.options.minChars&&a.onValueChange()},onBlur:function(){this.enableKillerFn()},abortAjax:function(){var a=this;a.currentRequest&&(a.currentRequest.abort(),a.currentRequest=null)},setOptions:function(b){var c=this,d=c.options;a.extend(d,b),c.isLocal=a.isArray(d.lookup),c.isLocal&&(d.lookup=c.verifySuggestionsFormat(d.lookup)),d.orientation=c.validateOrientation(d.orientation,"bottom"),a(c.suggestionsContainer).css({"max-height":d.maxHeight+"px",width:d.width+"px","z-index":d.zIndex})},clearCache:function(){this.cachedResponse={},this.badQueries=[]},clear:function(){this.clearCache(),this.currentValue="",this.suggestions=[]},disable:function(){var a=this;a.disabled=!0,clearInterval(a.onChangeInterval),a.abortAjax()},enable:function(){this.disabled=!1},fixPosition:function(){var b=this,c=a(b.suggestionsContainer),d=c.parent().get(0);if(d===document.body||b.options.forceFixPosition){var e=b.options.orientation,f=c.outerHeight(),g=b.el.outerHeight(),h=b.el.offset(),i={top:h.top,left:h.left};if("auto"===e){var j=a(window).height(),k=a(window).scrollTop(),l=-k+h.top-f,m=k+j-(h.top+g+f);e=Math.max(l,m)===l?"top":"bottom"}if("top"===e?i.top+=-f:i.top+=g,d!==document.body){var n,o=c.css("opacity");b.visible||c.css("opacity",0).show(),n=c.offsetParent().offset(),i.top-=n.top,i.left-=n.left,b.visible||c.css("opacity",o).hide()}"auto"===b.options.width&&(i.width=b.el.outerWidth()-2+"px"),c.css(i)}},enableKillerFn:function(){var b=this;a(document).on("click.autocomplete",b.killerFn)},disableKillerFn:function(){var b=this;a(document).off("click.autocomplete",b.killerFn)},killSuggestions:function(){var a=this;a.stopKillSuggestions(),a.intervalId=window.setInterval(function(){a.visible&&(a.el.val(a.currentValue),a.hide()),a.stopKillSuggestions()},50)},stopKillSuggestions:function(){window.clearInterval(this.intervalId)},isCursorAtEnd:function(){var a,b=this,c=b.el.val().length,d=b.element.selectionStart;return"number"==typeof d?d===c:document.selection?(a=document.selection.createRange(),a.moveStart("character",-c),c===a.text.length):!0},onKeyPress:function(a){var b=this;if(!b.disabled&&!b.visible&&a.which===d.DOWN&&b.currentValue)return void b.suggest();if(!b.disabled&&b.visible){switch(a.which){case d.ESC:b.el.val(b.currentValue),b.hide();break;case d.RIGHT:if(b.hint&&b.options.onHint&&b.isCursorAtEnd()){b.selectHint();break}return;case d.TAB:if(b.hint&&b.options.onHint)return void b.selectHint();if(-1===b.selectedIndex)return void b.hide();if(b.select(b.selectedIndex),b.options.tabDisabled===!1)return;break;case d.RETURN:if(-1===b.selectedIndex)return void b.hide();b.select(b.selectedIndex);break;case d.UP:b.moveUp();break;case d.DOWN:b.moveDown();break;default:return}a.stopImmediatePropagation(),a.preventDefault()}},onKeyUp:function(a){var b=this;if(!b.disabled){switch(a.which){case d.UP:case d.DOWN:return}clearInterval(b.onChangeInterval),b.currentValue!==b.el.val()&&(b.findBestHint(),b.options.deferRequestBy>0?b.onChangeInterval=setInterval(function(){b.onValueChange()},b.options.deferRequestBy):b.onValueChange())}},onValueChange:function(){var b=this,c=b.options,d=b.el.val(),e=b.getQuery(d);return b.selection&&b.currentValue!==e&&(b.selection=null,(c.onInvalidateSelection||a.noop).call(b.element)),clearInterval(b.onChangeInterval),b.currentValue=d,b.selectedIndex=-1,c.triggerSelectOnValidInput&&b.isExactMatch(e)?void b.select(0):void(e.lengthh&&(c.suggestions=c.suggestions.slice(0,h)),c},getSuggestions:function(b){var c,d,e,f,g=this,h=g.options,i=h.serviceUrl;if(h.params[h.paramName]=b,d=h.ignoreParams?null:h.params,h.onSearchStart.call(g.element,h.params)!==!1){if(a.isFunction(h.lookup))return void h.lookup(b,function(a){g.suggestions=a.suggestions,g.suggest(),h.onSearchComplete.call(g.element,b,a.suggestions)});g.isLocal?c=g.getSuggestionsLocal(b):(a.isFunction(i)&&(i=i.call(g.element,b)),e=i+"?"+a.param(d||{}),c=g.cachedResponse[e]),c&&a.isArray(c.suggestions)?(g.suggestions=c.suggestions,g.suggest(),h.onSearchComplete.call(g.element,b,c.suggestions)):g.isBadQuery(b)?h.onSearchComplete.call(g.element,b,[]):(g.abortAjax(),f={url:i,data:d,type:h.type,dataType:h.dataType},a.extend(f,h.ajaxSettings),g.currentRequest=a.ajax(f).done(function(a){var c;g.currentRequest=null,c=h.transformResult(a,b),g.processResponse(c,b,e),h.onSearchComplete.call(g.element,b,c.suggestions)}).fail(function(a,c,d){h.onSearchError.call(g.element,b,a,c,d)}))}},isBadQuery:function(a){if(!this.options.preventBadQueries)return!1;for(var b=this.badQueries,c=b.length;c--;)if(0===a.indexOf(b[c]))return!0;return!1},hide:function(){var b=this,c=a(b.suggestionsContainer);a.isFunction(b.options.onHide)&&b.visible&&b.options.onHide.call(b.element,c),b.visible=!1,b.selectedIndex=-1,clearInterval(b.onChangeInterval),a(b.suggestionsContainer).hide(),b.signalHint(null)},suggest:function(){if(0===this.suggestions.length)return void(this.options.showNoSuggestionNotice?this.noSuggestions():this.hide());var b,c=this,d=c.options,e=d.groupBy,f=d.formatResult,g=c.getQuery(c.currentValue),h=c.classes.suggestion,i=c.classes.selected,j=a(c.suggestionsContainer),k=a(c.noSuggestionsContainer),l=d.beforeRender,m="",n=function(a,c){var d=a.data[e];return b===d?"":(b=d,'
    '+b+"
    ")};return d.triggerSelectOnValidInput&&c.isExactMatch(g)?void c.select(0):(a.each(c.suggestions,function(a,b){e&&(m+=n(b,g,a)),m+='
    '+f(b,g,a)+"
    "}),this.adjustContainerWidth(),k.detach(),j.html(m),a.isFunction(l)&&l.call(c.element,j,c.suggestions),c.fixPosition(),j.show(),d.autoSelectFirst&&(c.selectedIndex=0,j.scrollTop(0),j.children("."+h).first().addClass(i)),c.visible=!0,void c.findBestHint())},noSuggestions:function(){var b=this,c=a(b.suggestionsContainer),d=a(b.noSuggestionsContainer);this.adjustContainerWidth(),d.detach(),c.empty(),c.append(d),b.fixPosition(),c.show(),b.visible=!0},adjustContainerWidth:function(){var b,c=this,d=c.options,e=a(c.suggestionsContainer);"auto"===d.width&&(b=c.el.outerWidth()-2,e.width(b>0?b:300))},findBestHint:function(){var b=this,c=b.el.val().toLowerCase(),d=null;c&&(a.each(b.suggestions,function(a,b){var e=0===b.value.toLowerCase().indexOf(c);return e&&(d=b),!e}),b.signalHint(d))},signalHint:function(b){var c="",d=this;b&&(c=d.currentValue+b.value.substr(d.currentValue.length)),d.hintValue!==c&&(d.hintValue=c,d.hint=b,(this.options.onHint||a.noop)(c))},verifySuggestionsFormat:function(b){return b.length&&"string"==typeof b[0]?a.map(b,function(a){return{value:a,data:null}}):b},validateOrientation:function(b,c){return b=a.trim(b||"").toLowerCase(),-1===a.inArray(b,["auto","bottom","top"])&&(b=c),b},processResponse:function(a,b,c){var d=this,e=d.options;a.suggestions=d.verifySuggestionsFormat(a.suggestions),e.noCache||(d.cachedResponse[c]=a,e.preventBadQueries&&0===a.suggestions.length&&d.badQueries.push(b)),b===d.getQuery(d.currentValue)&&(d.suggestions=a.suggestions,d.suggest())},activate:function(b){var c,d=this,e=d.classes.selected,f=a(d.suggestionsContainer),g=f.find("."+d.classes.suggestion);return f.find("."+e).removeClass(e),d.selectedIndex=b,-1!==d.selectedIndex&&g.length>d.selectedIndex?(c=g.get(d.selectedIndex),a(c).addClass(e),c):null},selectHint:function(){var b=this,c=a.inArray(b.hint,b.suggestions);b.select(c)},select:function(a){var b=this;b.hide(),b.onSelect(a)},moveUp:function(){var b=this;if(-1!==b.selectedIndex)return 0===b.selectedIndex?(a(b.suggestionsContainer).children().first().removeClass(b.classes.selected),b.selectedIndex=-1,b.el.val(b.currentValue),void b.findBestHint()):void b.adjustScroll(b.selectedIndex-1)},moveDown:function(){var a=this;a.selectedIndex!==a.suggestions.length-1&&a.adjustScroll(a.selectedIndex+1)},adjustScroll:function(b){var c=this,d=c.activate(b);if(d){var e,f,g,h=a(d).outerHeight();e=d.offsetTop,f=a(c.suggestionsContainer).scrollTop(),g=f+c.options.maxHeight-h,f>e?a(c.suggestionsContainer).scrollTop(e):e>g&&a(c.suggestionsContainer).scrollTop(e-c.options.maxHeight+h),c.options.preserveInput||c.el.val(c.getValue(c.suggestions[b].value)),c.signalHint(null)}},onSelect:function(b){var c=this,d=c.options.onSelect,e=c.suggestions[b];c.currentValue=c.getValue(e.value),c.currentValue===c.el.val()||c.options.preserveInput||c.el.val(c.currentValue),c.signalHint(null),c.suggestions=[],c.selection=e,a.isFunction(d)&&d.call(c.element,e)},getValue:function(a){var b,c,d=this,e=d.options.delimiter;return e?(b=d.currentValue,c=b.split(e),1===c.length?a:b.substr(0,b.length-c[c.length-1].length)+a):a},dispose:function(){var b=this;b.el.off(".autocomplete").removeData("autocomplete"),b.disableKillerFn(),a(window).off("resize.autocomplete",b.fixPositionCapture),a(b.suggestionsContainer).remove()}},a.fn.autocomplete=a.fn.devbridgeAutocomplete=function(c,d){var e="autocomplete";return 0===arguments.length?this.first().data(e):this.each(function(){var f=a(this),g=f.data(e);"string"==typeof c?g&&"function"==typeof g[c]&&g[c](d):(g&&g.dispose&&g.dispose(),g=new b(this,c),f.data(e,g))})}}); \ No newline at end of file diff --git a/wwwroot/js/lib/jquery.event.gevent.js b/wwwroot/js/lib/jquery.event.gevent.js new file mode 100644 index 0000000..eb79e58 --- /dev/null +++ b/wwwroot/js/lib/jquery.event.gevent.js @@ -0,0 +1,154 @@ +/* + * jQuery global custom event plugin (gevent) + * + * Copyright (c) 2013 Michael S. Mikowski + * (mike[dot]mikowski[at]gmail[dotcom]) + * + * Dual licensed under the MIT or GPL Version 2 + * http://jquery.org/license + * + * Versions + * 0.1.5 - initial release + * 0.1.6 - enhanced publishEvent (publish) method pass + * a non-array variable as the second argument + * to a subscribed function (the first argument + * is always the event object). + * 0.1.7-10, 0.2.0 + * - documentation changes + * 1.0.2 - cleaned-up logic, bumped version + * 1.1.2 - added keywords + * +*/ + +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ +/*global jQuery*/ + +(function ( $ ) { + 'use strict'; + $.gevent = (function () { + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var + subscribeEvent, publishEvent, unsubscribeEvent, + $customSubMap = {} + ; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + // BEGIN public method /publishEvent/ + // Example : + // $.gevent.publish( + // 'spa-model-msg-receive', + // [ { user : 'fred', msg : 'Hi gang' } ] + // ); + // Purpose : + // Publish an event with an optional list of arguments + // which a subscribed handler will receive after the event object. + // Arguments (positional) + // * 0 ( event_name ) - The global event name + // * 1 ( data ) - Optional data to be passed as argument(s) + // to subscribed functions after the event + // object. Provide an array for multiple + // arguments. + // Throws : none + // Returns : none + // + publishEvent = function () { + var arg_list = [], + arg_count, event_name, + event_obj, data, data_list; + + arg_list = arg_list.slice.call( arguments, 0 ); + arg_count = arg_list.length; + + if ( arg_count === 0 ) { return false; } + + event_name = arg_list.shift(); + event_obj = $customSubMap[ event_name ]; + + if ( ! event_obj ) { return false; } + + if ( arg_count > 1 ) { + data = arg_list.shift(); + data_list = $.isArray( data ) ? data : [ data ]; + } + else { + data_list = []; + } + + event_obj.trigger( event_name, data_list ); + return true; + }; + // END public method /publishEvent/ + + // BEGIN public method /subscribeEvent/ + // Example : + // $.gevent.subscribe( + // $( '#msg' ), + // 'spa-msg-receive', + // onModelMsgReceive + // ); + // Purpose : + // Subscribe a function to a published event on a jQuery collection + // Arguments (positional) + // * 0 ( $collection ) - The jQuery collection on which to bind event + // * 1 ( event_name ) - The global event name + // * 2 ( fn ) - The function to bound to the event on the collection + // Throws : none + // Returns : none + // + subscribeEvent = function ( $collection, event_name, fn ) { + $collection.on( event_name, fn ); + + if ( $customSubMap[ event_name ] ) { + $customSubMap[ event_name ] + = $customSubMap[ event_name ].add( $collection ); + } + else { + $customSubMap[ event_name ] = $collection; + } + }; + // END public method /subscribeEvent/ + + // BEGIN public method /unsubscribeEvent/ + // Example : + // $.gevent.unsubscribe( + // $( '#msg' ), + // 'spa-model-msg-receive' + // ); + // Purpose : + // Remove a binding for the named event on a provided collection + // Arguments (positional) + // * 0 ( $collection ) - The jQuery collection on which to bind event + // * 1 ( event_name ) - The global event name + // Throws : none + // Returns : none + // + unsubscribeEvent = function ( $collection, event_name ) { + if ( ! $customSubMap[ event_name ] ){ return false; } + + $customSubMap[ event_name ] + = $customSubMap[ event_name ].not( $collection ); + + if ( $customSubMap[ event_name ].length === 0 ){ + delete $customSubMap[ event_name ]; + } + + return true; + }; + // END public method /unsubscribeEvent/ + //------------------- END PUBLIC METHODS --------------------- + + // return public methods + return { + publish : publishEvent, + subscribe : subscribeEvent, + unsubscribe : unsubscribeEvent + }; + }()); +}( jQuery )); + diff --git a/wwwroot/js/lib/jquery.event.ue.js b/wwwroot/js/lib/jquery.event.ue.js new file mode 100644 index 0000000..f6ba229 --- /dev/null +++ b/wwwroot/js/lib/jquery.event.ue.js @@ -0,0 +1,783 @@ +/* + * jQuery plugin for unified mouse and touch events + * + * Copyright (c) 2013 Michael S. Mikowski + * (mike[dot]mikowski[at]gmail[dotcom]) + * + * Dual licensed under the MIT or GPL Version 2 + * http://jquery.org/license + * + * Versions + * 1.2.0 - ignore_class => ignore_select, now defaults to '' + * 1.1.9 - Fixed ue-test.html demo to scale properly + * 1.1.8 - Removed prevent default from non-ue events + * 1.1.7 - Corrected desktop zoom motion description + * 1.1.0-5 - No code changes. Updated npm keywords. Fixed typos. + * Bumped version to represent maturity and stability. + * 0.6.1 - Change px_radius from 5 to 10 pixels + * 0.6.0 - Added px_tdelta_x and px_tdelta_y for deltas from start + * - Fixed onheld and drag conflicts + * 0.5.0 - Updated docs, removed cruft, updated for jslint, + * updated test page (zoom) + * 0.4.3 - Removed fatal execption possibility if originalEvent + * is not defined on event object + * 0.4.2 - Updated documentation + * 0.3.2 - Updated to jQuery 1.9.1. + * Confirmed 1.7.0-1.9.1 compatibility. + * 0.3.1 - Change for jQuery plugins site + * 0.3.0 - Initial jQuery plugin site release + * - Replaced scrollwheel zoom with drag motion. + * This resolved a conflict with scrollable areas. + * +*/ + +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, plusplus : true, regexp : true, + sloppy : true, vars : false, white : true +*/ +/*global jQuery */ + +(function ( $ ) { + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var + $Special = $.event.special, // Shortcut for special event + motionMapMap = {}, // Map of pointer motions by cursor + isMoveBound = false, // Flag if move handlers bound + pxPinchZoom = -1, // Distance between pinch-zoom points + optionKey = 'ue_bound', // Data key for storing options + doDisableMouse = false, // Flag to discard mouse input + defaultOptMap = { // Default option map + bound_ns_map : {}, // Map of bound namespaces e.g. + // bound_ns_map.utap.fred + px_radius : 10, // Tolerated distance before dragstart + ignore_select : '', // Selector of elements to ignore (e.g. :input) + max_tap_ms : 200, // Maximum time allowed for tap + min_held_ms : 300 // Minimum time require for long-press + }, + + callbackList = [], // global callback stack + zoomMouseNum = 1, // multiplier for mouse zoom + zoomTouchNum = 4, // multiplier for touch zoom + + boundList, Ue, + motionDragId, motionHeldId, motionDzoomId, + motion1ZoomId, motion2ZoomId, + + checkMatchVal, removeListVal, pushUniqVal, makeListPlus, + fnHeld, fnMotionStart, fnMotionMove, + fnMotionEnd, onMouse, onTouch + ; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + // Begin utiltity /makeListPlus/ + // Returns an array with much desired methods: + // * remove_val(value) : remove element that matches + // the provided value. Returns number of elements + // removed. + // * match_val(value) : shows if a value exists + // * push_uniq(value) : pushes a value onto the stack + // iff it does not already exist there + // Note: the reason I need this is to compare objects to + // objects (perhaps jQuery has something similar?) + checkMatchVal = function ( data ) { + var match_count = 0, idx; + for ( idx = this.length; idx; 0 ) { + if ( this[--idx] === data ) { match_count++; } + } + return match_count; + }; + removeListVal = function ( data ) { + var removed_count = 0, idx; + for ( idx = this.length; idx; 0 ) { + if ( this[--idx] === data ) { + this.splice(idx, 1); + removed_count++; + idx++; + } + } + return removed_count; + }; + pushUniqVal = function ( data ) { + if ( checkMatchVal.call(this, data ) ) { return false; } + this.push( data ); + return true; + }; + // primary utility + makeListPlus = function ( input_list ) { + if ( input_list && $.isArray(input_list) ) { + if ( input_list.remove_val ) { + console.warn( 'The array appears to already have listPlus capabilities' ); + return input_list; + } + } + else { + input_list = []; + } + input_list.remove_val = removeListVal; + input_list.match_val = checkMatchVal; + input_list.push_uniq = pushUniqVal; + + return input_list; + }; + // End utility /makeListPlus/ + //-------------------- END UTILITY METHODS ------------------- + + //--------------- BEGIN JQUERY SPECIAL EVENTS ---------------- + // Unique array for bound objects + boundList = makeListPlus(); + + // Begin define special event handlers + Ue = { + setup : function( data, name_list, bind_fn ) { + var + this_el = this, + $to_bind = $(this_el), + seen_map = {}, + option_map, idx, namespace_key, ue_namespace_code, namespace_list + ; + + // jslint hack to allow unused arguments + if ( data && bind_fn ) { console.log( 'unused arguments' ); } + + // if previous related event bound do not rebind, but do add to + // type of event bound to this element, if not already noted + if ( $.data( this, optionKey ) ) { return; } + + option_map = {}; + $.extend( true, option_map, defaultOptMap ); + $.data( this_el, optionKey, option_map ); + + namespace_list = makeListPlus(name_list.slice(0)); + if ( ! namespace_list.length + || namespace_list[0] === "" + ) { namespace_list = ["000"]; } + + NSPACE_00: + for ( idx = 0; idx < namespace_list.length; idx++ ) { + namespace_key = namespace_list[idx]; + + if ( ! namespace_key ) { continue NSPACE_00; } + if ( seen_map.hasOwnProperty(namespace_key) ) { continue NSPACE_00; } + + seen_map[namespace_key] = true; + + ue_namespace_code = '.__ue' + namespace_key; + + $to_bind.bind( 'mousedown' + ue_namespace_code, onMouse ); + $to_bind.bind( 'touchstart' + ue_namespace_code, onTouch ); + } + + boundList.push_uniq( this_el ); // record as bound element + + if ( ! isMoveBound ) { + // console.log('first element bound - adding global binds'); + $(document).bind( 'mousemove.__ue', onMouse ); + $(document).bind( 'touchmove.__ue', onTouch ); + $(document).bind( 'mouseup.__ue' , onMouse ); + $(document).bind( 'touchend.__ue' , onTouch ); + $(document).bind( 'touchcancel.__ue', onTouch ); + isMoveBound = true; + } + }, + + // arg_map.type = string - name of event to bind + // arg_map.data = poly - whatever (optional) data was passed when binding + // arg_map.namespace = string - A sorted, dot-delimited list of namespaces + // specified when binding the event + // arg_map.handler = fn - the event handler the developer wishes to be bound + // to the event. This function should be called whenever the event + // is triggered + // arg_map.guid = number - unique ID for event handler, provided by jQuery + // arg_map.selector = string - selector used by 'delegate' or 'live' jQuery + // methods. Only available when these methods are used. + // + // this - the element to which the event handler is being bound + // this always executes immediate after setup (if first binding) + add : function ( arg_map ) { + var + this_el = this, + option_map = $.data( this_el, optionKey ), + namespace_str = arg_map.namespace, + event_type = arg_map.type, + bound_ns_map, namespace_list, idx, namespace_key + ; + if ( ! option_map ) { return; } + + bound_ns_map = option_map.bound_ns_map; + + if ( ! bound_ns_map[event_type] ) { + // this indicates a non-namespaced entry + bound_ns_map[event_type] = {}; + } + + if ( ! namespace_str ) { return; } + + namespace_list = namespace_str.split('.'); + + for ( idx = 0; idx < namespace_list.length; idx++ ) { + namespace_key = namespace_list[idx]; + bound_ns_map[event_type][namespace_key] = true; + } + }, + + remove : function ( arg_map ) { + var + elem_bound = this, + option_map = $.data( elem_bound, optionKey ), + bound_ns_map = option_map.bound_ns_map, + event_type = arg_map.type, + namespace_str = arg_map.namespace, + namespace_list, idx, namespace_key + ; + + if ( ! bound_ns_map[event_type] ) { return; } + + // No namespace(s) provided: + // Remove complete record for custom event type (e.g. utap) + if ( ! namespace_str ) { + delete bound_ns_map[event_type]; + return; + } + + // Namespace(s) provided: + // Remove namespace flags from each custom event typei (e.g. utap) + // record. If all claimed namespaces are removed, remove + // complete record. + namespace_list = namespace_str.split('.'); + + for ( idx = 0; idx < namespace_list.length; idx++ ) { + namespace_key = namespace_list[idx]; + if (bound_ns_map[event_type][namespace_key]) { + delete bound_ns_map[event_type][namespace_key]; + } + } + + if ( $.isEmptyObject( bound_ns_map[event_type] ) ) { + delete bound_ns_map[event_type]; + } + }, + + teardown : function( name_list ) { + var + elem_bound = this, + $bound = $(elem_bound), + option_map = $.data( elem_bound, optionKey ), + bound_ns_map = option_map.bound_ns_map, + idx, namespace_key, ue_namespace_code, namespace_list + ; + + // do not tear down if related handlers are still bound + if ( ! $.isEmptyObject( bound_ns_map ) ) { return; } + + namespace_list = makeListPlus(name_list); + namespace_list.push_uniq('000'); + + NSPACE_01: + for ( idx = 0; idx < namespace_list.length; idx++ ) { + namespace_key = namespace_list[idx]; + + if ( ! namespace_key ) { continue NSPACE_01; } + + ue_namespace_code = '.__ue' + namespace_key; + $bound.unbind( 'mousedown' + ue_namespace_code ); + $bound.unbind( 'touchstart' + ue_namespace_code ); + $bound.unbind( 'mousewheel' + ue_namespace_code ); + } + + $.removeData( elem_bound, optionKey ); + + // Unbind document events only after last element element is removed + boundList.remove_val(this); + if ( boundList.length === 0 ) { + // console.log('last bound element removed - removing global binds'); + $(document).unbind( 'mousemove.__ue'); + $(document).unbind( 'touchmove.__ue'); + $(document).unbind( 'mouseup.__ue'); + $(document).unbind( 'touchend.__ue'); + $(document).unbind( 'touchcancel.__ue'); + isMoveBound = false; + } + } + }; + // End define special event handlers + //--------------- BEGIN JQUERY SPECIAL EVENTS ---------------- + + //------------------ BEGIN MOTION CONTROLS ------------------- + // Begin motion control /fnHeld/ + fnHeld = function ( arg_map ) { + var + timestamp = +new Date(), + motion_id = arg_map.motion_id, + motion_map = arg_map.motion_map, + bound_ns_map = arg_map.bound_ns_map, + event_ue + ; + + delete motion_map.tapheld_toid; + + if ( ! motion_map.do_allow_held ) { return; } + + motion_map.px_end_x = motion_map.px_start_x; + motion_map.px_end_y = motion_map.px_start_y; + motion_map.ms_timestop = timestamp; + motion_map.ms_elapsed = timestamp - motion_map.ms_timestart; + + if ( bound_ns_map.uheld ) { + event_ue = $.Event('uheld'); + $.extend( event_ue, motion_map ); + $(motion_map.elem_bound).trigger(event_ue); + } + + // remove tracking, as we want no futher action on this motion + if ( bound_ns_map.uheldstart ) { + event_ue = $.Event('uheldstart'); + $.extend( event_ue, motion_map ); + $(motion_map.elem_bound).trigger(event_ue); + motionHeldId = motion_id; + } + else { + delete motionMapMap[motion_id]; + } + }; + // End motion control /fnHeld/ + + + // Begin motion control /fnMotionStart/ + fnMotionStart = function ( arg_map ) { + var + motion_id = arg_map.motion_id, + event_src = arg_map.event_src, + request_dzoom = arg_map.request_dzoom, + + option_map = $.data( arg_map.elem, optionKey ), + bound_ns_map = option_map.bound_ns_map, + $target = $(event_src.target ), + do_zoomstart = false, + motion_map, cb_map, event_ue + ; + + // this should never happen, but it does + if ( motionMapMap[ motion_id ] ) { return; } + + // ignore on zoom + if ( request_dzoom && ! bound_ns_map.uzoomstart ) { return; } + + // :input selector includes text areas + if ( $target.is( option_map.ignore_select ) ) { return; } + + // Prevent default only after confirming handling this event + event_src.preventDefault(); + + cb_map = callbackList.pop(); + while ( cb_map ) { + if ( $target.is( cb_map.selector_str ) + || $( arg_map.elem ).is( cb_map.selector_str ) + ) { + if ( cb_map.callback_match ) { + cb_map.callback_match( arg_map ); + } + } + else { + if ( cb_map.callback_nomatch ) { + cb_map.callback_nomatch( arg_map ); + } + } + cb_map = callbackList.pop(); + } + + motion_map = { + do_allow_tap : bound_ns_map.utap ? true : false, + do_allow_held : ( bound_ns_map.uheld || bound_ns_map.uheldstart ) + ? true : false, + elem_bound : arg_map.elem, + elem_target : event_src.target, + ms_elapsed : 0, + ms_timestart : event_src.timeStamp, + ms_timestop : undefined, + option_map : option_map, + orig_target : event_src.target, + px_current_x : event_src.clientX, + px_current_y : event_src.clientY, + px_end_x : undefined, + px_end_y : undefined, + px_start_x : event_src.clientX, + px_start_y : event_src.clientY, + timeStamp : event_src.timeStamp + }; + + motionMapMap[ motion_id ] = motion_map; + + if ( bound_ns_map.uzoomstart ) { + if ( request_dzoom ) { + motionDzoomId = motion_id; + } + else if ( ! motion1ZoomId ) { + motion1ZoomId = motion_id; + } + else if ( ! motion2ZoomId ) { + motion2ZoomId = motion_id; + event_ue = $.Event('uzoomstart'); + do_zoomstart = true; + } + + if ( do_zoomstart ) { + event_ue = $.Event( 'uzoomstart' ); + motion_map.px_delta_zoom = 0; + $.extend( event_ue, motion_map ); + $(motion_map.elem_bound).trigger(event_ue); + return; + } + } + + if ( bound_ns_map.uheld || bound_ns_map.uheldstart ) { + motion_map.tapheld_toid = setTimeout( + function() { + fnHeld({ + motion_id : motion_id, + motion_map : motion_map, + bound_ns_map : bound_ns_map + }); + }, + option_map.min_held_ms + ); + } + }; + // End motion control /fnMotionStart/ + + // Begin motion control /fnMotionMove/ + fnMotionMove = function ( arg_map ) { + var + motion_id = arg_map.motion_id, + event_src = arg_map.event_src, + do_zoommove = false, + + motion_map, option_map, bound_ns_map, + is_over_rad, event_ue, px_pinch_zoom, + px_delta_zoom, mzoom1_map, mzoom2_map + ; + + if ( ! motionMapMap[ motion_id ] ) { return; } + + // Prevent default only after confirming handling this event + event_src.preventDefault(); + + motion_map = motionMapMap[motion_id]; + option_map = motion_map.option_map; + bound_ns_map = option_map.bound_ns_map; + + motion_map.timeStamp = event_src.timeStamp; + motion_map.elem_target = event_src.target; + motion_map.ms_elapsed = event_src.timeStamp - motion_map.ms_timestart; + + motion_map.px_delta_x = event_src.clientX - motion_map.px_current_x; + motion_map.px_delta_y = event_src.clientY - motion_map.px_current_y; + + motion_map.px_current_x = event_src.clientX; + motion_map.px_current_y = event_src.clientY; + + motion_map.px_tdelta_x = motion_map.px_start_x - event_src.clientX; + motion_map.px_tdelta_y = motion_map.px_start_y - event_src.clientY; + + is_over_rad = ( + Math.abs( motion_map.px_tdelta_x ) > option_map.px_radius + || Math.abs( motion_map.px_tdelta_y ) > option_map.px_radius + ); + // native event object override + motion_map.timeStamp = event_src.timeStamp; + + // disallow held or tap if outside of zone + if ( is_over_rad ) { + motion_map.do_allow_tap = false; + motion_map.do_allow_held = false; + } + + // disallow tap if time has elapsed + if ( motion_map.ms_elapsed > option_map.max_tap_ms ) { + motion_map.do_allow_tap = false; + } + + if ( motion1ZoomId && motion2ZoomId + && ( motion_id === motion1ZoomId + || motion_id === motion2ZoomId + )) { + motionMapMap[motion_id] = motion_map; + mzoom1_map = motionMapMap[motion1ZoomId]; + mzoom2_map = motionMapMap[motion2ZoomId]; + + px_pinch_zoom = Math.floor( + Math.sqrt( + Math.pow((mzoom1_map.px_current_x - mzoom2_map.px_current_x),2) + + Math.pow((mzoom1_map.px_current_y - mzoom2_map.px_current_y),2) + ) +0.5 + ); + + if ( pxPinchZoom === -1 ) { px_delta_zoom = 0; } + else { px_delta_zoom = ( px_pinch_zoom - pxPinchZoom ) * zoomTouchNum;} + + // save value for next iteration delta comparison + pxPinchZoom = px_pinch_zoom; + do_zoommove = true; + } + else if ( motionDzoomId === motion_id ) { + if ( bound_ns_map.uzoommove ) { + px_delta_zoom = motion_map.px_delta_y * zoomMouseNum; + do_zoommove = true; + } + } + + if ( do_zoommove ){ + event_ue = $.Event('uzoommove'); + motion_map.px_delta_zoom = px_delta_zoom; + $.extend( event_ue, motion_map ); + $(motion_map.elem_bound).trigger(event_ue); + return; + } + + if ( motionHeldId === motion_id ) { + if ( bound_ns_map.uheldmove ) { + event_ue = $.Event('uheldmove'); + $.extend( event_ue, motion_map ); + $(motion_map.elem_bound).trigger(event_ue); + } + return; + } + + if ( motionDragId === motion_id ) { + if ( bound_ns_map.udragmove ) { + event_ue = $.Event('udragmove'); + $.extend( event_ue, motion_map ); + $(motion_map.elem_bound).trigger(event_ue); + } + return; + } + + if ( bound_ns_map.udragstart + && motion_map.do_allow_tap === false + && motion_map.do_allow_held === false + && !( motionDragId && motionHeldId ) + ) { + motionDragId = motion_id; + event_ue = $.Event('udragstart'); + $.extend( event_ue, motion_map ); + $(motion_map.elem_bound).trigger(event_ue); + + if ( motion_map.tapheld_toid ) { + clearTimeout(motion_map.tapheld_toid); + delete motion_map.tapheld_toid; + } + } + }; + // End motion control /fnMotionMove/ + + // Begin motion control /fnMotionEnd/ + fnMotionEnd = function ( arg_map ) { + var + motion_id = arg_map.motion_id, + event_src = arg_map.event_src, + do_zoomend = false, + motion_map, option_map, bound_ns_map, event_ue + ; + + doDisableMouse = false; + + if ( ! motionMapMap[motion_id] ) { return; } + + motion_map = motionMapMap[motion_id]; + option_map = motion_map.option_map; + bound_ns_map = option_map.bound_ns_map; + + motion_map.elem_target = event_src.target; + motion_map.ms_elapsed = event_src.timeStamp - motion_map.ms_timestart; + motion_map.ms_timestop = event_src.timeStamp; + + if ( motion_map.px_current_x ) { + motion_map.px_delta_x = event_src.clientX - motion_map.px_current_x; + motion_map.px_delta_y = event_src.clientY - motion_map.px_current_y; + } + + motion_map.px_current_x = event_src.clientX; + motion_map.px_current_y = event_src.clientY; + + motion_map.px_end_x = event_src.clientX; + motion_map.px_end_y = event_src.clientY; + + motion_map.px_tdelta_x = motion_map.px_start_x - motion_map.px_end_x; + motion_map.px_tdelta_y = motion_map.px_start_y - motion_map.px_end_y; + + // native event object override + motion_map.timeStamp = event_src.timeStamp + ; + + // clear-out any long-hold tap timer + if ( motion_map.tapheld_toid ) { + clearTimeout(motion_map.tapheld_toid); + delete motion_map.tapheld_toid; + } + + // trigger utap + if ( bound_ns_map.utap + && motion_map.ms_elapsed <= option_map.max_tap_ms + && motion_map.do_allow_tap + ) { + event_ue = $.Event('utap'); + $.extend( event_ue, motion_map ); + $(motion_map.elem_bound).trigger(event_ue); + } + + // trigger udragend + if ( motion_id === motionDragId ) { + if ( bound_ns_map.udragend ) { + event_ue = $.Event('udragend'); + $.extend( event_ue, motion_map ); + $(motion_map.elem_bound).trigger(event_ue); + } + motionDragId = undefined; + } + + // trigger heldend + if ( motion_id === motionHeldId ) { + if ( bound_ns_map.uheldend ) { + event_ue = $.Event('uheldend'); + $.extend( event_ue, motion_map ); + $(motion_map.elem_bound).trigger(event_ue); + } + motionHeldId = undefined; + } + + // trigger uzoomend + if ( motion_id === motionDzoomId ) { + do_zoomend = true; + motionDzoomId = undefined; + } + + // cleanup zoom info + else if ( motion_id === motion1ZoomId ) { + if ( motion2ZoomId ) { + motion1ZoomId = motion2ZoomId; + motion2ZoomId = undefined; + do_zoomend = true; + } + else { motion1ZoomId = undefined; } + pxPinchZoom = -1; + } + if ( motion_id === motion2ZoomId ) { + motion2ZoomId = undefined; + pxPinchZoom = -1; + do_zoomend = true; + } + + if ( do_zoomend && bound_ns_map.uzoomend ) { + event_ue = $.Event('uzoomend'); + motion_map.px_delta_zoom = 0; + $.extend( event_ue, motion_map ); + $(motion_map.elem_bound).trigger(event_ue); + } + // remove pointer from consideration + delete motionMapMap[motion_id]; + }; + // End motion control /fnMotionEnd/ + //------------------ END MOTION CONTROLS ------------------- + + //------------------- BEGIN EVENT HANDLERS ------------------- + // Begin event handler /onTouch/ for all touch events. + // We use the 'type' attribute to dispatch to motion control + onTouch = function ( event ) { + var + this_el = this, + timestamp = +new Date(), + o_event = event.originalEvent, + touch_list = o_event ? o_event.changedTouches || [] : [], + touch_count = touch_list.length, + idx, touch_event, motion_id, handler_fn + ; + + doDisableMouse = true; + + event.timeStamp = timestamp; + + switch ( event.type ) { + case 'touchstart' : handler_fn = fnMotionStart; break; + case 'touchmove' : handler_fn = fnMotionMove; break; + case 'touchend' : + case 'touchcancel' : handler_fn = fnMotionEnd; break; + default : handler_fn = null; + } + + if ( ! handler_fn ) { return; } + + for ( idx = 0; idx < touch_count; idx++ ) { + touch_event = touch_list[idx]; + + motion_id = 'touch' + String(touch_event.identifier); + + event.clientX = touch_event.clientX; + event.clientY = touch_event.clientY; + handler_fn({ + elem : this_el, + motion_id : motion_id, + event_src : event + }); + } + }; + // End event handler /onTouch/ + + + // Begin event handler /onMouse/ for all mouse events + // We use the 'type' attribute to dispatch to motion control + onMouse = function ( event ) { + var + this_el = this, + motion_id = 'mouse' + String(event.button), + request_dzoom = false, + handler_fn + ; + + if ( doDisableMouse ) { + event.stopImmediatePropagation(); + return; + } + + if ( event.shiftKey ) { request_dzoom = true; } + + // skip left or middle clicks + if ( event.type !== 'mousemove' ) { + if ( event.button !== 0 ) { return true; } + } + + switch ( event.type ) { + case 'mousedown' : handler_fn = fnMotionStart; break; + case 'mouseup' : handler_fn = fnMotionEnd; break; + case 'mousemove' : handler_fn = fnMotionMove; break; + default : handler_fn = null; + } + + if ( ! handler_fn ) { return; } + + handler_fn({ + elem : this_el, + event_src : event, + request_dzoom : request_dzoom, + motion_id : motion_id + }); + }; + // End event handler /onMouse/ + //-------------------- END EVENT HANDLERS -------------------- + + // Export special events through jQuery API + $Special.ue + = $Special.utap = $Special.uheld + = $Special.uzoomstart = $Special.uzoommove = $Special.uzoomend + = $Special.udragstart = $Special.udragmove = $Special.udragend + = $Special.uheldstart = $Special.uheldmove = $Special.uheldend + = Ue + ; + $.ueSetGlobalCb = function ( selector_str, callback_match, callback_nomatch ) { + callbackList.push( { + selector_str : selector_str || '', + callback_match : callback_match || null, + callback_nomatch : callback_nomatch || null + }); + }; +}(jQuery)); diff --git a/wwwroot/js/lib/jquery.gzserialize.js b/wwwroot/js/lib/jquery.gzserialize.js new file mode 100644 index 0000000..4d7a9d9 --- /dev/null +++ b/wwwroot/js/lib/jquery.gzserialize.js @@ -0,0 +1,87 @@ +(function($) { + + $.fn.serialize = function(options) { + return $.param(this.serializeArray(options)); + }; + + $.fn.serializeArray = function(options) { + var o = $.extend({ + checkboxesAsBools: false + }, options || {}); + + var rselectTextarea = /select|textarea/i; + var rinput = /text|hidden|password|date|search/i; + + return this.map(function() { + return this.elements ? $.makeArray(this.elements) : this; + }) + .filter(function() { + return this.name && !this.disabled && + (this.checked || (o.checkboxesAsBools && this.type === 'checkbox') || rselectTextarea.test(this.nodeName) || rinput.test(this.type)); + }) + .map(function(i, elem) { + + var val = $(this).val(); + + //this block changed here by me to break out the overly tight but obscure code + + if (val == null) return null; + + if ($.isArray(val)) { + //Array return + return $.map(val, function(val, i) { + return { + name: elem.name, + value: val + }; + }) + } else { + + if (o.checkboxesAsBools && this.type === 'checkbox') { + return { + name: elem.name, + value: (this.checked ? 'true' : 'false') + } + } + + //for now dates are handled at the backend + //by convention of field name ending in "Date" (sentDate, readDate etc) + // if (this.type === 'date') { + // return { + // name: elem.name, + // value: (val === '' ? '' : val) //empty dates sb null for mongo db backend + // } + // } + + + //default all other types + return { + name: elem.name, + value: val + } + } + + + // /changed by me + + + //ORIGINAL BLOCK: + // return val == null ? + // null : + // $.isArray(val) ? + // $.map(val, function (val, i) { + // return { name: elem.name, value: val }; + // }) : + // { + + // name: elem.name, + // value: (o.checkboxesAsBools && this.type === 'checkbox') ? //moar ternaries! + // (this.checked ? 'true' : 'false') : + // val + // }; + + + }).get(); + }; + +})(jQuery); \ No newline at end of file diff --git a/wwwroot/js/lib/moment.min.js b/wwwroot/js/lib/moment.min.js new file mode 100644 index 0000000..770f8bc --- /dev/null +++ b/wwwroot/js/lib/moment.min.js @@ -0,0 +1,7 @@ +//! moment.js +//! version : 2.18.1 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com +!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.moment=b()}(this,function(){"use strict";function a(){return sd.apply(null,arguments)}function b(a){sd=a}function c(a){return a instanceof Array||"[object Array]"===Object.prototype.toString.call(a)}function d(a){return null!=a&&"[object Object]"===Object.prototype.toString.call(a)}function e(a){var b;for(b in a)return!1;return!0}function f(a){return void 0===a}function g(a){return"number"==typeof a||"[object Number]"===Object.prototype.toString.call(a)}function h(a){return a instanceof Date||"[object Date]"===Object.prototype.toString.call(a)}function i(a,b){var c,d=[];for(c=0;c0)for(c=0;c0?"future":"past"];return z(c)?c(b):c.replace(/%s/i,b)}function J(a,b){var c=a.toLowerCase();Hd[c]=Hd[c+"s"]=Hd[b]=a}function K(a){return"string"==typeof a?Hd[a]||Hd[a.toLowerCase()]:void 0}function L(a){var b,c,d={};for(c in a)j(a,c)&&(b=K(c),b&&(d[b]=a[c]));return d}function M(a,b){Id[a]=b}function N(a){var b=[];for(var c in a)b.push({unit:c,priority:Id[c]});return b.sort(function(a,b){return a.priority-b.priority}),b}function O(b,c){return function(d){return null!=d?(Q(this,b,d),a.updateOffset(this,c),this):P(this,b)}}function P(a,b){return a.isValid()?a._d["get"+(a._isUTC?"UTC":"")+b]():NaN}function Q(a,b,c){a.isValid()&&a._d["set"+(a._isUTC?"UTC":"")+b](c)}function R(a){return a=K(a),z(this[a])?this[a]():this}function S(a,b){if("object"==typeof a){a=L(a);for(var c=N(a),d=0;d=0;return(f?c?"+":"":"-")+Math.pow(10,Math.max(0,e)).toString().substr(1)+d}function U(a,b,c,d){var e=d;"string"==typeof d&&(e=function(){return this[d]()}),a&&(Md[a]=e),b&&(Md[b[0]]=function(){return T(e.apply(this,arguments),b[1],b[2])}),c&&(Md[c]=function(){return this.localeData().ordinal(e.apply(this,arguments),a)})}function V(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function W(a){var b,c,d=a.match(Jd);for(b=0,c=d.length;b=0&&Kd.test(a);)a=a.replace(Kd,c),Kd.lastIndex=0,d-=1;return a}function Z(a,b,c){ce[a]=z(b)?b:function(a,d){return a&&c?c:b}}function $(a,b){return j(ce,a)?ce[a](b._strict,b._locale):new RegExp(_(a))}function _(a){return aa(a.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e}))}function aa(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function ba(a,b){var c,d=b;for("string"==typeof a&&(a=[a]),g(b)&&(d=function(a,c){c[b]=u(a)}),c=0;c=0&&isFinite(h.getFullYear())&&h.setFullYear(a),h}function ta(a){var b=new Date(Date.UTC.apply(null,arguments));return a<100&&a>=0&&isFinite(b.getUTCFullYear())&&b.setUTCFullYear(a),b}function ua(a,b,c){var d=7+b-c,e=(7+ta(a,0,d).getUTCDay()-b)%7;return-e+d-1}function va(a,b,c,d,e){var f,g,h=(7+c-d)%7,i=ua(a,d,e),j=1+7*(b-1)+h+i;return j<=0?(f=a-1,g=pa(f)+j):j>pa(a)?(f=a+1,g=j-pa(a)):(f=a,g=j),{year:f,dayOfYear:g}}function wa(a,b,c){var d,e,f=ua(a.year(),b,c),g=Math.floor((a.dayOfYear()-f-1)/7)+1;return g<1?(e=a.year()-1,d=g+xa(e,b,c)):g>xa(a.year(),b,c)?(d=g-xa(a.year(),b,c),e=a.year()+1):(e=a.year(),d=g),{week:d,year:e}}function xa(a,b,c){var d=ua(a,b,c),e=ua(a+1,b,c);return(pa(a)-d+e)/7}function ya(a){return wa(a,this._week.dow,this._week.doy).week}function za(){return this._week.dow}function Aa(){return this._week.doy}function Ba(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")}function Ca(a){var b=wa(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")}function Da(a,b){return"string"!=typeof a?a:isNaN(a)?(a=b.weekdaysParse(a),"number"==typeof a?a:null):parseInt(a,10)}function Ea(a,b){return"string"==typeof a?b.weekdaysParse(a)%7||7:isNaN(a)?null:a}function Fa(a,b){return a?c(this._weekdays)?this._weekdays[a.day()]:this._weekdays[this._weekdays.isFormat.test(b)?"format":"standalone"][a.day()]:c(this._weekdays)?this._weekdays:this._weekdays.standalone}function Ga(a){return a?this._weekdaysShort[a.day()]:this._weekdaysShort}function Ha(a){return a?this._weekdaysMin[a.day()]:this._weekdaysMin}function Ia(a,b,c){var d,e,f,g=a.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],d=0;d<7;++d)f=l([2e3,1]).day(d),this._minWeekdaysParse[d]=this.weekdaysMin(f,"").toLocaleLowerCase(),this._shortWeekdaysParse[d]=this.weekdaysShort(f,"").toLocaleLowerCase(),this._weekdaysParse[d]=this.weekdays(f,"").toLocaleLowerCase();return c?"dddd"===b?(e=ne.call(this._weekdaysParse,g),e!==-1?e:null):"ddd"===b?(e=ne.call(this._shortWeekdaysParse,g),e!==-1?e:null):(e=ne.call(this._minWeekdaysParse,g),e!==-1?e:null):"dddd"===b?(e=ne.call(this._weekdaysParse,g),e!==-1?e:(e=ne.call(this._shortWeekdaysParse,g),e!==-1?e:(e=ne.call(this._minWeekdaysParse,g),e!==-1?e:null))):"ddd"===b?(e=ne.call(this._shortWeekdaysParse,g),e!==-1?e:(e=ne.call(this._weekdaysParse,g),e!==-1?e:(e=ne.call(this._minWeekdaysParse,g),e!==-1?e:null))):(e=ne.call(this._minWeekdaysParse,g),e!==-1?e:(e=ne.call(this._weekdaysParse,g),e!==-1?e:(e=ne.call(this._shortWeekdaysParse,g),e!==-1?e:null)))}function Ja(a,b,c){var d,e,f;if(this._weekdaysParseExact)return Ia.call(this,a,b,c);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),d=0;d<7;d++){if(e=l([2e3,1]).day(d),c&&!this._fullWeekdaysParse[d]&&(this._fullWeekdaysParse[d]=new RegExp("^"+this.weekdays(e,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[d]=new RegExp("^"+this.weekdaysShort(e,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[d]=new RegExp("^"+this.weekdaysMin(e,"").replace(".",".?")+"$","i")),this._weekdaysParse[d]||(f="^"+this.weekdays(e,"")+"|^"+this.weekdaysShort(e,"")+"|^"+this.weekdaysMin(e,""),this._weekdaysParse[d]=new RegExp(f.replace(".",""),"i")),c&&"dddd"===b&&this._fullWeekdaysParse[d].test(a))return d;if(c&&"ddd"===b&&this._shortWeekdaysParse[d].test(a))return d;if(c&&"dd"===b&&this._minWeekdaysParse[d].test(a))return d;if(!c&&this._weekdaysParse[d].test(a))return d}}function Ka(a){if(!this.isValid())return null!=a?this:NaN;var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=Da(a,this.localeData()),this.add(a-b,"d")):b}function La(a){if(!this.isValid())return null!=a?this:NaN;var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")}function Ma(a){if(!this.isValid())return null!=a?this:NaN;if(null!=a){var b=Ea(a,this.localeData());return this.day(this.day()%7?b:b-7)}return this.day()||7}function Na(a){return this._weekdaysParseExact?(j(this,"_weekdaysRegex")||Qa.call(this),a?this._weekdaysStrictRegex:this._weekdaysRegex):(j(this,"_weekdaysRegex")||(this._weekdaysRegex=ye),this._weekdaysStrictRegex&&a?this._weekdaysStrictRegex:this._weekdaysRegex)}function Oa(a){return this._weekdaysParseExact?(j(this,"_weekdaysRegex")||Qa.call(this),a?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(j(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=ze),this._weekdaysShortStrictRegex&&a?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Pa(a){return this._weekdaysParseExact?(j(this,"_weekdaysRegex")||Qa.call(this),a?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(j(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Ae),this._weekdaysMinStrictRegex&&a?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Qa(){function a(a,b){return b.length-a.length}var b,c,d,e,f,g=[],h=[],i=[],j=[];for(b=0;b<7;b++)c=l([2e3,1]).day(b),d=this.weekdaysMin(c,""),e=this.weekdaysShort(c,""),f=this.weekdays(c,""),g.push(d),h.push(e),i.push(f),j.push(d),j.push(e),j.push(f);for(g.sort(a),h.sort(a),i.sort(a),j.sort(a),b=0;b<7;b++)h[b]=aa(h[b]),i[b]=aa(i[b]),j[b]=aa(j[b]);this._weekdaysRegex=new RegExp("^("+j.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+i.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+h.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+g.join("|")+")","i")}function Ra(){return this.hours()%12||12}function Sa(){return this.hours()||24}function Ta(a,b){U(a,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),b)})}function Ua(a,b){return b._meridiemParse}function Va(a){return"p"===(a+"").toLowerCase().charAt(0)}function Wa(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"}function Xa(a){return a?a.toLowerCase().replace("_","-"):a}function Ya(a){for(var b,c,d,e,f=0;f0;){if(d=Za(e.slice(0,b).join("-")))return d;if(c&&c.length>=b&&v(e,c,!0)>=b-1)break;b--}f++}return null}function Za(a){var b=null;if(!Fe[a]&&"undefined"!=typeof module&&module&&module.exports)try{b=Be._abbr,require("./locale/"+a),$a(b)}catch(a){}return Fe[a]}function $a(a,b){var c;return a&&(c=f(b)?bb(a):_a(a,b),c&&(Be=c)),Be._abbr}function _a(a,b){if(null!==b){var c=Ee;if(b.abbr=a,null!=Fe[a])y("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),c=Fe[a]._config;else if(null!=b.parentLocale){if(null==Fe[b.parentLocale])return Ge[b.parentLocale]||(Ge[b.parentLocale]=[]),Ge[b.parentLocale].push({name:a,config:b}),null;c=Fe[b.parentLocale]._config}return Fe[a]=new C(B(c,b)),Ge[a]&&Ge[a].forEach(function(a){_a(a.name,a.config)}),$a(a),Fe[a]}return delete Fe[a],null}function ab(a,b){if(null!=b){var c,d=Ee;null!=Fe[a]&&(d=Fe[a]._config),b=B(d,b),c=new C(b),c.parentLocale=Fe[a],Fe[a]=c,$a(a)}else null!=Fe[a]&&(null!=Fe[a].parentLocale?Fe[a]=Fe[a].parentLocale:null!=Fe[a]&&delete Fe[a]);return Fe[a]}function bb(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return Be;if(!c(a)){if(b=Za(a))return b;a=[a]}return Ya(a)}function cb(){return Ad(Fe)}function db(a){var b,c=a._a;return c&&n(a).overflow===-2&&(b=c[fe]<0||c[fe]>11?fe:c[ge]<1||c[ge]>ea(c[ee],c[fe])?ge:c[he]<0||c[he]>24||24===c[he]&&(0!==c[ie]||0!==c[je]||0!==c[ke])?he:c[ie]<0||c[ie]>59?ie:c[je]<0||c[je]>59?je:c[ke]<0||c[ke]>999?ke:-1,n(a)._overflowDayOfYear&&(bge)&&(b=ge),n(a)._overflowWeeks&&b===-1&&(b=le),n(a)._overflowWeekday&&b===-1&&(b=me),n(a).overflow=b),a}function eb(a){var b,c,d,e,f,g,h=a._i,i=He.exec(h)||Ie.exec(h);if(i){for(n(a).iso=!0,b=0,c=Ke.length;b10?"YYYY ":"YY "),f="HH:mm"+(c[4]?":ss":""),c[1]){var l=new Date(c[2]),m=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"][l.getDay()];if(c[1].substr(0,3)!==m)return n(a).weekdayMismatch=!0,void(a._isValid=!1)}switch(c[5].length){case 2:0===i?h=" +0000":(i=k.indexOf(c[5][1].toUpperCase())-12,h=(i<0?" -":" +")+(""+i).replace(/^-?/,"0").match(/..$/)[0]+"00");break;case 4:h=j[c[5]];break;default:h=j[" GMT"]}c[5]=h,a._i=c.splice(1).join(""),g=" ZZ",a._f=d+e+f+g,lb(a),n(a).rfc2822=!0}else a._isValid=!1}function gb(b){var c=Me.exec(b._i);return null!==c?void(b._d=new Date(+c[1])):(eb(b),void(b._isValid===!1&&(delete b._isValid,fb(b),b._isValid===!1&&(delete b._isValid,a.createFromInputFallback(b)))))}function hb(a,b,c){return null!=a?a:null!=b?b:c}function ib(b){var c=new Date(a.now());return b._useUTC?[c.getUTCFullYear(),c.getUTCMonth(),c.getUTCDate()]:[c.getFullYear(),c.getMonth(),c.getDate()]}function jb(a){var b,c,d,e,f=[];if(!a._d){for(d=ib(a),a._w&&null==a._a[ge]&&null==a._a[fe]&&kb(a),null!=a._dayOfYear&&(e=hb(a._a[ee],d[ee]),(a._dayOfYear>pa(e)||0===a._dayOfYear)&&(n(a)._overflowDayOfYear=!0),c=ta(e,0,a._dayOfYear),a._a[fe]=c.getUTCMonth(),a._a[ge]=c.getUTCDate()),b=0;b<3&&null==a._a[b];++b)a._a[b]=f[b]=d[b];for(;b<7;b++)a._a[b]=f[b]=null==a._a[b]?2===b?1:0:a._a[b];24===a._a[he]&&0===a._a[ie]&&0===a._a[je]&&0===a._a[ke]&&(a._nextDay=!0,a._a[he]=0),a._d=(a._useUTC?ta:sa).apply(null,f),null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()-a._tzm),a._nextDay&&(a._a[he]=24)}}function kb(a){var b,c,d,e,f,g,h,i;if(b=a._w,null!=b.GG||null!=b.W||null!=b.E)f=1,g=4,c=hb(b.GG,a._a[ee],wa(tb(),1,4).year),d=hb(b.W,1),e=hb(b.E,1),(e<1||e>7)&&(i=!0);else{f=a._locale._week.dow,g=a._locale._week.doy;var j=wa(tb(),f,g);c=hb(b.gg,a._a[ee],j.year),d=hb(b.w,j.week),null!=b.d?(e=b.d,(e<0||e>6)&&(i=!0)):null!=b.e?(e=b.e+f,(b.e<0||b.e>6)&&(i=!0)):e=f}d<1||d>xa(c,f,g)?n(a)._overflowWeeks=!0:null!=i?n(a)._overflowWeekday=!0:(h=va(c,d,e,f,g),a._a[ee]=h.year,a._dayOfYear=h.dayOfYear)}function lb(b){if(b._f===a.ISO_8601)return void eb(b);if(b._f===a.RFC_2822)return void fb(b);b._a=[],n(b).empty=!0;var c,d,e,f,g,h=""+b._i,i=h.length,j=0;for(e=Y(b._f,b._locale).match(Jd)||[],c=0;c0&&n(b).unusedInput.push(g),h=h.slice(h.indexOf(d)+d.length),j+=d.length),Md[f]?(d?n(b).empty=!1:n(b).unusedTokens.push(f),da(f,d,b)):b._strict&&!d&&n(b).unusedTokens.push(f);n(b).charsLeftOver=i-j,h.length>0&&n(b).unusedInput.push(h),b._a[he]<=12&&n(b).bigHour===!0&&b._a[he]>0&&(n(b).bigHour=void 0),n(b).parsedDateParts=b._a.slice(0),n(b).meridiem=b._meridiem,b._a[he]=mb(b._locale,b._a[he],b._meridiem),jb(b),db(b)}function mb(a,b,c){var d;return null==c?b:null!=a.meridiemHour?a.meridiemHour(b,c):null!=a.isPM?(d=a.isPM(c),d&&b<12&&(b+=12),d||12!==b||(b=0),b):b}function nb(a){var b,c,d,e,f;if(0===a._f.length)return n(a).invalidFormat=!0,void(a._d=new Date(NaN));for(e=0;ethis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Ob(){if(!f(this._isDSTShifted))return this._isDSTShifted;var a={};if(q(a,this),a=qb(a),a._a){var b=a._isUTC?l(a._a):tb(a._a);this._isDSTShifted=this.isValid()&&v(a._a,b.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function Pb(){return!!this.isValid()&&!this._isUTC}function Qb(){return!!this.isValid()&&this._isUTC}function Rb(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}function Sb(a,b){var c,d,e,f=a,h=null;return Bb(a)?f={ms:a._milliseconds,d:a._days,M:a._months}:g(a)?(f={},b?f[b]=a:f.milliseconds=a):(h=Te.exec(a))?(c="-"===h[1]?-1:1,f={y:0,d:u(h[ge])*c,h:u(h[he])*c,m:u(h[ie])*c,s:u(h[je])*c,ms:u(Cb(1e3*h[ke]))*c}):(h=Ue.exec(a))?(c="-"===h[1]?-1:1,f={y:Tb(h[2],c),M:Tb(h[3],c),w:Tb(h[4],c),d:Tb(h[5],c),h:Tb(h[6],c),m:Tb(h[7],c),s:Tb(h[8],c)}):null==f?f={}:"object"==typeof f&&("from"in f||"to"in f)&&(e=Vb(tb(f.from),tb(f.to)),f={},f.ms=e.milliseconds,f.M=e.months),d=new Ab(f),Bb(a)&&j(a,"_locale")&&(d._locale=a._locale),d}function Tb(a,b){var c=a&&parseFloat(a.replace(",","."));return(isNaN(c)?0:c)*b}function Ub(a,b){var c={milliseconds:0,months:0};return c.months=b.month()-a.month()+12*(b.year()-a.year()),a.clone().add(c.months,"M").isAfter(b)&&--c.months,c.milliseconds=+b-+a.clone().add(c.months,"M"),c}function Vb(a,b){var c;return a.isValid()&&b.isValid()?(b=Fb(b,a),a.isBefore(b)?c=Ub(a,b):(c=Ub(b,a),c.milliseconds=-c.milliseconds,c.months=-c.months),c):{milliseconds:0,months:0}}function Wb(a,b){return function(c,d){var e,f;return null===d||isNaN(+d)||(y(b,"moment()."+b+"(period, number) is deprecated. Please use moment()."+b+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),f=c,c=d,d=f),c="string"==typeof c?+c:c,e=Sb(c,d),Xb(this,e,a),this}}function Xb(b,c,d,e){var f=c._milliseconds,g=Cb(c._days),h=Cb(c._months);b.isValid()&&(e=null==e||e,f&&b._d.setTime(b._d.valueOf()+f*d),g&&Q(b,"Date",P(b,"Date")+g*d),h&&ja(b,P(b,"Month")+h*d),e&&a.updateOffset(b,g||h))}function Yb(a,b){var c=a.diff(b,"days",!0);return c<-6?"sameElse":c<-1?"lastWeek":c<0?"lastDay":c<1?"sameDay":c<2?"nextDay":c<7?"nextWeek":"sameElse"}function Zb(b,c){var d=b||tb(),e=Fb(d,this).startOf("day"),f=a.calendarFormat(this,e)||"sameElse",g=c&&(z(c[f])?c[f].call(this,d):c[f]);return this.format(g||this.localeData().calendar(f,this,tb(d)))}function $b(){return new r(this)}function _b(a,b){var c=s(a)?a:tb(a);return!(!this.isValid()||!c.isValid())&&(b=K(f(b)?"millisecond":b),"millisecond"===b?this.valueOf()>c.valueOf():c.valueOf()9999?X(a,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):z(Date.prototype.toISOString)?this.toDate().toISOString():X(a,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")}function jc(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var a="moment",b="";this.isLocal()||(a=0===this.utcOffset()?"moment.utc":"moment.parseZone",b="Z");var c="["+a+'("]',d=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",e="-MM-DD[T]HH:mm:ss.SSS",f=b+'[")]';return this.format(c+d+e+f)}function kc(b){b||(b=this.isUtc()?a.defaultFormatUtc:a.defaultFormat);var c=X(this,b);return this.localeData().postformat(c)}function lc(a,b){return this.isValid()&&(s(a)&&a.isValid()||tb(a).isValid())?Sb({to:this,from:a}).locale(this.locale()).humanize(!b):this.localeData().invalidDate()}function mc(a){return this.from(tb(),a)}function nc(a,b){return this.isValid()&&(s(a)&&a.isValid()||tb(a).isValid())?Sb({from:this,to:a}).locale(this.locale()).humanize(!b):this.localeData().invalidDate()}function oc(a){return this.to(tb(),a)}function pc(a){var b;return void 0===a?this._locale._abbr:(b=bb(a),null!=b&&(this._locale=b),this)}function qc(){return this._locale}function rc(a){switch(a=K(a)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":case"date":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===a&&this.weekday(0),"isoWeek"===a&&this.isoWeekday(1),"quarter"===a&&this.month(3*Math.floor(this.month()/3)),this}function sc(a){return a=K(a),void 0===a||"millisecond"===a?this:("date"===a&&(a="day"),this.startOf(a).add(1,"isoWeek"===a?"week":a).subtract(1,"ms"))}function tc(){return this._d.valueOf()-6e4*(this._offset||0)}function uc(){return Math.floor(this.valueOf()/1e3)}function vc(){return new Date(this.valueOf())}function wc(){var a=this;return[a.year(),a.month(),a.date(),a.hour(),a.minute(),a.second(),a.millisecond()]}function xc(){var a=this;return{years:a.year(),months:a.month(),date:a.date(),hours:a.hours(),minutes:a.minutes(),seconds:a.seconds(),milliseconds:a.milliseconds()}}function yc(){return this.isValid()?this.toISOString():null}function zc(){return o(this)}function Ac(){ +return k({},n(this))}function Bc(){return n(this).overflow}function Cc(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function Dc(a,b){U(0,[a,a.length],0,b)}function Ec(a){return Ic.call(this,a,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function Fc(a){return Ic.call(this,a,this.isoWeek(),this.isoWeekday(),1,4)}function Gc(){return xa(this.year(),1,4)}function Hc(){var a=this.localeData()._week;return xa(this.year(),a.dow,a.doy)}function Ic(a,b,c,d,e){var f;return null==a?wa(this,d,e).year:(f=xa(a,d,e),b>f&&(b=f),Jc.call(this,a,b,c,d,e))}function Jc(a,b,c,d,e){var f=va(a,b,c,d,e),g=ta(f.year,0,f.dayOfYear);return this.year(g.getUTCFullYear()),this.month(g.getUTCMonth()),this.date(g.getUTCDate()),this}function Kc(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)}function Lc(a){var b=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")}function Mc(a,b){b[ke]=u(1e3*("0."+a))}function Nc(){return this._isUTC?"UTC":""}function Oc(){return this._isUTC?"Coordinated Universal Time":""}function Pc(a){return tb(1e3*a)}function Qc(){return tb.apply(null,arguments).parseZone()}function Rc(a){return a}function Sc(a,b,c,d){var e=bb(),f=l().set(d,b);return e[c](f,a)}function Tc(a,b,c){if(g(a)&&(b=a,a=void 0),a=a||"",null!=b)return Sc(a,b,c,"month");var d,e=[];for(d=0;d<12;d++)e[d]=Sc(a,d,c,"month");return e}function Uc(a,b,c,d){"boolean"==typeof a?(g(b)&&(c=b,b=void 0),b=b||""):(b=a,c=b,a=!1,g(b)&&(c=b,b=void 0),b=b||"");var e=bb(),f=a?e._week.dow:0;if(null!=c)return Sc(b,(c+f)%7,d,"day");var h,i=[];for(h=0;h<7;h++)i[h]=Sc(b,(h+f)%7,d,"day");return i}function Vc(a,b){return Tc(a,b,"months")}function Wc(a,b){return Tc(a,b,"monthsShort")}function Xc(a,b,c){return Uc(a,b,c,"weekdays")}function Yc(a,b,c){return Uc(a,b,c,"weekdaysShort")}function Zc(a,b,c){return Uc(a,b,c,"weekdaysMin")}function $c(){var a=this._data;return this._milliseconds=df(this._milliseconds),this._days=df(this._days),this._months=df(this._months),a.milliseconds=df(a.milliseconds),a.seconds=df(a.seconds),a.minutes=df(a.minutes),a.hours=df(a.hours),a.months=df(a.months),a.years=df(a.years),this}function _c(a,b,c,d){var e=Sb(b,c);return a._milliseconds+=d*e._milliseconds,a._days+=d*e._days,a._months+=d*e._months,a._bubble()}function ad(a,b){return _c(this,a,b,1)}function bd(a,b){return _c(this,a,b,-1)}function cd(a){return a<0?Math.floor(a):Math.ceil(a)}function dd(){var a,b,c,d,e,f=this._milliseconds,g=this._days,h=this._months,i=this._data;return f>=0&&g>=0&&h>=0||f<=0&&g<=0&&h<=0||(f+=864e5*cd(fd(h)+g),g=0,h=0),i.milliseconds=f%1e3,a=t(f/1e3),i.seconds=a%60,b=t(a/60),i.minutes=b%60,c=t(b/60),i.hours=c%24,g+=t(c/24),e=t(ed(g)),h+=e,g-=cd(fd(e)),d=t(h/12),h%=12,i.days=g,i.months=h,i.years=d,this}function ed(a){return 4800*a/146097}function fd(a){return 146097*a/4800}function gd(a){if(!this.isValid())return NaN;var b,c,d=this._milliseconds;if(a=K(a),"month"===a||"year"===a)return b=this._days+d/864e5,c=this._months+ed(b),"month"===a?c:c/12;switch(b=this._days+Math.round(fd(this._months)),a){case"week":return b/7+d/6048e5;case"day":return b+d/864e5;case"hour":return 24*b+d/36e5;case"minute":return 1440*b+d/6e4;case"second":return 86400*b+d/1e3;case"millisecond":return Math.floor(864e5*b)+d;default:throw new Error("Unknown unit "+a)}}function hd(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*u(this._months/12):NaN}function id(a){return function(){return this.as(a)}}function jd(a){return a=K(a),this.isValid()?this[a+"s"]():NaN}function kd(a){return function(){return this.isValid()?this._data[a]:NaN}}function ld(){return t(this.days()/7)}function md(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function nd(a,b,c){var d=Sb(a).abs(),e=uf(d.as("s")),f=uf(d.as("m")),g=uf(d.as("h")),h=uf(d.as("d")),i=uf(d.as("M")),j=uf(d.as("y")),k=e<=vf.ss&&["s",e]||e0,k[4]=c,md.apply(null,k)}function od(a){return void 0===a?uf:"function"==typeof a&&(uf=a,!0)}function pd(a,b){return void 0!==vf[a]&&(void 0===b?vf[a]:(vf[a]=b,"s"===a&&(vf.ss=b-1),!0))}function qd(a){if(!this.isValid())return this.localeData().invalidDate();var b=this.localeData(),c=nd(this,!a,b);return a&&(c=b.pastFuture(+this,c)),b.postformat(c)}function rd(){if(!this.isValid())return this.localeData().invalidDate();var a,b,c,d=wf(this._milliseconds)/1e3,e=wf(this._days),f=wf(this._months);a=t(d/60),b=t(a/60),d%=60,a%=60,c=t(f/12),f%=12;var g=c,h=f,i=e,j=b,k=a,l=d,m=this.asSeconds();return m?(m<0?"-":"")+"P"+(g?g+"Y":"")+(h?h+"M":"")+(i?i+"D":"")+(j||k||l?"T":"")+(j?j+"H":"")+(k?k+"M":"")+(l?l+"S":""):"P0D"}var sd,td;td=Array.prototype.some?Array.prototype.some:function(a){for(var b=Object(this),c=b.length>>>0,d=0;d68?1900:2e3)};var te=O("FullYear",!0);U("w",["ww",2],"wo","week"),U("W",["WW",2],"Wo","isoWeek"),J("week","w"),J("isoWeek","W"),M("week",5),M("isoWeek",5),Z("w",Sd),Z("ww",Sd,Od),Z("W",Sd),Z("WW",Sd,Od),ca(["w","ww","W","WW"],function(a,b,c,d){b[d.substr(0,1)]=u(a)});var ue={dow:0,doy:6};U("d",0,"do","day"),U("dd",0,0,function(a){return this.localeData().weekdaysMin(this,a)}),U("ddd",0,0,function(a){return this.localeData().weekdaysShort(this,a)}),U("dddd",0,0,function(a){return this.localeData().weekdays(this,a)}),U("e",0,0,"weekday"),U("E",0,0,"isoWeekday"),J("day","d"),J("weekday","e"),J("isoWeekday","E"),M("day",11),M("weekday",11),M("isoWeekday",11),Z("d",Sd),Z("e",Sd),Z("E",Sd),Z("dd",function(a,b){return b.weekdaysMinRegex(a)}),Z("ddd",function(a,b){return b.weekdaysShortRegex(a)}),Z("dddd",function(a,b){return b.weekdaysRegex(a)}),ca(["dd","ddd","dddd"],function(a,b,c,d){var e=c._locale.weekdaysParse(a,d,c._strict);null!=e?b.d=e:n(c).invalidWeekday=a}),ca(["d","e","E"],function(a,b,c,d){b[d]=u(a)});var ve="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),we="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),xe="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),ye=be,ze=be,Ae=be;U("H",["HH",2],0,"hour"),U("h",["hh",2],0,Ra),U("k",["kk",2],0,Sa),U("hmm",0,0,function(){return""+Ra.apply(this)+T(this.minutes(),2)}),U("hmmss",0,0,function(){return""+Ra.apply(this)+T(this.minutes(),2)+T(this.seconds(),2)}),U("Hmm",0,0,function(){return""+this.hours()+T(this.minutes(),2)}),U("Hmmss",0,0,function(){return""+this.hours()+T(this.minutes(),2)+T(this.seconds(),2)}),Ta("a",!0),Ta("A",!1),J("hour","h"),M("hour",13),Z("a",Ua),Z("A",Ua),Z("H",Sd),Z("h",Sd),Z("k",Sd),Z("HH",Sd,Od),Z("hh",Sd,Od),Z("kk",Sd,Od),Z("hmm",Td),Z("hmmss",Ud),Z("Hmm",Td),Z("Hmmss",Ud),ba(["H","HH"],he),ba(["k","kk"],function(a,b,c){var d=u(a);b[he]=24===d?0:d}),ba(["a","A"],function(a,b,c){c._isPm=c._locale.isPM(a),c._meridiem=a}),ba(["h","hh"],function(a,b,c){b[he]=u(a),n(c).bigHour=!0}),ba("hmm",function(a,b,c){var d=a.length-2;b[he]=u(a.substr(0,d)),b[ie]=u(a.substr(d)),n(c).bigHour=!0}),ba("hmmss",function(a,b,c){var d=a.length-4,e=a.length-2;b[he]=u(a.substr(0,d)),b[ie]=u(a.substr(d,2)),b[je]=u(a.substr(e)),n(c).bigHour=!0}),ba("Hmm",function(a,b,c){var d=a.length-2;b[he]=u(a.substr(0,d)),b[ie]=u(a.substr(d))}),ba("Hmmss",function(a,b,c){var d=a.length-4,e=a.length-2;b[he]=u(a.substr(0,d)),b[ie]=u(a.substr(d,2)),b[je]=u(a.substr(e))});var Be,Ce=/[ap]\.?m?\.?/i,De=O("Hours",!0),Ee={calendar:Bd,longDateFormat:Cd,invalidDate:Dd,ordinal:Ed,dayOfMonthOrdinalParse:Fd,relativeTime:Gd,months:pe,monthsShort:qe,week:ue,weekdays:ve,weekdaysMin:xe,weekdaysShort:we,meridiemParse:Ce},Fe={},Ge={},He=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Ie=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Je=/Z|[+-]\d\d(?::?\d\d)?/,Ke=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],Le=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Me=/^\/?Date\((\-?\d+)/i,Ne=/^((?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d?\d\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(?:\d\d)?\d\d\s)(\d\d:\d\d)(\:\d\d)?(\s(?:UT|GMT|[ECMP][SD]T|[A-IK-Za-ik-z]|[+-]\d{4}))$/;a.createFromInputFallback=x("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(a){a._d=new Date(a._i+(a._useUTC?" UTC":""))}),a.ISO_8601=function(){},a.RFC_2822=function(){};var Oe=x("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var a=tb.apply(null,arguments);return this.isValid()&&a.isValid()?athis?this:a:p()}),Qe=function(){return Date.now?Date.now():+new Date},Re=["year","quarter","month","week","day","hour","minute","second","millisecond"];Db("Z",":"),Db("ZZ",""),Z("Z",_d),Z("ZZ",_d),ba(["Z","ZZ"],function(a,b,c){c._useUTC=!0,c._tzm=Eb(_d,a)});var Se=/([\+\-]|\d\d)/gi;a.updateOffset=function(){};var Te=/^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,Ue=/^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;Sb.fn=Ab.prototype,Sb.invalid=zb;var Ve=Wb(1,"add"),We=Wb(-1,"subtract");a.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",a.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var Xe=x("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(a){return void 0===a?this.localeData():this.locale(a)});U(0,["gg",2],0,function(){return this.weekYear()%100}),U(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Dc("gggg","weekYear"),Dc("ggggg","weekYear"),Dc("GGGG","isoWeekYear"),Dc("GGGGG","isoWeekYear"),J("weekYear","gg"),J("isoWeekYear","GG"),M("weekYear",1),M("isoWeekYear",1),Z("G",Zd),Z("g",Zd),Z("GG",Sd,Od),Z("gg",Sd,Od),Z("GGGG",Wd,Qd),Z("gggg",Wd,Qd),Z("GGGGG",Xd,Rd),Z("ggggg",Xd,Rd),ca(["gggg","ggggg","GGGG","GGGGG"],function(a,b,c,d){b[d.substr(0,2)]=u(a)}),ca(["gg","GG"],function(b,c,d,e){c[e]=a.parseTwoDigitYear(b)}),U("Q",0,"Qo","quarter"),J("quarter","Q"),M("quarter",7),Z("Q",Nd),ba("Q",function(a,b){b[fe]=3*(u(a)-1)}),U("D",["DD",2],"Do","date"),J("date","D"),M("date",9),Z("D",Sd),Z("DD",Sd,Od),Z("Do",function(a,b){return a?b._dayOfMonthOrdinalParse||b._ordinalParse:b._dayOfMonthOrdinalParseLenient}),ba(["D","DD"],ge),ba("Do",function(a,b){b[ge]=u(a.match(Sd)[0],10)});var Ye=O("Date",!0);U("DDD",["DDDD",3],"DDDo","dayOfYear"),J("dayOfYear","DDD"),M("dayOfYear",4),Z("DDD",Vd),Z("DDDD",Pd),ba(["DDD","DDDD"],function(a,b,c){c._dayOfYear=u(a)}),U("m",["mm",2],0,"minute"),J("minute","m"),M("minute",14),Z("m",Sd),Z("mm",Sd,Od),ba(["m","mm"],ie);var Ze=O("Minutes",!1);U("s",["ss",2],0,"second"),J("second","s"),M("second",15),Z("s",Sd),Z("ss",Sd,Od),ba(["s","ss"],je);var $e=O("Seconds",!1);U("S",0,0,function(){return~~(this.millisecond()/100)}),U(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),U(0,["SSS",3],0,"millisecond"),U(0,["SSSS",4],0,function(){return 10*this.millisecond()}),U(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),U(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),U(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),U(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),U(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),J("millisecond","ms"),M("millisecond",16),Z("S",Vd,Nd),Z("SS",Vd,Od),Z("SSS",Vd,Pd);var _e;for(_e="SSSS";_e.length<=9;_e+="S")Z(_e,Yd);for(_e="S";_e.length<=9;_e+="S")ba(_e,Mc);var af=O("Milliseconds",!1);U("z",0,0,"zoneAbbr"),U("zz",0,0,"zoneName");var bf=r.prototype;bf.add=Ve,bf.calendar=Zb,bf.clone=$b,bf.diff=fc,bf.endOf=sc,bf.format=kc,bf.from=lc,bf.fromNow=mc,bf.to=nc,bf.toNow=oc,bf.get=R,bf.invalidAt=Bc,bf.isAfter=_b,bf.isBefore=ac,bf.isBetween=bc,bf.isSame=cc,bf.isSameOrAfter=dc,bf.isSameOrBefore=ec,bf.isValid=zc,bf.lang=Xe,bf.locale=pc,bf.localeData=qc,bf.max=Pe,bf.min=Oe,bf.parsingFlags=Ac,bf.set=S,bf.startOf=rc,bf.subtract=We,bf.toArray=wc,bf.toObject=xc,bf.toDate=vc,bf.toISOString=ic,bf.inspect=jc,bf.toJSON=yc,bf.toString=hc,bf.unix=uc,bf.valueOf=tc,bf.creationData=Cc,bf.year=te,bf.isLeapYear=ra,bf.weekYear=Ec,bf.isoWeekYear=Fc,bf.quarter=bf.quarters=Kc,bf.month=ka,bf.daysInMonth=la,bf.week=bf.weeks=Ba,bf.isoWeek=bf.isoWeeks=Ca,bf.weeksInYear=Hc,bf.isoWeeksInYear=Gc,bf.date=Ye,bf.day=bf.days=Ka,bf.weekday=La,bf.isoWeekday=Ma,bf.dayOfYear=Lc,bf.hour=bf.hours=De,bf.minute=bf.minutes=Ze,bf.second=bf.seconds=$e,bf.millisecond=bf.milliseconds=af,bf.utcOffset=Hb,bf.utc=Jb,bf.local=Kb,bf.parseZone=Lb,bf.hasAlignedHourOffset=Mb,bf.isDST=Nb,bf.isLocal=Pb,bf.isUtcOffset=Qb,bf.isUtc=Rb,bf.isUTC=Rb,bf.zoneAbbr=Nc,bf.zoneName=Oc,bf.dates=x("dates accessor is deprecated. Use date instead.",Ye),bf.months=x("months accessor is deprecated. Use month instead",ka),bf.years=x("years accessor is deprecated. Use year instead",te),bf.zone=x("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",Ib),bf.isDSTShifted=x("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Ob);var cf=C.prototype;cf.calendar=D,cf.longDateFormat=E,cf.invalidDate=F,cf.ordinal=G,cf.preparse=Rc,cf.postformat=Rc,cf.relativeTime=H,cf.pastFuture=I,cf.set=A,cf.months=fa,cf.monthsShort=ga,cf.monthsParse=ia,cf.monthsRegex=na,cf.monthsShortRegex=ma,cf.week=ya,cf.firstDayOfYear=Aa,cf.firstDayOfWeek=za,cf.weekdays=Fa,cf.weekdaysMin=Ha,cf.weekdaysShort=Ga,cf.weekdaysParse=Ja,cf.weekdaysRegex=Na,cf.weekdaysShortRegex=Oa,cf.weekdaysMinRegex=Pa,cf.isPM=Va,cf.meridiem=Wa,$a("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===u(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),a.lang=x("moment.lang is deprecated. Use moment.locale instead.",$a),a.langData=x("moment.langData is deprecated. Use moment.localeData instead.",bb);var df=Math.abs,ef=id("ms"),ff=id("s"),gf=id("m"),hf=id("h"),jf=id("d"),kf=id("w"),lf=id("M"),mf=id("y"),nf=kd("milliseconds"),of=kd("seconds"),pf=kd("minutes"),qf=kd("hours"),rf=kd("days"),sf=kd("months"),tf=kd("years"),uf=Math.round,vf={ss:44,s:45,m:45,h:22,d:26,M:11},wf=Math.abs,xf=Ab.prototype;return xf.isValid=yb,xf.abs=$c,xf.add=ad,xf.subtract=bd,xf.as=gd,xf.asMilliseconds=ef,xf.asSeconds=ff,xf.asMinutes=gf,xf.asHours=hf,xf.asDays=jf,xf.asWeeks=kf,xf.asMonths=lf,xf.asYears=mf,xf.valueOf=hd,xf._bubble=dd,xf.get=jd,xf.milliseconds=nf,xf.seconds=of,xf.minutes=pf,xf.hours=qf,xf.days=rf,xf.weeks=ld,xf.months=sf,xf.years=tf,xf.humanize=qd,xf.toISOString=rd,xf.toString=rd,xf.toJSON=rd,xf.locale=pc,xf.localeData=qc,xf.toIsoString=x("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",rd),xf.lang=Xe,U("X",0,0,"unix"),U("x",0,0,"valueOf"),Z("x",Zd),Z("X",ae),ba("X",function(a,b,c){c._d=new Date(1e3*parseFloat(a,10))}),ba("x",function(a,b,c){c._d=new Date(u(a))}),a.version="2.18.1",b(tb),a.fn=bf,a.min=vb,a.max=wb,a.now=Qe,a.utc=l,a.unix=Pc,a.months=Vc,a.isDate=h,a.locale=$a,a.invalid=p,a.duration=Sb,a.isMoment=s,a.weekdays=Xc,a.parseZone=Qc,a.localeData=bb,a.isDuration=Bb,a.monthsShort=Wc,a.weekdaysMin=Zc,a.defineLocale=_a,a.updateLocale=ab,a.locales=cb,a.weekdaysShort=Yc,a.normalizeUnits=K,a.relativeTimeRounding=od,a.relativeTimeThreshold=pd,a.calendarFormat=Yb,a.prototype=bf,a}); \ No newline at end of file diff --git a/wwwroot/js/lib/page.js b/wwwroot/js/lib/page.js new file mode 100644 index 0000000..1b9a382 --- /dev/null +++ b/wwwroot/js/lib/page.js @@ -0,0 +1,1113 @@ +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.page=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o + if ('function' === typeof path) { + return page('*', path); + } + + // route to + if ('function' === typeof fn) { + var route = new Route(/** @type {string} */ (path)); + for (var i = 1; i < arguments.length; ++i) { + page.callbacks.push(route.middleware(arguments[i])); + } + // show with [state] + } else if ('string' === typeof path) { + page['string' === typeof fn ? 'redirect' : 'show'](path, fn); + // start [options] + } else { + page.start(path); + } + } + + /** + * Callback functions. + */ + + page.callbacks = []; + page.exits = []; + + /** + * Current path being processed + * @type {string} + */ + page.current = ''; + + /** + * Number of pages navigated to. + * @type {number} + * + * page.len == 0; + * page('/login'); + * page.len == 1; + */ + + page.len = 0; + + /** + * Get or set basepath to `path`. + * + * @param {string} path + * @api public + */ + + page.base = function(path) { + if (0 === arguments.length) return base; + base = path; + }; + + /** + * Bind with the given `options`. + * + * Options: + * + * - `click` bind to click events [true] + * - `popstate` bind to popstate [true] + * - `dispatch` perform initial dispatch [true] + * + * @param {Object} options + * @api public + */ + + page.start = function(options) { + options = options || {}; + if (running) return; + running = true; + if (false === options.dispatch) dispatch = false; + if (false === options.decodeURLComponents) decodeURLComponents = false; + if (false !== options.popstate) window.addEventListener('popstate', onpopstate, false); + if (false !== options.click) { + document.addEventListener(clickEvent, onclick, false); + } + if (true === options.hashbang) hashbang = true; + if (!dispatch) return; + var url = (hashbang && ~location.hash.indexOf('#!')) ? location.hash.substr(2) + location.search : location.pathname + location.search + location.hash; + page.replace(url, null, true, dispatch); + }; + + /** + * Unbind click and popstate event handlers. + * + * @api public + */ + + page.stop = function() { + if (!running) return; + page.current = ''; + page.len = 0; + running = false; + document.removeEventListener(clickEvent, onclick, false); + window.removeEventListener('popstate', onpopstate, false); + }; + + /** + * Show `path` with optional `state` object. + * + * @param {string} path + * @param {Object=} state + * @param {boolean=} dispatch + * @param {boolean=} push + * @return {!Context} + * @api public + */ + + page.show = function(path, state, dispatch, push) { + var ctx = new Context(path, state); + page.current = ctx.path; + if (false !== dispatch) page.dispatch(ctx); + if (false !== ctx.handled && false !== push) ctx.pushState(); + return ctx; + }; + + /** + * Goes back in the history + * Back should always let the current route push state and then go back. + * + * @param {string} path - fallback path to go back if no more history exists, if undefined defaults to page.base + * @param {Object=} state + * @api public + */ + + page.back = function(path, state) { + if (page.len > 0) { + // this may need more testing to see if all browsers + // wait for the next tick to go back in history + history.back(); + page.len--; + } else if (path) { + setTimeout(function() { + page.show(path, state); + }); + }else{ + setTimeout(function() { + page.show(base, state); + }); + } + }; + + + /** + * Register route to redirect from one path to other + * or just redirect to another route + * + * @param {string} from - if param 'to' is undefined redirects to 'from' + * @param {string=} to + * @api public + */ + page.redirect = function(from, to) { + // Define route from a path to another + if ('string' === typeof from && 'string' === typeof to) { + page(from, function(e) { + setTimeout(function() { + page.replace(/** @type {!string} */ (to)); + }, 0); + }); + } + + // Wait for the push state and replace it with another + if ('string' === typeof from && 'undefined' === typeof to) { + setTimeout(function() { + page.replace(from); + }, 0); + } + }; + + /** + * Replace `path` with optional `state` object. + * + * @param {string} path + * @param {Object=} state + * @param {boolean=} init + * @param {boolean=} dispatch + * @return {!Context} + * @api public + */ + + + page.replace = function(path, state, init, dispatch) { + var ctx = new Context(path, state); + page.current = ctx.path; + ctx.init = init; + ctx.save(); // save before dispatching, which may redirect + if (false !== dispatch) page.dispatch(ctx); + return ctx; + }; + + /** + * Dispatch the given `ctx`. + * + * @param {Context} ctx + * @api private + */ + page.dispatch = function(ctx) { + var prev = prevContext, + i = 0, + j = 0; + + prevContext = ctx; + + function nextExit() { + var fn = page.exits[j++]; + if (!fn) return nextEnter(); + fn(prev, nextExit); + } + + function nextEnter() { + var fn = page.callbacks[i++]; + + if (ctx.path !== page.current) { + ctx.handled = false; + return; + } + if (!fn) return unhandled(ctx); + fn(ctx, nextEnter); + } + + if (prev) { + nextExit(); + } else { + nextEnter(); + } + }; + + /** + * Unhandled `ctx`. When it's not the initial + * popstate then redirect. If you wish to handle + * 404s on your own use `page('*', callback)`. + * + * @param {Context} ctx + * @api private + */ + function unhandled(ctx) { + if (ctx.handled) return; + var current; + + if (hashbang) { + current = base + location.hash.replace('#!', ''); + } else { + current = location.pathname + location.search; + } + + if (current === ctx.canonicalPath) return; + page.stop(); + ctx.handled = false; + location.href = ctx.canonicalPath; + } + + /** + * Register an exit route on `path` with + * callback `fn()`, which will be called + * on the previous context when a new + * page is visited. + */ + page.exit = function(path, fn) { + if (typeof path === 'function') { + return page.exit('*', path); + } + + var route = new Route(path); + for (var i = 1; i < arguments.length; ++i) { + page.exits.push(route.middleware(arguments[i])); + } + }; + + /** + * Remove URL encoding from the given `str`. + * Accommodates whitespace in both x-www-form-urlencoded + * and regular percent-encoded form. + * + * @param {string} val - URL component to decode + */ + function decodeURLEncodedURIComponent(val) { + if (typeof val !== 'string') { return val; } + return decodeURLComponents ? decodeURIComponent(val.replace(/\+/g, ' ')) : val; + } + + /** + * Initialize a new "request" `Context` + * with the given `path` and optional initial `state`. + * + * @constructor + * @param {string} path + * @param {Object=} state + * @api public + */ + + function Context(path, state) { + if ('/' === path[0] && 0 !== path.indexOf(base)) path = base + (hashbang ? '#!' : '') + path; + var i = path.indexOf('?'); + + this.canonicalPath = path; + this.path = path.replace(base, '') || '/'; + if (hashbang) this.path = this.path.replace('#!', '') || '/'; + + this.title = document.title; + this.state = state || {}; + this.state.path = path; + this.querystring = ~i ? decodeURLEncodedURIComponent(path.slice(i + 1)) : ''; + this.pathname = decodeURLEncodedURIComponent(~i ? path.slice(0, i) : path); + this.params = {}; + + // fragment + this.hash = ''; + if (!hashbang) { + if (!~this.path.indexOf('#')) return; + var parts = this.path.split('#'); + this.path = parts[0]; + this.hash = decodeURLEncodedURIComponent(parts[1]) || ''; + this.querystring = this.querystring.split('#')[0]; + } + } + + /** + * Expose `Context`. + */ + + page.Context = Context; + + /** + * Push state. + * + * @api private + */ + + Context.prototype.pushState = function() { + page.len++; + history.pushState(this.state, this.title, hashbang && this.path !== '/' ? '#!' + this.path : this.canonicalPath); + }; + + /** + * Save the context state. + * + * @api public + */ + + Context.prototype.save = function() { + history.replaceState(this.state, this.title, hashbang && this.path !== '/' ? '#!' + this.path : this.canonicalPath); + }; + + /** + * Initialize `Route` with the given HTTP `path`, + * and an array of `callbacks` and `options`. + * + * Options: + * + * - `sensitive` enable case-sensitive routes + * - `strict` enable strict matching for trailing slashes + * + * @constructor + * @param {string} path + * @param {Object=} options + * @api private + */ + + function Route(path, options) { + options = options || {}; + this.path = (path === '*') ? '(.*)' : path; + this.method = 'GET'; + this.regexp = pathtoRegexp(this.path, + this.keys = [], + options); + } + + /** + * Expose `Route`. + */ + + page.Route = Route; + + /** + * Return route middleware with + * the given callback `fn()`. + * + * @param {Function} fn + * @return {Function} + * @api public + */ + + Route.prototype.middleware = function(fn) { + var self = this; + return function(ctx, next) { + if (self.match(ctx.path, ctx.params)) return fn(ctx, next); + next(); + }; + }; + + /** + * Check if this route matches `path`, if so + * populate `params`. + * + * @param {string} path + * @param {Object} params + * @return {boolean} + * @api private + */ + + Route.prototype.match = function(path, params) { + var keys = this.keys, + qsIndex = path.indexOf('?'), + pathname = ~qsIndex ? path.slice(0, qsIndex) : path, + m = this.regexp.exec(decodeURIComponent(pathname)); + + if (!m) return false; + + for (var i = 1, len = m.length; i < len; ++i) { + var key = keys[i - 1]; + var val = decodeURLEncodedURIComponent(m[i]); + if (val !== undefined || !(hasOwnProperty.call(params, key.name))) { + params[key.name] = val; + } + } + + return true; + }; + + + /** + * Handle "populate" events. + */ + + var onpopstate = (function () { + var loaded = false; + if ('undefined' === typeof window) { + return; + } + if (document.readyState === 'complete') { + loaded = true; + } else { + window.addEventListener('load', function() { + setTimeout(function() { + loaded = true; + }, 0); + }); + } + return function onpopstate(e) { + if (!loaded) return; + if (e.state) { + var path = e.state.path; + page.replace(path, e.state); + } else { + page.show(location.pathname + location.hash, undefined, undefined, false); + } + }; + })(); + /** + * Handle "click" events. + */ + + function onclick(e) { + + if (1 !== which(e)) return; + + if (e.metaKey || e.ctrlKey || e.shiftKey) return; + if (e.defaultPrevented) return; + + + + // ensure link + // use shadow dom when available + var el = e.path ? e.path[0] : e.target; + while (el && 'A' !== el.nodeName) el = el.parentNode; + if (!el || 'A' !== el.nodeName) return; + + + + // Ignore if tag has + // 1. "download" attribute + // 2. rel="external" attribute + if (el.hasAttribute('download') || el.getAttribute('rel') === 'external') return; + + // ensure non-hash for the same path + var link = el.getAttribute('href'); + if (!hashbang && el.pathname === location.pathname && (el.hash || '#' === link)) return; + + + + // Check for mailto: in the href + if (link && link.indexOf('mailto:') > -1) return; + + // check target + if (el.target) return; + + // x-origin + if (!sameOrigin(el.href)) return; + + + + // rebuild path + var path = el.pathname + el.search + (el.hash || ''); + + // strip leading "/[drive letter]:" on NW.js on Windows + if (typeof process !== 'undefined' && path.match(/^\/[a-zA-Z]:\//)) { + path = path.replace(/^\/[a-zA-Z]:\//, '/'); + } + + // same page + var orig = path; + + if (path.indexOf(base) === 0) { + path = path.substr(base.length); + } + + if (hashbang) path = path.replace('#!', ''); + + if (base && orig === path) return; + + e.preventDefault(); + page.show(orig); + } + + /** + * Event button. + */ + + function which(e) { + e = e || window.event; + return null === e.which ? e.button : e.which; + } + + /** + * Check if `href` is the same origin. + */ + + function sameOrigin(href) { + var origin = location.protocol + '//' + location.hostname; + if (location.port) origin += ':' + location.port; + return (href && (0 === href.indexOf(origin))); + } + + page.sameOrigin = sameOrigin; + +}).call(this,require('_process')) +},{"_process":2,"path-to-regexp":3}],2:[function(require,module,exports){ +// shim for using process in browser + +var process = module.exports = {}; + +process.nextTick = (function () { + var canSetImmediate = typeof window !== 'undefined' + && window.setImmediate; + var canMutationObserver = typeof window !== 'undefined' + && window.MutationObserver; + var canPost = typeof window !== 'undefined' + && window.postMessage && window.addEventListener + ; + + if (canSetImmediate) { + return function (f) { return window.setImmediate(f) }; + } + + var queue = []; + + if (canMutationObserver) { + var hiddenDiv = document.createElement("div"); + var observer = new MutationObserver(function () { + var queueList = queue.slice(); + queue.length = 0; + queueList.forEach(function (fn) { + fn(); + }); + }); + + observer.observe(hiddenDiv, { attributes: true }); + + return function nextTick(fn) { + if (!queue.length) { + hiddenDiv.setAttribute('yes', 'no'); + } + queue.push(fn); + }; + } + + if (canPost) { + window.addEventListener('message', function (ev) { + var source = ev.source; + if ((source === window || source === null) && ev.data === 'process-tick') { + ev.stopPropagation(); + if (queue.length > 0) { + var fn = queue.shift(); + fn(); + } + } + }, true); + + return function nextTick(fn) { + queue.push(fn); + window.postMessage('process-tick', '*'); + }; + } + + return function nextTick(fn) { + setTimeout(fn, 0); + }; +})(); + +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +// TODO(shtylman) +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; + +},{}],3:[function(require,module,exports){ +var isarray = require('isarray') + +/** + * Expose `pathToRegexp`. + */ +module.exports = pathToRegexp +module.exports.parse = parse +module.exports.compile = compile +module.exports.tokensToFunction = tokensToFunction +module.exports.tokensToRegExp = tokensToRegExp + +/** + * The main path matching regexp utility. + * + * @type {RegExp} + */ +var PATH_REGEXP = new RegExp([ + // Match escaped characters that would otherwise appear in future matches. + // This allows the user to escape special characters that won't transform. + '(\\\\.)', + // Match Express-style parameters and un-named parameters with a prefix + // and optional suffixes. Matches appear as: + // + // "/:test(\\d+)?" => ["/", "test", "\d+", undefined, "?", undefined] + // "/route(\\d+)" => [undefined, undefined, undefined, "\d+", undefined, undefined] + // "/*" => ["/", undefined, undefined, undefined, undefined, "*"] + '([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^()])+)\\))?|\\(((?:\\\\.|[^()])+)\\))([+*?])?|(\\*))' +].join('|'), 'g') + +/** + * Parse a string for the raw tokens. + * + * @param {String} str + * @return {Array} + */ +function parse (str) { + var tokens = [] + var key = 0 + var index = 0 + var path = '' + var res + + while ((res = PATH_REGEXP.exec(str)) != null) { + var m = res[0] + var escaped = res[1] + var offset = res.index + path += str.slice(index, offset) + index = offset + m.length + + // Ignore already escaped sequences. + if (escaped) { + path += escaped[1] + continue + } + + // Push the current path onto the tokens. + if (path) { + tokens.push(path) + path = '' + } + + var prefix = res[2] + var name = res[3] + var capture = res[4] + var group = res[5] + var suffix = res[6] + var asterisk = res[7] + + var repeat = suffix === '+' || suffix === '*' + var optional = suffix === '?' || suffix === '*' + var delimiter = prefix || '/' + var pattern = capture || group || (asterisk ? '.*' : '[^' + delimiter + ']+?') + + tokens.push({ + name: name || key++, + prefix: prefix || '', + delimiter: delimiter, + optional: optional, + repeat: repeat, + pattern: escapeGroup(pattern) + }) + } + + // Match any characters still remaining. + if (index < str.length) { + path += str.substr(index) + } + + // If the path exists, push it onto the end. + if (path) { + tokens.push(path) + } + + return tokens +} + +/** + * Compile a string to a template function for the path. + * + * @param {String} str + * @return {Function} + */ +function compile (str) { + return tokensToFunction(parse(str)) +} + +/** + * Expose a method for transforming tokens into the path function. + */ +function tokensToFunction (tokens) { + // Compile all the tokens into regexps. + var matches = new Array(tokens.length) + + // Compile all the patterns before compilation. + for (var i = 0; i < tokens.length; i++) { + if (typeof tokens[i] === 'object') { + matches[i] = new RegExp('^' + tokens[i].pattern + '$') + } + } + + return function (obj) { + var path = '' + var data = obj || {} + + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i] + + if (typeof token === 'string') { + path += token + + continue + } + + var value = data[token.name] + var segment + + if (value == null) { + if (token.optional) { + continue + } else { + throw new TypeError('Expected "' + token.name + '" to be defined') + } + } + + if (isarray(value)) { + if (!token.repeat) { + throw new TypeError('Expected "' + token.name + '" to not repeat, but received "' + value + '"') + } + + if (value.length === 0) { + if (token.optional) { + continue + } else { + throw new TypeError('Expected "' + token.name + '" to not be empty') + } + } + + for (var j = 0; j < value.length; j++) { + segment = encodeURIComponent(value[j]) + + if (!matches[i].test(segment)) { + throw new TypeError('Expected all "' + token.name + '" to match "' + token.pattern + '", but received "' + segment + '"') + } + + path += (j === 0 ? token.prefix : token.delimiter) + segment + } + + continue + } + + segment = encodeURIComponent(value) + + if (!matches[i].test(segment)) { + throw new TypeError('Expected "' + token.name + '" to match "' + token.pattern + '", but received "' + segment + '"') + } + + path += token.prefix + segment + } + + return path + } +} + +/** + * Escape a regular expression string. + * + * @param {String} str + * @return {String} + */ +function escapeString (str) { + return str.replace(/([.+*?=^!:${}()[\]|\/])/g, '\\$1') +} + +/** + * Escape the capturing group by escaping special characters and meaning. + * + * @param {String} group + * @return {String} + */ +function escapeGroup (group) { + return group.replace(/([=!:$\/()])/g, '\\$1') +} + +/** + * Attach the keys as a property of the regexp. + * + * @param {RegExp} re + * @param {Array} keys + * @return {RegExp} + */ +function attachKeys (re, keys) { + re.keys = keys + return re +} + +/** + * Get the flags for a regexp from the options. + * + * @param {Object} options + * @return {String} + */ +function flags (options) { + return options.sensitive ? '' : 'i' +} + +/** + * Pull out keys from a regexp. + * + * @param {RegExp} path + * @param {Array} keys + * @return {RegExp} + */ +function regexpToRegexp (path, keys) { + // Use a negative lookahead to match only capturing groups. + var groups = path.source.match(/\((?!\?)/g) + + if (groups) { + for (var i = 0; i < groups.length; i++) { + keys.push({ + name: i, + prefix: null, + delimiter: null, + optional: false, + repeat: false, + pattern: null + }) + } + } + + return attachKeys(path, keys) +} + +/** + * Transform an array into a regexp. + * + * @param {Array} path + * @param {Array} keys + * @param {Object} options + * @return {RegExp} + */ +function arrayToRegexp (path, keys, options) { + var parts = [] + + for (var i = 0; i < path.length; i++) { + parts.push(pathToRegexp(path[i], keys, options).source) + } + + var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options)) + + return attachKeys(regexp, keys) +} + +/** + * Create a path regexp from string input. + * + * @param {String} path + * @param {Array} keys + * @param {Object} options + * @return {RegExp} + */ +function stringToRegexp (path, keys, options) { + var tokens = parse(path) + var re = tokensToRegExp(tokens, options) + + // Attach keys back to the regexp. + for (var i = 0; i < tokens.length; i++) { + if (typeof tokens[i] !== 'string') { + keys.push(tokens[i]) + } + } + + return attachKeys(re, keys) +} + +/** + * Expose a function for taking tokens and returning a RegExp. + * + * @param {Array} tokens + * @param {Array} keys + * @param {Object} options + * @return {RegExp} + */ +function tokensToRegExp (tokens, options) { + options = options || {} + + var strict = options.strict + var end = options.end !== false + var route = '' + var lastToken = tokens[tokens.length - 1] + var endsWithSlash = typeof lastToken === 'string' && /\/$/.test(lastToken) + + // Iterate over the tokens and create our regexp string. + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i] + + if (typeof token === 'string') { + route += escapeString(token) + } else { + var prefix = escapeString(token.prefix) + var capture = token.pattern + + if (token.repeat) { + capture += '(?:' + prefix + capture + ')*' + } + + if (token.optional) { + if (prefix) { + capture = '(?:' + prefix + '(' + capture + '))?' + } else { + capture = '(' + capture + ')?' + } + } else { + capture = prefix + '(' + capture + ')' + } + + route += capture + } + } + + // In non-strict mode we allow a slash at the end of match. If the path to + // match already ends with a slash, we remove it for consistency. The slash + // is valid at the end of a path match, not in the middle. This is important + // in non-ending mode, where "/test/" shouldn't match "/test//route". + if (!strict) { + route = (endsWithSlash ? route.slice(0, -2) : route) + '(?:\\/(?=$))?' + } + + if (end) { + route += '$' + } else { + // In non-ending mode, we need the capturing groups to match as much as + // possible by using a positive lookahead to the end or next path segment. + route += strict && endsWithSlash ? '' : '(?=\\/|$)' + } + + return new RegExp('^' + route, flags(options)) +} + +/** + * Normalize the given path string, returning a regular expression. + * + * An empty array can be passed in for the keys, which will hold the + * placeholder key descriptions. For example, using `/user/:id`, `keys` will + * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`. + * + * @param {(String|RegExp|Array)} path + * @param {Array} [keys] + * @param {Object} [options] + * @return {RegExp} + */ +function pathToRegexp (path, keys, options) { + keys = keys || [] + + if (!isarray(keys)) { + options = keys + keys = [] + } else if (!options) { + options = {} + } + + if (path instanceof RegExp) { + return regexpToRegexp(path, keys, options) + } + + if (isarray(path)) { + return arrayToRegexp(path, keys, options) + } + + return stringToRegexp(path, keys, options) +} + +},{"isarray":4}],4:[function(require,module,exports){ +module.exports = Array.isArray || function (arr) { + return Object.prototype.toString.call(arr) == '[object Array]'; +}; + +},{}]},{},[1])(1) +}); \ No newline at end of file diff --git a/wwwroot/js/lib/store.min.js b/wwwroot/js/lib/store.min.js new file mode 100644 index 0000000..dde66d2 --- /dev/null +++ b/wwwroot/js/lib/store.min.js @@ -0,0 +1,7 @@ +/* Copyright (c) 2010-2016 Marcus Westin */ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.store = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;odocument.w=window'),u.close(),c=u.w.frames[0].document,t=c.createElement("div")}catch(l){t=i.createElement("div"),c=i.body}var f=function(e){return function(){var n=Array.prototype.slice.call(arguments,0);n.unshift(t),c.appendChild(t),t.addBehavior("#default#userData"),t.load(o);var i=e.apply(r,n);return c.removeChild(t),i}},d=new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]","g"),s=function(e){return e.replace(/^d/,"___$&").replace(d,"___")};r.set=f(function(e,t,n){return t=s(t),void 0===n?r.remove(t):(e.setAttribute(t,r.serialize(n)),e.save(o),n)}),r.get=f(function(e,t,n){t=s(t);var i=r.deserialize(e.getAttribute(t));return void 0===i?n:i}),r.remove=f(function(e,t){t=s(t),e.removeAttribute(t),e.save(o)}),r.clear=f(function(e){var t=e.XMLDocument.documentElement.attributes;e.load(o);for(var r=t.length-1;r>=0;r--)e.removeAttribute(t[r].name);e.save(o)}),r.getAll=function(e){var t={};return r.forEach(function(e,r){t[e]=r}),t},r.forEach=f(function(e,t){for(var n,i=e.XMLDocument.documentElement.attributes,o=0;n=i[o];++o)t(n.name,r.deserialize(e.getAttribute(n.name)))})}try{var v="__storejs__";r.set(v,v),r.get(v)!=v&&(r.disabled=!0),r.remove(v)}catch(l){r.disabled=!0}return r.enabled=!r.disabled,r}(); +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}]},{},[1])(1) +}); \ No newline at end of file diff --git a/wwwroot/js/templates/app.authenticate.handlebars b/wwwroot/js/templates/app.authenticate.handlebars new file mode 100644 index 0000000..51eabab --- /dev/null +++ b/wwwroot/js/templates/app.authenticate.handlebars @@ -0,0 +1,9 @@ +
    + Rockfish logo +

    Login

    +
    +

    +

    +

    +
    +
    \ No newline at end of file diff --git a/wwwroot/js/templates/app.customerEdit.handlebars b/wwwroot/js/templates/app.customerEdit.handlebars new file mode 100644 index 0000000..c4b7d79 --- /dev/null +++ b/wwwroot/js/templates/app.customerEdit.handlebars @@ -0,0 +1,54 @@ +
    +
    + + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + +
    + + +
    + +
    + + + +
    + +