diff --git a/dist/index.html b/dist/index.html index 559b18ecd..f4d3079f9 100644 --- a/dist/index.html +++ b/dist/index.html @@ -5,8 +5,119 @@ Backbone Baseline + +
- + +
+
+
    +
+
+ + + + + +
+

Database Results

+ + + + + + + + + + + + +
+ img + + Title + + release date + + status +
+ +
+ +
+

Catalog List

+
    + +
+
+ +
+ + + + + + +
diff --git a/package-lock.json b/package-lock.json index 2d3371d51..0962796f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3045,9 +3045,9 @@ "dev": true }, "foundation-sites": { - "version": "6.4.4-rc1", - "resolved": "https://registry.npmjs.org/foundation-sites/-/foundation-sites-6.4.4-rc1.tgz", - "integrity": "sha512-26cL66QFNqMVwM7bmIEqq4jiW+6CkIeW719ci1pchdJ4UK0Om+3Jl7MhkX/lzdzRHB75f2m1IK9lxk3JGOwApA==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/foundation-sites/-/foundation-sites-6.3.1.tgz", + "integrity": "sha1-I4Uzct65SAwTtCZJnq8Mj5DNvh0=", "requires": { "jquery": "3.2.1", "what-input": "4.3.1" diff --git a/package.json b/package.json index 97144b128..e5071c617 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ }, "dependencies": { "backbone": "^1.3.3", - "foundation-sites": "^6.4.4-rc1", + "foundation-sites": "^6.3.1", "jquery": "^3.2.1", "underscore": "^1.8.3" } diff --git a/spec/movie_spec.js b/spec/movie_spec.js new file mode 100644 index 000000000..e69de29bb diff --git a/src/app.js b/src/app.js index 30c00d594..2d4747578 100644 --- a/src/app.js +++ b/src/app.js @@ -2,13 +2,67 @@ import 'css/_settings.css'; import 'foundation-sites/dist/css/foundation.css'; import './css/styles.css'; +import Movie from 'models/movie'; +import MovieList from 'collections/movie_list'; +import MovieView from 'views/movie_view'; +import MovieListView from 'views/movie_list_view'; +import DatabaseListView from 'views/database_list_view' + // Import jQuery & Underscore import $ from 'jquery'; import _ from 'underscore'; + + +// let database = new MovieList(); +let catalog = new MovieList([], {}); + + +const $catalogTemplate = _.template($("#catalog-template").html()); +const $databaseTemplate = _.template($("#database-template").html()); + // ready to go $(document).ready(function() { + catalog.fetch({ + success: function(response) { + response.models.forEach((model) => { + model.attributes.models + }) + } + }); + + const catalogView = new MovieListView({ + model: catalog, + template: $catalogTemplate, + el: 'main', + }); + + + + $('.btn-query').click(function(event){ + event.preventDefault(); + console.log('submit button was clicked'); + let query = $(`[name='query']`).val(); + + if (query.length > 0) { + let database = new MovieList([], { + query: query, + }); + + let databaseView = new DatabaseListView({ + model: database, + template: $databaseTemplate, + el: 'main', + availableInventory: catalog + }); + + database.fetch(); + } else { + $('.form-errors').append('

There were no results

') + } + + }); + - $('#main-content').append('

Hello World!

'); }); diff --git a/src/collections/movie_list.js b/src/collections/movie_list.js new file mode 100644 index 000000000..76a814e00 --- /dev/null +++ b/src/collections/movie_list.js @@ -0,0 +1,20 @@ +import Backbone from 'backbone'; +import Movie from '../models/movie'; + +const MovieList = Backbone.Collection.extend({ + urlRoot: 'http://localhost:3000/movies', + initialize(models, options){ + this.query = options.query + }, + url: function() { + if (this.query && this.query.length > 1) { + return this.urlRoot + '/?query=' + this.query + } else { + return this.urlRoot + } + }, + model: Movie, + +}); + +export default MovieList; diff --git a/src/css/styles.css b/src/css/styles.css index 68a79a569..0848b80a0 100644 --- a/src/css/styles.css +++ b/src/css/styles.css @@ -1,12 +1,87 @@ @include foundation-everything; +* { + padding: 0; + margin: 0; + box-sizing: border-box; +} +body { + color: #465362; + padding: 10px; +} + +h1 { + font-size: 2em; + padding-top: 25px; +} + +h1, h2, h3 { + text-align: center; +} + main { - background: lightblue; + background: white; + margin: 10px; +} + +nav { + background: #C3DFE0; + position: sticky; + box-shadow: 0 2px 3px -2px #465362; +} +input[type="text"], input[type="text"]:focus { + margin: 0; + padding-left: 5px; + font-size: 1.25em; + width: 100%; + border-width: 0; + box-shadow: 0 -2px -5px -2px #465362; +} + +input[type="text"]:focus{ + box-shadow: 0 1px 5px 1px #8CD195; +} + +article { + margin: 20px 0; +} + +table td, #database-container h2 { + color: #465362; +} + +#database-container, #catalog-container { + background: #C3DFE0; + color: #233831; + /* border: 1px solid #ADA8B6; */ + box-shadow: 0 -2px 5px -2px #465362; +} +#database-container { + background: #C2DC85; +} + +ul#catalog-movies { + list-style-type: none; +} + +.catalog-movie { + background: white; + margin: 15px 0; + box-shadow: 0 2px 5px -2px #465362; +} +.catalog-movie span{ + font-weight: bold; } -header { - background-color: lightgreen; - padding: 0.5rem; +#title-image{ + display: block; + text-align: center; +} +#title-image img { + width: 100%; +} +#overview { + padding-top: 10px; } #completed-checkbox { @@ -37,8 +112,27 @@ aside label { div { display: inline; } -/* -* { - border-style: solid; + + +h3 { + background: #BCD979; + box-shadow: 0 2px 5px -2px #465362; } -*/ + +h4 { + text-align: center; +} + +#database-container { + height: 40vw; + overflow: scroll; +} + +#catalog-container { + height: 40vw; + overflow: scroll; +} +/* +button.btn-add.alreadyAdded { + background: grey; +} */ diff --git a/src/models/movie.js b/src/models/movie.js new file mode 100644 index 000000000..2a04d698d --- /dev/null +++ b/src/models/movie.js @@ -0,0 +1,7 @@ +import Backbone from 'backbone'; + +const Movie = Backbone.Model.extend({ + // urlRoot: 'https://localhost:3000/movies/' +}); + +export default Movie; diff --git a/src/views/database_list_view.js b/src/views/database_list_view.js new file mode 100644 index 000000000..1c1081183 --- /dev/null +++ b/src/views/database_list_view.js @@ -0,0 +1,50 @@ +import Backbone from 'backbone'; +import _ from 'underscore'; +import Movie from '../models/movie'; +import MovieView from '../views/movie_view' + +const DatabaseListView = Backbone.View.extend({ + initialize(params) { + this.template = params.template; + this.listenTo(this.model, 'update', this.render); + this.inventory = params.availableInventory; + }, + + render() { + this.$('#database-movies').empty(); + this.$('.form-errors').empty(); + this.model.forEach((movie) => { + let inventory = false; + this.inventory.forEach((availableMovie) => { + if (availableMovie.get('overview') === movie.get('overview')) { + inventory = true + } + // movie.set('inInventory', inventory); + }) + + const movieView = new MovieView({ + model: movie, + inventory: this.inventory, + template: this.template, + tagName: 'tr', + className: 'movie', + }); + + movieView.model.set('inInventory', inventory) + this.$('#database-movies').append(movieView.render().$el); + + }); + }, + updateStatusMessageFrom: function(messageHash) { + const errorMessageEl = this.$('.form-errors'); + errorMessageEl.empty(); + _.each(messageHash, (messageType) => { + messageType.forEach((message) => { + errorMessageEl.append(`

${message}

`); + }); + }); + }, + +}); + +export default DatabaseListView; diff --git a/src/views/movie_list_view.js b/src/views/movie_list_view.js new file mode 100644 index 000000000..8374e2c59 --- /dev/null +++ b/src/views/movie_list_view.js @@ -0,0 +1,26 @@ +import Backbone from 'backbone'; +import _ from 'underscore'; +import MovieView from '../views/movie_view' + +const MovieListView = Backbone.View.extend({ + initialize(params) { + this.template = params.template; + this.listenTo(this.model, 'update', this.render); + }, + + render() { + this.$('#catalog-movies').empty(); + this.model.forEach((movie) => { + const movieView = new MovieView({ + model: movie, + template: this.template, + tagName: 'li', + className: 'movie' + }); + + this.$('#catalog-movies').prepend(movieView.render().$el); + }); + }, +}); + +export default MovieListView; diff --git a/src/views/movie_view.js b/src/views/movie_view.js new file mode 100644 index 000000000..6efb63c23 --- /dev/null +++ b/src/views/movie_view.js @@ -0,0 +1,60 @@ +import $ from 'jquery'; +import Backbone from 'backbone'; +import Movie from '../models/movie'; + +const MovieView = Backbone.View.extend({ + initialize(params) { + this.template = params.template; + this.listenTo(this.model, 'change', this.render); + this.inCatalog = params.inInventory; + this.inventory = params.inventory; + }, + render() { + const compiledTemplate = this.template(this.model.toJSON()); + this.$el.html(compiledTemplate); + return this; + }, + events: { + 'click .btn-add': 'addToInventory', + }, + + addToInventory: function(e) { + e.preventDefault(); + // this.$('button.btn-add').toggleClass('button.btn-add.alreadyAdded') + this.$('button.btn-add').css({"background": "grey"}) + if (this.model.get("inInventory")) { + console.log("already exists in inventory"); + console.log(this.$el); + } else { + this.model.set('inInventory', 'true') + this.$('button.btn-add').css({"background": "grey"}) + const databaseInfo = { + title: this.model.get("title"), + image_url: this.model.get("image_url").slice(32), + overview: this.model.get("overview"), + release_date: this.model.get("release_date"), + inInventory: true, + }; + + const addMovieFromDatabase = new Movie(databaseInfo); + if (addMovieFromDatabase.isValid()) { + this.inventory.add(addMovieFromDatabase); + addMovieFromDatabase.save({}, { + success: function(response){ + console.log("yes, added to db probably") + }, + error: function(response){ + console.log("not added i think") + }, + }); + } + } + }, + // successfulSave(addMovieFromDatabase, response) { + // $('.form-errors ul').empty(); + // $('.form-errors ul').append(`
  • ${addMovieFromDatabase.get('title')} was added to your catalog!
  • `); + // }, + +}); + +export default MovieView;