67 Commits

Author SHA1 Message Date
Mohammed Ashab Uddin
768f2a596a update 2020-08-20 21:03:28 +04:00
Mohammed Ashab Uddin
c973b988c6 updated readme 2020-08-20 21:00:58 +04:00
Mohammed Ashab Uddin
150a211373 redone user 2020-08-20 20:21:00 +04:00
Mohammed Ashab Uddin
836e9ff128 added Contributers name 2020-08-20 20:19:47 +04:00
Mohammed Ashab Uddin
3e13b37224 Merge branch 'master' of github.com:HWTechClub/Custom-Static-Website-Generator 2020-08-20 20:16:59 +04:00
Mohammed Ashab Uddin
8c0a3a9f9c messages has been updated 2020-08-20 20:14:47 +04:00
Akilan Selvacoumar
b8eb4811fe Update README.md 2020-08-19 11:36:39 +04:00
Akilan
7baf3aa0fa updated README.md file 2020-08-19 11:31:59 +04:00
Akilan
736751afd3 fixed template bugs 2020-08-19 09:05:33 +04:00
Mohammed Ashab Uddin
7c5e343919 documented command.js 2020-08-15 11:17:23 +04:00
Mohammed Ashab Uddin
336470060c template has been added 2020-08-11 12:01:30 +04:00
Mohammed Ashab Uddin
5967fbc35e added csv columns 2020-08-11 11:41:37 +04:00
ashab272000
afe893c1a3 Merge pull request #11 from HWTechClub/newChanges
New changes
2020-08-07 09:20:39 +04:00
Mohammed Ashab Uddin
65c76ac732 able to save images 2020-08-07 09:15:21 +04:00
Mohammed Ashab Uddin
c5329eda93 modified onGetInfo to display images 2020-08-06 14:09:51 +04:00
Mohammed Ashab Uddin
54d3e68d87 modified to use images 2020-08-06 14:07:52 +04:00
Mohammed Ashab Uddin
117e0949d6 added common-tags 2020-08-06 14:07:28 +04:00
Mohammed Ashab Uddin
574b568f94 added base64 decoding method 2020-08-06 13:05:43 +04:00
Mohammed Ashab Uddin
e4df23516f getInput needs await and message as parameter 2020-08-06 13:05:02 +04:00
Mohammed Ashab Uddin
75073e5e03 commands can now get media as input 2020-08-06 13:03:28 +04:00
Mohammed Ashab Uddin
8c12bffb8d Merge branch 'master' of github.com:HWTechClub/Custom-Static-Website-Generator 2020-08-05 12:09:01 +04:00
Mohammed Ashab Uddin
8870677027 fixed getSelectedproduct and website 2020-08-05 12:07:40 +04:00
Mohammed Ashab Uddin
678da0d8cf used the _getInputMessage() 2020-08-05 12:07:22 +04:00
Mohammed Ashab Uddin
3bb0dbd2a4 accepts message with "" 2020-08-03 10:54:48 +04:00
Akilan
d1a38ba1f5 added new route for website generator 2020-08-02 14:14:07 +04:00
ashab272000
758c284787 Merge pull request #10 from HWTechClub/pr9
completed all the commands and functions
2020-07-31 16:05:30 +04:00
ashab272000
46a18489a0 Merge branch 'master' into pr9 2020-07-31 16:05:15 +04:00
ashab272000
e5d1a0096e Merge pull request #9 from pr16-hash/master
website details
2020-07-31 16:03:47 +04:00
Mohammed Ashab Uddin
fc2d0b6e07 merged 2020-07-31 15:55:54 +04:00
Mohammed Ashab Uddin
46aff50616 completed all the commands and functions 2020-07-31 15:46:05 +04:00
Mohammed Ashab Uddin
d0655737f1 structured the logic.js 2020-07-30 11:27:37 +04:00
Mohammed Ashab Uddin
e936c4d312 added selection methods 2020-07-30 09:29:19 +04:00
Mohammed Ashab Uddin
3bf8cf6d03 added selection methods 2020-07-30 09:29:02 +04:00
Preeti Rawat
e4cffc7282 website(II)
website (II) with documentation
2020-07-29 22:29:04 +04:00
ashab272000
09dc41d685 Merge pull request #8 from Baber-Jan/master
Added all the product methods,
2020-07-28 11:01:05 +04:00
Mohammed Ashab Uddin
2aae4fe6e9 small fixes 2020-07-28 10:46:02 +04:00
Mohammed Ashab Uddin
e71e9f372b fixed entity map problems 2020-07-28 10:44:40 +04:00
Mohammed Ashab Uddin
595941341d staged 2020-07-27 10:15:48 +04:00
Baber-Jan
ff7eb53eef Single change 2020-07-26 20:10:58 +04:00
Baber-Jan
eeb04e1615 Did the required changes 2020-07-26 19:12:51 +04:00
Preeti Rawat
9e358e1c24 condition
added condition-1
2020-07-26 17:29:59 +04:00
Preeti Rawat
dc8c28305f just comments
firstname,lastname,logourl,companyname, help are sending comments
2020-07-25 22:26:25 +04:00
Baber-Jan
d53380616e Did the required change 2020-07-25 22:13:01 +04:00
Mohammed Ashab Uddin
416deb477c fixed bug in command.js 2020-07-25 21:19:59 +04:00
Mohammed Ashab Uddin
d4be542a91 fixed bug in command.js 2020-07-25 21:17:11 +04:00
Preeti Rawat
6566ba30a0 testing1
create companu_name
2020-07-25 14:04:29 +04:00
Mohammed Ashab Uddin
90a14a9e1b added default value to the object parameter 2020-07-25 10:46:30 +04:00
Mohammed Ashab Uddin
0b0569b783 deleted all the logic.onWg() 2020-07-25 10:15:33 +04:00
Baber-Jan
c58bc1ce91 I Think the product functions are done. 2020-07-24 19:11:38 +04:00
Mohammed Ashab Uddin
6288eefa99 Merge remote-tracking branch 'origin' 2020-07-24 16:00:34 +04:00
Mohammed Ashab Uddin
11063d120d fixed gettng input from the message 2020-07-24 15:59:23 +04:00
Mohammed Ashab Uddin
507e62e049 added input functionalities on command 2020-07-24 14:58:32 +04:00
Akilan Selvacoumar
2a1ade4f25 Merge pull request #5 from HWTechClub/dependabot/npm_and_yarn/website-generator/lodash-4.17.19
Bump lodash from 4.17.15 to 4.17.19 in /website-generator
2020-07-24 11:45:37 +04:00
Baber-Jan
4ca9d1418c moved some code to logic.j 2020-07-23 20:23:15 +04:00
Baber-Jan
2f653468e6 Added all the product methods, now have to figure out how to use id in call back function 2020-07-23 20:02:16 +04:00
dependabot[bot]
60367476d8 Bump lodash from 4.17.15 to 4.17.19 in /website-generator
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.15 to 4.17.19.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.19)

Signed-off-by: dependabot[bot] <support@github.com>
2020-07-22 10:10:57 +00:00
Mohammed Ashab Uddin
ca46a66283 getAllData() is added 2020-07-22 11:01:47 +04:00
Mohammed Ashab Uddin
7b0779d552 added and used entity methods 2020-07-22 10:51:29 +04:00
Mohammed Ashab Uddin
596f56b708 StructuredData uses entity to store data 2020-07-22 10:43:52 +04:00
Mohammed Ashab Uddin
1535d4cec0 added entity 2020-07-22 10:43:05 +04:00
Mohammed Ashab Uddin
29db39c642 Added mocha and chai for testing 2020-07-22 10:42:51 +04:00
Mohammed Ashab Uddin
9c7f90a102 fixed bugs 2020-07-22 08:30:01 +04:00
ashab272000
401aa1a17d Update commands.md 2020-07-22 08:25:18 +04:00
ashab272000
07f3c114e0 Update README.md 2020-07-22 08:20:03 +04:00
ashab272000
4924eaef2c Update commands.md 2020-07-22 07:58:48 +04:00
ashab272000
1513186a45 Merge pull request #7 from HWTechClub/npmBot
Npm bot
2020-07-21 14:56:58 +04:00
ashab272000
23ceb9fe14 Merge pull request #4 from HWTechClub/npmBot
Integrated the whatsapp bot from npm.
2020-07-20 15:18:19 +04:00
25 changed files with 2705 additions and 247 deletions

12
.gitignore vendored
View File

@@ -64,3 +64,15 @@ typings/
#session whatsappwebjs json file #session whatsappwebjs json file
whatsapp-web.js/session.json whatsapp-web.js/session.json
# ignore file in the generated website section
website-generator/public/pages/*
# ignore ejs.html files
website-generator/public/templates/*/*.ejs.html
# Not IPFS file in the direcotry
!website-generator/public/pages/ipfs-deploy.sh

View File

@@ -9,22 +9,53 @@ In this project we will illustrate how to build a static web page using commands
## Installation ## Installation
Requirements : Node js and Npm Requirements : Node js and Npm
### To start web generator ### Install web generator
First, go to the folder named **website-generator**.
Then install all the node modules.
``` ```
cd website-generation cd website-generation
npm install
``` ```
Installation : https://github.com/Tech-club/Challenge-1/tree/master/website-generator#installation
### Install whatsapp bot
### To start whatsapp bot First, go to the folder named **whatsapp-web.js**.
Then install all the node modules.
``` ```
cd whatsapp-web.js cd whatsapp-web.js
npm install npm install
```
### Start the website generator
Make sure you are in **website-generator** directory. Then type the following command :
```
npm start
```
For more information on deploying the server in IPFS, please click the following link:
https://github.com/Tech-club/Challenge-1/tree/master/website-generator#installation
### Start whatsapp bot
Make sure you are in **whatsapp-web.js** directory. Then type the following command :
```
npm start npm start
``` ```
### Start generating websites with whatsapp
You need to start both website-generator and whatsapp-bot.
### Contributors ### Contributors
1. Akilan Selvacoumar : as251@hw.ac.uk 1. Akilan Selvacoumar: akilan@hwtech.club (https://akilan.io)
2. Gaurav Gosain : gg68@hw.ac.uk 2. Mohammed Ashab Uddin : https://ashab272000.github.io/dist/
3. Baber Jan
4. Preeti Rawat
5. Gaurav Gosain: gg68@hw.ac.uk
6. Nicole Tobe: https://github.com/tobenxe
7. Humaid AlQassimi: me@humaidq.ae(https://humaidq.ae)
(Website generator based on: https://humaidq.ae/projects/shopsheet/)

View File

@@ -24,8 +24,6 @@ exports.generate = function (req, res) {
//we can now manipulate the data //we can now manipulate the data
let result = req.body.companyName; let result = req.body.companyName;
//console.log(req.body);
let dir = './public/pages/' + req.body.companyName; let dir = './public/pages/' + req.body.companyName;
if (!fs.existsSync(dir)) { if (!fs.existsSync(dir)) {
@@ -52,7 +50,7 @@ exports.generate = function (req, res) {
let templateContent = JSON.parse(template); let templateContent = JSON.parse(template);
for (var i = 0; i < templateContent.templates.length; i++) { for (var i = 0; i < templateContent.templates.length; i++) {
if (templateContent.templates[i].template_name == "Colo_Shop") { if (templateContent.templates[i].template_name == req.body.template) {
for (var j = 0; j < templateContent.templates[i].pages.length; j++) { for (var j = 0; j < templateContent.templates[i].pages.length; j++) {
//Copying html files can be removed in the future stages //Copying html files can be removed in the future stages
@@ -67,18 +65,6 @@ exports.generate = function (req, res) {
} }
} }
/*fs.createReadStream('./public/Colo_Shop/index.html').pipe(fs.createWriteStream(dir + '/index.html'));
fs.createReadStream('./public/Colo_Shop/cart.html').pipe(fs.createWriteStream(dir + '/cart.html'));
fs.createReadStream('./public/Colo_Shop/contact.html').pipe(fs.createWriteStream(dir + '/contact.html'));
copy_folder('./public/Colo_Shop/styles', dir + '/styles');
copy_folder('./public/Colo_Shop/js', dir + '/js');
copy_folder('./public/Colo_Shop/plugins', dir + '/plugins');
copy_folder('./public/Colo_Shop/images', dir + '/images');
ejs2html('./public/Colo_Shop/index.ejs', req.body , dir, "index");
ejs2html('./public/Colo_Shop/cart.ejs', req.body , dir, "cart");
ejs2html('./public/Colo_Shop/contact.ejs', req.body , dir, "contact");*/
const resp = { const resp = {
'directory': result 'directory': result
@@ -112,12 +98,10 @@ exports.deploy_ipfs = function (req, res) {
} }
exports.convertCsv = function (req, res, next) { exports.convertCsv = function (req, res, next) {
console.log(req.body);
const csvStr = req.body.csv; const csvStr = req.body.csv;
csv() csv()
.fromString(csvStr) .fromString(csvStr)
.then((jsonObj) => { .then((jsonObj) => {
console.log(jsonObj)
req.body.csv = jsonObj; req.body.csv = jsonObj;
//delete file at path //delete file at path
next() next()

View File

@@ -8,6 +8,8 @@ module.exports = function (app){
// generate site // generate site
app.post('/generate',home.convertCsv, home.generate); app.post('/generate',home.convertCsv, home.generate);
app.post('/generate_with_json_data', home.generate);
app.get('/template_info',home.template_info); app.get('/template_info',home.template_info);
app.get('/ipfsdeploy', home.deploy_ipfs); app.get('/ipfsdeploy', home.deploy_ipfs);

View File

@@ -1132,9 +1132,9 @@
"integrity": "sha1-ZMTwJfF/1Tv7RXY/rrFvAVp0dVA=" "integrity": "sha1-ZMTwJfF/1Tv7RXY/rrFvAVp0dVA="
}, },
"lodash": { "lodash": {
"version": "4.17.15", "version": "4.17.19",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ=="
}, },
"lodash.debounce": { "lodash.debounce": {
"version": "4.0.8", "version": "4.0.8",

View File

@@ -117,9 +117,9 @@
<div class="hamburger_close"><i class="fa fa-times" aria-hidden="true"></i></div> <div class="hamburger_close"><i class="fa fa-times" aria-hidden="true"></i></div>
<div class="hamburger_menu_content text-right"> <div class="hamburger_menu_content text-right">
<ul class="menu_top_nav"> <ul class="menu_top_nav">
<li class="menu_item"><a href="#">home</a></li> <li class="menu_item"><a href="index.html">home</a></li>
<li class="menu_item"><a href="#">cart</a></li> <li class="menu_item"><a href="cart.html">cart</a></li>
<li class="menu_item"><a href="#">contact</a></li> <li class="menu_item"><a href="contact.html">contact</a></li>
</ul> </ul>
</div> </div>
</div> </div>

View File

@@ -2,7 +2,7 @@
<html lang="en"> <html lang="en">
<head> <head>
<title>Heriot-Watt</title> <title>Test123</title>
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="description" content="Colo Shop Template"> <meta name="description" content="Colo Shop Template">
@@ -86,7 +86,7 @@
<div class="row"> <div class="row">
<div class="col-lg-12 text-right"> <div class="col-lg-12 text-right">
<div class="logo_container"> <div class="logo_container">
<a href="#"><img src="https://www.google.com/url?sa=i&amp;url=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FHeriot-Watt_University&amp;psig=AOvVaw2fm-eoyZxj8ZIUEULdjZ5_&amp;ust=1589820225686000&amp;source=images&amp;cd=vfe&amp;ved=0CAIQjRxqFwoTCJj1i4Osu-kCFQAAAAAdAAAAABAD" class="img-fluid" style="height:5rem;" /></a> <a href="#"><img src="https://hwtech.club/images/output-onlinepngtools.png" class="img-fluid" style="height:5rem;" /></a>
</div> </div>
<nav class="navbar"> <nav class="navbar">
<ul class="navbar_menu"> <ul class="navbar_menu">
@@ -117,9 +117,9 @@
<div class="hamburger_close"><i class="fa fa-times" aria-hidden="true"></i></div> <div class="hamburger_close"><i class="fa fa-times" aria-hidden="true"></i></div>
<div class="hamburger_menu_content text-right"> <div class="hamburger_menu_content text-right">
<ul class="menu_top_nav"> <ul class="menu_top_nav">
<li class="menu_item"><a href="#">home</a></li> <li class="menu_item"><a href="index.html">home</a></li>
<li class="menu_item"><a href="#">cart</a></li> <li class="menu_item"><a href="cart.html">cart</a></li>
<li class="menu_item"><a href="#">contact</a></li> <li class="menu_item"><a href="contact.html">contact</a></li>
</ul> </ul>
</div> </div>
</div> </div>
@@ -289,19 +289,19 @@
<script> <script>
$(document).ready(function () { $(document).ready(function () {
if (localStorage.getItem('Heriot-Watt') === null) { if (localStorage.getItem('Test123_50') === null) {
console.log("here"); console.log("here");
var arr = new Array(); var arr = new Array();
localStorage.setItem('Heriot-Watt', JSON.stringify(arr)); localStorage.setItem('Test123_50', JSON.stringify(arr));
} }
var arr_json = JSON.parse(localStorage.getItem('Heriot-Watt')); var arr_json = JSON.parse(localStorage.getItem('Test123_50'));
$("#checkout_items").html(arr_json.length); $("#checkout_items").html(arr_json.length);
console.log(arr_json.length); console.log(arr_json.length);
var arr_json = JSON.parse(localStorage.getItem('Heriot-Watt')); var arr_json = JSON.parse(localStorage.getItem('Test123_50'));
$("#table").html(""); $("#table").html("");
var receipt = "<textarea name=\"purchases\">"; var receipt = "<textarea name=\"purchases\">";
var sum = 0; var sum = 0;
@@ -333,12 +333,12 @@
function delete_item(id) { function delete_item(id) {
$("#table").html(""); $("#table").html("");
var arr_json = JSON.parse(localStorage.getItem('Heriot-Watt')); var arr_json = JSON.parse(localStorage.getItem('Test123_50'));
if (id > -1) { if (id > -1) {
arr_json.splice(id, 1); arr_json.splice(id, 1);
} }
console.log(id); console.log(id);
localStorage.setItem('Heriot-Watt', JSON.stringify(arr_json)); localStorage.setItem('Test123_50', JSON.stringify(arr_json));
console.log(arr_json.length); console.log(arr_json.length);
var receipt = "<textarea name=\"purchases\">"; var receipt = "<textarea name=\"purchases\">";
var sum = 0; var sum = 0;

View File

@@ -100,7 +100,7 @@
<li class="checkout"> <li class="checkout">
<a href="cart.html"> <a href="cart.html">
<i class="fa fa-shopping-cart" aria-hidden="true"></i> <i class="fa fa-shopping-cart" aria-hidden="true"></i>
<span id="checkout_items" class="checkout_items">2</span> <span id="checkout_items" class="checkout_items">0</span>
</a> </a>
</li> </li>
</ul> </ul>
@@ -115,6 +115,18 @@
</header> </header>
<div class="fs_menu_overlay"></div>
<div class="hamburger_menu">
<div class="hamburger_close"><i class="fa fa-times" aria-hidden="true"></i></div>
<div class="hamburger_menu_content text-right">
<ul class="menu_top_nav">
<li class="menu_item"><a href="index.html">home</a></li>
<li class="menu_item"><a href="cart.html">cart</a></li>
<li class="menu_item"><a href="#">contact</a></li>
</ul>
</div>
</div>
<div class="container contact_container"> <div class="container contact_container">
<div class="row"> <div class="row">
<div class="col"> <div class="col">

View File

@@ -2,7 +2,7 @@
<html lang="en"> <html lang="en">
<head> <head>
<title>Heriot-Watt</title> <title>Test123</title>
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="description" content="Colo Shop Template"> <meta name="description" content="Colo Shop Template">
@@ -89,7 +89,7 @@
<div class="row"> <div class="row">
<div class="col-lg-12 text-right"> <div class="col-lg-12 text-right">
<div class="logo_container"> <div class="logo_container">
<a href="#"><img src="https://www.google.com/url?sa=i&amp;url=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FHeriot-Watt_University&amp;psig=AOvVaw2fm-eoyZxj8ZIUEULdjZ5_&amp;ust=1589820225686000&amp;source=images&amp;cd=vfe&amp;ved=0CAIQjRxqFwoTCJj1i4Osu-kCFQAAAAAdAAAAABAD" class="img-fluid" style="height:5rem;" /></a> <a href="#"><img src="https://hwtech.club/images/output-onlinepngtools.png" class="img-fluid" style="height:5rem;" /></a>
</div> </div>
<nav class="navbar"> <nav class="navbar">
<ul class="navbar_menu"> <ul class="navbar_menu">
@@ -100,7 +100,7 @@
<li class="checkout"> <li class="checkout">
<a href="cart.html"> <a href="cart.html">
<i class="fa fa-shopping-cart" aria-hidden="true"></i> <i class="fa fa-shopping-cart" aria-hidden="true"></i>
<span id="checkout_items" class="checkout_items">2</span> <span id="checkout_items" class="checkout_items">0</span>
</a> </a>
</li> </li>
</ul> </ul>
@@ -115,6 +115,18 @@
</header> </header>
<div class="fs_menu_overlay"></div>
<div class="hamburger_menu">
<div class="hamburger_close"><i class="fa fa-times" aria-hidden="true"></i></div>
<div class="hamburger_menu_content text-right">
<ul class="menu_top_nav">
<li class="menu_item"><a href="index.html">home</a></li>
<li class="menu_item"><a href="cart.html">cart</a></li>
<li class="menu_item"><a href="#">contact</a></li>
</ul>
</div>
</div>
<div class="container contact_container"> <div class="container contact_container">
<div class="row"> <div class="row">
<div class="col"> <div class="col">
@@ -279,13 +291,13 @@
<script> <script>
$(document).ready(function () { $(document).ready(function () {
if (localStorage.getItem('Heriot-Watt') === null) { if (localStorage.getItem('Test123_50') === null) {
console.log("here"); console.log("here");
var arr = new Array(); var arr = new Array();
localStorage.setItem('Heriot-Watt', JSON.stringify(arr)); localStorage.setItem('Test123_50', JSON.stringify(arr));
} }
var arr_json = JSON.parse(localStorage.getItem('Heriot-Watt')); var arr_json = JSON.parse(localStorage.getItem('Test123_50'));
$("#checkout_items").html(arr_json.length); $("#checkout_items").html(arr_json.length);
console.log(arr_json.length); console.log(arr_json.length);

View File

@@ -120,8 +120,8 @@
<div class="hamburger_menu_content text-right"> <div class="hamburger_menu_content text-right">
<ul class="menu_top_nav"> <ul class="menu_top_nav">
<li class="menu_item"><a href="#">home</a></li> <li class="menu_item"><a href="#">home</a></li>
<li class="menu_item"><a href="#">cart</a></li> <li class="menu_item"><a href="cart.html">cart</a></li>
<li class="menu_item"><a href="#">contact</a></li> <li class="menu_item"><a href="contact.html">contact</a></li>
</ul> </ul>
</div> </div>
</div> </div>
@@ -145,18 +145,15 @@
<div class="col text-center"> <div class="col text-center">
<div class="section_title new_arrivals_title"> <div class="section_title new_arrivals_title">
<h2>Our Products</h2> <h2>Our Products</h2>
<p><%= description %></p>
</div> </div>
</div> </div>
</div> </div>
<!---<div class="row align-items-center"> <!---<div class="row align-items-center">
<div class="col text-center"> <div class="col text-center">
<div class="new_arrivals_sorting"> <div class="new_arrivals_sorting">
<ul class="arrivals_grid_sorting clearfix button-group filters-button-group"> <ul class="arrivals_grid_sorting clearfix button-group filters-button-group">
<li class="grid_sorting_button button d-flex flex-column justify-content-center align-items-center active is-checked" data-filter="*">all</li> <li class="grid_sorting_button button d-flex flex-column justify-content-center align-items-center active is-checked" data-filter="*">all</li>
<li class="grid_sorting_button button d-flex flex-column justify-content-center align-items-center" data-filter=".women">women's</li>
<li class="grid_sorting_button button d-flex flex-column justify-content-center align-items-center" data-filter=".accessories">accessories</li>
<li class="grid_sorting_button button d-flex flex-column justify-content-center align-items-center" data-filter=".men">men's</li>
</ul> </ul>
</div> </div>
</div> </div>
@@ -168,20 +165,21 @@
<!-- Product 3 --> <!-- Product 3 -->
<% for(var i = 0; i < csv.length ; i++) {%> <% for(var i = 0; i < csv.length ; i++) {%>
<div class="product-item women"> <div class="product-item *">
<div class="product product_filter"> <div class="product product_filter">
<div class="product_image"> <div class="product_image">
<img src="<%= csv[i]['product image url'] %>" alt=""> <img src="<%= csv[i]['product image url'] %>" alt="">
</div> </div>
<div class="favorite"></div>
<div class="product_info"> <div class="product_info">
<h6 class="product_name"><a href="#"><a><%= csv[i]["product name"] %></a></h6> <h6 class="product_name"><a href="#"><a><%= csv[i]["product name"] %></a></h6>
<p><%= csv[i]["description"] %></p>
<div class="product_price">$<%= csv[i].cost %></div> <div class="product_price">$<%= csv[i].cost %></div>
</div> </div>
<br>
<div class="cart"><div class="red_button add_to_cart_button"><a onClick="additem('<%= csv[i]['product name'] %>', <%= csv[i].cost %>)" style="color:white">Add to cart</a></div></div>
</div> </div>
<div class="red_button add_to_cart_button"><a onClick="additem('<%= csv[i]['product name'] %>', <%= csv[i].cost %>)" style="color:white">Add to cart</a></div>
</div> </div>
<% } %> <% } %>
</div> </div>
</div> </div>
@@ -190,25 +188,38 @@
</div> </div>
<br> <br>
<br> <br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<!-- Footer -->
<!-- Footer --> <footer class="footer">
<div class="container">
<footer class="footer"> <div class="row">
<div class="container"> <div class="col-lg-12">
<div class="row"> <div class="footer_nav_container">
<div class="col-lg-12"> <div class="cr">©2018 All Rights Reserverd. This template is made with <i
<div class="footer_nav_container"> class="fa fa-heart-o" aria-hidden="true"></i> by <a href="#">Colorlib</a></div>
<div class="cr">©2018 All Rights Reserverd. This template is made with <i
class="fa fa-heart-o" aria-hidden="true"></i> by <a href="#">Colorlib</a></div>
</div>
</div> </div>
</div> </div>
</div> </div>
</footer> </div>
</footer>
</div> </div>
<script src="js/jquery-3.2.1.min.js"></script> <script src="js/jquery-3.2.1.min.js"></script>
<script src="styles/bootstrap4/popper.js"></script> <script src="styles/bootstrap4/popper.js"></script>
<script src="styles/bootstrap4/bootstrap.min.js"></script> <script src="styles/bootstrap4/bootstrap.min.js"></script>

View File

@@ -2,7 +2,7 @@
<html lang="en"> <html lang="en">
<head> <head>
<title>Heriot-Watt</title> <title>Test123</title>
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="description" content="Colo Shop Template"> <meta name="description" content="Colo Shop Template">
@@ -87,7 +87,7 @@
<div class="col-lg-12 text-right"> <div class="col-lg-12 text-right">
<div class="logo_container"> <div class="logo_container">
<a href="#"><img <a href="#"><img
src="https://www.google.com/url?sa=i&amp;url=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FHeriot-Watt_University&amp;psig=AOvVaw2fm-eoyZxj8ZIUEULdjZ5_&amp;ust=1589820225686000&amp;source=images&amp;cd=vfe&amp;ved=0CAIQjRxqFwoTCJj1i4Osu-kCFQAAAAAdAAAAABAD" src="https://hwtech.club/images/output-onlinepngtools.png"
class="img-fluid" style="height:5rem;" /></a> class="img-fluid" style="height:5rem;" /></a>
</div> </div>
<nav class="navbar"> <nav class="navbar">
@@ -120,8 +120,8 @@
<div class="hamburger_menu_content text-right"> <div class="hamburger_menu_content text-right">
<ul class="menu_top_nav"> <ul class="menu_top_nav">
<li class="menu_item"><a href="#">home</a></li> <li class="menu_item"><a href="#">home</a></li>
<li class="menu_item"><a href="#">cart</a></li> <li class="menu_item"><a href="cart.html">cart</a></li>
<li class="menu_item"><a href="#">contact</a></li> <li class="menu_item"><a href="contact.html">contact</a></li>
</ul> </ul>
</div> </div>
</div> </div>
@@ -129,7 +129,7 @@
<!-- Slider --> <!-- Slider -->
<div class="main_slider" <div class="main_slider"
style="background-image:url('https://ichef.bbci.co.uk/news/1024/cpsprodpb/E13E/production/_109726675_hwudubaineviewonline.jpg')"> style="background-image:url('https://i.ytimg.com/vi/SIQHKaMOCbU/maxresdefault.jpg')">
<div class="container fill_height"> <div class="container fill_height">
<div class="row align-items-center fill_height"> <div class="row align-items-center fill_height">
@@ -145,18 +145,15 @@
<div class="col text-center"> <div class="col text-center">
<div class="section_title new_arrivals_title"> <div class="section_title new_arrivals_title">
<h2>Our Products</h2> <h2>Our Products</h2>
<p>Loldfsdf sdfsdsdsfsd sd fsdrs d sdf </p>
</div> </div>
</div> </div>
</div> </div>
<!---<div class="row align-items-center"> <!---<div class="row align-items-center">
<div class="col text-center"> <div class="col text-center">
<div class="new_arrivals_sorting"> <div class="new_arrivals_sorting">
<ul class="arrivals_grid_sorting clearfix button-group filters-button-group"> <ul class="arrivals_grid_sorting clearfix button-group filters-button-group">
<li class="grid_sorting_button button d-flex flex-column justify-content-center align-items-center active is-checked" data-filter="*">all</li> <li class="grid_sorting_button button d-flex flex-column justify-content-center align-items-center active is-checked" data-filter="*">all</li>
<li class="grid_sorting_button button d-flex flex-column justify-content-center align-items-center" data-filter=".women">women's</li>
<li class="grid_sorting_button button d-flex flex-column justify-content-center align-items-center" data-filter=".accessories">accessories</li>
<li class="grid_sorting_button button d-flex flex-column justify-content-center align-items-center" data-filter=".men">men's</li>
</ul> </ul>
</div> </div>
</div> </div>
@@ -168,18 +165,34 @@
<!-- Product 3 --> <!-- Product 3 -->
<div class="product-item women"> <div class="product-item *">
<div class="product product_filter"> <div class="product product_filter">
<div class="product_image"> <div class="product_image">
<img src="https://www.raspberrypi.org/homepage-9df4b/static/hero-shot-33d83b8c5fa0933373dabcc9462b32a3.png" alt=""> <img src="https://i.stack.imgur.com/WxVXe.jpg" alt="">
</div> </div>
<div class="favorite"></div>
<div class="product_info"> <div class="product_info">
<h6 class="product_name"><a href="#"><a>Raspberry Pi</a></h6> <h6 class="product_name"><a href="#"><a>java</a></h6>
<div class="product_price">$400</div> <p>We all love java fsdf sdf&#39; sd&#39;f &#39;sdf sfsdf sdf sdf</p>
<div class="product_price">$130</div>
</div> </div>
<br>
<div class="cart"><div class="red_button add_to_cart_button"><a onClick="additem('java', 130)" style="color:white">Add to cart</a></div></div>
</div>
</div>
<div class="product-item *">
<div class="product product_filter">
<div class="product_image">
<img src="https://images-na.ssl-images-amazon.com/images/I/41IlAcQj9nL.jpg" alt="">
</div>
<div class="product_info">
<h6 class="product_name"><a href="#"><a>C</a></h6>
<p>C lord it is</p>
<div class="product_price">$200</div>
</div>
<br>
<div class="cart"><div class="red_button add_to_cart_button"><a onClick="additem('C', 200)" style="color:white">Add to cart</a></div></div>
</div> </div>
<div class="red_button add_to_cart_button"><a onClick="additem('Raspberry Pi', 400)" style="color:white">Add to cart</a></div>
</div> </div>
@@ -190,25 +203,38 @@
</div> </div>
<br> <br>
<br> <br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<!-- Footer -->
<!-- Footer --> <footer class="footer">
<div class="container">
<footer class="footer"> <div class="row">
<div class="container"> <div class="col-lg-12">
<div class="row"> <div class="footer_nav_container">
<div class="col-lg-12"> <div class="cr">©2018 All Rights Reserverd. This template is made with <i
<div class="footer_nav_container"> class="fa fa-heart-o" aria-hidden="true"></i> by <a href="#">Colorlib</a></div>
<div class="cr">©2018 All Rights Reserverd. This template is made with <i
class="fa fa-heart-o" aria-hidden="true"></i> by <a href="#">Colorlib</a></div>
</div>
</div> </div>
</div> </div>
</div> </div>
</footer> </div>
</footer>
</div> </div>
<script src="js/jquery-3.2.1.min.js"></script> <script src="js/jquery-3.2.1.min.js"></script>
<script src="styles/bootstrap4/popper.js"></script> <script src="styles/bootstrap4/popper.js"></script>
<script src="styles/bootstrap4/bootstrap.min.js"></script> <script src="styles/bootstrap4/bootstrap.min.js"></script>
@@ -220,13 +246,13 @@
<script> <script>
$(document).ready(function () { $(document).ready(function () {
if (localStorage.getItem('Heriot-Watt') === null) { if (localStorage.getItem('Test123_50') === null) {
console.log("here"); console.log("here");
var arr = new Array(); var arr = new Array();
localStorage.setItem('Heriot-Watt', JSON.stringify(arr)); localStorage.setItem('Test123_50', JSON.stringify(arr));
} }
var arr_json = JSON.parse(localStorage.getItem('Heriot-Watt')); var arr_json = JSON.parse(localStorage.getItem('Test123_50'));
$("#checkout_items").html(arr_json.length); $("#checkout_items").html(arr_json.length);
console.log(arr_json.length); console.log(arr_json.length);
@@ -235,11 +261,11 @@
function additem(name, price) { function additem(name, price) {
var data = { 'name': name, 'price': price }; var data = { 'name': name, 'price': price };
var arr_json = JSON.parse(localStorage.getItem('Heriot-Watt')); var arr_json = JSON.parse(localStorage.getItem('Test123_50'));
console.log(typeof (arr_json)); console.log(typeof (arr_json));
arr_json.push(data); arr_json.push(data);
localStorage.setItem('Heriot-Watt', JSON.stringify(arr_json)); localStorage.setItem('Test123_50', JSON.stringify(arr_json));
console.log(JSON.parse(localStorage.getItem('Heriot-Watt'))); console.log(JSON.parse(localStorage.getItem('Test123_50')));
$('#checkout_items').html(arr_json.length); $('#checkout_items').html(arr_json.length);
} }
</script> </script>

View File

@@ -1031,14 +1031,11 @@ section
} }
.product-item:hover::after .product-item:hover::after
{ {
box-shadow: 0 25px 29px rgba(63, 78, 100, 0.15);
border: solid 2px rgba(235,235,235,1);
} }
.product .product
{ {
width: 100%; width: 100%;
height: 340px; height: 340px;
border-right: solid 1px #e9e9e9;
} }
.product_image .product_image
{ {

File diff suppressed because it is too large Load Diff

View File

@@ -4,13 +4,19 @@
"description": "", "description": "",
"main": "test.js", "main": "test.js",
"scripts": { "scripts": {
"test": "node website_test.js http://localhost:8004", "test-web": "node website_test.js http://localhost:8004",
"test": "mocha",
"start": "node index.js" "start": "node index.js"
}, },
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"common-tags": "^1.8.0",
"request": "^2.88.2", "request": "^2.88.2",
"whatsapp-web.js": "^1.7.0" "whatsapp-web.js": "^1.7.0"
},
"devDependencies": {
"chai": "^4.2.0",
"mocha": "^8.0.1"
} }
} }

View File

@@ -1,20 +1,628 @@
const { Website } = require("../models/website"); const { Website } = require("../models/website");
const { data } = require("../models/data"); const { data } = require("../models/data");
const { Product } = require('../models/product');
const { User } = require('../models/user');
const fs = require('fs');
const request = require('request');
const {stripIndents} = require('common-tags');
/**
* user to be sent the message to
* @type { User }
*/
let user = null;
/**
* input to be used in the function if exists
* @type {string}
*/
let input = null;
const base64_decode = async (base64str, file) => {
var bitmap = await Buffer.from(base64str, 'base64');
await fs.writeFileSync(file, bitmap);
console.log('****** File created from base64 encoded string ******');
module.exports.onWG = () => {
console.log('hello world');
} }
module.exports.onCreate = (id, companyName) => {
//get the user const saveImage = async (messageMedia, fileName) => {
let user = data.getUser(id); let file = `../website-generator/public/images/${fileName}.jpg`;
if(user == undefined) await base64_decode(messageMedia.data, file);
return file;
}
const addProduct = (id) => {
// Create a product and select it.
//At this point all the product properties will be default
var product = new Product({id : id});
// Add a product to the selected website.
user.getSelectedWebsite().addProduct(product);
}
const check = ({checkFunction, callback}) => {
let checkValue = checkFunction();
//if check value is false
if(checkValue == '')
{ {
data.addUser(id); return callback();
user = data.getUser(id);
} }
//add the website with the company name return checkValue;
user.addWebsite(new Website(companyName));
} }
const checkMediaExist = () => {
if(input['media'] == undefined){
return [
`A media should be attached with the message`,
`Please attach an image or file with the caption being the command`
];
}
return '';
}
const checkSelectedWebsiteExist= () => {
if(user.getSelectedWebsite() == null)
{
return [
`A website should be selected or created `,
`To create website, please use the following command : `,
`*wg create <company-name>*`,
];
}
return '';
}
const checkSelectedProductExist = () => {
return check({
checkFunction : checkSelectedWebsiteExist,
callback : () => {
if(user.getSelectedWebsite().getSelectedProduct() == null)
{
return [
`A product should be created or selected`
]
}
return '';
}
});
}
module.exports.setUser = (id) =>{
if(!data.isUser(id))
{
data.addUser(new User(id));
}
user = data.getUser(id)
};
module.exports.setInput= (value) => {
input = value;
}
module.exports.onCreateProduct = () => {
return check({
checkFunction : checkSelectedWebsiteExist,
callback : () => {
//add the product
addProduct(input['id']);
let selectedId = user.getSelectedWebsite().getSelectedProduct().id;
//mesage to be sent to the user
let message = [
`The product has been created with the id : ${selectedId}` ,
//use stripIndents to strip the indentation
stripIndents`
This product has been selected.
Now you can make change to the product with the following commands :
1. wg product info
2. wg product name <product-name>
3. wg product cost <product-cost>
4. wg product desc <product-desc>
5. wg product image *with an image attached*
`
];
return message;
}
});
}
module.exports.onDeleteProduct = () => {
return check({
checkFunction : checkSelectedWebsiteExist,
callback : () => {
if(!user.getSelectedWebsite().deleteProduct(input['id']))
{
return [
`No product with the given id`
];
}
return [
`The product has been deleted with the id : ` + input['id']
];
}
});
}
module.exports.onSelectProduct = () => {
return check({
checkFunction : checkSelectedWebsiteExist,
callback : () => {
if(!user.getSelectedWebsite().selectProduct(input['id']))
{
return [
`There was no product with the given id. Use the following command to get the list of all products`,
`wg product all`
];
}
return [
`The product has been selected with the id : ${user.getSelectedWebsite().getSelectedProduct().id}` ,
stripIndents`
This product has been selected.
Now you can make change to the product with the following commands :
1. wg product info
2. wg product name <product-name>
3. wg product cost <product-cost>
4. wg product desc <product-desc>
5. wg product image *with an image attached*
`
];
}
});
}
module.exports.onGetAllProducts = () => {
return check({
checkFunction : checkSelectedWebsiteExist,
callback : () => {
let message = [
'Your website has following products: '
];
for(let p of user.getSelectedWebsite().getAllProduct())
{
let m = 'Product id: ' + p.id + '\nProduct Name : ' + p.name + '\nProduct description : '+ p.desc + '\nProduct Cost: ' + p.cost + '\nProduct Image : ';
message.push(m);
message.push(p.image);
}
return message;
}
});
}
module.exports.onGetProductInfo = () => {
return check({
checkFunction : checkSelectedProductExist,
callback : () => {
let selected_product = user.getSelectedWebsite().getSelectedProduct();
return [
stripIndents`
Product id: ${selected_product.id}
Product Name : ${selected_product.name}
Product description : ${selected_product.desc }
Product Cost: ${selected_product.cost}
Product Image :`,
selected_product.image
];
}
});
}
module.exports.onSetProductName = () => {
return check({
checkFunction : checkSelectedProductExist,
callback : () => {
let selected_product = user.getSelectedWebsite().getSelectedProduct();
selected_product.setName(input['product-name']);
return [
'The product name has been set to '+ selected_product.name
];
}
});
}
module.exports.onSetProductCost = () => {
return check ({
checkFunction : checkSelectedProductExist,
callback : () => {
let selected_product = user.getSelectedWebsite().getSelectedProduct();
selected_product.setCost(input['product-cost']);
return[
'The product cost has been set to '+ selected_product.cost
];
}
});
}
module.exports.onSetProductDesc = () => {
return check({
checkFunction : checkSelectedProductExist,
callback : () => {
let selected_product = user.getSelectedWebsite().getSelectedProduct();
selected_product.setDesc(input['product-desc']);
let message = [
'The product desc has been set to '+ selected_product.desc
];
return message;
}
});
}
module.exports.onSetProductImage = () => {
return check({
checkFunction : checkSelectedProductExist,
callback : () => {
return check({
checkFunction : checkMediaExist,
callback : async () => {
let selected_product = user.getSelectedWebsite().getSelectedProduct();
selected_product.setImage(input['media']);
//filename to be set
let filename = `${user.id.slice(3,10)}${user.getSelectedWebsite().companyName}${selected_product.id}`;
//url for the image that are saved
selected_product.imageUrl = await saveImage(input['media'], filename);
let message = [
'The product image has been set to the following image',
selected_product.image
];
return message;
}
});
}
});
}
/**
* A help function
* @param {void} nothing
* @return {help_signal} details on how to use the website
*/
module.exports.help = () =>
{
let help_signal = [
`NOTE : text between '<>' are replaceable.`,
`NOTE : Sentences needs to be between qoutes. For Example "I am a bot" `
`*wg create <company_name> Create a website with the given company_name*`,
`*wg website select <company_name>* Selects a website if exists`,
`*wg website firstname <firstName>* Sets the firstname`,
`*wg website lastname <lastName>* Sets the firstname`,
`*wg website logo (with an image attached)* Sets the logo`,
`*wg website banner (with an image attached)* Sets the banner`,
`*wg website desc <description>* Sets the description`,
`*wg website email <email>* Sets the email`,
`*wg website finished* Completes and creates the website`,
`*wg product new <id>* Creates a new product with an id`,
`*wg product select <id>* Selects a product with a given id`,
`*wg product all* Shows all the products`,
`*wg product info* Shows the information of the selected product`,
`*wg product name <name>* Sets the name of the product`,
`*wg product desc <description>* Sets the description of the product`,
`*wg product cost <cost>* Sets the cost of the product`,
`*wg product image (with an image attached)* Sets the image of the product`,
];
return help_signal;
}
module.exports.onSelectWebsite = () => {
if(user.isWebsite(input['company_name']))
{
user.selectWebsite(input['company_name']);
return [`Website with the company name *${user.getSelectedWebsite().companyName}* is selected`]
}
return [`No website with the company name *${input['company_name']}* has been selected`];
}
/**
* wg create
* @param {string} input of the company name
* @return {void} gives information on how to add details to website
*/
module.exports.onCreateWebsite = () =>
{
user.addWebsite(new Website(input['company_name']));
return [
`A website with the company name *${user.getSelectedWebsite().companyName}* is created`,
stripIndents`
wg website firstname *<First_Name>*
wg website lastname *<Last_Name>*
wg website logo *with an image attached*
wg website banner *with an image attached*
wg website description *<Description>*
wg website email *<Email>*
For adding information use *wg website <firstname>*`
];
}
module.exports.onGetInfo = () => {
return check({
checkFunction : checkSelectedWebsiteExist,
callback : () => {
let website = user.getSelectedWebsite();
return [
stripIndents`
First Name : ${website.firstName}
Last Name : ${website.lastName}
Company Name (id) : ${website.companyName }
Description : ${website.desc}
Email : ${website.email}
Banner :`,
website.banner,
`Logo :`,
website.logo
];
}
});
}
/**
* wg website firstname
* @param {string} input of the firstname for website
* @return {void} informs you that first name has been added
*/
module.exports.onSetFirstName = () =>
{
return check({
checkFunction : checkSelectedWebsiteExist,
callback : () => {
user.getSelectedWebsite().firstName = input['firstName'];
return [`First name has been set to ${user.getSelectedWebsite().firstName}`];
}
});
}
/**
* wg website lastname
* @param {string} input of the last name for website
* @return {void} informs you that last name has been added
*/
module.exports.onSetLastName = () =>
{
return check({
checkFunction : checkSelectedWebsiteExist,
callback : () => {
user.getSelectedWebsite().lastName = input['lastName'];
return [`Last name has been set to ${user.getSelectedWebsite().lastName}`];
}
});
}
/**
* wg website logo
* @param {string} input of the logo URL for website
* @return {void} informs you that logo URL has been added
*/
module.exports.onSetLogo = () =>
{
return check({
//check if website exist
checkFunction : checkSelectedWebsiteExist,
callback: () => {
return check({
//check if media exist
checkFunction: checkMediaExist,
callback : async () => {
user.getSelectedWebsite().logo = input['media'];
user.getSelectedWebsite().logoUrl = await saveImage(input['media'], `${user.id.slice(3,10)}${user.getSelectedWebsite().companyName}logo`);
return [
`Logo has been set to the following logo`,
user.getSelectedWebsite().logo
];
}
});
}
})
}
/**
* wg website banner
* @param {string} input of the banner URL for website
* @return {void} informs you that banner URL has been added
*/
module.exports.onSetBanner = () =>
{
return check({
//check if website exist
checkFunction : checkSelectedWebsiteExist,
callback : () => {
//check if media exist
return check({
checkFunction : checkMediaExist,
callback : async () => {
user.getSelectedWebsite().banner = input['media'];
user.getSelectedWebsite().bannerUrl = await saveImage(input['media'], `${user.id.slice(3,10)}${user.getSelectedWebsite().companyName}banner`);
return [
`Banner has been set to the following banner`,
user.getSelectedWebsite().banner
];
}
})
}
});
}
/**
* wg website description
* @param {string} input of the company description for website
* @return {void} informs you that description has been added
*/
module.exports.onSetDesc = (descriptiondata) =>
{
return check({
checkFunction : checkSelectedWebsiteExist,
callback : () => {
user.getSelectedWebsite().desc = input['desc'];
return [`Banner has been set to ${user.getSelectedWebsite().desc}`];
}
});
}
/**
* wg website email
* @param {string} input of the email for website
* @return {void} informs you that email has been added
*
*/
module.exports.onSetEmail = () =>
{
return check({
checkFunction : checkSelectedWebsiteExist,
callback : () => {
user.getSelectedWebsite().email = input['email'];
return [`Email has been set to ${user.getSelectedWebsite().email}`];
}
});
}
module.exports.onWebsiteFinished = () => {
return check({
checkFunction : checkSelectedWebsiteExist,
callback : async () => {
//get json from the website
let json = user.getSelectedWebsite().toJson();
//creates a promise
//resolve and reject value is going to be returned
//resolve value = message to be sent
let res = new Promise( (resolve, reject) => {
request({
url: process.argv[2]+"/generate",
method: "POST",
headers: {
"content-type": "application/json", // <--Very important!!!
},
body: json
}, (error, response, body) => {
//send reject value in promise if error exist
if(error)
{
return reject(error);
}
// messsage to be sent
let returnStatement = [
`${process.argv[2]}/pages/${JSON.parse(response.body).directory}`,
`*Website ID:* ${JSON.parse(response.body).directory}`,
`*Important to remember the ID*`
];
//send resolve value id
resolve(returnStatement);
});
});
//waits for request to be completed
let msg = await res;
return msg;
}
});
}
module.exports.onDeployWebsite = () => {
return check({
checkFunction: checkSelectedProductExist,
callback : async () => {
let res = new Promise( (resolve, reject) => {
request({
url: process.argv[2]+"/ipfsdeploy?id="+user.getSelectedWebsite().companyName,
method: "GET",
headers: {
"content-type": "application/json", // <--Very important!!!
}
}, function (error, response, body){
// reject error in promise
if(error)
{
return reject(error);
}
// messsage to be sent
let returnStatement = [
`https://ipfs.io/ipfs/${JSON.parse(response.body).data}`,
`Takes around 10-30 minutues to deploy`,
`Read more about IPFS https://ipfs.io/`
];
//send resolve value id
resolve(returnStatement);
});
});
let msg = await res;
return msg;
}
});
}

View File

@@ -1,47 +1,41 @@
# Commands available for user interaction # Commands available for user interaction
*wg* -> Command wg help to get the avaialabe instructions `wg` -> Command wg help to get the avaialabe instructions.
*wg help* -> The following are the available commands: `wg help` -> All the commands will be made be displayed to the user.
*wg create <company name> -> creates a website without details `wg website <company name>` -> if a website exists with the same **company name**, then that website is selected, else it creates a new website.
# Note: ### Note:
After the user uses *wg create <company name>*. The bot should instruct the user to enter the rest of the details. After the user uses `wg create <company name>`. The bot should instruct the user to enter the rest of the details.
To see the details to be entered, please check *website.js* under models folder. To see the details to be entered, please check [website.js](https://github.com/HWTechClub/Custom-Static-Website-Generator/blob/master/whatsapp-web.js/src/models/website.js) under models folder.
The commands should follow the rules below : The commands should follow the rules below :
*wg website firstName* `wg website firstName`, `wg website lastName`, etc..
*wg website lastName*
...etc
### Following commands only works when a website is created
`wg product all` -> shows all the products that are created.
`wg product new` -> creates a new product with generated Id.
`wg product <id>` -> if the id exists, the product with *id* is selected, else, create a new product with the id given.
### NOTE :
# Following commands only works when a website is created
*wg product all* -> shows all the products that are created
*wg product new* -> creates a new product with generated Id
*wg product <id>* -> if the id exists, the product with “id“ is selected, else, create a new product with the id given
# NOTE :
User should be given feedback on their commands. For example: User should be given feedback on their commands. For example:
If a user created a product, the bot should reply, "a product has been created with the id : <id>" If a user created a product, the bot should reply, *a product has been created with the id : <id>*.
If a user created a product without a website, the bot should handle the error and reply, "A website should be selected or created before creating a product" If a user created a product without a website, the bot should handle the error and reply, *A website should be selected or created before creating a product*.
# Following command only works if a product is selected ### Following command only works if a product is selected
*wg product info* -> shows the information about the product. Ie name, cost, description, image `wg product info` -> shows the information about the product. Ie name, cost, description, image.
*wg product name* <product-name> -> set the name of the product `wg product name <product-name>` -> set the name of the product.
*wg product cost* <product-cost> -> set the cost of the product `wg product cost <product-cost>` -> set the cost of the product.
*wg product desc* <product-desc> -> set the description of the product `wg product desc <product-desc>` -> set the description of the product.
*wg product image* <product-image> -> sets the image of the product. The caption of the image should be the command. `wg product image <product-image>` -> sets the image of the product. The caption of the image should be the command.
*wg finished* -> creates the website and gives a link to the website maker
# delete
Users should be able to delete products and website
*wg delete product <id>*
*wg delete website <company name>*
### Create the website
`wg website finished` -> creates the website and gives a link to the website maker.
# Delete
Users should be able to delete products and website.
`wg delete product <id>`, `wg delete website <company name>`
# Note: # Note:
If you think these commands are not enough, please add them in a seperate section with a clear defination. If you think these commands are not enough, please add them in a seperate section with a clear defination.

View File

@@ -1,10 +1,160 @@
const fs = require('fs');
class Command{ class Command{
/**
constructor({command,callback}){ *
* @param {{string, function(),boolean}} param0
*/
constructor({command,callback, requireMedia = false}){
this.command = command; this.command = command;
this.callback = callback; this.callback = callback;
this.requireMedia = requireMedia;
this.requireInput = false;
this.inputPos = [];
this._requireInput();
} }
/**
* Checks if a message is equal to the command.
* @param {string} message
*/
equals(message){
let msg = message.trim();
//check if the command is exactly equals to the msg
//if mathces then return true
//else if we check if the command requires an input
//if not, then we return false
if(this.command == msg){
return true
}else if(this.requireInput){
//the command requires input
let splitCommand = this.command.split(' ');
let splitMsg = this._getSplitMessage(message);
//check the number of words both has
//if not same then return false
//else iterate through all the words
if(splitCommand.length == splitMsg.length)
{
for(let i = 0; i < splitMsg.length; i++)
{
//if words matches then continue
//if the word is a input then continue
//else return false
if(splitMsg[i] == splitCommand[i]){
continue;
}else if(splitCommand[i].match(/[<>]/g) != null){
continue;
}else{
return false;
}
}
// all the words are matched to each other or to an input field
return true;
}
//the message is not the same as the command
return false;
}
return false;
}
/**
* Only used in class
*
* This determines if the command requires input
* if the command has <inputName> in the string
* then the command requires input
*
* else if the command requires media
* then the command requires input
*/
_requireInput(){
if(this.requireMedia)
{
this.requireInput = true;
return;
}
let msg = this.command;
let matched = msg.match(/[<>]/g);
this.requireInput = matched != null && matched.length > 1;
}
/**
* returns an array of string or MessageMedia representing the inputs of the command
* @param {import("whatsapp-web.js").Message} message
*/
async getInput(message){
if(this.requireMedia){
return await this._getInputMedia(message);
}else{
return this._getInputMessage(message.body);
}
}
/**
* Returns an object with string input from a message
* The string is mapped to the command variable
* @param {string} msgString
*/
_getInputMessage(msgString){
let input = {};
let splitMsg = this._getSplitMessage(msgString);
let splitCommand = this.command.split(' ');
for(let i = 0; i < splitMsg.length; i++){
if(splitCommand[i].startsWith('<')){
let key = splitCommand[i].slice(1, splitCommand[i].length-1);
input[key] = splitMsg[i];
}
}
return input;
}
/**
* Splits the message into an array of words
* Splits the message by space and ""
* @param {string} msg
*/
_getSplitMessage(msg){
let split = msg.split(/["]/g);
if(split.length > 1)
{
let splitMsg = split[0].trim().split(' ');
let inputs = split.slice(1).filter( el => el.trim() == "" ? null : el);
splitMsg = splitMsg.concat(inputs);
return splitMsg;
}
return msg.split(' ');
}
/**
* Returns an object with a meesageMedia mapped to 'media'
* @param {import("whatsapp-web.js").Message} message
*/
async _getInputMedia(message){
let input = {};
if(message.hasMedia){
let media = await message.downloadMedia();
input['media'] = media;
}
return input;
}
} }
module.exports.Command = Command; module.exports.Command = Command;

View File

@@ -1,22 +1,18 @@
const { Entity } = require("./entity");
const { User } = require("./user"); const { User } = require("./user");
const { Website } = require("./website");
module.exports.data = new StructuredData();
class StructuredData { class StructuredData {
constructor() { constructor() {
this.data={}; this.entity = new Entity();
} }
/**
addUser(id){ * Adds a user
if(this.data[id] != undefined) * @param {User} user
{ */
this.data[id] = new User(id); addUser(user){
return true return this.entity.addData(user.id, user);
}
return false;
} }
/** /**
@@ -25,22 +21,37 @@ class StructuredData {
* @returns {User} * @returns {User}
*/ */
getUser(id){ getUser(id){
return this.data[id]; return this.entity.getData(id);
} }
/**
* Delete the user with a specific id
* @param {string} id
*/
deleteUser(id){ deleteUser(id){
if(this.data[id] != undefined) return this.entity.deleteData(id)
{ }
return delete this.data[id];
} /**
* Check if a user with the given id exists
* @param {string} id
*/
isUser(id){
return this.entity.isData(id);
}
return false; /**
* Clears all the data stored
*/
clearData(){
this.entity.clearData();
} }
} }
module.exports.data = new StructuredData();
/* /*
data structured: data structured:
data = { data = {

View File

@@ -0,0 +1,80 @@
class Entity {
constructor(){
this.data = new Map();
this.selectedData = null;
this.count = 0;
}
addData(key ,value){
if(!this.isData(key)){
this.data.set(key, value);
this.selectedData = key;
return true;
}
return false;
}
/**
* check if key exists
* @param {string} key
*/
isData(key){
return this.data.has(key) ? true : false;
}
deleteData(key){
if(this.isData(key)){
this.data.delete(key);
if(this.selectedData == key){
this.selectedData = null;
}
return true;
}
return false;
}
clearData(){
this.selectedData = null;
this.data = new Map();
this.count = 0;
}
/**
* Select a specific data with its key
* @param {string} key
* @returns true if a data is selected
* @returns false if data is null
*/
selectData(key){
if(this.isData(key))
{
this.selectedData = key;
return true;
}
return false;
}
/**
*
* @param {string} key
* @returns the value mapped to the key
*/
getData(key){
if(this.isData(key)){
return this.data.get(key);
}
return null;
}
/**
* @returns a map of all data
*/
getAllData(){
return this.data;
}
}
module.exports.Entity = Entity;

View File

@@ -1,48 +1,49 @@
class Product { class Product {
constructor({ id = '', name = '', desc = '', cost = 0, image = null }) { constructor({ id = '', name = '', desc = '', cost = 0, image = null } = {}) {
this.id = id; this.id = id;
this.name = name; this.name = name;
this.desc = desc; this.desc = desc;
this.cost = cost; this.cost = cost;
this.image = image; this.image = image;
this.imageUrl = '';
} }
getId(){ /**
return this.id; *
* @param {Number} id
*/
setId(id){
return this.id = id;
} }
/**
*
* @param {String} name
*/
setName(name){ setName(name){
this.name = name; return this.name = name;
} }
/**
getName(){ *
return this.name; * @param {String} description
*/
setDesc(description){
return this.desc = description;
} }
/**
setDesc(desc){ *
this.desc = desc; * @param {Number} cost
} */
getDesc(){
return this.desc;
}
setCost(cost){ setCost(cost){
this.cost = cost; return this.cost = cost;
} }
/**
getCost(){ *
return this.cost; * @param {String} image
} */
setImage(image){ setImage(image){
this.imageUrl = image; return this.image = image;
}
getImage(){
return this.imageUrl;
} }
} }

View File

@@ -1,14 +1,16 @@
const { Entity } = require('./entity');
const {Website} = require('./website'); const {Website} = require('./website');
class User{ class User{
/**
*
* @param {string} id
*/
constructor(id){ constructor(id){
this.id = id; this.id = id;
//uses key value pair to store website this.websites = new Entity();
//key is the companyName of the website
//value is the website itself
this.websites = {};
} }
/** /**
@@ -16,26 +18,31 @@ class User{
* @param {Website} website * @param {Website} website
*/ */
addWebsite(website){ addWebsite(website){
if(this.websites[website.companyName] != undefined) return this.websites.addData(website.companyName, website);
{
return false;
}else{
this.websites[website.companyName] = website;
return true;
}
} }
deleteWebsite(companyName){ deleteWebsite(companyName){
if(this.websites[companyName] != undefined) return this.websites.deleteData(companyName);
{
return delete this.websites[companyName];
}else{
return false
}
} }
getWebsite(companyName){ getWebsite(companyName){
return this.websites[companyName]; return this.websites.getData(companyName);
}
isWebsite(companyName){
return this.websites.isData(companyName);
}
selectWebsite(companyName)
{
return this.websites.selectData(companyName);
}
/**
* @returns {Website}
*/
getSelectedWebsite(){
return this.getWebsite(this.websites.selectedData);
} }
} }

View File

@@ -1,3 +1,4 @@
const { Entity } = require('./entity');
const {Product} = require('./product'); const {Product} = require('./product');
class Website { class Website {
@@ -9,6 +10,8 @@ class Website {
this.firstName = ''; this.firstName = '';
this.lastName = ''; this.lastName = '';
this.companyName = companyName; this.companyName = companyName;
this.logo = '';
this.banner = '';
this.logoUrl = ''; this.logoUrl = '';
this.bannerUrl = ''; this.bannerUrl = '';
this.desc = ''; this.desc = '';
@@ -16,7 +19,7 @@ class Website {
//uses key value pair to store product //uses key value pair to store product
//key is the productId of the product //key is the productId of the product
//value is the product itself //value is the product itself
this.products = {}; this.products = new Entity();
} }
/** /**
@@ -24,13 +27,7 @@ class Website {
* @param {Product} product * @param {Product} product
*/ */
addProduct(product){ addProduct(product){
if(this.products[product.id] == undefined) return this.products.addData(product.id, product);
{
this.products[product.id] = product;
return true
}
return false;
} }
/** /**
@@ -39,7 +36,15 @@ class Website {
* @returns {Product} * @returns {Product}
*/ */
getProduct(productId){ getProduct(productId){
return this.products[productId]; return this.products.getData(productId);
}
/**
*
* returns all the products in the website
*/
getAllProduct(){
return this.products.getAllData().values();
} }
/** /**
@@ -47,12 +52,42 @@ class Website {
* @param {string} productId * @param {string} productId
*/ */
deleteProduct(productId){ deleteProduct(productId){
if(this.products[productId] != undefined)
{
return delete this.products[productId];
}
return false; return this.products.deleteData(productId);
}
selectProduct(productId){
return this.products.selectData(productId);
}
/**
* @returns {Product}
*/
getSelectedProduct()
{
return this.getProduct(this.products.selectedData);
}
toJson(){
let j = {};
j["firstName"] = this.firstName;
j["lastName"] = this.lastName;
j["companyName"] = this.companyName;
j["logoUrl"] = this.logoUrl;
j["bannerUrl"] = this.bannerUrl;
j["email"] = this.email;
j["description"] = this.desc;
j["template"] = 'Colo_Shop';
let csv = 'product id,product name,description,cost,product image url\n';
for (let prod of this.products.getAllData().values())
{
let m = [prod.id, prod.name, prod.desc, prod.cost, prod.imageUrl].join(',');
csv += `${m}\n`;
}
j['csv'] = csv;
return JSON.stringify(j);
} }

View File

@@ -1,17 +1,20 @@
const { Command } = require("../models/commands"); const { Command } = require("../models/commands");
const logic = require("../businessLogic/logic"); const logic = require("../businessLogic/logic");
const { Website } = require("../models/website");
const { Product } = require('../models/product');
///////////
//add the commands here
/////////// //commands and the corresponding function to be executed
//are input in the array
const commands = [ const commands = [
new Command({ new Command({
//User command //User command
command: 'wg', command: 'wg',
//function to be executed //function to be executed
callback : () => { callback : (input) => {
logic.onWG(); logic.onWG();
//mesage to be sent to the user //mesage to be sent to the user
@@ -23,28 +26,215 @@ const commands = [
return message; return message;
} }
}), }),
new Command({
//User command
command: `wg product new <id>`,
//function to be executed
callback : logic.onCreateProduct
}),
new Command({
//User command
command: `wg product delete <id>`,
//function to be executed
callback : logic.onDeleteProduct
}),
new Command({
//User command
command: `wg product select <id>`,
//function to be executed
callback : logic.onSelectProduct
}),
//gives user information on how to create website
new Command({
//User command
command: 'wg help',
//function to be executed
callback : logic.help
}),
//helps user to create a website. The first step.
new Command({
//User command
command: 'wg create <company_name>',
//function to be executed
callback : logic.onCreateWebsite
}),
//Inputs user's first name for website
new Command({
//User command
command: 'wg website select <company_name>',
callback : logic.onSelectWebsite
}),
new Command({
//User command
command: 'wg website firstname <firstName>',
//function to be executed
callback : logic.onSetFirstName
}),
//inputs user last name in website
new Command({
//User command
command: 'wg website lastname <lastName>',
//function to be executed
callback : logic.onSetLastName
}),
//inputs the logo of the company to website using url of logo
new Command({
//User command
command: 'wg website logo',
//function to be executed
callback : logic.onSetLogo,
requireMedia : true
}),
//inputs the banner for the company to website using url of banner
new Command({
//User command
command: 'wg website banner',
//function to be executed
callback : logic.onSetBanner,
requireMedia: true,
}),
//inputs the description of the company to be seen in the website
new Command({
//User command
command: 'wg website desc <desc>',
//function to be executed
callback : logic.onSetDesc
}),
//inputs the email of the company for contacting.
new Command({
//User command
command: 'wg website email <email>',
//function to be executed
callback : logic.onSetEmail
}),
new Command({
//User command
command: 'wg website info',
//function to be executed
callback : logic.onGetInfo
}),
new Command({
//User command
command: 'wg website finished',
//function to be executed
callback : logic.onWebsiteFinished
}),
//gives user information on how to create website
new Command({
//User command
command: `wg product all`,
//function to be executed
callback : logic.onGetAllProducts
}),
new Command({
//User command
command: `wg product info`,
//function to be executed
callback : logic.onGetProductInfo
}),
new Command({
//User command
command: `wg product name <product-name>`,
//function to be executed
callback : logic.onSetProductName
}),
new Command({
//User command
command: `wg product cost <product-cost>`,
//function to be executed
callback : logic.onSetProductCost
}),
new Command({
//User command
command: 'wg product desc <product-desc>',
//function to be executed
callback : logic.onSetProductDesc
}),
new Command({
//User command
command: 'wg product image',
//function to be executed
callback : logic.onSetProductImage,
requireMedia: true
}),
]; ];
module.exports= onMessage = async (message, client) => {
const onMessage = (message, client) => {
let command = null; let command = null;
//if the message start with wg then proceed //if the message start with wg then proceed
if(message.body.startsWith("wg")) if(message.body.startsWith("wg"))
{ {
//loop through all the commands
for (let c of commands){ for (let c of commands){
if(c.command == message.body) //check if the message sent is equal to the commands
//if the message matches a command,
//then save the command in the command variable
if(c.equals(message.body))
{ {
command = c; command = c;
break; break;
} }
} }
//if the command is not null, implies, the message sent is a valid command
if(command != null){ if(command != null){
let messageToBeSent = command.callback(); let input = {};
//check if the command requires input
if(command.requireInput){
input = await command.getInput(message);
}
//determine the user
logic.setUser(message.id.remote);
//determine the input
logic.setInput(input);
//call callback function in the command
//await is used, so that if a command is an async function
//the program will wait until it is finished
//the callback returns a message to be sent to the user
let messageToBeSent = await command.callback();
// send the message to the user
for (let msg of messageToBeSent) for (let msg of messageToBeSent)
{ {
client.sendMessage(message.from, msg, new Object()); client.sendMessage(message.from, msg, new Object());
@@ -54,6 +244,7 @@ const onMessage = (message, client) => {
}; };
module.exports.onMessage = onMessage;
//export default onMessage; //export default onMessage;

View File

@@ -0,0 +1,196 @@
const { Command } = require('../src/models/commands');
const expect = require('chai').expect;
describe('Command', () => {
it('Test : requireInput() without input', () => {
let a = new Command({
command: "wg create",
callback: () => {
}
});
expect(a.requireInput).to.false;
});
it('Test : requireInput() with input', () => {
let a = new Command({
command: "wg create <id>",
callback: () => {
}
});
expect(a.requireInput).to.true;
});
it('Test : requireInput() with 2 inputs', () => {
let a = new Command({
command: "wg create <id> <name>",
callback: () => {
}
});
expect(a.requireInput).to.true;
});
it('Test : equals() without input', () => {
let message = 'wg website';
let a = new Command({
command: "wg create <id>",
callback: () => {
}
});
let b = new Command({
command: "wg website",
callback: () => {
}
});
let c = new Command({
command: "wg product p12",
callback: () => {
}
});
let d = new Command({
command: "wg",
callback: () => {
}
});
expect(a.equals(message)).to.false;
expect(b.equals(message)).to.true;
expect(c.equals(message)).to.false;
expect(d.equals(message)).to.false;
});
it('Test : equals() with input', () => {
let message = 'wg create p12';
let a = new Command({
command: "wg create <id>",
callback: () => {
}
});
expect(a.equals(message)).to.true;
});
it('Test : equals() with different message', () => {
let message = 'wg website web';
let a = new Command({
command: "wg create <id>",
callback: () => {
}
});
expect(a.equals(message)).to.false;
});
it('Test : equals() with spelling error', () => {
let message = 'wg websit';
let b = new Command({
command: "wg website",
callback: () => {
}
});
expect(b.equals(message)).to.false;
});
it('Test : equals() with extra inputs', () => {
let message = 'wg create p12 pr';
let a = new Command({
command: "wg create <id>",
callback: () => {
}
});
expect(a.equals(message)).to.false;
});
it('Test : _getInputMessage() with 1 input', () => {
let message = 'wg create p12'
let a = new Command({
command: "wg create <id>",
callback: () => {
}
});
expect(a._getInputMessage(message)['id']).to.equal('p12');
});
it('Test : _getInputMessage() with 2 input', () => {
let message = 'wg create p12 pikachu'
let a = new Command({
command: "wg create <id> <name>",
callback: () => {
}
});
expect(a._getInputMessage(message)['id']).to.equal('p12');
expect(a._getInputMessage(message)['name']).to.equal('pikachu');
});
it('Test : _getSplitMessage() with a sentence', () => {
let a = new Command({command : 'wg website desc <desc>'});
let b = a._getSplitMessage(`wg website desc "Hello everynyan, how are you"`);
expect(b[0]).to.equal('wg');
expect(b[1]).to.equal('website');
expect(b[2]).to.equal('desc');
expect(b[3]).to.equal('Hello everynyan, how are you');
})
it('Test : _getSplitMessage() with multiple sentence input', () => {
let a = new Command({command : 'wg website desc <desc>'});
let b = a._getSplitMessage(`wg website desc "Hello everynyan, how are you" "I am fine thank you"`);
expect(b[0]).to.equal('wg');
expect(b[1]).to.equal('website');
expect(b[2]).to.equal('desc');
expect(b[3]).to.equal('Hello everynyan, how are you');
expect(b[4]).to.equal('I am fine thank you');
})
it('Test : _getSplitMessage() with single word', () => {
let a = new Command({command : 'wg website desc <desc>'});
let b = a._getSplitMessage(`wg website desc Hello`);
expect(b[0]).to.equal('wg');
expect(b[1]).to.equal('website');
expect(b[2]).to.equal('desc');
expect(b[3]).to.equal('Hello');
})
});

View File

@@ -0,0 +1,117 @@
const expect = require('chai').expect;
const {data} = require('../src/models/data')
const {Entity} = require('../src/models/entity');
const { Website } = require('../src/models/website');
describe('Entity', () => {
it('Test : addData', () => {
let a = new Entity();
a.addData('hello', new Website('hello'));
expect(a.isData('hello')).to.true;
expect(a.count).to.equal(0);
});
it('Test : clearData()', () => {
let a = new Entity();
a.addData('hello world', new Website('hello world'));
a.addData('gada', new Website('gada'));
a.addData('pagol', new Website('pagol'));
a.clearData();
expect(a.count).to.equal(0);
expect(a.isData("kruta")).to.false;
expect(a.isData("hello")).to.false;
expect(a.isData('pagol')).to.false;
expect(a.isData('hello world')).to.false;
});
it('Test: getData', () => {
let a = new Entity();
a.addData('hello world', new Website('hello world'));
a.addData('gada', new Website('gada'));
a.addData('pagol', new Website('pagol'));
expect(a.getData('hello world').companyName).to.equal('hello world');
expect(a.getData('gada').companyName).to.equal('gada');
expect(a.getData('chu chu')).to.null;
})
it('Test: deleteData', () => {
let a = new Entity();
a.addData('hello world', new Website('hello world'));
a.addData('gada', new Website('gada'));
a.addData('pagol', new Website('pagol'));
a.deleteData('gada');
expect(a.getData('gada')).to.null;
})
it('Test: getAllData', () => {
let a = new Entity();
a.addData('hello world', new Website('hello world'));
a.addData('gada', new Website('gada'));
a.addData('pagol', new Website('pagol'));
let websitegen = a.getAllData().values();
for(let t of websitegen)
{
console.log(t.companyName);
}
})
it('Test: selectData()', () => {
let a = new Entity();
a.addData('hello world', new Website('hello world'));
a.addData('gada', new Website('gada'));
a.addData('pagol', new Website('pagol'));
a.selectData('gada');
expect(a.selectedData).to.equals('gada');
});
it('Test: selectedData() = false', () => {
let a = new Entity();
a.addData('hello world', new Website('hello world'));
a.addData('gada', new Website('gada'));
a.addData('pagol', new Website('pagol'));
a.selectData('tara');
expect(a.selectedData).to.equals('pagol');
});
it('Test: selectedData when addData() is used', () => {
let a = new Entity();
a.addData('hello world', new Website('hello world'));
a.addData('gada', new Website('gada'));
a.addData('pagol', new Website('pagol'));
expect(a.selectedData).to.equals('pagol');
});
it('Test : selectedData when clearData()', () => {
let a = new Entity();
a.addData('hello world', new Website('hello world'));
a.addData('gada', new Website('gada'));
a.addData('pagol', new Website('pagol'));
a.clearData();
expect(a.count).to.equal(0);
expect(a.isData("kruta")).to.false;
expect(a.isData("hello")).to.false;
expect(a.isData('pagol')).to.false;
expect(a.isData('hello world')).to.false;
expect(a.selectedData).to.null;
});
})