string journal_index (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; int userLevel = request->session_logic()->currentLevel (); string filename = request->query ["filename"]; if (!filename.empty ()) { return journal_index_ajax (request, filename); } Database_Logs database_logs = Database_Logs (); Assets_Header header = Assets_Header (translate ("Journal"), webserver_request); header.addBreadCrumb (menu_logic_tools_menu (), menu_logic_tools_text ()); string page = header.run (); Assets_View view; if (request->query.count ("clear")) { database_logs.clear (); // If the logbook has been cleared on a mobile device, and the screen shuts off, // and then the user activates the screen on the mobile device, // the logbook will then again be cleared, because that was the last opened URL. // Redirecting the browser to a clean URL fixes this behaviour. redirect_browser (request, journal_index_url ()); return ""; } string lastfilename; vector <string> entries = database_logs.get (lastfilename); string lines; for (auto entry : entries) { int entryLevel = convert_to_int (entry); // Cloud: Pay attention to only rendering journal entries of sufficient user level. // Client: Render any journal entry. if (!client_logic_client_enabled ()) { if (entryLevel > userLevel) continue; } entry = render_journal_entry (entry); lines.append ("<p>"); lines.append (entry); lines.append ("</p>\n"); } view.set_variable ("lines", lines); // Pass the filename of the most recent entry to javascript // for use by the AJAX calls for getting subsequent journal entries. // It should be passed as a String object in JavaScript. // Because when it were passed as an Int, JavaScript would round the value off. // And rounding it off often led to double journal entries. string script = "var filename = \"" + lastfilename + "\";"; view.set_variable ("script", script); page += view.render ("journal", "index"); page += Assets_Page::footer (); return page; }
string checks_index (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; Database_Check database_check; string page; Assets_Header header = Assets_Header (translate("Checks"), webserver_request); header.addBreadCrumb (menu_logic_tools_menu (), menu_logic_tools_text ()); page = header.run (); Assets_View view; if (request->query.count ("approve")) { int approve = convert_to_int (request->query["approve"]); database_check.approve (approve); view.set_variable ("success", translate("The entry was suppressed.")); } if (request->query.count ("delete")) { int erase = convert_to_int (request->query["delete"]); database_check.erase (erase); view.set_variable ("success", translate("The entry was deleted for just now.")); } // Get the Bibles the user has write-access to. vector <int> bibleIDs; vector <string> bibles = request->database_bibles()->getBibles (); for (auto bible : bibles) { if (access_bible_write (webserver_request, bible)) { int id = request->database_bibles()->getID (bible); bibleIDs.push_back (id); } } string resultblock; vector <Database_Check_Hit> hits = database_check.getHits (); for (auto hit : hits) { int bibleID = hit.bible; if (find (bibleIDs.begin(), bibleIDs.end (), bibleID) != bibleIDs.end ()) { int id = hit.rowid; string bible = filter_string_sanitize_html (request->database_bibles()->getName (bibleID)); int book = hit.book; int chapter = hit.chapter; int verse = hit.verse; string link = filter_passage_link_for_opening_editor_at (book, chapter, convert_to_string (verse)); string information = filter_string_sanitize_html (hit.data); resultblock.append ("<p>\n"); resultblock.append ("<a href=\"index?approve=" + convert_to_string (id) + "\"> ✔ </a>\n"); resultblock.append ("<a href=\"index?delete=" + convert_to_string (id) + "\"> ✗ </a>\n"); resultblock.append (bible); resultblock.append (" "); resultblock.append (link); resultblock.append (" "); resultblock.append (information); resultblock.append ("</p>\n"); } } view.set_variable ("resultblock", resultblock); page += view.render ("checks", "index"); page += Assets_Page::footer (); return page; }
string sprint_index (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; Database_Sprint database_sprint; string page; Assets_Header header = Assets_Header (translate("Sprint"), request); header.addBreadCrumb (menu_logic_tools_menu (), menu_logic_tools_text ()); page = header.run (); Assets_View view; if (request->query.count ("previoussprint")) { int month = request->database_config_user()->getSprintMonth (); int year = request->database_config_user()->getSprintYear (); filter_date_get_previous_month (month, year); request->database_config_user()->setSprintMonth (month); request->database_config_user()->setSprintYear (year); } if (request->query.count ("currentprint")) { request->database_config_user()->setSprintMonth (filter_date_numerical_month (filter_date_seconds_since_epoch ())); request->database_config_user()->setSprintYear (filter_date_numerical_year (filter_date_seconds_since_epoch ())); } if (request->query.count ("nextsprint")) { int month = request->database_config_user()->getSprintMonth (); int year = request->database_config_user()->getSprintYear (); filter_date_get_next_month (month, year); request->database_config_user()->setSprintMonth (month); request->database_config_user()->setSprintYear (year); } string bible = access_bible_clamp (webserver_request, request->database_config_user()->getBible ()); int month = request->database_config_user()->getSprintMonth (); int year = request->database_config_user()->getSprintYear (); if (request->post.count ("id")) { string id = request->post ["id"]; string checked = request->post ["checked"]; if (id.length () >= 9) { // Remove "task". id.erase (0, 4); // Convert the fragment to an integer. int identifier = convert_to_int (id); // Find the fragment "box". size_t pos = id.find ("box"); if (pos != string::npos) { // Remove the fragment "box". id.erase (0, pos + 3); // Convert the box to an integer. int box = convert_to_int (id); string categorytext = Database_Config_Bible::getSprintTaskCompletionCategories (bible); vector <string> categories = filter_string_explode (categorytext, '\n'); int category_count = categories.size (); float category_percentage = 100 / category_count; int percentage; bool on = (checked == "true"); if (on) percentage = round ((box + 1) * category_percentage); else percentage = round (box * category_percentage); database_sprint.updateComplete (identifier, percentage); } } return ""; } if (request->post.count ("add")) { string title = request->post ["add"]; database_sprint.storeTask (bible, year, month, title); view.set_variable ("success", translate("New task added")); // Focus the entry for adding tasks only in case a new task was added. view.set_variable ("autofocus", "autofocus"); } if (request->query.count ("mail")) { string mail = request->query ["mail"]; sprint_burndown (bible, true); view.set_variable ("success", translate("The information was mailed to the subscribers")); } if (request->query.count ("bible")) { bible = request->query ["bible"]; if (bible == "") { Dialog_List dialog_list = Dialog_List ("index", translate("Select which Bible to display the Sprint for"), "", ""); vector <string> bibles = access_bible_bibles (request); for (auto & bible : bibles) { dialog_list.add_row (bible, "bible", bible); } page += dialog_list.run(); return page; } else { request->database_config_user()->setBible (bible); } } bible = access_bible_clamp (webserver_request, request->database_config_user()->getBible ()); int id = convert_to_int (request->query ["id"]); if (request->query.count ("remove")) { database_sprint.deleteTask (id); view.set_variable ("success", translate("The task was removed")); } if (request->query.count ("moveback")) { filter_date_get_previous_month (month, year); database_sprint.updateMonthYear (id, month, year); view.set_variable ("success", translate("The task was moved to the previous sprint")); request->database_config_user()->setSprintMonth (month); request->database_config_user()->setSprintYear (year); } if (request->query.count ("moveforward")) { filter_date_get_next_month (month, year); database_sprint.updateMonthYear (id, month, year); view.set_variable ("success", translate("The task was moved to the next sprint")); request->database_config_user()->setSprintMonth (month); request->database_config_user()->setSprintYear (year); } if (request->post.count ("categories")) { string categories = request->post ["categories"]; vector <string> categories2; categories = filter_string_trim (categories); vector <string> vcategories = filter_string_explode (categories, '\n'); for (auto category : vcategories) { category = filter_string_trim (category); if (category != "") categories2.push_back (category); } categories = filter_string_implode (categories2, "\n"); Database_Config_Bible::setSprintTaskCompletionCategories (bible, categories); } view.set_variable ("bible", bible); view.set_variable ("sprint", locale_logic_month (month) + " " + convert_to_string (year)); string categorytext = Database_Config_Bible::getSprintTaskCompletionCategories (bible); view.set_variable ("categorytext", categorytext); vector <string> vcategories = filter_string_explode (categorytext, '\n'); string categories; for (auto category : vcategories) { categories.append ("<td>" + category + "</td>\n"); } view.set_variable ("categories", categories); string tasks; vector <int> vtasks = database_sprint.getTasks (bible, year, month); for (auto & id : vtasks) { string title = filter_string_sanitize_html (database_sprint.getTitle (id)); int percentage = database_sprint.getComplete (id); tasks.append ("<tr id=\"a" + convert_to_string (id) + "\">\n"); tasks.append ("<td><a href=\"?id=" + convert_to_string (id) + "&remove=\">" + emoji_wastebasket () + "</a></td>\n"); tasks.append ("<td></td>\n"); tasks.append ("<td><a href=\"?id=" + convert_to_string (id) + "&moveback=\"> « </a></td>\n"); tasks.append ("<td>" + title + "</td>\n"); int category_count = vcategories.size(); float category_percentage = 100 / category_count; for (size_t i2 = 0; i2 < vcategories.size (); i2++) { int high = round ((i2 + 1) * category_percentage); tasks.append ("<td>\n"); tasks.append ("<input type=\"checkbox\" id=\"task"); tasks.append (convert_to_string (id)); tasks.append ("box"); tasks.append (convert_to_string (i2)); tasks.append ("\""); if (percentage >= high) tasks.append (" checked"); else tasks.append (""); tasks.append (">"); tasks.append ("</td>\n"); } tasks.append ("<td><a href=\"?id=" + convert_to_string (id) + "&moveforward=\"> » </a></td>\n"); tasks.append ("</tr>\n"); } view.set_variable ("tasks", tasks); view.set_variable ("chart", sprint_create_burndown_chart (bible, year, month)); page += view.render ("sprint", "index"); page += Assets_Page::footer (); return page; }