string edit_index (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; bool touch = request->session_logic ()->touchEnabled (); if (request->query.count ("switchbook") && request->query.count ("switchchapter")) { int switchbook = convert_to_int (request->query ["switchbook"]); int switchchapter = convert_to_int (request->query ["switchchapter"]); int switchverse = 1; if (request->query.count ("switchverse")) switchverse = convert_to_int (request->query ["switchverse"]); Ipc_Focus::set (request, switchbook, switchchapter, switchverse); Navigation_Passage::recordHistory (request, switchbook, switchchapter, switchverse); } string page; Assets_Header header = Assets_Header (translate("Edit"), request); header.setNavigator (); header.setEditorStylesheet (); if (touch) header.jQueryTouchOn (); header.notifItOn (); header.addBreadCrumb (menu_logic_translate_menu (), menu_logic_translate_text ()); page = header.run (); if (request->query.count ("changebible")) { string changebible = request->query ["changebible"]; if (changebible == "") { Dialog_List dialog_list = Dialog_List ("index", translate("Select which Bible to open in the editor"), "", ""); vector <string> bibles = access_bible_bibles (request); for (auto & bible : bibles) { dialog_list.add_row (bible, "changebible", bible); } page += dialog_list.run(); return page; } else { request->database_config_user()->setBible (changebible); // Going to another Bible, ensure that the focused book exists there. int book = Ipc_Focus::getBook (request); vector <int> books = request->database_bibles()->getBooks (changebible); if (find (books.begin(), books.end(), book) == books.end()) { if (!books.empty ()) book = books [0]; else book = 0; Ipc_Focus::set (request, book, 1, 1); } } } Assets_View view; // Active Bible, and check access. string bible = access_bible_clamp (request, request->database_config_user()->getBible ()); if (request->query.count ("bible")) bible = access_bible_clamp (request, request->query ["bible"]); view.set_variable ("bible", bible); // Store the active Bible in the page's javascript. view.set_variable ("navigationCode", Navigation_Passage::code (bible)); int verticalCaretPosition = request->database_config_user ()->getVerticalCaretPosition (); string script = "var editorChapterLoaded = '" + locale_logic_text_loaded () + "';\n" "var editorChapterSaving = '" + locale_logic_text_saving () + "';\n" "var editorChapterSaved = '" + locale_logic_text_saved () + "';\n" "var editorChapterRetrying = '" + locale_logic_text_retrying () + "';\n" "var editorChapterReformat = '" + locale_logic_text_reformat () + "';\n" "var editorWriteAccess = true;\n" "var verticalCaretPosition = " + convert_to_string (verticalCaretPosition) + ";\n" "var unsentBibleDataTimeoutWarning = '" + bible_logic_unsent_unreceived_data_warning (false) + "';\n"; config_logic_swipe_enabled (webserver_request, script); view.set_variable ("script", script); string clss = Filter_Css::getClass (bible); string font = Fonts_Logic::getTextFont (bible); int direction = Database_Config_Bible::getTextDirection (bible); int lineheight = Database_Config_Bible::getLineHeight (bible); int letterspacing = Database_Config_Bible::getLetterSpacing (bible); view.set_variable ("custom_class", clss); view.set_variable ("custom_css", Filter_Css::getCss (clss, Fonts_Logic::getFontPath (font), direction, lineheight, letterspacing)); // In basic mode the editor has no controls and fewer indicators. // In basic mode, the user can just edit text, and cannot style it. bool basic_mode = config_logic_basic_mode (webserver_request); if (!basic_mode) view.enable_zone ("advancedmode"); // Whether to enable fast Bible editor switching. if (!basic_mode && request->database_config_user ()->getFastEditorSwitchingAvailable ()) { view.enable_zone ("fastswitcheditor"); } // Whether to enable the styles button. if (request->database_config_user ()->getEnableStylesButtonVisualEditors ()) { view.enable_zone ("stylesbutton"); } page += view.render ("edit", "index"); page += Assets_Page::footer (); return page; }
string Navigation_Passage::getNavigator (void * webserver_request, string bible) { Webserver_Request * request = (Webserver_Request *) webserver_request; Database_Navigation database_navigation; string user = request->session_logic()->currentUser (); bool passage_clipped = false; bool basic_mode = config_logic_basic_mode (webserver_request); string fragment; // Links to go back and forward are available only when there's available history to go to. // In basic mode they are not there. if (!basic_mode) { fragment.append ("<span>"); if (database_navigation.previousExists (user)) { fragment.append ("<a id=\"navigateback\" href=\"navigateback\" title=\"" + translate("Back") + "\">↶</a>"); } fragment.append ("</span>"); fragment.append ("<span>"); fragment.append (" "); if (database_navigation.nextExists (user)) { fragment.append ("<a id=\"navigateforward\" href=\"navigateforward\" title=\"" + translate("Forward") + "\">↷</a>"); } fragment.append ("</span>"); fragment.append ("\n"); } int book = Ipc_Focus::getBook (request); // The book should exist in the Bible. if (bible != "") { vector <int> books = request->database_bibles()->getBooks (bible); if (find (books.begin(), books.end(), book) == books.end()) { if (!books.empty ()) book = books [0]; else book = 0; passage_clipped = true; } } string bookName = Database_Books::getEnglishFromId (book); bookName = translate (bookName); fragment.append ("<span><a id='selectbook' href='selectbook' title='" + translate ("Select book") + "'>" + bookName + "</a></span>"); int chapter = Ipc_Focus::getChapter (request); // The chapter should exist in the book. if (bible != "") { vector <int> chapters = request->database_bibles()->getChapters (bible, book); if (find (chapters.begin(), chapters.end(), chapter) == chapters.end()) { if (!chapters.empty()) chapter = chapters [0]; else chapter = 1; passage_clipped = true; } } fragment.append ("<span><a id=\"selectchapter\" href=\"selectchapter\" title=\"" + translate ("Select chapter") + "\"> " + convert_to_string (chapter) + " </a></span>"); int verse = Ipc_Focus::getVerse (request); bool next_verse_is_available = true; // The verse should exist in the chapter. if (bible != "") { string usfm = request->database_bibles()->getChapter (bible, book, chapter); vector <int> verses = usfm_get_verse_numbers (usfm); if (!in_array (verse, verses)) { if (!verses.empty()) verse = verses [0]; else verse = 1; passage_clipped = true; } if (!verses.empty ()) { if (verse >= verses.back ()) { next_verse_is_available = false; } } } fragment.append ("<span><a"); if (!basic_mode) { fragment.append (" class=\"previousverse\""); } if (verse) { // A previous verse (0) is assumed to be available. fragment.append (" id=\"previousverse\" href=\"previousverse\" title=\"" + translate ("Go to previous verse") + "\""); } fragment.append ("> « </a></span>"); fragment.append ("<span><a"); if (!basic_mode) fragment.append (" class=\"selectverse\""); fragment.append (" id=\"selectverse\" href=\"selectverse\" title=\"" + translate ("Select verse") + "\"> " + convert_to_string (verse) + " </a></span>"); fragment.append ("<span><a"); if (!basic_mode) fragment.append (" class=\"nextverse\""); if (next_verse_is_available) { fragment.append (" id=\"nextverse\" href=\"nextverse\" title=\"" + translate ("Go to next verse") + "\""); } fragment.append ("> » </a></span>"); // Store book / chapter / verse if they were clipped. if (passage_clipped) { Ipc_Focus::set (request, book, chapter, verse); } // The result. return fragment; }
// 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 notes_index (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; Database_Notes database_notes (webserver_request); string page; Assets_Header header = Assets_Header (translate("Consultation Notes"), request); header.setNavigator (); header.addBreadCrumb (menu_logic_translate_menu (), menu_logic_translate_text ()); page = header.run(); Assets_View view; string error; string success; // Presets for notes selectors. // This is for the daily statistics and the workspace. if (request->query.count ("presetselection")) { request->database_config_user()->setConsultationNotesPassageSelector (3); request->database_config_user()->setConsultationNotesEditSelector (0); request->database_config_user()->setConsultationNotesNonEditSelector (0); request->database_config_user()->setConsultationNotesStatusSelector (""); request->database_config_user()->setConsultationNotesBibleSelector (""); request->database_config_user()->setConsultationNotesAssignmentSelector (""); request->database_config_user()->setConsultationNotesSubscriptionSelector (0); request->database_config_user()->setConsultationNotesSeveritySelector (-1); request->database_config_user()->setConsultationNotesTextSelector (0); string preset_selector = request->query ["presetselection"]; if (preset_selector == "assigned") { request->database_config_user()->setConsultationNotesAssignmentSelector (request->session_logic()->currentUser ()); } if (preset_selector == "subscribed") { request->database_config_user()->setConsultationNotesSubscriptionSelector (1); } if (preset_selector == "subscribeddayidle") { request->database_config_user()->setConsultationNotesSubscriptionSelector (1); request->database_config_user()->setConsultationNotesNonEditSelector (1); } if (preset_selector == "subscribedweekidle") { request->database_config_user()->setConsultationNotesSubscriptionSelector (1); request->database_config_user()->setConsultationNotesNonEditSelector (3); } if (preset_selector == "forverse") { request->database_config_user()->setConsultationNotesPassageSelector (0); } } int level = request->session_logic ()->currentLevel (); // Manager roles and higher can do mass updates on the notes. if (level >= Filter_Roles::manager ()) { // No mass updates in basic mode. if (!config_logic_basic_mode (webserver_request)) { view.enable_zone ("update"); } } // Whether the user can create a new note. if (access_logic_privilege_create_comment_notes (webserver_request)) { view.enable_zone ("create"); } page += view.render ("notes", "index"); page += Assets_Page::footer (); return page; }