string editone_preview (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; bool touch = request->session_logic ()->touchEnabled (); string page; Assets_Header header = Assets_Header (translate("Preview"), request); header.setNavigator (); header.setEditorStylesheet (); if (touch) header.jQueryTouchOn (); header.addBreadCrumb (menu_logic_translate_menu (), menu_logic_translate_text ()); header.refresh (5, "index"); page = header.run (); Assets_View view; // Get active Bible, and check read access to it. // If needed, change Bible to one it has read access to. string bible = access_bible_clamp (request, request->database_config_user()->getBible ()); string cls = 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", cls); view.set_variable ("custom_css", Filter_Css::getCss (cls, Fonts_Logic::getFontPath (font), direction, lineheight, letterspacing)); int book = Ipc_Focus::getBook (webserver_request); int chapter = Ipc_Focus::getChapter (webserver_request); //int verse = Ipc_Focus::getVerse (webserver_request); string stylesheet = request->database_config_user()->getStylesheet (); string usfm = request->database_bibles()->getChapter (bible, book, chapter); Editor_Usfm2Html editor_usfm2html; editor_usfm2html.load (usfm); editor_usfm2html.stylesheet (stylesheet); editor_usfm2html.run (); string html = editor_usfm2html.get (); view.set_variable ("html", html); page += view.render ("editone", "preview"); page += Assets_Page::footer (); return page; }
string editverse_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"]); Ipc_Focus::set (request, switchbook, switchchapter, 1); Navigation_Passage::recordHistory (request, switchbook, switchchapter, 1); } string page; Assets_Header header = Assets_Header (translate("Edit USFM"), request); header.setNavigator (); if (touch) header.jQueryTouchOn (); header.notifItOn (); header.addBreadCrumb (menu_logic_translate_menu (), menu_logic_translate_text ()); page = header.run (); Assets_View view; 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); } } // Get active Bible, and check read access to it. // If needed, change Bible to one it has read access to. 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)); string chapterLoaded = locale_logic_text_loaded (); string chapterSaving = locale_logic_text_saving (); string chapterSaved = locale_logic_text_saved (); string chapterRetrying = locale_logic_text_retrying (); string script = "var verseEditorVerseLoaded = '" + chapterLoaded + "';\n" "var verseEditorVerseSaving = '" + chapterSaving + "';\n" "var verseEditorVerseSaved = '" + chapterSaved + "';\n" "var verseEditorChapterRetrying = '" + chapterRetrying + "';\n" "var verseEditorWriteAccess = true;" "var unsentBibleDataTimeoutWarning = '" + bible_logic_unsent_unreceived_data_warning (false) + "';\n"; config_logic_swipe_enabled (webserver_request, script); view.set_variable ("script", script); string cls = 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", cls); view.set_variable ("custom_css", Filter_Css::getCss (cls, Fonts_Logic::getFontPath (font), direction, lineheight, letterspacing)); // Whether to enable fast Bible editor switching. if (request->database_config_user ()->getFastEditorSwitchingAvailable ()) { view.enable_zone ("fastswitcheditor"); } page += view.render ("editverse", "index"); page += Assets_Page::footer (); return page; }
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 changes_changes (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; Database_Modifications database_modifications; bool touch = request->session_logic ()->touchEnabled (); string page; Assets_Header header = Assets_Header (translate("Changes"), request); header.setStylesheet (); header.addBreadCrumb (menu_logic_translate_menu (), menu_logic_translate_text ()); if (touch) header.jQueryTouchOn (); page += header.run (); Assets_View view; string username = request->session_logic()->currentUser (); // Handle AJAX call to remove a change notification. if (request->post.count ("remove")) { int remove = convert_to_int (request->post["remove"]); trash_change_notification (request, remove); database_modifications.deleteNotification (remove); #ifdef HAVE_CLIENT request->database_config_user ()->addRemovedChange (remove); #endif request->database_config_user ()->setChangeNotificationsChecksum (""); return ""; } // Handle AJAX call to navigate to the passage belonging to the change notification. if (request->post.count ("navigate")) { string navigate = request->post["navigate"]; int id = convert_to_int (navigate); Passage passage = database_modifications.getNotificationPassage (id); if (passage.book) { Ipc_Focus::set (request, passage.book, passage.chapter, convert_to_int (passage.verse)); Navigation_Passage::recordHistory (request, passage.book, passage.chapter, convert_to_int (passage.verse)); } // Set the correct default Bible for the user. string bible = database_modifications.getNotificationBible (id); if (!bible.empty ()) request->database_config_user()->setBible (bible); return ""; } // Remove a user's personal changes notifications and their matching change notifications in the Bible. string matching = request->query ["matching"]; if (!matching.empty ()) { vector <int> ids = database_modifications.clearNotificationMatches (username, matching, changes_bible_category ()); #ifdef HAVE_CLIENT // Client records deletions for sending to the Cloud. for (auto & id : ids) { request->database_config_user ()->addRemovedChange (id); } #endif // Clear checksum cache. request->database_config_user ()->setChangeNotificationsChecksum (""); } // Remove all the personal change notifications. if (request->query.count ("personal")) { vector <int> ids = database_modifications.getNotificationTeamIdentifiers (username, changes_personal_category (), true); for (auto id : ids) { trash_change_notification (request, id); database_modifications.deleteNotification (id); #ifdef HAVE_CLIENT request->database_config_user ()->addRemovedChange (id); #endif request->database_config_user ()->setChangeNotificationsChecksum (""); } } // Remove all the Bible change notifications. if (request->query.count ("bible")) { vector <int> ids = database_modifications.getNotificationTeamIdentifiers (username, changes_bible_category (), true); for (auto id : ids) { trash_change_notification (request, id); database_modifications.deleteNotification (id); #ifdef HAVE_CLIENT request->database_config_user ()->addRemovedChange (id); #endif request->database_config_user ()->setChangeNotificationsChecksum (""); } } // Remove all the change notifications made by a certain user. if (request->query.count ("dismiss")) { string user = request->query ["dismiss"]; vector <int> ids = database_modifications.getNotificationTeamIdentifiers (username, user, true); for (auto id : ids) { trash_change_notification (request, id); database_modifications.deleteNotification (id); #ifdef HAVE_CLIENT request->database_config_user ()->addRemovedChange (id); #endif request->database_config_user ()->setChangeNotificationsChecksum (""); } } // Read the identifiers. // Limit the number of results to keep the page reasonably fast even if there are many notifications. vector <int> personal_ids = database_modifications.getNotificationPersonalIdentifiers (username, changes_personal_category (), true); vector <int> bible_ids = database_modifications.getNotificationTeamIdentifiers (username, changes_bible_category (), true); vector <int> ids = database_modifications.getNotificationIdentifiers (username, true); string textblock; for (auto id : ids) { Passage passage = database_modifications.getNotificationPassage (id); string link = filter_passage_link_for_opening_editor_at (passage.book, passage.chapter, passage.verse); string category = database_modifications.getNotificationCategory (id); if (category == changes_personal_category ()) category = emoji_smiling_face_with_smiling_eyes (); if (category == changes_bible_category ()) category = emoji_open_book (); string modification = database_modifications.getNotificationModification (id); textblock.append ("<div id=\"entry" + convert_to_string (id) + "\">\n"); textblock.append ("<a href=\"expand\" id=\"expand" + convert_to_string (id) + "\">" + emoji_file_folder () + "</a>\n"); textblock.append ("<a href=\"remove\" id=\"remove" + convert_to_string (id) + "\">" + emoji_wastebasket () + "</a>\n"); textblock.append (link + "\n"); textblock.append (category + "\n"); textblock.append (modification + "\n"); textblock.append ("</div>\n"); } view.set_variable ("textblock", textblock); string loading = "\"" + translate("Loading ...") + "\""; string script = "var loading = " + loading + ";"; config_logic_swipe_enabled (webserver_request, script); view.set_variable ("script", script); // Enable links to dismiss categories of notifications depending on whether there's anything to dismiss. if (!personal_ids.empty ()) view.enable_zone ("personal"); if (!bible_ids.empty ()) view.enable_zone ("bible"); // Add links to clear the notifications from the individual contributors. string dismissblock; vector <string> categories = database_modifications.getCategories (); for (auto & category : categories) { if (category == changes_personal_category ()) continue; if (category == changes_bible_category ()) continue; string user = category; vector <int> ids = database_modifications.getNotificationTeamIdentifiers (username, user, true); if (!ids.empty ()) { dismissblock.append ("<p>* <a href=\"?dismiss="); dismissblock.append (user); dismissblock.append ("\">"); dismissblock.append (user); dismissblock.append (": "); dismissblock.append (translate("all of them")); dismissblock.append (": "); dismissblock.append (convert_to_string (ids.size ())); dismissblock.append ("</a></p>\n"); } } view.set_variable ("dismissblock", dismissblock); // Add links to clear matching notifications of the various users. for (auto & category : categories) { if (category == changes_bible_category ()) continue; string user = category; vector <int> personal_ids = database_modifications.getNotificationTeamIdentifiers (username, user, true); string icon = category; if (category == changes_personal_category ()) icon = emoji_smiling_face_with_smiling_eyes (); if (!personal_ids.empty () && !bible_ids.empty ()) { view.add_iteration ("matching", { make_pair ("user", user), make_pair ("icon", icon) } ); } } view.set_variable ("VERSION", config_logic_version ()); if (touch) view.enable_zone ("touch"); view.set_variable ("interlinks", changes_interlinks (webserver_request, changes_changes_url ())); page += view.render ("changes", "changes"); page += Assets_Page::footer (); return page; }