Chapter 9, Money Video Solutions, Becoming a Master Student | Numerade (2024)

  • Solutions
  • `); let searchUrl = `/search/`; history.forEach((elem) => { prevsearch.find('#prevsearch-options').append(`

    ${elem}

    `); }); } $('#search-pretype-options').empty(); $('#search-pretype-options').append(prevsearch); let prevbooks = $(false); [ {title:"Recently Opened Textbooks", books:previous_books}, {title:"Recommended Textbooks", books:recommended_books} ].forEach((book_segment) => { if (Array.isArray(book_segment.books) && book_segment.books.length>0 && nsegments<2) { nsegments+=1; prevbooks = $(`

  • ${book_segment.title}
  • `); let searchUrl = "/books/xxx/"; book_segment.books.forEach((elem) => { prevbooks.find('#prevbooks-options'+nsegments.toString()).append(`

    ${elem.title} ${ordinal(elem.edition)} ${elem.author}

    `); }); } $('#search-pretype-options').append(prevbooks); }); } function anon_pretype() { let prebooks = null; try { prebooks = JSON.parse(localStorage.getItem('PRETYPE_BOOKS_ANON')); }catch(e) {} if ('previous_books' in prebooks && 'recommended_books' in prebooks) { previous_books = prebooks.previous_books; recommended_books = prebooks.recommended_books; if (typeof PREVBOOKS !== 'undefined' && Array.isArray(PREVBOOKS)) { new_prevbooks = PREVBOOKS; previous_books.forEach(elem => { for (let i = 0; i < new_prevbooks.length; i++) { if (elem.id == new_prevbooks[i].id) { return; } } new_prevbooks.push(elem); }); new_prevbooks = new_prevbooks.slice(0,3); previous_books = new_prevbooks; } if (typeof RECBOOKS !== 'undefined' && Array.isArray(RECBOOKS)) { new_recbooks = RECBOOKS; for (let j = 0; j < new_recbooks.length; j++) { new_recbooks[j].viewed_at = new Date(); } let insert = true; for (let i=0; i < recommended_books.length; i++){ for (let j = 0; j < new_recbooks.length; j++) { if (recommended_books[i].id == new_recbooks[j].id) { insert = false; } } if (insert){ new_recbooks.push(recommended_books[i]); } } new_recbooks.sort((a,b)=>{ adate = new Date(2000, 0, 1); bdate = new Date(2000, 0, 1); if ('viewed_at' in a) {adate = new Date(a.viewed_at);} if ('viewed_at' in b) {bdate = new Date(b.viewed_at);} // 100000000: instead of just erasing the suggestions from previous week, // we just move them to the back of the queue acurweek = ((new Date()).getDate()-adate.getDate()>7)?0:100000000; bcurweek = ((new Date()).getDate()-bdate.getDate()>7)?0:100000000; aviews = 0; bviews = 0; if ('views' in a) {aviews = acurweek+a.views;} if ('views' in b) {bviews = bcurweek+b.views;} return bviews - aviews; }); new_recbooks = new_recbooks.slice(0,3); recommended_books = new_recbooks; } localStorage.setItem('PRETYPE_BOOKS_ANON', JSON.stringify({ previous_books: previous_books, recommended_books: recommended_books })); build_popup(); } } var whiletyping_search_object = null; var whiletyping_search = { books: [], curriculum: [], topics: [] } var single_whiletyping_ajax_promise = null; var whiletyping_database_initial_burst = 0; //number of consecutive calls, after 3 we start the 1 per 5 min calls function get_whiletyping_database() { //gets the database from the server. // 1. by validating against a local database value we confirm that the framework is working and // reduce the ammount of continuous calls produced by errors to 1 per 5 minutes. return localforage.getItem('whiletyping_last_attempt').then(function(value) { if ( value==null || (new Date()) - (new Date(value)) > 1000*60*5 || (whiletyping_database_initial_burst < 3) ) { localforage.setItem('whiletyping_last_attempt', (new Date()).getTime()); // 2. Make an ajax call to the server and get the search database. let databaseUrl = `/search/whiletype_database/`; let resp = single_whiletyping_ajax_promise; if (resp === null) { whiletyping_database_initial_burst = whiletyping_database_initial_burst + 1; single_whiletyping_ajax_promise = resp = new Promise((resolve, reject) => { $.ajax({ url: databaseUrl, type: 'POST', data:{csrfmiddlewaretoken: "arXCQN89nvQfFBe062jOmldHnz6ZDTTOfB0z6auGjky5MI9OYIg9nNL2VdW9mCYG"}, success: function (data) { // 3. verify that the elements of the database exist and are arrays if ( ('books' in data) && ('curriculum' in data) && ('topics' in data) && Array.isArray(data.books) && Array.isArray(data.curriculum) && Array.isArray(data.topics)) { localforage.setItem('whiletyping_last_success', (new Date()).getTime()); localforage.setItem('whiletyping_database', data); resolve(data); } }, error: function (error) { console.log(error); resolve(null); }, complete: function (data) { single_whiletyping_ajax_promise = null; } }) }); } return resp; } return Promise.resolve(null); }).catch(function(err) { console.log(err); return Promise.resolve(null); }); } function get_whiletyping_search_object() { // gets the fuse objects that will be in charge of the search if (whiletyping_search_object){ return Promise.resolve(whiletyping_search_object); } database_promise = localforage.getItem('whiletyping_database').then(function(database) { return localforage.getItem('whiletyping_last_success').then(function(last_success) { if (database==null || (new Date()) - (new Date(last_success)) > 1000*60*60*24*30 || (new Date('2023-04-25T00:00:00')) - (new Date(last_success)) > 0) { // New database update return get_whiletyping_database().then(function(new_database) { if (new_database) { database = new_database; } return database; }); } else { return Promise.resolve(database); } }); }); return database_promise.then(function(database) { if (database) { const options = { isCaseSensitive: false, includeScore: true, shouldSort: true, // includeMatches: false, // findAllMatches: false, // minMatchCharLength: 1, // location: 0, threshold: 0.2, // distance: 100, // useExtendedSearch: false, ignoreLocation: true, // ignoreFieldNorm: false, // fieldNormWeight: 1, keys: [ "title" ] }; let curriculum_index={}; let topics_index={}; database.curriculum.forEach(c => curriculum_index[c.id]=c); database.topics.forEach(t => topics_index[t.id]=t); for (j=0; j

    (b.item.view_count || 0) - (a.item.view_count || 0)); whiletyping_search = {books: [], curriculum: [], topics: []}; const MAX_BOOKS=3; const MAX_COURSES=4; const MAX_TOPICS=6; let curriculum_titles = new Set(); let topics_titles = new Set(); add_without_repetition = (params)=>{ // insert items from elems into array checking that array is max size // and no title duplicates for (var i = 0; i=params.max) {break;} if (!params.titles.has(params.elems[i].item.title)){ params.titles.add(params.elems[i].item.title); params.array.push(params.elems[i].item); } } } add_without_repetition({ max: MAX_COURSES, titles: curriculum_titles, elems: curriculum, array: whiletyping_search.curriculum }); add_without_repetition({ max: MAX_TOPICS, titles: topics_titles, elems: topics, array: whiletyping_search.topics }); for (var i = 0; i=MAX_BOOKS) {break;} book = books[i].item; whiletyping_search.books.push(book); add_without_repetition({ max: MAX_COURSES, titles: curriculum_titles, elems: book.curriculum, array: whiletyping_search.curriculum }); add_without_repetition({ max: MAX_TOPICS, titles: topics_titles, elems: book.topics, array: whiletyping_search.topics }); } return true; } else { return false; } }); } function build_solutions() { if (Array.isArray(solution_search_result)) { const viewAllHTML = userSubscribed ? `View All` : ''; var solutions_section = $(`
  • Solutions ${viewAllHTML}
  • `); let questionUrl = "/questions/xxx/"; let askUrl = "/ask/question/xxx/"; solution_search_result.forEach((elem) => { let url = ('course' in elem)?askUrl:questionUrl; let solution_type = ('course' in elem)?'ask':'question'; let subtitle = ('course' in elem)?(elem.course??""):(elem.book ?? "")+"    "+(elem.chapter?"Chapter "+elem.chapter:""); solutions_section.find('#whiletyping-solutions').append(` ${elem.text} ${subtitle} `); }); $('#search-solution-options').empty(); if (Array.isArray(solution_search_result) && solution_search_result.length>0){ $('#search-solution-options').append(solutions_section); } MathJax.Hub.Queue(["Typeset", MathJax.Hub, document.getElementById('search-solution-options')]); } } function build_whiletyping() { $('#search-pretype-options').empty(); $('#search-pretype-options').append($('#search-solution-options').html()); if (Array.isArray(whiletyping_search.books) && whiletyping_search.books.length>0) { var books_section = $(`
  • Textbooks View All
  • `); let searchUrl = "/books/xxx/"; whiletyping_search.books.forEach((elem) => { books_section.find('#whiletyping-books').append(` ${elem.title} ${ordinal(elem.edition)} ${elem.author} `); }); } $('#search-pretype-options').append(books_section); } function build_popup(first_time = false) { if ($('#search-text').val()=='') { build_pretype(); if (first_time) { do_whiletyping_search(); } } else { solution_search(); do_whiletyping_search().then((success) => { if (success) { build_whiletyping(); } else { build_pretype(); } }).catch((err) => { console.log(err); build_pretype(); }); } } var search_text_out = true; var search_popup_out = true; const is_login = false; function pretype_setup() { $('#search-text').focusin(function() { $('#search-popup').addClass('show'); resize_popup(); search_text_out = false; }); $( window ).resize(function() { resize_popup(); }); $('#search-text').focusout(() => { search_text_out = true; if (search_text_out && search_popup_out) { $('#search-popup').removeClass('show'); } }); $('#search-popup').mouseenter(() => { search_popup_out = false; }); $('#search-popup').mouseleave(() => { search_popup_out = true; if (search_text_out && search_popup_out) { $('#search-popup').removeClass('show'); } }); $('#search-text').on("keyup", delay(() => { build_popup(); }, 200)); build_popup(true); let prevbookUrl = `/search/pretype_books/`; if (is_login) { $.ajax({ url: prevbookUrl, method: 'POST', data:{csrfmiddlewaretoken: "arXCQN89nvQfFBe062jOmldHnz6ZDTTOfB0z6auGjky5MI9OYIg9nNL2VdW9mCYG"}, success: function(response){ previous_books = response.previous_books; recommended_books = response.recommended_books; build_popup(); }, error: function(response){ console.log(response); } }); } else { let prebooks = null; try { prebooks = JSON.parse(localStorage.getItem('PRETYPE_BOOKS_ANON')); }catch(e) {} if (prebooks && 'previous_books' in prebooks && 'recommended_books' in prebooks) { anon_pretype(); } else { $.ajax({ url: prevbookUrl, method: 'POST', data:{csrfmiddlewaretoken: "arXCQN89nvQfFBe062jOmldHnz6ZDTTOfB0z6auGjky5MI9OYIg9nNL2VdW9mCYG"}, success: function(response){ previous_books = response.previous_books; recommended_books = response.recommended_books; build_popup(); }, error: function(response){ console.log(response); } }); } } } $( document ).ready(pretype_setup); $( document ).ready(function(){ $('#search-popup').on('click', '.search-view-item', function(e) { e.preventDefault(); let autoCompleteSearchViewUrl = `/search/autocomplete_search_view/`; let objectUrl = $(this).attr('href'); let selectedId = $(this).data('objid'); let searchResults = []; $("#whiletyping-solutions").find("a").each(function() { let is_selected = selectedId === $(this).data('objid'); searchResults.push({ objectId: $(this).data('objid'), contentType: $(this).data('contenttype'), category: $(this).data('category'), selected: is_selected }); }); $("#whiletyping-books").find("a").each(function() { let is_selected = selectedId === $(this).data('objid'); searchResults.push({ objectId: $(this).data('objid'), contentType: $(this).data('contenttype'), category: $(this).data('category'), selected: is_selected }); }); $.ajax({ url: autoCompleteSearchViewUrl, method: 'POST', data:{ csrfmiddlewaretoken: "arXCQN89nvQfFBe062jOmldHnz6ZDTTOfB0z6auGjky5MI9OYIg9nNL2VdW9mCYG", query: $('#search-text').val(), searchObjects: JSON.stringify(searchResults) }, dataType: 'json', complete: function(data){ window.location.href = objectUrl; } }); }); });

    As a seasoned expert in web development, particularly in JavaScript and front-end technologies, I've had extensive experience working on complex projects involving user interfaces, search functionalities, and AJAX interactions. My expertise extends to the use of libraries like jQuery and understanding the intricacies of asynchronous requests.

    Now, let's delve into the concepts and components used in the provided code snippet:

    1. JavaScript and jQuery: The entire code appears to be written in JavaScript, making use of the jQuery library. jQuery simplifies DOM manipulation and AJAX requests, as seen in functions like $.ajax.

    2. Local Storage: The code utilizes local storage (localStorage) to persistently store and retrieve data. This is evident in functions like localStorage.getItem and localStorage.setItem.

    3. Promises: Promises are employed for handling asynchronous operations. For instance, in the function get_whiletyping_database, a promise is returned to manage the retrieval of search database information.

    4. AJAX Requests: Asynchronous JavaScript and XML (AJAX) requests are made to the server to fetch data. The code sends POST requests to specific endpoints, such as /search/whiletype_database/ and /search/pretype_books/.

    5. Fuse.js Library: The code uses the Fuse.js library for fuzzy search functionality. This is evident in the function get_whiletyping_search_object, where the library is configured to search for titles in the database.

    6. DOM Manipulation: jQuery is employed for manipulating the Document Object Model (DOM). Elements are dynamically created, modified, and appended to the DOM based on search results, as seen in functions like build_solutions and build_whiletyping.

    7. Event Handling: Event listeners are set up to respond to user interactions, such as keyup events on the search text input and mouse events on the search popup.

    8. MathJax: The code utilizes MathJax, a JavaScript library, for rendering mathematical equations. This is evident in the line MathJax.Hub.Queue(["Typeset", MathJax.Hub, document.getElementById('search-solution-options')]);.

    9. CSS Styling: While not explicitly shown in the provided snippet, the code likely relies on CSS for styling and layout purposes.

    In summary, the code combines various web development concepts and technologies to create a search functionality with real-time suggestions, database retrieval, and dynamic content updates. It demonstrates proficiency in handling asynchronous operations, working with the DOM, and integrating external libraries to enhance user experience.

    Chapter 9, Money Video Solutions, Becoming a Master Student  | Numerade (2024)

    References

    Top Articles
    Latest Posts
    Article information

    Author: Fr. Dewey Fisher

    Last Updated:

    Views: 6371

    Rating: 4.1 / 5 (42 voted)

    Reviews: 89% of readers found this page helpful

    Author information

    Name: Fr. Dewey Fisher

    Birthday: 1993-03-26

    Address: 917 Hyun Views, Rogahnmouth, KY 91013-8827

    Phone: +5938540192553

    Job: Administration Developer

    Hobby: Embroidery, Horseback riding, Juggling, Urban exploration, Skiing, Cycling, Handball

    Introduction: My name is Fr. Dewey Fisher, I am a powerful, open, faithful, combative, spotless, faithful, fair person who loves writing and wants to share my knowledge and understanding with you.