Beispiel #1
0
        public async Task <FileResult> Index(Notes2021.Models.ExportViewModel model /*, int arcId*/)
        {
            int?arcId  = HttpContext.Session.GetInt32("ArchiveID");
            int arcId2 = 0;

            if (arcId != null)
            {
                arcId2 = (int)arcId;
            }

            return(File(await DoExport(model, User, arcId2), System.Net.Mime.MediaTypeNames.Application.Octet, model.FileName + (model.isHtml ? ".html" : ".txt")));
        }
Beispiel #2
0
        public async Task <IActionResult> PreExport(int id)
        {
            //string userid = _userManager.GetUserId(User);
            Notes2021.Models.ExportViewModel it = new Notes2021.Models.ExportViewModel();

            NoteFile nf = await NoteDataManager.GetFileById(_db, id);

            it.FileName = nf.NoteFileName;
            it.FileNum  = id;

            // set default options
            it.isHtml        = false;
            it.isCollapsible = false;
            it.directOutput  = true;
            it.NoteOrdinal   = 0;

            return(View(it));
        }
        public async Task <MemoryStream> GetFileAs(int id, bool id2)
        {
            string authHeader = Request.Headers["authentication"];

            string[]     auths = authHeader.Split(',');
            IdentityUser me    = await _userManager.FindByIdAsync(auths[1]);

            UserData appMe = await _context.UserData.SingleAsync(p => p.UserId == me.Id);

            if (String.Compare(auths[2], appMe.MyGuid, StringComparison.Ordinal) != 0)
            {
                return(null);
            }
            string     userID = auths[1];
            NoteAccess myAcc  = await AccessManager.GetAccess(_context, userID, id, 0); //TODO

            if (!myAcc.ReadAccess)
            {
                return(null);
            }

            ExportController myExp = new ExportController(_appEnv,
                                                          _userManager, _signInManager, _context);

            Notes2021.Models.ExportViewModel model = new Notes2021.Models.ExportViewModel();

            NoteFile nf = await NoteDataManager.GetFileById(_context, id);

            model.NoteOrdinal   = 0;
            model.FileName      = nf.NoteFileName;
            model.FileNum       = nf.Id;
            model.directOutput  = true;
            model.isCollapsible = id2;
            model.isHtml        = id2;

            IdentityUser applicationUser = await _userManager
                                           .FindByEmailAsync(auths[0]);

            await _signInManager.SignInAsync(applicationUser, false);

            model.tzone = _context.TZone.Single(p => p.Id == appMe.TimeZoneID);

            return(await myExp.DoExport(model, User, 0));   //TODO
        }
Beispiel #4
0
        //public IActionResult ExportMarked()
        //{
        //    ExportViewModel v = new ExportViewModel
        //    {
        //        directOutput = false,
        //        isCollapsible = false,
        //        isHtml = true
        //    };
        //    int fid = _db.Mark
        //        .First(p => p.UserId == int.Parse(_userManager.GetUserId(User)))
        //        .NoteFileId;

        //    v.FileName = _db.NoteFile
        //        .First(p => p.Id == fid)
        //        .NoteFileName;

        //    return View(v);
        //}

        // ReSharper disable once UnusedParameter.Global
        public IActionResult ExportMarked(int xfid)
        {
            Notes2021.Models.ExportViewModel v = new Notes2021.Models.ExportViewModel
            {
                directOutput  = false,
                isCollapsible = false,
                isHtml        = true
            };

            int fid = _db.Mark
                      .First(p => p.UserId == _userManager.GetUserId(User))
                      .NoteFileId;


            v.FileName = _db.NoteFile
                         .First(p => p.Id == fid)
                         .NoteFileName;

            return(View(v));
        }
Beispiel #5
0
        /// <summary>
        /// Gather info from user - what file, what options to use
        /// </summary>
        /// <returns></returns>
        public IActionResult Index()
        {
            //string userid = _userManager.GetUserId(User);
            IEnumerable <SelectListItem> items = LocalManager.GetFileNameSelectList(_db);
            List <SelectListItem>        list2 = new List <SelectListItem>
            {
                new SelectListItem
                {
                    Value = "",
                    Text  = "-- Select a File --"
                }
            };

            list2.AddRange(items);

            // create new model and start adding properties
            Notes2021.Models.ExportViewModel it = new Notes2021.Models.ExportViewModel {
                AFiles = list2
            };
            // file name select list
            items = LocalManager.GetFileTitleSelectList(_db);
            list2 = new List <SelectListItem>
            {
                new SelectListItem
                {
                    Value = "",
                    Text  = "-- Select a Title --"
                }
            };
            list2.AddRange(items);
            it.ATitles = list2;

            // set default options
            it.isHtml        = true;
            it.isCollapsible = true;
            it.directOutput  = false;
            it.NoteOrdinal   = 0;

            return(View(it));
        }
Beispiel #6
0
        /// <summary>
        /// Create an Html representation of the notefile
        /// </summary>
        /// <param name="model">Notefile and options</param>
        /// <param name="user">User (object) making request</param>
        /// <returns>MemoryStream containing the Html</returns>
        public async Task <MemoryStream> DoExportMarked(Notes2021.Models.ExportViewModel model, ClaimsPrincipal user, int arcId)
        {
            // get our options
            bool isHtml        = model.isHtml;
            bool isCollapsible = model.isCollapsible;

            // make sure we have a valid file name
            NoteFile nf = await NoteDataManager.GetFileByName(_db, model.FileName);

            if (nf == null)
            {
                return(null);
            }

            int nfid = nf.Id;

            //string userid = _userManager.GetUserId(user);
            string     userName = _userManager.GetUserName(user);
            NoteAccess ac       = await GetMyAccess(nfid, user);

            if (!ac.ReadAccess)       // make sure user has read access to file
            {
                return(null);
            }

            //string filename = model.FileName + (isHtml ? ".html" : ".txt");

            //string evt = "Export of Marked notes in file " + model.FileName;
            //evt += " as " + (isHtml ? "html" : "txt") + " for " + userName;
            //_telemetry.TrackEvent(evt);

            MemoryStream  ms = new MemoryStream();
            StreamWriter  sw = new StreamWriter(ms);
            StringBuilder sb = new StringBuilder();

            if (isHtml)
            {
                // Start the document
                sb.AppendLine("<!DOCTYPE html>");
                sb.AppendLine("<html>");
                sb.AppendLine("<meta charset=\"utf-8\" />");
                sb.AppendLine("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">");
                sb.AppendLine("<title>" + nf.NoteFileTitle + "</title>");
                sb.AppendLine("<link rel = \"stylesheet\" href = \"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css\">");
                if (isCollapsible)
                {
                    sb.AppendLine("<script src = \"https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js\" ></script >");
                    sb.AppendLine("<script src = \"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js\" ></script >");
                }
                sb.AppendLine("<style>");

                // read our local style sheet from a file and output it
                TextReader sr = new StreamReader(_stylePath);
                sb.AppendLine(await sr.ReadToEndAsync());
                sr.Close();

                sb.AppendLine("</style>");
                sb.AppendLine("</head>");
                sb.AppendLine("<body>");
                await sw.WriteAsync(sb.ToString());

                // ready to start  writing content of file
                sb = new StringBuilder();
            }
            if (isHtml)
            {
                sb.Append("<h2>");
            }

            // File Header
            sb.Append("NoteFile " + nf.NoteFileName + " - " + nf.NoteFileTitle);
            sb.Append(" - Created " + DateTime.Now.ToUniversalTime().ToLongDateString() + " " + DateTime.Now.ToUniversalTime().ToShortTimeString());
            sb.Append("   For " + userName);
            if (isHtml)
            {
                sb.Append("</h2>");
            }
            await sw.WriteLineAsync(sb.ToString());

            await sw.WriteLineAsync();

            var query = _db.Mark
                        .OrderBy(p => p.MarkOrdinal)
                        .Where(p => p.UserId == _userManager.GetUserId(user));

            // loop over each note in order
            IEnumerator <Mark> mrk = query.GetEnumerator();

            mrk.MoveNext();
            bool inResp = false;
            int  nOrd   = mrk.Current.NoteOrdinal;

            while (mrk.Current != null)
            {
                Mark mark = mrk.Current;
                // get content for note
                NoteHeader nc = await NoteDataManager.GetMarkedNote(_db, mark);

                NoteHeader bnh = await NoteDataManager.GetBaseNoteHeader(_db, mark.NoteFileId, arcId, mark.NoteOrdinal);

                //db.BaseNoteHeader
                //.Where(p => p.NoteFileID == mark.FileID && p.NoteOrdinal == mark.NoteOrdinal)
                //.FirstAsync();

                // extra stuff to terminate collapsable responses
                //                if (isCollapsible && isHtml && inResp && nc.ResponseOrdinal == 0 )  // || (nc.NoteOrdinal != NOrd))
                if (isCollapsible && isHtml && inResp && (nc.NoteOrdinal != nOrd))
                {
                    inResp = false;
                    await sw.WriteLineAsync("</div></div></div></div></div> ");
                }

                if ((isCollapsible && isHtml && nc.ResponseOrdinal > 0) && !inResp)  // && (NOrd != nc.NoteOrdinal))
                {
                    inResp = true;
                    await sw.WriteLineAsync("<div class=\"container\"><div class=\"panel-group\">" +
                                            "<div class=\"panel panel-default\"><div class=\"panel-heading\"><div class=\"panel-title\"><a data-toggle=\"collapse\" href=\"#collapse" +
                                            nc.NoteOrdinal + "\">Toggle Response(s)" + "</a></div></div><div id = \"collapse" + nc.NoteOrdinal +
                                            "\" class=\"panel-collapse collapse\"><div class=\"panel-body\">");
                }

                // format it and write it
                await WriteNote(sw, nc, bnh, isHtml, nc.ResponseOrdinal > 0);

                nOrd = nc.NoteOrdinal;

                await sw.WriteLineAsync();

                if (!mrk.MoveNext())
                {
                    break;
                }
            }
            mrk.Dispose();

            // extra stuff to terminate collapsable responses
            if (isCollapsible && isHtml && inResp)
            {
                await sw.WriteLineAsync("</div></div></div></div></div> ");
            }

            if (isHtml)  // end the html
            {
                await sw.WriteLineAsync("</body></html>");
            }

            // make sure all output is written to stream and rewind it
            await sw.FlushAsync();

            ms.Seek(0, SeekOrigin.Begin);

            mrk = query.GetEnumerator();
            mrk.MoveNext();
            while (mrk.Current != null)
            {
                _db.Mark.Remove(mrk.Current);
                if (!mrk.MoveNext())
                {
                    break;
                }
            }
            mrk.Dispose();
            await _db.SaveChangesAsync();

            // send stream to caller
            return(ms);
        }
Beispiel #7
0
 public async Task <FileResult> ExportMarked(Notes2021.Models.ExportViewModel model, int arcId)
 {
     return(File(await DoExportMarked(model, User, arcId), System.Net.Mime.MediaTypeNames.Application.Octet, model.FileName + (model.isHtml ? ".html" : ".txt")));
 }
Beispiel #8
0
        /// <summary>
        /// Create an Html representation of the notefile
        /// </summary>
        /// <param name="model">Notefile and options</param>
        /// <param name="user">User (object) making request</param>
        /// <returns>MemoryStream containing the Html</returns>
        public async Task <MemoryStream> DoExport(Notes2021.Models.ExportViewModel model, ClaimsPrincipal user, int arcId)
        {
            // get our options
            bool isHtml        = model.isHtml;
            bool isCollapsible = model.isCollapsible;

            // make sure we have a valid file name
            NoteFile nf = await NoteDataManager.GetFileByName(_db, model.FileName);

            if (nf == null)
            {
                return(null);
            }

            int nfid = nf.Id;

            //string userid = _userManager.GetUserId(user);
            string     userName = _userManager.GetUserName(user);
            NoteAccess ac       = await GetMyAccess(nfid, user);

            if (!ac.ReadAccess)       // make sure user has read access to file
            {
                return(null);
            }

            //string evt = "Export of file " + model.FileName;
            //if (model.NoteOrdinal != 0)
            //    evt += " note # " + model.NoteOrdinal;
            //evt += " as " + (isHtml ? "html" : "txt") + " for " + userName;
            //_telemetry.TrackEvent(evt);

            //string filename = model.FileName + (isHtml ? ".html" : ".txt");

            MemoryStream  ms = new MemoryStream();
            StreamWriter  sw = new StreamWriter(ms);
            StringBuilder sb = new StringBuilder();

            if (isHtml)
            {
                // Start the document
                sb.AppendLine("<!DOCTYPE html>");
                sb.AppendLine("<html>");
                sb.AppendLine("<meta charset=\"utf-8\" />");
                sb.AppendLine("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">");
                sb.AppendLine("<title>" + nf.NoteFileTitle + "</title>");

                //sb.AppendLine("<link rel = \"stylesheet\" href = \"" + @Globals.ProductionUrl +
                //              "lib/bootstrap/dist/css/open-iconic-bootstrap.css\">");
                //sb.AppendLine("<link rel = \"stylesheet\" href = \"" + @Globals.ProductionUrl +
                //    "lib/bootstrap/dist/css/bootstrap.css\">");

                sb.AppendLine("<link rel = \"stylesheet\" href = \"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">");

                sb.AppendLine("<script src = \"https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js\" ></script >");
                sb.AppendLine("<script src = \"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\" ></script >");
                sb.AppendLine("<script src = \"https://notes2020.drsinder.com/js/prism.min.js\" ></script >");

                sb.AppendLine("<style>");

                // read our local style sheet from a file and output it
                TextReader sr = new StreamReader(_stylePath);
                sb.AppendLine(await sr.ReadToEndAsync());
                sr.Close();

                sb.AppendLine("</style>");
                sb.AppendLine("</head>");
                sb.AppendLine("<body>");
                await sw.WriteAsync(sb.ToString());

                // ready to start  writing content of file
                sb = new StringBuilder();
            }
            if (isHtml)
            {
                sb.Append("<h2>");
            }

            // File Header
            sb.Append("2021 NoteFile " + nf.NoteFileName + " - " + nf.NoteFileTitle);
            sb.Append(" - Created " + DateTime.Now.ToUniversalTime().ToLongDateString() + " " + DateTime.Now.ToUniversalTime().ToShortTimeString());
            sb.Append("   For " + userName);
            if (isHtml)
            {
                sb.Append("</h2>");
                sb.Append("<h4>");
                sb.Append("<a href=\"");
                sb.Append(Globals.ProductionUrl + "NoteDisplay/Create/" + nf.Id +
                          "\" target=\"_blank\">New Base Note</a>");
                sb.Append("</h4>");
            }

            await sw.WriteLineAsync(sb.ToString());

            await sw.WriteLineAsync();

            // get ordered list of basenoteheaders to start process
            List <NoteHeader> bnhl;

            if (model.NoteOrdinal == 0)
            {
                bnhl = await NoteDataManager.GetBaseNoteHeadersForFile(_db, nfid, arcId);
            }
            else
            {
                bnhl = await NoteDataManager.GetBaseNoteHeadersForNote(_db, nfid, arcId, model.NoteOrdinal);
            }
            // loop over each base note in order
            foreach (NoteHeader bnh in bnhl)
            {
                // get content for base note
                NoteHeader nc = await NoteDataManager.GetNoteById(_db, bnh.Id);

                // format it and write it
                await WriteNote(sw, nc, bnh, isHtml, false);

                // get ordered list of responses
                List <NoteHeader> rcl = await NoteDataManager.GetOrderedListOfResponses(_db, nfid, bnh);

                await sw.WriteLineAsync();

                // extra stuff for collapsable responses
                if (isCollapsible && isHtml && rcl.Any())
                {
                    await sw.WriteLineAsync("<div class=\"container\"><div class=\"panel-group\">" +
                                            "<div class=\"panel panel-default\"><div class=\"panel-heading\"><div class=\"panel-title\"><a data-toggle=\"collapse\" href=\"#collapse" +
                                            nc.NoteOrdinal + "\">Toggle " + bnh.ResponseCount + " Response" + (bnh.ResponseCount > 1 ? "s" : "") + "</a></div></div><div id = \"collapse" + nc.NoteOrdinal +
                                            "\" class=\"panel-collapse collapse\"><div class=\"panel-body\">");
                }
                // loop over each respponse for a base note
                foreach (NoteHeader rc in rcl)
                {
                    await WriteNote(sw, rc, bnh, isHtml, true);
                }
                // extra stuff to terminate collapsable responses
                if (isCollapsible && isHtml && rcl.Any())
                {
                    await sw.WriteLineAsync("</div></div></div></div></div> ");
                }
            }

            if (isHtml)  // end the html
            {
                await sw.WriteLineAsync("<script src = \"https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js\" ></script >");

                await sw.WriteLineAsync("<script src = \"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js\" ></script >");

                await sw.WriteLineAsync("<script src = \"https://notes3.ddns.net/js/prism.min.js\" ></script >");

                await sw.WriteLineAsync("</body></html>");
            }

            // make sure all output is written to stream and rewind it
            await sw.FlushAsync();

            ms.Seek(0, SeekOrigin.Begin);
            // send stream to caller
            return(ms);
        }