string styles_indexm (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; string page; Assets_Header header = Assets_Header (translate("Styles"), webserver_request); header.addBreadCrumb (menu_logic_settings_menu (), menu_logic_settings_text ()); header.addBreadCrumb (menu_logic_settings_styles_menu (), menu_logic_styles_text ()); page = header.run (); Assets_View view; Database_Styles database_styles; string username = request->session_logic ()->currentUser (); int userlevel = request->session_logic ()->currentLevel (); if (request->post.count ("new")) { string name = request->post["entry"]; // Remove spaces at the ends of the name for the new stylesheet. // Because predictive keyboards can add a space to the name, // and the stylesheet system is not built for whitespace at the start / end of the name of the stylesheet. name = filter_string_trim (name); vector <string> existing = database_styles.getSheets (); if (find (existing.begin(), existing.end (), name) != existing.end ()) { page += Assets_Page::error (translate("This stylesheet already exists")); } else { database_styles.createSheet (name); database_styles.grantWriteAccess (username, name); styles_sheets_create_all (); page += Assets_Page::success (translate("The stylesheet has been created")); } } if (request->query.count ("new")) { Dialog_Entry dialog_entry = Dialog_Entry ("indexm", translate("Please enter the name for the new stylesheet"), "", "new", ""); page += dialog_entry.run(); return page; } if (request->query.count ("delete")) { string del = request->query ["delete"]; if (del != "") { string confirm = request->query ["confirm"]; if (confirm == "yes") { bool write = database_styles.hasWriteAccess (username, del); if (userlevel >= Filter_Roles::admin ()) write = true; if (write) { database_styles.deleteSheet (del); database_styles.revokeWriteAccess ("", del); page += Assets_Page::success (translate("The stylesheet has been deleted")); } } if (confirm == "") { Dialog_Yes dialog_yes = Dialog_Yes ("indexm", translate("Would you like to delete this stylesheet?")); dialog_yes.add_query ("delete", del); page += dialog_yes.run (); return page; } } } // Delete empty sheet that may have been there. database_styles.deleteSheet (""); vector <string> sheets = database_styles.getSheets(); vector <string> sheetblock; for (auto & sheet : sheets) { sheetblock.push_back ("<p>"); sheetblock.push_back (sheet); bool editable = database_styles.hasWriteAccess (username, sheet); if (userlevel >= Filter_Roles::admin ()) editable = true; // Cannot edit the Standard stylesheet. if (sheet == styles_logic_standard_sheet ()) editable = false; if (editable) { sheetblock.push_back ("<a href=\"sheetm?name=" + sheet + "\">[" + translate("edit") + "]</a>"); } sheetblock.push_back ("</p>"); } view.set_variable ("sheetblock", filter_string_implode (sheetblock, "\n")); page += view.render ("styles", "indexm"); page += Assets_Page::footer (); return page; }
string bible_manage (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; string page; Assets_Header header = Assets_Header (translate("Bibles"), webserver_request); header.addBreadCrumb (menu_logic_settings_menu (), menu_logic_settings_text ()); page = header.run (); Assets_View view; string success_message; string error_message; // New Bible handler. if (request->query.count ("new")) { Dialog_Entry dialog_entry = Dialog_Entry ("manage", translate("Please enter a name for the new empty Bible"), "", "new", ""); page += dialog_entry.run (); return page; } if (request->post.count ("new")) { string bible = request->post ["entry"]; vector <string> bibles = request->database_bibles ()->getBibles (); if (find (bibles.begin(), bibles.end(), bible) != bibles.end()) { error_message = translate("This Bible already exists"); } else { request->database_bibles ()->createBible (bible); // Check / grant access. if (!access_bible_write (request, bible)) { string me = request->session_logic ()->currentUser (); Database_Privileges::setBible (me, bible, true); } success_message = translate("The Bible was created"); // Creating a Bible removes any Sample Bible that might have been there. if (!config_logic_demo_enabled ()) { request->database_bibles ()->deleteBible (demo_sample_bible_name ()); search_logic_delete_bible (demo_sample_bible_name ()); } } } // Copy Bible handler. if (request->query.count ("copy")) { string copy = request->query["copy"]; Dialog_Entry dialog_entry = Dialog_Entry ("manage", translate("Please enter a name for where to copy the Bible to"), "", "", "A new Bible will be created with the given name, and the current Bible copied to it"); dialog_entry.add_query ("origin", copy); page += dialog_entry.run (); return page; } if (request->query.count ("origin")) { string origin = request->query["origin"]; if (request->post.count ("entry")) { string destination = request->post["entry"]; vector <string> bibles = request->database_bibles ()->getBibles (); if (find (bibles.begin(), bibles.end(), destination) != bibles.end()) { error_message = translate("Cannot copy the Bible because the destination Bible already exists."); } else { // User needs read access to the original. if (access_bible_read (request, origin)) { request->database_bibles ()->createBible (destination); vector <int> books = request->database_bibles ()->getBooks (origin); for (auto & book : books) { vector <int> chapters = request->database_bibles ()->getChapters (origin, book); for (auto & chapter : chapters) { string data = request->database_bibles ()->getChapter (origin, book, chapter); Bible_Logic::storeChapter (destination, book, chapter, data); } } success_message = translate("The Bible was copied."); // Check / grant access to destination Bible. if (!access_bible_write (request, destination)) { string me = request->session_logic ()->currentUser (); Database_Privileges::setBible (me, destination, true); } // Creating a Bible removes any Sample Bible that might have been there. if (!config_logic_demo_enabled ()) { request->database_bibles ()->deleteBible (demo_sample_bible_name ()); search_logic_delete_bible (demo_sample_bible_name ()); } } } } } // Delete Bible handler. if (request->query.count ("delete")) { string bible = request->query ["delete"]; string confirm = request->query ["confirm"]; if (confirm == "yes") { // User needs write access for delete operation. if (access_bible_write (request, bible)) { Bible_Logic::deleteBible (bible); string gitdirectory = filter_git_directory (bible); if (file_exists (gitdirectory)) { filter_url_rmdir (gitdirectory); } // Remove associated settings and privileges. Database_Privileges::removeBible (bible); Database_Config_Bible::remove (bible); } else { page += Assets_Page::error ("Insufficient privileges to complete action"); } } if (confirm == "") { Dialog_Yes dialog_yes = Dialog_Yes ("manage", translate("Would you like to delete this Bible?") + " (" + bible + ")"); dialog_yes.add_query ("delete", bible); page += dialog_yes.run (); return page; } } view.set_variable ("success_message", success_message); view.set_variable ("error_message", error_message); vector <string> bibles = access_bible_bibles (request); string bibleblock; for (auto & bible : bibles) { bibleblock.append ("<li><a href=\"settings?bible=" + bible + "\">" + bible + "</a></li>\n"); } view.set_variable ("bibleblock", bibleblock); if (!client_logic_client_enabled ()) view.enable_zone ("server"); page += view.render ("bible", "manage"); page += Assets_Page::footer (); return page; }
string resource_manage (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; string page; Assets_Header header = Assets_Header (translate("USFM Resources"), request); header.addBreadCrumb (menu_logic_settings_menu (), menu_logic_settings_text ()); page = header.run (); Assets_View view; Database_UsfmResources database_usfmresources = Database_UsfmResources (); // Delete resource. string remove = request->query ["delete"]; if (remove != "") { string confirm = request->query ["confirm"]; if (confirm == "") { Dialog_Yes dialog_yes = Dialog_Yes ("manage", translate("Would you like to delete this resource?")); dialog_yes.add_query ("delete", remove); page += dialog_yes.run (); return page; } if (confirm == "yes") { if (access_bible_write (request, remove)) { database_usfmresources.deleteResource (remove); // The Cloud updates the list of available USFM resources for the clients. tasks_logic_queue (LISTUSFMRESOURCES); } else { view.set_variable ("error", translate("You do not have write access to this resource")); } } } // Convert resource. string convert = request->query ["convert"]; if (convert != "") { string confirm = request->query ["confirm"]; if (confirm == "") { Dialog_Yes dialog_yes = Dialog_Yes ("manage", translate("Would you like to convert this resource to a Bible?")); dialog_yes.add_query ("convert", convert); page += dialog_yes.run (); return page; } if (confirm == "yes") { if (access_bible_write (request, convert)) { tasks_logic_queue (CONVERTRESOURCE2BIBLE, {convert}); redirect_browser (request, journal_index_url ()); return ""; } else { view.set_variable ("error", translate("Insufficient privileges")); } } } vector <string> resources = database_usfmresources.getResources (); vector <string> resourceblock; for (auto & resource : resources) { resourceblock.push_back ("<p>"); resourceblock.push_back ("<a href=\"?delete=" + resource + "\" class=\"deleteresource\" title=\"" + translate("Remove") + "\">"); resourceblock.push_back (emoji_wastebasket ()); resourceblock.push_back ("</a>"); resourceblock.push_back ("<a href=\"?convert=" + resource + "\" class=\"convertresource\" title=\"" + translate("Convert") + "\">"); resourceblock.push_back ("♻"); resourceblock.push_back ("</a>"); resourceblock.push_back (resource); resourceblock.push_back ("</p>"); } view.set_variable ("resourceblock", filter_string_implode (resourceblock, "\n")); page += view.render ("resource", "manage"); page += Assets_Page::footer (); return page; }
string bible_book (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; string page; Assets_Header header = Assets_Header (translate("Book"), webserver_request); header.addBreadCrumb (menu_logic_settings_menu (), menu_logic_settings_text ()); header.addBreadCrumb (bible_manage_url (), menu_logic_bible_manage_text ()); page = header.run (); Assets_View view; string success_message; string error_message; // The name of the Bible. string bible = access_bible_clamp (request, request->query["bible"]); view.set_variable ("bible", filter_string_sanitize_html (bible)); // The book. int book = convert_to_int (request->query ["book"]); view.set_variable ("book", convert_to_string (book)); string book_name = Database_Books::getEnglishFromId (book); view.set_variable ("book_name", filter_string_sanitize_html (book_name)); // Whether the user has write access to this Bible book. bool write_access = access_bible_book_write (request, "", bible, book); if (write_access) view.enable_zone ("write_access"); // Delete chapter. string deletechapter = request->query ["deletechapter"]; if (deletechapter != "") { string confirm = request->query ["confirm"]; if (confirm == "") { Dialog_Yes dialog_yes = Dialog_Yes ("book", translate("Would you like to delete this chapter?")); dialog_yes.add_query ("bible", bible); dialog_yes.add_query ("book", convert_to_string (book)); dialog_yes.add_query ("deletechapter", deletechapter); page += dialog_yes.run (); return page; } if (confirm == "yes") { if (write_access) Bible_Logic::deleteChapter (bible, book, convert_to_int (deletechapter)); } } // Add chapter. if (request->query.count ("createchapter")) { Dialog_Entry dialog_entry = Dialog_Entry ("book", translate("Please enter the number for the new chapter"), "", "createchapter", ""); dialog_entry.add_query ("bible", bible); dialog_entry.add_query ("book", convert_to_string (book)); page += dialog_entry.run (); return page; } if (request->post.count ("createchapter")) { int createchapter = convert_to_int (request->post ["entry"]); vector <int> chapters = request->database_bibles ()->getChapters (bible, book); // Only create the chapters if it does not yet exist. if (find (chapters.begin(), chapters.end(), createchapter) == chapters.end()) { vector <string> feedback; bool result = true; if (write_access) result = book_create (bible, book, createchapter, feedback); string message = filter_string_implode (feedback, " "); if (result) success_message = message; else error_message = message; } else { error_message = translate ("This chapter already exists"); } } // Available chapters. vector <int> chapters = request->database_bibles ()->getChapters (bible, book); string chapterblock; for (auto & chapter : chapters) { chapterblock.append ("<a href=\"chapter?bible="); chapterblock.append (bible); chapterblock.append ("&book="); chapterblock.append (convert_to_string (book)); chapterblock.append ("&chapter="); chapterblock.append (convert_to_string (chapter)); chapterblock.append ("\">"); chapterblock.append (convert_to_string (chapter)); chapterblock.append ("</a>\n"); } view.set_variable ("chapterblock", chapterblock); view.set_variable ("success_message", success_message); view.set_variable ("error_message", error_message); if (!client_logic_client_enabled ()) view.enable_zone ("server"); page += view.render ("bible", "book"); page += Assets_Page::footer (); return page; }