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; }
// Runs the header. string Assets_Header::run () { Webserver_Request * request = (Webserver_Request *) webserver_request; string page; // Include the software version number in the stylesheet and javascript URL // to refresh the browser's cache after a software upgrade. view->set_variable("VERSION", config_logic_version ()); if (includeJQueryUI) { view->enable_zone ("include_jquery_ui"); } if (includeJQueryMobileTouch) { view->enable_zone ("include_jquery_mobile_touch"); } if (request->session_logic ()->touchEnabled ()) { touchCSSOn(); } if (!request->session_logic ()->loggedIn ()) { touchCSSOn(); } if (includeTouchCSS) { view->enable_zone ("include_touch_css"); } else { view->enable_zone ("include_mouse_css"); } if (includeNotifIt) { view->enable_zone ("include_notif_it"); } string headlines; for (auto & headline : headLines) { if (!headlines.empty ()) headlines.append ("\n"); headlines.append (headline); } view->set_variable ("head_lines", headlines); if (!includedStylesheet.empty ()) { view->enable_zone ("include_stylesheet"); view->set_variable ("included_stylesheet", includedStylesheet); } if (!includedEditorStylesheet.empty ()) { view->enable_zone ("include_editor_stylesheet"); view->set_variable ("included_editor_stylesheet", includedEditorStylesheet); } bool basic_mode = config_logic_basic_mode (webserver_request); string basicadvanced; if (basic_mode) basicadvanced = "basic"; else basicadvanced = "advanced"; view->set_variable ("basicadvanced", basicadvanced); if (displayTopbar ()) { view->enable_zone ("display_topbar"); // In basic mode there's no back button in a bare browser. if (basic_mode) { view->disable_zone ("bare_browser"); } // The start button to be displayed only when there's no menu. bool start_button = true; string menublock; string item = request->query ["item"]; bool main_menu_always_on = false; if (item.empty ()) if (request->database_config_user ()->getMainMenuAlwaysVisible ()) main_menu_always_on = true; if ((item == "main") || main_menu_always_on) { if (basic_mode) { menublock = menu_logic_basic_categories (webserver_request); } else { string devnull; menublock = menu_logic_main_categories (webserver_request, devnull); } start_button = false; } else if (item == menu_logic_translate_menu ()) { menublock = menu_logic_translate_category (webserver_request); } else if (item == menu_logic_search_menu ()) { menublock = menu_logic_search_category (webserver_request); } else if (item == menu_logic_tools_menu ()) { menublock = menu_logic_tools_category (webserver_request); } else if (item == menu_logic_settings_menu ()) { menublock = menu_logic_settings_category (webserver_request); } else if (item == menu_logic_settings_resources_menu ()) { menublock = menu_logic_settings_resources_category (webserver_request); } else if (item == menu_logic_settings_styles_menu ()) { menublock = menu_logic_settings_styles_category (webserver_request); } else if (item == "help") { menublock = menu_logic_help_category (webserver_request); } view->set_variable ("mainmenu", menublock); if (start_button) { view->enable_zone ("start_button"); string tooltip; menu_logic_main_categories (webserver_request, tooltip); view->set_variable ("starttooltip", tooltip); } if (!fadingmenu.empty ()) { view->enable_zone ("fading_menu"); view->set_variable ("fadingmenu", fadingmenu); string delay = convert_to_string (request->database_config_user ()->getDesktopMenuFadeoutDelay ()) + "000"; view->set_variable ("fadingmenudelay", delay); fadingmenu.clear (); } if (displayNavigator) { view->enable_zone ("display_navigator"); // string bible = access_bible_clamp (request, request->database_config_user()->getBible ()); // The clamping above does not work for public feedback as it would reset the Bible always. string bible = request->database_config_user()->getBible (); view->set_variable ("navigation_code", Navigation_Passage::code (bible, true)); } } vector <string> embedded_css; int fontsize = request->database_config_user ()->getGeneralFontSize (); if (fontsize != 100) { embedded_css.push_back ("body { font-size: " + convert_to_string (fontsize) + "%; }"); } fontsize = request->database_config_user ()->getMenuFontSize (); if (fontsize != 100) { embedded_css.push_back (".menu { font-size: " + convert_to_string (fontsize) + "%; }"); } fontsize = request->database_config_user ()->getBibleEditorsFontSize (); if (fontsize != 100) { embedded_css.push_back (".bibleeditor { font-size: " + convert_to_string (fontsize) + "% !important; }"); } fontsize = request->database_config_user ()->getResourcesFontSize (); if (fontsize != 100) { embedded_css.push_back (".resource { font-size: " + convert_to_string (fontsize) + "% !important; }"); } fontsize = request->database_config_user ()->getHebrewFontSize (); if (fontsize != 100) { embedded_css.push_back (".hebrew { font-size: " + convert_to_string (fontsize) + "%!important; }"); } fontsize = request->database_config_user ()->getGreekFontSize (); if (fontsize != 100) { embedded_css.push_back (".greek { font-size: " + convert_to_string (fontsize) + "%!important; }"); } if (!embedded_css.empty ()) { view->set_variable ("embedded_css", filter_string_implode (embedded_css, "\n")); } if (request->database_config_user ()->getDisplayBreadcrumbs ()) { if (!breadcrumbs.empty ()) { // No bread crumbs in basic mode. // The crumbs would be incorrect anyway, because they show the trail of advanced mode. if (!config_logic_basic_mode (webserver_request)) { string track; track.append ("<a href=\"/"); track.append (index_index_url ()); track.append ("\">"); track.append (menu_logic_menu_text ("")); track.append ("</a>"); for (auto & crumb : breadcrumbs) { track.append (" » "); if (!crumb.first.empty ()) { track.append ("<a href=\"/"); track.append (menu_logic_menu_url (crumb.first)); track.append ("\">"); } track.append (crumb.second); if (!crumb.first.empty ()) { track.append ("</a>"); } } view->set_variable ("breadcrumbs", track); } } } page += view->render("assets", "xhtml_start"); page += view->render("assets", "header"); page += view->render("assets", "workspacewrapper_start"); return page; }
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 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; }