Browse Source

switch to rollupjs

master
wes 7 years ago
parent
commit
b104252a46
  1. 389
      config.json
  2. 8
      fabfile.py
  3. 12
      package.json
  4. 16
      rollup.config.js
  5. 1
      src/scripts/book.tag
  6. 13
      src/scripts/class.tag
  7. 43
      src/scripts/helpers.js
  8. 4
      src/scripts/results.tag
  9. 51
      src/scripts/search.js
  10. 19
      src/scripts/search.tag
  11. 114
      src/scripts/tags.js
  12. 6
      src/templates/search.html
  13. 5
      watch.sh

389
config.json

@ -0,0 +1,389 @@
{
"vars": {
"@gray-base": "#000",
"@gray-darker": "lighten(@gray-base, 13.5%)",
"@gray-dark": "lighten(@gray-base, 20%)",
"@gray": "lighten(@gray-base, 33.5%)",
"@gray-light": "lighten(@gray-base, 46.7%)",
"@gray-lighter": "lighten(@gray-base, 93.5%)",
"@brand-primary": "darken(#428bca, 6.5%)",
"@brand-success": "#5cb85c",
"@brand-info": "#5bc0de",
"@brand-warning": "#f0ad4e",
"@brand-danger": "#d9534f",
"@body-bg": "#fff",
"@text-color": "@gray-dark",
"@link-color": "@brand-primary",
"@link-hover-color": "darken(@link-color, 15%)",
"@link-hover-decoration": "underline",
"@font-family-sans-serif": "\"Helvetica Neue\", Helvetica, Arial, sans-serif",
"@font-family-serif": "Georgia, \"Times New Roman\", Times, serif",
"@font-family-monospace": "Menlo, Monaco, Consolas, \"Courier New\", monospace",
"@font-family-base": "@font-family-sans-serif",
"@font-size-base": "14px",
"@font-size-large": "ceil((@font-size-base * 1.25))",
"@font-size-small": "ceil((@font-size-base * 0.85))",
"@font-size-h1": "floor((@font-size-base * 2.6))",
"@font-size-h2": "floor((@font-size-base * 2.15))",
"@font-size-h3": "ceil((@font-size-base * 1.7))",
"@font-size-h4": "ceil((@font-size-base * 1.25))",
"@font-size-h5": "@font-size-base",
"@font-size-h6": "ceil((@font-size-base * 0.85))",
"@line-height-base": "1.428571429",
"@line-height-computed": "floor((@font-size-base * @line-height-base))",
"@headings-font-family": "inherit",
"@headings-font-weight": "500",
"@headings-line-height": "1.1",
"@headings-color": "inherit",
"@icon-font-path": "\"../fonts/\"",
"@icon-font-name": "\"glyphicons-halflings-regular\"",
"@icon-font-svg-id": "\"glyphicons_halflingsregular\"",
"@padding-base-vertical": "6px",
"@padding-base-horizontal": "12px",
"@padding-large-vertical": "10px",
"@padding-large-horizontal": "16px",
"@padding-small-vertical": "5px",
"@padding-small-horizontal": "10px",
"@padding-xs-vertical": "1px",
"@padding-xs-horizontal": "5px",
"@line-height-large": "1.3333333",
"@line-height-small": "1.5",
"@border-radius-base": "4px",
"@border-radius-large": "6px",
"@border-radius-small": "3px",
"@component-active-color": "#fff",
"@component-active-bg": "@brand-primary",
"@caret-width-base": "4px",
"@caret-width-large": "5px",
"@table-cell-padding": "8px",
"@table-condensed-cell-padding": "5px",
"@table-bg": "transparent",
"@table-bg-accent": "#f9f9f9",
"@table-bg-hover": "#f5f5f5",
"@table-bg-active": "@table-bg-hover",
"@table-border-color": "#ddd",
"@btn-font-weight": "normal",
"@btn-default-color": "#333",
"@btn-default-bg": "#fff",
"@btn-default-border": "#ccc",
"@btn-primary-color": "#fff",
"@btn-primary-bg": "@brand-primary",
"@btn-primary-border": "darken(@btn-primary-bg, 5%)",
"@btn-success-color": "#fff",
"@btn-success-bg": "@brand-success",
"@btn-success-border": "darken(@btn-success-bg, 5%)",
"@btn-info-color": "#fff",
"@btn-info-bg": "@brand-info",
"@btn-info-border": "darken(@btn-info-bg, 5%)",
"@btn-warning-color": "#fff",
"@btn-warning-bg": "@brand-warning",
"@btn-warning-border": "darken(@btn-warning-bg, 5%)",
"@btn-danger-color": "#fff",
"@btn-danger-bg": "@brand-danger",
"@btn-danger-border": "darken(@btn-danger-bg, 5%)",
"@btn-link-disabled-color": "@gray-light",
"@btn-border-radius-base": "@border-radius-base",
"@btn-border-radius-large": "@border-radius-large",
"@btn-border-radius-small": "@border-radius-small",
"@input-bg": "#fff",
"@input-bg-disabled": "@gray-lighter",
"@input-color": "@gray",
"@input-border": "#ccc",
"@input-border-radius": "@border-radius-base",
"@input-border-radius-large": "@border-radius-large",
"@input-border-radius-small": "@border-radius-small",
"@input-border-focus": "#66afe9",
"@input-color-placeholder": "#999",
"@input-height-base": "(@line-height-computed + (@padding-base-vertical * 2) + 2)",
"@input-height-large": "(ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2)",
"@input-height-small": "(floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2)",
"@form-group-margin-bottom": "15px",
"@legend-color": "@gray-dark",
"@legend-border-color": "#e5e5e5",
"@input-group-addon-bg": "@gray-lighter",
"@input-group-addon-border-color": "@input-border",
"@cursor-disabled": "not-allowed",
"@dropdown-bg": "#fff",
"@dropdown-border": "rgba(0,0,0,.15)",
"@dropdown-fallback-border": "#ccc",
"@dropdown-divider-bg": "#e5e5e5",
"@dropdown-link-color": "@gray-dark",
"@dropdown-link-hover-color": "darken(@gray-dark, 5%)",
"@dropdown-link-hover-bg": "#f5f5f5",
"@dropdown-link-active-color": "@component-active-color",
"@dropdown-link-active-bg": "@component-active-bg",
"@dropdown-link-disabled-color": "@gray-light",
"@dropdown-header-color": "@gray-light",
"@dropdown-caret-color": "#000",
"@screen-xs": "480px",
"@screen-xs-min": "@screen-xs",
"@screen-phone": "@screen-xs-min",
"@screen-sm": "768px",
"@screen-sm-min": "@screen-sm",
"@screen-tablet": "@screen-sm-min",
"@screen-md": "992px",
"@screen-md-min": "@screen-md",
"@screen-desktop": "@screen-md-min",
"@screen-lg": "1200px",
"@screen-lg-min": "@screen-lg",
"@screen-lg-desktop": "@screen-lg-min",
"@screen-xs-max": "(@screen-sm-min - 1)",
"@screen-sm-max": "(@screen-md-min - 1)",
"@screen-md-max": "(@screen-lg-min - 1)",
"@grid-columns": "12",
"@grid-gutter-width": "30px",
"@grid-float-breakpoint": "@screen-sm-min",
"@grid-float-breakpoint-max": "(@grid-float-breakpoint - 1)",
"@container-tablet": "(720px + @grid-gutter-width)",
"@container-sm": "@container-tablet",
"@container-desktop": "(940px + @grid-gutter-width)",
"@container-md": "@container-desktop",
"@container-large-desktop": "(1140px + @grid-gutter-width)",
"@container-lg": "@container-large-desktop",
"@navbar-height": "50px",
"@navbar-margin-bottom": "@line-height-computed",
"@navbar-border-radius": "@border-radius-base",
"@navbar-padding-horizontal": "floor((@grid-gutter-width / 2))",
"@navbar-padding-vertical": "((@navbar-height - @line-height-computed) / 2)",
"@navbar-collapse-max-height": "340px",
"@navbar-default-color": "#777",
"@navbar-default-bg": "#f8f8f8",
"@navbar-default-border": "darken(@navbar-default-bg, 6.5%)",
"@navbar-default-link-color": "#777",
"@navbar-default-link-hover-color": "#333",
"@navbar-default-link-hover-bg": "transparent",
"@navbar-default-link-active-color": "#555",
"@navbar-default-link-active-bg": "darken(@navbar-default-bg, 6.5%)",
"@navbar-default-link-disabled-color": "#ccc",
"@navbar-default-link-disabled-bg": "transparent",
"@navbar-default-brand-color": "@navbar-default-link-color",
"@navbar-default-brand-hover-color": "darken(@navbar-default-brand-color, 10%)",
"@navbar-default-brand-hover-bg": "transparent",
"@navbar-default-toggle-hover-bg": "#ddd",
"@navbar-default-toggle-icon-bar-bg": "#888",
"@navbar-default-toggle-border-color": "#ddd",
"@navbar-inverse-color": "lighten(@gray-light, 15%)",
"@navbar-inverse-bg": "#222",
"@navbar-inverse-border": "darken(@navbar-inverse-bg, 10%)",
"@navbar-inverse-link-color": "lighten(@gray-light, 15%)",
"@navbar-inverse-link-hover-color": "#fff",
"@navbar-inverse-link-hover-bg": "transparent",
"@navbar-inverse-link-active-color": "@navbar-inverse-link-hover-color",
"@navbar-inverse-link-active-bg": "darken(@navbar-inverse-bg, 10%)",
"@navbar-inverse-link-disabled-color": "#444",
"@navbar-inverse-link-disabled-bg": "transparent",
"@navbar-inverse-brand-color": "@navbar-inverse-link-color",
"@navbar-inverse-brand-hover-color": "#fff",
"@navbar-inverse-brand-hover-bg": "transparent",
"@navbar-inverse-toggle-hover-bg": "#333",
"@navbar-inverse-toggle-icon-bar-bg": "#fff",
"@navbar-inverse-toggle-border-color": "#333",
"@nav-link-padding": "10px 15px",
"@nav-link-hover-bg": "@gray-lighter",
"@nav-disabled-link-color": "@gray-light",
"@nav-disabled-link-hover-color": "@gray-light",
"@nav-tabs-border-color": "#ddd",
"@nav-tabs-link-hover-border-color": "@gray-lighter",
"@nav-tabs-active-link-hover-bg": "@body-bg",
"@nav-tabs-active-link-hover-color": "@gray",
"@nav-tabs-active-link-hover-border-color": "#ddd",
"@nav-tabs-justified-link-border-color": "#ddd",
"@nav-tabs-justified-active-link-border-color": "@body-bg",
"@nav-pills-border-radius": "@border-radius-base",
"@nav-pills-active-link-hover-bg": "@component-active-bg",
"@nav-pills-active-link-hover-color": "@component-active-color",
"@pagination-color": "@link-color",
"@pagination-bg": "#fff",
"@pagination-border": "#ddd",
"@pagination-hover-color": "@link-hover-color",
"@pagination-hover-bg": "@gray-lighter",
"@pagination-hover-border": "#ddd",
"@pagination-active-color": "#fff",
"@pagination-active-bg": "@brand-primary",
"@pagination-active-border": "@brand-primary",
"@pagination-disabled-color": "@gray-light",
"@pagination-disabled-bg": "#fff",
"@pagination-disabled-border": "#ddd",
"@pager-bg": "@pagination-bg",
"@pager-border": "@pagination-border",
"@pager-border-radius": "15px",
"@pager-hover-bg": "@pagination-hover-bg",
"@pager-active-bg": "@pagination-active-bg",
"@pager-active-color": "@pagination-active-color",
"@pager-disabled-color": "@pagination-disabled-color",
"@jumbotron-padding": "30px",
"@jumbotron-color": "inherit",
"@jumbotron-bg": "@gray-lighter",
"@jumbotron-heading-color": "inherit",
"@jumbotron-font-size": "ceil((@font-size-base * 1.5))",
"@jumbotron-heading-font-size": "ceil((@font-size-base * 4.5))",
"@state-success-text": "#3c763d",
"@state-success-bg": "#dff0d8",
"@state-success-border": "darken(spin(@state-success-bg, -10), 5%)",
"@state-info-text": "#31708f",
"@state-info-bg": "#d9edf7",
"@state-info-border": "darken(spin(@state-info-bg, -10), 7%)",
"@state-warning-text": "#8a6d3b",
"@state-warning-bg": "#fcf8e3",
"@state-warning-border": "darken(spin(@state-warning-bg, -10), 5%)",
"@state-danger-text": "#a94442",
"@state-danger-bg": "#f2dede",
"@state-danger-border": "darken(spin(@state-danger-bg, -10), 5%)",
"@tooltip-max-width": "200px",
"@tooltip-color": "#fff",
"@tooltip-bg": "#000",
"@tooltip-opacity": ".9",
"@tooltip-arrow-width": "5px",
"@tooltip-arrow-color": "@tooltip-bg",
"@popover-bg": "#fff",
"@popover-max-width": "276px",
"@popover-border-color": "rgba(0,0,0,.2)",
"@popover-fallback-border-color": "#ccc",
"@popover-title-bg": "darken(@popover-bg, 3%)",
"@popover-arrow-width": "10px",
"@popover-arrow-color": "@popover-bg",
"@popover-arrow-outer-width": "(@popover-arrow-width + 1)",
"@popover-arrow-outer-color": "fadein(@popover-border-color, 5%)",
"@popover-arrow-outer-fallback-color": "darken(@popover-fallback-border-color, 20%)",
"@label-default-bg": "@gray-light",
"@label-primary-bg": "@brand-primary",
"@label-success-bg": "@brand-success",
"@label-info-bg": "@brand-info",
"@label-warning-bg": "@brand-warning",
"@label-danger-bg": "@brand-danger",
"@label-color": "#fff",
"@label-link-hover-color": "#fff",
"@modal-inner-padding": "15px",
"@modal-title-padding": "15px",
"@modal-title-line-height": "@line-height-base",
"@modal-content-bg": "#fff",
"@modal-content-border-color": "rgba(0,0,0,.2)",
"@modal-content-fallback-border-color": "#999",
"@modal-backdrop-bg": "#000",
"@modal-backdrop-opacity": ".5",
"@modal-header-border-color": "#e5e5e5",
"@modal-footer-border-color": "@modal-header-border-color",
"@modal-lg": "900px",
"@modal-md": "600px",
"@modal-sm": "300px",
"@alert-padding": "15px",
"@alert-border-radius": "@border-radius-base",
"@alert-link-font-weight": "bold",
"@alert-success-bg": "@state-success-bg",
"@alert-success-text": "@state-success-text",
"@alert-success-border": "@state-success-border",
"@alert-info-bg": "@state-info-bg",
"@alert-info-text": "@state-info-text",
"@alert-info-border": "@state-info-border",
"@alert-warning-bg": "@state-warning-bg",
"@alert-warning-text": "@state-warning-text",
"@alert-warning-border": "@state-warning-border",
"@alert-danger-bg": "@state-danger-bg",
"@alert-danger-text": "@state-danger-text",
"@alert-danger-border": "@state-danger-border",
"@progress-bg": "#f5f5f5",
"@progress-bar-color": "#fff",
"@progress-border-radius": "@border-radius-base",
"@progress-bar-bg": "@brand-primary",
"@progress-bar-success-bg": "@brand-success",
"@progress-bar-warning-bg": "@brand-warning",
"@progress-bar-danger-bg": "@brand-danger",
"@progress-bar-info-bg": "@brand-info",
"@list-group-bg": "#fff",
"@list-group-border": "#ddd",
"@list-group-border-radius": "@border-radius-base",
"@list-group-hover-bg": "#f5f5f5",
"@list-group-active-color": "@component-active-color",
"@list-group-active-bg": "@component-active-bg",
"@list-group-active-border": "@list-group-active-bg",
"@list-group-active-text-color": "lighten(@list-group-active-bg, 40%)",
"@list-group-disabled-color": "@gray-light",
"@list-group-disabled-bg": "@gray-lighter",
"@list-group-disabled-text-color": "@list-group-disabled-color",
"@list-group-link-color": "#555",
"@list-group-link-hover-color": "@list-group-link-color",
"@list-group-link-heading-color": "#333",
"@panel-bg": "#fff",
"@panel-body-padding": "15px",
"@panel-heading-padding": "10px 15px",
"@panel-footer-padding": "@panel-heading-padding",
"@panel-border-radius": "@border-radius-base",
"@panel-inner-border": "#ddd",
"@panel-footer-bg": "#f5f5f5",
"@panel-default-text": "@gray-dark",
"@panel-default-border": "#ddd",
"@panel-default-heading-bg": "#f5f5f5",
"@panel-primary-text": "#fff",
"@panel-primary-border": "@brand-primary",
"@panel-primary-heading-bg": "@brand-primary",
"@panel-success-text": "@state-success-text",
"@panel-success-border": "@state-success-border",
"@panel-success-heading-bg": "@state-success-bg",
"@panel-info-text": "@state-info-text",
"@panel-info-border": "@state-info-border",
"@panel-info-heading-bg": "@state-info-bg",
"@panel-warning-text": "@state-warning-text",
"@panel-warning-border": "@state-warning-border",
"@panel-warning-heading-bg": "@state-warning-bg",
"@panel-danger-text": "@state-danger-text",
"@panel-danger-border": "@state-danger-border",
"@panel-danger-heading-bg": "@state-danger-bg",
"@thumbnail-padding": "4px",
"@thumbnail-bg": "@body-bg",
"@thumbnail-border": "#ddd",
"@thumbnail-border-radius": "@border-radius-base",
"@thumbnail-caption-color": "@text-color",
"@thumbnail-caption-padding": "9px",
"@well-bg": "#f5f5f5",
"@well-border": "darken(@well-bg, 7%)",
"@badge-color": "#fff",
"@badge-link-hover-color": "#fff",
"@badge-bg": "@gray-light",
"@badge-active-color": "@link-color",
"@badge-active-bg": "#fff",
"@badge-font-weight": "bold",
"@badge-line-height": "1",
"@badge-border-radius": "10px",
"@breadcrumb-padding-vertical": "8px",
"@breadcrumb-padding-horizontal": "15px",
"@breadcrumb-bg": "#f5f5f5",
"@breadcrumb-color": "#ccc",
"@breadcrumb-active-color": "@gray-light",
"@breadcrumb-separator": "\"/\"",
"@carousel-text-shadow": "0 1px 2px rgba(0,0,0,.6)",
"@carousel-control-color": "#fff",
"@carousel-control-width": "15%",
"@carousel-control-opacity": ".5",
"@carousel-control-font-size": "20px",
"@carousel-indicator-active-bg": "#fff",
"@carousel-indicator-border-color": "#fff",
"@carousel-caption-color": "#fff",
"@close-font-weight": "bold",
"@close-color": "#000",
"@close-text-shadow": "0 1px 0 #fff",
"@code-color": "#c7254e",
"@code-bg": "#f9f2f4",
"@kbd-color": "#fff",
"@kbd-bg": "#333",
"@pre-bg": "#f5f5f5",
"@pre-color": "@gray-dark",
"@pre-border-color": "#ccc",
"@pre-scrollable-max-height": "340px",
"@component-offset-horizontal": "180px",
"@text-muted": "@gray-light",
"@abbr-border-color": "@gray-light",
"@headings-small-color": "@gray-light",
"@blockquote-small-color": "@gray-light",
"@blockquote-font-size": "(@font-size-base * 1.25)",
"@blockquote-border-color": "@gray-lighter",
"@page-header-border-color": "@gray-lighter",
"@dl-horizontal-offset": "@component-offset-horizontal",
"@dl-horizontal-breakpoint": "@grid-float-breakpoint",
"@hr-border": "@gray-lighter"
},
"css": [
"responsive-utilities.less"
],
"js": [],
"customizerUrl": "https://getbootstrap.com/customize/?id=d32a97d05a9759eaf2e6b0452078ee0d"
}

8
fabfile.py

@ -6,6 +6,11 @@ import fabric.operations as op
env.hosts = ["wes@mgoal.ca:444"]
@task
def installDeps():
local("npm install --save-dev rollup rollup-plugin-riot")
@task
def makeBuild():
local("mkdir -p build/{scripts,styles,templates}")
@ -16,7 +21,8 @@ def buildTags():
@task
def uglify():
local("uglifyjs ./build/scripts/tags.js ./build/scripts/search.js > ./build/scripts/search.min.js")
local("rollup -c rollup.config.js")
local("uglifyjs ./build/bundle.js > ./build/scripts/search.min.js")
@task
def sass():

12
package.json

@ -5,7 +5,7 @@
"main": "src/scripts/search.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build" : "rollup"
"build": "rollup src/scripts/search.js"
},
"repository": {
"type": "git",
@ -18,7 +18,15 @@
},
"homepage": "https://github.com/nisstyre56/TextbookEngine#readme",
"devDependencies": {
"ramda": "^0.23.0",
"riot": "^3.3.1",
"rollup": "^0.41.4",
"rollup-plugin-riot": "^1.1.0"
"rollup-plugin-commonjs": "^7.0.0",
"rollup-plugin-node-resolve": "^2.0.0",
"rollup-plugin-riot": "^1.1.0",
"whatwg-fetch": "^2.0.2"
},
"dependencies": {
"whatwg-fetch": "^2.0.2"
}
}

16
rollup.config.js

@ -0,0 +1,16 @@
import riot from 'rollup-plugin-riot'
import nodeResolve from 'rollup-plugin-node-resolve'
import commonjs from 'rollup-plugin-commonjs'
import buble from 'rollup-plugin-buble'
export default {
entry: 'src/scripts/search.js',
dest: 'build/bundle.js',
plugins: [
riot(),
nodeResolve({ jsnext: true }),
commonjs(),
buble()
],
format: 'iife'
}

1
src/scripts/book.tag

@ -29,6 +29,7 @@
</div>
<script>
import 'whatwg-fetch'
this.iarchive = false;
this.openlib = false;
this.noresources = false;

13
src/scripts/class.tag

@ -11,7 +11,7 @@
</button>
<div if={ this.booksshown }>
<dl>
<book each={ R.uniq(books) } data="{ this }">
<book each={ this.uniq(books) } data="{ this }">
</book>
</dl>
</div>
@ -23,16 +23,15 @@
</div>
<script>
booksshown = false;
var self = this;
import { default as R } from 'ramda';
this.uniq = R.uniq;
this.booksshown = false;
showbooks() {
self.booksshown = !self.booksshown;
self.update();
this.booksshown = !this.booksshown;
this.update();
}
this.update();
</script>
</class>

43
src/scripts/helpers.js

@ -0,0 +1,43 @@
import { default as R } from 'ramda';
function realBook(book) {
var noAdoption = book.booktitle.indexOf("No Adoption");
var noBooks = book.booktitle.indexOf("No Textbooks");
return ((noAdoption == -1) &&
(noBooks == -1));
}
function filterCourses(courses) {
var books;
for (var i in courses) {
books = courses[i].books;
if ((books.length > 0) &&
(!realBook(books[0]))) {
courses[i].books = "";
}
}
return R.filter(
function (c) {
return c.prof != "Staff";
}, courses);
}
function groupsof(n, xs) {
/* Chunk a list into groups of n size */
return R.unfold(
(xs) => {
if (R.length(xs) > 0) {
return [{"row" : R.take(n, xs)}, R.drop(n, xs)];
}
return false;
}, xs);
}
export {
mount,
realBook,
filterCourses,
groupsof
}

4
src/scripts/results.tag

@ -12,13 +12,13 @@ clicker() {
this.rows = [];
var self = this;
resultsEv.on("loading",
this.opts.resultsEv.on("loading",
function() {
self.notLoading = false;
self.update();
});
resultsEv.on("newResults",
this.opts.resultsEv.on("newResults",
function(data) {
console.log("new search results detected");
console.log(data);

51
src/scripts/search.js

@ -1,43 +1,18 @@
import riot from 'riot';
import './book.tag';
import './class.tag';
import './results.tag';
import './row.tag';
import './search.tag';
var resultsEv = riot.observable();
riot.mount("search", {
showHelp : false,
booksLoading : false
function mount() {
riot.mount("search", {
booksLoading : false,
resultsEv : resultsEv
});
riot.mount("results", {notLoading : true});
function realBook(book) {
var noAdoption = book.booktitle.indexOf("No Adoption");
var noBooks = book.booktitle.indexOf("No Textbooks");
return ((noAdoption == -1) &&
(noBooks == -1));
}
function filterCourses(courses) {
var books;
for (var i in courses) {
books = courses[i].books;
if ((books.length > 0) &&
(!realBook(books[0]))) {
courses[i].books = "";
}
}
return R.filter(
function (c) {
return c.prof != "Staff";
}, courses);
riot.mount("results", {notLoading : true, resultsEv : resultsEv});
}
function groupsof(n, xs) {
/* Chunk a list into groups of n size */
return R.unfold(
function(xs) {
if (R.length(xs) > 0) {
return [{"row" : R.take(n, xs)}, R.drop(n, xs)];
}
return false;
}, xs);
}
mount();

19
src/scripts/search.tag

@ -9,7 +9,7 @@
class="form-input search"
placeholder="Course Description"
type="text"
name="title">
ref="title">
</input>
</div>
@ -17,7 +17,7 @@
<div class="columns">
<div class="col-sm-6 col-md-6 col-lg-6">
<select class="semester form-select float-right" aria-labelledby="dLabel" name="sem">
<select class="semester form-select float-right" aria-labelledby="dLabel" ref="sem">
<option value="Fall" selected>Fall</option>
<option value="Winter">Winter</option>
<option value="Spring/Summer">Spring/Summer</option>
@ -42,25 +42,24 @@
</div>
<script>
import {filterCourses, groupsof} from './helpers.js';
import 'whatwg-fetch'
var self = this;
submit(ev) {
ev.preventDefault();
this.showedHelp = true;
this.opts.showHelp = false;
console.log("submitted");
this.opts.booksLoading = true;
this.update();
resultsEv.trigger("loading");
self.opts.booksLoading = true;
self.update();
self.opts.resultsEv.trigger("loading");
console.log(ev);
fetch("/search/fc?title="+this.title.value+"&sem="+this.sem.value).then(
fetch("/search/fc?title="+self.refs.title.value+"&sem="+self.refs.sem.value).then(
function(response) {
if (response.ok) {
response.json().then(
function(courses) {
var fcourses = filterCourses(courses);
var cgroups = groupsof(3, fcourses);
resultsEv.trigger("newResults", cgroups);
self.opts.resultsEv.trigger("newResults", cgroups);
self.opts.booksLoading = false;
self.update();
});

114
src/scripts/tags.js

@ -1,114 +0,0 @@
riot.tag2('book', '<div class="text-clip toast"> <p> <button onclick="{getresources}" class="btn btn-link"> {booktitle} {bookauthor !== ⁗Ccw⁗ ? ⁗by ⁗ + bookauthor : ⁗⁗} </button> <dd> <div if="{loading}" class="loading"> </div> <p if="{iarchive}"> <a target="_blank" href="{iarchive}"> <button class="centered btn"> Internet Archive Result </button> </a> </p> <p if="{openlib}"> <a target="_blank" href="{openlib}"> <button class="centered btn"> Open Library Result </button> </a> </p> <p if="{noresources}" class="centered wraptext"> Couldn\'t find anything, sorry :( </p> </dd> </p> </div>', '', '', function(opts) {
this.iarchive = false;
this.openlib = false;
this.noresources = false;
var self = this;
this.getresources = function(ev) {
ev.preventDefault();
self.loading = true;
self.update();
var params = {
"title" : self.booktitle,
"author" : self.bookauthor
};
var url = "/search/resources";
fetch(url, {
method : "POST",
body : JSON.stringify(params),
headers: {
'Content-Type': 'application/json'
}
}).then(
function(response) {
if (response.ok) {
return response.json()
}
}).then(
function(results) {
if (results.iarchive) {
self.iarchive = results.iarchive[0];
}
if (results.openlib) {
self.openlib = results.openlib[0];
}
if (!(results.openlib && results.iarchive)) {
self.noresources = true;
}
self.loading = false;
self.update();
})
}.bind(this)
});
riot.tag2('class', '<div class="course-info"> <div class="card-header"> <div class="text-center wraptext" id="title"> {dept} {title} </div> <div class="wraptext" id="prof">Taught by: {prof} </div> <div class="wraptext" id="sem">Running: {sem} </div> </div> <div if="{books}" class="card-body"> <button onclick="{showbooks}" class="btn btn-primary show-button"> <strong>Show Textbooks</strong> </button> <div if="{this.booksshown}"> <dl> <book each="{R.uniq(books)}" data="{this}"> </book> </dl> </div> </div> <div class="toast" if="{!books}"> <p class="wraptext">No books at this time</p> <p class="wraptext">Check back later, or verify the course has books</p> </div> </div>', '', '', function(opts) {
booksshown = false;
var self = this;
this.showbooks = function() {
self.booksshown = !self.booksshown;
self.update();
}.bind(this)
this.update();
});
riot.tag2('results', '<div if="{notLoading}" class="courses container"> <row if="{rows.length > 0}" class="course-row columns" each="{rows}" data="{this}" classrow="{row}"></row> <div if="{rows.length <= 0}" class="empty"> No Results, Sorry! </div> </div>', '', '', function(opts) {
this.clicker = function() {
alert("clicked");
}.bind(this)
this.rows = [];
var self = this;
resultsEv.on("loading",
function() {
self.notLoading = false;
self.update();
});
resultsEv.on("newResults",
function(data) {
console.log("new search results detected");
console.log(data);
self.rows = data;
self.notLoading = true;
self.update();
});
});
riot.tag2('row', '<class class="course text-ellipsis text-justify rounded card column col-md-4" each="{classrow}" data="{this}"> </class>', '', '', function(opts) {
this.classrow = opts.classrow
});
riot.tag2('search', '<form class="form-horizontal search-form" onsubmit="{submit}" type="submit" method="get"> <div class="form-group"> <div class="container"> <div class="columns"> <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12"> <input onfocus="{showhelp}" class="form-input search" placeholder="Course Description" type="text" name="title"> </input> </div> </div> <div class="columns"> <div class="col-sm-6 col-md-6 col-lg-6"> <select class="semester form-select float-right" aria-labelledby="dLabel" name="sem"> <option value="Fall" selected>Fall</option> <option value="Winter">Winter</option> <option value="Spring/Summer">Spring/Summer</option> </select> </div> <div class="col-sm-6 col-md-6 col-lg-6"> <button class="search-btn btn btn-primary float-left tooltip tooltip-bottom" data-tooltip="Search by keywords" type="submit"> Search </button> </div> </div> </div> </div> </form> <div if="{opts.booksLoading}" class="search-load"> </div>', '', '', function(opts) {
var self = this;
this.submit = function(ev) {
ev.preventDefault();
this.showedHelp = true;
this.opts.showHelp = false;
console.log("submitted");
this.opts.booksLoading = true;
this.update();
resultsEv.trigger("loading");
console.log(ev);
fetch("/search/fc?title="+this.title.value+"&sem="+this.sem.value).then(
function(response) {
if (response.ok) {
response.json().then(
function(courses) {
var fcourses = filterCourses(courses);
var cgroups = groupsof(3, fcourses);
resultsEv.trigger("newResults", cgroups);
self.opts.booksLoading = false;
self.update();
});
}
});
}.bind(this)
});

6
src/templates/search.html

@ -14,7 +14,7 @@
</div>
<div class="columns">
<div class="title col-sm-12 col-md-12 col-lg-12">
<h5>Search for a course and start saving money on your books</h5>
<h5>Search for a course and find your books</h5>
</div>
</div>
</div>
@ -30,10 +30,6 @@
<link rel="stylesheet" href="/styles/spectre.min.css">
<link rel="stylesheet" href="/styles/search.min.css">
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/riot/2.6.7/riot+compiler.min.js"></script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.22.1/ramda.min.js"></script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/fetch/2.0.2/fetch.min.js"></script>
<script type="text/javascript" src="/scripts/search.min.js"></script>
</body>

5
watch.sh

@ -0,0 +1,5 @@
#! /usr/bin/bash
while inotifywait -qqre modify "./src"; do
fab buildLocal
done
Loading…
Cancel
Save