Collect and display user-generated content

So I am using (https://www.wix.com/code/home/example/Reviews) to allow users to leave a review against a dynamic page.

I have adapted the code to fit my requirements (database) however i am now getting this error
( Wix code SDK Warning: The text parameter that is passed to the text method cannot be set to null or undefined) and the (+ Add A Review) button does not load the light box.

I have looked and looked but cant see the issue any ideas?

Any Ideas please see code under;

import wixWindow from “wix-window”;
import wixData from “wix-data”;

export function addReview_onClick(event) {
let companyId = $w(‘#dynamicDataset’).getCurrentItem()._id;
wixWindow.openLightbox(‘Post a Review’, {id: companyId});
loadReviews(2);
}

function loadReviews(limit) {
let recipe = $w(‘#dynamicDataset’).getCurrentItem();
wixData.query(‘reviews’)
.eq(‘recipeId’, recipe._id)
.find()
.then(res => {
if (res.length > 0) {
renderRating(res.items);
renderReviews(res.items, limit);
$w(‘#numberOfReviews’).text = ${res.length} Reviews;
$w(‘#numberOfReviews’).show();
if (res.length > 2) {
$w(‘#seeAllReviews’).show();
$w(‘#seeAllLine’).show();
}
}
else {
$w(‘#rating’).hide();
$w(‘#numberOfReviews’).text = ‘No Reviews’;
$w(‘#numberOfReviews’).show();
}
});
}

function renderRating(reviews) {
// compute the average rating
let stats = reviews.reduce((agg, item) => {
return {
sum: agg.sum+item.rating,
count: agg.count+1
};
}, {sum: 0, count: 0});

let rating = Math.round(stats.sum * 2 / stats.count) / 2;	 
$w('#rating').show(); 
// setting the rating as HTML to have fine grained control over the formatting 
$w('#rating').html = `<p style="font-size:15px; line-height:1.2em; text-align:center"><span class="color_11"> 

Rating ${rating}
/5

`;
}

function formatDaysAgo(date) {
var ago = new Date().getTime() - date.getTime();
if (ago < 44 * 1000)
return “a few seconds ago”;
else if (ago < 89 * 1000)
return “a minute ago”;
else if (ago < 44 * 60 * 1000)
return Math.round(ago / 60 / 1000) + ’ minutes ago’;
else if (ago < 89 * 60 * 1000)
return “an hour ago”;
else if (ago < 21 * 60 * 60 * 1000)
return Math.round(ago / 60 / 60 / 1000) + ’ hours ago’;
else if (ago < 35 * 60 * 60 * 1000)
return “a day ago”;
else if (ago < 25 * 24 * 60 * 60 * 1000)
return Math.round(ago / 24 / 60 / 60 / 1000) + ’ days ago’;
else if (ago < 45 * 24 * 60 * 60 * 1000)
return ‘a month ago’;
else if (ago < 319 * 24 * 60 * 60 * 1000)
return Math.round(ago / 29 / 24 / 60 / 60 / 1000) + ’ months ago’;
else if (ago < 547 * 24 * 60 * 60 * 1000)
return ‘a year ago’;
else
return Math.round(ago / 365 / 24 / 60 / 60 / 1000) + ’ years ago’;
}

const stars = [‘★’, ‘★★’, ‘★★★’, ‘★★★★’, ‘★★★★★’];
function renderStars(num) {
if (num >= 1 && num <=5)
return stars[num-1];
return stars[0];
}

function makeBrief(about, breakFrom) {
if (!about)
return “”;
var regex = /(<([^>]+)>)/ig;
var plainText = about.replace(regex, “”);
var dotPos = plainText.indexOf(‘.’, breakFrom);
var exclamationPos = plainText.indexOf(‘!’, breakFrom);
var wordBreak = plainText.indexOf(" ", breakFrom);
if (dotPos < 0) dotPos = 500;
if (exclamationPos < 0) exclamationPos = 500;
if (wordBreak < 0) wordBreak = 500;
var lineEnd = Math.min(Math.min(dotPos, exclamationPos), wordBreak);
if (lineEnd !== 500)
return plainText.substring(0, lineEnd) + “…”;
else
return plainText;
}

function renderReview (review) {
return `



${review.name}  


${formatDaysAgo(review._createdDate)}

${renderStars(review.rating)}

 

${makeBrief(review.review, 20)}

`; }

const reviewSeparator = ‘

 

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

 

’;
const reviewEnd = ‘

 

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

’;

function renderReviews(reviews, limit) {
let reviewsToRender = reviews.slice(0, limit);
let odd = reviewsToRender.filter((element, index, array) => (index % 2 === 1));
let even = reviewsToRender.filter((element, index, array) => (index % 2 === 0));

if (odd.length > 0) { 
	let oddRendered = odd.map(renderReview).join(reviewSeparator) + reviewEnd; 
	$w('#reviewsOdd').html = oddRendered; 
	$w('#reviewsOdd').show(); 
	$w('#oddReviewContainer').show(); 
} 
else { 
	$w('#reviewsOdd').hide(); 
	$w('#oddReviewContainer').hide(); 
} 

if (even.length > 0) { 
	let evenRendered = even.map(renderReview).join(reviewSeparator) + reviewEnd; 
	$w('#reviewsEven').html = evenRendered;	 
	$w('#reviewsEven').show(); 
	$w('#evenReviewContainer').show(); 
} 
else { 
	$w('#reviewsEven').hide(); 
	$w('#evenReviewContainer').hide(); 
} 

}

export function seeAllReviews_onClick(event) {
loadReviews();
}

export function seeAllReviews_click(event, $w) {
//Add your code for this event here:
}

1 Like

Hay,

I can see that in the addReview onClick event you do not wait for the lightbox to close before reloading the reviews. Can it be the problem?

The code should look more like the following -

export function addReview_onClick(event) {
	let companyId = $w('#dynamicDataset').getCurrentItem()._id;
	wixWindow.openLightbox('Post a Review', {id: companyId})
          .then(() => {
              loadReviews(2);  
          });
}

Thank you Yoav

This seams like a good idea, however does not fix the issue.

The light box just does not load at all. You can more than happily take a look at the at the dynamic page (https://www.reviewoctopus.co.uk/Company/88c3e5cd-48f8-4dbd-bc71-2fbaec0b29a7)

I cant see the issue myself however have been say here for some time so maybe i am just reading over this. Any ideas.

Taking a look at your editor…

found your problem.

In the property editor, the button is connected to the event addReview_click


But in your code you have addReview_onClick


Just delete the event from the property panel and recreate it.

Thanks Yoav
When i try to do this it will only let me add (addReview_click_1) not ( addReview_onClick )

not a problem. Add another method and just copy the code into it.

Yoav can you elaborate on your last comment (I am new to this but learning fast).

As i say have almost copied this (https://www.wix.com/code/home/example/Reviews) so don’t quite get what i have done to have it brake on me.

Hi,

Just create ‘addReview_click_1’, it doesn’t matter.

Than, move the code from ‘addReview_onClick’ into ‘addReview_click_1’.

Liran.

Thank you for the guide on this Liran, I have now implemented this as ‘addReview_Click’ however we are still getting the following error.
( Wix code SDK Warning: The text parameter that is passed to the text method cannot be set to null or undefined. )

I have looked through the code and cant see what text method it is taking about. Could this be a bug?

Thanks
Simon

Also the button is still not working as it should.the code is now

import wixWindow from “wix-window”;
import wixData from “wix-data”;

export function addReview_Click(event) {
let companyId = $w(‘#dynamicDataset’).getCurrentItem()._id;
wixWindow.openLightbox(‘Post a Review’, {id: companyId})
.then(() => {
loadReviews(2);
});
}

function loadReviews(limit) {
let recipe = $w(‘#dynamicDataset’).getCurrentItem();
wixData.query(‘reviews’)
.eq(‘recipeId’, recipe._id)
.find()
.then(res => {
if (res.length > 0) {
renderRating(res.items);
renderReviews(res.items, limit);
$w(‘#numberOfReviews’).text = ${res.length} Reviews;
$w(‘#numberOfReviews’).show();
if (res.length > 2) {
$w(‘#seeAllReviews’).show();
$w(‘#seeAllLine’).show();
}
}
else {
$w(‘#rating’).hide();
$w(‘#numberOfReviews’).text = ‘No Reviews’;
$w(‘#numberOfReviews’).show();
}
});
}

function renderRating(reviews) {
// compute the average rating
let stats = reviews.reduce((agg, item) => {
return {
sum: agg.sum+item.rating,
count: agg.count+1
};
}, {sum: 0, count: 0});

let rating = Math.round(stats.sum * 2 / stats.count) / 2;	 
$w('#rating').show(); 
// setting the rating as HTML to have fine grained control over the formatting 
$w('#rating').html = `<p style="font-size:15px; line-height:1.2em; text-align:center"><span class="color_11"> 

Rating ${rating}
/5

`;
}

function formatDaysAgo(date) {
var ago = new Date().getTime() - date.getTime();
if (ago < 44 * 1000)
return “a few seconds ago”;
else if (ago < 89 * 1000)
return “a minute ago”;
else if (ago < 44 * 60 * 1000)
return Math.round(ago / 60 / 1000) + ’ minutes ago’;
else if (ago < 89 * 60 * 1000)
return “an hour ago”;
else if (ago < 21 * 60 * 60 * 1000)
return Math.round(ago / 60 / 60 / 1000) + ’ hours ago’;
else if (ago < 35 * 60 * 60 * 1000)
return “a day ago”;
else if (ago < 25 * 24 * 60 * 60 * 1000)
return Math.round(ago / 24 / 60 / 60 / 1000) + ’ days ago’;
else if (ago < 45 * 24 * 60 * 60 * 1000)
return ‘a month ago’;
else if (ago < 319 * 24 * 60 * 60 * 1000)
return Math.round(ago / 29 / 24 / 60 / 60 / 1000) + ’ months ago’;
else if (ago < 547 * 24 * 60 * 60 * 1000)
return ‘a year ago’;
else
return Math.round(ago / 365 / 24 / 60 / 60 / 1000) + ’ years ago’;
}

const stars = [‘★’, ‘★★’, ‘★★★’, ‘★★★★’, ‘★★★★★’];
function renderStars(num) {
if (num >= 1 && num <=5)
return stars[num-1];
return stars[0];
}

function makeBrief(about, breakFrom) {
if (!about)
return “”;
var regex = /(<([^>]+)>)/ig;
var plainText = about.replace(regex, “”);
var dotPos = plainText.indexOf(‘.’, breakFrom);
var exclamationPos = plainText.indexOf(‘!’, breakFrom);
var wordBreak = plainText.indexOf(" ", breakFrom);
if (dotPos < 0) dotPos = 500;
if (exclamationPos < 0) exclamationPos = 500;
if (wordBreak < 0) wordBreak = 500;
var lineEnd = Math.min(Math.min(dotPos, exclamationPos), wordBreak);
if (lineEnd !== 500)
return plainText.substring(0, lineEnd) + “…”;
return plainText;
}

function renderReview (review) {
return `



${review.name}  


${formatDaysAgo(review._createdDate)}

${renderStars(review.rating)}

 

${makeBrief(review.review, 20)}

`; }

const reviewSeparator = ‘

 

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

 

’;
const reviewEnd = ‘

 

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

’;

function renderReviews(reviews, limit) {
let reviewsToRender = reviews.slice(0, limit);
let odd = reviewsToRender.filter((element, index, array) => (index % 2 === 1));
let even = reviewsToRender.filter((element, index, array) => (index % 2 === 0));

if (odd.length > 0) { 
	let oddRendered = odd.map(renderReview).join(reviewSeparator) + reviewEnd; 
	$w('#reviewsOdd').html = oddRendered; 
	$w('#reviewsOdd').show(); 
	$w('#oddReviewContainer').show(); 
} 
else { 
	$w('#reviewsOdd').hide(); 
	$w('#oddReviewContainer').hide(); 
} 

if (even.length > 0) { 
	let evenRendered = even.map(renderReview).join(reviewSeparator) + reviewEnd; 
	$w('#reviewsEven').html = evenRendered;	 
	$w('#reviewsEven').show(); 
	$w('#evenReviewContainer').show(); 
} 
else { 
	$w('#reviewsEven').hide(); 
	$w('#evenReviewContainer').hide(); 
} 

}

export function seeAllReviews_onClick(event) {
loadReviews();
}

export function addReview_click(event, $w) {
//Add your code for this event here:
}

That’s happening because you’re assigning an Object to a text field.
First thing to do, change this:

$w('#numberOfReviews').text = `${res.length} Reviews`;

To this:

$w('#numberOfReviews').text = `${res.items.length} Reviews`;

Liran.

Thanks Liran

I have done this however the error is still there. Any guidance would be very appreciated.

The Issues

  • The button on the page does not open the light box.
  • The Following error is on the page. in preview mode. (listed 9 times)
    “Loading the code for the Company (ID) page. To debug this code, open y0yj7.js in Developer Tools.Wix code SDK Warning: The text parameter that is passed to the text method cannot be set to null or undefined.”

Our Page
https://www.reviewoctopus.co.uk/Company/88c3e5cd-48f8-4dbd-bc71-2fbaec0b29a7

The Wix example we are working from

The code on the page at this time

import wixWindow from “wix-window”;
import wixData from “wix-data”;

export function addReview_Click(event) {
let companyId = $w(‘#dynamicDataset’).getCurrentItem()._id;
wixWindow.openLightbox(‘Post a Review’, {id: companyId})
.then(() => {
loadReviews(2);
});
}

function loadReviews(limit) {
let recipe = $w(‘#dynamicDataset’).getCurrentItem();
wixData.query(‘reviews’)
.eq(‘recipeId’, recipe._id)
.find()
.then(res => {
if (res.length > 0) {
renderRating(res.items);
renderReviews(res.items, limit);
$w(‘#numberOfReviews’).text = ${res.items.length} Reviews;
$w(‘#numberOfReviews’).show();
if (res.length > 2) {
$w(‘#seeAllReviews’).show();
$w(‘#seeAllLine’).show();
}
}
else {
$w(‘#rating’).hide();
$w(‘#numberOfReviews’).text = ‘No Reviews’;
$w(‘#numberOfReviews’).show();
}
});
}

function renderRating(reviews) {
// compute the average rating
let stats = reviews.reduce((agg, item) => {
return {
sum: agg.sum+item.rating,
count: agg.count+1
};
}, {sum: 0, count: 0});

let rating = Math.round(stats.sum * 2 / stats.count) / 2;	 
$w('#rating').show(); 
// setting the rating as HTML to have fine grained control over the formatting 
$w('#rating').html = `<p style="font-size:15px; line-height:1.2em; text-align:center"><span class="color_11"> 

Rating ${rating}
/5

`;
}

function formatDaysAgo(date) {
var ago = new Date().getTime() - date.getTime();
if (ago < 44 * 1000)
return “a few seconds ago”;
else if (ago < 89 * 1000)
return “a minute ago”;
else if (ago < 44 * 60 * 1000)
return Math.round(ago / 60 / 1000) + ’ minutes ago’;
else if (ago < 89 * 60 * 1000)
return “an hour ago”;
else if (ago < 21 * 60 * 60 * 1000)
return Math.round(ago / 60 / 60 / 1000) + ’ hours ago’;
else if (ago < 35 * 60 * 60 * 1000)
return “a day ago”;
else if (ago < 25 * 24 * 60 * 60 * 1000)
return Math.round(ago / 24 / 60 / 60 / 1000) + ’ days ago’;
else if (ago < 45 * 24 * 60 * 60 * 1000)
return ‘a month ago’;
else if (ago < 319 * 24 * 60 * 60 * 1000)
return Math.round(ago / 29 / 24 / 60 / 60 / 1000) + ’ months ago’;
else if (ago < 547 * 24 * 60 * 60 * 1000)
return ‘a year ago’;
else
return Math.round(ago / 365 / 24 / 60 / 60 / 1000) + ’ years ago’;
}

const stars = [‘★’, ‘★★’, ‘★★★’, ‘★★★★’, ‘★★★★★’];
function renderStars(num) {
if (num >= 1 && num <=5)
return stars[num-1];
return stars[0];
}

function makeBrief(about, breakFrom) {
if (!about)
return “”;
var regex = /(<([^>]+)>)/ig;
var plainText = about.replace(regex, “”);
var dotPos = plainText.indexOf(‘.’, breakFrom);
var exclamationPos = plainText.indexOf(‘!’, breakFrom);
var wordBreak = plainText.indexOf(" ", breakFrom);
if (dotPos < 0) dotPos = 500;
if (exclamationPos < 0) exclamationPos = 500;
if (wordBreak < 0) wordBreak = 500;
var lineEnd = Math.min(Math.min(dotPos, exclamationPos), wordBreak);
if (lineEnd !== 500)
return plainText.substring(0, lineEnd) + “…”;
return plainText;
}

function renderReview (review) {
return `



${review.name}  


${formatDaysAgo(review._createdDate)}

${renderStars(review.rating)}

 

${makeBrief(review.review, 20)}

`; }

const reviewSeparator = ‘

 

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

 

’;
const reviewEnd = ‘

 

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

’;

function renderReviews(reviews, limit) {
let reviewsToRender = reviews.slice(0, limit);
let odd = reviewsToRender.filter((element, index, array) => (index % 2 === 1));
let even = reviewsToRender.filter((element, index, array) => (index % 2 === 0));

if (odd.length > 0) { 
	let oddRendered = odd.map(renderReview).join(reviewSeparator) + reviewEnd; 
	$w('#reviewsOdd').html = oddRendered; 
	$w('#reviewsOdd').show(); 
	$w('#oddReviewContainer').show(); 
} 
else { 
	$w('#reviewsOdd').hide(); 
	$w('#oddReviewContainer').hide(); 
} 

if (even.length > 0) { 
	let evenRendered = even.map(renderReview).join(reviewSeparator) + reviewEnd; 
	$w('#reviewsEven').html = evenRendered;	 
	$w('#reviewsEven').show(); 
	$w('#evenReviewContainer').show(); 
} 
else { 
	$w('#reviewsEven').hide(); 
	$w('#evenReviewContainer').hide(); 
} 

}

export function seeAllReviews_onClick(event) {
loadReviews();
}

export function addReview_click(event, $w) {
//Add your code for this event here:
}

The Light Box Code

import {lightbox} from “wix-window”;

const starsId = [‘#starGray1’, ‘#starGray2’, ‘#starGray3’, ‘#starGray4’, ‘#starGray5’];
const starsActiveId = [‘#starBlue1’, ‘#starBlue2’, ‘#starBlue3’, ‘#starBlue4’, ‘#starBlue5’];

let selectedStar = 0;

$w.onReady(function () {
// set star events and init the stars
for (let i=0; i < 5; i++) {
$w(starsId[i]).onClick(starClick(i));
$w(starsActiveId[i]).onClick(starClick(i));
$w(starsId[i]).onMouseIn(starHover(i));
$w(starsActiveId[i]).onMouseIn(starHover(i));
}
showSelectedStars();

$w("#reviewsDataset").onBeforeSave(reviewsBeforeSave); 
$w("#reviewsDataset").onAfterSave(reviewsAfterSave); 

});

function starClick(index) {
return function(event) {
selectedStar = index+1;
checkEnablePostButton();
showSelectedStars();
};
}

function showSelectedStars() {
showStars(selectedStar);
}

function showStars(numberOfStars) {
for (let i=0; i < 5; i++) {
if (i < numberOfStars)
$w(starsActiveId[i]).show();
else
$w(starsActiveId[i]).hide();
}
}

function starHover(index) {
return function(event) {
showStars(index+1);
};
}

function clearStarHover() {
showSelectedStars();
}

function reviewsBeforeSave() {
$w(“#reviewsDataset”).setFieldValue(‘rating’, selectedStar);
let reviewId = lightbox.getContext().id;
$w(“#reviewsDataset”).setFieldValue(‘recipeId’, reviewId);
}

function reviewsAfterSave() {
lightbox.close();
}

function checkEnablePostButton() {
let item = $w(“#reviewsDataset”).getCurrentItem();
if (selectedStar > 0 && !!item.name && !!item.review)
$w(‘#postButton’).enable();
else
$w(‘#postButton’).disable();
}

export function closeButton_onClick(event) {
lightbox.close();
}

export function clearStarsHoverHotspot_onMouseIn(event) {
clearStarHover();
}

export function reviewsDataset_onItemValuesChanged(event) {
checkEnablePostButton();
}

export function dataset1_itemValuesChanged(event, $w) {
//Add your code for this event here:
}

export function box2clearStarsHoverHotspot_mouseIn(event, $w) {
//Add your code for this event here:
}

export function clearStarsHoverHotspot_mouseIn(event, $w) {
//Add your code for this event here:
}

Update

I have now solved the issue in regards to the light box however the following errors are sill on page.

1) Wix code SDK Warning: The link parameter that is passed to the link method cannot be set to null or undefined.

  1. Wix code SDK Warning: The src parameter that is passed to the src method cannot be set to null or undefined.

AND

The reviews will not load on the page however they are storing in the data base

Code On The Review Page Now Looks Like This

import wixWindow from “wix-window”;
import wixData from “wix-data”;

export function addReview_click() {
let companyId = $w(‘#dynamicDataset’).getCurrentItem()._id;
wixWindow.openLightbox(‘Post A Review’, {id: companyId})
.then(() => {
loadReviews(2);
});
}

function loadReviews(limit) {
let company = $w(‘#dynamicDataset’).getCurrentItem();
wixData.query(‘reviews’)
.eq(‘companyId’, company._id)
.find()
.then(res => {
if (res.length > 0) {
renderRating(res.items);
renderReviews(res.items, limit);
$w(‘#numberOfReviews’).text = ${res.items.length} Reviews;
$w(‘#numberOfReviews’).show();
if (res.length > 2) {
$w(‘#seeAllReviews’).show();
$w(‘#seeAllLine’).show();
}
}
else {
$w(‘#rating’).hide();
$w(‘#numberOfReviews’).text = ‘No Reviews’;
$w(‘#numberOfReviews’).show();
}
});
}

function renderRating(reviews) {
// compute the average rating
let stats = reviews.reduce((agg, item) => {
return {
sum: agg.sum+item.rating,
count: agg.count+1
};
}, {sum: 0, count: 0});

let rating = Math.round(stats.sum * 2 / stats.count) / 2;	 
$w('#rating').show(); 
// setting the rating as HTML to have fine grained control over the formatting 
$w('#rating').html = `<p style="font-size:15px; line-height:1.2em; text-align:center"><span class="color_11"> 

Rating ${rating}
/5

`;
}

function formatDaysAgo(date) {
var ago = new Date().getTime() - date.getTime();
if (ago < 44 * 1000)
return “a few seconds ago”;
else if (ago < 89 * 1000)
return “a minute ago”;
else if (ago < 44 * 60 * 1000)
return Math.round(ago / 60 / 1000) + ’ minutes ago’;
else if (ago < 89 * 60 * 1000)
return “an hour ago”;
else if (ago < 21 * 60 * 60 * 1000)
return Math.round(ago / 60 / 60 / 1000) + ’ hours ago’;
else if (ago < 35 * 60 * 60 * 1000)
return “a day ago”;
else if (ago < 25 * 24 * 60 * 60 * 1000)
return Math.round(ago / 24 / 60 / 60 / 1000) + ’ days ago’;
else if (ago < 45 * 24 * 60 * 60 * 1000)
return ‘a month ago’;
else if (ago < 319 * 24 * 60 * 60 * 1000)
return Math.round(ago / 29 / 24 / 60 / 60 / 1000) + ’ months ago’;
else if (ago < 547 * 24 * 60 * 60 * 1000)
return ‘a year ago’;

	return Math.round(ago / 365 / 24 / 60 / 60 / 1000) + ' years ago'; 

}

const stars = [‘★’, ‘★★’, ‘★★★’, ‘★★★★’, ‘★★★★★’];
function renderStars(num) {
if (num >= 1 && num <=5)
return stars[num-1];
return stars[0];
}

function makeBrief(about, breakFrom) {
if (!about)
return “”;
var regex = /(<([^>]+)>)/ig;
var plainText = about.replace(regex, “”);
var dotPos = plainText.indexOf(‘.’, breakFrom);
var exclamationPos = plainText.indexOf(‘!’, breakFrom);
var wordBreak = plainText.indexOf(" ", breakFrom);
if (dotPos < 0) dotPos = 500;
if (exclamationPos < 0) exclamationPos = 500;
if (wordBreak < 0) wordBreak = 500;
var lineEnd = Math.min(Math.min(dotPos, exclamationPos), wordBreak);
if (lineEnd !== 500)
return plainText.substring(0, lineEnd) + “…”;
return plainText;
}

function renderReview (review) {
return `



${review.name}  


${formatDaysAgo(review._createdDate)}

${renderStars(review.rating)}

 

${makeBrief(review.review, 20)}

`; }

const reviewSeparator = ‘

 

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

 

’;
const reviewEnd = ‘

 

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

’;

function renderReviews(reviews, limit) {
let reviewsToRender = reviews.slice(0, limit);
let odd = reviewsToRender.filter((element, index, array) => (index % 2 === 1));
let even = reviewsToRender.filter((element, index, array) => (index % 2 === 0));

if (odd.length > 0) { 
	let oddRendered = odd.map(renderReview).join(reviewSeparator) + reviewEnd; 
	$w('#reviewsOdd').html = oddRendered; 
	$w('#reviewsOdd').show(); 
	$w('#oddReviewContainer').show(); 
} 
else { 
	$w('#reviewsOdd').hide(); 
	$w('#oddReviewContainer').hide(); 
} 

if (even.length > 0) { 
	let evenRendered = even.map(renderReview).join(reviewSeparator) + reviewEnd; 
	$w('#reviewsEven').html = evenRendered;	 
	$w('#reviewsEven').show(); 
	$w('#evenReviewContainer').show(); 
} 
else { 
	$w('#reviewsEven').hide(); 
	$w('#evenReviewContainer').hide(); 
} 

}

export function seeAllReviews_onClick() {
loadReviews();
}

The light box code looks like this

import {lightbox} from “wix-window”;

const starsId = [‘#starGray1’, ‘#starGray2’, ‘#starGray3’, ‘#starGray4’, ‘#starGray5’];
const starsActiveId = [‘#starBlue1’, ‘#starBlue2’, ‘#starBlue3’, ‘#starBlue4’, ‘#starBlue5’];

let selectedStar = 0;

$w.onReady(function () {
// set star events and init the stars
for (let i=0; i < 5; i++) {
$w(starsId[i]).onClick(starClick(i));
$w(starsActiveId[i]).onClick(starClick(i));
$w(starsId[i]).onMouseIn(starHover(i));
$w(starsActiveId[i]).onMouseIn(starHover(i));
}
showSelectedStars();

$w("#reviewsDataset").onBeforeSave(reviewsBeforeSave); 
$w("#reviewsDataset").onAfterSave(reviewsAfterSave); 

});

function starClick(index) {
return function() {
selectedStar = index+1;
checkEnablePostButton();
showSelectedStars();
};
}

function showSelectedStars() {
showStars(selectedStar);
}

function showStars(numberOfStars) {
for (let i=0; i < 5; i++) {
if (i < numberOfStars)
$w(starsActiveId[i]).show();
else
$w(starsActiveId[i]).hide();
}
}

function starHover(index) {
return function() {
showStars(index+1);
};
}

function clearStarHover() {
showSelectedStars();
}

function reviewsBeforeSave() {
$w(“#reviewsDataset”).setFieldValue(‘rating’, selectedStar);
let reviewId = lightbox.getContext().id;
$w(“#reviewsDataset”).setFieldValue(‘companyId’, reviewId);
}

function reviewsAfterSave() {
lightbox.close();
}

function checkEnablePostButton() {
let item = $w(“#reviewsDataset”).getCurrentItem();
if (selectedStar > 0 && !!item.name && !!item.review)
$w(‘#postButton’).enable();
else
$w(‘#postButton’).disable();
}

export function closeButton_onClick() {
lightbox.close();
}

export function clearStarsHoverHotspot_onMouseIn() {
clearStarHover();
}

export function reviewsDataset_onItemValuesChanged() {
checkEnablePostButton();
}

export function dataset1_itemValuesChanged() {
//Add your code for this event here:
}

export function box2clearStarsHoverHotspot_mouseIn() {
//Add your code for this event here:
}

export function clearStarsHoverHotspot_mouseIn() {
//Add your code for this event here:
}

Hi,

First of all, regarding the warning you got:

1) Wix code SDK Warning: The link parameter that is passed to the link method cannot be set to null or undefined.
2) Wix code SDK Warning: The src parameter that is passed to the src method cannot be set to null or undefined.

These warnings are there because you’re trying to assign ‘null’ or ‘undefined’ to ‘link’ or ‘src’.
Look for these places and make sure you always pass a string (url or src).

Secondly,
Please share specific code, and the behaviour expected for it, sharing the whole code makes it very hard to debug it, and makes it hard for us to help.

Liran.

The code i am using to render the reviews to the dynamic page is however this is not displaying the reviews on the dynamic page as it should.


function loadReviews(limit) {
	let company = $w('#dynamicDataset').getCurrentItem();
	wixData.query('reviews')
		.eq('companyId', company._id)
		.find()
		.then(res => {
			if (res.length > 0) {
				renderRating(res.items);
				renderReviews(res.items, limit);
				$w('#numberOfReviews').text = `${res.items.length} Reviews`;
				$w('#numberOfReviews').show();
				if (res.length > 2) {
					$w('#seeAllReviews').show();
					$w('#seeAllLine').show();
				}
			}
			else {
				$w('#rating').hide();
				$w('#numberOfReviews').text = 'No Reviews';
				$w('#numberOfReviews').show();
			}
		});
}

function renderRating(reviews) {
	// compute the average rating
	let stats = reviews.reduce((agg, item) => {
		return {
			sum: agg.sum+item.rating, 
			count: agg.count+1
			};
		}, {sum: 0, count: 0});
					
	let rating = Math.round(stats.sum * 2 / stats.count) / 2;	
	$w('#rating').show();
	// setting the rating as HTML to have fine grained control over the formatting
	$w('#rating').html = `<p style="font-size:15px; line-height:1.2em; text-align:center"><span class="color_11">
<span style="letter-spacing:0.15em"><span style="font-weight:bold"><span style="font-size:15px">Rating ${rating}</span></span></span></span>
<span class="color_13"><span style="letter-spacing:0.15em"><span style="font-weight:bold"><span style="font-size:15px">/5</span></span></span>
</span></p>`;	
}

function formatDaysAgo(date) {
	var ago = new Date().getTime() - date.getTime();
	if (ago < 44 * 1000)
		return "a few seconds ago";
	else if (ago < 89 * 1000)
		return "a minute ago";
	else if (ago < 44 * 60 * 1000)	
		return Math.round(ago / 60 / 1000) + ' minutes ago';
	else if (ago < 89 * 60 * 1000)
		return "an hour ago";
	else if (ago < 21 * 60 * 60 * 1000)
		return Math.round(ago / 60 / 60 / 1000) + ' hours ago';
	else if (ago < 35 * 60 * 60 * 1000)
		return "a day ago";
	else if (ago < 25 * 24 * 60 * 60 * 1000)
		return Math.round(ago / 24 / 60 / 60 / 1000) + ' days ago';
	else if (ago < 45 * 24 * 60 * 60 * 1000)
		return 'a month ago';
	else if (ago < 319 * 24 * 60 * 60 * 1000)
		return Math.round(ago / 29 / 24 / 60 / 60 / 1000) + ' months ago';
	else if (ago < 547 * 24 * 60 * 60 * 1000)
		return 'a year ago';
	
		return Math.round(ago / 365 / 24 / 60 / 60 / 1000) + ' years ago';
}

const stars = ['★', '★★', '★★★', '★★★★', '★★★★★'];
function renderStars(num) {
	if (num >= 1 && num <=5)
		return stars[num-1];
	return stars[0];
}

function makeBrief(about, breakFrom) {
	if (!about)
		return "";
	var regex = /(<([^>]+)>)/ig;
	var plainText = about.replace(regex, "");
	var dotPos = plainText.indexOf('.', breakFrom);
	var exclamationPos = plainText.indexOf('!', breakFrom);
	var wordBreak = plainText.indexOf(" ", breakFrom);
	if (dotPos < 0) dotPos = 500;
	if (exclamationPos < 0) exclamationPos = 500;
	if (wordBreak < 0) wordBreak = 500;
	var lineEnd = Math.min(Math.min(dotPos, exclamationPos), wordBreak);
	if (lineEnd !== 500)
		return plainText.substring(0, lineEnd) + "...";
		return plainText;
}

function renderReview (review) {
	return `<p style="margin-left:15px; font-size:12px; line-height:1.2em">
<span style="font-family:avenir-lt-w01_85-heavy1475544,sans-serif"><span style="letter-spacing:0.01em"><span style="color:#000000">
<span style="font-size:12px"><span style="font-weight:bold">${review.name}&nbsp;&nbsp;</span></span></span></span></span>
<span style="font-family:avenir-lt-w01_35-light1475496,sans-serif"><span style="letter-spacing:0.01em"><span style="color:#000000">
<span style="font-size:9px"><span style="font-weight:bold">${formatDaysAgo(review._createdDate)}</span></span></span></span></span></p> 
<p style="margin-left:15px; font-size: 12px; line-height: 1.4em;"><span style="font-family:avenir-lt-w01_85-heavy1475544,sans-serif">
<span style="font-size:12px"><span style="color:#1A1A84"><span style="letter-spacing:0.01em"><span style="font-weight:bold">
${renderStars(review.rating)}</span></span></span></span></span></p> 
<p style="margin-left:15px; font-size:11px; line-height:1.2em">&nbsp;</p> 
<p style="margin-left:15px; font-size:11px; line-height:0.5em"><span style="font-size:11px">
<span style="font-family:avenir-lt-w01_35-light1475496,sans-serif"><span style="color:#000000"><span style="letter-spacing:0.01em">
<span style="font-weight:bold">${makeBrief(review.review, 20)}</span></span></span></span></span></p>`;
}

const reviewSeparator = '<p>&nbsp;</p><p style="background-color: #eff3f6; color: #eff3f6">xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</p><p>&nbsp;</p>';
const reviewEnd = '<p>&nbsp;</p><p style="background-color: #eff3f6; color: #eff3f6">xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</p>';

function renderReviews(reviews, limit) {
	let reviewsToRender = reviews.slice(0, limit);
	let odd = reviewsToRender.filter((element, index, array) => (index % 2 === 1));	
	let even = reviewsToRender.filter((element, index, array) => (index % 2 === 0));
	
	if (odd.length > 0) {
		let oddRendered = odd.map(renderReview).join(reviewSeparator) + reviewEnd;
		$w('#reviewsOdd').html = oddRendered;
		$w('#reviewsOdd').show();
		$w('#oddReviewContainer').show();
	}
	else {
		$w('#reviewsOdd').hide();
		$w('#oddReviewContainer').hide();
	}
	
	if (even.length > 0) {
		let evenRendered = even.map(renderReview).join(reviewSeparator) + reviewEnd;
		$w('#reviewsEven').html = evenRendered;	
		$w('#reviewsEven').show();
		$w('#evenReviewContainer').show();
	}
	else {
		$w('#reviewsEven').hide();
		$w('#evenReviewContainer').hide();
	}
}

export function seeAllReviews_onClick() {
	loadReviews();  
}

Hi,

As said before, it’s very hard for me to look for problems in the whole code. Try to be more specific and point me to the code that you think has issue (not the whole page code, at it is very hard to read a lot of code).

Liran.

Hey Liran

I think this is the part of the code that should hide or show the reviews however although in database this is not displaying


function renderReviews(reviews, limit) {
	let reviewsToRender = reviews.slice(0, limit);
	let odd = reviewsToRender.filter((index) => (index % 2 === 1));	
	let even = reviewsToRender.filter((index) => (index % 2 === 0));
	
	if (odd.length > 0) {
		let oddRendered = odd.map(renderReview).join(reviewSeparator) + reviewEnd;
		$w('#reviewsOdd').html = oddRendered;
		$w('#reviewsOdd').show();
		$w('#oddReviewContainer').show();
	}
	else {
		$w('#reviewsOdd').hide();
		$w('#oddReviewContainer').hide();
	}
	
	if (even.length > 0) {
		let evenRendered = even.map(renderReview).join(reviewSeparator) + reviewEnd;
		$w('#reviewsEven').html = evenRendered;	
		$w('#reviewsEven').show();
		$w('#evenReviewContainer').show();
	}
	else {
		$w('#reviewsEven').hide();
		$w('#evenReviewContainer').hide();
	}
}

However the code i am following has been written by you team or some one in Wix

Are you getting any console errors?

Yes

  1. Wix code SDK Warning: The src parameter that is passed to the src method cannot be set to null or undefined.

  2. Wix code SDK Warning: The text parameter that is passed to the text method cannot be set to null or undefined.

can you give me an idea of what to look for to resolve this