diff --git a/tinasharma/.gitignore b/tinasharma/.gitignore
index 3c3629e..0fbc723 100644
--- a/tinasharma/.gitignore
+++ b/tinasharma/.gitignore
@@ -1 +1,6 @@
node_modules
+db\
+.DS_Store
+notes.js
+**/*bundle.js
+**/build
diff --git a/tinasharma/app/index.html b/tinasharma/app/index.html
new file mode 100644
index 0000000..88cc6ef
--- /dev/null
+++ b/tinasharma/app/index.html
@@ -0,0 +1,66 @@
+
+
+
+
+
+ Parcel site
+
+
+
+
+ Parcels App!
+
+
+
+
+
+
+ -
+ {{parcel.name}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tinasharma/app/js/entry.js b/tinasharma/app/js/entry.js
new file mode 100644
index 0000000..6178166
--- /dev/null
+++ b/tinasharma/app/js/entry.js
@@ -0,0 +1,6 @@
+require('angular/angular');
+var angular = window.angular;
+
+var parcelStreamApp = angular.module('ParcelStreamApp', []);
+
+require('./parcels/parcels')(parcelStreamApp);
diff --git a/tinasharma/app/js/parcels/controllers/parcels_controller.js b/tinasharma/app/js/parcels/controllers/parcels_controller.js
new file mode 100644
index 0000000..46d2b54
--- /dev/null
+++ b/tinasharma/app/js/parcels/controllers/parcels_controller.js
@@ -0,0 +1,68 @@
+var angular = window.angular;
+module.exports = function(app) {
+ app.controller('ParcelsController', ['$scope', '$http', function($scope, $http) {
+ $scope.parcels = [];
+ $scope.newParcel = null;
+ $scope.errors = [];
+ $scope.updatingParcels = {};
+ $scope.defaults = {size: 'small', weight: '3'};
+ $scope.newParcel = angular.copy($scope.defaults);
+
+ $scope.getAll = function() {
+ $http.get('/api/parcels')
+ .then(function(res) {
+ $scope.parcels = res.data;
+ }, function(err) {
+ console.log(err.data);
+ });
+ };
+
+ $scope.create = function(parcel) {
+ $http.post('/api/parcels', parcel)
+ .then(function(res) {
+ $scope.parcels.push(res.data);
+ $scope.newParcel = angular.copy($scope.defaults);
+ }, function(err) {
+ console.log(err.data);
+ });
+ };
+
+ $scope.update = function(parcel) {
+ parcel.editing = false;
+ $http.put('/api/parcels/' + parcel._id, parcel)
+ .then(function(res) {
+ console.log('parcel is updated');
+ }, function(err) {
+ $scope.errors.push('could not update: ' + parcel.name + ' parcel');
+ console.log(err.data);
+ });
+ };
+
+ $scope.startUpdate = function(parcel) {
+ parcel.editing = true;
+ $scope.updatingParcels[parcel._id] = {name: parcel.name, size: parcel.size, weight: parcel.weight};
+ };
+
+ $scope.reset = function(parcel) {
+ var oldParcel = $scope.updatingParcels[parcel._id];
+ $scope.parcel = angular.copy($scope.master);
+ parcel.name = oldParcel.name;
+ parcel.size = oldParcel.size;
+ parcel.weight = oldParcel.weight;
+ parcel.editing = false;
+ };
+
+ $scope.remove = function(parcel) {
+ $scope.parcels.splice($scope.parcels.indexOf(parcel), 1);
+ $http.delete('/api/parcels/' + parcel._id)
+ .then(function(res) {
+ console.log('parcel deleted');
+ }, function(err) {
+ console.log(err.data);
+ $scope.errors.push('could not delete parcelzzz: ' + parcel.name);
+ $scope.getAll();
+ });
+ };
+
+ }]);
+};
diff --git a/tinasharma/app/js/parcels/parcels.js b/tinasharma/app/js/parcels/parcels.js
new file mode 100644
index 0000000..cb31cc8
--- /dev/null
+++ b/tinasharma/app/js/parcels/parcels.js
@@ -0,0 +1,3 @@
+module.exports = function(app) {
+ require('./controllers/parcels_controller')(app);
+};
diff --git a/tinasharma/app/sass/base/_base.scss b/tinasharma/app/sass/base/_base.scss
new file mode 100644
index 0000000..e77d73a
--- /dev/null
+++ b/tinasharma/app/sass/base/_base.scss
@@ -0,0 +1,42 @@
+body {
+ font-family: $font-stack;
+ line-height: 1.5;
+}
+
+h1,
+h2 {
+ font-family: 'Roboto Slab', serif;
+ text-decoration: underline;
+
+}
+
+h2 {
+ color: $primary-color;
+}
+
+h1 {
+ text-align: center;
+ @extend %large-type;
+}
+
+form {
+ @include default-box;
+ background-color: $background-color;
+ border-color: $border-color;
+}
+
+.row {
+ color: $primary-color;
+ }
+
+label {
+ color:blue;
+}
+
+#parcellist {
+ margin-left: 180px;
+}
+button,
+input {
+
+}
diff --git a/tinasharma/app/sass/base/_reset.scss b/tinasharma/app/sass/base/_reset.scss
new file mode 100644
index 0000000..5e5e3c8
--- /dev/null
+++ b/tinasharma/app/sass/base/_reset.scss
@@ -0,0 +1,424 @@
+/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
+
+/**
+ * 1. Set default font family to sans-serif.
+ * 2. Prevent iOS and IE text size adjust after device orientation change,
+ * without disabling user zoom.
+ */
+
+html {
+ font-family: sans-serif; /* 1 */
+ -ms-text-size-adjust: 100%; /* 2 */
+ -webkit-text-size-adjust: 100%; /* 2 */
+}
+
+/**
+ * Remove default margin.
+ */
+
+body {
+ margin: 0;
+}
+
+/* HTML5 display definitions
+ ========================================================================== */
+
+/**
+ * Correct `block` display not defined for any HTML5 element in IE 8/9.
+ * Correct `block` display not defined for `details` or `summary` in IE 10/11
+ * and Firefox.
+ * Correct `block` display not defined for `main` in IE 11.
+ */
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section,
+summary {
+ display: block;
+}
+
+/**
+ * 1. Correct `inline-block` display not defined in IE 8/9.
+ * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
+ */
+
+audio,
+canvas,
+progress,
+video {
+ display: inline-block; /* 1 */
+ vertical-align: baseline; /* 2 */
+}
+
+/**
+ * Prevent modern browsers from displaying `audio` without controls.
+ * Remove excess height in iOS 5 devices.
+ */
+
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+
+/**
+ * Address `[hidden]` styling not present in IE 8/9/10.
+ * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.
+ */
+
+[hidden],
+template {
+ display: none;
+}
+
+/* Links
+ ========================================================================== */
+
+/**
+ * Remove the gray background color from active links in IE 10.
+ */
+
+a {
+ background-color: transparent;
+}
+
+/**
+ * Improve readability of focused elements when they are also in an
+ * active/hover state.
+ */
+
+a:active,
+a:hover {
+ outline: 0;
+}
+
+/* Text-level semantics
+ ========================================================================== */
+
+/**
+ * Address styling not present in IE 8/9/10/11, Safari, and Chrome.
+ */
+
+abbr[title] {
+ border-bottom: 1px dotted;
+}
+
+/**
+ * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
+ */
+
+b,
+strong {
+ font-weight: bold;
+}
+
+/**
+ * Address styling not present in Safari and Chrome.
+ */
+
+dfn {
+ font-style: italic;
+}
+
+/**
+ * Address variable `h1` font-size and margin within `section` and `article`
+ * contexts in Firefox 4+, Safari, and Chrome.
+ */
+
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+
+/**
+ * Address styling not present in IE 8/9.
+ */
+
+mark {
+ background: #ff0;
+ color: #000;
+}
+
+/**
+ * Address inconsistent and variable font size in all browsers.
+ */
+
+small {
+ font-size: 80%;
+}
+
+/**
+ * Prevent `sub` and `sup` affecting `line-height` in all browsers.
+ */
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sup {
+ top: -0.5em;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+/* Embedded content
+ ========================================================================== */
+
+/**
+ * Remove border when inside `a` element in IE 8/9/10.
+ */
+
+img {
+ border: 0;
+}
+
+/**
+ * Correct overflow not hidden in IE 9/10/11.
+ */
+
+svg:not(:root) {
+ overflow: hidden;
+}
+
+/* Grouping content
+ ========================================================================== */
+
+/**
+ * Address margin not present in IE 8/9 and Safari.
+ */
+
+figure {
+ margin: 1em 40px;
+}
+
+/**
+ * Address differences between Firefox and other browsers.
+ */
+
+hr {
+ box-sizing: content-box;
+ height: 0;
+}
+
+/**
+ * Contain overflow in all browsers.
+ */
+
+pre {
+ overflow: auto;
+}
+
+/**
+ * Address odd `em`-unit font size rendering in all browsers.
+ */
+
+code,
+kbd,
+pre,
+samp {
+ font-family: monospace, monospace;
+ font-size: 1em;
+}
+
+/* Forms
+ ========================================================================== */
+
+/**
+ * Known limitation: by default, Chrome and Safari on OS X allow very limited
+ * styling of `select`, unless a `border` property is set.
+ */
+
+/**
+ * 1. Correct color not being inherited.
+ * Known issue: affects color of disabled elements.
+ * 2. Correct font properties not being inherited.
+ * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
+ */
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ color: inherit; /* 1 */
+ font: inherit; /* 2 */
+ margin: 0; /* 3 */
+}
+
+/**
+ * Address `overflow` set to `hidden` in IE 8/9/10/11.
+ */
+
+button {
+ overflow: visible;
+}
+
+/**
+ * Address inconsistent `text-transform` inheritance for `button` and `select`.
+ * All other form control elements do not inherit `text-transform` values.
+ * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
+ * Correct `select` style inheritance in Firefox.
+ */
+
+button,
+select {
+ text-transform: none;
+}
+
+/**
+ * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
+ * and `video` controls.
+ * 2. Correct inability to style clickable `input` types in iOS.
+ * 3. Improve usability and consistency of cursor style between image-type
+ * `input` and others.
+ */
+
+button,
+html input[type="button"], /* 1 */
+input[type="reset"],
+input[type="submit"] {
+ -webkit-appearance: button; /* 2 */
+ cursor: pointer; /* 3 */
+}
+
+/**
+ * Re-set default cursor for disabled elements.
+ */
+
+button[disabled],
+html input[disabled] {
+ cursor: default;
+}
+
+/**
+ * Remove inner padding and border in Firefox 4+.
+ */
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+
+/**
+ * Address Firefox 4+ setting `line-height` on `input` using `!important` in
+ * the UA stylesheet.
+ */
+
+input {
+ line-height: normal;
+}
+
+/**
+ * It's recommended that you don't attempt to style these elements.
+ * Firefox's implementation doesn't respect box-sizing, padding, or width.
+ *
+ * 1. Address box sizing set to `content-box` in IE 8/9/10.
+ * 2. Remove excess padding in IE 8/9/10.
+ */
+
+input[type="checkbox"],
+input[type="radio"] {
+ box-sizing: border-box; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/**
+ * Fix the cursor style for Chrome's increment/decrement buttons. For certain
+ * `font-size` values of the `input`, it causes the cursor style of the
+ * decrement button to change from `default` to `text`.
+ */
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+
+/**
+ * 1. Address `appearance` set to `searchfield` in Safari and Chrome.
+ * 2. Address `box-sizing` set to `border-box` in Safari and Chrome.
+ */
+
+input[type="search"] {
+ -webkit-appearance: textfield; /* 1 */
+ box-sizing: content-box; /* 2 */
+}
+
+/**
+ * Remove inner padding and search cancel button in Safari and Chrome on OS X.
+ * Safari (but not Chrome) clips the cancel button when the search input has
+ * padding (and `textfield` appearance).
+ */
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+/**
+ * Define consistent border, margin, and padding.
+ */
+
+fieldset {
+ border: 1px solid #c0c0c0;
+ margin: 0 2px;
+ padding: 0.35em 0.625em 0.75em;
+}
+
+/**
+ * 1. Correct `color` not being inherited in IE 8/9/10/11.
+ * 2. Remove padding so people aren't caught out if they zero out fieldsets.
+ */
+
+legend {
+ border: 0; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/**
+ * Remove default vertical scrollbar in IE 8/9/10/11.
+ */
+
+textarea {
+ overflow: auto;
+}
+
+/**
+ * Don't inherit the `font-weight` (applied by a rule above).
+ * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
+ */
+
+optgroup {
+ font-weight: bold;
+}
+
+/* Tables
+ ========================================================================== */
+
+/**
+ * Remove most spacing between table cells.
+ */
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+td,
+th {
+ padding: 0;
+}
diff --git a/tinasharma/app/sass/components/_buttons.scss b/tinasharma/app/sass/components/_buttons.scss
new file mode 100644
index 0000000..5912425
--- /dev/null
+++ b/tinasharma/app/sass/components/_buttons.scss
@@ -0,0 +1,9 @@
+button
+{
+ @include btn-info(#F5FFFA, #3E606F, 80, 20);
+}
+
+button:hover,
+button:focus {
+ color: #91AA9D;
+}
diff --git a/tinasharma/app/sass/components/_mixin.scss b/tinasharma/app/sass/components/_mixin.scss
new file mode 100644
index 0000000..3b5c8d6
--- /dev/null
+++ b/tinasharma/app/sass/components/_mixin.scss
@@ -0,0 +1,15 @@
+@mixin btn-info($background, $color, $width, $f-size) {
+ font-size: font-size($f-size);
+ letter-spacing: .125em;
+ display: inline-flex;
+ justify-content: center;
+ cursor: pointer;
+ text-transform: uppercase;
+ width: $width;
+ padding: 1em;
+ border: solid 1px;
+ background-color: $background;
+ color: $color;
+ border-color: $color;
+ border-radius: .5em;
+}
diff --git a/tinasharma/app/sass/main.scss b/tinasharma/app/sass/main.scss
new file mode 100644
index 0000000..831de9a
--- /dev/null
+++ b/tinasharma/app/sass/main.scss
@@ -0,0 +1,7 @@
+@import 'utils/_functions.scss';
+@import 'utils/_variables.scss';
+@import 'base/_base.scss';
+@import 'base/_reset.scss';
+@import 'components/_mixin.scss';
+@import 'components/_buttons.scss';
+@import 'typography/_layout.scss';
diff --git a/tinasharma/app/sass/typography/_layout.scss b/tinasharma/app/sass/typography/_layout.scss
new file mode 100644
index 0000000..7cfa139
--- /dev/null
+++ b/tinasharma/app/sass/typography/_layout.scss
@@ -0,0 +1,418 @@
+/*
+* Skeleton V2.0.4
+* Copyright 2014, Dave Gamache
+* www.getskeleton.com
+* Free to use under the MIT license.
+* http://www.opensource.org/licenses/mit-license.php
+* 12/29/2014
+*/
+
+
+/* Table of contents
+––––––––––––––––––––––––––––––––––––––––––––––––––
+- Grid
+- Base Styles
+- Typography
+- Links
+- Buttons
+- Forms
+- Lists
+- Code
+- Tables
+- Spacing
+- Utilities
+- Clearing
+- Media Queries
+*/
+
+
+/* Grid
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+.container {
+ position: relative;
+ width: 100%;
+ max-width: 960px;
+ margin: 0 auto;
+ padding: 0 20px;
+ box-sizing: border-box; }
+.column,
+.columns {
+ width: 100%;
+ float: left;
+ box-sizing: border-box; }
+
+/* For devices larger than 400px */
+@media (min-width: 400px) {
+ .container {
+ width: 85%;
+ padding: 0; }
+}
+
+/* For devices larger than 550px */
+@media (min-width: 550px) {
+ .container {
+ width: 80%; }
+ .column,
+ .columns {
+ margin-left: 4%; }
+ .column:first-child,
+ .columns:first-child {
+ margin-left: 0; }
+
+ .one.column,
+ .one.columns { width: 4.66666666667%; }
+ .two.columns { width: 13.3333333333%; }
+ .three.columns { width: 22%; }
+ .four.columns { width: 30.6666666667%; }
+ .five.columns { width: 39.3333333333%; }
+ .six.columns { width: 48%; }
+ .seven.columns { width: 56.6666666667%; }
+ .eight.columns { width: 65.3333333333%; }
+ .nine.columns { width: 74.0%; }
+ .ten.columns { width: 82.6666666667%; }
+ .eleven.columns { width: 91.3333333333%; }
+ .twelve.columns { width: 100%; margin-left: 0; }
+
+ .one-third.column { width: 30.6666666667%; }
+ .two-thirds.column { width: 65.3333333333%; }
+
+ .one-half.column { width: 48%; }
+
+ /* Offsets */
+ .offset-by-one.column,
+ .offset-by-one.columns { margin-left: 8.66666666667%; }
+ .offset-by-two.column,
+ .offset-by-two.columns { margin-left: 17.3333333333%; }
+ .offset-by-three.column,
+ .offset-by-three.columns { margin-left: 26%; }
+ .offset-by-four.column,
+ .offset-by-four.columns { margin-left: 34.6666666667%; }
+ .offset-by-five.column,
+ .offset-by-five.columns { margin-left: 43.3333333333%; }
+ .offset-by-six.column,
+ .offset-by-six.columns { margin-left: 52%; }
+ .offset-by-seven.column,
+ .offset-by-seven.columns { margin-left: 60.6666666667%; }
+ .offset-by-eight.column,
+ .offset-by-eight.columns { margin-left: 69.3333333333%; }
+ .offset-by-nine.column,
+ .offset-by-nine.columns { margin-left: 78.0%; }
+ .offset-by-ten.column,
+ .offset-by-ten.columns { margin-left: 86.6666666667%; }
+ .offset-by-eleven.column,
+ .offset-by-eleven.columns { margin-left: 95.3333333333%; }
+
+ .offset-by-one-third.column,
+ .offset-by-one-third.columns { margin-left: 34.6666666667%; }
+ .offset-by-two-thirds.column,
+ .offset-by-two-thirds.columns { margin-left: 69.3333333333%; }
+
+ .offset-by-one-half.column,
+ .offset-by-one-half.columns { margin-left: 52%; }
+
+}
+
+
+/* Base Styles
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+/* NOTE
+html is set to 62.5% so that all the REM measurements throughout Skeleton
+are based on 10px sizing. So basically 1.5rem = 15px :) */
+html {
+ font-size: 62.5%; }
+body {
+ font-size: 1.5em; /* currently ems cause chrome bug misinterpreting rems on body element */
+ line-height: 1.6;
+ font-weight: 400;
+ font-family: "Raleway", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif;
+ color: #222; }
+
+
+/* Typography
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+h1, h2, h3, h4, h5, h6 {
+ margin-top: 0;
+ margin-bottom: 2rem;
+ font-weight: 300; }
+h1 { font-size: 4.0rem; line-height: 1.2; letter-spacing: -.1rem;}
+h2 { font-size: 3.6rem; line-height: 1.25; letter-spacing: -.1rem; }
+h3 { font-size: 3.0rem; line-height: 1.3; letter-spacing: -.1rem; }
+h4 { font-size: 2.4rem; line-height: 1.35; letter-spacing: -.08rem; }
+h5 { font-size: 1.8rem; line-height: 1.5; letter-spacing: -.05rem; }
+h6 { font-size: 1.5rem; line-height: 1.6; letter-spacing: 0; }
+
+/* Larger than phablet */
+@media (min-width: 550px) {
+ h1 { font-size: 5.0rem; }
+ h2 { font-size: 4.2rem; }
+ h3 { font-size: 3.6rem; }
+ h4 { font-size: 3.0rem; }
+ h5 { font-size: 2.4rem; }
+ h6 { font-size: 1.5rem; }
+}
+
+p {
+ margin-top: 0; }
+
+
+/* Links
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+a {
+ color: #1EAEDB; }
+a:hover {
+ color: #0FA0CE; }
+
+
+/* Buttons
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+/*.button,
+button,
+input[type="submit"],
+input[type="reset"],
+input[type="button"] {
+ display: inline-block;
+ height: 38px;
+ padding: 0 30px;
+ color: #555;
+ text-align: center;
+ font-size: 11px;
+ font-weight: 600;
+ line-height: 38px;
+ letter-spacing: .1rem;
+ text-transform: uppercase;
+ text-decoration: none;
+ white-space: nowrap;
+ background-color: transparent;
+ border-radius: 4px;
+ border: 1px solid #bbb;
+ cursor: pointer;
+ box-sizing: border-box; }
+.button:hover,
+button:hover,
+input[type="submit"]:hover,
+input[type="reset"]:hover,
+input[type="button"]:hover,
+.button:focus,
+button:focus,
+input[type="submit"]:focus,
+input[type="reset"]:focus,
+input[type="button"]:focus {
+ color: #333;
+ border-color: #888;
+ outline: 0; }
+.button.button-primary,
+button.button-primary,
+input[type="submit"].button-primary,
+input[type="reset"].button-primary,
+input[type="button"].button-primary {
+ color: #FFF;
+ background-color: #33C3F0;
+ border-color: #33C3F0; }
+.button.button-primary:hover,
+button.button-primary:hover,
+input[type="submit"].button-primary:hover,
+input[type="reset"].button-primary:hover,
+input[type="button"].button-primary:hover,
+.button.button-primary:focus,
+button.button-primary:focus,
+input[type="submit"].button-primary:focus,
+input[type="reset"].button-primary:focus,
+input[type="button"].button-primary:focus {
+ color: #FFF;
+ background-color: #1EAEDB;
+ border-color: #1EAEDB; }
+
+*/
+/* Forms
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+input[type="email"],
+input[type="number"],
+input[type="search"],
+input[type="text"],
+input[type="tel"],
+input[type="url"],
+input[type="password"],
+textarea,
+select {
+ height: 38px;
+ padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */
+ background-color: #fff;
+ border: 1px solid #D1D1D1;
+ border-radius: 4px;
+ box-shadow: none;
+ box-sizing: border-box; }
+/* Removes awkward default styles on some inputs for iOS */
+input[type="email"],
+input[type="number"],
+input[type="search"],
+input[type="text"],
+input[type="tel"],
+input[type="url"],
+input[type="password"],
+textarea {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none; }
+textarea {
+ min-height: 65px;
+ padding-top: 6px;
+ padding-bottom: 6px; }
+input[type="email"]:focus,
+input[type="number"]:focus,
+input[type="search"]:focus,
+input[type="text"]:focus,
+input[type="tel"]:focus,
+input[type="url"]:focus,
+input[type="password"]:focus,
+textarea:focus,
+select:focus {
+ border: 1px solid #33C3F0;
+ outline: 0; }
+label,
+legend {
+ display: block;
+ margin-bottom: .5rem;
+ font-weight: 600; }
+fieldset {
+ padding: 0;
+ border-width: 0; }
+input[type="checkbox"],
+input[type="radio"] {
+ display: inline; }
+label > .label-body {
+ display: inline-block;
+ margin-left: .5rem;
+ font-weight: normal; }
+
+
+/* Lists
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+ul {
+ list-style: circle inside; }
+ol {
+ list-style: decimal inside; }
+ol, ul {
+ padding-left: 0;
+ margin-top: 0; }
+ul ul,
+ul ol,
+ol ol,
+ol ul {
+ margin: 1.5rem 0 1.5rem 3rem;
+ font-size: 90%; }
+li {
+ margin-bottom: 1rem; }
+
+
+/* Code
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+code {
+ padding: .2rem .5rem;
+ margin: 0 .2rem;
+ font-size: 90%;
+ white-space: nowrap;
+ background: #F1F1F1;
+ border: 1px solid #E1E1E1;
+ border-radius: 4px; }
+pre > code {
+ display: block;
+ padding: 1rem 1.5rem;
+ white-space: pre; }
+
+
+/* Tables
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+th,
+td {
+ padding: 12px 15px;
+ text-align: left;
+ border-bottom: 1px solid #E1E1E1; }
+th:first-child,
+td:first-child {
+ padding-left: 0; }
+th:last-child,
+td:last-child {
+ padding-right: 0; }
+
+
+/* Spacing
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+button,
+.button {
+ margin-bottom: 1rem; }
+input,
+textarea,
+select,
+fieldset {
+ margin-bottom: 1.5rem; }
+pre,
+blockquote,
+dl,
+figure,
+table,
+p,
+ul,
+ol,
+form {
+ margin-bottom: 2.5rem; }
+
+
+/* Utilities
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+.u-full-width {
+ width: 100%;
+ box-sizing: border-box; }
+.u-max-full-width {
+ max-width: 100%;
+ box-sizing: border-box; }
+.u-pull-right {
+ float: right; }
+.u-pull-left {
+ float: left; }
+
+
+/* Misc
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+hr {
+ margin-top: 3rem;
+ margin-bottom: 3.5rem;
+ border-width: 0;
+ border-top: 1px solid #E1E1E1; }
+
+
+/* Clearing
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+
+/* Self Clearing Goodness */
+.container:after,
+.row:after,
+.u-cf {
+ content: "";
+ display: table;
+ clear: both; }
+
+
+/* Media Queries
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+/*
+Note: The best way to structure the use of media queries is to create the queries
+near the relevant code. For example, if you wanted to change the styles for buttons
+on small devices, paste the mobile query code up in the buttons section and style it
+there.
+*/
+
+
+/* Larger than mobile */
+@media (min-width: 400px) {}
+
+/* Larger than phablet (also point when grid becomes active) */
+@media (min-width: 550px) {}
+
+/* Larger than tablet */
+@media (min-width: 750px) {}
+
+/* Larger than desktop */
+@media (min-width: 1000px) {}
+
+/* Larger than Desktop HD */
+@media (min-width: 1200px) {}
diff --git a/tinasharma/app/sass/utils/_functions.scss b/tinasharma/app/sass/utils/_functions.scss
new file mode 100644
index 0000000..5ce961c
--- /dev/null
+++ b/tinasharma/app/sass/utils/_functions.scss
@@ -0,0 +1,14 @@
+%large-type {
+ font-size: 65 / 17 * 1em;
+ line-height: 1.17391em;
+ margin-bottom: 0.3913em;
+ color: #2F4F4F;
+}
+
+@mixin default-box {
+ border: 1px solid black;
+ box-shadow: 5px 5px 5px black;
+ width: 75%;
+ margin-left: 80px;
+
+}
diff --git a/tinasharma/app/sass/utils/_variables.scss b/tinasharma/app/sass/utils/_variables.scss
new file mode 100644
index 0000000..2b62b2c
--- /dev/null
+++ b/tinasharma/app/sass/utils/_variables.scss
@@ -0,0 +1,6 @@
+$font-stack: Helvetica, sans-serif;
+$primary-color: #5F9EA0;
+
+$background-color: #FFE4E1;
+$text-color: #2693ff;
+$border-color: $background-color + $text-color;
diff --git a/tinasharma/gulpfile.js b/tinasharma/gulpfile.js
new file mode 100644
index 0000000..4f75f85
--- /dev/null
+++ b/tinasharma/gulpfile.js
@@ -0,0 +1,60 @@
+var gulp = require('gulp');
+var webpack = require('webpack-stream');
+var minifyCss = require('gulp-minify-css');
+var concatCSS = require('gulp-concat-css');
+var gulpWatch = require('gulp-watch');
+var sass = require('gulp-sass');
+var maps = require('gulp-sourcemaps');
+
+gulp.task('static:dev',function() {
+ gulp.src('app/**/*.html')
+ .pipe(gulp.dest('build/'));
+});
+
+// gulp.task('css:dev', function() {
+// return gulp.src([
+// 'app/css/reset.css',
+// 'app/css/base.css',
+// 'app/css/layout.css',
+// 'app/css/module.css',
+// 'app/css/state.css',])
+// .pipe(concatCss('styles.min.css'))
+// .pipe(minifyCss())
+// .pipe(gulp.dest('build/'));
+// });
+
+gulp.task('sass:dev', function() {
+ gulp.src('./app/sass/**/*.scss')
+ .pipe(maps.init())
+ .pipe(sass().on('error', sass.logError))
+ .pipe(minifyCss())
+ .pipe(maps.write('./'))
+ .pipe(gulp.dest('build/'));
+});
+
+gulp.task('sass:watch', function() {
+ gulp.watch(['./app/sass/**/*.scss', './app/index.html'],['sass:dev', 'static:dev']);
+});
+
+gulp.task('webpack:dev',function() {
+ return gulp.src('app/js/entry.js')
+ .pipe(webpack({
+ output: {
+ filename: 'bundle.js'
+ }
+ }))
+ .pipe(gulp.dest('build/'));
+});
+
+gulp.task('webpack:test', function() {
+ return gulp.src('test/client/test_entry.js')
+ .pipe(webpack({
+ output: {
+ filename: 'test_bundle.js'
+ }
+ }))
+ .pipe(gulp.dest('test/client/'));
+});
+
+gulp.task('build:dev', ['webpack:dev', 'static:dev', 'sass:dev']);
+gulp.task('default', ['build:dev']);
diff --git a/tinasharma/karma.conf.js b/tinasharma/karma.conf.js
new file mode 100644
index 0000000..7efea19
--- /dev/null
+++ b/tinasharma/karma.conf.js
@@ -0,0 +1,69 @@
+// Karma configuration
+// Generated on Thu Dec 03 2015 10:08:49 GMT-0800 (PST)
+
+module.exports = function(config) {
+ config.set({
+
+ // base path that will be used to resolve all patterns (eg. files, exclude)
+ basePath: '',
+
+
+ // frameworks to use
+ // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
+ frameworks: ['jasmine'],
+
+
+ // list of files / patterns to load in the browser
+ files: [
+ 'test/client/test_bundle.js'
+ ],
+
+
+ // list of files to exclude
+ exclude: [
+ ],
+
+
+ // preprocess matching files before serving them to the browser
+ // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
+ preprocessors: {
+ },
+
+
+ // test results reporter to use
+ // possible values: 'dots', 'progress'
+ // available reporters: https://npmjs.org/browse/keyword/karma-reporter
+ reporters: ['progress'],
+
+
+ // web server port
+ port: 9876,
+
+
+ // enable / disable colors in the output (reporters and logs)
+ colors: true,
+
+
+ // level of logging
+ // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
+ logLevel: config.LOG_INFO,
+
+
+ // enable / disable watching file and executing tests whenever any file changes
+ autoWatch: false,
+
+
+ // start these browsers
+ // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
+ browsers: ['PhantomJS'],
+
+
+ // Continuous Integration mode
+ // if true, Karma captures browsers, runs the tests and exits
+ singleRun: true,
+
+ // Concurrency level
+ // how many browser should be started simultanous
+ concurrency: Infinity
+ })
+}
diff --git a/tinasharma/models/parcel.js b/tinasharma/models/parcel.js
index 7518efe..134e97e 100644
--- a/tinasharma/models/parcel.js
+++ b/tinasharma/models/parcel.js
@@ -1,11 +1,11 @@
var mongoose = require('mongoose');
var parcelSchema = new mongoose.Schema({
+ name: String, //name of mailman
item: {type: String, default: 'mailing_packet'},
- size: String,
+ size: String, //small, medium, large
weight: {type: Number, max: 10},
location: {type: String, default: 'Seattle'}
});
module.exports = mongoose.model('Parcel', parcelSchema);
-
diff --git a/tinasharma/package.json b/tinasharma/package.json
index ba17cae..fcf8007 100644
--- a/tinasharma/package.json
+++ b/tinasharma/package.json
@@ -9,13 +9,30 @@
"author": "",
"license": "MIT",
"dependencies": {
+ "bcrypt": "latest",
"body-parser": "^1.14.1",
+ "eat": "^0.1.1",
"express": "^4.13.3",
"mongoose": "^4.2.5"
},
"devDependencies": {
+ "angular": "^1.4.8",
+ "angular-mocks": "^1.4.8",
"chai": "^3.4.1",
"chai-http": "^1.0.0",
- "mocha": "^2.3.3"
+ "gulp": "^3.9.0",
+ "gulp-autoprefixer": "^3.1.0",
+ "gulp-concat-css": "^2.2.0",
+ "gulp-minify-css": "^1.2.2",
+ "gulp-sass": "^2.1.0",
+ "gulp-sourcemaps": "^1.6.0",
+ "gulp-watch": "^4.3.5",
+ "jasmine-core": "^2.4.0",
+ "karma": "^0.13.15",
+ "karma-jasmine": "^0.3.6",
+ "karma-phantomjs-launcher": "^0.2.1",
+ "mocha": "^2.3.3",
+ "phantomjs": "^1.9.19",
+ "webpack-stream": "^2.2.0"
}
}
diff --git a/tinasharma/routes/parcels_routes.js b/tinasharma/routes/parcels_routes.js
index 7a9aec3..2fc9cb8 100644
--- a/tinasharma/routes/parcels_routes.js
+++ b/tinasharma/routes/parcels_routes.js
@@ -2,7 +2,6 @@ var express = require('express');
var bodyParser = require('body-parser');
var Parcel = require(__dirname + '/../models/parcel.js');
var handleError = require(__dirname + '/../lib/handleServerError.js');
-
var parcelsRouter = module.exports = exports = express.Router();
parcelsRouter.get('/parcels', function(req, res) {
diff --git a/tinasharma/server.js b/tinasharma/server.js
index 4ae8fa4..78ae543 100644
--- a/tinasharma/server.js
+++ b/tinasharma/server.js
@@ -1,10 +1,12 @@
var mongoose = require('mongoose');
var express = require('express');
var app = express();
-var parcelsRouter = require(__dirname + '/routes/parcels_routes.js');
+var parcelsRouter = require(__dirname + '/routes/parcels_routes.js');
mongoose.connect(process.env.MONGOLAB_URI || 'mongodb://localhost/parcel_stream_dev');
+app.use(express.static(__dirname + '/build'));
+
app.use('/api', parcelsRouter);
app.listen(process.env.PORT || 3000, function() {
diff --git a/tinasharma/test/client/parcels_controller_tests.js b/tinasharma/test/client/parcels_controller_tests.js
new file mode 100644
index 0000000..ff5096e
--- /dev/null
+++ b/tinasharma/test/client/parcels_controller_tests.js
@@ -0,0 +1,71 @@
+require(__dirname + '/../../app/js/entry.js');
+require('angular-mocks');
+
+describe('parcels controller', function() {
+ var $httpBackend;
+ var $ControllerConstructor;
+ var $scope;
+
+ beforeEach(angular.mock.module('ParcelStreamApp'));
+
+ beforeEach(angular.mock.inject(function($rootScope, $controller) {
+ $scope = $rootScope.$new();
+ $ControllerConstructor = $controller;
+ }));
+
+ it('should be able to create a controller', function() {
+ var controller = $ControllerConstructor('ParcelsController', {$scope: $scope});
+ expect(typeof $scope).toBe('object');
+ expect(typeof controller).toBe('object');
+ expect(Array.isArray($scope.parcels)).toBe(true);
+ });
+
+ describe('REST request functions', function() {
+ beforeEach(angular.mock.inject(function(_$httpBackend_, $rootScope) {
+ $httpBackend = _$httpBackend_;
+ $scope = $rootScope.$new();
+ $ControllerConstructor('ParcelsController', {$scope: $scope});
+ }));
+
+ afterEach(function() {
+ $httpBackend.verifyNoOutstandingExpectation();
+ $httpBackend.verifyNoOutstandingRequest();
+ });
+
+ it('should add an array to parcels with a GET all', function() {
+ $httpBackend.expectGET('/api/parcels').respond(200, [{_id:1, name: 'test parcel'}]);
+ $scope.getAll();
+ $httpBackend.flush();
+ expect($scope.parcels[0].name).toBe('test parcel');
+ });
+
+ it('should be able to create a new parcel', function() {
+ $httpBackend.expectPOST('/api/parcels', {name: 'test parcel', size: 'small', weight: '3'}).respond(200, {name: 'a different parcel'});
+ expect($scope.parcels.length).toBe(0);
+ expect($scope.newParcel).toEqual($scope.defaults);
+ $scope.newParcel.name = 'test parcel';
+ $scope.create($scope.newParcel);
+ $httpBackend.flush();
+ expect($scope.parcels[0].name).toBe('a different parcel');
+ expect($scope.newParcel).toEqual($scope.defaults);
+ });
+
+ it('should be able to update a parcel', function() {
+ $scope.parcels = [{_id: 123, name: 'test parcel'}];
+ $httpBackend.expectPUT('/api/parcels/' + $scope.parcels[0]._id, {_id: 123, name: 'test parcel', editing: false}).respond(200, {name: 'a very different parcel'});
+ $scope.update($scope.parcels[0]);
+ $httpBackend.flush();
+ expect($scope.parcels[0].name).toBe('test parcel');
+ expect($scope.parcels[0].editing).toBe(false);
+ });
+
+ it('should be able to delete a parcel', function() {
+ $scope.parcels = [{_id: 123, name: 'test parcel'}];
+ $httpBackend.expectDELETE('/api/parcels/' + $scope.parcels[0]._id).respond(200);
+ $scope.remove($scope.parcels[0]);
+ $httpBackend.flush();
+ expect($scope.parcels.length).toBe(0);
+ });
+
+ });
+});
diff --git a/tinasharma/test/client/test_entry.js b/tinasharma/test/client/test_entry.js
new file mode 100644
index 0000000..c891bf1
--- /dev/null
+++ b/tinasharma/test/client/test_entry.js
@@ -0,0 +1 @@
+require('./parcels_controller_tests.js');