From 596aa98d4bbc29c5941838393e655cfd9e1ec1fe Mon Sep 17 00:00:00 2001 From: Kozopas Viktoria Date: Fri, 13 Oct 2017 00:55:39 +0300 Subject: [PATCH 01/24] right column and footer --- Frontend/www/assets/less/main.less | 41 +++- .../www/assets/less/panels/bottom-panel.less | 13 ++ .../www/assets/less/panels/right-panel.less | 45 ++++ .../www/assets/less/panels/top-panel.less | 10 + .../www/assets/less/pizza/pizza-card.less | 15 +- Frontend/www/index.html | 205 +++++++++++++++++- 6 files changed, 315 insertions(+), 14 deletions(-) create mode 100644 Frontend/www/assets/less/panels/bottom-panel.less create mode 100644 Frontend/www/assets/less/panels/right-panel.less create mode 100644 Frontend/www/assets/less/panels/top-panel.less diff --git a/Frontend/www/assets/less/main.less b/Frontend/www/assets/less/main.less index e49b0b5fa..095f07a13 100644 --- a/Frontend/www/assets/less/main.less +++ b/Frontend/www/assets/less/main.less @@ -1,3 +1,40 @@ -@mainColor: blue; +@mainColor: orange; -@import "pizza/pizza-card"; \ No newline at end of file +@import "pizza/pizza-card"; +@import "panels/right-panel"; +@import "panels/top-panel"; +@import "panels/bottom-panel"; + +@RightPanelWidth: 330px; +@TopPanelHeight: 80px; +@BottomPanelHeight: 100px; + +.main-pizza { + margin-right: @RightPanelWidth; + margin-top: @TopPanelHeight; +} + +.inner-container { + max-width: 1000px; + margin: auto; + + padding: 10px; +} + +.orange{ + background-color: #ec890e; +} +.pizza-all-types{ + display: inline-block; + padding: 15px; +} + +.pizza-type{ + color: #ec890e; + border: 0px; + margin: 2px; +} + +.bottom-panel, .page-title, .pizza-all-types { + text-align: center; +} diff --git a/Frontend/www/assets/less/panels/bottom-panel.less b/Frontend/www/assets/less/panels/bottom-panel.less new file mode 100644 index 000000000..4bbfe95c9 --- /dev/null +++ b/Frontend/www/assets/less/panels/bottom-panel.less @@ -0,0 +1,13 @@ +.bottom-panel { + width: 100%; + height: @BottomPanelHeight; + + bottom: 0; + right: 0; + background-color: #fff; + border-top: 1px solid #e5e5e5; + padding: 30px @RightPanelWidth 30px 0; + + color: grey; + font-size: 14px; +} \ No newline at end of file diff --git a/Frontend/www/assets/less/panels/right-panel.less b/Frontend/www/assets/less/panels/right-panel.less new file mode 100644 index 000000000..0262cd4cb --- /dev/null +++ b/Frontend/www/assets/less/panels/right-panel.less @@ -0,0 +1,45 @@ +.right-panel { + height: 100%; + width: @RightPanelWidth; + + position: fixed; + top: 0; + right: 0; + + background-color: green; +} + +@RightTopHeight: 80px; +@RightBottomHeight: 100px; + +.center-part { + width: 100%; + height: 100%; + + overflow-y: scroll; + + padding-top: @RightTopHeight + 20px; + padding-bottom: @RightBottomHeight; +} + +.top-part { + position: absolute; + top: 0; + right: 0; + + width: 100%; + height: @RightTopHeight; + + background-color: aquamarine; +} + +.bottom-part { + position: absolute; + bottom: 0; + right: 0; + + width: 100%; + height: @RightBottomHeight; + + background-color: aquamarine; +} \ No newline at end of file diff --git a/Frontend/www/assets/less/panels/top-panel.less b/Frontend/www/assets/less/panels/top-panel.less new file mode 100644 index 000000000..4397ecc58 --- /dev/null +++ b/Frontend/www/assets/less/panels/top-panel.less @@ -0,0 +1,10 @@ +.top-panel { + padding-right: @RightPanelWidth; + width: 100%; + height: @TopPanelHeight; + + position: fixed; + top: 0; + left: 0; + background-color: rgba(12, 6, 1, 0.7); +} \ No newline at end of file diff --git a/Frontend/www/assets/less/pizza/pizza-card.less b/Frontend/www/assets/less/pizza/pizza-card.less index a0448e2df..7147fd43e 100644 --- a/Frontend/www/assets/less/pizza/pizza-card.less +++ b/Frontend/www/assets/less/pizza/pizza-card.less @@ -1,10 +1,21 @@ .pizza-card { + position: relative; + img { - max-width: 250px; + max-width: 100%; + width: 250px; } h3 { color: @mainColor; background-color: lighten(@mainColor, 45%); } -} \ No newline at end of file + + .badge-new { + position: absolute; + top: -15px; + right: -20px; + + font-size: 20px; + } +} diff --git a/Frontend/www/index.html b/Frontend/www/index.html index 41873db7d..c78307f27 100644 --- a/Frontend/www/index.html +++ b/Frontend/www/index.html @@ -8,7 +8,7 @@ - + @@ -16,15 +16,193 @@
-
-
-
+
+
+
+

+ Усі піци + 8 +

+
+
+ + + + + + +
+
+
+
+ Нова + + +

Thumbnail label

+ +

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta + gravida + at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

+ +

+ Button 5 + Button 6 +

+
+
+
+
+
+ Популярна + + +

Thumbnail label

+ +

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta + gravida + at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

+ +

+ Button 3 + Button 4 +

+
+
+
+
+
+ +

Thumbnail label

+ +

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta + gravida + at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

+ +

+ Button 2 + Button 1 +

+
+
+
+
+
+ +

Thumbnail label

+ +

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta + gravida + at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

+ +

+ Button 2 + Button 1 +

+
+
+
+
+
+ +

Thumbnail label

+ +

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta + gravida + at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

+ +

+ Button 2 + Button 1 +

+
+
+
+
+
+ +

Thumbnail label

+ +

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta + gravida + at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

+ +

+ Button 2 + Button 1 +

+
+
+
+
+
+ +

Thumbnail label

+ +

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta + gravida + at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

+ +

+ Button 2 + Button 1 +

+
+
+
+
+
+ +

Thumbnail label

+ +

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta + gravida + at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

+ +

+ Button 2 + Button 1 +

+
+
+
+
+
+
+
+

+ Pizza.22 - практичний проект в межах курсу JavaScript в Києво-Могилянській Академії +

+

+ Доставка піци не здійснюється +

+
+
+ +
+
+
+
+

Thumbnail label

-

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

+

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta + gravida + at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

Button 2 @@ -34,13 +212,15 @@

-
+

Thumbnail label

-

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

+

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta + gravida + at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

Button 3 @@ -50,13 +230,15 @@

-
+

Thumbnail label

-

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

+

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta + gravida + at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

Button 5 @@ -65,11 +247,14 @@

+
+
+ - + From d3f441ac755f5c0c5bd3dee58a1ac0012d2b7ec2 Mon Sep 17 00:00:00 2001 From: Kozopas Viktoria Date: Mon, 16 Oct 2017 00:15:39 +0300 Subject: [PATCH 02/24] right column --- Frontend/www/assets/less/main.less | 26 +++- .../www/assets/less/panels/right-panel.less | 101 +++++++++++- .../www/assets/less/pizza/pizza-card.less | 4 +- Frontend/www/index.html | 147 +++++++++--------- 4 files changed, 196 insertions(+), 82 deletions(-) diff --git a/Frontend/www/assets/less/main.less b/Frontend/www/assets/less/main.less index 095f07a13..e1cf8b45e 100644 --- a/Frontend/www/assets/less/main.less +++ b/Frontend/www/assets/less/main.less @@ -21,20 +21,36 @@ padding: 10px; } -.orange{ +.orange { background-color: #ec890e; } -.pizza-all-types{ + +.page-title { + margin: 15px; +} + +.pizza-all-types { display: inline-block; - padding: 15px; + //padding: 15px; +} + +.page-title .all-pizza-type-wrap .pizza-all-types .active a{ + color: white; + background-color: #ec890e; } -.pizza-type{ +.pizza-type { color: #ec890e; border: 0px; - margin: 2px; } +.pizza-type:hover { + text-decoration: none; + color: #ec890e; + background-color: #eee; +} + + .bottom-panel, .page-title, .pizza-all-types { text-align: center; } diff --git a/Frontend/www/assets/less/panels/right-panel.less b/Frontend/www/assets/less/panels/right-panel.less index 0262cd4cb..807c75b07 100644 --- a/Frontend/www/assets/less/panels/right-panel.less +++ b/Frontend/www/assets/less/panels/right-panel.less @@ -6,7 +6,8 @@ top: 0; right: 0; - background-color: green; + box-shadow: rgba(0,0,0,.2) -3px 3px 10px; + background-color: #F5F5F5; } @RightTopHeight: 80px; @@ -16,10 +17,50 @@ width: 100%; height: 100%; - overflow-y: scroll; + overflow-x: hidden; + overflow-y: auto; padding-top: @RightTopHeight + 20px; padding-bottom: @RightBottomHeight; + + .order-one { + height: 120px; + padding: 0px 61px 10px 24px; + border-bottom: 1px solid rgba(0,0,0,.1); + position: relative; + + .img-aside { + position: absolute; + right: -48px; + top: 5px; + border-radius: 50% 0 0 50%; + max-height: 96px; + max-width: 96px; + } + + .order-title { + font-size: 20px; + color: #ec890e; + } + + .order-text { + font-size: 12px; + margin-top: 6px; + margin-bottom: 6px; + + .gram-image { + margin-left: 15px; + } + } + } + + .no-order-text { + font-size: 16px; + color: #4e4e4e; + text-align: center; + padding-top: 50px; + padding-bottom: 50px; + } } .top-part { @@ -30,7 +71,28 @@ width: 100%; height: @RightTopHeight; - background-color: aquamarine; + padding-top: 25px; + background-color: #fff; + + .top-order-title { + width: 100%; + padding-bottom: 13px; + + .order-list-title { + font-size: 20px; + font-weight: 700; + padding-left: 15px; + } + + .clear-order { + float: right; + margin-top: 10px; + padding-right: 15px; + font-size: 10px; + color: rgba(0, 0, 0, .5); + } + + } } .bottom-part { @@ -41,5 +103,34 @@ width: 100%; height: @RightBottomHeight; - background-color: aquamarine; -} \ No newline at end of file + padding: 10px; + margin: 0; + background-color: #fff; + box-sizing: border-box; + + .order-state { + padding: 5px; + + .sum-title { + display: none; + font-size: 15px; + font-weight: 700; + margin-bottom: 5px; + } + + .sum-number { + display: none; + float: right; + font-size: 20px; + font-weight: 700; + padding-right: 30px; + margin-bottom: 5px; + } + + .do-order-button { + padding: 10px 20px 10px 10px; + } + + } +} + diff --git a/Frontend/www/assets/less/pizza/pizza-card.less b/Frontend/www/assets/less/pizza/pizza-card.less index 7147fd43e..582606b17 100644 --- a/Frontend/www/assets/less/pizza/pizza-card.less +++ b/Frontend/www/assets/less/pizza/pizza-card.less @@ -3,7 +3,7 @@ img { max-width: 100%; - width: 250px; + width: 300px; } h3 { @@ -16,6 +16,6 @@ top: -15px; right: -20px; - font-size: 20px; + font-size: 18px; } } diff --git a/Frontend/www/index.html b/Frontend/www/index.html index c78307f27..81d813e2e 100644 --- a/Frontend/www/index.html +++ b/Frontend/www/index.html @@ -23,27 +23,30 @@

Усі піци 8

+
+ +
-
- - - - - - -
+
@@ -192,64 +195,68 @@

-
+
+
+ + Замовлення + 0 + + Очистити замовлення +
+
-
-
- - -

Thumbnail label

- -

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta - gravida - at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

- -

- Button 2 - Button 1 -

-
+
+ Піца +

+ BBQ (Велика) +

+
+ + 40 + + 840
-
- -
-
- - -

Thumbnail label

- -

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta - gravida - at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

- -

- Button 3 - Button 4 -

-
+
+ 199 грн. + + + + + 1 + + + + + + + + + +
-
-
- - -

Thumbnail label

- -

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta - gravida - at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

- -

- Button 5 - Button 6 -

-
+ + + + + +
+
+
+ + Сума замовлення + + + 115 грн. + +
+
-
-
From 5562203c224baca4cf9118dd311693f86c292fdf Mon Sep 17 00:00:00 2001 From: Kozopas Viktoria Date: Mon, 16 Oct 2017 23:03:44 +0300 Subject: [PATCH 03/24] task4 orange badges, top panel and right panel + part of pizza-card --- Frontend/www/assets/less/main.less | 84 +++++++++++++- .../www/assets/less/panels/right-panel.less | 27 ++++- .../www/assets/less/panels/top-panel.less | 40 +++++++ .../www/assets/less/pizza/pizza-card.less | 44 +++++++- Frontend/www/index.html | 105 ++++++++++++++---- 5 files changed, 271 insertions(+), 29 deletions(-) diff --git a/Frontend/www/assets/less/main.less b/Frontend/www/assets/less/main.less index e1cf8b45e..1182e7e87 100644 --- a/Frontend/www/assets/less/main.less +++ b/Frontend/www/assets/less/main.less @@ -31,7 +31,6 @@ .pizza-all-types { display: inline-block; - //padding: 15px; } .page-title .all-pizza-type-wrap .pizza-all-types .active a{ @@ -51,6 +50,87 @@ } -.bottom-panel, .page-title, .pizza-all-types { +.bottom-panel, .page-title, .pizza-all-types, .pizza-small, .pizza-big, .discount-panel, .top-badge { text-align: center; } + +.discount-panel { + position: fixed; + bottom: 0; + left: 9px; + border-left: 1px solid #d16200; + border-right: 1px solid #d16200; + + background-color: #ea862e; + z-index: 99; + width: 100px; + height: 116px; + padding: 10px; + color: #ffffff; + + .discount-before { + position: fixed; + bottom: 116px; + left: 9px; + width: 100px; + height: 11px; + background-image: url(../images/discount.svg); + background-size: 100px 11px; + padding: 0; + margin: 0; + } + + .discount-title { + font-size: 15px; + font-weight: 700; + font-family: Helvetica,Calibri; + border-bottom: 2px dotted #d16301; + margin-bottom: 7px; + padding-bottom: 3px; + } + + .discount-text { + font-size: 15px; + font-weight: 700; + } +} + +.top-badge { + position: fixed; + top: 0; + left: 9px; + border-left: 1px solid #d16200; + border-right: 1px solid #d16200; + + background-color: #ea862e; + z-index: 99; + width: 100px; + height: 100px; + padding: 10px; + color: #ffffff; + + .badge-before { + position: fixed; + top: 100px; + left: 9px; + width: 100px; + height: 11px; + background-image: url(../images/discount.svg); + background-size: 100px 11px; + padding: 0; + margin: 0; + transform: scaleY(-1); + } + + .badge-title { + font-size: 23px; + //font-weight: 700; + font-family: Helvetica,Calibri; + padding-top: 10px; + padding-bottom: 3px; + } +} + +* { + box-sizing: border-box; +} diff --git a/Frontend/www/assets/less/panels/right-panel.less b/Frontend/www/assets/less/panels/right-panel.less index 807c75b07..ab2bc726f 100644 --- a/Frontend/www/assets/less/panels/right-panel.less +++ b/Frontend/www/assets/less/panels/right-panel.less @@ -24,9 +24,10 @@ padding-bottom: @RightBottomHeight; .order-one { + display: none; height: 120px; padding: 0px 61px 10px 24px; - border-bottom: 1px solid rgba(0,0,0,.1); + border-bottom: 1px solid rgba(0, 0, 0, .1); position: relative; .img-aside { @@ -52,9 +53,33 @@ margin-left: 15px; } } + + .price-box { + font-size: 14px; + font-weight: 700; + + .price { + margin-right: 10px; + } + .btn-circle { + width: 30px; + height: 30px; + padding: 6px 0; + font-size: 12px; + border-radius: 15px; + } + .order-pizza-count { + font-size: 14px; + } + .count-clear { + margin-left: 25px; + color: #ec890e; + } + } } .no-order-text { + // display: none; font-size: 16px; color: #4e4e4e; text-align: center; diff --git a/Frontend/www/assets/less/panels/top-panel.less b/Frontend/www/assets/less/panels/top-panel.less index 4397ecc58..fdb77a26b 100644 --- a/Frontend/www/assets/less/panels/top-panel.less +++ b/Frontend/www/assets/less/panels/top-panel.less @@ -7,4 +7,44 @@ top: 0; left: 0; background-color: rgba(12, 6, 1, 0.7); + + .headers { + margin-left: 130px; + padding-right: @RightPanelWidth/2; + width: 100%; + height: 100%; + // border: 1px solid #a1a1a1; + + .top-header { + height: @TopPanelHeight/2; + color: #a1a1a1; + border-bottom: 1px solid #a1a1a1; + .sign-in { + color: #fff; + margin-top: 3px; + float: right; + } + .phone-number { + font-size: 20px; + padding: 5px 30px 5px 5px; + } + .work-days { + font-size: 12px; + padding-right: 30px; + } + .delivery { + font-size: 16px; + padding-right: 30px; + } + } + .down-header { + height: @TopPanelHeight/2; + color: #a1a1a1; + padding-top: 5px; + .pizza-page { + font-size: 16px; + color: white; + } + } + } } \ No newline at end of file diff --git a/Frontend/www/assets/less/pizza/pizza-card.less b/Frontend/www/assets/less/pizza/pizza-card.less index 582606b17..7b6197a21 100644 --- a/Frontend/www/assets/less/pizza/pizza-card.less +++ b/Frontend/www/assets/less/pizza/pizza-card.less @@ -1,20 +1,52 @@ .pizza-card { position: relative; - img { - max-width: 100%; - width: 300px; - } - h3 { color: @mainColor; background-color: lighten(@mainColor, 45%); } + .thumbnail { + img { + max-width: 100%; + width: 300px; + } + + .caption { + .title { + font-size: 30px; + color: #ec6a1c; + font-weight: 700; + font-family: "Helvetica Neue"; + } + .type { + font-size: 12px; + color: #a3a0a0; + } + .description { + font-size: 14px; + overflow: hidden; + height: 65px; + } + .card-bottom-row { + margin-left: -15px; + margin-right: -15px; + + .image { + width: 12px; + height: 13px; + } + + } + } + } + + + .badge-new { position: absolute; top: -15px; - right: -20px; + right: -15px; font-size: 18px; } diff --git a/Frontend/www/index.html b/Frontend/www/index.html index 81d813e2e..737c52224 100644 --- a/Frontend/www/index.html +++ b/Frontend/www/index.html @@ -17,6 +17,23 @@
+
+
+
+ ЦЬОГО ТИЖНЯ +
+ НА ВСЕ +
+
-20%
+
+
+
+
+ PIZZA +
+ KMA +
+

@@ -48,21 +65,53 @@

-
-
+
+
Нова -

Thumbnail label

- -

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta - gravida - at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

- -

- Button 5 - Button 6 -

+
+ Імпреза +
М'ясна
+
+ Балик, салямі, курка, сир моцарелла, сир Рокфорд, ананаси, томатна паста, петрушка +
+
+
+
+ + 30 +
+
+ + 370 +
+

+
+ 99 +
грн.
+
+

+ Купити +
+
+
+ + 40 +
+
+ + 660 +
+

+
+ 169 +
грн.
+
+

+ Купити +
+
@@ -192,7 +241,24 @@

- +
+
+
+ (044) 222 5 222 +
+
+ 24 години/ 7 днів на тиждень +
+
+ Безкоштовна доставка піци +
+ +
+
+ +
+
@@ -225,7 +291,6 @@

1 - @@ -236,11 +301,11 @@

- - - - - +
+ Пусто в холодильнику? +
+ Замовте піцу! +

@@ -251,7 +316,7 @@

115 грн.
-
From fb830f586c9aa90c4187d216e83aac582ba6b552 Mon Sep 17 00:00:00 2001 From: Kozopas Viktoria Date: Fri, 3 Nov 2017 00:40:26 +0200 Subject: [PATCH 04/24] added features to appearance --- Frontend/www/assets/less/badges/badges.less | 76 +++ Frontend/www/assets/less/main.less | 91 +-- .../www/assets/less/panels/bottom-panel.less | 2 +- .../www/assets/less/panels/right-panel.less | 3 +- .../www/assets/less/panels/top-panel.less | 2 +- .../www/assets/less/pizza/pizza-card.less | 54 +- Frontend/www/index.html | 592 ++++++++++++------ 7 files changed, 518 insertions(+), 302 deletions(-) create mode 100644 Frontend/www/assets/less/badges/badges.less diff --git a/Frontend/www/assets/less/badges/badges.less b/Frontend/www/assets/less/badges/badges.less new file mode 100644 index 000000000..e0476ab40 --- /dev/null +++ b/Frontend/www/assets/less/badges/badges.less @@ -0,0 +1,76 @@ +.discount-panel { + position: fixed; + bottom: 0; + left: 9px; + border-left: 1px solid #d16200; + border-right: 1px solid #d16200; + + background-color: #ea862e; + z-index: 99; + width: 100px; + height: 116px; + padding: 10px; + color: #ffffff; + + .discount-before { + position: fixed; + bottom: 116px; + left: 9px; + width: 100px; + height: 11px; + background-image: url(../../images/discount.svg); + background-size: 100px 11px; + padding: 0; + margin: 0; + } + + .discount-title { + font-size: 15px; + font-weight: 700; + font-family: Helvetica,Calibri; + border-bottom: 2px dotted #d16301; + margin-bottom: 7px; + padding-bottom: 3px; + } + + .discount-text { + font-size: 15px; + font-weight: 700; + } +} + +.top-badge { + position: fixed; + top: 0; + left: 9px; + border-left: 1px solid #d16200; + border-right: 1px solid #d16200; + + background-color: #ea862e; + z-index: 99; + width: 100px; + height: 100px; + padding: 10px; + color: #ffffff; + + .badge-before { + position: fixed; + top: 100px; + left: 9px; + width: 100px; + height: 11px; + background-image: url(../../images/discount.svg); + background-size: 100px 11px; + padding: 0; + margin: 0; + transform: scaleY(-1); + } + + .badge-title { + font-size: 23px; + //font-weight: 700; + font-family: Helvetica,Calibri; + padding-top: 10px; + padding-bottom: 3px; + } +} \ No newline at end of file diff --git a/Frontend/www/assets/less/main.less b/Frontend/www/assets/less/main.less index 1182e7e87..92fe7a7fa 100644 --- a/Frontend/www/assets/less/main.less +++ b/Frontend/www/assets/less/main.less @@ -4,6 +4,7 @@ @import "panels/right-panel"; @import "panels/top-panel"; @import "panels/bottom-panel"; +@import "badges/badges"; @RightPanelWidth: 330px; @TopPanelHeight: 80px; @@ -26,7 +27,7 @@ } .page-title { - margin: 15px; + margin: 20px; } .pizza-all-types { @@ -38,99 +39,15 @@ background-color: #ec890e; } -.pizza-type { +a { color: #ec890e; - border: 0px; } -.pizza-type:hover { - text-decoration: none; - color: #ec890e; - background-color: #eee; -} - -.bottom-panel, .page-title, .pizza-all-types, .pizza-small, .pizza-big, .discount-panel, .top-badge { +.bottom-panel, .page-title, .pizza-all-types, .all-pizza-type-wrap, .pizza-small, .pizza-big, .discount-panel, .top-badge { text-align: center; } -.discount-panel { - position: fixed; - bottom: 0; - left: 9px; - border-left: 1px solid #d16200; - border-right: 1px solid #d16200; - - background-color: #ea862e; - z-index: 99; - width: 100px; - height: 116px; - padding: 10px; - color: #ffffff; - - .discount-before { - position: fixed; - bottom: 116px; - left: 9px; - width: 100px; - height: 11px; - background-image: url(../images/discount.svg); - background-size: 100px 11px; - padding: 0; - margin: 0; - } - - .discount-title { - font-size: 15px; - font-weight: 700; - font-family: Helvetica,Calibri; - border-bottom: 2px dotted #d16301; - margin-bottom: 7px; - padding-bottom: 3px; - } - - .discount-text { - font-size: 15px; - font-weight: 700; - } -} - -.top-badge { - position: fixed; - top: 0; - left: 9px; - border-left: 1px solid #d16200; - border-right: 1px solid #d16200; - - background-color: #ea862e; - z-index: 99; - width: 100px; - height: 100px; - padding: 10px; - color: #ffffff; - - .badge-before { - position: fixed; - top: 100px; - left: 9px; - width: 100px; - height: 11px; - background-image: url(../images/discount.svg); - background-size: 100px 11px; - padding: 0; - margin: 0; - transform: scaleY(-1); - } - - .badge-title { - font-size: 23px; - //font-weight: 700; - font-family: Helvetica,Calibri; - padding-top: 10px; - padding-bottom: 3px; - } -} - * { box-sizing: border-box; } diff --git a/Frontend/www/assets/less/panels/bottom-panel.less b/Frontend/www/assets/less/panels/bottom-panel.less index 4bbfe95c9..a2a4c050b 100644 --- a/Frontend/www/assets/less/panels/bottom-panel.less +++ b/Frontend/www/assets/less/panels/bottom-panel.less @@ -6,7 +6,7 @@ right: 0; background-color: #fff; border-top: 1px solid #e5e5e5; - padding: 30px @RightPanelWidth 30px 0; + padding: 30px 30px 30px 30px; color: grey; font-size: 14px; diff --git a/Frontend/www/assets/less/panels/right-panel.less b/Frontend/www/assets/less/panels/right-panel.less index ab2bc726f..c258ebd31 100644 --- a/Frontend/www/assets/less/panels/right-panel.less +++ b/Frontend/www/assets/less/panels/right-panel.less @@ -79,7 +79,7 @@ } .no-order-text { - // display: none; + // display: none; font-size: 16px; color: #4e4e4e; text-align: center; @@ -150,6 +150,7 @@ font-weight: 700; padding-right: 30px; margin-bottom: 5px; + margin-top: -5px; } .do-order-button { diff --git a/Frontend/www/assets/less/panels/top-panel.less b/Frontend/www/assets/less/panels/top-panel.less index fdb77a26b..877d10127 100644 --- a/Frontend/www/assets/less/panels/top-panel.less +++ b/Frontend/www/assets/less/panels/top-panel.less @@ -6,7 +6,7 @@ position: fixed; top: 0; left: 0; - background-color: rgba(12, 6, 1, 0.7); + background-color: rgba(12, 6, 1, 0.8); .headers { margin-left: 130px; diff --git a/Frontend/www/assets/less/pizza/pizza-card.less b/Frontend/www/assets/less/pizza/pizza-card.less index 7b6197a21..b1ab921e0 100644 --- a/Frontend/www/assets/less/pizza/pizza-card.less +++ b/Frontend/www/assets/less/pizza/pizza-card.less @@ -6,47 +6,31 @@ background-color: lighten(@mainColor, 45%); } - .thumbnail { - img { - max-width: 100%; - width: 300px; - } - - .caption { - .title { - font-size: 30px; - color: #ec6a1c; - font-weight: 700; - font-family: "Helvetica Neue"; - } - .type { - font-size: 12px; - color: #a3a0a0; - } - .description { - font-size: 14px; - overflow: hidden; - height: 65px; - } - .card-bottom-row { - margin-left: -15px; - margin-right: -15px; - - .image { - width: 12px; - height: 13px; - } - - } - } + .pizza-card-icon { + max-width: 100%; + width: 300px; } - + .title { + font-size: 30px; + color: #ec6a1c; + font-weight: 700; + font-family: "Helvetica Neue"; + } + .type { + font-size: 12px; + color: #a3a0a0; + } + .description { + font-size: 14px; + overflow: hidden; + margin-bottom: 30px; + } .badge-new { position: absolute; top: -15px; - right: -15px; + right: -5px; font-size: 18px; } diff --git a/Frontend/www/index.html b/Frontend/www/index.html index 737c52224..6cb59e37c 100644 --- a/Frontend/www/index.html +++ b/Frontend/www/index.html @@ -42,41 +42,50 @@

-
-
+
Нова - +
Імпреза -
М'ясна
+
М'ясна піца
Балик, салямі, курка, сир моцарелла, сир Рокфорд, ананаси, томатна паста, петрушка
-
+
@@ -115,223 +124,452 @@

-
-
+
+
Популярна - - -

Thumbnail label

+ -

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta - gravida - at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

- -

- Button 3 - Button 4 -

+
+ BBQ +
М'ясна піца
+
+ Мисливські ковбаски, ковбаски пепероні, шинка, сир домашній, шампіньйони, петрушка, оливки +
+
+
+
+ + 30 +
+
+ + 460 +
+

+
+ 139 +
грн.
+
+

+ Купити +
+
+
+ + 40 +
+
+ + 840 +
+

+
+ 199 +
грн.
+
+

+ Купити +
+
-
-
- -

Thumbnail label

- -

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta - gravida - at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

+
+
+ -

- Button 2 - Button 1 -

+
+ Імпреза +
М'ясна піца
+
+ Балик, салямі, курка, сир моцарелла, сир Рокфорд, ананаси, томатна паста, петрушка +
+
+
+
+ + 30 +
+
+ + 370 +
+

+
+ 99 +
грн.
+
+

+ Купити +
+
+
+ + 40 +
+
+ + 660 +
+

+
+ 169 +
грн.
+
+

+ Купити +
+
-
-
- -

Thumbnail label

- -

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta - gravida - at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

+
+
+ -

- Button 2 - Button 1 -

+
+ Імпреза +
М'ясна піца
+
+ Балик, салямі, курка, сир моцарелла, сир Рокфорд, ананаси, томатна паста, петрушка +
+
+
+
+ + 30 +
+
+ + 370 +
+

+
+ 99 +
грн.
+
+

+ Купити +
+
+
+ + 40 +
+
+ + 660 +
+

+
+ 169 +
грн.
+
+

+ Купити +
+
-
-
- -

Thumbnail label

- -

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta - gravida - at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

+
+
+ -

- Button 2 - Button 1 -

+
+ Імпреза +
М'ясна піца
+
+ Балик, салямі, курка, сир моцарелла, сир Рокфорд, ананаси, томатна паста, петрушка +
+
+
+
+ + 30 +
+
+ + 370 +
+

+
+ 99 +
грн.
+
+

+ Купити +
+
+
+ + 40 +
+
+ + 660 +
+

+
+ 169 +
грн.
+
+

+ Купити +
+
-
-
- -

Thumbnail label

- -

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta - gravida - at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

+
+
+ -

- Button 2 - Button 1 -

+
+ Імпреза +
М'ясна піца
+
+ Балик, салямі, курка, сир моцарелла, сир Рокфорд, ананаси, томатна паста, петрушка +
+
+
+
+ + 30 +
+
+ + 370 +
+

+
+ 99 +
грн.
+
+

+ Купити +
+
+
+ + 40 +
+
+ + 660 +
+

+
+ 169 +
грн.
+
+

+ Купити +
+
-
-
- -

Thumbnail label

- -

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta - gravida - at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

+
+
+ -

- Button 2 - Button 1 -

+
+ Імпреза +
М'ясна піца
+
+ Балик, салямі, курка, сир моцарелла, сир Рокфорд, ананаси, томатна паста, петрушка +
+
+
+
+ + 30 +
+
+ + 370 +
+

+
+ 99 +
грн.
+
+

+ Купити +
+
+
+ + 40 +
+
+ + 660 +
+

+
+ 169 +
грн.
+
+

+ Купити +
+
-
-
- -

Thumbnail label

- -

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta - gravida - at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

+
+
+ -

- Button 2 - Button 1 -

+
+ Імпреза +
М'ясна піца
+
+ Балик, салямі, курка, сир моцарелла, сир Рокфорд, ананаси, томатна паста, петрушка +
+
+
+
+ + 30 +
+
+ + 370 +
+

+
+ 99 +
грн.
+
+

+ Купити +
+
+
+ + 40 +
+
+ + 660 +
+

+
+ 169 +
грн.
+
+

+ Купити +
+
-
-
-

- Pizza.22 - практичний проект в межах курсу JavaScript в Києво-Могилянській Академії -

-

- Доставка піци не здійснюється -

-
-
-
-
-
+

+ Pizza.22 - практичний проект в межах курсу JavaScript в Києво-Могилянській Академії +

+

+ Доставка піци не здійснюється +

+ +
+
+
+
- (044) 222 5 222 -
-
- 24 години/ 7 днів на тиждень + (044) 222 5 222 +
+
+ 24 години/ 7 днів на тиждень +
+
+ Безкоштовна доставка піци +
+
-
- Безкоштовна доставка піци +
+
- -
-
-
-
-
-
-
+
+
+
Замовлення 0 - Очистити замовлення -
-
-
-
- Піца -

- BBQ (Велика) -

-
- - 40 - - 840 + Очистити замовлення
-
- 199 грн. - - - - - 1 - - - - - - +
+ -
- Пусто в холодильнику? -
- Замовте піцу! +
+ Пусто в холодильнику? +
+ Замовте піцу! +
-
-
-
+
+
Сума замовлення - + 115 грн. -
- +
+ +
-
- - + + - - + + - - + + From 0910d295b986f11550fdddb4fa55cbb8373914a7 Mon Sep 17 00:00:00 2001 From: Kozopas Viktoria Date: Thu, 9 Nov 2017 02:42:19 +0200 Subject: [PATCH 05/24] Pizza JS first part --- Frontend/src/Pizza_List.js | 2 +- Frontend/src/main.js | 4 +- Frontend/src/pizza/PizzaCart.js | 57 +- Frontend/src/pizza/PizzaMenu.js | 7 +- Frontend/src/pizza/Storage.js | 10 + Frontend/templates/PizzaCart_OneItem.ejs | 46 +- Frontend/templates/PizzaMenu_OneItem.ejs | 50 +- Frontend/www/assets/js/main.js | 1380 ++++++-- Frontend/www/assets/less/badges/badges.less | 76 - Frontend/www/assets/less/main.less | 78 +- .../www/assets/less/panels/right-panel.less | 6 +- Frontend/www/index.html | 13 +- package-lock.json | 2816 +++++++++++++++++ 13 files changed, 4080 insertions(+), 465 deletions(-) create mode 100644 Frontend/src/pizza/Storage.js delete mode 100644 Frontend/www/assets/less/badges/badges.less create mode 100644 package-lock.json diff --git a/Frontend/src/Pizza_List.js b/Frontend/src/Pizza_List.js index 134fb6c81..d82b10006 100644 --- a/Frontend/src/Pizza_List.js +++ b/Frontend/src/Pizza_List.js @@ -15,7 +15,7 @@ var pizza_info = [ pineapple: ['ананаси'], additional: ['томатна паста', 'петрушка'] }, - small_size:{ + small_size: { weight: 370, size: 30, price: 99 diff --git a/Frontend/src/main.js b/Frontend/src/main.js index 292a17032..697e5f1ae 100644 --- a/Frontend/src/main.js +++ b/Frontend/src/main.js @@ -11,5 +11,7 @@ $(function(){ PizzaCart.initialiseCart(); PizzaMenu.initialiseMenu(); - + $(".clear-cart").click(function () { + PizzaCart.clearCart(); + }); }); \ No newline at end of file diff --git a/Frontend/src/pizza/PizzaCart.js b/Frontend/src/pizza/PizzaCart.js index 17f30f78c..f5b631ecd 100644 --- a/Frontend/src/pizza/PizzaCart.js +++ b/Frontend/src/pizza/PizzaCart.js @@ -2,6 +2,7 @@ * Created by chaika on 02.02.16. */ var Templates = require('../Templates'); +var Storage = require('./Storage'); //Перелік розмірів піци var PizzaSize = { @@ -17,13 +18,22 @@ var $cart = $("#cart"); function addToCart(pizza, size) { //Додавання однієї піци в кошик покупок - - //Приклад реалізації, можна робити будь-яким іншим способом - Cart.push({ - pizza: pizza, - size: size, - quantity: 1 - }); + function checkIfPresent() { + for (var i = 0; i < Cart.length; i++){ + if(Cart[i].pizza == pizza&&size==Cart[i].size) return i; + } + return -1; + } + var check = checkIfPresent(); + if (check===-1){ + Cart.push({ + pizza: pizza, + size: size, + quantity: 1 + }); + }else{ + Cart[check].quantity++; + } //Оновити вміст кошика на сторінці updateCart(); @@ -32,16 +42,28 @@ function addToCart(pizza, size) { function removeFromCart(cart_item) { //Видалити піцу з кошика //TODO: треба зробити + // Cart[cart_item] = null; //Після видалення оновити відображення updateCart(); } +function clearCart() { + Cart = []; + + updateCart(); +} + function initialiseCart() { //Фукнція віпрацьвуватиме при завантаженні сторінки //Тут можна наприклад, зчитати вміст корзини який збережено в Local Storage то показати його //TODO: ... + var saved_cart = Storage.read("cart"); + if(saved_cart){ + Cart = saved_cart; + } + updateCart(); } @@ -54,28 +76,46 @@ function updateCart() { //Функція викликається при зміні вмісту кошика //Тут можна наприклад показати оновлений кошик на екрані та зберегти вміт кошика в Local Storage + Storage.write("cart", Cart); + //Очищаємо старі піци в кошику $cart.html(""); + var total = 0; + //Онволення однієї піци function showOnePizzaInCart(cart_item) { var html_code = Templates.PizzaCart_OneItem(cart_item); + total += cart_item.pizza[cart_item.size].price; + $(".order-count").text(total); // !!!!!!!!!!!!!!!!!!! + var $node = $(html_code); $node.find(".plus").click(function(){ //Збільшуємо кількість замовлених піц cart_item.quantity += 1; + total += cart_item.pizza[cart_item.size].price; //Оновлюємо відображення updateCart(); }); + $node.find(".minus").click(function(){ + //Збільшуємо кількість замовлених піц + if (cart_item.quantity == 1){ + //DELETE CART !!!!!!!!!!!!!!! + }else{ + cart_item.quantity -= 1; + total -= cart_item.pizza[cart_item.size].price; + updateCart(); + } + }); + $cart.append($node); } Cart.forEach(showOnePizzaInCart); - } exports.removeFromCart = removeFromCart; @@ -84,4 +124,5 @@ exports.addToCart = addToCart; exports.getPizzaInCart = getPizzaInCart; exports.initialiseCart = initialiseCart; +exports.clearCart = clearCart(); exports.PizzaSize = PizzaSize; \ No newline at end of file diff --git a/Frontend/src/pizza/PizzaMenu.js b/Frontend/src/pizza/PizzaMenu.js index c08ee2d59..4ee9f2a50 100644 --- a/Frontend/src/pizza/PizzaMenu.js +++ b/Frontend/src/pizza/PizzaMenu.js @@ -18,10 +18,10 @@ function showPizzaList(list) { var $node = $(html_code); - $node.find(".buy-big").click(function(){ + $node.find(".bb").click(function(){ PizzaCart.addToCart(pizza, PizzaCart.PizzaSize.Big); }); - $node.find(".buy-small").click(function(){ + $node.find(".bs").click(function(){ PizzaCart.addToCart(pizza, PizzaCart.PizzaSize.Small); }); @@ -46,10 +46,11 @@ function filterPizza(filter) { showPizzaList(pizza_shown); } + function initialiseMenu() { //Показуємо усі піци showPizzaList(Pizza_List) } exports.filterPizza = filterPizza; -exports.initialiseMenu = initialiseMenu; \ No newline at end of file +exports.initialiseMenu = initialiseMenu; diff --git a/Frontend/src/pizza/Storage.js b/Frontend/src/pizza/Storage.js new file mode 100644 index 000000000..ae40952dc --- /dev/null +++ b/Frontend/src/pizza/Storage.js @@ -0,0 +1,10 @@ +var basil = require('basil.js'); +basil = new basil(); + +exports.write = function (key, value) { + basil.set(key, value); +} + +exports.read = function (key) { + return basil.get(key); +} \ No newline at end of file diff --git a/Frontend/templates/PizzaCart_OneItem.ejs b/Frontend/templates/PizzaCart_OneItem.ejs index 657df0094..86bbd6161 100644 --- a/Frontend/templates/PizzaCart_OneItem.ejs +++ b/Frontend/templates/PizzaCart_OneItem.ejs @@ -1,9 +1,41 @@ -
- <%= pizza.title %> (<%= size %>) -
Ціна: <%= pizza[size].price %> грн.
-
- - <%= quantity %> - +<% +function someFunction(pizza) { + +} + +%> + + +
+ Піца + +

+ <% if(size == "small_size"){ %> + <%= pizza.title %> (Мала) + <% }else { %> + <%= pizza.title %> (Велика) + <% } %> +

+
+ + <%= pizza[size].size %> + + <%= pizza[size].weight %> +
+
+ <%= pizza[size].price %> грн. + + + + + <%= quantity %> + + + + + + + +
\ No newline at end of file diff --git a/Frontend/templates/PizzaMenu_OneItem.ejs b/Frontend/templates/PizzaMenu_OneItem.ejs index d9b4e9fd9..666f8430a 100644 --- a/Frontend/templates/PizzaMenu_OneItem.ejs +++ b/Frontend/templates/PizzaMenu_OneItem.ejs @@ -8,7 +8,6 @@ function getIngredientsArray(pizza) { //Object.keys повертає масив ключів в об’єкті JavaScript Object.keys(content).forEach(function(key){ - //a.concat(b) створює спільний масив із масивів a та b result = result.concat(content[key]); }); @@ -19,13 +18,13 @@ function getIngredientsArray(pizza) { %>
- Pizza <% if(pizza.is_new) { %> - Нова + Нова <% } else if(pizza.is_popular) {%> - Популярна + Популярна <% } %> +
<%= pizza.title %> @@ -33,9 +32,46 @@ function getIngredientsArray(pizza) {
<%= getIngredientsArray(pizza).join(", ") %>
+
+ <% if(pizza.small_size) { %> +
+
+ + <%= pizza.small_size.size %> +
+
+ + <%= pizza.small_size.weight %> +
+

+
+ <%= pizza.small_size.price %> +
грн.
+
+

+ Купити +
+ <%}%> + <% if(pizza.big_size) { %> +
+
+ + <%= pizza.big_size.size %> +
+
+ + <%= pizza.big_size.weight %> +
+

+
+ <%= pizza.big_size.price %> +
грн.
+
+

+ Купити +
+ <%}%> +
- - -
\ No newline at end of file diff --git a/Frontend/www/assets/js/main.js b/Frontend/www/assets/js/main.js index da110673c..6214424fc 100644 --- a/Frontend/www/assets/js/main.js +++ b/Frontend/www/assets/js/main.js @@ -16,7 +16,7 @@ var pizza_info = [ pineapple: ['ананаси'], additional: ['томатна паста', 'петрушка'] }, - small_size:{ + small_size: { weight: 370, size: 30, price: 99 @@ -184,11 +184,11 @@ module.exports = pizza_info; var ejs = require('ejs'); -exports.PizzaMenu_OneItem = ejs.compile("<%\n\nfunction getIngredientsArray(pizza) {\n //Отримує вміст піци\n var content = pizza.content;\n var result = [];\n\n //Object.keys повертає масив ключів в об’єкті JavaScript\n\n Object.keys(content).forEach(function(key){\n\n //a.concat(b) створює спільний масив із масивів a та b\n result = result.concat(content[key]);\n });\n\n return result;\n}\n\n %>\n
\n
\n \" alt=\"Pizza\">\n\n <% if(pizza.is_new) { %>\n Нова\n <% } else if(pizza.is_popular) {%>\n Популярна\n <% } %>\n\n
\n <%= pizza.title %>\n
<%= pizza.type %>
\n
\n <%= getIngredientsArray(pizza).join(\", \") %>\n
\n
\n\n \n \n
\n
"); +exports.PizzaMenu_OneItem = ejs.compile("<%\r\n\r\nfunction getIngredientsArray(pizza) {\r\n //Отримує вміст піци\r\n var content = pizza.content;\r\n var result = [];\r\n\r\n //Object.keys повертає масив ключів в об’єкті JavaScript\r\n\r\n Object.keys(content).forEach(function(key){\r\n //a.concat(b) створює спільний масив із масивів a та b\r\n result = result.concat(content[key]);\r\n });\r\n\r\n return result;\r\n}\r\n\r\n %>\r\n
\r\n
\r\n\r\n <% if(pizza.is_new) { %>\r\n Нова\r\n <% } else if(pizza.is_popular) {%>\r\n Популярна\r\n <% } %>\r\n \">\r\n\r\n
\r\n <%= pizza.title %>\r\n
<%= pizza.type %>
\r\n
\r\n <%= getIngredientsArray(pizza).join(\", \") %>\r\n
\r\n
\r\n <% if(pizza.small_size) { %>\r\n
\r\n
\r\n \r\n <%= pizza.small_size.size %>\r\n
\r\n
\r\n \r\n <%= pizza.small_size.weight %>\r\n
\r\n

\r\n
\r\n <%= pizza.small_size.price %>\r\n
грн.
\r\n
\r\n

\r\n Купити\r\n
\r\n <%}%>\r\n <% if(pizza.big_size) { %>\r\n
\r\n
\r\n \r\n <%= pizza.big_size.size %>\r\n
\r\n
\r\n \r\n <%= pizza.big_size.weight %>\r\n
\r\n

\r\n
\r\n <%= pizza.big_size.price %>\r\n
грн.
\r\n
\r\n

\r\n Купити\r\n
\r\n <%}%>\r\n
\r\n
\r\n
\r\n
"); -exports.PizzaCart_OneItem = ejs.compile("
\n <%= pizza.title %> (<%= size %>)\n
Ціна: <%= pizza[size].price %> грн.
\n
\n \n <%= quantity %>\n \n
\n
"); +exports.PizzaCart_OneItem = ejs.compile("<%\r\nfunction someFunction(pizza) {\r\n\r\n}\r\n\r\n%>\r\n\r\n\r\n
\r\n \"Піца\"\">\r\n\r\n

\r\n <% if(size == \"small_size\"){ %>\r\n <%= pizza.title %> (Мала)\r\n <% }else { %>\r\n <%= pizza.title %> (Велика)\r\n <% } %>\r\n

\r\n
\r\n \r\n <%= pizza[size].size %>\r\n \r\n <%= pizza[size].weight %>\r\n
\r\n
\r\n <%= pizza[size].price %> грн.\r\n \r\n \r\n \r\n \r\n <%= quantity %>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
"); -},{"ejs":6}],3:[function(require,module,exports){ +},{"ejs":9}],3:[function(require,module,exports){ /** * Created by chaika on 25.01.16. */ @@ -202,13 +202,16 @@ $(function(){ PizzaCart.initialiseCart(); PizzaMenu.initialiseMenu(); - + $(".clear-cart").click(function () { + PizzaCart.clearCart(); + }); }); },{"./Pizza_List":1,"./pizza/PizzaCart":4,"./pizza/PizzaMenu":5}],4:[function(require,module,exports){ /** * Created by chaika on 02.02.16. */ var Templates = require('../Templates'); +var Storage = require('./Storage'); //Перелік розмірів піци var PizzaSize = { @@ -224,13 +227,22 @@ var $cart = $("#cart"); function addToCart(pizza, size) { //Додавання однієї піци в кошик покупок - - //Приклад реалізації, можна робити будь-яким іншим способом - Cart.push({ - pizza: pizza, - size: size, - quantity: 1 - }); + function checkIfPresent() { + for (var i = 0; i < Cart.length; i++){ + if(Cart[i].pizza == pizza&&size==Cart[i].size) return i; + } + return -1; + } + var check = checkIfPresent(); + if (check===-1){ + Cart.push({ + pizza: pizza, + size: size, + quantity: 1 + }); + }else{ + Cart[check].quantity++; + } //Оновити вміст кошика на сторінці updateCart(); @@ -239,16 +251,28 @@ function addToCart(pizza, size) { function removeFromCart(cart_item) { //Видалити піцу з кошика //TODO: треба зробити + // Cart[cart_item] = null; //Після видалення оновити відображення updateCart(); } +function clearCart() { + Cart = []; + + updateCart(); +} + function initialiseCart() { //Фукнція віпрацьвуватиме при завантаженні сторінки //Тут можна наприклад, зчитати вміст корзини який збережено в Local Storage то показати його //TODO: ... + var saved_cart = Storage.read("cart"); + if(saved_cart){ + Cart = saved_cart; + } + updateCart(); } @@ -261,28 +285,46 @@ function updateCart() { //Функція викликається при зміні вмісту кошика //Тут можна наприклад показати оновлений кошик на екрані та зберегти вміт кошика в Local Storage + Storage.write("cart", Cart); + //Очищаємо старі піци в кошику $cart.html(""); + var total = 0; + //Онволення однієї піци function showOnePizzaInCart(cart_item) { var html_code = Templates.PizzaCart_OneItem(cart_item); + total += cart_item.pizza[cart_item.size].price; + $(".order-count").text(total); // !!!!!!!!!!!!!!!!!!! + var $node = $(html_code); $node.find(".plus").click(function(){ //Збільшуємо кількість замовлених піц cart_item.quantity += 1; + total += cart_item.pizza[cart_item.size].price; //Оновлюємо відображення updateCart(); }); + $node.find(".minus").click(function(){ + //Збільшуємо кількість замовлених піц + if (cart_item.quantity == 1){ + //DELETE CART !!!!!!!!!!!!!!! + }else{ + cart_item.quantity -= 1; + total -= cart_item.pizza[cart_item.size].price; + updateCart(); + } + }); + $cart.append($node); } Cart.forEach(showOnePizzaInCart); - } exports.removeFromCart = removeFromCart; @@ -291,8 +333,9 @@ exports.addToCart = addToCart; exports.getPizzaInCart = getPizzaInCart; exports.initialiseCart = initialiseCart; +exports.clearCart = clearCart(); exports.PizzaSize = PizzaSize; -},{"../Templates":2}],5:[function(require,module,exports){ +},{"../Templates":2,"./Storage":6}],5:[function(require,module,exports){ /** * Created by chaika on 02.02.16. */ @@ -313,10 +356,10 @@ function showPizzaList(list) { var $node = $(html_code); - $node.find(".buy-big").click(function(){ + $node.find(".bb").click(function(){ PizzaCart.addToCart(pizza, PizzaCart.PizzaSize.Big); }); - $node.find(".buy-small").click(function(){ + $node.find(".bs").click(function(){ PizzaCart.addToCart(pizza, PizzaCart.PizzaSize.Small); }); @@ -341,6 +384,7 @@ function filterPizza(filter) { showPizzaList(pizza_shown); } + function initialiseMenu() { //Показуємо усі піци showPizzaList(Pizza_List) @@ -348,7 +392,409 @@ function initialiseMenu() { exports.filterPizza = filterPizza; exports.initialiseMenu = initialiseMenu; + },{"../Pizza_List":1,"../Templates":2,"./PizzaCart":4}],6:[function(require,module,exports){ +var basil = require('basil.js'); +basil = new basil(); + +exports.write = function (key, value) { + basil.set(key, value); +} + +exports.read = function (key) { + return basil.get(key); +} +},{"basil.js":7}],7:[function(require,module,exports){ +(function () { + // Basil + var Basil = function (options) { + return Basil.utils.extend({}, Basil.plugins, new Basil.Storage().init(options)); + }; + + // Version + Basil.version = '0.4.4'; + + // Utils + Basil.utils = { + extend: function () { + var destination = typeof arguments[0] === 'object' ? arguments[0] : {}; + for (var i = 1; i < arguments.length; i++) { + if (arguments[i] && typeof arguments[i] === 'object') + for (var property in arguments[i]) + destination[property] = arguments[i][property]; + } + return destination; + }, + each: function (obj, fnIterator, context) { + if (this.isArray(obj)) { + for (var i = 0; i < obj.length; i++) + if (fnIterator.call(context, obj[i], i) === false) return; + } else if (obj) { + for (var key in obj) + if (fnIterator.call(context, obj[key], key) === false) return; + } + }, + tryEach: function (obj, fnIterator, fnError, context) { + this.each(obj, function (value, key) { + try { + return fnIterator.call(context, value, key); + } catch (error) { + if (this.isFunction(fnError)) { + try { + fnError.call(context, value, key, error); + } catch (error) {} + } + } + }, this); + }, + registerPlugin: function (methods) { + Basil.plugins = this.extend(methods, Basil.plugins); + }, + getTypeOf: function (obj) { + if (typeof obj === 'undefined' || obj === null) + return '' + obj; + return Object.prototype.toString.call(obj).replace(/^\[object\s(.*)\]$/, function ($0, $1) { return $1.toLowerCase(); }); + } + }; + // Add some isType methods: isArguments, isBoolean, isFunction, isString, isArray, isNumber, isDate, isRegExp, isUndefined, isNull. + var types = ['Arguments', 'Boolean', 'Function', 'String', 'Array', 'Number', 'Date', 'RegExp', 'Undefined', 'Null']; + for (var i = 0; i < types.length; i++) { + Basil.utils['is' + types[i]] = (function (type) { + return function (obj) { + return Basil.utils.getTypeOf(obj) === type.toLowerCase(); + }; + })(types[i]); + } + + // Plugins + Basil.plugins = {}; + + // Options + Basil.options = Basil.utils.extend({ + namespace: 'b45i1', + storages: ['local', 'cookie', 'session', 'memory'], + expireDays: 365 + }, window.Basil ? window.Basil.options : {}); + + // Storage + Basil.Storage = function () { + var _salt = 'b45i1' + (Math.random() + 1) + .toString(36) + .substring(7), + _storages = {}, + _isValidKey = function (key) { + var type = Basil.utils.getTypeOf(key); + return (type === 'string' && key) || type === 'number' || type === 'boolean'; + }, + _toStoragesArray = function (storages) { + if (Basil.utils.isArray(storages)) + return storages; + return Basil.utils.isString(storages) ? [storages] : []; + }, + _toStoredKey = function (namespace, path) { + var key = ''; + if (_isValidKey(path)) { + key += path; + } else if (Basil.utils.isArray(path)) { + path = Basil.utils.isFunction(path.filter) ? path.filter(_isValidKey) : path; + key = path.join('.'); + } + return key && _isValidKey(namespace) ? namespace + '.' + key : key; + }, + _toKeyName = function (namespace, key) { + if (!_isValidKey(namespace)) + return key; + return key.replace(new RegExp('^' + namespace + '.'), ''); + }, + _toStoredValue = function (value) { + return JSON.stringify(value); + }, + _fromStoredValue = function (value) { + return value ? JSON.parse(value) : null; + }; + + // HTML5 web storage interface + var webStorageInterface = { + engine: null, + check: function () { + try { + window[this.engine].setItem(_salt, true); + window[this.engine].removeItem(_salt); + } catch (e) { + return false; + } + return true; + }, + set: function (key, value, options) { + if (!key) + throw Error('invalid key'); + window[this.engine].setItem(key, value); + }, + get: function (key) { + return window[this.engine].getItem(key); + }, + remove: function (key) { + window[this.engine].removeItem(key); + }, + reset: function (namespace) { + for (var i = 0, key; i < window[this.engine].length; i++) { + key = window[this.engine].key(i); + if (!namespace || key.indexOf(namespace) === 0) { + this.remove(key); + i--; + } + } + }, + keys: function (namespace) { + var keys = []; + for (var i = 0, key; i < window[this.engine].length; i++) { + key = window[this.engine].key(i); + if (!namespace || key.indexOf(namespace) === 0) + keys.push(_toKeyName(namespace, key)); + } + return keys; + } + }; + + // local storage + _storages.local = Basil.utils.extend({}, webStorageInterface, { + engine: 'localStorage' + }); + // session storage + _storages.session = Basil.utils.extend({}, webStorageInterface, { + engine: 'sessionStorage' + }); + + // memory storage + _storages.memory = { + _hash: {}, + check: function () { + return true; + }, + set: function (key, value, options) { + if (!key) + throw Error('invalid key'); + this._hash[key] = value; + }, + get: function (key) { + return this._hash[key] || null; + }, + remove: function (key) { + delete this._hash[key]; + }, + reset: function (namespace) { + for (var key in this._hash) { + if (!namespace || key.indexOf(namespace) === 0) + this.remove(key); + } + }, + keys: function (namespace) { + var keys = []; + for (var key in this._hash) + if (!namespace || key.indexOf(namespace) === 0) + keys.push(_toKeyName(namespace, key)); + return keys; + } + }; + + // cookie storage + _storages.cookie = { + check: function () { + if (!navigator.cookieEnabled) + return false; + if (window.self !== window.top) { + // we need to check third-party cookies; + var cookie = 'thirdparty.check=' + Math.round(Math.random() * 1000); + document.cookie = cookie + '; path=/'; + return document.cookie.indexOf(cookie) !== -1; + } + return true; + }, + set: function (key, value, options) { + if (!this.check()) + throw Error('cookies are disabled'); + options = options || {}; + if (!key) + throw Error('invalid key'); + var cookie = encodeURIComponent(key) + '=' + encodeURIComponent(value); + // handle expiration days + if (options.expireDays) { + var date = new Date(); + date.setTime(date.getTime() + (options.expireDays * 24 * 60 * 60 * 1000)); + cookie += '; expires=' + date.toGMTString(); + } + // handle domain + if (options.domain && options.domain !== document.domain) { + var _domain = options.domain.replace(/^\./, ''); + if (document.domain.indexOf(_domain) === -1 || _domain.split('.').length <= 1) + throw Error('invalid domain'); + cookie += '; domain=' + options.domain; + } + // handle secure + if (options.secure === true) { + cookie += '; secure'; + } + document.cookie = cookie + '; path=/'; + }, + get: function (key) { + if (!this.check()) + throw Error('cookies are disabled'); + var encodedKey = encodeURIComponent(key); + var cookies = document.cookie ? document.cookie.split(';') : []; + // retrieve last updated cookie first + for (var i = cookies.length - 1, cookie; i >= 0; i--) { + cookie = cookies[i].replace(/^\s*/, ''); + if (cookie.indexOf(encodedKey + '=') === 0) + return decodeURIComponent(cookie.substring(encodedKey.length + 1, cookie.length)); + } + return null; + }, + remove: function (key) { + // remove cookie from main domain + this.set(key, '', { expireDays: -1 }); + // remove cookie from upper domains + var domainParts = document.domain.split('.'); + for (var i = domainParts.length; i >= 0; i--) { + this.set(key, '', { expireDays: -1, domain: '.' + domainParts.slice(- i).join('.') }); + } + }, + reset: function (namespace) { + var cookies = document.cookie ? document.cookie.split(';') : []; + for (var i = 0, cookie, key; i < cookies.length; i++) { + cookie = cookies[i].replace(/^\s*/, ''); + key = cookie.substr(0, cookie.indexOf('=')); + if (!namespace || key.indexOf(namespace) === 0) + this.remove(key); + } + }, + keys: function (namespace) { + if (!this.check()) + throw Error('cookies are disabled'); + var keys = [], + cookies = document.cookie ? document.cookie.split(';') : []; + for (var i = 0, cookie, key; i < cookies.length; i++) { + cookie = cookies[i].replace(/^\s*/, ''); + key = decodeURIComponent(cookie.substr(0, cookie.indexOf('='))); + if (!namespace || key.indexOf(namespace) === 0) + keys.push(_toKeyName(namespace, key)); + } + return keys; + } + }; + + return { + init: function (options) { + this.setOptions(options); + return this; + }, + setOptions: function (options) { + this.options = Basil.utils.extend({}, this.options || Basil.options, options); + }, + support: function (storage) { + return _storages.hasOwnProperty(storage); + }, + check: function (storage) { + if (this.support(storage)) + return _storages[storage].check(); + return false; + }, + set: function (key, value, options) { + options = Basil.utils.extend({}, this.options, options); + if (!(key = _toStoredKey(options.namespace, key))) + return false; + value = options.raw === true ? value : _toStoredValue(value); + var where = null; + // try to set key/value in first available storage + Basil.utils.tryEach(_toStoragesArray(options.storages), function (storage, index) { + _storages[storage].set(key, value, options); + where = storage; + return false; // break; + }, null, this); + if (!where) { + // key has not been set anywhere + return false; + } + // remove key from all other storages + Basil.utils.tryEach(_toStoragesArray(options.storages), function (storage, index) { + if (storage !== where) + _storages[storage].remove(key); + }, null, this); + return true; + }, + get: function (key, options) { + options = Basil.utils.extend({}, this.options, options); + if (!(key = _toStoredKey(options.namespace, key))) + return null; + var value = null; + Basil.utils.tryEach(_toStoragesArray(options.storages), function (storage, index) { + if (value !== null) + return false; // break if a value has already been found. + value = _storages[storage].get(key, options) || null; + value = options.raw === true ? value : _fromStoredValue(value); + }, function (storage, index, error) { + value = null; + }, this); + return value; + }, + remove: function (key, options) { + options = Basil.utils.extend({}, this.options, options); + if (!(key = _toStoredKey(options.namespace, key))) + return; + Basil.utils.tryEach(_toStoragesArray(options.storages), function (storage) { + _storages[storage].remove(key); + }, null, this); + }, + reset: function (options) { + options = Basil.utils.extend({}, this.options, options); + Basil.utils.tryEach(_toStoragesArray(options.storages), function (storage) { + _storages[storage].reset(options.namespace); + }, null, this); + }, + keys: function (options) { + options = options || {}; + var keys = []; + for (var key in this.keysMap(options)) + keys.push(key); + return keys; + }, + keysMap: function (options) { + options = Basil.utils.extend({}, this.options, options); + var map = {}; + Basil.utils.tryEach(_toStoragesArray(options.storages), function (storage) { + Basil.utils.each(_storages[storage].keys(options.namespace), function (key) { + map[key] = Basil.utils.isArray(map[key]) ? map[key] : []; + map[key].push(storage); + }, this); + }, null, this); + return map; + } + }; + }; + + // Access to native storages, without namespace or basil value decoration + Basil.memory = new Basil.Storage().init({ storages: 'memory', namespace: null, raw: true }); + Basil.cookie = new Basil.Storage().init({ storages: 'cookie', namespace: null, raw: true }); + Basil.localStorage = new Basil.Storage().init({ storages: 'local', namespace: null, raw: true }); + Basil.sessionStorage = new Basil.Storage().init({ storages: 'session', namespace: null, raw: true }); + + // browser export + window.Basil = Basil; + + // AMD export + if (typeof define === 'function' && define.amd) { + define(function() { + return Basil; + }); + // commonjs export + } else if (typeof module !== 'undefined' && module.exports) { + module.exports = Basil; + } + +})(); + +},{}],8:[function(require,module,exports){ + +},{}],9:[function(require,module,exports){ /* * EJS Embedded JavaScript templates * Copyright 2112 Matthew Eernisse (mde@fleegix.org) @@ -370,7 +816,7 @@ exports.initialiseMenu = initialiseMenu; 'use strict'; /** - * @file Embedded JavaScript templating engine. + * @file Embedded JavaScript templating engine. {@link http://ejs.co} * @author Matthew Eernisse * @author Tiancheng "Timothy" Gu * @project EJS @@ -395,19 +841,23 @@ exports.initialiseMenu = initialiseMenu; * @public */ -var fs = require('fs') - , utils = require('./utils') - , scopeOptionWarned = false - , _VERSION_STRING = require('../package.json').version - , _DEFAULT_DELIMITER = '%' - , _DEFAULT_LOCALS_NAME = 'locals' - , _REGEX_STRING = '(<%%|<%=|<%-|<%_|<%#|<%|%>|-%>|_%>)' - , _OPTS = [ 'cache', 'filename', 'delimiter', 'scope', 'context' - , 'debug', 'compileDebug', 'client', '_with', 'rmWhitespace' - , 'strict', 'localsName' - ] - , _TRAILING_SEMCOL = /;\s*$/ - , _BOM = /^\uFEFF/; +var fs = require('fs'); +var path = require('path'); +var utils = require('./utils'); + +var scopeOptionWarned = false; +var _VERSION_STRING = require('../package.json').version; +var _DEFAULT_DELIMITER = '%'; +var _DEFAULT_LOCALS_NAME = 'locals'; +var _NAME = 'ejs'; +var _REGEX_STRING = '(<%%|%%>|<%=|<%-|<%_|<%#|<%|%>|-%>|_%>)'; +var _OPTS = ['delimiter', 'scope', 'context', 'debug', 'compileDebug', + 'client', '_with', 'rmWhitespace', 'strict', 'filename']; +// We don't allow 'cache' option to be passed in the data obj +// for the normal `render` call, but this is where Express puts it +// so we make an exception for `renderFile` +var _OPTS_EXPRESS = _OPTS.concat('cache'); +var _BOM = /^\uFEFF/; /** * EJS template function cache. This can be a LRU object from lru-cache NPM @@ -419,10 +869,19 @@ var fs = require('fs') exports.cache = utils.cache; +/** + * Custom file loader. Useful for template preprocessing or restricting access + * to a certain part of the filesystem. + * + * @type {fileLoader} + */ + +exports.fileLoader = fs.readFileSync; + /** * Name of the object containing the locals. * - * This variable is overriden by {@link Options}`.localsName` if it is not + * This variable is overridden by {@link Options}`.localsName` if it is not * `undefined`. * * @type {String} @@ -435,24 +894,64 @@ exports.localsName = _DEFAULT_LOCALS_NAME; * Get the path to the included file from the parent file path and the * specified path. * - * @param {String} name specified path - * @param {String} filename parent file path + * @param {String} name specified path + * @param {String} filename parent file path + * @param {Boolean} isDir parent file path whether is directory * @return {String} */ - -exports.resolveInclude = function(name, filename) { - var path = require('path') - , dirname = path.dirname - , extname = path.extname - , resolve = path.resolve - , includePath = resolve(dirname(filename), name) - , ext = extname(name); +exports.resolveInclude = function(name, filename, isDir) { + var dirname = path.dirname; + var extname = path.extname; + var resolve = path.resolve; + var includePath = resolve(isDir ? filename : dirname(filename), name); + var ext = extname(name); if (!ext) { includePath += '.ejs'; } return includePath; }; +/** + * Get the path to the included file by Options + * + * @param {String} path specified path + * @param {Options} options compilation options + * @return {String} + */ +function getIncludePath(path, options) { + var includePath; + var filePath; + var views = options.views; + + // Abs path + if (path.charAt(0) == '/') { + includePath = exports.resolveInclude(path.replace(/^\/*/,''), options.root || '/', true); + } + // Relative paths + else { + // Look relative to a passed filename first + if (options.filename) { + filePath = exports.resolveInclude(path, options.filename); + if (fs.existsSync(filePath)) { + includePath = filePath; + } + } + // Then look in any views directories + if (!includePath) { + if (Array.isArray(views) && views.some(function (v) { + filePath = exports.resolveInclude(path, v, true); + return fs.existsSync(filePath); + })) { + includePath = filePath; + } + } + if (!includePath) { + throw new Error('Could not find include include file.'); + } + } + return includePath; +} + /** * Get the template from a string or a file, either compiled on-the-fly or * read from cache (if enabled), and cache the template if needed. @@ -472,35 +971,70 @@ exports.resolveInclude = function(name, filename) { */ function handleCache(options, template) { - var fn - , path = options.filename - , hasTemplate = arguments.length > 1; + var func; + var filename = options.filename; + var hasTemplate = arguments.length > 1; if (options.cache) { - if (!path) { + if (!filename) { throw new Error('cache option requires a filename'); } - fn = exports.cache.get(path); - if (fn) { - return fn; + func = exports.cache.get(filename); + if (func) { + return func; } if (!hasTemplate) { - template = fs.readFileSync(path).toString().replace(_BOM, ''); + template = fileLoader(filename).toString().replace(_BOM, ''); } } else if (!hasTemplate) { // istanbul ignore if: should not happen at all - if (!path) { + if (!filename) { throw new Error('Internal EJS error: no file name or template ' + 'provided'); } - template = fs.readFileSync(path).toString().replace(_BOM, ''); + template = fileLoader(filename).toString().replace(_BOM, ''); } - fn = exports.compile(template, options); + func = exports.compile(template, options); if (options.cache) { - exports.cache.set(path, fn); + exports.cache.set(filename, func); } - return fn; + return func; +} + +/** + * Try calling handleCache with the given options and data and call the + * callback with the result. If an error occurs, call the callback with + * the error. Used by renderFile(). + * + * @memberof module:ejs-internal + * @param {Options} options compilation options + * @param {Object} data template data + * @param {RenderFileCallback} cb callback + * @static + */ + +function tryHandleCache(options, data, cb) { + var result; + try { + result = handleCache(options)(data); + } + catch (err) { + return cb(err); + } + return cb(null, result); +} + +/** + * fileLoader is independent + * + * @param {String} filePath ejs file path. + * @return {String} The contents of the specified file. + * @static + */ + +function fileLoader(filePath){ + return exports.fileLoader(filePath); } /** @@ -518,10 +1052,7 @@ function handleCache(options, template) { function includeFile(path, options) { var opts = utils.shallowCopy({}, options); - if (!opts.filename) { - throw new Error('`include` requires the \'filename\' option.'); - } - opts.filename = exports.resolveInclude(path, opts.filename); + opts.filename = getIncludePath(path, opts); return handleCache(opts); } @@ -531,24 +1062,24 @@ function includeFile(path, options) { * @memberof module:ejs-internal * @param {String} path path for the specified file * @param {Options} options compilation options - * @return {String} + * @return {Object} * @static */ function includeSource(path, options) { - var opts = utils.shallowCopy({}, options) - , includePath - , template; - if (!opts.filename) { - throw new Error('`include` requires the \'filename\' option.'); - } - includePath = exports.resolveInclude(path, opts.filename); - template = fs.readFileSync(includePath).toString().replace(_BOM, ''); - + var opts = utils.shallowCopy({}, options); + var includePath; + var template; + includePath = getIncludePath(path, opts); + template = fileLoader(includePath).toString().replace(_BOM, ''); opts.filename = includePath; var templ = new Template(template, opts); templ.generateSource(); - return templ.source; + return { + source: templ.source, + filename: includePath, + template: template + }; } /** @@ -564,11 +1095,11 @@ function includeSource(path, options) { * @static */ -function rethrow(err, str, filename, lineno){ - var lines = str.split('\n') - , start = Math.max(lineno - 3, 0) - , end = Math.min(lines.length, lineno + 3); - +function rethrow(err, str, flnm, lineno, esc){ + var lines = str.split('\n'); + var start = Math.max(lineno - 3, 0); + var end = Math.min(lines.length, lineno + 3); + var filename = esc(flnm); // eslint-disable-line // Error context var context = lines.slice(start, end).map(function (line, i){ var curr = i + start + 1; @@ -588,24 +1119,8 @@ function rethrow(err, str, filename, lineno){ throw err; } -/** - * Copy properties in data object that are recognized as options to an - * options object. - * - * This is used for compatibility with earlier versions of EJS and Express.js. - * - * @memberof module:ejs-internal - * @param {Object} data data object - * @param {Options} opts options object - * @static - */ - -function cpOptsInData(data, opts) { - _OPTS.forEach(function (p) { - if (typeof data[p] != 'undefined') { - opts[p] = data[p]; - } - }); +function stripSemi(str){ + return str.replace(/;(\s*$)/, '$1'); } /** @@ -653,15 +1168,14 @@ exports.compile = function compile(template, opts) { * @public */ -exports.render = function (template, data, opts) { - data = data || {}; - opts = opts || {}; - var fn; +exports.render = function (template, d, o) { + var data = d || {}; + var opts = o || {}; // No options object -- if there are optiony names // in the data, copy them to options if (arguments.length == 2) { - cpOptsInData(data, opts); + utils.shallowCopyFromList(opts, data, _OPTS); } return handleCache(opts, template)(data); @@ -681,37 +1195,43 @@ exports.render = function (template, data, opts) { */ exports.renderFile = function () { - var args = Array.prototype.slice.call(arguments) - , path = args.shift() - , cb = args.pop() - , data = args.shift() || {} - , opts = args.pop() || {} - , result; - - // Don't pollute passed in opts obj with new vals - opts = utils.shallowCopy({}, opts); - - // No options object -- if there are optiony names - // in the data, copy them to options - if (arguments.length == 3) { - // Express 4 - if (data.settings && data.settings['view options']) { - cpOptsInData(data.settings['view options'], opts); + var filename = arguments[0]; + var cb = arguments[arguments.length - 1]; + var opts = {filename: filename}; + var data; + + if (arguments.length > 2) { + data = arguments[1]; + + // No options object -- if there are optiony names + // in the data, copy them to options + if (arguments.length === 3) { + // Express 4 + if (data.settings) { + if (data.settings['view options']) { + utils.shallowCopyFromList(opts, data.settings['view options'], _OPTS_EXPRESS); + } + if (data.settings.views) { + opts.views = data.settings.views; + } + } + // Express 3 and lower + else { + utils.shallowCopyFromList(opts, data, _OPTS_EXPRESS); + } } - // Express 3 and lower else { - cpOptsInData(data, opts); + // Use shallowCopy so we don't pollute passed in opts obj with new vals + utils.shallowCopy(opts, arguments[2]); } - } - opts.filename = path; - try { - result = handleCache(opts)(data); + opts.filename = filename; } - catch(err) { - return cb(err); + else { + data = {}; } - return cb(null, result); + + return tryHandleCache(opts, data, cb); }; /** @@ -742,7 +1262,9 @@ function Template(text, opts) { options.context = opts.context; options.cache = opts.cache || false; options.rmWhitespace = opts.rmWhitespace; + options.root = opts.root; options.localsName = opts.localsName || exports.localsName || _DEFAULT_LOCALS_NAME; + options.views = opts.views; if (options.strict) { options._with = false; @@ -757,39 +1279,28 @@ function Template(text, opts) { } Template.modes = { - EVAL: 'eval' -, ESCAPED: 'escaped' -, RAW: 'raw' -, COMMENT: 'comment' -, LITERAL: 'literal' + EVAL: 'eval', + ESCAPED: 'escaped', + RAW: 'raw', + COMMENT: 'comment', + LITERAL: 'literal' }; Template.prototype = { createRegex: function () { - var str = _REGEX_STRING - , delim = utils.escapeRegExpChars(this.opts.delimiter); + var str = _REGEX_STRING; + var delim = utils.escapeRegExpChars(this.opts.delimiter); str = str.replace(/%/g, delim); return new RegExp(str); - } - -, compile: function () { - var src - , fn - , opts = this.opts - , prepended = '' - , appended = '' - , escape = opts.escapeFunction; - - if (opts.rmWhitespace) { - // Have to use two separate replace here as `^` and `$` operators don't - // work well with `\r`. - this.templateText = - this.templateText.replace(/\r/g, '').replace(/^\s+|\s+$/gm, ''); - } + }, - // Slurp spaces and tabs before <%_ and after _%> - this.templateText = - this.templateText.replace(/[ \t]*<%_/gm, '<%_').replace(/_%>[ \t]*/gm, '_%>'); + compile: function () { + var src; + var fn; + var opts = this.opts; + var prepended = ''; + var appended = ''; + var escapeFn = opts.escapeFunction; if (!this.source) { this.generateSource(); @@ -810,19 +1321,15 @@ Template.prototype = { + 'try {' + '\n' + this.source + '} catch (e) {' + '\n' - + ' rethrow(e, __lines, __filename, __line);' + '\n' + + ' rethrow(e, __lines, __filename, __line, escapeFn);' + '\n' + '}' + '\n'; } else { src = this.source; } - if (opts.debug) { - console.log(src); - } - if (opts.client) { - src = 'escape = escape || ' + escape.toString() + ';' + '\n' + src; + src = 'escapeFn = escapeFn || ' + escapeFn.toString() + ';' + '\n' + src; if (opts.compileDebug) { src = 'rethrow = rethrow || ' + rethrow.toString() + ';' + '\n' + src; } @@ -831,9 +1338,12 @@ Template.prototype = { if (opts.strict) { src = '"use strict";\n' + src; } + if (opts.debug) { + console.log(src); + } try { - fn = new Function(opts.localsName + ', escape, include, rethrow', src); + fn = new Function(opts.localsName + ', escapeFn, include, rethrow', src); } catch(e) { // istanbul ignore else @@ -841,7 +1351,9 @@ Template.prototype = { if (opts.filename) { e.message += ' in ' + opts.filename; } - e.message += ' while compiling ejs'; + e.message += ' while compiling ejs\n\n'; + e.message += 'If the above error is not helpful, you may want to try EJS-Lint:\n'; + e.message += 'https://github.com/RyanZim/EJS-Lint'; } throw e; } @@ -862,24 +1374,38 @@ Template.prototype = { } return includeFile(path, opts)(d); }; - return fn.apply(opts.context, [data || {}, escape, include, rethrow]); + return fn.apply(opts.context, [data || {}, escapeFn, include, rethrow]); }; returnedFn.dependencies = this.dependencies; return returnedFn; - } + }, -, generateSource: function () { - var self = this - , matches = this.parseTemplateText() - , d = this.opts.delimiter; + generateSource: function () { + var opts = this.opts; + + if (opts.rmWhitespace) { + // Have to use two separate replace here as `^` and `$` operators don't + // work well with `\r`. + this.templateText = + this.templateText.replace(/\r/g, '').replace(/^\s+|\s+$/gm, ''); + } + + // Slurp spaces and tabs before <%_ and after _%> + this.templateText = + this.templateText.replace(/[ \t]*<%_/gm, '<%_').replace(/_%>[ \t]*/gm, '_%>'); + + var self = this; + var matches = this.parseTemplateText(); + var d = this.opts.delimiter; if (matches && matches.length) { matches.forEach(function (line, index) { - var opening - , closing - , include - , includeOpts - , includeSrc; + var opening; + var closing; + var include; + var includeOpts; + var includeObj; + var includeSrc; // If this is an opening tag, check for closing tags // FIXME: May end up with some false positives here // Better to store modes as k/v with '<' + delimiter as key @@ -897,9 +1423,23 @@ Template.prototype = { // Must be in EVAL or RAW mode if (opening && (opening == '<' + d || opening == '<' + d + '-' || opening == '<' + d + '_')) { includeOpts = utils.shallowCopy({}, self.opts); - includeSrc = includeSource(include[1], includeOpts); - includeSrc = ' ; (function(){' + '\n' + includeSrc + - ' ; })()' + '\n'; + includeObj = includeSource(include[1], includeOpts); + if (self.opts.compileDebug) { + includeSrc = + ' ; (function(){' + '\n' + + ' var __line = 1' + '\n' + + ' , __lines = ' + JSON.stringify(includeObj.template) + '\n' + + ' , __filename = ' + JSON.stringify(includeObj.filename) + ';' + '\n' + + ' try {' + '\n' + + includeObj.source + + ' } catch (e) {' + '\n' + + ' rethrow(e, __lines, __filename, __line, escapeFn);' + '\n' + + ' }' + '\n' + + ' ; }).call(this)' + '\n'; + }else{ + includeSrc = ' ; (function(){' + '\n' + includeObj.source + + ' ; }).call(this)' + '\n'; + } self.source += includeSrc; self.dependencies.push(exports.resolveInclude(include[1], includeOpts.filename)); @@ -910,19 +1450,17 @@ Template.prototype = { }); } - } + }, -, parseTemplateText: function () { - var str = this.templateText - , pat = this.regex - , result = pat.exec(str) - , arr = [] - , firstPos - , lastPos; + parseTemplateText: function () { + var str = this.templateText; + var pat = this.regex; + var result = pat.exec(str); + var arr = []; + var firstPos; while (result) { firstPos = result.index; - lastPos = pat.lastIndex; if (firstPos !== 0) { arr.push(str.substring(0, firstPos)); @@ -939,116 +1477,117 @@ Template.prototype = { } return arr; - } + }, -, scanLine: function (line) { - var self = this - , d = this.opts.delimiter - , newLineCount = 0; - - function _addOutput() { - if (self.truncate) { - // Only replace single leading linebreak in the line after - // -%> tag -- this is the single, trailing linebreak - // after the tag that the truncation mode replaces - // Handle Win / Unix / old Mac linebreaks -- do the \r\n - // combo first in the regex-or - line = line.replace(/^(?:\r\n|\r|\n)/, '') - self.truncate = false; - } - else if (self.opts.rmWhitespace) { - // Gotta be more careful here. - // .replace(/^(\s*)\n/, '$1') might be more appropriate here but as - // rmWhitespace already removes trailing spaces anyway so meh. - line = line.replace(/^\n/, ''); - } - if (!line) { - return; - } + _addOutput: function (line) { + if (this.truncate) { + // Only replace single leading linebreak in the line after + // -%> tag -- this is the single, trailing linebreak + // after the tag that the truncation mode replaces + // Handle Win / Unix / old Mac linebreaks -- do the \r\n + // combo first in the regex-or + line = line.replace(/^(?:\r\n|\r|\n)/, ''); + this.truncate = false; + } + else if (this.opts.rmWhitespace) { + // rmWhitespace has already removed trailing spaces, just need + // to remove linebreaks + line = line.replace(/^\n/, ''); + } + if (!line) { + return line; + } - // Preserve literal slashes - line = line.replace(/\\/g, '\\\\'); + // Preserve literal slashes + line = line.replace(/\\/g, '\\\\'); - // Convert linebreaks - line = line.replace(/\n/g, '\\n'); - line = line.replace(/\r/g, '\\r'); + // Convert linebreaks + line = line.replace(/\n/g, '\\n'); + line = line.replace(/\r/g, '\\r'); - // Escape double-quotes - // - this will be the delimiter during execution - line = line.replace(/"/g, '\\"'); - self.source += ' ; __append("' + line + '")' + '\n'; - } + // Escape double-quotes + // - this will be the delimiter during execution + line = line.replace(/"/g, '\\"'); + this.source += ' ; __append("' + line + '")' + '\n'; + }, + + scanLine: function (line) { + var self = this; + var d = this.opts.delimiter; + var newLineCount = 0; newLineCount = (line.split('\n').length - 1); switch (line) { - case '<' + d: - case '<' + d + '_': - this.mode = Template.modes.EVAL; - break; - case '<' + d + '=': - this.mode = Template.modes.ESCAPED; - break; - case '<' + d + '-': - this.mode = Template.modes.RAW; - break; - case '<' + d + '#': - this.mode = Template.modes.COMMENT; - break; - case '<' + d + d: - this.mode = Template.modes.LITERAL; - this.source += ' ; __append("' + line.replace('<' + d + d, '<' + d) + '")' + '\n'; - break; - case d + '>': - case '-' + d + '>': - case '_' + d + '>': - if (this.mode == Template.modes.LITERAL) { - _addOutput(); - } + case '<' + d: + case '<' + d + '_': + this.mode = Template.modes.EVAL; + break; + case '<' + d + '=': + this.mode = Template.modes.ESCAPED; + break; + case '<' + d + '-': + this.mode = Template.modes.RAW; + break; + case '<' + d + '#': + this.mode = Template.modes.COMMENT; + break; + case '<' + d + d: + this.mode = Template.modes.LITERAL; + this.source += ' ; __append("' + line.replace('<' + d + d, '<' + d) + '")' + '\n'; + break; + case d + d + '>': + this.mode = Template.modes.LITERAL; + this.source += ' ; __append("' + line.replace(d + d + '>', d + '>') + '")' + '\n'; + break; + case d + '>': + case '-' + d + '>': + case '_' + d + '>': + if (this.mode == Template.modes.LITERAL) { + this._addOutput(line); + } - this.mode = null; - this.truncate = line.indexOf('-') === 0 || line.indexOf('_') === 0; - break; - default: + this.mode = null; + this.truncate = line.indexOf('-') === 0 || line.indexOf('_') === 0; + break; + default: // In script mode, depends on type of tag - if (this.mode) { + if (this.mode) { // If '//' is found without a line break, add a line break. - switch (this.mode) { - case Template.modes.EVAL: - case Template.modes.ESCAPED: - case Template.modes.RAW: - if (line.lastIndexOf('//') > line.lastIndexOf('\n')) { - line += '\n'; - } + switch (this.mode) { + case Template.modes.EVAL: + case Template.modes.ESCAPED: + case Template.modes.RAW: + if (line.lastIndexOf('//') > line.lastIndexOf('\n')) { + line += '\n'; } - switch (this.mode) { + } + switch (this.mode) { // Just executing code - case Template.modes.EVAL: - this.source += ' ; ' + line + '\n'; - break; + case Template.modes.EVAL: + this.source += ' ; ' + line + '\n'; + break; // Exec, esc, and output - case Template.modes.ESCAPED: - this.source += ' ; __append(escape(' + - line.replace(_TRAILING_SEMCOL, '').trim() + '))' + '\n'; - break; + case Template.modes.ESCAPED: + this.source += ' ; __append(escapeFn(' + stripSemi(line) + '))' + '\n'; + break; // Exec and output - case Template.modes.RAW: - this.source += ' ; __append(' + - line.replace(_TRAILING_SEMCOL, '').trim() + ')' + '\n'; - break; - case Template.modes.COMMENT: + case Template.modes.RAW: + this.source += ' ; __append(' + stripSemi(line) + ')' + '\n'; + break; + case Template.modes.COMMENT: // Do nothing - break; + break; // Literal <%% mode, append as raw output - case Template.modes.LITERAL: - _addOutput(); - break; - } + case Template.modes.LITERAL: + this._addOutput(line); + break; } + } // In string mode, just add the output - else { - _addOutput(); - } + else { + this._addOutput(line); + } } if (self.opts.compileDebug && newLineCount) { @@ -1058,6 +1597,20 @@ Template.prototype = { } }; +/** + * Escape characters reserved in XML. + * + * This is simply an export of {@link module:utils.escapeXML}. + * + * If `markup` is `undefined` or `null`, the empty string is returned. + * + * @param {String} markup Input string + * @return {String} Escaped string + * @public + * @func + * */ +exports.escapeXML = utils.escapeXML; + /** * Express.js support. * @@ -1072,14 +1625,14 @@ exports.__express = exports.renderFile; // Add require support /* istanbul ignore else */ if (require.extensions) { - require.extensions['.ejs'] = function (module, filename) { - filename = filename || /* istanbul ignore next */ module.filename; + require.extensions['.ejs'] = function (module, flnm) { + var filename = flnm || /* istanbul ignore next */ module.filename; var options = { - filename: filename - , client: true - } - , template = fs.readFileSync(filename).toString() - , fn = exports.compile(template, options); + filename: filename, + client: true + }; + var template = fileLoader(filename).toString(); + var fn = exports.compile(template, options); module._compile('module.exports = ' + fn.toString() + ';', filename); }; } @@ -1094,12 +1647,22 @@ if (require.extensions) { exports.VERSION = _VERSION_STRING; +/** + * Name for detection of EJS. + * + * @readonly + * @type {String} + * @public + */ + +exports.name = _NAME; + /* istanbul ignore if */ if (typeof window != 'undefined') { window.ejs = exports; } -},{"../package.json":8,"./utils":7,"fs":9,"path":10}],7:[function(require,module,exports){ +},{"../package.json":11,"./utils":10,"fs":8,"path":12}],10:[function(require,module,exports){ /* * EJS Embedded JavaScript templates * Copyright 2112 Matthew Eernisse (mde@fleegix.org) @@ -1147,17 +1710,17 @@ exports.escapeRegExpChars = function (string) { }; var _ENCODE_HTML_RULES = { - '&': '&' - , '<': '<' - , '>': '>' - , '"': '"' - , "'": ''' - } - , _MATCH_HTML = /[&<>\'"]/g; + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' +}; +var _MATCH_HTML = /[&<>\'"]/g; function encode_char(c) { return _ENCODE_HTML_RULES[c] || c; -}; +} /** * Stringified version of constants used by {@link module:utils.escapeXML}. @@ -1200,11 +1763,13 @@ exports.escapeXML = function (markup) { .replace(_MATCH_HTML, encode_char); }; exports.escapeXML.toString = function () { - return Function.prototype.toString.call(this) + ';\n' + escapeFuncStr + return Function.prototype.toString.call(this) + ';\n' + escapeFuncStr; }; /** - * Copy all properties from one object to another, in a shallow fashion. + * Naive copy of properties from one object to another. + * Does not recurse into non-scalar properties + * Does not check to see if the property has a value before copying * * @param {Object} to Destination object * @param {Object} from Source object @@ -1220,6 +1785,28 @@ exports.shallowCopy = function (to, from) { return to; }; +/** + * Naive copy of a list of key names, from one object to another. + * Only copies property if it is actually defined + * Does not recurse into non-scalar properties + * + * @param {Object} to Destination object + * @param {Object} from Source object + * @param {Array} list List of properties to copy + * @return {Object} Destination object + * @static + * @private + */ +exports.shallowCopyFromList = function (to, from, list) { + for (var i = 0; i < list.length; i++) { + var p = list[i]; + if (typeof from[p] != 'undefined') { + to[p] = from[p]; + } + } + return to; +}; + /** * Simple in-process cache implementation. Does not implement limits of any * sort. @@ -1241,22 +1828,40 @@ exports.cache = { } }; - -},{}],8:[function(require,module,exports){ +},{}],11:[function(require,module,exports){ module.exports={ - "name": "ejs", - "description": "Embedded JavaScript templates", - "keywords": [ - "template", - "engine", - "ejs" + "_from": "ejs@^2.4.1", + "_id": "ejs@2.5.7", + "_inBundle": false, + "_integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=", + "_location": "/ejs", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "ejs@^2.4.1", + "name": "ejs", + "escapedName": "ejs", + "rawSpec": "^2.4.1", + "saveSpec": null, + "fetchSpec": "^2.4.1" + }, + "_requiredBy": [ + "/" ], - "version": "2.4.1", + "_resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", + "_shasum": "cc872c168880ae3c7189762fd5ffc00896c9518a", + "_spec": "ejs@^2.4.1", + "_where": "D:\\GitHub_repositories\\JS-Pizza", "author": { "name": "Matthew Eernisse", "email": "mde@fleegix.org", "url": "http://fleegix.org" }, + "bugs": { + "url": "https://github.com/mde/ejs/issues" + }, + "bundleDependencies": false, "contributors": [ { "name": "Timothy Gu", @@ -1264,67 +1869,47 @@ module.exports={ "url": "https://timothygu.github.io" } ], - "license": "Apache-2.0", - "main": "./lib/ejs.js", - "repository": { - "type": "git", - "url": "git://github.com/mde/ejs.git" - }, - "bugs": { - "url": "https://github.com/mde/ejs/issues" - }, - "homepage": "https://github.com/mde/ejs", "dependencies": {}, + "deprecated": false, + "description": "Embedded JavaScript templates", "devDependencies": { - "browserify": "^8.0.3", - "istanbul": "~0.3.5", + "browserify": "^13.0.1", + "eslint": "^3.0.0", + "git-directory-deploy": "^1.5.1", + "istanbul": "~0.4.3", "jake": "^8.0.0", - "jsdoc": "^3.3.0-beta1", - "lru-cache": "^2.5.0", - "mocha": "^2.1.0", - "rimraf": "^2.2.8", - "uglify-js": "^2.4.16" + "jsdoc": "^3.4.0", + "lru-cache": "^4.0.1", + "mocha": "^3.0.2", + "uglify-js": "^2.6.2" }, "engines": { "node": ">=0.10.0" }, + "homepage": "https://github.com/mde/ejs", + "keywords": [ + "template", + "engine", + "ejs" + ], + "license": "Apache-2.0", + "main": "./lib/ejs.js", + "name": "ejs", + "repository": { + "type": "git", + "url": "git://github.com/mde/ejs.git" + }, "scripts": { - "test": "mocha", "coverage": "istanbul cover node_modules/mocha/bin/_mocha", - "doc": "rimraf out && jsdoc -c jsdoc.json lib/* docs/jsdoc/*", - "devdoc": "rimraf out && jsdoc -p -c jsdoc.json lib/* docs/jsdoc/*" + "devdoc": "jake doc[dev]", + "doc": "jake doc", + "lint": "eslint \"**/*.js\" Jakefile", + "test": "jake test" }, - "_id": "ejs@2.4.1", - "_shasum": "82e15b1b2a1f948b18097476ba2bd7c66f4d1566", - "_resolved": "https://registry.npmjs.org/ejs/-/ejs-2.4.1.tgz", - "_from": "ejs@>=2.4.1 <3.0.0", - "_npmVersion": "2.10.1", - "_nodeVersion": "0.12.4", - "_npmUser": { - "name": "mde", - "email": "mde@fleegix.org" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "mde", - "email": "mde@fleegix.org" - } - ], - "dist": { - "shasum": "82e15b1b2a1f948b18097476ba2bd7c66f4d1566", - "tarball": "http://registry.npmjs.org/ejs/-/ejs-2.4.1.tgz" - }, - "directories": {}, - "readme": "ERROR: No README data found!" + "version": "2.5.7" } -},{}],9:[function(require,module,exports){ - -},{}],10:[function(require,module,exports){ +},{}],12:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // @@ -1552,16 +2137,105 @@ var substr = 'ab'.substr(-1) === 'b' ; }).call(this,require('_process')) -},{"_process":11}],11:[function(require,module,exports){ +},{"_process":13}],13:[function(require,module,exports){ // shim for using process in browser - var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + +} var queue = []; var draining = false; var currentQueue; var queueIndex = -1; function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } draining = false; if (currentQueue.length) { queue = currentQueue.concat(queue); @@ -1577,7 +2251,7 @@ function drainQueue() { if (draining) { return; } - var timeout = setTimeout(cleanUpNextTick); + var timeout = runTimeout(cleanUpNextTick); draining = true; var len = queue.length; @@ -1594,7 +2268,7 @@ function drainQueue() { } currentQueue = null; draining = false; - clearTimeout(timeout); + runClearTimeout(timeout); } process.nextTick = function (fun) { @@ -1606,7 +2280,7 @@ process.nextTick = function (fun) { } queue.push(new Item(fun, args)); if (queue.length === 1 && !draining) { - setTimeout(drainQueue, 0); + runTimeout(drainQueue); } }; @@ -1634,6 +2308,10 @@ process.off = noop; process.removeListener = noop; process.removeAllListeners = noop; process.emit = noop; +process.prependListener = noop; +process.prependOnceListener = noop; + +process.listeners = function (name) { return [] } process.binding = function (name) { throw new Error('process.binding is not supported'); diff --git a/Frontend/www/assets/less/badges/badges.less b/Frontend/www/assets/less/badges/badges.less deleted file mode 100644 index e0476ab40..000000000 --- a/Frontend/www/assets/less/badges/badges.less +++ /dev/null @@ -1,76 +0,0 @@ -.discount-panel { - position: fixed; - bottom: 0; - left: 9px; - border-left: 1px solid #d16200; - border-right: 1px solid #d16200; - - background-color: #ea862e; - z-index: 99; - width: 100px; - height: 116px; - padding: 10px; - color: #ffffff; - - .discount-before { - position: fixed; - bottom: 116px; - left: 9px; - width: 100px; - height: 11px; - background-image: url(../../images/discount.svg); - background-size: 100px 11px; - padding: 0; - margin: 0; - } - - .discount-title { - font-size: 15px; - font-weight: 700; - font-family: Helvetica,Calibri; - border-bottom: 2px dotted #d16301; - margin-bottom: 7px; - padding-bottom: 3px; - } - - .discount-text { - font-size: 15px; - font-weight: 700; - } -} - -.top-badge { - position: fixed; - top: 0; - left: 9px; - border-left: 1px solid #d16200; - border-right: 1px solid #d16200; - - background-color: #ea862e; - z-index: 99; - width: 100px; - height: 100px; - padding: 10px; - color: #ffffff; - - .badge-before { - position: fixed; - top: 100px; - left: 9px; - width: 100px; - height: 11px; - background-image: url(../../images/discount.svg); - background-size: 100px 11px; - padding: 0; - margin: 0; - transform: scaleY(-1); - } - - .badge-title { - font-size: 23px; - //font-weight: 700; - font-family: Helvetica,Calibri; - padding-top: 10px; - padding-bottom: 3px; - } -} \ No newline at end of file diff --git a/Frontend/www/assets/less/main.less b/Frontend/www/assets/less/main.less index 92fe7a7fa..c507f15a3 100644 --- a/Frontend/www/assets/less/main.less +++ b/Frontend/www/assets/less/main.less @@ -4,7 +4,6 @@ @import "panels/right-panel"; @import "panels/top-panel"; @import "panels/bottom-panel"; -@import "badges/badges"; @RightPanelWidth: 330px; @TopPanelHeight: 80px; @@ -43,6 +42,83 @@ a { color: #ec890e; } +.top-badge { + position: fixed; + top: 0; + left: 9px; + border-left: 1px solid #d16200; + border-right: 1px solid #d16200; + + background-color: #ea862e; + z-index: 99; + width: 100px; + height: 100px; + padding: 10px; + color: #ffffff; + + .badge-before { + position: fixed; + top: 100px; + left: 9px; + width: 100px; + height: 11px; + background-image: url(../images/discount.svg); + background-size: 100px 11px; + padding: 0; + margin: 0; + transform: scaleY(-1); + } + + .badge-title { + font-size: 23px; + //font-weight: 700; + font-family: Helvetica,Calibri; + padding-top: 10px; + padding-bottom: 3px; + } +} + +.discount-panel { + position: fixed; + bottom: 0; + left: 9px; + border-left: 1px solid #d16200; + border-right: 1px solid #d16200; + + background-color: #ea862e; + z-index: 99; + width: 100px; + height: 116px; + padding: 10px; + color: #ffffff; + + .discount-before { + position: fixed; + bottom: 116px; + left: 9px; + width: 100px; + height: 11px; + background-image: url(../images/discount.svg); + background-size: 100px 11px; + padding: 0; + margin: 0; + } + + .discount-title { + font-size: 15px; + font-weight: 700; + font-family: Helvetica,Calibri; + border-bottom: 2px dotted #d16301; + margin-bottom: 7px; + padding-bottom: 3px; + } + + .discount-text { + font-size: 15px; + font-weight: 700; + } +} + .bottom-panel, .page-title, .pizza-all-types, .all-pizza-type-wrap, .pizza-small, .pizza-big, .discount-panel, .top-badge { text-align: center; diff --git a/Frontend/www/assets/less/panels/right-panel.less b/Frontend/www/assets/less/panels/right-panel.less index c258ebd31..e6d8d45ac 100644 --- a/Frontend/www/assets/less/panels/right-panel.less +++ b/Frontend/www/assets/less/panels/right-panel.less @@ -20,13 +20,13 @@ overflow-x: hidden; overflow-y: auto; - padding-top: @RightTopHeight + 20px; + padding-top: @RightTopHeight; padding-bottom: @RightBottomHeight; .order-one { - display: none; +// display: none; height: 120px; - padding: 0px 61px 10px 24px; + padding: 20px 61px 10px 24px; border-bottom: 1px solid rgba(0, 0, 0, .1); position: relative; diff --git a/Frontend/www/index.html b/Frontend/www/index.html index 6cb59e37c..f8e81a4d5 100644 --- a/Frontend/www/index.html +++ b/Frontend/www/index.html @@ -15,8 +15,7 @@ -
-
+
@@ -34,7 +33,7 @@ KMA
-
+

Усі піци @@ -505,10 +504,10 @@

Замовлення 0 - Очистити замовлення +

-
+
Піца

@@ -561,7 +560,7 @@

- +
@@ -570,6 +569,6 @@

- + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..42c824134 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2816 @@ +{ + "name": "Pizza", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "JSONStream": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz", + "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=", + "requires": { + "jsonparse": "1.3.1", + "through": "2.3.8" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "acorn": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", + "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==" + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "argparse": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", + "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", + "requires": { + "underscore": "1.7.0", + "underscore.string": "2.4.0" + }, + "dependencies": { + "underscore.string": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", + "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=" + } + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "asn1.js": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", + "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", + "requires": { + "bn.js": "4.11.8", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "assert": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.3.0.tgz", + "integrity": "sha1-A5OaYiWCqBLMICMgoLmlbJuBWEk=", + "requires": { + "util": "0.10.3" + } + }, + "astw": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz", + "integrity": "sha1-e9QXhNMkk5h66yOba04cV6hzuRc=", + "requires": { + "acorn": "4.0.13" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + } + } + }, + "async": { + "version": "0.1.22", + "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", + "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=" + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=" + }, + "basil.js": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/basil.js/-/basil.js-0.4.5.tgz", + "integrity": "sha1-qTs2dAUsuMa79lOdZBvf1mxfVaY=" + }, + "binary-extensions": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", + "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "brfs": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.4.3.tgz", + "integrity": "sha1-22ddb16SPm3wh/ylhZyQkKrtMhY=", + "requires": { + "quote-stream": "1.0.2", + "resolve": "1.5.0", + "static-module": "1.5.0", + "through2": "2.0.3" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browser-pack": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-5.0.1.tgz", + "integrity": "sha1-QZdxmyDG4KqglFHFER5T77b7wY0=", + "requires": { + "JSONStream": "1.3.1", + "combine-source-map": "0.6.1", + "defined": "1.0.0", + "through2": "1.1.1", + "umd": "3.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", + "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", + "requires": { + "readable-stream": "1.1.14", + "xtend": "4.0.1" + } + } + } + }, + "browser-resolve": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", + "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" + } + } + }, + "browserify": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-11.2.0.tgz", + "integrity": "sha1-oRu53SCdeVcrgT9+7q+Cil9cDk4=", + "requires": { + "JSONStream": "1.3.1", + "assert": "1.3.0", + "browser-pack": "5.0.1", + "browser-resolve": "1.11.2", + "browserify-zlib": "0.1.4", + "buffer": "3.6.0", + "builtins": "0.0.7", + "commondir": "0.0.1", + "concat-stream": "1.4.10", + "console-browserify": "1.1.0", + "constants-browserify": "0.0.1", + "crypto-browserify": "3.11.1", + "defined": "1.0.0", + "deps-sort": "1.3.9", + "domain-browser": "1.1.7", + "duplexer2": "0.0.2", + "events": "1.0.2", + "glob": "4.5.3", + "has": "1.0.1", + "htmlescape": "1.1.1", + "https-browserify": "0.0.1", + "inherits": "2.0.3", + "insert-module-globals": "6.6.3", + "isarray": "0.0.1", + "labeled-stream-splicer": "1.0.2", + "module-deps": "3.9.1", + "os-browserify": "0.1.2", + "parents": "1.0.1", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "read-only-stream": "1.1.1", + "readable-stream": "2.3.3", + "resolve": "1.5.0", + "shasum": "1.0.2", + "shell-quote": "0.0.1", + "stream-browserify": "2.0.1", + "stream-http": "1.7.1", + "string_decoder": "0.10.31", + "subarg": "1.0.0", + "syntax-error": "1.3.0", + "through2": "1.1.1", + "timers-browserify": "1.4.2", + "tty-browserify": "0.0.0", + "url": "0.10.3", + "util": "0.10.3", + "vm-browserify": "0.0.4", + "xtend": "4.0.1" + }, + "dependencies": { + "concat-stream": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.4.10.tgz", + "integrity": "sha1-rMO79WAsuMyYDGrIQPp9hgPj7zY=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "1.1.14", + "typedarray": "0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + } + } + }, + "glob": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "2.0.10", + "once": "1.4.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", + "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", + "requires": { + "readable-stream": "1.1.14", + "xtend": "4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + } + } + } + } + }, + "browserify-aes": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", + "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", + "requires": { + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "browserify-cipher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "requires": { + "browserify-aes": "1.1.1", + "browserify-des": "1.0.0", + "evp_bytestokey": "1.0.3" + } + }, + "browserify-des": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "requires": { + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.3" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "4.11.8", + "randombytes": "2.0.5" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "elliptic": "6.4.0", + "inherits": "2.0.3", + "parse-asn1": "5.1.0" + } + }, + "browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "requires": { + "pako": "0.2.9" + } + }, + "buffer": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", + "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", + "requires": { + "base64-js": "0.0.8", + "ieee754": "1.1.8", + "isarray": "1.0.0" + } + }, + "buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-1.0.0.tgz", + "integrity": "sha1-MGN+4mKXisBxdOFtf4LwrQbgha0=" + }, + "builtins": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-0.0.7.tgz", + "integrity": "sha1-NVIZzWzxjb58Acx/0tznZc/cVJo=" + }, + "cached-path-relative": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz", + "integrity": "sha1-0JxLUoAKpMB44t2BqGmqyQ0uVOc=" + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "coffee-script": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz", + "integrity": "sha1-FQ1rTLUiiUNp7+1qIQHCC8f0pPQ=" + }, + "colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=" + }, + "combine-source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.6.1.tgz", + "integrity": "sha1-m0oJwxYDPXaODxHgKfonMOB5rZY=", + "requires": { + "convert-source-map": "1.1.3", + "inline-source-map": "0.5.0", + "lodash.memoize": "3.0.4", + "source-map": "0.4.4" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "commondir": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-0.0.1.tgz", + "integrity": "sha1-ifAP3NUbUZxXhzP+xWPmptp/W+I=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "requires": { + "date-now": "0.1.4" + } + }, + "constants-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-0.0.1.tgz", + "integrity": "sha1-kld9tSe6bEzwpFaNhLwDH0QeIfI=" + }, + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-ecdh": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", + "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.4.0" + } + }, + "create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "requires": { + "cipher-base": "1.0.4", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "sha.js": "2.4.9" + } + }, + "create-hmac": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "requires": { + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.9" + } + }, + "crypto-browserify": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", + "integrity": "sha512-Na7ZlwCOqoaW5RwUK1WpXws2kv8mNhWdTlzob0UXulk6G9BDbyiJaGTYBIX61Ozn9l1EPPJpICZb4DaOpT9NlQ==", + "requires": { + "browserify-cipher": "1.0.0", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.0", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "diffie-hellman": "5.0.2", + "inherits": "2.0.3", + "pbkdf2": "3.0.14", + "public-encrypt": "4.0.0", + "randombytes": "2.0.5" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" + }, + "dateformat": { + "version": "1.0.2-1.2.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz", + "integrity": "sha1-sCIMAt6YYXQztyhRz0fePfLNvuk=" + }, + "debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=" + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, + "deps-sort": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-1.3.9.tgz", + "integrity": "sha1-Kd//U+F7Nq7K51MK27v2IsLtGnE=", + "requires": { + "JSONStream": "1.3.1", + "shasum": "1.0.2", + "subarg": "1.0.0", + "through2": "1.1.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", + "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", + "requires": { + "readable-stream": "1.1.14", + "xtend": "4.0.1" + } + } + } + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "detective": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-4.5.0.tgz", + "integrity": "sha1-blqMaybmx6JUsca210kNmOyR7dE=", + "requires": { + "acorn": "4.0.13", + "defined": "1.0.0" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + } + } + }, + "diffie-hellman": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", + "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "requires": { + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.0.5" + } + }, + "domain-browser": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=" + }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "requires": { + "readable-stream": "1.1.14" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "ejs": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", + "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=" + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.3", + "hmac-drbg": "1.0.1", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "escodegen": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.3.3.tgz", + "integrity": "sha1-8CQBb1qI4Eb9EgBQVek5gC5sXyM=", + "requires": { + "esprima": "1.1.1", + "estraverse": "1.5.1", + "esutils": "1.0.0", + "source-map": "0.1.43" + } + }, + "esprima": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.1.1.tgz", + "integrity": "sha1-W28VR/TRAuZw4UDFCb5ncdautUk=" + }, + "estraverse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz", + "integrity": "sha1-hno+jlip+EYYr7bC3bzZFrfLr3E=" + }, + "esutils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", + "integrity": "sha1-gVHTWOIMisx/t0XnRywAJf5JZXA=" + }, + "eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=" + }, + "events": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/events/-/events-1.0.2.tgz", + "integrity": "sha1-dYSdz+k9EPsFfDAFWv29UdBqjiQ=" + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "1.3.4", + "safe-buffer": "5.1.1" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "requires": { + "fill-range": "2.2.3" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "1.0.0" + } + }, + "falafel": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz", + "integrity": "sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw=", + "requires": { + "acorn": "5.2.1", + "foreach": "2.0.5", + "isarray": "0.0.1", + "object-keys": "1.0.11" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "faye-websocket": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.4.4.tgz", + "integrity": "sha1-wUxbO/FNdBf/v9mQwKdJXNnzN7w=" + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "findup-sync": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", + "integrity": "sha1-fz56l7gjksZTvwZYm9hRkOk8NoM=", + "requires": { + "glob": "3.2.11", + "lodash": "2.4.2" + }, + "dependencies": { + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "requires": { + "inherits": "2.0.3", + "minimatch": "0.3.0" + } + }, + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=" + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "1.0.2" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gaze": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "requires": { + "globule": "0.1.0" + } + }, + "getobject": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", + "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=" + }, + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "requires": { + "graceful-fs": "1.2.3", + "inherits": "1.0.2", + "minimatch": "0.2.14" + }, + "dependencies": { + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=" + } + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "2.0.1" + } + }, + "globule": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", + "requires": { + "glob": "3.1.21", + "lodash": "1.0.2", + "minimatch": "0.2.14" + }, + "dependencies": { + "lodash": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=" + } + } + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=" + }, + "grunt": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz", + "integrity": "sha1-VpN81RlDJK3/bSB2MYMqnWuk5/A=", + "requires": { + "async": "0.1.22", + "coffee-script": "1.3.3", + "colors": "0.6.2", + "dateformat": "1.0.2-1.2.3", + "eventemitter2": "0.4.14", + "exit": "0.1.2", + "findup-sync": "0.1.3", + "getobject": "0.1.0", + "glob": "3.1.21", + "grunt-legacy-log": "0.1.3", + "grunt-legacy-util": "0.2.0", + "hooker": "0.2.3", + "iconv-lite": "0.2.11", + "js-yaml": "2.0.5", + "lodash": "0.9.2", + "minimatch": "0.2.14", + "nopt": "1.0.10", + "rimraf": "2.2.8", + "underscore.string": "2.2.1", + "which": "1.0.9" + } + }, + "grunt-browserify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/grunt-browserify/-/grunt-browserify-4.0.1.tgz", + "integrity": "sha1-9c7ZAmlYqADy6ImOGk3x5SX/af8=", + "requires": { + "async": "0.9.2", + "browserify": "11.2.0", + "glob": "5.0.15", + "lodash": "3.10.1", + "resolve": "1.5.0", + "watchify": "3.9.0" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.8" + } + } + } + }, + "grunt-contrib-watch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-0.6.1.tgz", + "integrity": "sha1-ZP3LolpjX1tNobbOb5DaCutuPxU=", + "requires": { + "async": "0.2.10", + "gaze": "0.5.2", + "lodash": "2.4.2", + "tiny-lr-fork": "0.0.5" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" + }, + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=" + } + } + }, + "grunt-legacy-log": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz", + "integrity": "sha1-7ClCboAwIa9ZAp+H0vnNczWgVTE=", + "requires": { + "colors": "0.6.2", + "grunt-legacy-log-utils": "0.1.1", + "hooker": "0.2.3", + "lodash": "2.4.2", + "underscore.string": "2.3.3" + }, + "dependencies": { + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=" + }, + "underscore.string": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=" + } + } + }, + "grunt-legacy-log-utils": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz", + "integrity": "sha1-wHBrndkGThFvNvI/5OawSGcsD34=", + "requires": { + "colors": "0.6.2", + "lodash": "2.4.2", + "underscore.string": "2.3.3" + }, + "dependencies": { + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=" + }, + "underscore.string": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=" + } + } + }, + "grunt-legacy-util": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz", + "integrity": "sha1-kzJIhNv343qf98Am3/RR2UqeVUs=", + "requires": { + "async": "0.1.22", + "exit": "0.1.2", + "getobject": "0.1.0", + "hooker": "0.2.3", + "lodash": "0.9.2", + "underscore.string": "2.2.1", + "which": "1.0.9" + } + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "requires": { + "function-bind": "1.1.1" + } + }, + "hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "requires": { + "inherits": "2.0.3" + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "1.1.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=" + }, + "htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=" + }, + "https-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", + "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=" + }, + "iconv-lite": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", + "integrity": "sha1-HOYKOleGSiktEyH/RgnKS7llrcg=" + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inline-source-map": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.5.0.tgz", + "integrity": "sha1-Skxd2OT7Xps82mDIIt+tyu5m4K8=", + "requires": { + "source-map": "0.4.4" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "insert-module-globals": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-6.6.3.tgz", + "integrity": "sha1-IGOOKaMPntHKLjqCX7wsulJG3fw=", + "requires": { + "JSONStream": "1.3.1", + "combine-source-map": "0.6.1", + "concat-stream": "1.4.10", + "is-buffer": "1.1.6", + "lexical-scope": "1.2.0", + "process": "0.11.10", + "through2": "1.1.1", + "xtend": "4.0.1" + }, + "dependencies": { + "concat-stream": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.4.10.tgz", + "integrity": "sha1-rMO79WAsuMyYDGrIQPp9hgPj7zY=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "1.1.14", + "typedarray": "0.0.6" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", + "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", + "requires": { + "readable-stream": "1.1.14", + "xtend": "4.0.1" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "1.10.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "3.2.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "js-yaml": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz", + "integrity": "sha1-olrmUJmZ6X3yeMZxnaEb0Gh3Q6g=", + "requires": { + "argparse": "0.1.16", + "esprima": "1.0.4" + }, + "dependencies": { + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=" + } + } + }, + "json-stable-stringify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", + "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", + "requires": { + "jsonify": "0.0.0" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + }, + "labeled-stream-splicer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-1.0.2.tgz", + "integrity": "sha1-RhUzFTd4SYHo/SZOHzpDTE4N3WU=", + "requires": { + "inherits": "2.0.3", + "isarray": "0.0.1", + "stream-splicer": "1.3.2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "lexical-scope": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", + "integrity": "sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ=", + "requires": { + "astw": "2.2.0" + } + }, + "lodash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", + "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=" + }, + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.3" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + } + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0" + } + }, + "minimalistic-assert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "module-deps": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-3.9.1.tgz", + "integrity": "sha1-6nXK+RmQkNJbDVUStaysuW5/h/M=", + "requires": { + "JSONStream": "1.3.1", + "browser-resolve": "1.11.2", + "concat-stream": "1.4.10", + "defined": "1.0.0", + "detective": "4.5.0", + "duplexer2": "0.0.2", + "inherits": "2.0.3", + "parents": "1.0.1", + "readable-stream": "1.1.14", + "resolve": "1.5.0", + "stream-combiner2": "1.0.2", + "subarg": "1.0.0", + "through2": "1.1.1", + "xtend": "4.0.1" + }, + "dependencies": { + "concat-stream": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.4.10.tgz", + "integrity": "sha1-rMO79WAsuMyYDGrIQPp9hgPj7zY=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "1.1.14", + "typedarray": "0.0.6" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", + "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", + "requires": { + "readable-stream": "1.1.14", + "xtend": "4.0.1" + } + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "requires": { + "abbrev": "1.1.1" + } + }, + "noptify": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/noptify/-/noptify-0.0.3.tgz", + "integrity": "sha1-WPZUpz2XU98MUdlobckhBKZ/S7s=", + "requires": { + "nopt": "2.0.0" + }, + "dependencies": { + "nopt": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.0.0.tgz", + "integrity": "sha1-ynQW8gpeP5w7hhgPlilfo9C1Lg0=", + "requires": { + "abbrev": "1.1.1" + } + } + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "object-inspect": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-0.4.0.tgz", + "integrity": "sha1-9RV8EWwUVbJDsG7pdwM5LFrYn+w=" + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "os-browserify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz", + "integrity": "sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ=" + }, + "outpipe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz", + "integrity": "sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I=", + "requires": { + "shell-quote": "1.6.1" + }, + "dependencies": { + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "requires": { + "array-filter": "0.0.1", + "array-map": "0.0.0", + "array-reduce": "0.0.0", + "jsonify": "0.0.0" + } + } + } + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" + }, + "parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", + "requires": { + "path-platform": "0.11.15" + } + }, + "parse-asn1": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", + "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "requires": { + "asn1.js": "4.9.2", + "browserify-aes": "1.1.1", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.14" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + }, + "path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=" + }, + "pbkdf2": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", + "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "requires": { + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.9" + } + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "public-encrypt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", + "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "parse-asn1": "5.1.0", + "randombytes": "2.0.5" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "qs": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz", + "integrity": "sha1-MbGtBYVnZRxSaSFQa5qHk5EaA4Q=" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "quote-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", + "integrity": "sha1-hJY/jJwmuULhU/7rU6rnRlK34LI=", + "requires": { + "buffer-equal": "0.0.1", + "minimist": "1.2.0", + "through2": "2.0.3" + } + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "randombytes": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", + "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "read-only-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-1.1.1.tgz", + "integrity": "sha1-Xad8eZ7ROI0++IoYRxu1kk+KC6E=", + "requires": { + "readable-stream": "1.1.14", + "readable-wrap": "1.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readable-wrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/readable-wrap/-/readable-wrap-1.0.0.tgz", + "integrity": "sha1-O1ohHGMeEjA6VJkcgGwX564ga/8=", + "requires": { + "readable-stream": "1.1.14" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.3", + "set-immediate-shim": "1.0.1" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.8" + } + } + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "requires": { + "path-parse": "1.0.5" + } + }, + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=" + }, + "ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "requires": { + "hash-base": "2.0.2", + "inherits": "2.0.3" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + }, + "sha.js": { + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", + "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=" + }, + "shasum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", + "requires": { + "json-stable-stringify": "0.0.1", + "sha.js": "2.4.9" + } + }, + "shell-quote": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-0.0.1.tgz", + "integrity": "sha1-GkEZbzwDM8SCMjWT1ohuzxU92YY=" + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "optional": true, + "requires": { + "amdefine": "1.0.1" + } + }, + "static-eval": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-0.2.4.tgz", + "integrity": "sha1-t9NNg4k3uWn5ZBygfUj47eJj6ns=", + "requires": { + "escodegen": "0.0.28" + }, + "dependencies": { + "escodegen": { + "version": "0.0.28", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-0.0.28.tgz", + "integrity": "sha1-Dk/xcV8yh3XWyrUaxEpAbNer/9M=", + "requires": { + "esprima": "1.0.4", + "estraverse": "1.3.2", + "source-map": "0.1.43" + } + }, + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=" + }, + "estraverse": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.3.2.tgz", + "integrity": "sha1-N8K4k+8T1yPydth41g2FNRUqbEI=" + } + } + }, + "static-module": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/static-module/-/static-module-1.5.0.tgz", + "integrity": "sha1-J9qYg8QajNCSNvhC8MHrxu32PYY=", + "requires": { + "concat-stream": "1.6.0", + "duplexer2": "0.0.2", + "escodegen": "1.3.3", + "falafel": "2.1.0", + "has": "1.0.1", + "object-inspect": "0.4.0", + "quote-stream": "0.0.0", + "readable-stream": "1.0.34", + "shallow-copy": "0.0.1", + "static-eval": "0.2.4", + "through2": "0.4.2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" + }, + "quote-stream": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-0.0.0.tgz", + "integrity": "sha1-zeKelMQJsW4Z3HCYuJtmWPlyHTs=", + "requires": { + "minimist": "0.0.8", + "through2": "0.4.2" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", + "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", + "requires": { + "readable-stream": "1.0.34", + "xtend": "2.1.2" + } + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "requires": { + "object-keys": "0.4.0" + } + } + } + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "stream-combiner2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.0.2.tgz", + "integrity": "sha1-unKmtQy/q/qVD8i8h2BL0B62BnE=", + "requires": { + "duplexer2": "0.0.2", + "through2": "0.5.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", + "requires": { + "readable-stream": "1.0.34", + "xtend": "3.0.0" + } + }, + "xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=" + } + } + }, + "stream-http": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-1.7.1.tgz", + "integrity": "sha1-09Km4Uw2o4udr7GZrue7xXBRmXg=", + "requires": { + "builtin-status-codes": "1.0.0", + "foreach": "2.0.5", + "indexof": "0.0.1", + "inherits": "2.0.3", + "object-keys": "1.0.11", + "xtend": "4.0.1" + } + }, + "stream-splicer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-1.3.2.tgz", + "integrity": "sha1-PARBvhW5v04iYnXm3IOWR0VUZmE=", + "requires": { + "indexof": "0.0.1", + "inherits": "2.0.3", + "isarray": "0.0.1", + "readable-stream": "1.1.14", + "readable-wrap": "1.0.0", + "through2": "1.1.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", + "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", + "requires": { + "readable-stream": "1.1.14", + "xtend": "4.0.1" + } + } + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "requires": { + "minimist": "1.2.0" + } + }, + "syntax-error": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.3.0.tgz", + "integrity": "sha1-HtkmbE1AvnXcVb+bsct3Biu5bKE=", + "requires": { + "acorn": "4.0.13" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + } + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "requires": { + "readable-stream": "2.3.3", + "xtend": "4.0.1" + } + }, + "timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", + "requires": { + "process": "0.11.10" + } + }, + "tiny-lr-fork": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/tiny-lr-fork/-/tiny-lr-fork-0.0.5.tgz", + "integrity": "sha1-Hpnh4qhGm3NquX2X7vqYxx927Qo=", + "requires": { + "debug": "0.7.4", + "faye-websocket": "0.4.4", + "noptify": "0.0.3", + "qs": "0.5.6" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "umd": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.1.tgz", + "integrity": "sha1-iuVW4RAR9jwllnCKiDclnwGz1g4=" + }, + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=" + }, + "underscore.string": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz", + "integrity": "sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk=" + }, + "url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "requires": { + "indexof": "0.0.1" + } + }, + "watchify": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/watchify/-/watchify-3.9.0.tgz", + "integrity": "sha1-8HX9LoqGrN6Eztum5cKgvt1SPZ4=", + "requires": { + "anymatch": "1.3.2", + "browserify": "14.5.0", + "chokidar": "1.7.0", + "defined": "1.0.0", + "outpipe": "1.1.1", + "through2": "2.0.3", + "xtend": "4.0.1" + }, + "dependencies": { + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "requires": { + "util": "0.10.3" + } + }, + "base64-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", + "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==" + }, + "browser-pack": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.0.2.tgz", + "integrity": "sha1-+GzWzvT1MAyOY+B6TVEvZfv/RTE=", + "requires": { + "JSONStream": "1.3.1", + "combine-source-map": "0.7.2", + "defined": "1.0.0", + "through2": "2.0.3", + "umd": "3.0.1" + } + }, + "browserify": { + "version": "14.5.0", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-14.5.0.tgz", + "integrity": "sha512-gKfOsNQv/toWz+60nSPfYzuwSEdzvV2WdxrVPUbPD/qui44rAkB3t3muNtmmGYHqrG56FGwX9SUEQmzNLAeS7g==", + "requires": { + "JSONStream": "1.3.1", + "assert": "1.4.1", + "browser-pack": "6.0.2", + "browser-resolve": "1.11.2", + "browserify-zlib": "0.2.0", + "buffer": "5.0.8", + "cached-path-relative": "1.0.1", + "concat-stream": "1.5.2", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.11.1", + "defined": "1.0.0", + "deps-sort": "2.0.0", + "domain-browser": "1.1.7", + "duplexer2": "0.1.4", + "events": "1.1.1", + "glob": "7.1.2", + "has": "1.0.1", + "htmlescape": "1.1.1", + "https-browserify": "1.0.0", + "inherits": "2.0.3", + "insert-module-globals": "7.0.1", + "labeled-stream-splicer": "2.0.0", + "module-deps": "4.1.1", + "os-browserify": "0.3.0", + "parents": "1.0.1", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "read-only-stream": "2.0.0", + "readable-stream": "2.3.3", + "resolve": "1.5.0", + "shasum": "1.0.2", + "shell-quote": "1.6.1", + "stream-browserify": "2.0.1", + "stream-http": "2.7.2", + "string_decoder": "1.0.3", + "subarg": "1.0.0", + "syntax-error": "1.3.0", + "through2": "2.0.3", + "timers-browserify": "1.4.2", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.10.3", + "vm-browserify": "0.0.4", + "xtend": "4.0.1" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "1.0.6" + } + }, + "buffer": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.0.8.tgz", + "integrity": "sha512-xXvjQhVNz50v2nPeoOsNqWCLGfiv4ji/gXZM28jnVwdLJxH4mFyqgqCKfaK9zf1KUbG6zTkjLOy7ou+jSMarGA==", + "requires": { + "base64-js": "1.2.1", + "ieee754": "1.1.8" + } + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "combine-source-map": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.7.2.tgz", + "integrity": "sha1-CHAxKFazB6h8xKxIbzqaYq7MwJ4=", + "requires": { + "convert-source-map": "1.1.3", + "inline-source-map": "0.6.2", + "lodash.memoize": "3.0.4", + "source-map": "0.5.7" + } + }, + "concat-stream": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz", + "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.0.6", + "typedarray": "0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "0.10.31", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "deps-sort": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", + "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", + "requires": { + "JSONStream": "1.3.1", + "shasum": "1.0.2", + "subarg": "1.0.0", + "through2": "2.0.3" + } + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "requires": { + "readable-stream": "2.3.3" + } + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "requires": { + "source-map": "0.5.7" + } + }, + "insert-module-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.0.1.tgz", + "integrity": "sha1-wDv04BywhtW15azorQr+eInWOMM=", + "requires": { + "JSONStream": "1.3.1", + "combine-source-map": "0.7.2", + "concat-stream": "1.5.2", + "is-buffer": "1.1.6", + "lexical-scope": "1.2.0", + "process": "0.11.10", + "through2": "2.0.3", + "xtend": "4.0.1" + } + }, + "labeled-stream-splicer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz", + "integrity": "sha1-pS4dE4AkwAuGscDJH2d5GLiuClk=", + "requires": { + "inherits": "2.0.3", + "isarray": "0.0.1", + "stream-splicer": "2.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "module-deps": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-4.1.1.tgz", + "integrity": "sha1-IyFYM/HaE/1gbMuAh7RIUty4If0=", + "requires": { + "JSONStream": "1.3.1", + "browser-resolve": "1.11.2", + "cached-path-relative": "1.0.1", + "concat-stream": "1.5.2", + "defined": "1.0.0", + "detective": "4.5.0", + "duplexer2": "0.1.4", + "inherits": "2.0.3", + "parents": "1.0.1", + "readable-stream": "2.3.3", + "resolve": "1.5.0", + "stream-combiner2": "1.1.1", + "subarg": "1.0.0", + "through2": "2.0.3", + "xtend": "4.0.1" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==" + }, + "read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", + "requires": { + "readable-stream": "2.3.3" + } + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "requires": { + "array-filter": "0.0.1", + "array-map": "0.0.0", + "array-reduce": "0.0.0", + "jsonify": "0.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "requires": { + "duplexer2": "0.1.4", + "readable-stream": "2.3.3" + } + }, + "stream-http": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", + "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + } + }, + "stream-splicer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", + "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + } + } + }, + "which": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz", + "integrity": "sha1-RgwdoPgQED0DIam2M6+eV15kSG8=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + } + } +} From 8ce53949b76642204b70f59d51284d558e7bfe94 Mon Sep 17 00:00:00 2001 From: Kozopas Viktoria Date: Thu, 9 Nov 2017 22:46:09 +0200 Subject: [PATCH 06/24] first part js --- Frontend/src/pizza/PizzaCart.js | 57 ++- Frontend/src/pizza/PizzaMenu.js | 8 + Frontend/templates/PizzaMenu_OneItem.ejs | 42 +- Frontend/www/assets/js/main.js | 67 ++- .../www/assets/less/panels/right-panel.less | 6 + .../www/assets/less/pizza/pizza-card.less | 3 +- Frontend/www/index.html | 456 +----------------- 7 files changed, 155 insertions(+), 484 deletions(-) diff --git a/Frontend/src/pizza/PizzaCart.js b/Frontend/src/pizza/PizzaCart.js index f5b631ecd..4c5c8b604 100644 --- a/Frontend/src/pizza/PizzaCart.js +++ b/Frontend/src/pizza/PizzaCart.js @@ -19,19 +19,20 @@ var $cart = $("#cart"); function addToCart(pizza, size) { //Додавання однієї піци в кошик покупок function checkIfPresent() { - for (var i = 0; i < Cart.length; i++){ - if(Cart[i].pizza == pizza&&size==Cart[i].size) return i; + for (var i = 0; i < Cart.length; i++) { + if (Cart[i].pizza == pizza && size == Cart[i].size) return i; } return -1; } + var check = checkIfPresent(); - if (check===-1){ + if (check === -1) { Cart.push({ pizza: pizza, size: size, quantity: 1 }); - }else{ + } else { Cart[check].quantity++; } @@ -39,19 +40,18 @@ function addToCart(pizza, size) { updateCart(); } -function removeFromCart(cart_item) { - //Видалити піцу з кошика - //TODO: треба зробити - // Cart[cart_item] = null; - //Після видалення оновити відображення +function removeFromCart(cart_item) { + Cart.splice(Cart.indexOf(cart_item), 1); updateCart(); } function clearCart() { - Cart = []; - - updateCart(); + $(".clear-order").click(function () { + Cart = []; + $(".order-count").text(0); + updateCart(); + }); } function initialiseCart() { @@ -60,9 +60,12 @@ function initialiseCart() { //TODO: ... var saved_cart = Storage.read("cart"); - if(saved_cart){ + if (saved_cart) { Cart = saved_cart; } + // else { + // $cart.append($("#no-order")); + // } updateCart(); } @@ -77,11 +80,11 @@ function updateCart() { //Тут можна наприклад показати оновлений кошик на екрані та зберегти вміт кошика в Local Storage Storage.write("cart", Cart); - //Очищаємо старі піци в кошику $cart.html(""); var total = 0; + var one_pizza_sum = 0; //Онволення однієї піци function showOnePizzaInCart(cart_item) { @@ -92,26 +95,42 @@ function updateCart() { var $node = $(html_code); - $node.find(".plus").click(function(){ + $node.find(".plus").click(function () { //Збільшуємо кількість замовлених піц cart_item.quantity += 1; total += cart_item.pizza[cart_item.size].price; + $(".order-count").text(total); + + one_pizza_sum += cart_item.pizza[cart_item.size].price; + $(".price").text(one_pizza_sum); //Оновлюємо відображення updateCart(); }); - $node.find(".minus").click(function(){ + $node.find(".minus").click(function () { //Збільшуємо кількість замовлених піц - if (cart_item.quantity == 1){ - //DELETE CART !!!!!!!!!!!!!!! - }else{ + if (cart_item.quantity == 1) { + removeFromCart(cart_item); + updateCart(); + } else { cart_item.quantity -= 1; total -= cart_item.pizza[cart_item.size].price; + $(".order-count").text(total); + + one_pizza_sum -= cart_item.pizza[cart_item.size].price; + $(".price").text(one_pizza_sum); updateCart(); } }); + $node.find(".count-clear").click(function () { + removeFromCart(cart_item); + total -= cart_item.pizza[cart_item.size].price; + $(".order-count").text(total); + updateCart(); + }); + $cart.append($node); } diff --git a/Frontend/src/pizza/PizzaMenu.js b/Frontend/src/pizza/PizzaMenu.js index 4ee9f2a50..8b0a6f90f 100644 --- a/Frontend/src/pizza/PizzaMenu.js +++ b/Frontend/src/pizza/PizzaMenu.js @@ -39,7 +39,15 @@ function filterPizza(filter) { //Якщо піка відповідає фільтру //pizza_shown.push(pizza); + if (pizza.type == filter){ + pizza_shown.push(pizza); + } + //TODO: зробити фільтри + var $alltypes = $(".pizza-all-types"); + $alltypes.find(".button-all").click(function () { + + }) }); //Показати відфільтровані піци diff --git a/Frontend/templates/PizzaMenu_OneItem.ejs b/Frontend/templates/PizzaMenu_OneItem.ejs index 666f8430a..7ead35e72 100644 --- a/Frontend/templates/PizzaMenu_OneItem.ejs +++ b/Frontend/templates/PizzaMenu_OneItem.ejs @@ -33,7 +33,7 @@ function getIngredientsArray(pizza) { <%= getIngredientsArray(pizza).join(", ") %>

- <% if(pizza.small_size) { %> + <%if (pizza.small_size && pizza.big_size){%>
@@ -51,8 +51,6 @@ function getIngredientsArray(pizza) { Купити
- <%}%> - <% if(pizza.big_size) { %>
@@ -70,7 +68,43 @@ function getIngredientsArray(pizza) { Купити
- <%}%> + <% } else if (pizza.small_size) {%> +
+
+ + <%= pizza.small_size.size %> +
+
+ + <%= pizza.small_size.weight %> +
+

+
+ <%= pizza.small_size.price %> +
грн.
+
+

+ Купити +
+ <% } else { %> +
+
+ + <%= pizza.big_size.size %> +
+
+ + <%= pizza.big_size.weight %> +
+

+
+ <%= pizza.big_size.price %> +
грн.
+
+

+ Купити +
+ <% } %>
diff --git a/Frontend/www/assets/js/main.js b/Frontend/www/assets/js/main.js index 6214424fc..14aa89fb4 100644 --- a/Frontend/www/assets/js/main.js +++ b/Frontend/www/assets/js/main.js @@ -184,7 +184,7 @@ module.exports = pizza_info; var ejs = require('ejs'); -exports.PizzaMenu_OneItem = ejs.compile("<%\r\n\r\nfunction getIngredientsArray(pizza) {\r\n //Отримує вміст піци\r\n var content = pizza.content;\r\n var result = [];\r\n\r\n //Object.keys повертає масив ключів в об’єкті JavaScript\r\n\r\n Object.keys(content).forEach(function(key){\r\n //a.concat(b) створює спільний масив із масивів a та b\r\n result = result.concat(content[key]);\r\n });\r\n\r\n return result;\r\n}\r\n\r\n %>\r\n
\r\n
\r\n\r\n <% if(pizza.is_new) { %>\r\n Нова\r\n <% } else if(pizza.is_popular) {%>\r\n Популярна\r\n <% } %>\r\n \">\r\n\r\n
\r\n <%= pizza.title %>\r\n
<%= pizza.type %>
\r\n
\r\n <%= getIngredientsArray(pizza).join(\", \") %>\r\n
\r\n
\r\n <% if(pizza.small_size) { %>\r\n
\r\n
\r\n \r\n <%= pizza.small_size.size %>\r\n
\r\n
\r\n \r\n <%= pizza.small_size.weight %>\r\n
\r\n

\r\n
\r\n <%= pizza.small_size.price %>\r\n
грн.
\r\n
\r\n

\r\n Купити\r\n
\r\n <%}%>\r\n <% if(pizza.big_size) { %>\r\n
\r\n
\r\n \r\n <%= pizza.big_size.size %>\r\n
\r\n
\r\n \r\n <%= pizza.big_size.weight %>\r\n
\r\n

\r\n
\r\n <%= pizza.big_size.price %>\r\n
грн.
\r\n
\r\n

\r\n Купити\r\n
\r\n <%}%>\r\n
\r\n
\r\n
\r\n
"); +exports.PizzaMenu_OneItem = ejs.compile("<%\r\n\r\nfunction getIngredientsArray(pizza) {\r\n //Отримує вміст піци\r\n var content = pizza.content;\r\n var result = [];\r\n\r\n //Object.keys повертає масив ключів в об’єкті JavaScript\r\n\r\n Object.keys(content).forEach(function(key){\r\n //a.concat(b) створює спільний масив із масивів a та b\r\n result = result.concat(content[key]);\r\n });\r\n\r\n return result;\r\n}\r\n\r\n %>\r\n
\r\n
\r\n\r\n <% if(pizza.is_new) { %>\r\n Нова\r\n <% } else if(pizza.is_popular) {%>\r\n Популярна\r\n <% } %>\r\n \">\r\n\r\n
\r\n <%= pizza.title %>\r\n
<%= pizza.type %>
\r\n
\r\n <%= getIngredientsArray(pizza).join(\", \") %>\r\n
\r\n
\r\n <%if (pizza.small_size && pizza.big_size){%>\r\n
\r\n
\r\n \r\n <%= pizza.small_size.size %>\r\n
\r\n
\r\n \r\n <%= pizza.small_size.weight %>\r\n
\r\n

\r\n
\r\n <%= pizza.small_size.price %>\r\n
грн.
\r\n
\r\n

\r\n Купити\r\n
\r\n
\r\n
\r\n \r\n <%= pizza.big_size.size %>\r\n
\r\n
\r\n \r\n <%= pizza.big_size.weight %>\r\n
\r\n

\r\n
\r\n <%= pizza.big_size.price %>\r\n
грн.
\r\n
\r\n

\r\n Купити\r\n
\r\n <% } else if (pizza.small_size) {%>\r\n
\r\n
\r\n \r\n <%= pizza.small_size.size %>\r\n
\r\n
\r\n \r\n <%= pizza.small_size.weight %>\r\n
\r\n

\r\n
\r\n <%= pizza.small_size.price %>\r\n
грн.
\r\n
\r\n

\r\n Купити\r\n
\r\n <% } else { %>\r\n
\r\n
\r\n \r\n <%= pizza.big_size.size %>\r\n
\r\n
\r\n \r\n <%= pizza.big_size.weight %>\r\n
\r\n

\r\n
\r\n <%= pizza.big_size.price %>\r\n
грн.
\r\n
\r\n

\r\n Купити\r\n
\r\n <% } %>\r\n
\r\n
\r\n
\r\n
"); exports.PizzaCart_OneItem = ejs.compile("<%\r\nfunction someFunction(pizza) {\r\n\r\n}\r\n\r\n%>\r\n\r\n\r\n
\r\n \"Піца\"\">\r\n\r\n

\r\n <% if(size == \"small_size\"){ %>\r\n <%= pizza.title %> (Мала)\r\n <% }else { %>\r\n <%= pizza.title %> (Велика)\r\n <% } %>\r\n

\r\n
\r\n \r\n <%= pizza[size].size %>\r\n \r\n <%= pizza[size].weight %>\r\n
\r\n
\r\n <%= pizza[size].price %> грн.\r\n \r\n \r\n \r\n \r\n <%= quantity %>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
"); @@ -228,19 +228,20 @@ var $cart = $("#cart"); function addToCart(pizza, size) { //Додавання однієї піци в кошик покупок function checkIfPresent() { - for (var i = 0; i < Cart.length; i++){ - if(Cart[i].pizza == pizza&&size==Cart[i].size) return i; + for (var i = 0; i < Cart.length; i++) { + if (Cart[i].pizza == pizza && size == Cart[i].size) return i; } return -1; } + var check = checkIfPresent(); - if (check===-1){ + if (check === -1) { Cart.push({ pizza: pizza, size: size, quantity: 1 }); - }else{ + } else { Cart[check].quantity++; } @@ -248,19 +249,18 @@ function addToCart(pizza, size) { updateCart(); } -function removeFromCart(cart_item) { - //Видалити піцу з кошика - //TODO: треба зробити - // Cart[cart_item] = null; - //Після видалення оновити відображення +function removeFromCart(cart_item) { + Cart.splice(Cart.indexOf(cart_item), 1); updateCart(); } function clearCart() { - Cart = []; - - updateCart(); + $(".clear-order").click(function () { + Cart = []; + $(".order-count").text(0); + updateCart(); + }); } function initialiseCart() { @@ -269,9 +269,12 @@ function initialiseCart() { //TODO: ... var saved_cart = Storage.read("cart"); - if(saved_cart){ + if (saved_cart) { Cart = saved_cart; } + // else { + // $cart.append($("#no-order")); + // } updateCart(); } @@ -286,11 +289,11 @@ function updateCart() { //Тут можна наприклад показати оновлений кошик на екрані та зберегти вміт кошика в Local Storage Storage.write("cart", Cart); - //Очищаємо старі піци в кошику $cart.html(""); var total = 0; + var one_pizza_sum = 0; //Онволення однієї піци function showOnePizzaInCart(cart_item) { @@ -301,26 +304,42 @@ function updateCart() { var $node = $(html_code); - $node.find(".plus").click(function(){ + $node.find(".plus").click(function () { //Збільшуємо кількість замовлених піц cart_item.quantity += 1; total += cart_item.pizza[cart_item.size].price; + $(".order-count").text(total); + + one_pizza_sum += cart_item.pizza[cart_item.size].price; + $(".price").text(one_pizza_sum); //Оновлюємо відображення updateCart(); }); - $node.find(".minus").click(function(){ + $node.find(".minus").click(function () { //Збільшуємо кількість замовлених піц - if (cart_item.quantity == 1){ - //DELETE CART !!!!!!!!!!!!!!! - }else{ + if (cart_item.quantity == 1) { + removeFromCart(cart_item); + updateCart(); + } else { cart_item.quantity -= 1; total -= cart_item.pizza[cart_item.size].price; + $(".order-count").text(total); + + one_pizza_sum -= cart_item.pizza[cart_item.size].price; + $(".price").text(one_pizza_sum); updateCart(); } }); + $node.find(".count-clear").click(function () { + removeFromCart(cart_item); + total -= cart_item.pizza[cart_item.size].price; + $(".order-count").text(total); + updateCart(); + }); + $cart.append($node); } @@ -377,7 +396,15 @@ function filterPizza(filter) { //Якщо піка відповідає фільтру //pizza_shown.push(pizza); + if (pizza.type == filter){ + pizza_shown.push(pizza); + } + //TODO: зробити фільтри + var $alltypes = $(".pizza-all-types"); + $alltypes.find(".button-all").click(function () { + + }) }); //Показати відфільтровані піци diff --git a/Frontend/www/assets/less/panels/right-panel.less b/Frontend/www/assets/less/panels/right-panel.less index e6d8d45ac..240e29dda 100644 --- a/Frontend/www/assets/less/panels/right-panel.less +++ b/Frontend/www/assets/less/panels/right-panel.less @@ -115,6 +115,12 @@ padding-right: 15px; font-size: 10px; color: rgba(0, 0, 0, .5); + border: 0px; + background-color: white; + } + + .clear-order:focus{ + outline: none; } } diff --git a/Frontend/www/assets/less/pizza/pizza-card.less b/Frontend/www/assets/less/pizza/pizza-card.less index b1ab921e0..ba548e9b4 100644 --- a/Frontend/www/assets/less/pizza/pizza-card.less +++ b/Frontend/www/assets/less/pizza/pizza-card.less @@ -24,13 +24,14 @@ .description { font-size: 14px; overflow: hidden; + height: 60px; margin-bottom: 30px; } .badge-new { position: absolute; top: -15px; - right: -5px; + right: 7px; font-size: 18px; } diff --git a/Frontend/www/index.html b/Frontend/www/index.html index f8e81a4d5..52db3f742 100644 --- a/Frontend/www/index.html +++ b/Frontend/www/index.html @@ -41,30 +41,30 @@

-
-
-
- Нова - - -
- Імпреза -
М'ясна піца
-
- Балик, салямі, курка, сир моцарелла, сир Рокфорд, ананаси, томатна паста, петрушка -
-
-
-
- - 30 -
-
- - 370 -
-

-
- 99 -
грн.
-
-

- Купити -
-
-
- - 40 -
-
- - 660 -
-

-
- 169 -
грн.
-
-

- Купити -
-
-
-
-
-
-
- Популярна - - -
- BBQ -
М'ясна піца
-
- Мисливські ковбаски, ковбаски пепероні, шинка, сир домашній, шампіньйони, петрушка, оливки -
-
-
-
- - 30 -
-
- - 460 -
-

-
- 139 -
грн.
-
-

- Купити -
-
-
- - 40 -
-
- - 840 -
-

-
- 199 -
грн.
-
-

- Купити -
-
-
-
-
-
-
- - -
- Імпреза -
М'ясна піца
-
- Балик, салямі, курка, сир моцарелла, сир Рокфорд, ананаси, томатна паста, петрушка -
-
-
-
- - 30 -
-
- - 370 -
-

-
- 99 -
грн.
-
-

- Купити -
-
-
- - 40 -
-
- - 660 -
-

-
- 169 -
грн.
-
-

- Купити -
-
-
-
-
-
-
- - -
- Імпреза -
М'ясна піца
-
- Балик, салямі, курка, сир моцарелла, сир Рокфорд, ананаси, томатна паста, петрушка -
-
-
-
- - 30 -
-
- - 370 -
-

-
- 99 -
грн.
-
-

- Купити -
-
-
- - 40 -
-
- - 660 -
-

-
- 169 -
грн.
-
-

- Купити -
-
-
-
-
-
-
- - -
- Імпреза -
М'ясна піца
-
- Балик, салямі, курка, сир моцарелла, сир Рокфорд, ананаси, томатна паста, петрушка -
-
-
-
- - 30 -
-
- - 370 -
-

-
- 99 -
грн.
-
-

- Купити -
-
-
- - 40 -
-
- - 660 -
-

-
- 169 -
грн.
-
-

- Купити -
-
-
-
-
-
-
- - -
- Імпреза -
М'ясна піца
-
- Балик, салямі, курка, сир моцарелла, сир Рокфорд, ананаси, томатна паста, петрушка -
-
-
-
- - 30 -
-
- - 370 -
-

-
- 99 -
грн.
-
-

- Купити -
-
-
- - 40 -
-
- - 660 -
-

-
- 169 -
грн.
-
-

- Купити -
-
-
-
-
-
-
- - -
- Імпреза -
М'ясна піца
-
- Балик, салямі, курка, сир моцарелла, сир Рокфорд, ананаси, томатна паста, петрушка -
-
-
-
- - 30 -
-
- - 370 -
-

-
- 99 -
грн.
-
-

- Купити -
-
-
- - 40 -
-
- - 660 -
-

-
- 169 -
грн.
-
-

- Купити -
-
-
-
-
-
-
- - -
- Імпреза -
М'ясна піца
-
- Балик, салямі, курка, сир моцарелла, сир Рокфорд, ананаси, томатна паста, петрушка -
-
-
-
- - 30 -
-
- - 370 -
-

-
- 99 -
грн.
-
-

- Купити -
-
-
- - 40 -
-
- - 660 -
-

-
- 169 -
грн.
-
-

- Купити -
-
-
-
-
-
+

@@ -498,50 +103,21 @@

+
+ + + + + + +
Замовлення 0 - -
-
-
-
- Піца -

- BBQ (Велика) -

-
- - 40 - - 840 -
-
- 199 грн. - - - - - 1 - - - - - - - - - -
-
- -
- Пусто в холодильнику? -
- Замовте піцу! +
From 24c2a36b9aaca24f065a53d26547e6c87ff9bf18 Mon Sep 17 00:00:00 2001 From: Kozopas Viktoria Date: Fri, 10 Nov 2017 16:00:14 +0200 Subject: [PATCH 07/24] Filters done --- Frontend/src/main.js | 9 ++ Frontend/src/pizza/PizzaCart.js | 28 ++--- Frontend/src/pizza/PizzaMenu.js | 74 ++++++++--- Frontend/templates/PizzaCart_OneItem.ejs | 4 +- Frontend/templates/PizzaMenu_OneItem.ejs | 8 +- Frontend/www/assets/js/main.js | 115 ++++++++++++------ .../www/assets/less/panels/right-panel.less | 2 +- Frontend/www/index.html | 14 +-- 8 files changed, 174 insertions(+), 80 deletions(-) diff --git a/Frontend/src/main.js b/Frontend/src/main.js index 697e5f1ae..61ef93aaa 100644 --- a/Frontend/src/main.js +++ b/Frontend/src/main.js @@ -11,7 +11,16 @@ $(function(){ PizzaCart.initialiseCart(); PizzaMenu.initialiseMenu(); + $(".nav-pills li").on("click", function () { + $(".nav-pills li").removeClass("active"); + $(this).addClass("active"); + var filt = $(this).find('a').data("filter"); + PizzaMenu.filterPizza(filt); + }) + $(".clear-cart").click(function () { PizzaCart.clearCart(); }); + + }); \ No newline at end of file diff --git a/Frontend/src/pizza/PizzaCart.js b/Frontend/src/pizza/PizzaCart.js index 4c5c8b604..9255bac4d 100644 --- a/Frontend/src/pizza/PizzaCart.js +++ b/Frontend/src/pizza/PizzaCart.js @@ -20,7 +20,7 @@ function addToCart(pizza, size) { //Додавання однієї піци в кошик покупок function checkIfPresent() { for (var i = 0; i < Cart.length; i++) { - if (Cart[i].pizza == pizza && size == Cart[i].size) return i; + if (Cart[i].pizza.id == pizza.id && size == Cart[i].size) return i; } return -1; } @@ -63,9 +63,6 @@ function initialiseCart() { if (saved_cart) { Cart = saved_cart; } - // else { - // $cart.append($("#no-order")); - // } updateCart(); } @@ -85,23 +82,26 @@ function updateCart() { var total = 0; var one_pizza_sum = 0; + var number_of_pizzas = 0; //Онволення однієї піци function showOnePizzaInCart(cart_item) { var html_code = Templates.PizzaCart_OneItem(cart_item); - total += cart_item.pizza[cart_item.size].price; - $(".order-count").text(total); // !!!!!!!!!!!!!!!!!!! + //total += cart_item.pizza[cart_item.size].price;// !!!!!!!!!!!!!!!!!!! + + number_of_pizzas +=1; + $(".order-count").text(number_of_pizzas); var $node = $(html_code); $node.find(".plus").click(function () { //Збільшуємо кількість замовлених піц cart_item.quantity += 1; - total += cart_item.pizza[cart_item.size].price; - $(".order-count").text(total); + // total += cart_item.pizza[cart_item.size].price; + // $(".order-count").text(total); - one_pizza_sum += cart_item.pizza[cart_item.size].price; + one_pizza_sum = cart_item.pizza[cart_item.size].quantity * cart_item.pizza[cart_item.size].price; $(".price").text(one_pizza_sum); //Оновлюємо відображення @@ -110,13 +110,13 @@ function updateCart() { $node.find(".minus").click(function () { //Збільшуємо кількість замовлених піц - if (cart_item.quantity == 1) { + if (cart_item.quantity === 1) { removeFromCart(cart_item); updateCart(); } else { cart_item.quantity -= 1; - total -= cart_item.pizza[cart_item.size].price; - $(".order-count").text(total); + //total -= cart_item.pizza[cart_item.size].price; + //$(".order-count").text(total); one_pizza_sum -= cart_item.pizza[cart_item.size].price; $(".price").text(one_pizza_sum); @@ -126,8 +126,8 @@ function updateCart() { $node.find(".count-clear").click(function () { removeFromCart(cart_item); - total -= cart_item.pizza[cart_item.size].price; - $(".order-count").text(total); + //total -= cart_item.pizza[cart_item.size].price; + //$(".order-count").text(total); updateCart(); }); diff --git a/Frontend/src/pizza/PizzaMenu.js b/Frontend/src/pizza/PizzaMenu.js index 8b0a6f90f..c54f673d5 100644 --- a/Frontend/src/pizza/PizzaMenu.js +++ b/Frontend/src/pizza/PizzaMenu.js @@ -18,10 +18,10 @@ function showPizzaList(list) { var $node = $(html_code); - $node.find(".bb").click(function(){ + $node.find(".bb").click(function () { PizzaCart.addToCart(pizza, PizzaCart.PizzaSize.Big); }); - $node.find(".bs").click(function(){ + $node.find(".bs").click(function () { PizzaCart.addToCart(pizza, PizzaCart.PizzaSize.Small); }); @@ -31,27 +31,65 @@ function showPizzaList(list) { list.forEach(showOnePizza); } +var PizzaFilter = { + All: 0, + Meat: 1, + Pineaple: 2, + Mushroom: 3, + Sea: 4, + Veg: 5 +} + + function filterPizza(filter) { //Масив куди потраплять піци які треба показати var pizza_shown = []; - Pizza_List.forEach(function(pizza){ - //Якщо піка відповідає фільтру - //pizza_shown.push(pizza); - - if (pizza.type == filter){ - pizza_shown.push(pizza); + if (filter === PizzaFilter.All) { + showPizzaList(Pizza_List); + $(".all-pizza-title").text("Усі піци"); + $(".pizza-count").text("8"); + } else { + if (filter === PizzaFilter.Meat) { + Pizza_List.forEach(function (pizza) { + if (pizza.type === 'М’ясна піца') { + pizza_shown.push(pizza); + } + }); + $(".all-pizza-title").text("М'ясні піци"); + } else if (filter === PizzaFilter.Pineaple) { + Pizza_List.forEach(function (pizza) { + if (pizza.content.pineapple) { + pizza_shown.push(pizza); + } + }); + $(".all-pizza-title").text("Піци з ананасами"); + }else if (filter === PizzaFilter.Mushroom) { + Pizza_List.forEach(function (pizza) { + if (pizza.content.mushroom) { + pizza_shown.push(pizza); + } + }); + $(".all-pizza-title").text("Піци з грибами"); + }else if (filter === PizzaFilter.Sea) { + Pizza_List.forEach(function (pizza) { + if (pizza.content.ocean) { + pizza_shown.push(pizza); + } + }); + $(".all-pizza-title").text("Піци з морепродуктами"); + }else if (filter === PizzaFilter.Veg) { + Pizza_List.forEach(function (pizza) { + if (pizza.type === 'Вега піца') { + pizza_shown.push(pizza); + } + }); + $(".all-pizza-title").text("Вегетарінські піци"); } - - //TODO: зробити фільтри - var $alltypes = $(".pizza-all-types"); - $alltypes.find(".button-all").click(function () { - - }) - }); - - //Показати відфільтровані піци - showPizzaList(pizza_shown); + $(".pizza-count").text(pizza_shown.length); + //Показати відфільтровані піци + showPizzaList(pizza_shown); + } } diff --git a/Frontend/templates/PizzaCart_OneItem.ejs b/Frontend/templates/PizzaCart_OneItem.ejs index 86bbd6161..7f17abce2 100644 --- a/Frontend/templates/PizzaCart_OneItem.ejs +++ b/Frontend/templates/PizzaCart_OneItem.ejs @@ -10,7 +10,7 @@ function someFunction(pizza) { Піца

- <% if(size == "small_size"){ %> + <% if(pizza.size == "small_size"){ %> <%= pizza.title %> (Мала) <% }else { %> <%= pizza.title %> (Велика) @@ -23,7 +23,7 @@ function someFunction(pizza) { <%= pizza[size].weight %>

-
+
<%= pizza.small_size.price %>
грн.
@@ -61,7 +61,7 @@ function getIngredientsArray(pizza) { <%= pizza.big_size.weight %>

-
+
<%= pizza.big_size.price %>
грн.
@@ -79,7 +79,7 @@ function getIngredientsArray(pizza) { <%= pizza.small_size.weight %>

-
+
<%= pizza.small_size.price %>
грн.
@@ -97,7 +97,7 @@ function getIngredientsArray(pizza) { <%= pizza.big_size.weight %>

-
+
<%= pizza.big_size.price %>
грн.
diff --git a/Frontend/www/assets/js/main.js b/Frontend/www/assets/js/main.js index 14aa89fb4..ec142b09f 100644 --- a/Frontend/www/assets/js/main.js +++ b/Frontend/www/assets/js/main.js @@ -184,9 +184,9 @@ module.exports = pizza_info; var ejs = require('ejs'); -exports.PizzaMenu_OneItem = ejs.compile("<%\r\n\r\nfunction getIngredientsArray(pizza) {\r\n //Отримує вміст піци\r\n var content = pizza.content;\r\n var result = [];\r\n\r\n //Object.keys повертає масив ключів в об’єкті JavaScript\r\n\r\n Object.keys(content).forEach(function(key){\r\n //a.concat(b) створює спільний масив із масивів a та b\r\n result = result.concat(content[key]);\r\n });\r\n\r\n return result;\r\n}\r\n\r\n %>\r\n
\r\n
\r\n\r\n <% if(pizza.is_new) { %>\r\n Нова\r\n <% } else if(pizza.is_popular) {%>\r\n Популярна\r\n <% } %>\r\n \">\r\n\r\n
\r\n <%= pizza.title %>\r\n
<%= pizza.type %>
\r\n
\r\n <%= getIngredientsArray(pizza).join(\", \") %>\r\n
\r\n
\r\n <%if (pizza.small_size && pizza.big_size){%>\r\n \r\n
\r\n
\r\n \r\n <%= pizza.big_size.size %>\r\n
\r\n
\r\n \r\n <%= pizza.big_size.weight %>\r\n
\r\n

\r\n
\r\n <%= pizza.big_size.price %>\r\n
грн.
\r\n
\r\n

\r\n Купити\r\n
\r\n <% } else if (pizza.small_size) {%>\r\n
\r\n
\r\n \r\n <%= pizza.small_size.size %>\r\n
\r\n
\r\n \r\n <%= pizza.small_size.weight %>\r\n
\r\n

\r\n
\r\n <%= pizza.small_size.price %>\r\n
грн.
\r\n
\r\n

\r\n Купити\r\n
\r\n <% } else { %>\r\n
\r\n
\r\n \r\n <%= pizza.big_size.size %>\r\n
\r\n
\r\n \r\n <%= pizza.big_size.weight %>\r\n
\r\n

\r\n
\r\n <%= pizza.big_size.price %>\r\n
грн.
\r\n
\r\n

\r\n Купити\r\n
\r\n <% } %>\r\n
\r\n
\r\n
\r\n
"); +exports.PizzaMenu_OneItem = ejs.compile("<%\r\n\r\nfunction getIngredientsArray(pizza) {\r\n //Отримує вміст піци\r\n var content = pizza.content;\r\n var result = [];\r\n\r\n //Object.keys повертає масив ключів в об’єкті JavaScript\r\n\r\n Object.keys(content).forEach(function(key){\r\n //a.concat(b) створює спільний масив із масивів a та b\r\n result = result.concat(content[key]);\r\n });\r\n\r\n return result;\r\n}\r\n\r\n %>\r\n
\r\n
\r\n\r\n <% if(pizza.is_new) { %>\r\n Нова\r\n <% } else if(pizza.is_popular) {%>\r\n Популярна\r\n <% } %>\r\n \">\r\n\r\n
\r\n <%= pizza.title %>\r\n
<%= pizza.type %>
\r\n
\r\n <%= getIngredientsArray(pizza).join(\", \") %>\r\n
\r\n
\r\n <%if (pizza.small_size && pizza.big_size){%>\r\n
\r\n
\r\n \r\n <%= pizza.small_size.size %>\r\n
\r\n
\r\n \r\n <%= pizza.small_size.weight %>\r\n
\r\n

\r\n
\r\n <%= pizza.small_size.price %>\r\n
грн.
\r\n
\r\n

\r\n Купити\r\n
\r\n
\r\n
\r\n \r\n <%= pizza.big_size.size %>\r\n
\r\n
\r\n \r\n <%= pizza.big_size.weight %>\r\n
\r\n

\r\n
\r\n <%= pizza.big_size.price %>\r\n
грн.
\r\n
\r\n

\r\n Купити\r\n
\r\n <% } else if (pizza.small_size) {%>\r\n
\r\n
\r\n \r\n <%= pizza.small_size.size %>\r\n
\r\n
\r\n \r\n <%= pizza.small_size.weight %>\r\n
\r\n

\r\n
\r\n <%= pizza.small_size.price %>\r\n
грн.
\r\n
\r\n

\r\n Купити\r\n
\r\n <% } else { %>\r\n
\r\n
\r\n \r\n <%= pizza.big_size.size %>\r\n
\r\n
\r\n \r\n <%= pizza.big_size.weight %>\r\n
\r\n

\r\n
\r\n <%= pizza.big_size.price %>\r\n
грн.
\r\n
\r\n

\r\n Купити\r\n
\r\n <% } %>\r\n
\r\n
\r\n
\r\n
"); -exports.PizzaCart_OneItem = ejs.compile("<%\r\nfunction someFunction(pizza) {\r\n\r\n}\r\n\r\n%>\r\n\r\n\r\n
\r\n \"Піца\"\">\r\n\r\n

\r\n <% if(size == \"small_size\"){ %>\r\n <%= pizza.title %> (Мала)\r\n <% }else { %>\r\n <%= pizza.title %> (Велика)\r\n <% } %>\r\n

\r\n
\r\n \r\n <%= pizza[size].size %>\r\n \r\n <%= pizza[size].weight %>\r\n
\r\n
\r\n <%= pizza[size].price %> грн.\r\n \r\n \r\n \r\n \r\n <%= quantity %>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
"); +exports.PizzaCart_OneItem = ejs.compile("<%\r\nfunction someFunction(pizza) {\r\n\r\n}\r\n\r\n%>\r\n\r\n\r\n
\r\n \"Піца\"\">\r\n\r\n

\r\n <% if(pizza.size == \"small_size\"){ %>\r\n <%= pizza.title %> (Мала)\r\n <% }else { %>\r\n <%= pizza.title %> (Велика)\r\n <% } %>\r\n

\r\n
\r\n \r\n <%= pizza[size].size %>\r\n \r\n <%= pizza[size].weight %>\r\n
\r\n
\r\n <%= pizza[size].price*quantity%> грн.\r\n \r\n \r\n \r\n \r\n <%= quantity %>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
"); },{"ejs":9}],3:[function(require,module,exports){ /** @@ -202,9 +202,18 @@ $(function(){ PizzaCart.initialiseCart(); PizzaMenu.initialiseMenu(); + $(".nav-pills li").on("click", function () { + $(".nav-pills li").removeClass("active"); + $(this).addClass("active"); + var filt = $(this).find('a').data("filter"); + PizzaMenu.filterPizza(filt); + }) + $(".clear-cart").click(function () { PizzaCart.clearCart(); }); + + }); },{"./Pizza_List":1,"./pizza/PizzaCart":4,"./pizza/PizzaMenu":5}],4:[function(require,module,exports){ /** @@ -229,7 +238,7 @@ function addToCart(pizza, size) { //Додавання однієї піци в кошик покупок function checkIfPresent() { for (var i = 0; i < Cart.length; i++) { - if (Cart[i].pizza == pizza && size == Cart[i].size) return i; + if (Cart[i].pizza.id == pizza.id && size == Cart[i].size) return i; } return -1; } @@ -272,9 +281,6 @@ function initialiseCart() { if (saved_cart) { Cart = saved_cart; } - // else { - // $cart.append($("#no-order")); - // } updateCart(); } @@ -294,23 +300,26 @@ function updateCart() { var total = 0; var one_pizza_sum = 0; + var number_of_pizzas = 0; //Онволення однієї піци function showOnePizzaInCart(cart_item) { var html_code = Templates.PizzaCart_OneItem(cart_item); - total += cart_item.pizza[cart_item.size].price; - $(".order-count").text(total); // !!!!!!!!!!!!!!!!!!! + //total += cart_item.pizza[cart_item.size].price;// !!!!!!!!!!!!!!!!!!! + + number_of_pizzas +=1; + $(".order-count").text(number_of_pizzas); var $node = $(html_code); $node.find(".plus").click(function () { //Збільшуємо кількість замовлених піц cart_item.quantity += 1; - total += cart_item.pizza[cart_item.size].price; - $(".order-count").text(total); + // total += cart_item.pizza[cart_item.size].price; + // $(".order-count").text(total); - one_pizza_sum += cart_item.pizza[cart_item.size].price; + one_pizza_sum = cart_item.pizza[cart_item.size].quantity * cart_item.pizza[cart_item.size].price; $(".price").text(one_pizza_sum); //Оновлюємо відображення @@ -319,13 +328,13 @@ function updateCart() { $node.find(".minus").click(function () { //Збільшуємо кількість замовлених піц - if (cart_item.quantity == 1) { + if (cart_item.quantity === 1) { removeFromCart(cart_item); updateCart(); } else { cart_item.quantity -= 1; - total -= cart_item.pizza[cart_item.size].price; - $(".order-count").text(total); + //total -= cart_item.pizza[cart_item.size].price; + //$(".order-count").text(total); one_pizza_sum -= cart_item.pizza[cart_item.size].price; $(".price").text(one_pizza_sum); @@ -335,8 +344,8 @@ function updateCart() { $node.find(".count-clear").click(function () { removeFromCart(cart_item); - total -= cart_item.pizza[cart_item.size].price; - $(".order-count").text(total); + //total -= cart_item.pizza[cart_item.size].price; + //$(".order-count").text(total); updateCart(); }); @@ -375,10 +384,10 @@ function showPizzaList(list) { var $node = $(html_code); - $node.find(".bb").click(function(){ + $node.find(".bb").click(function () { PizzaCart.addToCart(pizza, PizzaCart.PizzaSize.Big); }); - $node.find(".bs").click(function(){ + $node.find(".bs").click(function () { PizzaCart.addToCart(pizza, PizzaCart.PizzaSize.Small); }); @@ -388,27 +397,65 @@ function showPizzaList(list) { list.forEach(showOnePizza); } +var PizzaFilter = { + All: 0, + Meat: 1, + Pineaple: 2, + Mushroom: 3, + Sea: 4, + Veg: 5 +} + + function filterPizza(filter) { //Масив куди потраплять піци які треба показати var pizza_shown = []; - Pizza_List.forEach(function(pizza){ - //Якщо піка відповідає фільтру - //pizza_shown.push(pizza); - - if (pizza.type == filter){ - pizza_shown.push(pizza); + if (filter === PizzaFilter.All) { + showPizzaList(Pizza_List); + $(".all-pizza-title").text("Усі піци"); + $(".pizza-count").text("8"); + } else { + if (filter === PizzaFilter.Meat) { + Pizza_List.forEach(function (pizza) { + if (pizza.type === 'М’ясна піца') { + pizza_shown.push(pizza); + } + }); + $(".all-pizza-title").text("М'ясні піци"); + } else if (filter === PizzaFilter.Pineaple) { + Pizza_List.forEach(function (pizza) { + if (pizza.content.pineapple) { + pizza_shown.push(pizza); + } + }); + $(".all-pizza-title").text("Піци з ананасами"); + }else if (filter === PizzaFilter.Mushroom) { + Pizza_List.forEach(function (pizza) { + if (pizza.content.mushroom) { + pizza_shown.push(pizza); + } + }); + $(".all-pizza-title").text("Піци з грибами"); + }else if (filter === PizzaFilter.Sea) { + Pizza_List.forEach(function (pizza) { + if (pizza.content.ocean) { + pizza_shown.push(pizza); + } + }); + $(".all-pizza-title").text("Піци з морепродуктами"); + }else if (filter === PizzaFilter.Veg) { + Pizza_List.forEach(function (pizza) { + if (pizza.type === 'Вега піца') { + pizza_shown.push(pizza); + } + }); + $(".all-pizza-title").text("Вегетарінські піци"); } - - //TODO: зробити фільтри - var $alltypes = $(".pizza-all-types"); - $alltypes.find(".button-all").click(function () { - - }) - }); - - //Показати відфільтровані піци - showPizzaList(pizza_shown); + $(".pizza-count").text(pizza_shown.length); + //Показати відфільтровані піци + showPizzaList(pizza_shown); + } } diff --git a/Frontend/www/assets/less/panels/right-panel.less b/Frontend/www/assets/less/panels/right-panel.less index 240e29dda..6215135d9 100644 --- a/Frontend/www/assets/less/panels/right-panel.less +++ b/Frontend/www/assets/less/panels/right-panel.less @@ -58,7 +58,7 @@ font-size: 14px; font-weight: 700; - .price { + .price-menu { margin-right: 10px; } .btn-circle { diff --git a/Frontend/www/index.html b/Frontend/www/index.html index 52db3f742..ecc0de7d1 100644 --- a/Frontend/www/index.html +++ b/Frontend/www/index.html @@ -41,31 +41,31 @@

- +
@@ -126,10 +126,10 @@

Сума замовлення - 115 грн. + 0 грн.
-
From 7150b9fa10d2b098c836a024ccbed19542fa7316 Mon Sep 17 00:00:00 2001 From: Kozopas Viktoria Date: Sat, 11 Nov 2017 10:39:58 +0200 Subject: [PATCH 09/24] Dis(en)able order button If the cart is empty - hide sum and diasable order button --- Frontend/src/pizza/PizzaCart.js | 30 ++++++++++++++++++------------ Frontend/www/assets/js/main.js | 30 ++++++++++++++++++------------ Frontend/www/index.html | 7 +------ 3 files changed, 37 insertions(+), 30 deletions(-) diff --git a/Frontend/src/pizza/PizzaCart.js b/Frontend/src/pizza/PizzaCart.js index 1c1b3f794..4a65fd523 100644 --- a/Frontend/src/pizza/PizzaCart.js +++ b/Frontend/src/pizza/PizzaCart.js @@ -74,27 +74,22 @@ function getPizzaInCart() { function updateCart() { //Функція викликається при зміні вмісту кошика //Тут можна наприклад показати оновлений кошик на екрані та зберегти вміт кошика в Local Storage - var total = 0; + var number_of_pizzas = Cart.length; Cart.forEach(function (pizzacart) { total += pizzacart.pizza[pizzacart.size].price * pizzacart.quantity; }); $(".sum-number").text(total + " грн."); + $(".order-count").text(number_of_pizzas); Storage.write("cart", Cart); - //Очищаємо старі піци в кошику - $cart.html(""); + $cart.html(""); //Очищаємо старі піци в кошику var one_pizza_sum = 0; - var number_of_pizzas = 0; //Онволення однієї піци function showOnePizzaInCart(cart_item) { var html_code = Templates.PizzaCart_OneItem(cart_item); - - number_of_pizzas += 1; - $(".order-count").text(number_of_pizzas); - var $node = $(html_code); $node.find(".plus").click(function () { @@ -104,7 +99,6 @@ function updateCart() { one_pizza_sum = cart_item.pizza[cart_item.size].quantity * cart_item.pizza[cart_item.size].price; $(".price").text(one_pizza_sum); - //Оновлюємо відображення updateCart(); }); @@ -129,11 +123,23 @@ function updateCart() { $cart.append($node); } + Cart.forEach(showOnePizzaInCart); - // if (number_of_pizzas === 0){ - // $cart = $ - // } + if (number_of_pizzas === 0) { + $cart.html("
\n" + + " Пусто в холодильнику?\n" + + "
\n" + + " Замовте піцу!\n" + + "
"); + $(".sum-title").hide(); + $(".sum-number").hide(); + $(".button-order").prop("disabled", true); + } else { + $(".sum-title").show(); + $(".sum-number").show(); + $(".button-order").prop("disabled", false); + } } exports.removeFromCart = removeFromCart; diff --git a/Frontend/www/assets/js/main.js b/Frontend/www/assets/js/main.js index 5401fa9ee..a7bb56562 100644 --- a/Frontend/www/assets/js/main.js +++ b/Frontend/www/assets/js/main.js @@ -292,27 +292,22 @@ function getPizzaInCart() { function updateCart() { //Функція викликається при зміні вмісту кошика //Тут можна наприклад показати оновлений кошик на екрані та зберегти вміт кошика в Local Storage - var total = 0; + var number_of_pizzas = Cart.length; Cart.forEach(function (pizzacart) { total += pizzacart.pizza[pizzacart.size].price * pizzacart.quantity; }); $(".sum-number").text(total + " грн."); + $(".order-count").text(number_of_pizzas); Storage.write("cart", Cart); - //Очищаємо старі піци в кошику - $cart.html(""); + $cart.html(""); //Очищаємо старі піци в кошику var one_pizza_sum = 0; - var number_of_pizzas = 0; //Онволення однієї піци function showOnePizzaInCart(cart_item) { var html_code = Templates.PizzaCart_OneItem(cart_item); - - number_of_pizzas += 1; - $(".order-count").text(number_of_pizzas); - var $node = $(html_code); $node.find(".plus").click(function () { @@ -322,7 +317,6 @@ function updateCart() { one_pizza_sum = cart_item.pizza[cart_item.size].quantity * cart_item.pizza[cart_item.size].price; $(".price").text(one_pizza_sum); - //Оновлюємо відображення updateCart(); }); @@ -347,11 +341,23 @@ function updateCart() { $cart.append($node); } + Cart.forEach(showOnePizzaInCart); - // if (number_of_pizzas === 0){ - // $cart = $ - // } + if (number_of_pizzas === 0) { + $cart.html("
\n" + + " Пусто в холодильнику?\n" + + "
\n" + + " Замовте піцу!\n" + + "
"); + $(".sum-title").hide(); + $(".sum-number").hide(); + $(".button-order").prop("disabled", true); + } else { + $(".sum-title").show(); + $(".sum-number").show(); + $(".button-order").prop("disabled", false); + } } exports.removeFromCart = removeFromCart; diff --git a/Frontend/www/index.html b/Frontend/www/index.html index c98d1ba9e..18dd21ea8 100644 --- a/Frontend/www/index.html +++ b/Frontend/www/index.html @@ -85,7 +85,7 @@

-
(044) 222 5 222
@@ -105,11 +105,6 @@

- - - - -
From ac1f94cc8143f751bcbad3a8d926bc6e6528a15d Mon Sep 17 00:00:00 2001 From: Kozopas Viktoria Date: Sat, 11 Nov 2017 18:10:21 +0200 Subject: [PATCH 10/24] Download pizzas from server divided header, footer --- Backend/api.js | 17 ++ Backend/data/Pizza_List.js | 177 ++++++++++++ Backend/main.js | 53 ++++ Backend/pages.js | 14 + Backend/views/common/footer.ejs | 20 ++ Backend/views/common/header.ejs | 36 +++ Backend/views/common/rightPanel.ejs | 29 ++ Backend/views/common/topPanel.ejs | 20 ++ Backend/views/mainPage.ejs | 49 ++++ Backend/views/orderPage.ejs | 9 + Frontend/src/API.js | 40 +++ Frontend/www/index.html | 16 +- package-lock.json | 431 ++++++++++++++++++++++++++++ package.json | 5 +- server.js | 2 + 15 files changed, 909 insertions(+), 9 deletions(-) create mode 100644 Backend/api.js create mode 100644 Backend/data/Pizza_List.js create mode 100644 Backend/main.js create mode 100644 Backend/pages.js create mode 100644 Backend/views/common/footer.ejs create mode 100644 Backend/views/common/header.ejs create mode 100644 Backend/views/common/rightPanel.ejs create mode 100644 Backend/views/common/topPanel.ejs create mode 100644 Backend/views/mainPage.ejs create mode 100644 Backend/views/orderPage.ejs create mode 100644 Frontend/src/API.js create mode 100644 server.js diff --git a/Backend/api.js b/Backend/api.js new file mode 100644 index 000000000..7b8718418 --- /dev/null +++ b/Backend/api.js @@ -0,0 +1,17 @@ +/** + * Created by chaika on 09.02.16. + */ +var Pizza_List = require('./data/Pizza_List'); + +exports.getPizzaList = function(req, res) { + res.send(Pizza_List); +}; + +exports.createOrder = function(req, res) { + var order_info = req.body; + console.log("Creating Order", order_info); + + res.send({ + success: true + }); +}; \ No newline at end of file diff --git a/Backend/data/Pizza_List.js b/Backend/data/Pizza_List.js new file mode 100644 index 000000000..134fb6c81 --- /dev/null +++ b/Backend/data/Pizza_List.js @@ -0,0 +1,177 @@ +/** + * Created by diana on 12.01.16. + */ + +var pizza_info = [ + { + id:1, + icon:'assets/images/pizza_7.jpg', + title: "Імпреза", + type: 'М’ясна піца', + content: { + meat: ['балик', 'салямі'], + chicken: ['куриця'], + cheese: ['сир моцарелла', 'сир рокфорд'], + pineapple: ['ананаси'], + additional: ['томатна паста', 'петрушка'] + }, + small_size:{ + weight: 370, + size: 30, + price: 99 + }, + big_size:{ + weight: 660, + size: 40, + price: 169 + }, + is_new:true, + is_popular:true + + }, + { + id:2, + icon:'assets/images/pizza_2.jpg', + title: "BBQ", + type: 'М’ясна піца', + content: { + meat: ['мисливські ковбаски', 'ковбаски папероні', 'шинка'], + cheese: ['сир домашній'], + mushroom: ['шампінйони'], + additional: ['петрушка', 'оливки'] + }, + small_size:{ + weight: 460, + size: 30, + price: 139 + }, + big_size:{ + weight: 840, + size: 40, + price: 199 + }, + is_popular:true + }, + { + id:3, + icon:'assets/images/pizza_1.jpg', + title: "Міксовий поло", + type: 'М’ясна піца', + content: { + meat: ['вітчина', 'куриця копчена'], + cheese: ['сир моцарелла'], + pineapple: ['ананаси'], + additional: ['кукурудза', 'петрушка', 'соус томатний'] + }, + small_size:{ + weight: 430, + size: 30, + price: 115 + }, + big_size:{ + weight: 780, + size: 40, + price: 179 + } + }, + { + id:4, + icon:'assets/images/pizza_5.jpg', + title: "Сициліано", + type: 'М’ясна піца', + content: { + meat: ['вітчина', 'салямі'], + cheese: ['сир моцарелла'], + mushroom: ['шампінйони'], + additional: ['перець болгарський', 'соус томатний'] + }, + small_size:{ + weight: 450, + size: 30, + price: 111 + }, + big_size:{ + weight: 790, + size: 40, + price: 169 + } + }, + { + id:17, + icon:'assets/images/pizza_3.jpg', + title: "Маргарита", + type: 'Вега піца', + content: { + cheese: ['сир моцарелла', 'сир домашній'], + tomato: ['помідори'], + additional: ['базилік', 'оливкова олія', 'соус томатний'] + }, + small_size:{ + weight: 370, + size: 30, + price: 89 + } + }, + { + id:43, + icon:'assets/images/pizza_6.jpg', + title: "Мікс смаків", + type: 'М’ясна піца', + content: { + meat: ['ковбаски'], + cheese: ['сир моцарелла'], + mushroom: ['шампінйони'], + pineapple: ['ананаси'], + additional: ['цибуля кримська', 'огірки квашені', 'соус гірчичний'] + }, + small_size:{ + weight: 470, + size: 30, + price: 115 + }, + big_size:{ + weight: 780, + size: 40, + price: 180 + } + }, + { + id:90, + icon:'assets/images/pizza_8.jpg', + title: "Дольче Маре", + type: 'Морська піца', + content: { + ocean: ['криветки тигрові', 'мідії', 'ікра червона', 'філе червоної риби'], + cheese: ['сир моцарелла'], + additional: ['оливкова олія', 'вершки'] + }, + big_size:{ + weight: 845, + size: 40, + price: 399 + } + }, + { + id:6, + icon:'assets/images/pizza_4.jpg', + title: "Россо Густо", + type: 'Морська піца', + content: { + ocean: ['ікра червона', 'лосось копчений'], + cheese: ['сир моцарелла'], + additional: ['оливкова олія', 'вершки'] + }, + small_size:{ + weight: 400, + size: 30, + price: 189 + }, + big_size:{ + weight: 700, + size: 40, + price: 299 + } + } +]; + +module.exports = pizza_info; \ No newline at end of file diff --git a/Backend/main.js b/Backend/main.js new file mode 100644 index 000000000..a86dbf479 --- /dev/null +++ b/Backend/main.js @@ -0,0 +1,53 @@ +/** + * Created by chaika on 09.02.16. + */ +var express = require('express'); +var path = require('path'); +var morgan = require('morgan'); +var bodyParser = require('body-parser'); + +function configureEndpoints(app) { + var pages = require('./pages'); + var api = require('./api'); + + //Налаштування URL за якими буде відповідати сервер + //Отримання списку піц + app.get('/api/get-pizza-list/', api.getPizzaList); + app.post('/api/create-order/', api.createOrder); + + //Сторінки + //Головна сторінка + app.get('/', pages.mainPage); + + //Сторінка замовлення + app.get('/order.html', pages.orderPage); + + //Якщо не підійшов жоден url, тоді повертаємо файли з папки www + app.use(express.static(path.join(__dirname, '../Frontend/www'))); +} + +function startServer(port) { + //Створюється застосунок + var app = express(); + + //Налаштування директорії з шаблонами + app.set('views', path.join(__dirname, 'views')); + app.set('view engine', 'ejs'); + + //Налаштування виводу в консоль списку запитів до сервера + app.use(morgan('dev')); + + //Розбір POST запитів + app.use(bodyParser.urlencoded({ extended: false })); + app.use(bodyParser.json()); + + //Налаштовуємо сторінки + configureEndpoints(app); + + //Запуск додатка за вказаним портом + app.listen(port, function () { + console.log('My Application Running on http://localhost:'+port+'/'); + }); +} + +exports.startServer = startServer; \ No newline at end of file diff --git a/Backend/pages.js b/Backend/pages.js new file mode 100644 index 000000000..e9568556c --- /dev/null +++ b/Backend/pages.js @@ -0,0 +1,14 @@ +/** + * Created by chaika on 09.02.16. + */ +exports.mainPage = function(req, res) { + res.render('mainPage', { + pageTitle: 'Вибір Піци' + }); +}; + +exports.orderPage = function(req, res) { + res.render('orderPage', { + pageTitle: 'Підтвердження замовлення' + }); +}; \ No newline at end of file diff --git a/Backend/views/common/footer.ejs b/Backend/views/common/footer.ejs new file mode 100644 index 000000000..9eae1854a --- /dev/null +++ b/Backend/views/common/footer.ejs @@ -0,0 +1,20 @@ +
+

+ Pizza.22 - практичний проект в межах курсу JavaScript в Києво-Могилянській Академії +

+

+ Доставка піци не здійснюється +

+
+
+ + + + + + + + + + + diff --git a/Backend/views/common/header.ejs b/Backend/views/common/header.ejs new file mode 100644 index 000000000..4f37c63b5 --- /dev/null +++ b/Backend/views/common/header.ejs @@ -0,0 +1,36 @@ + + + + + <%= pageTitle %> - Pizza KMA + + + + + + + + + + + + +
+
+
+
+ ЦЬОГО ТИЖНЯ +
+ НА ВСЕ +
+
-20%
+
+
+
+
+ PIZZA +
+ KMA +
+
+ diff --git a/Backend/views/common/rightPanel.ejs b/Backend/views/common/rightPanel.ejs new file mode 100644 index 000000000..c41c4848b --- /dev/null +++ b/Backend/views/common/rightPanel.ejs @@ -0,0 +1,29 @@ +
+
+
+
+
+
+ + Замовлення + 0 + + +
+
+
+
+ + Сума замовлення + + + 0 грн. + +
+ +
+
+
+
\ No newline at end of file diff --git a/Backend/views/common/topPanel.ejs b/Backend/views/common/topPanel.ejs new file mode 100644 index 000000000..b1b11f107 --- /dev/null +++ b/Backend/views/common/topPanel.ejs @@ -0,0 +1,20 @@ +
+
+
+
+ (044) 222 5 222 +
+
+ 24 години/ 7 днів на тиждень +
+
+ Безкоштовна доставка піци +
+ +
+
+ +
+
+
\ No newline at end of file diff --git a/Backend/views/mainPage.ejs b/Backend/views/mainPage.ejs new file mode 100644 index 000000000..2fc00ec91 --- /dev/null +++ b/Backend/views/mainPage.ejs @@ -0,0 +1,49 @@ +<% include common/header.ejs %> + + + +<% include common/topPanel.ejs %> +<% include common/rightPanel.ejs %> +<% include common/footer.ejs %> \ No newline at end of file diff --git a/Backend/views/orderPage.ejs b/Backend/views/orderPage.ejs new file mode 100644 index 000000000..2922395b1 --- /dev/null +++ b/Backend/views/orderPage.ejs @@ -0,0 +1,9 @@ +<% include common/header.ejs %> + +
+ +
+ +<% include common/topPanel.ejs %> +<% include common/rightPanel.ejs %> +<% include common/footer.ejs %> \ No newline at end of file diff --git a/Frontend/src/API.js b/Frontend/src/API.js new file mode 100644 index 000000000..2f246c8ec --- /dev/null +++ b/Frontend/src/API.js @@ -0,0 +1,40 @@ +/** + * Created by chaika on 09.02.16. + */ +var API_URL = "http://localhost:5050"; + +function backendGet(url, callback) { + $.ajax({ + url: API_URL + url, + type: 'GET', + success: function(data){ + callback(null, data); + }, + error: function() { + callback(new Error("Ajax Failed")); + } + }) +} + +function backendPost(url, data, callback) { + $.ajax({ + url: API_URL + url, + type: 'POST', + contentType : 'application/json', + data: JSON.stringify(data), + success: function(data){ + callback(null, data); + }, + error: function() { + callback(new Error("Ajax Failed")); + } + }) +} + +exports.getPizzaList = function(callback) { + backendGet("/api/get-pizza-list/", callback); +}; + +exports.createOrder = function(order_info, callback) { + backendPost("/api/create-order/", order_info, callback); +}; diff --git a/Frontend/www/index.html b/Frontend/www/index.html index 18dd21ea8..8e247b9da 100644 --- a/Frontend/www/index.html +++ b/Frontend/www/index.html @@ -74,14 +74,6 @@

-
-

- Pizza.22 - практичний проект в межах курсу JavaScript в Києво-Могилянській Академії -

-

- Доставка піци не здійснюється -

-
@@ -131,6 +123,14 @@

+
+

+ Pizza.22 - практичний проект в межах курсу JavaScript в Києво-Могилянській Академії +

+

+ Доставка піци не здійснюється +

+
diff --git a/package-lock.json b/package-lock.json index 42c824134..1990a2a39 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,15 @@ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + } + }, "acorn": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", @@ -71,6 +80,11 @@ "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, "array-map": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", @@ -139,6 +153,14 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=" }, + "basic-auth": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz", + "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=", + "requires": { + "safe-buffer": "5.1.1" + } + }, "basil.js": { "version": "0.4.5", "resolved": "https://registry.npmjs.org/basil.js/-/basil.js-0.4.5.tgz", @@ -154,6 +176,43 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.1", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.15" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + } + } + }, "brace-expansion": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", @@ -474,6 +533,11 @@ "resolved": "https://registry.npmjs.org/builtins/-/builtins-0.0.7.tgz", "integrity": "sha1-NVIZzWzxjb58Acx/0tznZc/cVJo=" }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, "cached-path-relative": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz", @@ -567,11 +631,31 @@ "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-0.0.1.tgz", "integrity": "sha1-kld9tSe6bEzwpFaNhLwDH0QeIfI=" }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, "convert-source-map": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=" }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -647,6 +731,11 @@ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" }, + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, "deps-sort": { "version": "1.3.9", "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-1.3.9.tgz", @@ -699,6 +788,11 @@ "minimalistic-assert": "1.0.0" } }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, "detective": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/detective/-/detective-4.5.0.tgz", @@ -761,6 +855,11 @@ } } }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, "ejs": { "version": "2.5.7", "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", @@ -780,6 +879,16 @@ "minimalistic-crypto-utils": "1.0.1" } }, + "encodeurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, "escodegen": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.3.3.tgz", @@ -806,6 +915,11 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", "integrity": "sha1-gVHTWOIMisx/t0XnRywAJf5JZXA=" }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, "eventemitter2": { "version": "0.4.14", "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", @@ -846,6 +960,68 @@ "fill-range": "2.2.3" } }, + "express": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", + "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", + "requires": { + "accepts": "1.3.4", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "1.1.1", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.1.0", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "2.0.2", + "qs": "6.5.1", + "range-parser": "1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.1", + "serve-static": "1.13.1", + "setprototypeof": "1.1.0", + "statuses": "1.3.1", + "type-is": "1.6.15", + "utils-merge": "1.0.1", + "vary": "1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, "extglob": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", @@ -894,6 +1070,35 @@ "repeat-string": "1.6.1" } }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, "findup-sync": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", @@ -946,6 +1151,16 @@ "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1225,6 +1440,17 @@ "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=" }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.4.0" + } + }, "https-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", @@ -1334,6 +1560,11 @@ } } }, + "ipaddr.js": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", + "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=" + }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", @@ -1511,6 +1742,21 @@ } } }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, "micromatch": { "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", @@ -1540,6 +1786,24 @@ "brorand": "1.1.0" } }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "requires": { + "mime-db": "1.30.0" + } + }, "minimalistic-assert": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", @@ -1627,6 +1891,38 @@ } } }, + "morgan": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.0.tgz", + "integrity": "sha1-0B+mxlhZt2/PMbPLU6OCGjEdgFE=", + "requires": { + "basic-auth": "2.0.0", + "debug": "2.6.9", + "depd": "1.1.1", + "on-finished": "2.3.0", + "on-headers": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, "nopt": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", @@ -1680,6 +1976,19 @@ "is-extendable": "0.1.1" } }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -1750,6 +2059,11 @@ "is-glob": "2.0.1" } }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, "path-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", @@ -1770,6 +2084,11 @@ "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=" }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, "pbkdf2": { "version": "3.0.14", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", @@ -1797,6 +2116,15 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" }, + "proxy-addr": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", + "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.5.2" + } + }, "public-encrypt": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", @@ -1884,6 +2212,29 @@ "safe-buffer": "5.1.1" } }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + } + } + }, "read-only-stream": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-1.1.1.tgz", @@ -2037,11 +2388,62 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, + "send": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", + "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", + "requires": { + "debug": "2.6.9", + "depd": "1.1.1", + "destroy": "1.0.4", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "serve-static": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", + "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", + "requires": { + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.16.1" + } + }, "set-immediate-shim": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + }, "sha.js": { "version": "2.4.9", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", @@ -2191,6 +2593,11 @@ } } }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + }, "stream-browserify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", @@ -2378,6 +2785,15 @@ "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.17" + } + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -2398,6 +2814,11 @@ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz", "integrity": "sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk=" }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, "url": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", @@ -2434,6 +2855,16 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, "vm-browserify": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", diff --git a/package.json b/package.json index a4e3a9d89..697531a0b 100644 --- a/package.json +++ b/package.json @@ -10,10 +10,13 @@ "license": "ISC", "dependencies": { "basil.js": "^0.4.3", + "body-parser": "^1.14.2", "brfs": "^1.4.3", "ejs": "^2.4.1", + "express": "^4.13.4", "grunt": "^0.4.5", "grunt-browserify": "^4.0.1", - "grunt-contrib-watch": "^0.6.1" + "grunt-contrib-watch": "^0.6.1", + "morgan": "^1.6.1" } } diff --git a/server.js b/server.js new file mode 100644 index 000000000..f30329cde --- /dev/null +++ b/server.js @@ -0,0 +1,2 @@ +var main = require('./Backend/main'); +main.startServer(5050); \ No newline at end of file From dba9ad0b0e8f7db558e118afd5526d97f21d4825 Mon Sep 17 00:00:00 2001 From: Kozopas Viktoria Date: Sat, 11 Nov 2017 19:50:01 +0200 Subject: [PATCH 11/24] made order.ejs --- Backend/views/orderPage.ejs | 58 ++++++++++++++++++++++++++++++ Frontend/www/assets/less/main.less | 45 +++++++++++++++++++++-- 2 files changed, 100 insertions(+), 3 deletions(-) diff --git a/Backend/views/orderPage.ejs b/Backend/views/orderPage.ejs index 2922395b1..4418f30ff 100644 --- a/Backend/views/orderPage.ejs +++ b/Backend/views/orderPage.ejs @@ -1,7 +1,65 @@ <% include common/header.ejs %>
+
+
+
+ 1. Контактні дані +
+
+
+
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+
+
+
+

Інформація про замовлення

+

+ Приблизний час доставки: + невідомий +

+

+ Адреса доставки: + невідома +

+
+
+
+
+
+
+ +
+
+
+
+
<% include common/topPanel.ejs %> diff --git a/Frontend/www/assets/less/main.less b/Frontend/www/assets/less/main.less index c507f15a3..faaaffd99 100644 --- a/Frontend/www/assets/less/main.less +++ b/Frontend/www/assets/less/main.less @@ -33,7 +33,7 @@ display: inline-block; } -.page-title .all-pizza-type-wrap .pizza-all-types .active a{ +.page-title .all-pizza-type-wrap .pizza-all-types .active a { color: white; background-color: #ec890e; } @@ -72,7 +72,7 @@ a { .badge-title { font-size: 23px; //font-weight: 700; - font-family: Helvetica,Calibri; + font-family: Helvetica, Calibri; padding-top: 10px; padding-bottom: 3px; } @@ -107,7 +107,7 @@ a { .discount-title { font-size: 15px; font-weight: 700; - font-family: Helvetica,Calibri; + font-family: Helvetica, Calibri; border-bottom: 2px dotted #d16301; margin-bottom: 7px; padding-bottom: 3px; @@ -119,6 +119,45 @@ a { } } +.main-order-container { + padding: 100px 50px 20px 20px; + .form-description { + font-size: 20px; + padding-bottom: 10px; + } + + .next-step-wrap { + float: right; + margin-right: 10px; + margin-top: 15px; + + .next-step-width{ + width: 100px; + } + } + + .form-group{ + margin-left: -15px; + margin-right: -15px; + + .name-help-block{ + margin-left: 100px; + color: #880a02; + } + } + + .bs-callout{ + padding: 20px; + border: 1px solid #eee; + border-left-width: 5px; + border-radius: 5px; + background-color: #fff; + } + + .bs-call-out-warning{ + border-left-color: #ec890e; + } +} .bottom-panel, .page-title, .pizza-all-types, .all-pizza-type-wrap, .pizza-small, .pizza-big, .discount-panel, .top-badge { text-align: center; From 1b351614615de21accc48e4f19f40aa37dfa8b13 Mon Sep 17 00:00:00 2001 From: Kozopas Viktoria Date: Sat, 11 Nov 2017 21:23:08 +0200 Subject: [PATCH 12/24] click on order - new page --- Backend/views/common/rightPanel.ejs | 2 +- Frontend/src/main.js | 1 - Frontend/www/assets/js/main.js | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Backend/views/common/rightPanel.ejs b/Backend/views/common/rightPanel.ejs index c41c4848b..7ce549902 100644 --- a/Backend/views/common/rightPanel.ejs +++ b/Backend/views/common/rightPanel.ejs @@ -20,7 +20,7 @@ 0 грн.
-
diff --git a/Frontend/src/main.js b/Frontend/src/main.js index 61ef93aaa..658f14f45 100644 --- a/Frontend/src/main.js +++ b/Frontend/src/main.js @@ -22,5 +22,4 @@ $(function(){ PizzaCart.clearCart(); }); - }); \ No newline at end of file diff --git a/Frontend/www/assets/js/main.js b/Frontend/www/assets/js/main.js index a7bb56562..e92e70b0b 100644 --- a/Frontend/www/assets/js/main.js +++ b/Frontend/www/assets/js/main.js @@ -213,7 +213,6 @@ $(function(){ PizzaCart.clearCart(); }); - }); },{"./Pizza_List":1,"./pizza/PizzaCart":4,"./pizza/PizzaMenu":5}],4:[function(require,module,exports){ /** From 9724ecd066a1c0ecfba7c730337a7fc4dbef5cc4 Mon Sep 17 00:00:00 2001 From: Kozopas Viktoria Date: Sun, 12 Nov 2017 00:28:46 +0200 Subject: [PATCH 13/24] new templates of carts for submission page --- .../views/common/rightPanelForSubmission.ejs | 28 +++++++++++++++++++ Backend/views/orderPage.ejs | 2 +- Frontend/src/Templates.js | 2 ++ Frontend/src/pizza/PizzaCart.js | 7 ++++- .../templates/PizzaCart_OneItemSubmission.ejs | 23 +++++++++++++++ Frontend/www/assets/js/main.js | 9 +++++- 6 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 Backend/views/common/rightPanelForSubmission.ejs create mode 100644 Frontend/templates/PizzaCart_OneItemSubmission.ejs diff --git a/Backend/views/common/rightPanelForSubmission.ejs b/Backend/views/common/rightPanelForSubmission.ejs new file mode 100644 index 000000000..33c94edcb --- /dev/null +++ b/Backend/views/common/rightPanelForSubmission.ejs @@ -0,0 +1,28 @@ +
+
+
+
+
+
+ + Замовлення + 0 + +
+
+
+
+ + Сума замовлення + + + 0 грн. + +
+ +
+
+
+
\ No newline at end of file diff --git a/Backend/views/orderPage.ejs b/Backend/views/orderPage.ejs index 4418f30ff..1f8ed14cb 100644 --- a/Backend/views/orderPage.ejs +++ b/Backend/views/orderPage.ejs @@ -63,5 +63,5 @@

<% include common/topPanel.ejs %> -<% include common/rightPanel.ejs %> +<% include common/rightPanelForSubmission.ejs %> <% include common/footer.ejs %> \ No newline at end of file diff --git a/Frontend/src/Templates.js b/Frontend/src/Templates.js index 8729954f9..8a4d6d23c 100644 --- a/Frontend/src/Templates.js +++ b/Frontend/src/Templates.js @@ -8,3 +8,5 @@ var ejs = require('ejs'); exports.PizzaMenu_OneItem = ejs.compile(fs.readFileSync('./Frontend/templates/PizzaMenu_OneItem.ejs', "utf8")); exports.PizzaCart_OneItem = ejs.compile(fs.readFileSync('./Frontend/templates/PizzaCart_OneItem.ejs', "utf8")); + +exports.PizzaCart_OneItemSubmission = ejs.compile(fs.readFileSync('./Frontend/templates/PizzaCart_OneItemSubmission.ejs', "utf8")); diff --git a/Frontend/src/pizza/PizzaCart.js b/Frontend/src/pizza/PizzaCart.js index 4a65fd523..7e5be8782 100644 --- a/Frontend/src/pizza/PizzaCart.js +++ b/Frontend/src/pizza/PizzaCart.js @@ -89,7 +89,12 @@ function updateCart() { //Онволення однієї піци function showOnePizzaInCart(cart_item) { - var html_code = Templates.PizzaCart_OneItem(cart_item); + var html_code; + if($(".clear-order").html() === undefined){ + html_code = Templates.PizzaCart_OneItemSubmission(cart_item); + }else { + html_code = Templates.PizzaCart_OneItem(cart_item); + } var $node = $(html_code); $node.find(".plus").click(function () { diff --git a/Frontend/templates/PizzaCart_OneItemSubmission.ejs b/Frontend/templates/PizzaCart_OneItemSubmission.ejs new file mode 100644 index 000000000..3678838ea --- /dev/null +++ b/Frontend/templates/PizzaCart_OneItemSubmission.ejs @@ -0,0 +1,23 @@ +
+ Піца + +

+ <% if(pizza[size].size === 30){ %> + <%= pizza.title %> (Мала) + <% }else { %> + <%= pizza.title %> (Велика) + <% } %> +

+
+ + <%= pizza[size].size %> + + <%= pizza[size].weight %> +
+
+ <%= pizza[size].price*quantity%> грн. + + піц: <%= quantity %> + +
+
\ No newline at end of file diff --git a/Frontend/www/assets/js/main.js b/Frontend/www/assets/js/main.js index e92e70b0b..2a5f0ff35 100644 --- a/Frontend/www/assets/js/main.js +++ b/Frontend/www/assets/js/main.js @@ -188,6 +188,8 @@ exports.PizzaMenu_OneItem = ejs.compile("<%\r\n\r\nfunction getIngredientsArray( exports.PizzaCart_OneItem = ejs.compile("<%\r\nfunction someFunction(pizza) {\r\n\r\n}\r\n\r\n%>\r\n\r\n\r\n
\r\n \"Піца\"\">\r\n\r\n

\r\n <% if(pizza[size].size === 30){ %>\r\n <%= pizza.title %> (Мала)\r\n <% }else { %>\r\n <%= pizza.title %> (Велика)\r\n <% } %>\r\n

\r\n
\r\n \r\n <%= pizza[size].size %>\r\n \r\n <%= pizza[size].weight %>\r\n
\r\n
\r\n <%= pizza[size].price*quantity%> грн.\r\n \r\n \r\n \r\n \r\n <%= quantity %>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
"); +exports.PizzaCart_OneItemSubmission = ejs.compile("
\r\n \"Піца\"\">\r\n\r\n

\r\n <% if(pizza[size].size === 30){ %>\r\n <%= pizza.title %> (Мала)\r\n <% }else { %>\r\n <%= pizza.title %> (Велика)\r\n <% } %>\r\n

\r\n
\r\n \r\n <%= pizza[size].size %>\r\n \r\n <%= pizza[size].weight %>\r\n
\r\n
\r\n <%= pizza[size].price*quantity%> грн.\r\n\r\n піц: <%= quantity %> \r\n\r\n
\r\n
"); + },{"ejs":9}],3:[function(require,module,exports){ /** * Created by chaika on 25.01.16. @@ -306,7 +308,12 @@ function updateCart() { //Онволення однієї піци function showOnePizzaInCart(cart_item) { - var html_code = Templates.PizzaCart_OneItem(cart_item); + var html_code; + if($(".clear-order").html() === undefined){ + html_code = Templates.PizzaCart_OneItemSubmission(cart_item); + }else { + html_code = Templates.PizzaCart_OneItem(cart_item); + } var $node = $(html_code); $node.find(".plus").click(function () { From f0ed37e78c8a18addb12165e296f1b78ba583af6 Mon Sep 17 00:00:00 2001 From: Kozopas Viktoria Date: Sun, 12 Nov 2017 12:42:10 +0200 Subject: [PATCH 14/24] check if empty input --- Backend/main.js | 4 ++-- Backend/views/orderPage.ejs | 6 +++--- Frontend/src/main.js | 27 ++++++++++++++++++++++++++- Frontend/www/assets/js/main.js | 27 ++++++++++++++++++++++++++- Frontend/www/assets/less/main.less | 4 ++-- 5 files changed, 59 insertions(+), 9 deletions(-) diff --git a/Backend/main.js b/Backend/main.js index a86dbf479..53e66a2c8 100644 --- a/Backend/main.js +++ b/Backend/main.js @@ -38,7 +38,7 @@ function startServer(port) { app.use(morgan('dev')); //Розбір POST запитів - app.use(bodyParser.urlencoded({ extended: false })); + app.use(bodyParser.urlencoded({extended: false})); app.use(bodyParser.json()); //Налаштовуємо сторінки @@ -46,7 +46,7 @@ function startServer(port) { //Запуск додатка за вказаним портом app.listen(port, function () { - console.log('My Application Running on http://localhost:'+port+'/'); + console.log('My Application Running on http://localhost:' + port + '/'); }); } diff --git a/Backend/views/orderPage.ejs b/Backend/views/orderPage.ejs index 1f8ed14cb..62934d66e 100644 --- a/Backend/views/orderPage.ejs +++ b/Backend/views/orderPage.ejs @@ -14,21 +14,21 @@
- +
- +
- +

diff --git a/Frontend/src/main.js b/Frontend/src/main.js index 658f14f45..974e6cb6b 100644 --- a/Frontend/src/main.js +++ b/Frontend/src/main.js @@ -2,7 +2,7 @@ * Created by chaika on 25.01.16. */ -$(function(){ +$(function () { //This code will execute when the page is ready var PizzaMenu = require('./pizza/PizzaMenu'); var PizzaCart = require('./pizza/PizzaCart'); @@ -22,4 +22,29 @@ $(function(){ PizzaCart.clearCart(); }); + $(".next-step-button").click(function () { + if ($("#inputName").val() === "") { + $(".name-help-block").show(); + }else $(".name-help-block").hide(); + if ($("#inputPhone").val() === "") { + $(".phone-help-block").show(); + }else $(".phone-help-block").hide(); + if ($("#inputAddress").val() === "") { + $(".address-help-block").show(); + }else $(".address-help-block").hide(); + }); + + $(".form-control").focus(function () { + if ($("#inputName").val() !== "") { + $(".name-help-block").hide(); + } + if ($("#inputPhone").val() !== "") { + $(".phone-help-block").hide(); + } + if ($("#inputAddress").val() !== "") { + $(".address-help-block").hide(); + } + }) + + }); \ No newline at end of file diff --git a/Frontend/www/assets/js/main.js b/Frontend/www/assets/js/main.js index 2a5f0ff35..6a3e4e193 100644 --- a/Frontend/www/assets/js/main.js +++ b/Frontend/www/assets/js/main.js @@ -195,7 +195,7 @@ exports.PizzaCart_OneItemSubmission = ejs.compile("
Date: Sun, 12 Nov 2017 23:31:55 +0200 Subject: [PATCH 15/24] check if valid --- Backend/views/orderPage.ejs | 4 +-- Frontend/src/main.js | 46 +++++++++++++++++++++++++++------- Frontend/www/assets/js/main.js | 46 +++++++++++++++++++++++++++------- 3 files changed, 76 insertions(+), 20 deletions(-) diff --git a/Backend/views/orderPage.ejs b/Backend/views/orderPage.ejs index 62934d66e..6fd04ba0e 100644 --- a/Backend/views/orderPage.ejs +++ b/Backend/views/orderPage.ejs @@ -14,7 +14,7 @@
- +
@@ -28,7 +28,7 @@
- +
diff --git a/Frontend/src/main.js b/Frontend/src/main.js index 974e6cb6b..22f8bda29 100644 --- a/Frontend/src/main.js +++ b/Frontend/src/main.js @@ -25,26 +25,54 @@ $(function () { $(".next-step-button").click(function () { if ($("#inputName").val() === "") { $(".name-help-block").show(); - }else $(".name-help-block").hide(); + } else $(".name-help-block").hide(); if ($("#inputPhone").val() === "") { $(".phone-help-block").show(); - }else $(".phone-help-block").hide(); + } else $(".phone-help-block").hide(); if ($("#inputAddress").val() === "") { $(".address-help-block").show(); - }else $(".address-help-block").hide(); + } else $(".address-help-block").hide(); }); - $(".form-control").focus(function () { - if ($("#inputName").val() !== "") { + $("#inputName").on("input", function () { + if (!valName()) { + $(".name-help-block").show(); + } else { $(".name-help-block").hide(); } - if ($("#inputPhone").val() !== "") { + }); + + $("#inputPhone").on("input", function () { + if (!valPhone()) { + $(".phone-help-block").show(); + } else { $(".phone-help-block").hide(); } - if ($("#inputAddress").val() !== "") { + }); + + $("#inputAddress").on("input", function () { + if (!valAddress()) { + $(".address-help-block").show(); + } else { $(".address-help-block").hide(); } - }) + }); +}) + + +function valName() { + var expr = $("#inputName").val(); + return expr.match(/^([a-zA-Zа-яА-Я]+|[a-zA-Zа-яА-Я]+[ ][a-zA-Zа-яА-Я]+|([a-zA-Zа-яА-Я]+[\-][a-zA-Zа-яА-Я]+))+$/); +} + +function valPhone() { + var expr = $("#inputPhone").val(); + return expr.match(/^(\+380\d{9}|0\d{9})$/); +} + +function valAddress() { + //later, when google map +} -}); \ No newline at end of file +; \ No newline at end of file diff --git a/Frontend/www/assets/js/main.js b/Frontend/www/assets/js/main.js index 6a3e4e193..f8da6ecce 100644 --- a/Frontend/www/assets/js/main.js +++ b/Frontend/www/assets/js/main.js @@ -218,29 +218,57 @@ $(function () { $(".next-step-button").click(function () { if ($("#inputName").val() === "") { $(".name-help-block").show(); - }else $(".name-help-block").hide(); + } else $(".name-help-block").hide(); if ($("#inputPhone").val() === "") { $(".phone-help-block").show(); - }else $(".phone-help-block").hide(); + } else $(".phone-help-block").hide(); if ($("#inputAddress").val() === "") { $(".address-help-block").show(); - }else $(".address-help-block").hide(); + } else $(".address-help-block").hide(); }); - $(".form-control").focus(function () { - if ($("#inputName").val() !== "") { + $("#inputName").on("input", function () { + if (!valName()) { + $(".name-help-block").show(); + } else { $(".name-help-block").hide(); } - if ($("#inputPhone").val() !== "") { + }); + + $("#inputPhone").on("input", function () { + if (!valPhone()) { + $(".phone-help-block").show(); + } else { $(".phone-help-block").hide(); } - if ($("#inputAddress").val() !== "") { + }); + + $("#inputAddress").on("input", function () { + if (!valAddress()) { + $(".address-help-block").show(); + } else { $(".address-help-block").hide(); } - }) + }); +}) + + +function valName() { + var expr = $("#inputName").val(); + return expr.match(/^([a-zA-Zа-яА-Я]+|[a-zA-Zа-яА-Я]+[ ][a-zA-Zа-яА-Я]+|([a-zA-Zа-яА-Я]+[\-][a-zA-Zа-яА-Я]+))+$/); +} +function valPhone() { + var expr = $("#inputPhone").val(); + return expr.match(/^(\+380\d{9}|0\d{9})$/); +} + +function valAddress() { + //later, when google map +} -}); + +; },{"./Pizza_List":1,"./pizza/PizzaCart":4,"./pizza/PizzaMenu":5}],4:[function(require,module,exports){ /** * Created by chaika on 02.02.16. From 64cc960b309f7bb92e389428541cc2d9b0d42617 Mon Sep 17 00:00:00 2001 From: Kozopas Viktoria Date: Mon, 13 Nov 2017 00:25:42 +0200 Subject: [PATCH 16/24] send to server --- Backend/api.js | 5 +- Frontend/src/main.js | 38 ++++++---- Frontend/src/pizza/PizzaCart.js | 16 ++++- Frontend/www/assets/js/main.js | 119 ++++++++++++++++++++++++-------- 4 files changed, 134 insertions(+), 44 deletions(-) diff --git a/Backend/api.js b/Backend/api.js index 7b8718418..8cbd34412 100644 --- a/Backend/api.js +++ b/Backend/api.js @@ -12,6 +12,9 @@ exports.createOrder = function(req, res) { console.log("Creating Order", order_info); res.send({ - success: true + success: true, + Name: order_info.Name, + Phone: order_info.Phone, + Address: order_info.Address }); }; \ No newline at end of file diff --git a/Frontend/src/main.js b/Frontend/src/main.js index 22f8bda29..3c2b0c8cd 100644 --- a/Frontend/src/main.js +++ b/Frontend/src/main.js @@ -57,22 +57,30 @@ $(function () { $(".address-help-block").hide(); } }); -}) + function valName() { + var expr = $("#inputName").val(); + return expr.match(/^([a-zA-Zа-яА-Я]+|[a-zA-Zа-яА-Я]+[ ][a-zA-Zа-яА-Я]+|([a-zA-Zа-яА-Я]+[\-][a-zA-Zа-яА-Я]+))+$/); + } -function valName() { - var expr = $("#inputName").val(); - return expr.match(/^([a-zA-Zа-яА-Я]+|[a-zA-Zа-яА-Я]+[ ][a-zA-Zа-яА-Я]+|([a-zA-Zа-яА-Я]+[\-][a-zA-Zа-яА-Я]+))+$/); -} + function valPhone() { + var expr = $("#inputPhone").val(); + return expr.match(/^(\+380\d{9}|0\d{9})$/); + } -function valPhone() { - var expr = $("#inputPhone").val(); - return expr.match(/^(\+380\d{9}|0\d{9})$/); -} + function valAddress() { + //later, when google map + return true; + } -function valAddress() { - //later, when google map -} - - -; \ No newline at end of file + $(".next-step-button").click(function () { + if (valName() && valPhone() && valAddress()) { + PizzaCart.createOrder(function (err, data) { + if (err){ + return console.log("Can't create order"); + } + alert("Order created"); + }); + } + }); +}); \ No newline at end of file diff --git a/Frontend/src/pizza/PizzaCart.js b/Frontend/src/pizza/PizzaCart.js index 7e5be8782..fc0445fed 100644 --- a/Frontend/src/pizza/PizzaCart.js +++ b/Frontend/src/pizza/PizzaCart.js @@ -3,6 +3,7 @@ */ var Templates = require('../Templates'); var Storage = require('./Storage'); +var API = require('../API'); //Перелік розмірів піци var PizzaSize = { @@ -147,6 +148,17 @@ function updateCart() { } } +function createOrder(callback) { + API.createOrder({ + Name: $("#inputName").val(), + Phone: $("#inputPhone").val(), + Address: $("#inputAddress").val() + }, function (err, result) { + if(err) return callback(err); + callback(null, result); + }) +} + exports.removeFromCart = removeFromCart; exports.addToCart = addToCart; @@ -154,4 +166,6 @@ exports.getPizzaInCart = getPizzaInCart; exports.initialiseCart = initialiseCart; exports.clearCart = clearCart(); -exports.PizzaSize = PizzaSize; \ No newline at end of file +exports.PizzaSize = PizzaSize; + +exports.createOrder = createOrder; \ No newline at end of file diff --git a/Frontend/www/assets/js/main.js b/Frontend/www/assets/js/main.js index f8da6ecce..96fd57230 100644 --- a/Frontend/www/assets/js/main.js +++ b/Frontend/www/assets/js/main.js @@ -1,4 +1,46 @@ (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o\r\n \"Піца\"\">\r\n\r\n

\r\n <% if(pizza[size].size === 30){ %>\r\n <%= pizza.title %> (Мала)\r\n <% }else { %>\r\n <%= pizza.title %> (Велика)\r\n <% } %>\r\n

\r\n
\r\n \r\n <%= pizza[size].size %>\r\n \r\n <%= pizza[size].weight %>\r\n
\r\n
\r\n <%= pizza[size].price*quantity%> грн.\r\n\r\n піц: <%= quantity %> \r\n\r\n
\r\n

"); -},{"ejs":9}],3:[function(require,module,exports){ +},{"ejs":10}],4:[function(require,module,exports){ /** * Created by chaika on 25.01.16. */ @@ -250,31 +292,41 @@ $(function () { $(".address-help-block").hide(); } }); -}) + function valName() { + var expr = $("#inputName").val(); + return expr.match(/^([a-zA-Zа-яА-Я]+|[a-zA-Zа-яА-Я]+[ ][a-zA-Zа-яА-Я]+|([a-zA-Zа-яА-Я]+[\-][a-zA-Zа-яА-Я]+))+$/); + } -function valName() { - var expr = $("#inputName").val(); - return expr.match(/^([a-zA-Zа-яА-Я]+|[a-zA-Zа-яА-Я]+[ ][a-zA-Zа-яА-Я]+|([a-zA-Zа-яА-Я]+[\-][a-zA-Zа-яА-Я]+))+$/); -} - -function valPhone() { - var expr = $("#inputPhone").val(); - return expr.match(/^(\+380\d{9}|0\d{9})$/); -} + function valPhone() { + var expr = $("#inputPhone").val(); + return expr.match(/^(\+380\d{9}|0\d{9})$/); + } -function valAddress() { - //later, when google map -} + function valAddress() { + //later, when google map + return true; + } + $(".next-step-button").click(function () { + if (valName() && valPhone() && valAddress()) { + PizzaCart.createOrder(function (err, data) { + if (err){ + return console.log("Can't create order"); + } + alert("Order created"); + }); + } + }); -; -},{"./Pizza_List":1,"./pizza/PizzaCart":4,"./pizza/PizzaMenu":5}],4:[function(require,module,exports){ +}); +},{"./Pizza_List":2,"./pizza/PizzaCart":5,"./pizza/PizzaMenu":6}],5:[function(require,module,exports){ /** * Created by chaika on 02.02.16. */ var Templates = require('../Templates'); var Storage = require('./Storage'); +var API = require('../API'); //Перелік розмірів піци var PizzaSize = { @@ -419,6 +471,17 @@ function updateCart() { } } +function createOrder(callback) { + API.createOrder({ + Name: $("#inputName").val(), + Phone: $("#inputPhone").val(), + Address: $("#inputAddress").val() + }, function (err, result) { + if(err) return callback(err); + callback(null, result); + }) +} + exports.removeFromCart = removeFromCart; exports.addToCart = addToCart; @@ -427,7 +490,9 @@ exports.initialiseCart = initialiseCart; exports.clearCart = clearCart(); exports.PizzaSize = PizzaSize; -},{"../Templates":2,"./Storage":6}],5:[function(require,module,exports){ + +exports.createOrder = createOrder; +},{"../API":1,"../Templates":3,"./Storage":7}],6:[function(require,module,exports){ /** * Created by chaika on 02.02.16. */ @@ -531,7 +596,7 @@ function initialiseMenu() { exports.filterPizza = filterPizza; exports.initialiseMenu = initialiseMenu; -},{"../Pizza_List":1,"../Templates":2,"./PizzaCart":4}],6:[function(require,module,exports){ +},{"../Pizza_List":2,"../Templates":3,"./PizzaCart":5}],7:[function(require,module,exports){ var basil = require('basil.js'); basil = new basil(); @@ -542,7 +607,7 @@ exports.write = function (key, value) { exports.read = function (key) { return basil.get(key); } -},{"basil.js":7}],7:[function(require,module,exports){ +},{"basil.js":8}],8:[function(require,module,exports){ (function () { // Basil var Basil = function (options) { @@ -930,9 +995,9 @@ exports.read = function (key) { })(); -},{}],8:[function(require,module,exports){ - },{}],9:[function(require,module,exports){ + +},{}],10:[function(require,module,exports){ /* * EJS Embedded JavaScript templates * Copyright 2112 Matthew Eernisse (mde@fleegix.org) @@ -1800,7 +1865,7 @@ if (typeof window != 'undefined') { window.ejs = exports; } -},{"../package.json":11,"./utils":10,"fs":8,"path":12}],10:[function(require,module,exports){ +},{"../package.json":12,"./utils":11,"fs":9,"path":13}],11:[function(require,module,exports){ /* * EJS Embedded JavaScript templates * Copyright 2112 Matthew Eernisse (mde@fleegix.org) @@ -1966,7 +2031,7 @@ exports.cache = { } }; -},{}],11:[function(require,module,exports){ +},{}],12:[function(require,module,exports){ module.exports={ "_from": "ejs@^2.4.1", "_id": "ejs@2.5.7", @@ -2047,7 +2112,7 @@ module.exports={ "version": "2.5.7" } -},{}],12:[function(require,module,exports){ +},{}],13:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // @@ -2275,7 +2340,7 @@ var substr = 'ab'.substr(-1) === 'b' ; }).call(this,require('_process')) -},{"_process":13}],13:[function(require,module,exports){ +},{"_process":14}],14:[function(require,module,exports){ // shim for using process in browser var process = module.exports = {}; @@ -2461,4 +2526,4 @@ process.chdir = function (dir) { }; process.umask = function() { return 0; }; -},{}]},{},[3]); +},{}]},{},[4]); From b5c96242baf99a89f8428902af080d82404860ae Mon Sep 17 00:00:00 2001 From: Kozopas Viktoria Date: Sat, 18 Nov 2017 11:11:06 +0200 Subject: [PATCH 17/24] google maps are here --- Backend/views/common/footer.ejs | 5 ++++ Backend/views/orderPage.ejs | 1 + Frontend/src/googleMaps.js | 13 ++++++++++ Frontend/src/main.js | 3 +++ Frontend/www/assets/js/main.js | 40 +++++++++++++++++++++--------- Frontend/www/assets/less/main.less | 10 +++++++- 6 files changed, 59 insertions(+), 13 deletions(-) create mode 100644 Frontend/src/googleMaps.js diff --git a/Backend/views/common/footer.ejs b/Backend/views/common/footer.ejs index 9eae1854a..6e72c089f 100644 --- a/Backend/views/common/footer.ejs +++ b/Backend/views/common/footer.ejs @@ -14,6 +14,11 @@ + + + diff --git a/Backend/views/orderPage.ejs b/Backend/views/orderPage.ejs index 6fd04ba0e..fa6ee72b4 100644 --- a/Backend/views/orderPage.ejs +++ b/Backend/views/orderPage.ejs @@ -59,6 +59,7 @@
+
diff --git a/Frontend/src/googleMaps.js b/Frontend/src/googleMaps.js new file mode 100644 index 000000000..cca1960f0 --- /dev/null +++ b/Frontend/src/googleMaps.js @@ -0,0 +1,13 @@ +function initialize() { +//Тут починаємо працювати з картою + var mapProp = { + center: new google.maps.LatLng(50.464379, 30.519131), + zoom: 11 + }; + var html_element = document.getElementById("googleMaps"); + var map = new google.maps.Map(html_element, mapProp); +//Карта створена і показана +} + +//Коли сторінка завантажилась +google.maps.event.addDomListener(window, 'load', initialize); \ No newline at end of file diff --git a/Frontend/src/main.js b/Frontend/src/main.js index 3c2b0c8cd..5e25b5d74 100644 --- a/Frontend/src/main.js +++ b/Frontend/src/main.js @@ -8,6 +8,7 @@ $(function () { var PizzaCart = require('./pizza/PizzaCart'); var Pizza_List = require('./Pizza_List'); + PizzaCart.initialiseCart(); PizzaMenu.initialiseMenu(); @@ -83,4 +84,6 @@ $(function () { }); } }); + + require("./googleMaps"); }); \ No newline at end of file diff --git a/Frontend/www/assets/js/main.js b/Frontend/www/assets/js/main.js index 96fd57230..50ed550ba 100644 --- a/Frontend/www/assets/js/main.js +++ b/Frontend/www/assets/js/main.js @@ -232,7 +232,21 @@ exports.PizzaCart_OneItem = ejs.compile("<%\r\nfunction someFunction(pizza) {\r\ exports.PizzaCart_OneItemSubmission = ejs.compile("
\r\n \"Піца\"\">\r\n\r\n

\r\n <% if(pizza[size].size === 30){ %>\r\n <%= pizza.title %> (Мала)\r\n <% }else { %>\r\n <%= pizza.title %> (Велика)\r\n <% } %>\r\n

\r\n
\r\n \r\n <%= pizza[size].size %>\r\n \r\n <%= pizza[size].weight %>\r\n
\r\n
\r\n <%= pizza[size].price*quantity%> грн.\r\n\r\n піц: <%= quantity %> \r\n\r\n
\r\n
"); -},{"ejs":10}],4:[function(require,module,exports){ +},{"ejs":11}],4:[function(require,module,exports){ +function initialize() { +//Тут починаємо працювати з картою + var mapProp = { + center: new google.maps.LatLng(50.464379, 30.519131), + zoom: 11 + }; + var html_element = document.getElementById("googleMaps"); + var map = new google.maps.Map(html_element, mapProp); +//Карта створена і показана +} + +//Коли сторінка завантажилась +google.maps.event.addDomListener(window, 'load', initialize); +},{}],5:[function(require,module,exports){ /** * Created by chaika on 25.01.16. */ @@ -243,6 +257,7 @@ $(function () { var PizzaCart = require('./pizza/PizzaCart'); var Pizza_List = require('./Pizza_List'); + PizzaCart.initialiseCart(); PizzaMenu.initialiseMenu(); @@ -319,8 +334,9 @@ $(function () { } }); + require("./googleMaps"); }); -},{"./Pizza_List":2,"./pizza/PizzaCart":5,"./pizza/PizzaMenu":6}],5:[function(require,module,exports){ +},{"./Pizza_List":2,"./googleMaps":4,"./pizza/PizzaCart":6,"./pizza/PizzaMenu":7}],6:[function(require,module,exports){ /** * Created by chaika on 02.02.16. */ @@ -492,7 +508,7 @@ exports.clearCart = clearCart(); exports.PizzaSize = PizzaSize; exports.createOrder = createOrder; -},{"../API":1,"../Templates":3,"./Storage":7}],6:[function(require,module,exports){ +},{"../API":1,"../Templates":3,"./Storage":8}],7:[function(require,module,exports){ /** * Created by chaika on 02.02.16. */ @@ -596,7 +612,7 @@ function initialiseMenu() { exports.filterPizza = filterPizza; exports.initialiseMenu = initialiseMenu; -},{"../Pizza_List":2,"../Templates":3,"./PizzaCart":5}],7:[function(require,module,exports){ +},{"../Pizza_List":2,"../Templates":3,"./PizzaCart":6}],8:[function(require,module,exports){ var basil = require('basil.js'); basil = new basil(); @@ -607,7 +623,7 @@ exports.write = function (key, value) { exports.read = function (key) { return basil.get(key); } -},{"basil.js":8}],8:[function(require,module,exports){ +},{"basil.js":9}],9:[function(require,module,exports){ (function () { // Basil var Basil = function (options) { @@ -995,9 +1011,9 @@ exports.read = function (key) { })(); -},{}],9:[function(require,module,exports){ - },{}],10:[function(require,module,exports){ + +},{}],11:[function(require,module,exports){ /* * EJS Embedded JavaScript templates * Copyright 2112 Matthew Eernisse (mde@fleegix.org) @@ -1865,7 +1881,7 @@ if (typeof window != 'undefined') { window.ejs = exports; } -},{"../package.json":12,"./utils":11,"fs":9,"path":13}],11:[function(require,module,exports){ +},{"../package.json":13,"./utils":12,"fs":10,"path":14}],12:[function(require,module,exports){ /* * EJS Embedded JavaScript templates * Copyright 2112 Matthew Eernisse (mde@fleegix.org) @@ -2031,7 +2047,7 @@ exports.cache = { } }; -},{}],12:[function(require,module,exports){ +},{}],13:[function(require,module,exports){ module.exports={ "_from": "ejs@^2.4.1", "_id": "ejs@2.5.7", @@ -2112,7 +2128,7 @@ module.exports={ "version": "2.5.7" } -},{}],13:[function(require,module,exports){ +},{}],14:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // @@ -2340,7 +2356,7 @@ var substr = 'ab'.substr(-1) === 'b' ; }).call(this,require('_process')) -},{"_process":14}],14:[function(require,module,exports){ +},{"_process":15}],15:[function(require,module,exports){ // shim for using process in browser var process = module.exports = {}; @@ -2526,4 +2542,4 @@ process.chdir = function (dir) { }; process.umask = function() { return 0; }; -},{}]},{},[4]); +},{}]},{},[5]); diff --git a/Frontend/www/assets/less/main.less b/Frontend/www/assets/less/main.less index a0dd2628a..83d8189de 100644 --- a/Frontend/www/assets/less/main.less +++ b/Frontend/www/assets/less/main.less @@ -128,7 +128,7 @@ a { .next-step-wrap { float: right; - margin-right: 10px; + padding-right: 30px; margin-top: 15px; .next-step-width{ @@ -159,6 +159,14 @@ a { } } +.google-maps{ + width: 100%; + height: 350px; + margin-top: 10px; + margin-bottom: 20px; + padding-left: 50px; +} + .bottom-panel, .page-title, .pizza-all-types, .all-pizza-type-wrap, .pizza-small, .pizza-big, .discount-panel, .top-badge { text-align: center; } From 3a0cbbeb8f520250d55bddf4ec27ec5fce6da18a Mon Sep 17 00:00:00 2001 From: Kozopas Viktoria Date: Sat, 18 Nov 2017 12:02:09 +0200 Subject: [PATCH 18/24] show shop and home marker --- Frontend/src/googleMaps.js | 29 +++++++++++++++++++++++++++-- Frontend/www/assets/js/main.js | 28 ++++++++++++++++++++++++++-- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/Frontend/src/googleMaps.js b/Frontend/src/googleMaps.js index cca1960f0..4808ffba4 100644 --- a/Frontend/src/googleMaps.js +++ b/Frontend/src/googleMaps.js @@ -2,11 +2,36 @@ function initialize() { //Тут починаємо працювати з картою var mapProp = { center: new google.maps.LatLng(50.464379, 30.519131), - zoom: 11 + zoom: 15 }; var html_element = document.getElementById("googleMaps"); var map = new google.maps.Map(html_element, mapProp); -//Карта створена і показана + + //show shop marker + var point = new google.maps.LatLng(50.464379, 30.519131); + var shopMarker = new google.maps.Marker({ + position: point, + map: map, + icon: "assets/images/map-icon.png" + }); + //Карта створена і показана + + var old_marker = null; + + google.maps.event.addListener(map, 'click', function (me) { + var coordinates = me.latLng; //coordinates - такий самий об’єкт як створений new google.maps.LatLng(...) + + if (old_marker) { + old_marker.setMap(null); + old_marker = null; + } + + old_marker = new google.maps.Marker({ + position: coordinates, + map: map, + icon: "assets/images/home-icon.png" + }); + }); } //Коли сторінка завантажилась diff --git a/Frontend/www/assets/js/main.js b/Frontend/www/assets/js/main.js index 50ed550ba..f76fb7e73 100644 --- a/Frontend/www/assets/js/main.js +++ b/Frontend/www/assets/js/main.js @@ -237,11 +237,35 @@ function initialize() { //Тут починаємо працювати з картою var mapProp = { center: new google.maps.LatLng(50.464379, 30.519131), - zoom: 11 + zoom: 15 }; var html_element = document.getElementById("googleMaps"); var map = new google.maps.Map(html_element, mapProp); -//Карта створена і показана + + var point = new google.maps.LatLng(50.464379, 30.519131); + var shopMarker = new google.maps.Marker({ + position: point, + map: map, + icon: "assets/images/map-icon.png" + }); + + //Карта створена і показана + var old_marker = null; + + google.maps.event.addListener(map, 'click', function (me) { + var coordinates = me.latLng; //coordinates - такий самий об’єкт як створений new google.maps.LatLng(...) + + if (old_marker) { + old_marker.setMap(null); + old_marker = null; + } + + old_marker = new google.maps.Marker({ + position: coordinates, + map: map, + icon: "assets/images/home-icon.png" + }); + }); } //Коли сторінка завантажилась From 7b2065594da602ff3f4ec845887840b1513cbcad Mon Sep 17 00:00:00 2001 From: Kozopas Viktoria Date: Sat, 18 Nov 2017 14:13:03 +0200 Subject: [PATCH 19/24] address done --- Backend/views/orderPage.ejs | 21 +++---- Frontend/src/googleMaps.js | 73 ++++++++++++++++++----- Frontend/src/main.js | 32 +++++++++- Frontend/www/assets/js/main.js | 105 ++++++++++++++++++++++++++++----- 4 files changed, 188 insertions(+), 43 deletions(-) diff --git a/Backend/views/orderPage.ejs b/Backend/views/orderPage.ejs index fa6ee72b4..dcd7820ac 100644 --- a/Backend/views/orderPage.ejs +++ b/Backend/views/orderPage.ejs @@ -14,35 +14,36 @@
- +
- +
- +
- +

Інформація про замовлення

-

+

Приблизний час доставки: - невідомий + невідомий

-

+

Адреса доставки: - невідома + невідома

@@ -50,7 +51,7 @@
-
-
+
diff --git a/Frontend/src/googleMaps.js b/Frontend/src/googleMaps.js index 4808ffba4..605ae7b99 100644 --- a/Frontend/src/googleMaps.js +++ b/Frontend/src/googleMaps.js @@ -1,3 +1,6 @@ +var old_marker = null; +var gmap = null; + function initialize() { //Тут починаємо працювати з картою var mapProp = { @@ -5,34 +8,76 @@ function initialize() { zoom: 15 }; var html_element = document.getElementById("googleMaps"); - var map = new google.maps.Map(html_element, mapProp); + gmap = new google.maps.Map(html_element, mapProp); //show shop marker var point = new google.maps.LatLng(50.464379, 30.519131); var shopMarker = new google.maps.Marker({ position: point, - map: map, + map: gmap, icon: "assets/images/map-icon.png" }); //Карта створена і показана - - var old_marker = null; - google.maps.event.addListener(map, 'click', function (me) { + google.maps.event.addListener(gmap, 'click', function (me) { var coordinates = me.latLng; //coordinates - такий самий об’єкт як створений new google.maps.LatLng(...) + updateMarker(coordinates); + + geocodeLatLng(coordinates, function (err, address) { + if (!err) { + $(".order-adress").text(address); + $("#inputAddress").val(address); + } else { + $(".order-adress").text("Немає адреси"); + } + }) + }); +} - if (old_marker) { - old_marker.setMap(null); - old_marker = null; +//адресу за координатами +function geocodeLatLng(latlng, callback) { +//Модуль за роботу з адресою + var geocoder = new google.maps.Geocoder(); + geocoder.geocode({'location': latlng}, function (results, status) { + if (status === google.maps.GeocoderStatus.OK && results[1]) { + var adress = results[1].formatted_address; + callback(null, adress); + } else { + callback(new Error("Can't find adress")); } + }); +} - old_marker = new google.maps.Marker({ - position: coordinates, - map: map, - icon: "assets/images/home-icon.png" - }); +//координати за адресою +function geocodeAddress(address, callback) { + var geocoder = new google.maps.Geocoder(); + geocoder.geocode({'address': address}, function (results, status) { + if (status === google.maps.GeocoderStatus.OK && results[0]) { + var coordinates = results[0].geometry.location; + callback(null, coordinates); + } else { + callback(new Error("Can not find the address")); + } + }); +} + +function updateMarker(coordinates) { + if (old_marker) { + old_marker.setMap(null); + old_marker = null; + } + + old_marker = new google.maps.Marker({ + position: coordinates, + map: gmap, + icon: "assets/images/home-icon.png" }); } //Коли сторінка завантажилась -google.maps.event.addDomListener(window, 'load', initialize); \ No newline at end of file +google.maps.event.addDomListener(window, 'load', initialize); + +exports.geocodeAddress = geocodeAddress; +exports.geocodeLatLng = geocodeLatLng; +exports.updateMarker = updateMarker; + diff --git a/Frontend/src/main.js b/Frontend/src/main.js index 5e25b5d74..caf4daa91 100644 --- a/Frontend/src/main.js +++ b/Frontend/src/main.js @@ -7,6 +7,7 @@ $(function () { var PizzaMenu = require('./pizza/PizzaMenu'); var PizzaCart = require('./pizza/PizzaCart'); var Pizza_List = require('./Pizza_List'); + var googleMaps = require("./googleMaps"); PizzaCart.initialiseCart(); @@ -57,6 +58,32 @@ $(function () { } else { $(".address-help-block").hide(); } + + googleMaps.geocodeAddress($("#inputAddress").val(), function (err, coordinates) { + if (!err) { + googleMaps.geocodeLatLng(coordinates, function (err, address) { + if (!err) { + $(".order-adress").text($("#inputAddress").val()); + + //change marker !!!! problem - doesn't changes marker + googleMaps.updateMarker(coordinates); + // if (googleMaps.old_marker) { + // googleMaps.old_marker.setMap(null); + // googleMaps.old_marker = null; + // } + // googleMaps.old_marker = new google.maps.Marker({ + // position: coordinates, + // map: googleMaps.gmap, + // icon: "assets/images/home-icon.png" + // }); + } else { + $(".order-adress").text("Немає адреси"); + } + }); + } + }); + + }); function valName() { @@ -77,13 +104,12 @@ $(function () { $(".next-step-button").click(function () { if (valName() && valPhone() && valAddress()) { PizzaCart.createOrder(function (err, data) { - if (err){ - return console.log("Can't create order"); + if (err) { + return console.log("Can't create order"); } alert("Order created"); }); } }); - require("./googleMaps"); }); \ No newline at end of file diff --git a/Frontend/www/assets/js/main.js b/Frontend/www/assets/js/main.js index f76fb7e73..9e783d967 100644 --- a/Frontend/www/assets/js/main.js +++ b/Frontend/www/assets/js/main.js @@ -233,6 +233,9 @@ exports.PizzaCart_OneItem = ejs.compile("<%\r\nfunction someFunction(pizza) {\r\ exports.PizzaCart_OneItemSubmission = ejs.compile("
\r\n \"Піца\"\">\r\n\r\n

\r\n <% if(pizza[size].size === 30){ %>\r\n <%= pizza.title %> (Мала)\r\n <% }else { %>\r\n <%= pizza.title %> (Велика)\r\n <% } %>\r\n

\r\n
\r\n \r\n <%= pizza[size].size %>\r\n \r\n <%= pizza[size].weight %>\r\n
\r\n
\r\n <%= pizza[size].price*quantity%> грн.\r\n\r\n піц: <%= quantity %> \r\n\r\n
\r\n
"); },{"ejs":11}],4:[function(require,module,exports){ +var old_marker = null; +var gmap = null; + function initialize() { //Тут починаємо працювати з картою var mapProp = { @@ -240,36 +243,80 @@ function initialize() { zoom: 15 }; var html_element = document.getElementById("googleMaps"); - var map = new google.maps.Map(html_element, mapProp); + gmap = new google.maps.Map(html_element, mapProp); + //show shop marker var point = new google.maps.LatLng(50.464379, 30.519131); var shopMarker = new google.maps.Marker({ position: point, - map: map, + map: gmap, icon: "assets/images/map-icon.png" }); - //Карта створена і показана - var old_marker = null; - google.maps.event.addListener(map, 'click', function (me) { + google.maps.event.addListener(gmap, 'click', function (me) { var coordinates = me.latLng; //coordinates - такий самий об’єкт як створений new google.maps.LatLng(...) + updateMarker(coordinates); + + geocodeLatLng(coordinates, function (err, address) { + if (!err) { + $(".order-adress").text(address); + $("#inputAddress").val(address); + } else { + $(".order-adress").text("Немає адреси"); + } + }) + }); +} - if (old_marker) { - old_marker.setMap(null); - old_marker = null; +//адресу за координатами +function geocodeLatLng(latlng, callback) { +//Модуль за роботу з адресою + var geocoder = new google.maps.Geocoder(); + geocoder.geocode({'location': latlng}, function (results, status) { + if (status === google.maps.GeocoderStatus.OK && results[1]) { + var adress = results[1].formatted_address; + callback(null, adress); + } else { + callback(new Error("Can't find adress")); } + }); +} - old_marker = new google.maps.Marker({ - position: coordinates, - map: map, - icon: "assets/images/home-icon.png" - }); +//координати за адресою +function geocodeAddress(address, callback) { + var geocoder = new google.maps.Geocoder(); + geocoder.geocode({'address': address}, function (results, status) { + if (status === google.maps.GeocoderStatus.OK && results[0]) { + var coordinates = results[0].geometry.location; + callback(null, coordinates); + } else { + callback(new Error("Can not find the address")); + } + }); +} + +function updateMarker(coordinates) { + if (old_marker) { + old_marker.setMap(null); + old_marker = null; + } + + old_marker = new google.maps.Marker({ + position: coordinates, + map: gmap, + icon: "assets/images/home-icon.png" }); } //Коли сторінка завантажилась google.maps.event.addDomListener(window, 'load', initialize); + +exports.geocodeAddress = geocodeAddress; +exports.geocodeLatLng = geocodeLatLng; +exports.updateMarker = updateMarker; + + },{}],5:[function(require,module,exports){ /** * Created by chaika on 25.01.16. @@ -280,6 +327,7 @@ $(function () { var PizzaMenu = require('./pizza/PizzaMenu'); var PizzaCart = require('./pizza/PizzaCart'); var Pizza_List = require('./Pizza_List'); + var googleMaps = require("./googleMaps"); PizzaCart.initialiseCart(); @@ -330,6 +378,32 @@ $(function () { } else { $(".address-help-block").hide(); } + + googleMaps.geocodeAddress($("#inputAddress").val(), function (err, coordinates) { + if (!err) { + googleMaps.geocodeLatLng(coordinates, function (err, address) { + if (!err) { + $(".order-adress").text($("#inputAddress").val()); + + //change marker !!!! problem - doesn't changes marker + googleMaps.updateMarker(coordinates); + // if (googleMaps.old_marker) { + // googleMaps.old_marker.setMap(null); + // googleMaps.old_marker = null; + // } + // googleMaps.old_marker = new google.maps.Marker({ + // position: coordinates, + // map: googleMaps.gmap, + // icon: "assets/images/home-icon.png" + // }); + } else { + $(".order-adress").text("Немає адреси"); + } + }); + } + }); + + }); function valName() { @@ -350,15 +424,14 @@ $(function () { $(".next-step-button").click(function () { if (valName() && valPhone() && valAddress()) { PizzaCart.createOrder(function (err, data) { - if (err){ - return console.log("Can't create order"); + if (err) { + return console.log("Can't create order"); } alert("Order created"); }); } }); - require("./googleMaps"); }); },{"./Pizza_List":2,"./googleMaps":4,"./pizza/PizzaCart":6,"./pizza/PizzaMenu":7}],6:[function(require,module,exports){ /** From 5bc6b24f549eebbc9085b80f7c37f504cd650b80 Mon Sep 17 00:00:00 2001 From: Kozopas Viktoria Date: Sat, 18 Nov 2017 14:52:27 +0200 Subject: [PATCH 20/24] updating time of deliver --- Frontend/src/googleMaps.js | 27 ++++++++++++++++++++ Frontend/src/main.js | 18 ++++++-------- Frontend/www/assets/js/main.js | 45 +++++++++++++++++++++++++--------- 3 files changed, 68 insertions(+), 22 deletions(-) diff --git a/Frontend/src/googleMaps.js b/Frontend/src/googleMaps.js index 605ae7b99..c4fb3da10 100644 --- a/Frontend/src/googleMaps.js +++ b/Frontend/src/googleMaps.js @@ -31,6 +31,14 @@ function initialize() { $(".order-adress").text("Немає адреси"); } }) + + calculateRoute(point, coordinates, function (err, data) { + if(!err){ + $(".order-time").text(data.duration.text); + }else{ + $(".order-time").text("Помилка"); + } + }) }); } @@ -74,10 +82,29 @@ function updateMarker(coordinates) { }); } +function calculateRoute(A_latlng, B_latlng, callback) { + var directionService = new google.maps.DirectionsService(); + directionService.route({ + origin: A_latlng, + destination: B_latlng, + travelMode: google.maps.TravelMode["DRIVING"] + }, function (response, status) { + if (status == google.maps.DirectionsStatus.OK) { + var leg = response.routes[0].legs[0]; + callback(null, { + duration: leg.duration + }); + } else { + callback(new Error("Can not find direction")); + } + }); +} + //Коли сторінка завантажилась google.maps.event.addDomListener(window, 'load', initialize); exports.geocodeAddress = geocodeAddress; exports.geocodeLatLng = geocodeLatLng; exports.updateMarker = updateMarker; +exports.calculateRoute = calculateRoute; diff --git a/Frontend/src/main.js b/Frontend/src/main.js index caf4daa91..b4c3c9c7a 100644 --- a/Frontend/src/main.js +++ b/Frontend/src/main.js @@ -64,18 +64,14 @@ $(function () { googleMaps.geocodeLatLng(coordinates, function (err, address) { if (!err) { $(".order-adress").text($("#inputAddress").val()); - - //change marker !!!! problem - doesn't changes marker googleMaps.updateMarker(coordinates); - // if (googleMaps.old_marker) { - // googleMaps.old_marker.setMap(null); - // googleMaps.old_marker = null; - // } - // googleMaps.old_marker = new google.maps.Marker({ - // position: coordinates, - // map: googleMaps.gmap, - // icon: "assets/images/home-icon.png" - // }); + googleMaps.calculateRoute(new google.maps.LatLng(50.464379, 30.519131), coordinates, function (err, data) { + if(!err){ + $(".order-time").text(data.duration.text); + }else{ + $(".order-time").text("Помилка"); + } + }) } else { $(".order-adress").text("Немає адреси"); } diff --git a/Frontend/www/assets/js/main.js b/Frontend/www/assets/js/main.js index 9e783d967..fbd79134a 100644 --- a/Frontend/www/assets/js/main.js +++ b/Frontend/www/assets/js/main.js @@ -266,6 +266,14 @@ function initialize() { $(".order-adress").text("Немає адреси"); } }) + + calculateRoute(point, coordinates, function (err, data) { + if(!err){ + $(".order-time").text(data.duration.text); + }else{ + $(".order-time").text("Помилка"); + } + }) }); } @@ -309,12 +317,31 @@ function updateMarker(coordinates) { }); } +function calculateRoute(A_latlng, B_latlng, callback) { + var directionService = new google.maps.DirectionsService(); + directionService.route({ + origin: A_latlng, + destination: B_latlng, + travelMode: google.maps.TravelMode["DRIVING"] + }, function (response, status) { + if (status == google.maps.DirectionsStatus.OK) { + var leg = response.routes[0].legs[0]; + callback(null, { + duration: leg.duration + }); + } else { + callback(new Error("Can not find direction")); + } + }); +} + //Коли сторінка завантажилась google.maps.event.addDomListener(window, 'load', initialize); exports.geocodeAddress = geocodeAddress; exports.geocodeLatLng = geocodeLatLng; exports.updateMarker = updateMarker; +exports.calculateRoute = calculateRoute; },{}],5:[function(require,module,exports){ @@ -384,18 +411,14 @@ $(function () { googleMaps.geocodeLatLng(coordinates, function (err, address) { if (!err) { $(".order-adress").text($("#inputAddress").val()); - - //change marker !!!! problem - doesn't changes marker googleMaps.updateMarker(coordinates); - // if (googleMaps.old_marker) { - // googleMaps.old_marker.setMap(null); - // googleMaps.old_marker = null; - // } - // googleMaps.old_marker = new google.maps.Marker({ - // position: coordinates, - // map: googleMaps.gmap, - // icon: "assets/images/home-icon.png" - // }); + googleMaps.calculateRoute(new google.maps.LatLng(50.464379, 30.519131), coordinates, function (err, data) { + if(!err){ + $(".order-time").text(data.duration.text); + }else{ + $(".order-time").text("Помилка"); + } + }) } else { $(".order-adress").text("Немає адреси"); } From 93a39678912de397d4b734cf09683bf2bd59db6d Mon Sep 17 00:00:00 2001 From: Kozopas Viktoria Date: Mon, 20 Nov 2017 20:01:00 +0200 Subject: [PATCH 21/24] show widget --- Backend/api.js | 38 ++++++++++++++++++++++++++++++--- Backend/views/common/footer.ejs | 10 ++++++--- Backend/views/orderPage.ejs | 2 ++ Frontend/src/main.js | 21 +++++++++++++++--- Frontend/www/assets/js/main.js | 21 +++++++++++++++--- 5 files changed, 80 insertions(+), 12 deletions(-) diff --git a/Backend/api.js b/Backend/api.js index 8cbd34412..9b9949f35 100644 --- a/Backend/api.js +++ b/Backend/api.js @@ -1,20 +1,52 @@ /** * Created by chaika on 09.02.16. */ +var LIQPAY_PUBLIC_KEY = "i52562539941"; +var LIQPAY_PRIVATE_KEY = "jXtyOihGPd4wfVi1mROoNm5btRJ9br57RluxNTCn"; + +var crypto = require('crypto'); + +function sha1(string) { + var sha1 = crypto.createHash('sha1'); + sha1.update(string); + return sha1.digest('base64'); +} + +function base64(str) { + return new Buffer(str).toString('base64'); +} + var Pizza_List = require('./data/Pizza_List'); -exports.getPizzaList = function(req, res) { +exports.getPizzaList = function (req, res) { res.send(Pizza_List); }; -exports.createOrder = function(req, res) { +exports.createOrder = function (req, res) { var order_info = req.body; console.log("Creating Order", order_info); + var order = { + version: 3, + public_key: LIQPAY_PUBLIC_KEY, + action: "pay", + amount: 568.00, + currency: "UAH", + description: "Опис транзакції", + order_id: Math.random(), + //!!!Важливо щоб було 1, бо інакше візьме гроші!!! + sandbox: 1 + }; + var data = base64(JSON.stringify(order)); + var signature = sha1(LIQPAY_PRIVATE_KEY + data + LIQPAY_PRIVATE_KEY); + res.send({ success: true, Name: order_info.Name, Phone: order_info.Phone, - Address: order_info.Address + Address: order_info.Address, + //pizzas: order_info.order.length, + data: data, + signature: signature }); }; \ No newline at end of file diff --git a/Backend/views/common/footer.ejs b/Backend/views/common/footer.ejs index 6e72c089f..bf8cb2d77 100644 --- a/Backend/views/common/footer.ejs +++ b/Backend/views/common/footer.ejs @@ -15,11 +15,15 @@ - + + + - + diff --git a/Backend/views/orderPage.ejs b/Backend/views/orderPage.ejs index dcd7820ac..2a2d0eff5 100644 --- a/Backend/views/orderPage.ejs +++ b/Backend/views/orderPage.ejs @@ -61,6 +61,8 @@
+ +
diff --git a/Frontend/src/main.js b/Frontend/src/main.js index b4c3c9c7a..075b24270 100644 --- a/Frontend/src/main.js +++ b/Frontend/src/main.js @@ -66,9 +66,9 @@ $(function () { $(".order-adress").text($("#inputAddress").val()); googleMaps.updateMarker(coordinates); googleMaps.calculateRoute(new google.maps.LatLng(50.464379, 30.519131), coordinates, function (err, data) { - if(!err){ + if (!err) { $(".order-time").text(data.duration.text); - }else{ + } else { $(".order-time").text("Помилка"); } }) @@ -103,7 +103,22 @@ $(function () { if (err) { return console.log("Can't create order"); } - alert("Order created"); + // alert("Order created"); + + LiqPayCheckout.init({ + data: data.data, + signature: data.signature, + embedTo: "#liqpay", + mode: "popup" // embed || popup + }).on("liqpay.callback", function (data) { + console.log(data.status); + console.log(data); + alert("Order status: " + data.status); + }).on("liqpay.ready", function (data) { + // ready + }).on("liqpay.close", function (data) { + // close + }); }); } }); diff --git a/Frontend/www/assets/js/main.js b/Frontend/www/assets/js/main.js index fbd79134a..19215e794 100644 --- a/Frontend/www/assets/js/main.js +++ b/Frontend/www/assets/js/main.js @@ -413,9 +413,9 @@ $(function () { $(".order-adress").text($("#inputAddress").val()); googleMaps.updateMarker(coordinates); googleMaps.calculateRoute(new google.maps.LatLng(50.464379, 30.519131), coordinates, function (err, data) { - if(!err){ + if (!err) { $(".order-time").text(data.duration.text); - }else{ + } else { $(".order-time").text("Помилка"); } }) @@ -450,7 +450,22 @@ $(function () { if (err) { return console.log("Can't create order"); } - alert("Order created"); + // alert("Order created"); + + LiqPayCheckout.init({ + data: data.data, + signature: data.signature, + embedTo: "#liqpay", + mode: "popup" // embed || popup + }).on("liqpay.callback", function (data) { + console.log(data.status); + console.log(data); + alert("Order status: " + data.status); + }).on("liqpay.ready", function (data) { + // ready + }).on("liqpay.close", function (data) { + // close + }); }); } }); From e344e591f2cde17a0e1f847ceb0885d8b3fbc79a Mon Sep 17 00:00:00 2001 From: Kozopas Viktoria Date: Mon, 20 Nov 2017 22:56:49 +0200 Subject: [PATCH 22/24] show description and sum on widget --- Backend/api.js | 14 +++++++++++--- Frontend/src/main.js | 2 +- Frontend/src/pizza/PizzaCart.js | 23 +++++++++++++++++------ Frontend/www/assets/js/main.js | 25 ++++++++++++++++++------- 4 files changed, 47 insertions(+), 17 deletions(-) diff --git a/Backend/api.js b/Backend/api.js index 9b9949f35..a5f15e927 100644 --- a/Backend/api.js +++ b/Backend/api.js @@ -26,13 +26,20 @@ exports.createOrder = function (req, res) { var order_info = req.body; console.log("Creating Order", order_info); + var descrip = ""; + + order_info.Pizzas.forEach(function (t) { + descrip += "<" + t.pizza.title + "> "; + }) + var order = { version: 3, public_key: LIQPAY_PUBLIC_KEY, action: "pay", - amount: 568.00, + amount: order_info.Sum, currency: "UAH", - description: "Опис транзакції", + description: "Pizzas ordered: " + descrip + "\nName: " + + order_info.Name + "\nPhone: " + order_info.Phone + "\nAddress: " + order_info.Address, order_id: Math.random(), //!!!Важливо щоб було 1, бо інакше візьме гроші!!! sandbox: 1 @@ -45,7 +52,8 @@ exports.createOrder = function (req, res) { Name: order_info.Name, Phone: order_info.Phone, Address: order_info.Address, - //pizzas: order_info.order.length, + Pizzas: order_info.Pizzas.length, + Sum: order_info.Sum, data: data, signature: signature }); diff --git a/Frontend/src/main.js b/Frontend/src/main.js index 075b24270..a03879e6b 100644 --- a/Frontend/src/main.js +++ b/Frontend/src/main.js @@ -109,7 +109,7 @@ $(function () { data: data.data, signature: data.signature, embedTo: "#liqpay", - mode: "popup" // embed || popup + mode: "embed" // popup || popup }).on("liqpay.callback", function (data) { console.log(data.status); console.log(data); diff --git a/Frontend/src/pizza/PizzaCart.js b/Frontend/src/pizza/PizzaCart.js index fc0445fed..6e7b600ab 100644 --- a/Frontend/src/pizza/PizzaCart.js +++ b/Frontend/src/pizza/PizzaCart.js @@ -72,16 +72,25 @@ function getPizzaInCart() { return Cart; } -function updateCart() { - //Функція викликається при зміні вмісту кошика - //Тут можна наприклад показати оновлений кошик на екрані та зберегти вміт кошика в Local Storage +function countTotal() { var total = 0; - var number_of_pizzas = Cart.length; Cart.forEach(function (pizzacart) { total += pizzacart.pizza[pizzacart.size].price * pizzacart.quantity; }); - $(".sum-number").text(total + " грн."); + return total; +} + +function updateCart() { + //Функція викликається при зміні вмісту кошика + //Тут можна наприклад показати оновлений кошик на екрані та зберегти вміт кошика в Local Storage + //var total = 0; + var number_of_pizzas = Cart.length; + // Cart.forEach(function (pizzacart) { + // total += pizzacart.pizza[pizzacart.size].price * pizzacart.quantity; + // }); + // $(".sum-number").text(total + " грн."); $(".order-count").text(number_of_pizzas); + $(".sum-number").text(countTotal() + " грн."); Storage.write("cart", Cart); $cart.html(""); //Очищаємо старі піци в кошику @@ -152,7 +161,9 @@ function createOrder(callback) { API.createOrder({ Name: $("#inputName").val(), Phone: $("#inputPhone").val(), - Address: $("#inputAddress").val() + Address: $("#inputAddress").val(), + Pizzas: Cart, + Sum: countTotal() }, function (err, result) { if(err) return callback(err); callback(null, result); diff --git a/Frontend/www/assets/js/main.js b/Frontend/www/assets/js/main.js index 19215e794..e6dc4a0a4 100644 --- a/Frontend/www/assets/js/main.js +++ b/Frontend/www/assets/js/main.js @@ -456,7 +456,7 @@ $(function () { data: data.data, signature: data.signature, embedTo: "#liqpay", - mode: "popup" // embed || popup + mode: "embed" // popup || popup }).on("liqpay.callback", function (data) { console.log(data.status); console.log(data); @@ -546,16 +546,25 @@ function getPizzaInCart() { return Cart; } -function updateCart() { - //Функція викликається при зміні вмісту кошика - //Тут можна наприклад показати оновлений кошик на екрані та зберегти вміт кошика в Local Storage +function countTotal() { var total = 0; - var number_of_pizzas = Cart.length; Cart.forEach(function (pizzacart) { total += pizzacart.pizza[pizzacart.size].price * pizzacart.quantity; }); - $(".sum-number").text(total + " грн."); + return total; +} + +function updateCart() { + //Функція викликається при зміні вмісту кошика + //Тут можна наприклад показати оновлений кошик на екрані та зберегти вміт кошика в Local Storage + //var total = 0; + var number_of_pizzas = Cart.length; + // Cart.forEach(function (pizzacart) { + // total += pizzacart.pizza[pizzacart.size].price * pizzacart.quantity; + // }); + // $(".sum-number").text(total + " грн."); $(".order-count").text(number_of_pizzas); + $(".sum-number").text(countTotal() + " грн."); Storage.write("cart", Cart); $cart.html(""); //Очищаємо старі піци в кошику @@ -626,7 +635,9 @@ function createOrder(callback) { API.createOrder({ Name: $("#inputName").val(), Phone: $("#inputPhone").val(), - Address: $("#inputAddress").val() + Address: $("#inputAddress").val(), + Pizzas: Cart, + Sum: countTotal() }, function (err, result) { if(err) return callback(err); callback(null, result); From 2c9ebed72efcf28989bb30a43aa9b1aff8e060ee Mon Sep 17 00:00:00 2001 From: Kozopas Viktoria Date: Mon, 20 Nov 2017 23:12:35 +0200 Subject: [PATCH 23/24] test transaction success --- Frontend/src/pizza/PizzaCart.js | 5 ----- Frontend/www/assets/js/main.js | 5 ----- 2 files changed, 10 deletions(-) diff --git a/Frontend/src/pizza/PizzaCart.js b/Frontend/src/pizza/PizzaCart.js index 6e7b600ab..dccf06399 100644 --- a/Frontend/src/pizza/PizzaCart.js +++ b/Frontend/src/pizza/PizzaCart.js @@ -83,12 +83,7 @@ function countTotal() { function updateCart() { //Функція викликається при зміні вмісту кошика //Тут можна наприклад показати оновлений кошик на екрані та зберегти вміт кошика в Local Storage - //var total = 0; var number_of_pizzas = Cart.length; - // Cart.forEach(function (pizzacart) { - // total += pizzacart.pizza[pizzacart.size].price * pizzacart.quantity; - // }); - // $(".sum-number").text(total + " грн."); $(".order-count").text(number_of_pizzas); $(".sum-number").text(countTotal() + " грн."); diff --git a/Frontend/www/assets/js/main.js b/Frontend/www/assets/js/main.js index e6dc4a0a4..3d6f7ae39 100644 --- a/Frontend/www/assets/js/main.js +++ b/Frontend/www/assets/js/main.js @@ -557,12 +557,7 @@ function countTotal() { function updateCart() { //Функція викликається при зміні вмісту кошика //Тут можна наприклад показати оновлений кошик на екрані та зберегти вміт кошика в Local Storage - //var total = 0; var number_of_pizzas = Cart.length; - // Cart.forEach(function (pizzacart) { - // total += pizzacart.pizza[pizzacart.size].price * pizzacart.quantity; - // }); - // $(".sum-number").text(total + " грн."); $(".order-count").text(number_of_pizzas); $(".sum-number").text(countTotal() + " грн."); From 258d055ccf71f7b1038b12bacde70117a3218069 Mon Sep 17 00:00:00 2001 From: Kozopas Viktoria Date: Mon, 20 Nov 2017 23:17:36 +0200 Subject: [PATCH 24/24] validation bug --- Frontend/src/main.js | 5 ++++- Frontend/www/assets/js/main.js | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Frontend/src/main.js b/Frontend/src/main.js index a03879e6b..a87681a2a 100644 --- a/Frontend/src/main.js +++ b/Frontend/src/main.js @@ -93,7 +93,10 @@ $(function () { } function valAddress() { - //later, when google map + if ($("#inputAddress").val() === "") { + $(".address-help-block").show(); + return false + } else $(".address-help-block").hide(); return true; } diff --git a/Frontend/www/assets/js/main.js b/Frontend/www/assets/js/main.js index 3d6f7ae39..d31d6ee87 100644 --- a/Frontend/www/assets/js/main.js +++ b/Frontend/www/assets/js/main.js @@ -440,7 +440,10 @@ $(function () { } function valAddress() { - //later, when google map + if ($("#inputAddress").val() === "") { + $(".address-help-block").show(); + return false + } else $(".address-help-block").hide(); return true; }