From 2ca0074aaf5336a27ba4f3e5cd5f1b5caadaa5de Mon Sep 17 00:00:00 2001 From: Benoit Alessandroni <benoit@happy-dev.fr> Date: Sat, 12 Sep 2020 19:54:47 +0200 Subject: [PATCH] bugfix: Fixing the JS associated with the css fixe --- css/main.css | 6 +- js/main.js | 232 ++++++++++++++++------------------ js/{polls-math.js => math.js} | 70 +++++----- sib-polls.js | 31 +++-- 4 files changed, 164 insertions(+), 175 deletions(-) rename js/{polls-math.js => math.js} (79%) diff --git a/css/main.css b/css/main.css index 9b9b367..30554fe 100644 --- a/css/main.css +++ b/css/main.css @@ -564,7 +564,7 @@ vote side } -.pollPage solid-display#poll-votes-values div{ +.pollPage solid-display.poll-votes-values div{ flex-direction: column; } @@ -585,14 +585,14 @@ vote side /*save my vote*/ -.pollPage #poll-votes-form input[type="submit"]{ +.pollPage .poll-votes-form input[type="submit"]{ font-weight: bold; text-transform: uppercase; font-size: 13px; padding: var(--buttons-padding); } /*customise disabled button*/ -.pollPage #poll-votes-form input[type="submit"]:disabled{ +.pollPage .poll-votes-form input[type="submit"]:disabled{ opacity: 0.8; cursor: auto; } diff --git a/js/main.js b/js/main.js index 99628be..a34929a 100644 --- a/js/main.js +++ b/js/main.js @@ -4,55 +4,67 @@ the polls-math.js file ==========================*/ -firstLoad() - -function firstLoad(){ - let firstElement = document.querySelector("solid-display"); - //console.log("Main.js : elements loaded are",firstElement); +export function mainFirstLoad(idPrefix) { + const baseElement = document.getElementById(idPrefix + "-pollPage"); + if (!baseElement){ + console.log("no elements yet"); + setTimeout(() => { + mainFirstLoad(idPrefix); + }, 500); + } else { + console.log(baseElement, idPrefix + "-pollPage") + let firstElement = baseElement.querySelector("solid-display"); + //console.log("Main.js : elements loaded are",firstElement); - if (!firstElement) throw "no elements yet"; + if (!firstElement) throw "no elements yet"; - //listeners for all forms - const allForms = document.querySelectorAll("solid-form[id]"); - allForms.forEach(form => { - form.addEventListener("populate",()=> { - //console.log("form loaded",form); - globalFormSumbitListener(); + //listeners for all forms + const allForms = baseElement.querySelectorAll("solid-form[id]"); + allForms.forEach(form => { + form.addEventListener("populate",()=> { + //console.log("form loaded",form); + globalFormSubmitListener(); + }); }); - }); - //Listener for voting form - document.querySelector("solid-form#poll-votes-form").addEventListener("populate",()=> { - //console.log("Vote form is populating"); - disableVotes(); - }); + // const formBaseElement = document.getElementById(idPrefix + "-pollPage"); - function globalFormSumbitListener(){ - //event listener on all forms - let submitButtons = document.querySelectorAll("input[type=submit]"); - submitButtons.forEach(button => { - //listen on click & not submit to be able to check the data in the form - button.addEventListener("click",()=>{ - let clickedFormId = button.parentElement.parentElement.id; - //console.log("form id of click is :",clickedFormId); - checkFormValidity(clickedFormId); + //Listener for voting form + baseElement.querySelectorAll("solid-form.poll-votes-form")[0].addEventListener("populate",()=> { + //console.log("Vote form is populating"); + setTimeout( function() { + disableVotes(baseElement); }); }); + + function globalFormSubmitListener(){ + //event listener on all forms + let submitButtons = baseElement.querySelectorAll("input[type=submit]"); + submitButtons.forEach(button => { + //listen on click & not submit to be able to check the data in the form + button.addEventListener("click",()=>{ + let clickedFormId = button.parentElement.parentElement.id; + //console.log("form id of click is :",clickedFormId); + checkFormValidity(clickedFormId); + }); + }); + } } }; /* =================== JS For Tabs ================== */ -function showHideBlocks(activeCTAClass,inactiveCTAClass,diplayBlockClass,hideBlockClass,styleWanted){ +function showHideBlocks(baseElementName, activeCTAClass,inactiveCTAClass,diplayBlockClass,hideBlockClass,styleWanted){ + const baseElement = document.getElementById(baseElementName); //get all blocks - activeCTAClass = document.querySelectorAll(activeCTAClass); - inactiveCTAClass = document.querySelectorAll(inactiveCTAClass); - targetBlockToDiplay = document.querySelectorAll(diplayBlockClass); - hideBlockClass = document.querySelectorAll(hideBlockClass); + activeCTAClass = baseElement.querySelectorAll(activeCTAClass); + inactiveCTAClass = baseElement.querySelectorAll(inactiveCTAClass); + targetBlockToDiplay = baseElement.querySelectorAll(diplayBlockClass); + hideBlockClass = baseElement.querySelectorAll(hideBlockClass); //show wanted blocks - for (i = 0; i < targetBlockToDiplay.length; i++) { + for (let i = 0; i < targetBlockToDiplay.length; i++) { if (targetBlockToDiplay[i].style.display == 'none' || targetBlockToDiplay[i].style.display == '' ) { targetBlockToDiplay[i].style.display = styleWanted; } @@ -89,7 +101,7 @@ function newOptionContent(){ //get options section let options = document.querySelectorAll("solid-multiple-form[name=pollOptions]"); //console.log("options : ",options); - for(i = 0; i < options.length; i++) { + for(let i = 0; i < options.length; i++) { let button = options[i].querySelectorAll("button"); //console.log("button : ",options[i].querySelectorAll("button").textContent); @@ -113,7 +125,7 @@ function newOptionContent(){ ***********/ function checkFormValidity(clickedFormId){ let formId = clickedFormId; - let form = document.querySelector("solid-form[id="+formId+"]"); + let form = document.querySelectorAll("solid-form[class="+formId+"]")[0]; //console.log("current form id is : ",formId); var currenErrors = []; //console.log("errors are", currenErrors); @@ -142,41 +154,6 @@ function newOptionContent(){ && !emailPlaceholder.includes(electedText) ================================*/ - /*********** - check email format - ***********/ - function CheckEmailFormat(){ - var emailRegEx = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/; - - allFields = form.querySelectorAll("input"); - for (i = 0; i < allFields.length; i++) { - - emailPlaceholder = (allFields[i].placeholder).toLowerCase(); - emailText = "email"; - electedText = "élu"; - - emailValue = allFields[i].value; - if (emailPlaceholder.includes(emailText)) { - - if (emailPlaceholder.includes(electedText)) { - //console.log("elected field"); - } - - //if elected official field, pass by - - //if email feild && not empty, check value - else if (emailRegEx.test(emailValue) == false && emailValue.length != 0 && !(emailPlaceholder.includes(electedText)) ) { - currenErrors.push("Le format de votre adresse email contient une erreur"); - event.preventDefault(); - } - - else{ - //console.log("not an elected official form"); - } - } - } - } - /*********** check the mandatory fields ***********/ @@ -264,71 +241,74 @@ function newOptionContent(){ /*********** disable voting if the startdate hasn't arrived or if the enddate has passed ***********/ -function disableVotes(){ - let errorMessage = document.querySelector("#unavailablePoll"); - if(!errorMessage == "" ) throw "Not displaying message as it exists"; +function disableVotes(baseElement){ + let errorMessage = baseElement.querySelectorAll("div.unavailablePoll")[0]; + console.log('Error Message', baseElement, errorMessage); + if (errorMessage) return; //get start date & end date - let currentPoll = document.querySelector("[id=pollPage]"); - //console.log("current poll is :", currentPoll); - //console.log("startdate block is :", currentPoll.querySelector("solid-display-date[name=startDate]")); - let dateSeparator = "/"; - let displayStartDate = currentPoll.querySelector("solid-display-date[name=startDate]").textContent; - startDate = displayStartDate.split("/"); - let displayEndDate = currentPoll.querySelector("solid-display-date[name=endDate]").textContent; - let cleanEndDate = displayEndDate.split("/"); - - cleanStartDate = startDate[1] +dateSeparator + startDate[0] +dateSeparator + startDate[2]; - cleanEndDate = cleanEndDate[1] +dateSeparator + cleanEndDate[0] +dateSeparator + cleanEndDate[2]; + // let currentPoll = baseElement.querySelector("[id=pollPage]"); + console.log("current poll is :", baseElement); + setTimeout(function() { + let dateSeparator = "/"; + let displayStartDate = baseElement.querySelector("solid-display-date[name=startDate]").textContent; + let startDate = displayStartDate.split("/"); + let displayEndDate = baseElement.querySelector("solid-display-date[name=endDate]").textContent; + let endDate = displayEndDate.split("/"); + + let cleanStartDate = startDate[1] + dateSeparator + startDate[0] + dateSeparator + startDate[2]; + let cleanEndDate = endDate[1] + dateSeparator + endDate[0] + dateSeparator + endDate[2]; - let comparisonStartDate = Date.parse(cleanStartDate); - let comparisonEndDate = Date.parse(cleanEndDate); + let comparisonStartDate = Date.parse(cleanStartDate); + let comparisonEndDate = Date.parse(cleanEndDate); - //set current date - let today = new Date(); - let date = (today.getMonth()+1)+'/'+today.getDate()+'/'+today.getFullYear(); - date = Date.parse(date); - - console.log("startdate is",comparisonStartDate,'endate is',comparisonEndDate, "dateis",date); - - //get the submit button - let votingSection = document.querySelector("#poll-votes-form"); - let submitButton = votingSection.querySelector("input[type=submit]"); - - if (comparisonStartDate > date) { - let errorMessage = "This poll hasn't started yet, you can start voting on :" + displayStartDate+"."; - deactivateButton(errorMessage); - } else if(comparisonEndDate < date) { - let errorMessage = "This poll is closed since : " + displayEndDate+"."; - deactivateButton(errorMessage); - } - else if(comparisonEndDate = date) { - let errorMessage = "Today is the last day to vote!"; - activateButton(); - } - else{ - activateButton(); - } - //add deactivate attribute if needed - function deactivateButton(errorMessage){ - submitButton.setAttribute("disabled",true); - submitButton.insertAdjacentHTML('afterend', '<div id="unavailablePoll">'+errorMessage+'</div>'); - //console.log(submitButton); - } - //activate button & remove message - function activateButton(){ - submitButton.setAttribute("enabled",true); - if (submitButton.nextElementSibling) { - submitButton.nextElementSibling.remove(); - } - } + //set current date + let today = new Date(); + let date = (today.getMonth()+1)+'/'+today.getDate()+'/'+today.getFullYear(); + date = Date.parse(date); + + console.log("startdate is",comparisonStartDate,'endate is',comparisonEndDate, "dateis",date); + + //get the submit button + let votingSection = baseElement.querySelectorAll(".poll-votes-form")[0]; + let submitButton = votingSection.querySelector("input[type=submit]"); + + if (comparisonStartDate > date) { + let errorMessage = "This poll hasn't started yet, you can start voting on :" + displayStartDate+"."; + deactivateButton(errorMessage); + } else if(comparisonEndDate < date) { + let errorMessage = "This poll is closed since : " + displayEndDate+"."; + deactivateButton(errorMessage); + } + else if(comparisonEndDate = date) { + let errorMessage = "Today is the last day to vote!"; + activateButton(); + } + else{ + activateButton(); + } + //add deactivate attribute if needed + function deactivateButton(errorMessage){ + submitButton.setAttribute("disabled",true); + submitButton.insertAdjacentHTML('afterend', '<div class="unavailablePoll">'+errorMessage+'</div>'); + //console.log(submitButton); + } + //activate button & remove message + function activateButton(){ + submitButton.setAttribute("enabled",true); + if (submitButton.nextElementSibling) { + submitButton.nextElementSibling.remove(); + } + } + }); } /* SHARE POLL BY EMAIL */ -function sharePollEmail(){ - let shareEmails = document.querySelector("#share-emails").value; +function sharePollEmail(baseElementName){ + const baseElement = document.getElementById(baseElementName); + let shareEmails = baseElement.querySelectorAll(".share-emails")[0].value; let emailTitle = document.querySelector("h1").innerText; let emailSubject = "Donnez votre avis sur " + emailTitle; let pollURL = window.location.href; diff --git a/js/polls-math.js b/js/math.js similarity index 79% rename from js/polls-math.js rename to js/math.js index 004083e..f721583 100644 --- a/js/polls-math.js +++ b/js/math.js @@ -10,63 +10,67 @@ * Update on navigate *********/ -firstLoad(); +export function mathFirstLoad(baseElementId){ + const baseElement = document.getElementById(baseElementId); -function firstLoad(){ - let elementsLoaded = document.querySelector("solid-poll,solid-display"); - //console.log("elements loaded are",elementsLoaded); - - if (!elementsLoaded){ - console.log("no elements yet"); + if (!baseElement){ + console.log("no elements yet", baseElementId); setTimeout(() => { - firstLoad(); + mathFirstLoad(baseElementId); }, 500); } else{ + console.log("baseElementId", baseElementId); + let elementsLoaded = baseElement.querySelectorAll("solid-display")[0]; + console.log("elements loaded are",elementsLoaded); + const dataSourceURI = elementsLoaded.dataset.src; const urlComponents = new URL(dataSourceURI); const dataSourceDomain = urlComponents.origin; - //console.log("the data domain is",dataSourceDomain); - //console.log("elements are there, updating id's"); + console.log("the data domain is",dataSourceDomain); + console.log("elements are there, updating id's"); - document.querySelector("div#polls solid-display").addEventListener("populate",()=> { + baseElement.querySelector("div#polls solid-display").addEventListener("populate",()=> { //when populate of a poll //console.log("poll page"); - getPollTotalInfo(dataSourceDomain); + getPollTotalInfo(baseElement, dataSourceDomain); }); - - document.querySelector("solid-form[name=addPoll]").addEventListener("populate",()=> { + console.log("baseElement", baseElement); + baseElement.parentElement.querySelector("solid-form[name=addPoll]").addEventListener("populate",()=> { //console.log("populating add form"); - newOptionContent(); + // setTimeout(function() { + newOptionContent(baseElement.parentElement); + // }); }); /***** Updates on navigate */ - document.querySelector("solid-router").addEventListener("navigate",()=> { + baseElement.parentElement.querySelector("solid-router").addEventListener("navigate",()=> { //console.log("navigating"); - getPollTotalInfo(dataSourceDomain); + getPollTotalInfo(baseElement, dataSourceDomain); updateFormSource(); }); //refresh display of total votes on a poll - document.querySelector("#poll-votes-values").addEventListener("populate",() => { + baseElement.parentElement.querySelectorAll(".poll-votes-values")[0].addEventListener("populate",() => { //console.log("populating"); refreshTotalVotes(); }); //refresh total votes when user votes - document.querySelector("solid-form#poll-votes-form").addEventListener("save",()=> { - refreshVoteDataSrc(); + baseElement.parentElement.querySelectorAll("solid-form.poll-votes-form")[0].addEventListener("save",()=> { + refreshVoteDataSrc(baseElement); }); /********* * Get info on the current poll *********/ - function getPollTotalInfo(dataSourceDomain){ + function getPollTotalInfo(baseElement, dataSourceDomain){ //get value of data-scr linked to poll page - const pollPage = document.querySelector("#pollPage"); - const pageTitle = pollPage.querySelectorAll("solid-display[id=title]"); + console.log("baseElement", baseElement); + const pollPage = baseElement.parentElement.querySelectorAll(".pollPage")[0]; + const pageTitle = pollPage.querySelectorAll("solid-display[class=title]")[0]; ////console.log("page title is",pageTitle); //console.log("getting total poll info for the domaine",dataSourceDomain); @@ -114,12 +118,12 @@ function firstLoad(){ function setCurrentPollOptions(dataSourceDomain,currentPage,currentId){ //add the poll option number within the URL of the options //get the form block - const formContent = currentPage.querySelector("[id=poll-votes-form]"); + const formContent = currentPage.querySelectorAll("[class=poll-votes-form]")[0]; console.log("form is",formContent); - if(formContent == null){ + if (formContent == null) { throw "there's no formContent with the id poll-votes-form"; } - else{ + else { //get the range for option choices const newOptionRange = dataSourceDomain+"/polls/"+currentId+"/pollOptions/"; //push new @@ -196,13 +200,13 @@ function firstLoad(){ Refresh vote results when someone submits a vote ***********************/ - function refreshVoteDataSrc(){ + function refreshVoteDataSrc(baseElement){ let pollTotalVotes = document.querySelector("solid-display#poll-votes-values"); pollTotalVotes.dataset.src = pollTotalVotes.dataset.src+"?"+Date.now(); //math.random() to break sib cache and actually get now values ////console.log("after the string is",pollTotalVotes.dataset.src); - getPollTotalInfo(dataSourceDomain); - refreshTotalVotes(); + getPollTotalInfo(baseElement, dataSourceDomain); + refreshTotalVotes(baseElement); } } } @@ -257,11 +261,11 @@ function displayTotalVotes(poll,totalCount){ * Open by default 2 options ================== */ //change content of button -function newOptionContent(){ +function newOptionContent(baseElement){ //get options section - let options = document.querySelectorAll("solid-multiple-form[name=pollOptions]"); - //console.log("options : ",options); - for(i = 0; i < options.length; i++) { + let options = baseElement.querySelectorAll("solid-multiple-form[name=pollOptions]")[0]; + console.log("options : ",options); + for(let i = 0; i < options.length; i++) { let button = options[i].querySelectorAll("button"); //console.log("button : ",options[i].querySelectorAll("button").textContent); diff --git a/sib-polls.js b/sib-polls.js index ca27174..bdf2fb6 100644 --- a/sib-polls.js +++ b/sib-polls.js @@ -1,5 +1,8 @@ import { SolidTemplateElement, Helpers } from 'https://unpkg.com/@startinblox/core@0.10'; import { SIBConversation } from "https://unpkg.com/@startinblox/component-conversation@0.5"; +import { mathFirstLoad } from './js/math.js'; +import { mainFirstLoad } from './js/main.js'; + /* WORKAROUT NOTE : *All data-src or range URL's hard coded in the component with a 127.0.0.1 : @@ -14,11 +17,6 @@ Helpers.importCSS("https://cdn.materialdesignicons.com/3.6.95/css/materialdesign Helpers.importCSS(`${base_url}/css/main.css`); Helpers.importJS('https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js'); -document.addEventListener("DOMContentLoaded", ()=> { - Helpers.importJS(`${base_url}/js/main.js`); - Helpers.importJS(`${base_url}/js/polls-math.js`); -}); - export class SolidPoll extends SolidTemplateElement { constructor() { super(); @@ -72,8 +70,15 @@ export class SolidPoll extends SolidTemplateElement { if (!dataSrc) return ''; if (!idPrefix) idPrefix = "default" let sourceUrl = dataSrc + (nestedField ? nestedField + '/' : ''); + + document.addEventListener("DOMContentLoaded", ()=> { + Helpers.importJS(`${base_url}/js/main.js`); + Helpers.importJS(`${base_url}/js/math.js`); + mainFirstLoad(idPrefix); + mathFirstLoad(idPrefix + '-pollListing'); + }); + return ` - <solid-router use-hash default-route="${idPrefix}-pollListing"> <solid-route class="d-none" name="${idPrefix}-pollListing" active=""></solid-route> <solid-route use-id name="${idPrefix}-pollPage"></solid-route> @@ -128,11 +133,11 @@ export class SolidPoll extends SolidTemplateElement { <div id="${idPrefix}-pollPage" class="pollPage"> <!--Title--> <solid-display - id="title" - bind-resources - fields="title" - related-field="" - widget-title="solid-display-h1" + class="title" + bind-resources + fields="title" + related-field="" + widget-title="solid-display-h1" > </solid-display> @@ -198,8 +203,8 @@ export class SolidPoll extends SolidTemplateElement { <div class="voteCounter"> <h3 id="totalVotesDisplay"></h3> </div> - <solid-display - id="poll-votes-values" + <solid-display + class="poll-votes-values" data-src="${sourceUrl}total_votes/1/" fields="row1(choiceValue,name), total_votes,progressBar" -- GitLab