Add front-end prototype to assets

master
Garrett Mills 4 years ago
parent ad0abe5b84
commit 6975b4b09b
Signed by: garrettmills
GPG Key ID: D2BF5FBA8298F246

@ -0,0 +1,34 @@
# Fantasy Football
## EECS 448 - Projects 3 & 4
## Structure Info
This project has been wired up to use Vue.js to help organize components of the game.
These components are defined in files that end in the `.component.js` extension, and are located in the `src/components/` directory.
The entry point for the project is the `index.html`. This file contains the basic logic for loading Vue, and adding the game board to the page.
Obviously, we'll flesh out the look-and-feel as we go along. This is just a basic starter for now.
## How to Run
The easiest way to run this project is by creating a basic static web server using Python. This is super simple:
1. Open a terminal or command prompt to the root of this project (i.e. the directory this file is in).
2. Start the server: `python -m http.server`
This will start a web server on port 8000. You can then run the game by navigating to http://localhost:8000/ from a web browser.
### Re-generating the documentation
To regenerate the docs, you need Node.js and the Yarn package manager installed. Then, just:
```shell script
cd documentation
./generate.sh
```
## Contributors
- Lucas Brakenridge
- Javier Barea Lara
- Garrett Mills
- Evan Powell
- Alec Horlick-Mills

@ -0,0 +1,45 @@
# Fantasy Football
## EECS 448 - Projects 3 & 4
## Structure Info
This project has been wired up to use Vue.js to help organize components of the game.
These components are defined in files that end in the `.component.js` extension, and are located in the `src/components/` directory.
The entry point for the project is the `index.html`. This file contains the basic logic for loading Vue, and adding the game board to the page.
Obviously, we'll flesh out the look-and-feel as we go along. This is just a basic starter for now.
## How to Run
The easiest way to run this project is by creating a basic static web server using Python. This is super simple:
1. Open a terminal or command prompt to the root of this project (i.e. the directory this file is in).
2. Start the server: `python -m http.server`
This will start a web server on port 8000. You can then run the game by navigating to http://localhost:8000/ from a web browser.
### Re-generating the documentation
To regenerate the docs, you need Node.js and the Yarn package manager installed. Then, just:
```shell script
cd documentation
./generate.sh
```
## Works Cited
The files in the `lib` directory are external libraries used in this project.
- Vue.js
- A front-end framework. Used under the terms of the MIT license.
- https://github.com/vuejs/vue
- VuES6.js
- A kind-of crappy loader for defining Vue components using ES6 classes.
- Also used under the terms of the MIT license.
- https://code.garrettmills.dev/garrettmills/vues6
## Contributors
- Lucas Brakenridge
- Javier Barea Lara
- Garrett Mills
- Evan Powell
- Alec Horlick-Mills

@ -0,0 +1,3 @@
#!/bin/sh
yarn install
./node_modules/.bin/jsdoc --destination ./generated --readme ./README.md --recurse ../src

@ -0,0 +1,181 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Class: DraftBoardComponent</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Class: DraftBoardComponent</h1>
<section>
<header>
<h2><span class="attribs"><span class="type-signature"></span></span>DraftBoardComponent<span class="signature">()</span><span class="type-signature"></span></h2>
<div class="class-description">Component representing the draft board page.</div>
</header>
<article>
<div class="container-overview">
<h2>Constructor</h2>
<h4 class="name" id="DraftBoardComponent"><span class="type-signature"></span>new DraftBoardComponent<span class="signature">()</span><span class="type-signature"></span></h4>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_pages_DraftBoard.component.js.html">components/pages/DraftBoard.component.js</a>, <a href="components_pages_DraftBoard.component.js.html#line13">line 13</a>
</li></ul></dd>
</dl>
</div>
<h3 class="subsection-title">Extends</h3>
<ul>
<li>Component</li>
</ul>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-routing.html">routing</a></li><li><a href="module-util.html">util</a></li></ul><h3>Classes</h3><ul><li><a href="AddPlayersComponent.html">AddPlayersComponent</a></li><li><a href="DraftBoardComponent.html">DraftBoardComponent</a></li><li><a href="GridActionButtonComponent.html">GridActionButtonComponent</a></li><li><a href="GridComponent.html">GridComponent</a></li><li><a href="LeagueComponent.html">LeagueComponent</a></li><li><a href="LinkComponent.html">LinkComponent</a></li><li><a href="module-routing-Router.html">Router</a></li><li><a href="MyTeamComponent.html">MyTeamComponent</a></li><li><a href="ScoresComponent.html">ScoresComponent</a></li><li><a href="TopLevelComponent.html">TopLevelComponent</a></li></ul><h3>Global</h3><ul><li><a href="global.html#GridCellRenderType">GridCellRenderType</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.5</a> on Sun Oct 25 2020 12:32:18 GMT-0500 (Central Daylight Time)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>

@ -0,0 +1,474 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Class: GridComponent</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Class: GridComponent</h1>
<section>
<header>
<h2><span class="attribs"><span class="type-signature"></span></span>GridComponent<span class="signature">()</span><span class="type-signature"></span></h2>
<div class="class-description">Shared grid component used to show tables in various interfaces.</div>
</header>
<article>
<div class="container-overview">
<h2>Constructor</h2>
<h4 class="name" id="GridComponent"><span class="type-signature"></span>new GridComponent<span class="signature">()</span><span class="type-signature"></span></h4>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_Grid.component.js.html">components/Grid.component.js</a>, <a href="components_Grid.component.js.html#line40">line 40</a>
</li></ul></dd>
</dl>
</div>
<h3 class="subsection-title">Extends</h3>
<ul>
<li>Component</li>
</ul>
<h3 class="subsection-title">Methods</h3>
<h4 class="name" id="on_col_click"><span class="type-signature"></span>on_col_click<span class="signature">(col, row, passcol)</span><span class="type-signature"></span></h4>
<div class="description">
Called when the component renderer emits a click event, to pass it along to the column definition.
</div>
<h5>Parameters:</h5>
<table class="params">
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th class="last">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="name"><code>col</code></td>
<td class="type">
<span class="param-type">object</span>
</td>
<td class="description last">the column definition</td>
</tr>
<tr>
<td class="name"><code>row</code></td>
<td class="type">
<span class="param-type">object</span>
</td>
<td class="description last">the row clicked</td>
</tr>
<tr>
<td class="name"><code>passcol</code></td>
<td class="type">
<span class="param-type">object</span>
</td>
<td class="description last">the column emitted from the component</td>
</tr>
</tbody>
</table>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_Grid.component.js.html">components/Grid.component.js</a>, <a href="components_Grid.component.js.html#line67">line 67</a>
</li></ul></dd>
</dl>
<h4 class="name" id="vue_on_create"><span class="type-signature">(async) </span>vue_on_create<span class="signature">()</span><span class="type-signature"> &rarr; {Promise.&lt;void>}</span></h4>
<div class="description">
Called when the component is instantiated.
</div>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_Grid.component.js.html">components/Grid.component.js</a>, <a href="components_Grid.component.js.html#line57">line 57</a>
</li></ul></dd>
</dl>
<h5>Returns:</h5>
<dl>
<dt>
Type
</dt>
<dd>
<span class="param-type">Promise.&lt;void></span>
</dd>
</dl>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-routing.html">routing</a></li><li><a href="module-util.html">util</a></li></ul><h3>Classes</h3><ul><li><a href="AddPlayersComponent.html">AddPlayersComponent</a></li><li><a href="DraftBoardComponent.html">DraftBoardComponent</a></li><li><a href="GridActionButtonComponent.html">GridActionButtonComponent</a></li><li><a href="GridComponent.html">GridComponent</a></li><li><a href="LeagueComponent.html">LeagueComponent</a></li><li><a href="LinkComponent.html">LinkComponent</a></li><li><a href="module-routing-Router.html">Router</a></li><li><a href="MyTeamComponent.html">MyTeamComponent</a></li><li><a href="ScoresComponent.html">ScoresComponent</a></li><li><a href="TopLevelComponent.html">TopLevelComponent</a></li></ul><h3>Global</h3><ul><li><a href="global.html#GridCellRenderType">GridCellRenderType</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.5</a> on Sun Oct 25 2020 12:32:18 GMT-0500 (Central Daylight Time)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>

@ -0,0 +1,439 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Class: LeagueComponent</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Class: LeagueComponent</h1>
<section>
<header>
<h2><span class="attribs"><span class="type-signature"></span></span>LeagueComponent<span class="signature">()</span><span class="type-signature"></span></h2>
<div class="class-description">Component representing the league standings page.</div>
</header>
<article>
<div class="container-overview">
<h2>Constructor</h2>
<h4 class="name" id="LeagueComponent"><span class="type-signature"></span>new LeagueComponent<span class="signature">()</span><span class="type-signature"></span></h4>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_pages_League.component.js.html">components/pages/League.component.js</a>, <a href="components_pages_League.component.js.html#line21">line 21</a>
</li></ul></dd>
</dl>
</div>
<h3 class="subsection-title">Extends</h3>
<ul>
<li>Component</li>
</ul>
<h3 class="subsection-title">Members</h3>
<h4 class="name" id="column_defs"><span class="type-signature"></span>column_defs<span class="type-signature"> :Array.&lt;object></span></h4>
<div class="description">
Column definitions for the league standings grid.
</div>
<h5>Type:</h5>
<ul>
<li>
<span class="param-type">Array.&lt;object></span>
</li>
</ul>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_pages_League.component.js.html">components/pages/League.component.js</a>, <a href="components_pages_League.component.js.html#line32">line 32</a>
</li></ul></dd>
</dl>
<h4 class="name" id="data"><span class="type-signature"></span>data<span class="type-signature"> :Array.&lt;object></span></h4>
<div class="description">
Sample data for the league standings grid.
</div>
<h5>Type:</h5>
<ul>
<li>
<span class="param-type">Array.&lt;object></span>
</li>
</ul>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_pages_League.component.js.html">components/pages/League.component.js</a>, <a href="components_pages_League.component.js.html#line83">line 83</a>
</li></ul></dd>
</dl>
<h3 class="subsection-title">Methods</h3>
<h4 class="name" id="vue_on_create"><span class="type-signature">(async) </span>vue_on_create<span class="signature">()</span><span class="type-signature"> &rarr; {Promise.&lt;void>}</span></h4>
<div class="description">
Called when the component is instantiated.
</div>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_pages_League.component.js.html">components/pages/League.component.js</a>, <a href="components_pages_League.component.js.html#line166">line 166</a>
</li></ul></dd>
</dl>
<h5>Returns:</h5>
<dl>
<dt>
Type
</dt>
<dd>
<span class="param-type">Promise.&lt;void></span>
</dd>
</dl>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-routing.html">routing</a></li><li><a href="module-util.html">util</a></li></ul><h3>Classes</h3><ul><li><a href="AddPlayersComponent.html">AddPlayersComponent</a></li><li><a href="DraftBoardComponent.html">DraftBoardComponent</a></li><li><a href="GridActionButtonComponent.html">GridActionButtonComponent</a></li><li><a href="GridComponent.html">GridComponent</a></li><li><a href="LeagueComponent.html">LeagueComponent</a></li><li><a href="LinkComponent.html">LinkComponent</a></li><li><a href="module-routing-Router.html">Router</a></li><li><a href="MyTeamComponent.html">MyTeamComponent</a></li><li><a href="ScoresComponent.html">ScoresComponent</a></li><li><a href="TopLevelComponent.html">TopLevelComponent</a></li></ul><h3>Global</h3><ul><li><a href="global.html#GridCellRenderType">GridCellRenderType</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.5</a> on Sun Oct 25 2020 12:32:18 GMT-0500 (Central Daylight Time)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>

@ -0,0 +1,263 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Class: LinkComponent</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Class: LinkComponent</h1>
<section>
<header>
<h2><span class="attribs"><span class="type-signature"></span></span>LinkComponent<span class="signature">()</span><span class="type-signature"></span></h2>
<div class="class-description">Component providing hyper-links that navigate to other pages in the SPA,
without reloading the page.</div>
</header>
<article>
<div class="container-overview">
<h2>Constructor</h2>
<h4 class="name" id="LinkComponent"><span class="type-signature"></span>new LinkComponent<span class="signature">()</span><span class="type-signature"></span></h4>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_Link.component.js.html">components/Link.component.js</a>, <a href="components_Link.component.js.html#line12">line 12</a>
</li></ul></dd>
</dl>
</div>
<h3 class="subsection-title">Methods</h3>
<h4 class="name" id="on_click"><span class="type-signature"></span>on_click<span class="signature">()</span><span class="type-signature"></span></h4>
<div class="description">
Called when the link is clicked. Navigates the router.
</div>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_Link.component.js.html">components/Link.component.js</a>, <a href="components_Link.component.js.html#line20">line 20</a>
</li></ul></dd>
</dl>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-routing.html">routing</a></li><li><a href="module-util.html">util</a></li></ul><h3>Classes</h3><ul><li><a href="AddPlayersComponent.html">AddPlayersComponent</a></li><li><a href="DraftBoardComponent.html">DraftBoardComponent</a></li><li><a href="GridActionButtonComponent.html">GridActionButtonComponent</a></li><li><a href="GridComponent.html">GridComponent</a></li><li><a href="LeagueComponent.html">LeagueComponent</a></li><li><a href="LinkComponent.html">LinkComponent</a></li><li><a href="module-routing-Router.html">Router</a></li><li><a href="MyTeamComponent.html">MyTeamComponent</a></li><li><a href="ScoresComponent.html">ScoresComponent</a></li><li><a href="TopLevelComponent.html">TopLevelComponent</a></li></ul><h3>Global</h3><ul><li><a href="global.html#GridCellRenderType">GridCellRenderType</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.5</a> on Sun Oct 25 2020 12:32:18 GMT-0500 (Central Daylight Time)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>

@ -0,0 +1,961 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Class: MyTeamComponent</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Class: MyTeamComponent</h1>
<section>
<header>
<h2><span class="attribs"><span class="type-signature"></span></span>MyTeamComponent<span class="signature">()</span><span class="type-signature"></span></h2>
<div class="class-description">Component representing the my-team page.</div>
</header>
<article>
<div class="container-overview">
<h2>Constructor</h2>
<h4 class="name" id="MyTeamComponent"><span class="type-signature"></span>new MyTeamComponent<span class="signature">()</span><span class="type-signature"></span></h4>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_pages_MyTeam.component.js.html">components/pages/MyTeam.component.js</a>, <a href="components_pages_MyTeam.component.js.html#line41">line 41</a>
</li></ul></dd>
</dl>
</div>
<h3 class="subsection-title">Extends</h3>
<ul>
<li>Component</li>
</ul>
<h3 class="subsection-title">Members</h3>
<h4 class="name" id="bench_players"><span class="type-signature"></span>bench_players<span class="type-signature"> :Array.&lt;object></span></h4>
<div class="description">
Players on the bench.
</div>
<h5>Type:</h5>
<ul>
<li>
<span class="param-type">Array.&lt;object></span>
</li>
</ul>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_pages_MyTeam.component.js.html">components/pages/MyTeam.component.js</a>, <a href="components_pages_MyTeam.component.js.html#line101">line 101</a>
</li></ul></dd>
</dl>
<h4 class="name" id="lineup_column_defs"><span class="type-signature"></span>lineup_column_defs<span class="type-signature"> :Array.&lt;object></span></h4>
<div class="description">
Column definitions for the starting/bench lineup grids.
</div>
<h5>Type:</h5>
<ul>
<li>
<span class="param-type">Array.&lt;object></span>
</li>
</ul>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_pages_MyTeam.component.js.html">components/pages/MyTeam.component.js</a>, <a href="components_pages_MyTeam.component.js.html#line107">line 107</a>
</li></ul></dd>
</dl>
<h4 class="name" id="moving_player"><span class="type-signature"></span>moving_player<span class="type-signature"> :undefined</span></h4>
<div class="description">
The player currently being moved. If none, then will be set to undefined.
</div>
<h5>Type:</h5>
<ul>
<li>
<span class="param-type">undefined</span>
</li>
</ul>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_pages_MyTeam.component.js.html">components/pages/MyTeam.component.js</a>, <a href="components_pages_MyTeam.component.js.html#line63">line 63</a>
</li></ul></dd>
</dl>
<h4 class="name" id="overall_column_defs"><span class="type-signature"></span>overall_column_defs<span class="type-signature"> :Array.&lt;object></span></h4>
<div class="description">
Column definitions for the overall team grid.
</div>
<h5>Type:</h5>
<ul>
<li>
<span class="param-type">Array.&lt;object></span>
</li>
</ul>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_pages_MyTeam.component.js.html">components/pages/MyTeam.component.js</a>, <a href="components_pages_MyTeam.component.js.html#line168">line 168</a>
</li></ul></dd>
</dl>
<h4 class="name" id="overall_data"><span class="type-signature"></span>overall_data<span class="type-signature"> :Array.&lt;object></span></h4>
<div class="description">
Data for the overall team grid (list of user's team players).
</div>
<h5>Type:</h5>
<ul>
<li>
<span class="param-type">Array.&lt;object></span>
</li>
</ul>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_pages_MyTeam.component.js.html">components/pages/MyTeam.component.js</a>, <a href="components_pages_MyTeam.component.js.html#line195">line 195</a>
</li></ul></dd>
</dl>
<h4 class="name" id="show_body"><span class="type-signature"></span>show_body<span class="type-signature"> :boolean</span></h4>
<div class="description">
If true, the body of the page will be shown. Otherwise, hidden.
This is used to refresh the entire component at once.
</div>
<h5>Type:</h5>
<ul>
<li>
<span class="param-type">boolean</span>
</li>
</ul>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_pages_MyTeam.component.js.html">components/pages/MyTeam.component.js</a>, <a href="components_pages_MyTeam.component.js.html#line57">line 57</a>
</li></ul></dd>
</dl>
<h4 class="name" id="starting_players"><span class="type-signature"></span>starting_players<span class="type-signature"> :Array.&lt;object></span></h4>
<div class="description">
Array of players filling starting line up positions. If no player is in
a position, then only the "postition" key will be set.
</div>
<h5>Type:</h5>
<ul>
<li>
<span class="param-type">Array.&lt;object></span>
</li>
</ul>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_pages_MyTeam.component.js.html">components/pages/MyTeam.component.js</a>, <a href="components_pages_MyTeam.component.js.html#line70">line 70</a>
</li></ul></dd>
</dl>
<h4 class="name" id="team_name"><span class="type-signature"></span>team_name<span class="type-signature"> :string</span></h4>
<div class="description">
The team name.
</div>
<h5>Type:</h5>
<ul>
<li>
<span class="param-type">string</span>
</li>
</ul>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_pages_MyTeam.component.js.html">components/pages/MyTeam.component.js</a>, <a href="components_pages_MyTeam.component.js.html#line50">line 50</a>
</li></ul></dd>
</dl>
<h3 class="subsection-title">Methods</h3>
<h4 class="name" id="update"><span class="type-signature"></span>update<span class="signature">()</span><span class="type-signature"></span></h4>
<div class="description">
Force re-render the entire component by briefly hiding it.
</div>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_pages_MyTeam.component.js.html">components/pages/MyTeam.component.js</a>, <a href="components_pages_MyTeam.component.js.html#line255">line 255</a>
</li></ul></dd>
</dl>
<h4 class="name" id="vue_on_create"><span class="type-signature">(async) </span>vue_on_create<span class="signature">()</span><span class="type-signature"> &rarr; {Promise.&lt;void>}</span></h4>
<div class="description">
Called when the component is instantiated. Initializes the bench players data.
</div>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_pages_MyTeam.component.js.html">components/pages/MyTeam.component.js</a>, <a href="components_pages_MyTeam.component.js.html#line244">line 244</a>
</li></ul></dd>
</dl>
<h5>Returns:</h5>
<dl>
<dt>
Type
</dt>
<dd>
<span class="param-type">Promise.&lt;void></span>
</dd>
</dl>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-routing.html">routing</a></li><li><a href="module-util.html">util</a></li></ul><h3>Classes</h3><ul><li><a href="AddPlayersComponent.html">AddPlayersComponent</a></li><li><a href="DraftBoardComponent.html">DraftBoardComponent</a></li><li><a href="GridActionButtonComponent.html">GridActionButtonComponent</a></li><li><a href="GridComponent.html">GridComponent</a></li><li><a href="LeagueComponent.html">LeagueComponent</a></li><li><a href="LinkComponent.html">LinkComponent</a></li><li><a href="module-routing-Router.html">Router</a></li><li><a href="MyTeamComponent.html">MyTeamComponent</a></li><li><a href="ScoresComponent.html">ScoresComponent</a></li><li><a href="TopLevelComponent.html">TopLevelComponent</a></li></ul><h3>Global</h3><ul><li><a href="global.html#GridCellRenderType">GridCellRenderType</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.5</a> on Sun Oct 25 2020 12:32:18 GMT-0500 (Central Daylight Time)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>

File diff suppressed because it is too large Load Diff

@ -0,0 +1,903 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Class: ScoresComponent</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Class: ScoresComponent</h1>
<section>
<header>
<h2><span class="attribs"><span class="type-signature"></span></span>ScoresComponent<span class="signature">()</span><span class="type-signature"></span></h2>
<div class="class-description">Component representing the scores & match-ups page.</div>
</header>
<article>
<div class="container-overview">
<h2>Constructor</h2>
<h4 class="name" id="ScoresComponent"><span class="type-signature"></span>new ScoresComponent<span class="signature">()</span><span class="type-signature"></span></h4>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_pages_Scores.component.js.html">components/pages/Scores.component.js</a>, <a href="components_pages_Scores.component.js.html#line26">line 26</a>
</li></ul></dd>
</dl>
</div>
<h3 class="subsection-title">Extends</h3>
<ul>
<li>Component</li>
</ul>
<h3 class="subsection-title">Members</h3>
<h4 class="name" id="column_defs"><span class="type-signature"></span>column_defs<span class="type-signature"> :Array.&lt;object></span></h4>
<div class="description">
Column definitions for the matchups grid.
</div>
<h5>Type:</h5>
<ul>
<li>
<span class="param-type">Array.&lt;object></span>
</li>
</ul>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_pages_Scores.component.js.html">components/pages/Scores.component.js</a>, <a href="components_pages_Scores.component.js.html#line258">line 258</a>
</li></ul></dd>
</dl>
<h4 class="name" id="current_week"><span class="type-signature"></span>current_week<span class="type-signature"> :number</span></h4>
<div class="description">
The number of the current week shown in the interface
</div>
<h5>Type:</h5>
<ul>
<li>
<span class="param-type">number</span>
</li>
</ul>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_pages_Scores.component.js.html">components/pages/Scores.component.js</a>, <a href="components_pages_Scores.component.js.html#line35">line 35</a>
</li></ul></dd>
</dl>
<h4 class="name" id="data"><span class="type-signature"></span>data<span class="type-signature"> :Array.&lt;object></span></h4>
<div class="description">
The currently shown week's data.
</div>
<h5>Type:</h5>
<ul>
<li>
<span class="param-type">Array.&lt;object></span>
</li>
</ul>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_pages_Scores.component.js.html">components/pages/Scores.component.js</a>, <a href="components_pages_Scores.component.js.html#line316">line 316</a>
</li></ul></dd>
</dl>
<h4 class="name" id="max_week"><span class="type-signature"></span>max_week<span class="type-signature"> :number</span></h4>
<div class="description">
Most recent week number.
</div>
<h5>Type:</h5>
<ul>
<li>
<span class="param-type">number</span>
</li>
</ul>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_pages_Scores.component.js.html">components/pages/Scores.component.js</a>, <a href="components_pages_Scores.component.js.html#line41">line 41</a>
</li></ul></dd>
</dl>
<h4 class="name" id="min_week"><span class="type-signature"></span>min_week<span class="type-signature"> :number</span></h4>
<div class="description">
Least recent week number.
</div>
<h5>Type:</h5>
<ul>
<li>
<span class="param-type">number</span>
</li>
</ul>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_pages_Scores.component.js.html">components/pages/Scores.component.js</a>, <a href="components_pages_Scores.component.js.html#line47">line 47</a>
</li></ul></dd>
</dl>
<h4 class="name" id="week_x_data"><span class="type-signature"></span>week_x_data<span class="type-signature"> :Array.&lt;Array.&lt;object>></span></h4>
<div class="description">
Array of arrays of data for each week with first item being week 1, second being week 2, &c.
</div>
<h5>Type:</h5>
<ul>
<li>
<span class="param-type">Array.&lt;Array.&lt;object>></span>
</li>
</ul>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_pages_Scores.component.js.html">components/pages/Scores.component.js</a>, <a href="components_pages_Scores.component.js.html#line53">line 53</a>
</li></ul></dd>
</dl>
<h3 class="subsection-title">Methods</h3>
<h4 class="name" id="to_next_week"><span class="type-signature"></span>to_next_week<span class="signature">()</span><span class="type-signature"></span></h4>
<div class="description">
When called, advances the data to the next-most recent week, if one exists.
</div>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_pages_Scores.component.js.html">components/pages/Scores.component.js</a>, <a href="components_pages_Scores.component.js.html#line329">line 329</a>
</li></ul></dd>
</dl>
<h4 class="name" id="to_previous_week"><span class="type-signature"></span>to_previous_week<span class="signature">()</span><span class="type-signature"></span></h4>
<div class="description">
When called, advances the data to the next-least recent week, if one exists.
</div>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_pages_Scores.component.js.html">components/pages/Scores.component.js</a>, <a href="components_pages_Scores.component.js.html#line339">line 339</a>
</li></ul></dd>
</dl>
<h4 class="name" id="vue_on_create"><span class="type-signature">(async) </span>vue_on_create<span class="signature">()</span><span class="type-signature"> &rarr; {Promise.&lt;void>}</span></h4>
<div class="description">
Called when the component is instantiated. Initializes the current week to the most recent week.
</div>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_pages_Scores.component.js.html">components/pages/Scores.component.js</a>, <a href="components_pages_Scores.component.js.html#line322">line 322</a>
</li></ul></dd>
</dl>
<h5>Returns:</h5>
<dl>
<dt>
Type
</dt>
<dd>
<span class="param-type">Promise.&lt;void></span>
</dd>
</dl>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-routing.html">routing</a></li><li><a href="module-util.html">util</a></li></ul><h3>Classes</h3><ul><li><a href="AddPlayersComponent.html">AddPlayersComponent</a></li><li><a href="DraftBoardComponent.html">DraftBoardComponent</a></li><li><a href="GridActionButtonComponent.html">GridActionButtonComponent</a></li><li><a href="GridComponent.html">GridComponent</a></li><li><a href="LeagueComponent.html">LeagueComponent</a></li><li><a href="LinkComponent.html">LinkComponent</a></li><li><a href="module-routing-Router.html">Router</a></li><li><a href="MyTeamComponent.html">MyTeamComponent</a></li><li><a href="ScoresComponent.html">ScoresComponent</a></li><li><a href="TopLevelComponent.html">TopLevelComponent</a></li></ul><h3>Global</h3><ul><li><a href="global.html#GridCellRenderType">GridCellRenderType</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.5</a> on Sun Oct 25 2020 12:32:18 GMT-0500 (Central Daylight Time)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>

@ -0,0 +1,723 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Class: TopLevelComponent</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Class: TopLevelComponent</h1>
<section>
<header>
<h2><span class="attribs"><span class="type-signature"></span></span>TopLevelComponent<span class="signature">()</span><span class="type-signature"></span></h2>
<div class="class-description">Top-level component which manages the display of the entire game.</div>
</header>
<article>
<div class="container-overview">
<h2>Constructor</h2>
<h4 class="name" id="TopLevelComponent"><span class="type-signature"></span>new TopLevelComponent<span class="signature">()</span><span class="type-signature"></span></h4>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_TopLevel.component.js.html">components/TopLevel.component.js</a>, <a href="components_TopLevel.component.js.html#line32">line 32</a>
</li></ul></dd>
</dl>
</div>
<h3 class="subsection-title">Extends</h3>
<ul>
<li>Component</li>
</ul>
<h3 class="subsection-title">Members</h3>
<h4 class="name" id="current_route"><span class="type-signature"></span>current_route<span class="type-signature"> :string</span></h4>
<div class="description">
The currently loaded page route.
</div>
<h5>Type:</h5>
<ul>
<li>
<span class="param-type">string</span>
</li>
</ul>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_TopLevel.component.js.html">components/TopLevel.component.js</a>, <a href="components_TopLevel.component.js.html#line41">line 41</a>
</li></ul></dd>
</dl>
<h4 class="name" id="navbar_items"><span class="type-signature"></span>navbar_items<span class="type-signature"> :Array.&lt;object></span></h4>
<div class="description">
Array of navigation bar items where "title" is the page name, and "page" is the page route.
</div>
<h5>Type:</h5>
<ul>
<li>
<span class="param-type">Array.&lt;object></span>
</li>
</ul>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_TopLevel.component.js.html">components/TopLevel.component.js</a>, <a href="components_TopLevel.component.js.html#line47">line 47</a>
</li></ul></dd>
</dl>
<h3 class="subsection-title">Methods</h3>
<h4 class="name" id="on_route_change"><span class="type-signature">(async) </span>on_route_change<span class="signature">(path, args)</span><span class="type-signature"> &rarr; {Promise.&lt;void>}</span></h4>
<div class="description">
Called when the navigation changes.
</div>
<h5>Parameters:</h5>
<table class="params">
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th class="last">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="name"><code>path</code></td>
<td class="type">
<span class="param-type">string</span>
</td>
<td class="description last"></td>
</tr>
<tr>
<td class="name"><code>args</code></td>
<td class="type">
<span class="param-type">*</span>
</td>
<td class="description last"></td>
</tr>
</tbody>
</table>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_TopLevel.component.js.html">components/TopLevel.component.js</a>, <a href="components_TopLevel.component.js.html#line89">line 89</a>
</li></ul></dd>
</dl>
<h5>Returns:</h5>
<dl>
<dt>
Type
</dt>
<dd>
<span class="param-type">Promise.&lt;void></span>
</dd>
</dl>
<h4 class="name" id="vue_on_create"><span class="type-signature">(async) </span>vue_on_create<span class="signature">()</span><span class="type-signature"> &rarr; {Promise.&lt;void>}</span></h4>
<div class="description">
Called when the component is initialized.
</div>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_TopLevel.component.js.html">components/TopLevel.component.js</a>, <a href="components_TopLevel.component.js.html#line59">line 59</a>
</li></ul></dd>
</dl>
<h5>Returns:</h5>
<dl>
<dt>
Type
</dt>
<dd>
<span class="param-type">Promise.&lt;void></span>
</dd>
</dl>
<h4 class="name" id="vue_on_destroy"><span class="type-signature">(async) </span>vue_on_destroy<span class="signature">()</span><span class="type-signature"> &rarr; {Promise.&lt;void>}</span></h4>
<div class="description">
Called when the component is destroyed.
</div>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_TopLevel.component.js.html">components/TopLevel.component.js</a>, <a href="components_TopLevel.component.js.html#line78">line 78</a>
</li></ul></dd>
</dl>
<h5>Returns:</h5>
<dl>
<dt>
Type
</dt>
<dd>
<span class="param-type">Promise.&lt;void></span>
</dd>
</dl>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-routing.html">routing</a></li><li><a href="module-util.html">util</a></li></ul><h3>Classes</h3><ul><li><a href="AddPlayersComponent.html">AddPlayersComponent</a></li><li><a href="DraftBoardComponent.html">DraftBoardComponent</a></li><li><a href="GridActionButtonComponent.html">GridActionButtonComponent</a></li><li><a href="GridComponent.html">GridComponent</a></li><li><a href="LeagueComponent.html">LeagueComponent</a></li><li><a href="LinkComponent.html">LinkComponent</a></li><li><a href="module-routing-Router.html">Router</a></li><li><a href="MyTeamComponent.html">MyTeamComponent</a></li><li><a href="ScoresComponent.html">ScoresComponent</a></li><li><a href="TopLevelComponent.html">TopLevelComponent</a></li></ul><h3>Global</h3><ul><li><a href="global.html#GridCellRenderType">GridCellRenderType</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.5</a> on Sun Oct 25 2020 12:32:18 GMT-0500 (Central Daylight Time)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>

@ -0,0 +1,123 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Source: components/Grid.component.js</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Source: components/Grid.component.js</h1>
<section>
<article>
<pre class="prettyprint source linenums"><code>import {Component} from '../../lib/vues6.js'
/**
* An enum representing the different grid cell renderer types for the shared grid.
* @type {object}
*/
const GridCellRenderType = {
Simple: Symbol('simple'),
HTML: Symbol('html'),
Component: Symbol('component'),
}
export {GridCellRenderType}
const template = `
&lt;div class="component-app-grid">
&lt;table>
&lt;tr>
&lt;th v-if="show_row_numbers">#&lt;/th>
&lt;th v-for="col of column_defs" :title="col.title || ''">{{ col.header || '' }}&lt;/th>
&lt;/tr>
&lt;tr v-for="(row, idx) of data">
&lt;td v-if="show_row_numbers">{{ idx + 1 }}&lt;/td>
&lt;td v-for="col of column_defs">
&lt;div v-if="!col.type || col.type === GridCellRenderType.Simple">{{ row[col.key] }}&lt;/div>
&lt;div v-if="col.type === GridCellRenderType.HTML" v-html="col.renderer(row[col.key], row)">&lt;/div>
&lt;div v-if="col.type === GridCellRenderType.Component">
&lt;component :is="col.component" :row="row" :col="col" :idx="idx" @click="on_col_click(col, $event)">&lt;/component>
&lt;/div>
&lt;/td>
&lt;/tr>
&lt;/table>
&lt;/div>
`
/**
* Shared grid component used to show tables in various interfaces.
* @extends Component
*/
class GridComponent extends Component {
static get selector() { return 'app-grid' }
static get template() { return template }
static get props() {
return [
'show_row_numbers',
'column_defs',
'data',
]
}
GridCellRenderType = GridCellRenderType
/**
* Called when the component is instantiated.
* @return {Promise&lt;void>}
*/
async vue_on_create() {
}
/**
* Called when the component renderer emits a click event, to pass it along to the column definition.
* @param {object} col - the column definition
* @param {object} row - the row clicked
* @param {object} passcol - the column emitted from the component
*/
on_col_click(col, [row, passcol]) {
col.on_click(row, passcol)
}
}
export default GridComponent
</code></pre>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-routing.html">routing</a></li><li><a href="module-util.html">util</a></li></ul><h3>Classes</h3><ul><li><a href="AddPlayersComponent.html">AddPlayersComponent</a></li><li><a href="DraftBoardComponent.html">DraftBoardComponent</a></li><li><a href="GridActionButtonComponent.html">GridActionButtonComponent</a></li><li><a href="GridComponent.html">GridComponent</a></li><li><a href="LeagueComponent.html">LeagueComponent</a></li><li><a href="LinkComponent.html">LinkComponent</a></li><li><a href="module-routing-Router.html">Router</a></li><li><a href="MyTeamComponent.html">MyTeamComponent</a></li><li><a href="ScoresComponent.html">ScoresComponent</a></li><li><a href="TopLevelComponent.html">TopLevelComponent</a></li></ul><h3>Global</h3><ul><li><a href="global.html#GridCellRenderType">GridCellRenderType</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.5</a> on Sun Oct 25 2020 12:32:18 GMT-0500 (Central Daylight Time)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>

@ -0,0 +1,166 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Source: components/GridActionButton.component.js</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Source: components/GridActionButton.component.js</h1>
<section>
<article>
<pre class="prettyprint source linenums"><code>import {Component} from '../../lib/vues6.js'
const template = `
&lt;div class="component-action-button">
&lt;button
v-if="!hidden"
v-bind:style="{border: '2px solid lightgrey', borderRadius: '3px', backgroundColor: color, color: 'white'}"
@click="on_click($event)"
>{{ text }}&lt;/button>
&lt;/div>
`
/**
* Component representing an action button that can be embedded in the shared grid.
* @extends Component
*/
class GridActionButtonComponent extends Component {
static get selector() { return 'app-action-button' }
static get template() { return template }
static get props() { return ['row', 'col'] }
/**
* The text shown on the action button.
* @type {string}
*/
text = ''
/**
* The CSS color of the action button.
* @type {string}
*/
color = 'white'
/**
* If true, the action button will be hidden.
* @type {boolean}
*/
hidden = false
/**
* Called when the component is instantiated. Updates the text, color, and hide status.
* @return {Promise&lt;void>}
*/
async vue_on_create() {
this.update_text()
this.update_color()
this.update_hidden()
}
/**
* Called when the row value changes. Updates the text, color, and hide status.
*/
watch_row() {
this.update_text()
this.update_color()
this.update_hidden()
}
/**
* Called when the column value changes. Updates the text, color, and hide status.
*/
watch_col() {
this.update_text()
this.update_color()
this.update_hidden()
}
/**
* Determine the text to show on the button based on the column definition.
*/
update_text() {
if ( typeof this.col.button_text === 'function' ) {
this.text = this.col.button_text(this.row, this.col)
} else {
this.text = this.col.button_text || ''
}
}
/**
* Determine the color to show on the button based on the column definition.
*/
update_color() {
if ( typeof this.col.button_color === 'function' ) {
this.color = this.col.button_color(this.row, this.col)
} else {
this.color = this.col.button_color || 'white'
}
}
/**
* Determine whether the button should be shown or not, based on the column definition.
*/
update_hidden() {
if ( !('button_hidden' in this.col) ) {
this.hidden = false;
} else if ( typeof this.col.button_hidden === 'function' ) {
this.hidden = this.col.button_hidden(this.row, this.col)
} else {
this.hidden = this.col.button_hidden
}
}
/**
* Called when the button is clicked. Emits a click event and updates the text, color, and hide status.
* @param {MouseEvent} $event
*/
on_click($event) {
this.$emit('click', [this.row, this.col])
this.update_text()
this.update_color()
this.update_hidden()
}
}
export default GridActionButtonComponent
</code></pre>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-routing.html">routing</a></li><li><a href="module-util.html">util</a></li></ul><h3>Classes</h3><ul><li><a href="AddPlayersComponent.html">AddPlayersComponent</a></li><li><a href="DraftBoardComponent.html">DraftBoardComponent</a></li><li><a href="GridActionButtonComponent.html">GridActionButtonComponent</a></li><li><a href="GridComponent.html">GridComponent</a></li><li><a href="LeagueComponent.html">LeagueComponent</a></li><li><a href="LinkComponent.html">LinkComponent</a></li><li><a href="module-routing-Router.html">Router</a></li><li><a href="MyTeamComponent.html">MyTeamComponent</a></li><li><a href="ScoresComponent.html">ScoresComponent</a></li><li><a href="TopLevelComponent.html">TopLevelComponent</a></li></ul><h3>Global</h3><ul><li><a href="global.html#GridCellRenderType">GridCellRenderType</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.5</a> on Sun Oct 25 2020 12:32:18 GMT-0500 (Central Daylight Time)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>

@ -0,0 +1,76 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Source: components/Link.component.js</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Source: components/Link.component.js</h1>
<section>
<article>
<pre class="prettyprint source linenums"><code>import {Component} from '../../lib/vues6.js'
import {router} from '../module/routing.js'
const template = `
&lt;a href="#" @click="on_click()">{{ text }}&lt;/a>
`
/**
* Component providing hyper-links that navigate to other pages in the SPA,
* without reloading the page.
*/
class LinkComponent extends Component {
static get selector() { return 'app-link' }
static get template() { return template }
static get props() { return ['href', 'args', 'text'] }
/**
* Called when the link is clicked. Navigates the router.
*/
on_click() {
router.navigate(this.href, this.args)
}
}
export default LinkComponent
</code></pre>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-routing.html">routing</a></li><li><a href="module-util.html">util</a></li></ul><h3>Classes</h3><ul><li><a href="AddPlayersComponent.html">AddPlayersComponent</a></li><li><a href="DraftBoardComponent.html">DraftBoardComponent</a></li><li><a href="GridActionButtonComponent.html">GridActionButtonComponent</a></li><li><a href="GridComponent.html">GridComponent</a></li><li><a href="LeagueComponent.html">LeagueComponent</a></li><li><a href="LinkComponent.html">LinkComponent</a></li><li><a href="module-routing-Router.html">Router</a></li><li><a href="MyTeamComponent.html">MyTeamComponent</a></li><li><a href="ScoresComponent.html">ScoresComponent</a></li><li><a href="TopLevelComponent.html">TopLevelComponent</a></li></ul><h3>Global</h3><ul><li><a href="global.html#GridCellRenderType">GridCellRenderType</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.5</a> on Sun Oct 25 2020 12:32:18 GMT-0500 (Central Daylight Time)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>

@ -0,0 +1,152 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Source: components/TopLevel.component.js</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Source: components/TopLevel.component.js</h1>
<section>
<article>
<pre class="prettyprint source linenums"><code>import {Component} from '../../lib/vues6.js'
import {router} from '../module/routing.js'
const template = `
&lt;div class="top-level-container">
&lt;div class="navbar-container">
&lt;h1 class="title">Fantasy Football&lt;/h1>
&lt;ul class="navbar">
&lt;li class="navbar-item" v-for="item of navbar_items" :class="{ active: current_route === item.page }">
&lt;app-link :href="item.page" :text="item.title">&lt;/app-link>
&lt;/li>
&lt;li class="navbar-item">
&lt;a href="#" @click="on_refresh($event)">Refresh&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/div>
&lt;div class="page-container">
&lt;page-my-team v-if="current_route === 'my-team'">&lt;/page-my-team>
&lt;page-add-players v-if="current_route === 'my-team/add-players'">&lt;/page-add-players>
&lt;page-scores v-if="current_route === 'scores'">&lt;/page-scores>
&lt;page-league v-if="current_route === 'league'">&lt;/page-league>
&lt;page-draft-board v-if="current_route === 'draft-board'">&lt;/page-draft-board>
&lt;/div>
&lt;/div>
`
/**
* Top-level component which manages the display of the entire game.
* @extends Component
*/
class TopLevelComponent extends Component {
static get selector() { return 'app-top-level' }
static get template() { return template }
static get props() { return [] }
/**
* The currently loaded page route.
* @type {string}
*/
current_route = ''
/**
* Array of navigation bar items where "title" is the page name, and "page" is the page route.
* @type {Array&lt;object>}
*/
navbar_items = [
{ title: 'My Team', page: 'my-team' },
{ title: 'Add Players', page: 'my-team/add-players' },
{ title: 'Scores', page: 'scores' },
{ title: 'League', page: 'league' },
{ title: 'Draft Board', page: 'draft-board' },
]
/**
* Called when the component is initialized.
* @return {Promise&lt;void>}
*/
async vue_on_create() {
// Listen for navigation changes.
this.router_subscription = router.subscribe((path, args) => this.on_route_change(path, args))
if ( !this.current_route ) {
router.navigate('my-team')
}
const url_params = new URLSearchParams(window.location.search)
if ( url_params.has('then') ) {
const route = url_params.get('then')
router.navigate(route)
}
}
/**
* Called when the component is destroyed.
* @return {Promise&lt;void>}
*/
async vue_on_destroy() {
// Stop listening for navigation changes.
this.router_subscription.unsubscribe()
}
/**
* Called when the navigation changes.
* @param {string} path
* @param {*} args
* @return {Promise&lt;void>}
*/
async on_route_change(path, args) {
if ( path.startsWith('/') ) path = path.slice(1)
if ( path.endsWith('/') ) path = path.slice(0, -1)
this.current_route = path
}
on_refresh($event) {
window.location.href = `/?then=${this.current_route}`
}
}
export default TopLevelComponent
</code></pre>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-routing.html">routing</a></li><li><a href="module-util.html">util</a></li></ul><h3>Classes</h3><ul><li><a href="AddPlayersComponent.html">AddPlayersComponent</a></li><li><a href="DraftBoardComponent.html">DraftBoardComponent</a></li><li><a href="GridActionButtonComponent.html">GridActionButtonComponent</a></li><li><a href="GridComponent.html">GridComponent</a></li><li><a href="LeagueComponent.html">LeagueComponent</a></li><li><a href="LinkComponent.html">LinkComponent</a></li><li><a href="module-routing-Router.html">Router</a></li><li><a href="MyTeamComponent.html">MyTeamComponent</a></li><li><a href="ScoresComponent.html">ScoresComponent</a></li><li><a href="TopLevelComponent.html">TopLevelComponent</a></li></ul><h3>Global</h3><ul><li><a href="global.html#GridCellRenderType">GridCellRenderType</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.5</a> on Sun Oct 25 2020 12:32:18 GMT-0500 (Central Daylight Time)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>

@ -0,0 +1,641 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Source: components/pages/AddPlayers.component.js</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Source: components/pages/AddPlayers.component.js</h1>
<section>
<article>
<pre class="prettyprint source linenums"><code>import { Component } from '../../../lib/vues6.js'
const template = `
&lt;div class="page-add-players">
&lt;div class="header">
&lt;div class="left">
&lt;h2>Add Players to Team&lt;/h2>
&lt;/div>
&lt;div class="right">
&lt;button :class="{ 'disable-click': my_team_only }" @click="to_my_team_only()">My Team&lt;/button>&lt;button :class="{ 'disable-click': !my_team_only }" @click="to_all_players()">All Players&lt;/button>
&lt;/div>
&lt;div class="right">
&lt;input type="text" placeholder="Quick filter..." v-model="quick_filter" @keyup="on_filter_change()">
&lt;/div>
&lt;/div>
&lt;div class="item-grid">
&lt;div class="item" v-for="player of filtered_players" @mouseover="on_photo_hover(player)"
@mouseleave="on_photo_leave(player)">
&lt;div style="display: flex; flex-direction: column; height: 100%;">
&lt;div class="item-icon" v-if="!player.showing_stats">
&lt;img :src="player.image" :alt="player.name">
&lt;/div>
&lt;div class="item-contents" v-if="!player.showing_stats">
&lt;h1>{{ player.name }}&lt;/h1>
&lt;p>#{{ player.number }} ({{ player.position }})&lt;/p>
&lt;div class="moreStats">
&lt;p>{{ player.stats }}&lt;/p>
&lt;/div>
&lt;/div>
&lt;div class="item-contents" style="flex: 1;" v-else>
Hi! Show stats here.
&lt;/div>
&lt;div class="item-button">
&lt;button
v-if="my_team.length &lt; 15 &amp;&amp; !my_team.includes(player)"
@click="add_to_team(player)"
class="add"
>Add to Team&lt;/button>
&lt;button
v-if="my_team.includes(player)"
@click="remove_from_team(player)"
class="remove"
>Remove from Team&lt;/button>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
`
/**
* A component which represents the "Add Players" page. Allows users to add/remove
* players from their team.
* @extends Component
*/
class AddPlayersComponent extends Component {
static get selector() { return 'page-add-players' }
static get props() { return [] }
static get template() { return template }
/**
* The current value of the quick filter for players. If empty string, no filter is applied.
* @type {string}
*/
quick_filter = ''
/**
* If true, then only the players on the user's team will be shown.
* @type {boolean}
*/
my_team_only = false
/**
* Array of players currently on the user's team.
* @type {object[]}
*/
my_team = []
/**
* Array of currently displayed players, after the filter has been applied.
* @type {object[]}
*/
filtered_players = []
/**
* Array of currently displayed players, before the filter has been applied.
* @type {object[]}
*/
possible_players = []
/**
* All available players, whether they are on the user's team or not.
* @type {object[]}
*/
all_players = [
{
"number": 14,
"name": "Andy Dalton",
"position": "Quarterback",
"stats": "Passing: 1,856 YDS",
"image": "https://images.generated.photos/-K9iBY4oOkLsqQfoTA1R8X0EKvR_BCbMXk0KNX4EIIs/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA0NzY1MjkuanBn.jpg",
"showing_stats": false
},
{
"number": 7,
"name": "Ben DiNucci",
"position": "Quarterback",
"stats": "Passing: 856 YDS",
"image": "https://images.generated.photos/EUa6Hmnt6682dl03Q5FPIeMqLnS833rfzOJaJXlYxqI/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAxNTk3OTFfMDU1/Nzg5OF8wMzgzMzIw/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 3,
"name": "Garrett Gilbert",
"position": "Quarterback",
"stats": "Passing: 758 YDS",
"image": "https://images.generated.photos/eGoWRgqxtahGFDAD81-l8CNxdz1oe-huz3CQ7m3v0VI/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAzNDA0NDlfMDgz/MDY1Nl8wMTk4NTI4/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 34,
"name": "Rico Dowdle",
"position": "Running back",
"stats": "1,368 YDS",
"image": "https://images.generated.photos/fd8kkioB4vLw_5MGwQXdDt9Q7Ley2_Ia8Cu390zaNVM/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA0Nzg2ODEuanBn.jpg",
"showing_stats": false
},
{
"number": 21,
"name": "Ezekiel Elliott",
"position": "Running back",
"stats": "1,842 YDS",
"image": "https://images.generated.photos/PEBx5b8_iPHU_nJpJbh3geUN8cBFglHVAAR9NktzXsk/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAxODI1NzlfMDgx/MTA0OV8wNDQzOTM5/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 20,
"name": "Tony Pollard",
"position": "Running back",
"stats": "1,623 YDS",
"image": "https://images.generated.photos/cb3jAo-GBziFLxs85KJGt7a8bJdhz4sSy76PYAXkeg4/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA1ODU4MDBfMDMy/NjY2OF8wODEwNTA2/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 85,
"name": "Noah Brown",
"position": "Wide receiver",
"stats": "666 YDS",
"image": "https://images.generated.photos/LLiy3FypH5A1suda78U82t_Kcn9AlJwZt1g3w1p5DwE/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAzODc0NjlfMDUy/MDc0NF8wNzc3NzQ5/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 19,
"name": "Amari Cooper",
"position": "Wide receiver",
"stats": "256 YDS",
"image": "https://images.generated.photos/dW84LNLE4Kzp73NTTnL68U--dYuq8CCzD-dGTs76U38/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAyNjE1NjZfMDEz/NDM1NF8wMTg5MjI0/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 13,
"name": "Michael Gallup",
"position": "Wide receiver",
"stats": "13 YDS",
"image": "https://images.generated.photos/erudOopARQnXWNaLqkIPRLLMLAVBr8m70aFC_dtYu1Y/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAzODA5MTVfMDkx/MzIzN18wNDQxMTk4/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 88,
"name": "CeeDee Lamb",
"position": "Wide receiver",
"stats": "25 YDS",
"image": "https://images.generated.photos/WFV4nHHq5ZaBb1rdmFL5WEZTOanckWHEfkmDA1fOVfw/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAxNTYzNzNfMDI4/Nzc2N18wNzYxNDY3/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 17,
"name": "Malik Turner",
"position": "Wide receiver",
"stats": "551 YDS",
"image": "https://images.generated.photos/PEBx5b8_iPHU_nJpJbh3geUN8cBFglHVAAR9NktzXsk/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAxODI1NzlfMDgx/MTA0OV8wNDQzOTM5/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 11,
"name": "Cedrick Wilson Jr.",
"position": "Wide receiver",
"stats": "551 YDS",
"image": "https://images.generated.photos/fd8kkioB4vLw_5MGwQXdDt9Q7Ley2_Ia8Cu390zaNVM/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA0Nzg2ODEuanBn.jpg",
"showing_stats": false
},
{
"number": 80,
"name": "Blake Bell",
"position": "Tight end",
"image": "https://images.generated.photos/eGoWRgqxtahGFDAD81-l8CNxdz1oe-huz3CQ7m3v0VI/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAzNDA0NDlfMDgz/MDY1Nl8wMTk4NTI4/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 84,
"name": "Sean McKeon",
"position": "Tight end",
"image": "https://images.generated.photos/EUa6Hmnt6682dl03Q5FPIeMqLnS833rfzOJaJXlYxqI/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAxNTk3OTFfMDU1/Nzg5OF8wMzgzMzIw/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 86,
"name": "Dalton Schultz",
"position": "Tight end",
"stats": "551 YDS",
"image": "https://images.generated.photos/-K9iBY4oOkLsqQfoTA1R8X0EKvR_BCbMXk0KNX4EIIs/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA0NzY1MjkuanBn.jpg",
"showing_stats": false
},
{
"number": 63,
"name": "Tyler Biadasz C",
"position": "Offensive lineman",
"stats": "551 YDS",
"image": "https://images.generated.photos/cb3jAo-GBziFLxs85KJGt7a8bJdhz4sSy76PYAXkeg4/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA1ODU4MDBfMDMy/NjY2OF8wODEwNTA2/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 69,
"name": "Brandon Knight T/G",
"position": "Offensive lineman",
"stats": "551 YDS",
"image": "https://images.generated.photos/LLiy3FypH5A1suda78U82t_Kcn9AlJwZt1g3w1p5DwE/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAzODc0NjlfMDUy/MDc0NF8wNzc3NzQ5/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 70,
"name": "Zack Martin G",
"position": "Offensive lineman",
"stats": "551 YDS",
"image": "https://images.generated.photos/dW84LNLE4Kzp73NTTnL68U--dYuq8CCzD-dGTs76U38/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAyNjE1NjZfMDEz/NDM1NF8wMTg5MjI0/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 66,
"name": "Connor McGovern G",
"position": "Offensive lineman",
"stats": "551 YDS",
"image": "https://images.generated.photos/erudOopARQnXWNaLqkIPRLLMLAVBr8m70aFC_dtYu1Y/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAzODA5MTVfMDkx/MzIzN18wNDQxMTk4/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 64,
"name": "Greg Senat T",
"position": "Offensive lineman",
"stats": "551 YDS",
"image": "https://images.generated.photos/WFV4nHHq5ZaBb1rdmFL5WEZTOanckWHEfkmDA1fOVfw/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAxNTYzNzNfMDI4/Nzc2N18wNzYxNDY3/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 78,
"name": "Terence Steele T",
"position": "Offensive lineman",
"stats": "551 YDS",
"image": "https://images.generated.photos/PEBx5b8_iPHU_nJpJbh3geUN8cBFglHVAAR9NktzXsk/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAxODI1NzlfMDgx/MTA0OV8wNDQzOTM5/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 52,
"name": "Connor Williams G",
"position": "Offensive lineman",
"stats": "551 YDS",
"image": "https://images.generated.photos/fd8kkioB4vLw_5MGwQXdDt9Q7Ley2_Ia8Cu390zaNVM/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA0Nzg2ODEuanBn.jpg",
"showing_stats": false
},
{
"number": 56,
"name": "Bradlee Anae DE",
"position": "Defensive lineman",
"stats": "551 YDS",
"image": "https://images.generated.photos/eGoWRgqxtahGFDAD81-l8CNxdz1oe-huz3CQ7m3v0VI/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAzNDA0NDlfMDgz/MDY1Nl8wMTk4NTI4/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 92,
"name": "Dorance Armstrong DE",
"position": "Defensive lineman",
"stats": "551 YDS",
"image": "https://images.generated.photos/EUa6Hmnt6682dl03Q5FPIeMqLnS833rfzOJaJXlYxqI/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAxNTk3OTFfMDU1/Nzg5OF8wMzgzMzIw/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 98,
"name": "Tyrone Crawford DT/DE",
"position": "Defensive lineman",
"stats": "551 YDS",
"image": "https://images.generated.photos/-K9iBY4oOkLsqQfoTA1R8X0EKvR_BCbMXk0KNX4EIIs/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA0NzY1MjkuanBn.jpg",
"showing_stats": false
},
{
"number": 96,
"name": "Neville Gallimore DT",
"position": "Defensive lineman",
"stats": "551 YDS",
"image": "https://images.generated.photos/cb3jAo-GBziFLxs85KJGt7a8bJdhz4sSy76PYAXkeg4/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA1ODU4MDBfMDMy/NjY2OF8wODEwNTA2/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 94,
"name": "Randy Gregory DE",
"position": "Defensive lineman",
"stats": "551 YDS",
"image": "https://images.generated.photos/LLiy3FypH5A1suda78U82t_Kcn9AlJwZt1g3w1p5DwE/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAzODc0NjlfMDUy/MDc0NF8wNzc3NzQ5/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 97,
"name": "Everson Griffen DE",
"position": "Defensive lineman",
"stats": "551 YDS",
"image": "https://images.generated.photos/dW84LNLE4Kzp73NTTnL68U--dYuq8CCzD-dGTs76U38/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAyNjE1NjZfMDEz/NDM1NF8wMTg5MjI0/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 79,
"name": "Justin Hamilton DT",
"position": "Defensive lineman",
"stats": "551 YDS",
"image": "https://images.generated.photos/erudOopARQnXWNaLqkIPRLLMLAVBr8m70aFC_dtYu1Y/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAzODA5MTVfMDkx/MzIzN18wNDQxMTk4/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 90,
"name": "DeMarcus Lawrence DE",
"position": "Defensive lineman",
"stats": "551 YDS",
"image": "https://images.generated.photos/WFV4nHHq5ZaBb1rdmFL5WEZTOanckWHEfkmDA1fOVfw/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAxNTYzNzNfMDI4/Nzc2N18wNzYxNDY3/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 95,
"name": "Dontari Poe DT",
"position": "Defensive lineman",
"stats": "551 YDS",
"image": "https://images.generated.photos/PEBx5b8_iPHU_nJpJbh3geUN8cBFglHVAAR9NktzXsk/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAxODI1NzlfMDgx/MTA0OV8wNDQzOTM5/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 58,
"name": "Aldon Smith DE/OLB",
"position": "Defensive lineman",
"stats": "551 YDS",
"image": "https://images.generated.photos/fd8kkioB4vLw_5MGwQXdDt9Q7Ley2_Ia8Cu390zaNVM/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA0Nzg2ODEuanBn.jpg",
"showing_stats": false
},
{
"number": 99,
"name": "Antwaun Woods DT",
"position": "Defensive lineman",
"stats": "551 YDS",
"image": "https://images.generated.photos/eGoWRgqxtahGFDAD81-l8CNxdz1oe-huz3CQ7m3v0VI/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAzNDA0NDlfMDgz/MDY1Nl8wMTk4NTI4/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 57,
"name": "Luke Gifford MLB/OLB",
"position": "Linebacker",
"stats": "551 YDS",
"image": "https://images.generated.photos/EUa6Hmnt6682dl03Q5FPIeMqLnS833rfzOJaJXlYxqI/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAxNTk3OTFfMDU1/Nzg5OF8wMzgzMzIw/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 59,
"name": "Justin March OLB/MLB",
"position": "Linebacker",
"stats": "551 YDS",
"image": "https://images.generated.photos/-K9iBY4oOkLsqQfoTA1R8X0EKvR_BCbMXk0KNX4EIIs/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA0NzY1MjkuanBn.jpg",
"showing_stats": false
},
{
"number": 54,
"name": "Jaylon Smith OLB",
"position": "Linebacker",
"stats": "551 YDS",
"image": "https://images.generated.photos/cb3jAo-GBziFLxs85KJGt7a8bJdhz4sSy76PYAXkeg4/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA1ODU4MDBfMDMy/NjY2OF8wODEwNTA2/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 53,
"name": "Rashad Smith MLB",
"position": "Linebacker",
"stats": "551 YDS",
"image": "https://images.generated.photos/LLiy3FypH5A1suda78U82t_Kcn9AlJwZt1g3w1p5DwE/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAzODc0NjlfMDUy/MDc0NF8wNzc3NzQ5/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 48,
"name": "Joe Thomas OLB/MLB",
"position": "Linebacker",
"stats": "551 YDS",
"image": "https://images.generated.photos/dW84LNLE4Kzp73NTTnL68U--dYuq8CCzD-dGTs76U38/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAyNjE1NjZfMDEz/NDM1NF8wMTg5MjI0/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 55,
"name": "Leighton Vander Esch MLB",
"position": "Linebacker",
"stats": "551 YDS",
"image": "https://images.generated.photos/erudOopARQnXWNaLqkIPRLLMLAVBr8m70aFC_dtYu1Y/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAzODA5MTVfMDkx/MzIzN18wNDQxMTk4/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 30,
"name": "Anthony Brown CB",
"position": "Defensive back",
"stats": "551 YDS",
"image": "https://images.generated.photos/WFV4nHHq5ZaBb1rdmFL5WEZTOanckWHEfkmDA1fOVfw/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAxNTYzNzNfMDI4/Nzc2N18wNzYxNDY3/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 27,
"name": "Trevon Diggs CB",
"position": "Defensive back",
"stats": "551 YDS",
"image": "https://images.generated.photos/PEBx5b8_iPHU_nJpJbh3geUN8cBFglHVAAR9NktzXsk/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAxODI1NzlfMDgx/MTA0OV8wNDQzOTM5/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 29,
"name": "C. J. Goodwin CB",
"position": "Defensive back",
"stats": "551 YDS",
"image": "https://images.generated.photos/fd8kkioB4vLw_5MGwQXdDt9Q7Ley2_Ia8Cu390zaNVM/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA0Nzg2ODEuanBn.jpg",
"showing_stats": false
},
{
"number": 26,
"name": "Jourdan Lewis CB",
"position": "Defensive back",
"stats": "551 YDS",
"image": "https://images.generated.photos/eGoWRgqxtahGFDAD81-l8CNxdz1oe-huz3CQ7m3v0VI/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAzNDA0NDlfMDgz/MDY1Nl8wMTk4NTI4/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 40,
"name": "Steven Parker SS/FS",
"position": "Defensive back",
"stats": "551 YDS",
"image": "https://images.generated.photos/EUa6Hmnt6682dl03Q5FPIeMqLnS833rfzOJaJXlYxqI/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAxNTk3OTFfMDU1/Nzg5OF8wMzgzMzIw/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 41,
"name": "Reggie Robinson FS/CB",
"position": "Defensive back",
"stats": "551 YDS",
"image": "https://images.generated.photos/-K9iBY4oOkLsqQfoTA1R8X0EKvR_BCbMXk0KNX4EIIs/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA0NzY1MjkuanBn.jpg",
"showing_stats": false
},
{
"number": 23,
"name": "Darian Thompson SS/FS",
"position": "Defensive back",
"stats": "551 YDS",
"image": "https://images.generated.photos/cb3jAo-GBziFLxs85KJGt7a8bJdhz4sSy76PYAXkeg4/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA1ODU4MDBfMDMy/NjY2OF8wODEwNTA2/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 37,
"name": "Donovan Wilson SS/FS",
"position": "Defensive back",
"stats": "551 YDS",
"image": "https://images.generated.photos/LLiy3FypH5A1suda78U82t_Kcn9AlJwZt1g3w1p5DwE/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAzODc0NjlfMDUy/MDc0NF8wNzc3NzQ5/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 25,
"name": "Xavier Woods FS",
"position": "Defensive back",
"stats": "551 YDS",
"image": "https://images.generated.photos/dW84LNLE4Kzp73NTTnL68U--dYuq8CCzD-dGTs76U38/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAyNjE1NjZfMDEz/NDM1NF8wMTg5MjI0/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 28,
"name": "Daryl Worley CB/S",
"position": "Defensive back",
"stats": "551 YDS",
"image": "https://images.generated.photos/erudOopARQnXWNaLqkIPRLLMLAVBr8m70aFC_dtYu1Y/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAzODA5MTVfMDkx/MzIzN18wNDQxMTk4/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 6,
"name": "Chris Jones P",
"position": "Special team",
"stats": "551 YDS",
"image": "https://images.generated.photos/WFV4nHHq5ZaBb1rdmFL5WEZTOanckWHEfkmDA1fOVfw/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAxNTYzNzNfMDI4/Nzc2N18wNzYxNDY3/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 91,
"name": "L. P. Ladouceur LS",
"position": "Special team",
"stats": "551 YDS",
"image": "https://images.generated.photos/PEBx5b8_iPHU_nJpJbh3geUN8cBFglHVAAR9NktzXsk/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAxODI1NzlfMDgx/MTA0OV8wNDQzOTM5/LmpwZw.jpg",
"showing_stats": false
},
{
"number": 2,
"name": "Greg Zuerlein K",
"position": "Special team",
"stats": "551 YDS",
"image": "https://images.generated.photos/fd8kkioB4vLw_5MGwQXdDt9Q7Ley2_Ia8Cu390zaNVM/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA0Nzg2ODEuanBn.jpg",
"showing_stats": false
}
]
/**
* Called when the page is instantiated.
* @return {Promise&lt;void>}
*/
async vue_on_create() {
this.possible_players = [...this.all_players];
this.filtered_players = [...this.possible_players];
}
/**
* Called when the quick-filter changes. Applies the filter to the displayed players.
*/
on_filter_change() {
const query = this.quick_filter.toLowerCase()
this.filtered_players = this.possible_players.filter(x => {
if (!query) return true;
return x.name.toLowerCase().includes(query) || x.position.toLowerCase().includes(query)
})
}
/**
* When called, change the display to show only the user's team.
*/
to_my_team_only() {
this.my_team_only = true;
this.possible_players = [...this.my_team]
this.on_filter_change()
}
/**
* When called, change the display to show all available players.
*/
to_all_players() {
this.my_team_only = false;
this.possible_players = [...this.all_players]
this.on_filter_change()
}
/**
* Add the given player to the user's team, if not already there.
* @param {object} player
*/
add_to_team(player) {
if (!this.my_team.includes(player)) {
this.my_team.push(player)
}
}
/**
* Remove the given player from the user's team, if there.
* @param {object} player
*/
remove_from_team(player) {
this.my_team = this.my_team.filter(x => x !== player)
player.showing_stats = false
if (this.my_team_only) this.to_my_team_only()
}
/**
* Called when the user hovers over a player. Toggles the stats to be shown.
* @param {object} player
*/
on_photo_hover(player) {
player.showing_stats = true
}
/**
* Called when the user un-hovers over a player. Toggles the stats to hide.
* @param {object} player
*/
on_photo_leave(player) {
player.showing_stats = false
}
}
export default AddPlayersComponent
</code></pre>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-routing.html">routing</a></li><li><a href="module-util.html">util</a></li></ul><h3>Classes</h3><ul><li><a href="AddPlayersComponent.html">AddPlayersComponent</a></li><li><a href="DraftBoardComponent.html">DraftBoardComponent</a></li><li><a href="GridActionButtonComponent.html">GridActionButtonComponent</a></li><li><a href="GridComponent.html">GridComponent</a></li><li><a href="LeagueComponent.html">LeagueComponent</a></li><li><a href="LinkComponent.html">LinkComponent</a></li><li><a href="module-routing-Router.html">Router</a></li><li><a href="MyTeamComponent.html">MyTeamComponent</a></li><li><a href="ScoresComponent.html">ScoresComponent</a></li><li><a href="TopLevelComponent.html">TopLevelComponent</a></li></ul><h3>Global</h3><ul><li><a href="global.html#GridCellRenderType">GridCellRenderType</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.5</a> on Sun Oct 25 2020 12:32:18 GMT-0500 (Central Daylight Time)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>

@ -0,0 +1,74 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Source: components/pages/DraftBoard.component.js</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Source: components/pages/DraftBoard.component.js</h1>
<section>
<article>
<pre class="prettyprint source linenums"><code>import {Component} from '../../../lib/vues6.js'
const template = `
&lt;div class="page-draft-board">
Draft Board
&lt;/div>
`
/**
* Component representing the draft board page.
* @extends Component
*/
class DraftBoardComponent extends Component {
static get selector() { return 'page-draft-board' }
static get template() { return template }
static get props() { return [] }
async vue_on_create() {
}
}
export default DraftBoardComponent
</code></pre>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-routing.html">routing</a></li><li><a href="module-util.html">util</a></li></ul><h3>Classes</h3><ul><li><a href="AddPlayersComponent.html">AddPlayersComponent</a></li><li><a href="DraftBoardComponent.html">DraftBoardComponent</a></li><li><a href="GridActionButtonComponent.html">GridActionButtonComponent</a></li><li><a href="GridComponent.html">GridComponent</a></li><li><a href="LeagueComponent.html">LeagueComponent</a></li><li><a href="LinkComponent.html">LinkComponent</a></li><li><a href="module-routing-Router.html">Router</a></li><li><a href="MyTeamComponent.html">MyTeamComponent</a></li><li><a href="ScoresComponent.html">ScoresComponent</a></li><li><a href="TopLevelComponent.html">TopLevelComponent</a></li></ul><h3>Global</h3><ul><li><a href="global.html#GridCellRenderType">GridCellRenderType</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.5</a> on Sun Oct 25 2020 12:32:18 GMT-0500 (Central Daylight Time)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>

File diff suppressed because one or more lines are too long

@ -0,0 +1,315 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Source: components/pages/MyTeam.component.js</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Source: components/pages/MyTeam.component.js</h1>
<section>
<article>
<pre class="prettyprint source linenums"><code>import {Component} from '../../../lib/vues6.js'
import {GridCellRenderType} from '../Grid.component.js'
const template = `
&lt;div class="page-my-team">
&lt;div class="header">
&lt;div class="left team-name">
&lt;h2>My Team - &lt;/h2>&lt;input placeholder="Click to edit team name..." type="text" v-model="team_name">
&lt;/div>
&lt;/div>
&lt;div class="body" style="display: flex; flex-direction: row; margin-left: 10px; padding-bottom: 50px;" v-if="show_body">
&lt;app-grid
:column_defs="overall_column_defs"
:data="overall_data"
:show_row_numbers="true"
style="flex: 1;"
>&lt;/app-grid>
&lt;div class="lineup-grids" style="margin-left: 30px; margin-right: 10px; flex: 1;">
&lt;h3>Starting Lineup&lt;/h3>
&lt;app-grid
:column_defs="lineup_column_defs"
:data="starting_players"
:show_row_numbers="false"
>&lt;/app-grid>
&lt;h3>Bench&lt;/h3>
&lt;app-grid
:column_defs="lineup_column_defs"
:data="bench_players"
:show_row_numbers="false"
>&lt;/app-grid>
&lt;/div>
&lt;/div>
&lt;/div>
`
/**
* Component representing the my-team page.
* @extends Component
*/
class MyTeamComponent extends Component {
static get selector() { return 'page-my-team' }
static get template() { return template }
static get props() { return [] }
/**
* The team name.
* @type {string}
*/
team_name = ''
/**
* If true, the body of the page will be shown. Otherwise, hidden.
* This is used to refresh the entire component at once.
* @type {boolean}
*/
show_body = true
/**
* The player currently being moved. If none, then will be set to undefined.
* @type {undefined}
*/
moving_player = undefined
/**
* Array of players filling starting line up positions. If no player is in
* a position, then only the "postition" key will be set.
* @type {object[]}
*/
starting_players = [
{
position: 'QB',
},
{
position: 'RB',
},
{
position: 'RB',
},
{
position: 'WR',
},
{
position: 'WR',
},
{
position: 'TE',
},
{
position: 'FLX',
},
{
position: 'DST',
},
]
/**
* Players on the bench.
* @type {object[]}
*/
bench_players = []
/**
* Column definitions for the starting/bench lineup grids.
* @type {object[]}
*/
lineup_column_defs = [
{
header: 'POS',
key: 'position',
},
{
header: 'Player',
key: 'player_name',
type: GridCellRenderType.HTML,
renderer: (_, data) => {
if ( !data.player_name ) {
return `&lt;i style="color: darkgrey">none&lt;/i>`
} else {
return `
&lt;div class="center">
&lt;img src="${data.image}" alt="${data.player_name}" height="50" style="border-radius: 50%">
&lt;span>${data.player_name}&lt;/span>
&lt;/div>
`
}
},
},
{
header: '',
key: 'player_name',
type: GridCellRenderType.Component,
component: Vue.component('app-action-button'),
button_color: (row, col) => this.moving_player ? '#CC5746' : '#0582CA',
button_text: (row, col) => {
return this.moving_player ? 'Here' : 'Move'
},
button_hidden: (row, col) => {
if ( this.moving_player &amp;&amp; this.moving_player.player_name !== row.player_name ) return false;
if ( !row.player_name ) return true;
return this.moving_player &amp;&amp; this.moving_player.player_name === row.player_name;
},
on_click: (row, col) => {
if ( !this.moving_player ) {
this.moving_player = row;
} else {
const old_row = {...row};
row.player_name = this.moving_player.player_name;
row.ecr = this.moving_player.ecr;
row.image = this.moving_player.image;
this.moving_player.player_name = old_row.player_name;
this.moving_player.ecr = old_row.ecr;
this.moving_player.image = old_row.image;
this.moving_player = undefined;
console.log(this.moving_player, row);
}
this.$_vue_inst.update(); // $_vue_inst refers to the Vue.component instance, not the data class.
},
},
]
/**
* Column definitions for the overall team grid.
* @type {object[]}
*/
overall_column_defs = [
{
header: 'Name',
key: 'player_name',
type: GridCellRenderType.HTML,
renderer: (_, data) => `
&lt;div class="center">
&lt;img src="${data.image}" alt="${data.player_name}" height="50" style="border-radius: 50%">
&lt;span>${data.player_name}&lt;/span>
&lt;/div>
`,
},
{
header: 'POS',
key: 'position',
},
{
header: 'ECR',
title: 'Expected Coverage Rating',
key: 'ecr',
},
]
/**
* Data for the overall team grid (list of user's team players).
* @type {object[]}
*/
overall_data = [
{
player_name: 'Christian McCaffrey',
position: 'RB1',
ecr: '0.0',
"image": "https://images.generated.photos/eGoWRgqxtahGFDAD81-l8CNxdz1oe-huz3CQ7m3v0VI/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAzNDA0NDlfMDgz/MDY1Nl8wMTk4NTI4/LmpwZw.jpg",
},
{
player_name: 'Ezekiel Elliott',
position: 'RB3',
ecr: '1.0',
"image": "https://images.generated.photos/fd8kkioB4vLw_5MGwQXdDt9Q7Ley2_Ia8Cu390zaNVM/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA0Nzg2ODEuanBn.jpg",
},
{
player_name: 'Dalvin Cook',
position: 'RB5',
ecr: '0.0',
"image": "https://images.generated.photos/PEBx5b8_iPHU_nJpJbh3geUN8cBFglHVAAR9NktzXsk/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAxODI1NzlfMDgx/MTA0OV8wNDQzOTM5/LmpwZw.jpg",
},
{
player_name: 'Alvin Kamara',
position: 'RB6',
ecr: '-1.0',
"image": "https://images.generated.photos/cb3jAo-GBziFLxs85KJGt7a8bJdhz4sSy76PYAXkeg4/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA1ODU4MDBfMDMy/NjY2OF8wODEwNTA2/LmpwZw.jpg",
},
{
player_name: 'Michael Thomas',
position: 'WR1',
ecr: '3.0',
"image": "https://images.generated.photos/LLiy3FypH5A1suda78U82t_Kcn9AlJwZt1g3w1p5DwE/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAzODc0NjlfMDUy/MDc0NF8wNzc3NzQ5/LmpwZw.jpg",
},
{
player_name: 'Davante Adams',
position: 'WR2',
ecr: '4.0',
"image": "https://images.generated.photos/dW84LNLE4Kzp73NTTnL68U--dYuq8CCzD-dGTs76U38/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAyNjE1NjZfMDEz/NDM1NF8wMTg5MjI0/LmpwZw.jpg",
},
{
player_name: 'Travis Kelce',
position: 'TE1',
ecr: '-4.0',
"image": "https://images.generated.photos/erudOopARQnXWNaLqkIPRLLMLAVBr8m70aFC_dtYu1Y/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAzODA5MTVfMDkx/MzIzN18wNDQxMTk4/LmpwZw.jpg",
},
]
/**
* Called when the component is instantiated. Initializes the bench players data.
* @return {Promise&lt;void>}
*/
async vue_on_create() {
this.bench_players = this.overall_data.map(x => { x = {...x, position: 'B'}; return x })
setTimeout(() => {
this.update();
}, 500);
}
/**
* Force re-render the entire component by briefly hiding it.
*/
update() {
this.show_body = false;
this.$nextTick(() => {
this.show_body = true;
});
}
}
export default MyTeamComponent
</code></pre>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-routing.html">routing</a></li><li><a href="module-util.html">util</a></li></ul><h3>Classes</h3><ul><li><a href="AddPlayersComponent.html">AddPlayersComponent</a></li><li><a href="DraftBoardComponent.html">DraftBoardComponent</a></li><li><a href="GridActionButtonComponent.html">GridActionButtonComponent</a></li><li><a href="GridComponent.html">GridComponent</a></li><li><a href="LeagueComponent.html">LeagueComponent</a></li><li><a href="LinkComponent.html">LinkComponent</a></li><li><a href="module-routing-Router.html">Router</a></li><li><a href="MyTeamComponent.html">MyTeamComponent</a></li><li><a href="ScoresComponent.html">ScoresComponent</a></li><li><a href="TopLevelComponent.html">TopLevelComponent</a></li></ul><h3>Global</h3><ul><li><a href="global.html#GridCellRenderType">GridCellRenderType</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.5</a> on Sun Oct 25 2020 12:32:18 GMT-0500 (Central Daylight Time)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>

@ -0,0 +1,398 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Source: components/pages/Scores.component.js</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Source: components/pages/Scores.component.js</h1>
<section>
<article>
<pre class="prettyprint source linenums"><code>import {Component} from '../../../lib/vues6.js'
import {GridCellRenderType} from '../Grid.component.js'
const template = `
&lt;div class="page-scores">
&lt;div class="header">
&lt;div class="left">
&lt;h2>Matchups &amp; Scores - &lt;small>Week {{ current_week }}&lt;/small>&lt;/h2>
&lt;/div>
&lt;div class="right">
&lt;button :class="{ 'disable-click': current_week === max_week }" @click="to_next_week()">Next Week&lt;/button>&lt;button :class="{ 'disable-click': current_week === min_week }" @click="to_previous_week()">Previous Week&lt;/button>
&lt;/div>
&lt;/div>
&lt;app-grid
:column_defs="column_defs"
:data="data"
:show_row_numbers="false"
>&lt;/app-grid>
&lt;/div>
`
/**
* Component representing the scores &amp; match-ups page.
* @extends Component
*/
class ScoresComponent extends Component {
static get selector() { return 'page-scores' }
static get template() { return template }
static get props() { return [] }
/**
* The number of the current week shown in the interface
* @type {number}
*/
current_week = 6
/**
* Most recent week number.
* @type {number}
*/
max_week = 6
/**
* Least recent week number.
* @type {number}
*/
min_week = 1
/**
* Array of arrays of data for each week with first item being week 1, second being week 2, &amp;c.
* @type {object[][]}
*/
week_x_data = [
// Week 1 Data
[
{
"date": "11/2/2020",
"team_1": "Team 1",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 50,
"team_2": "Team 6",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 73
},
{
"date": "10/23/2020",
"team_1": "Team 2",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 66,
"team_2": "Team 5",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 71,
"winner": "Team 5",
"winner_score": "84",
"loser_score": "41",
},
{
"date": "10/31/2020",
"team_1": "Team 3",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 85,
"team_2": "Team 4",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 67
},
],
// Week 2 Data
[
{
"date": "11/2/2020",
"team_1": "Team 1",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 58,
"team_2": "Team 6",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 34
},
{
"date": "10/23/2020",
"team_1": "Team 2",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 57,
"team_2": "Team 5",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 27,
"winner": "Team 5",
"winner_score": "84",
"loser_score": "41",
},
{
"date": "10/31/2020",
"team_1": "Team 3",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 48,
"team_2": "Team 4",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 49
},
],
// Week 3 Data
[
{
"date": "11/2/2020",
"team_1": "Team 1",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 67,
"team_2": "Team 6",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 47
},
{
"date": "10/23/2020",
"team_1": "Team 2",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 83,
"team_2": "Team 5",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 62,
"winner": "Team 5",
"winner_score": "84",
"loser_score": "41",
},
{
"date": "10/31/2020",
"team_1": "Team 3",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 48,
"team_2": "Team 4",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 17
},
],
// Week 4 Data
[
{
"date": "11/2/2020",
"team_1": "Team 1",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 30,
"team_2": "Team 6",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 41
},
{
"date": "10/23/2020",
"team_1": "Team 2",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 65,
"team_2": "Team 5",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 27,
"winner": "Team 5",
"winner_score": "84",
"loser_score": "41",
},
{
"date": "10/31/2020",
"team_1": "Team 3",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 48,
"team_2": "Team 4",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 24
},
],
// Week 5 Data
[
{
"date": "11/2/2020",
"team_1": "Team 1",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 43,
"team_2": "Team 6",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 48
},
{
"date": "10/23/2020",
"team_1": "Team 2",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 57,
"team_2": "Team 5",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 61,
"winner": "Team 5",
"winner_score": "84",
"loser_score": "41",
},
{
"date": "10/31/2020",
"team_1": "Team 3",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 48,
"team_2": "Team 4",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 91
},
],
// Week 6 Data
[
{
"date": "11/2/2020",
"team_1": "Team 1",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 50,
"team_2": "Team 6",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 37
},
{
"date": "10/23/2020",
"team_1": "Team 2",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 36,
"team_2": "Team 5",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 71,
"winner": "Team 5",
"winner_score": "84",
"loser_score": "41",
},
{
"date": "10/31/2020",
"team_1": "Team 3",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 48,
"team_2": "Team 4",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 1
},
]
]
/**
* Column definitions for the matchups grid.
* @type {object[]}
*/
column_defs = [
{
header: 'Date',
type: GridCellRenderType.HTML,
key: 'date',
renderer: (_, data) => {
return `${data.date} @ ${data.team_1}`
}
},
{
header: 'Team 1',
type: GridCellRenderType.HTML,
key: 'team_1',
renderer: (_, data) => `
&lt;div style="display: flex; flex-direction: row;">
&lt;img src="${data.team_1_logo}" alt="${data.team_1}">
&lt;div style="margin-left: 20px">
&lt;b>${data.team_1}&lt;/b>
&lt;p>Projection: ${data.team_1_projection}&lt;/p>
&lt;/div>
&lt;/div>
`
},
{
header: 'Team 2',
type: GridCellRenderType.HTML,
key: 'team_2',
renderer: (_, data) => `
&lt;div style="display: flex; flex-direction: row;">
&lt;img src="${data.team_2_logo}" alt="${data.team_2}">
&lt;div style="margin-left: 20px">
&lt;b>${data.team_2}&lt;/b>
&lt;p>Projection: ${data.team_2_projection}&lt;/p>
&lt;/div>
&lt;/div>
`
},
{
header: 'Outcome',
type: GridCellRenderType.HTML,
key: 'winner',
renderer: (_, data) => {
if ( data?.winner ) {
return `
&lt;div>&lt;b>Winner:&lt;/b> ${data.winner}&lt;/div>
&lt;div>&lt;b>Score: &lt;/b> ${data.winner_score} / ${data.loser_score}&lt;/div>
`
} else {
return `N/A`
}
},
}
]
/**
* The currently shown week's data.
* @type {object[]}
*/
data = []
/**
* Called when the component is instantiated. Initializes the current week to the most recent week.
* @return {Promise&lt;void>}
*/
async vue_on_create() {
this.data = this.week_x_data[this.max_week - 1];
}
/**
* When called, advances the data to the next-most recent week, if one exists.
*/
to_next_week() {
if ( this.current_week &lt; this.max_week ) {
this.current_week += 1;
this.data = this.week_x_data[this.current_week - 1];
}
}
/**
* When called, advances the data to the next-least recent week, if one exists.
*/
to_previous_week() {
if ( this.current_week > this.min_week ) {
this.current_week -= 1;
this.data = this.week_x_data[this.current_week - 1];
}
}
}
export default ScoresComponent
</code></pre>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-routing.html">routing</a></li><li><a href="module-util.html">util</a></li></ul><h3>Classes</h3><ul><li><a href="AddPlayersComponent.html">AddPlayersComponent</a></li><li><a href="DraftBoardComponent.html">DraftBoardComponent</a></li><li><a href="GridActionButtonComponent.html">GridActionButtonComponent</a></li><li><a href="GridComponent.html">GridComponent</a></li><li><a href="LeagueComponent.html">LeagueComponent</a></li><li><a href="LinkComponent.html">LinkComponent</a></li><li><a href="module-routing-Router.html">Router</a></li><li><a href="MyTeamComponent.html">MyTeamComponent</a></li><li><a href="ScoresComponent.html">ScoresComponent</a></li><li><a href="TopLevelComponent.html">TopLevelComponent</a></li></ul><h3>Global</h3><ul><li><a href="global.html#GridCellRenderType">GridCellRenderType</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.5</a> on Sun Oct 25 2020 12:32:18 GMT-0500 (Central Daylight Time)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 116 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 118 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 120 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 114 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 120 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 117 KiB

@ -0,0 +1,201 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Global</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Global</h1>
<section>
<header>
<h2></h2>
</header>
<article>
<div class="container-overview">
<dl class="details">
</dl>
</div>
<h3 class="subsection-title">Members</h3>
<h4 class="name" id="GridCellRenderType"><span class="type-signature">(constant) </span>GridCellRenderType<span class="type-signature"> :object</span></h4>
<div class="description">
An enum representing the different grid cell renderer types for the shared grid.
</div>
<h5>Type:</h5>
<ul>
<li>
<span class="param-type">object</span>
</li>
</ul>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="components_Grid.component.js.html">components/Grid.component.js</a>, <a href="components_Grid.component.js.html#line7">line 7</a>
</li></ul></dd>
</dl>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-routing.html">routing</a></li><li><a href="module-util.html">util</a></li></ul><h3>Classes</h3><ul><li><a href="AddPlayersComponent.html">AddPlayersComponent</a></li><li><a href="DraftBoardComponent.html">DraftBoardComponent</a></li><li><a href="GridActionButtonComponent.html">GridActionButtonComponent</a></li><li><a href="GridComponent.html">GridComponent</a></li><li><a href="LeagueComponent.html">LeagueComponent</a></li><li><a href="LinkComponent.html">LinkComponent</a></li><li><a href="module-routing-Router.html">Router</a></li><li><a href="MyTeamComponent.html">MyTeamComponent</a></li><li><a href="ScoresComponent.html">ScoresComponent</a></li><li><a href="TopLevelComponent.html">TopLevelComponent</a></li></ul><h3>Global</h3><ul><li><a href="global.html#GridCellRenderType">GridCellRenderType</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.5</a> on Sun Oct 25 2020 12:32:18 GMT-0500 (Central Daylight Time)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>

@ -0,0 +1,112 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Home</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Home</h1>
<h3> </h3>
<section>
<article><h1>Fantasy Football</h1>
<h2>EECS 448 - Projects 3 &amp; 4</h2>
<h2>Structure Info</h2>
<p>This project has been wired up to use Vue.js to help organize components of the game.</p>
<p>These components are defined in files that end in the <code>.component.js</code> extension, and are located in the <code>src/components/</code> directory.</p>
<p>The entry point for the project is the <code>index.html</code>. This file contains the basic logic for loading Vue, and adding the game board to the page.</p>
<p>Obviously, we'll flesh out the look-and-feel as we go along. This is just a basic starter for now.</p>
<h2>How to Run</h2>
<p>The easiest way to run this project is by creating a basic static web server using Python. This is super simple:</p>
<ol>
<li>Open a terminal or command prompt to the root of this project (i.e. the directory this file is in).</li>
<li>Start the server: <code>python -m http.server</code></li>
</ol>
<p>This will start a web server on port 8000. You can then run the game by navigating to http://localhost:8000/ from a web browser.</p>
<h3>Re-generating the documentation</h3>
<p>To regenerate the docs, you need Node.js and the Yarn package manager installed. Then, just:</p>
<pre class="prettyprint source lang-shell"><code>cd documentation
./generate.sh
</code></pre>
<h2>Works Cited</h2>
<p>The files in the <code>lib</code> directory are external libraries used in this project.</p>
<ul>
<li>Vue.js
<ul>
<li>A front-end framework. Used under the terms of the MIT license.</li>
<li>https://github.com/vuejs/vue</li>
</ul>
</li>
<li>VuES6.js
<ul>
<li>A kind-of crappy loader for defining Vue components using ES6 classes.</li>
<li>Also used under the terms of the MIT license.</li>
<li>https://code.garrettmills.dev/garrettmills/vues6</li>
</ul>
</li>
</ul>
<h2>Contributors</h2>
<ul>
<li>Lucas Brakenridge</li>
<li>Javier Barea Lara</li>
<li>Garrett Mills</li>
<li>Evan Powell</li>
<li>Alec Horlick-Mills</li>
</ul></article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-routing.html">routing</a></li><li><a href="module-util.html">util</a></li></ul><h3>Classes</h3><ul><li><a href="AddPlayersComponent.html">AddPlayersComponent</a></li><li><a href="DraftBoardComponent.html">DraftBoardComponent</a></li><li><a href="GridActionButtonComponent.html">GridActionButtonComponent</a></li><li><a href="GridComponent.html">GridComponent</a></li><li><a href="LeagueComponent.html">LeagueComponent</a></li><li><a href="LinkComponent.html">LinkComponent</a></li><li><a href="module-routing-Router.html">Router</a></li><li><a href="MyTeamComponent.html">MyTeamComponent</a></li><li><a href="ScoresComponent.html">ScoresComponent</a></li><li><a href="TopLevelComponent.html">TopLevelComponent</a></li></ul><h3>Global</h3><ul><li><a href="global.html#GridCellRenderType">GridCellRenderType</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.5</a> on Sun Oct 25 2020 12:32:18 GMT-0500 (Central Daylight Time)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>

@ -0,0 +1,168 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Module: routing</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Module: routing</h1>
<section>
<header>
</header>
<article>
<div class="container-overview">
</div>
<h3 class="subsection-title">Classes</h3>
<dl>
<dt><a href="module-routing-Router.html">Router</a></dt>
<dd></dd>
</dl>
<h3 class="subsection-title">Members</h3>
<h4 class="name" id="~router"><span class="type-signature">(inner, constant) </span>router<span class="type-signature"> :Router</span></h4>
<div class="description">
Global router instance.
</div>
<h5>Type:</h5>
<ul>
<li>
<span class="param-type">Router</span>
</li>
</ul>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="module_routing.js.html">module/routing.js</a>, <a href="module_routing.js.html#line93">line 93</a>
</li></ul></dd>
</dl>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-routing.html">routing</a></li><li><a href="module-util.html">util</a></li></ul><h3>Classes</h3><ul><li><a href="AddPlayersComponent.html">AddPlayersComponent</a></li><li><a href="DraftBoardComponent.html">DraftBoardComponent</a></li><li><a href="GridActionButtonComponent.html">GridActionButtonComponent</a></li><li><a href="GridComponent.html">GridComponent</a></li><li><a href="LeagueComponent.html">LeagueComponent</a></li><li><a href="LinkComponent.html">LinkComponent</a></li><li><a href="module-routing-Router.html">Router</a></li><li><a href="MyTeamComponent.html">MyTeamComponent</a></li><li><a href="ScoresComponent.html">ScoresComponent</a></li><li><a href="TopLevelComponent.html">TopLevelComponent</a></li></ul><h3>Global</h3><ul><li><a href="global.html#GridCellRenderType">GridCellRenderType</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.5</a> on Sun Oct 25 2020 12:32:18 GMT-0500 (Central Daylight Time)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>

@ -0,0 +1,505 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Module: util</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Module: util</h1>
<section>
<header>
</header>
<article>
<div class="container-overview">
</div>
<h3 class="subsection-title">Methods</h3>
<h4 class="name" id=".appUrl"><span class="type-signature">(static) </span>appUrl<span class="signature">(path)</span><span class="type-signature"> &rarr; {string}</span></h4>
<div class="description">
Generate an absolute URL to a file w/in the project directory.
</div>
<h5>Parameters:</h5>
<table class="params">
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th class="last">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="name"><code>path</code></td>
<td class="type">
<span class="param-type">string</span>
</td>
<td class="description last"></td>
</tr>
</tbody>
</table>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="module_util.js.html">module/util.js</a>, <a href="module_util.js.html#line28">line 28</a>
</li></ul></dd>
</dl>
<h5>Returns:</h5>
<dl>
<dt>
Type
</dt>
<dd>
<span class="param-type">string</span>
</dd>
</dl>
<h4 class="name" id=".clone"><span class="type-signature">(static) </span>clone<span class="signature">(obj)</span><span class="type-signature"> &rarr; {*}</span></h4>
<div class="description">
Makes a deep copy of the value passed in.
</div>
<h5>Parameters:</h5>
<table class="params">
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th class="last">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="name"><code>obj</code></td>
<td class="type">
<span class="param-type">*</span>
</td>
<td class="description last"></td>
</tr>
</tbody>
</table>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="module_util.js.html">module/util.js</a>, <a href="module_util.js.html#line8">line 8</a>
</li></ul></dd>
</dl>
<h5>Returns:</h5>
<dl>
<dt>
Type
</dt>
<dd>
<span class="param-type">*</span>
</dd>
</dl>
<h4 class="name" id=".uuid_v4"><span class="type-signature">(static) </span>uuid_v4<span class="signature">()</span><span class="type-signature"> &rarr; {string}</span></h4>
<div class="description">
Generates a UUIDv4. Taken from: https://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid
</div>
<dl class="details">
<dt class="tag-source">Source:</dt>
<dd class="tag-source"><ul class="dummy"><li>
<a href="module_util.js.html">module/util.js</a>, <a href="module_util.js.html#line37">line 37</a>
</li></ul></dd>
</dl>
<h5>Returns:</h5>
<dl>
<dt>
Type
</dt>
<dd>
<span class="param-type">string</span>
</dd>
</dl>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-routing.html">routing</a></li><li><a href="module-util.html">util</a></li></ul><h3>Classes</h3><ul><li><a href="AddPlayersComponent.html">AddPlayersComponent</a></li><li><a href="DraftBoardComponent.html">DraftBoardComponent</a></li><li><a href="GridActionButtonComponent.html">GridActionButtonComponent</a></li><li><a href="GridComponent.html">GridComponent</a></li><li><a href="LeagueComponent.html">LeagueComponent</a></li><li><a href="LinkComponent.html">LinkComponent</a></li><li><a href="module-routing-Router.html">Router</a></li><li><a href="MyTeamComponent.html">MyTeamComponent</a></li><li><a href="ScoresComponent.html">ScoresComponent</a></li><li><a href="TopLevelComponent.html">TopLevelComponent</a></li></ul><h3>Global</h3><ul><li><a href="global.html#GridCellRenderType">GridCellRenderType</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.5</a> on Sun Oct 25 2020 12:32:18 GMT-0500 (Central Daylight Time)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>

@ -0,0 +1,145 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Source: module/routing.js</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Source: module/routing.js</h1>
<section>
<article>
<pre class="prettyprint source linenums"><code>/** @module routing */
/**
* A bare-bones history-api based SPA router.
*/
class Router {
/**
* Arguments for the current route.
* @type {undefined|*}
*/
route_args = undefined
/**
* List of callback functions listening for route changes.
* @type {function[]}
*/
subscribers = []
/**
* Array of router history records.
* @type {object[]}
*/
history = []
/**
* Returns the APP_BASE_PATH of the application.
* @return {string}
*/
get base_path() {
return APP_BASE_PATH
}
/**
* Navigate the app to the given path with the given args.
* @param {string} path
* @param {*} args
*/
navigate(path, args) {
this.route_args = args
this.history.push({path, args})
window.history.pushState({}, path, this.build_url(path))
this.subscribers.forEach(sub => sub(path, args))
}
/**
* Navigate back one route.
*/
back() {
window.history.back()
if ( this.history.length &lt; 2 ) return;
this.history.pop()
const { path, args } = this.history[this.history.length - 1]
this.subscribers.forEach(sub => sub(path, args))
}
/**
* Subscribe to listen for route changes. Returns an object with an unsubscribe() property.
* @param {function} handler - callback called when the route changes
* @return {object} - subscription manager
*/
subscribe(handler) {
if ( !this.subscribers.includes(handler) ) {
this.subscribers.push(handler)
}
return {
unsubscribe: () => {
this.subscribers = this.subscribers.filter(handler)
}
}
}
/**
* Given an array of route parts, build a joined URL route.
* @param {...string} parts
* @return {string}
*/
build_url(...parts) {
parts = [this.base_path, ...parts].map(part => {
if ( part.endsWith('/') ) part = part.slice(0, -1)
if ( part.startsWith('/') ) part = part.slice(1)
return part
})
return parts.join('/')
}
}
/**
* Global router instance.
* @type {Router}
*/
const router = new Router()
export { router }
</code></pre>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-routing.html">routing</a></li><li><a href="module-util.html">util</a></li></ul><h3>Classes</h3><ul><li><a href="AddPlayersComponent.html">AddPlayersComponent</a></li><li><a href="DraftBoardComponent.html">DraftBoardComponent</a></li><li><a href="GridActionButtonComponent.html">GridActionButtonComponent</a></li><li><a href="GridComponent.html">GridComponent</a></li><li><a href="LeagueComponent.html">LeagueComponent</a></li><li><a href="LinkComponent.html">LinkComponent</a></li><li><a href="module-routing-Router.html">Router</a></li><li><a href="MyTeamComponent.html">MyTeamComponent</a></li><li><a href="ScoresComponent.html">ScoresComponent</a></li><li><a href="TopLevelComponent.html">TopLevelComponent</a></li></ul><h3>Global</h3><ul><li><a href="global.html#GridCellRenderType">GridCellRenderType</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.5</a> on Sun Oct 25 2020 12:32:18 GMT-0500 (Central Daylight Time)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>

@ -0,0 +1,92 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Source: module/util.js</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Source: module/util.js</h1>
<section>
<article>
<pre class="prettyprint source linenums"><code>/** @module util */
/**
* Makes a deep copy of the value passed in.
* @param {*} obj
* @return {*}
*/
export function clone(obj) {
// If it's just a value, return it.
if ( typeof obj !== 'object' || obj === null ) return obj
// If it's an array, copy its values.
if ( Array.isArray(obj) ) return obj.map(x => clone(x))
// If it's an object, copy its properties.
const copy = {}
for ( const prop in obj ) {
copy[prop] = clone(obj[prop])
}
return copy
}
/**
* Generate an absolute URL to a file w/in the project directory.
* @param {string} path
* @return {string}
*/
export function appUrl(path) {
if ( path.startsWith('/') ) path = path.slice(1)
return `${APP_BASE_PATH}${path}`
}
/**
* Generates a UUIDv4. Taken from: https://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid
* @return {string}
*/
export function uuid_v4() {
return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c =>
(c ^ crypto.getRandomValues(new Uint8Array(1))[0] &amp; 15 >> c / 4).toString(16)
);
}
</code></pre>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-routing.html">routing</a></li><li><a href="module-util.html">util</a></li></ul><h3>Classes</h3><ul><li><a href="AddPlayersComponent.html">AddPlayersComponent</a></li><li><a href="DraftBoardComponent.html">DraftBoardComponent</a></li><li><a href="GridActionButtonComponent.html">GridActionButtonComponent</a></li><li><a href="GridComponent.html">GridComponent</a></li><li><a href="LeagueComponent.html">LeagueComponent</a></li><li><a href="LinkComponent.html">LinkComponent</a></li><li><a href="module-routing-Router.html">Router</a></li><li><a href="MyTeamComponent.html">MyTeamComponent</a></li><li><a href="ScoresComponent.html">ScoresComponent</a></li><li><a href="TopLevelComponent.html">TopLevelComponent</a></li></ul><h3>Global</h3><ul><li><a href="global.html#GridCellRenderType">GridCellRenderType</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.5</a> on Sun Oct 25 2020 12:32:18 GMT-0500 (Central Daylight Time)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>

@ -0,0 +1,25 @@
/*global document */
(() => {
const source = document.getElementsByClassName('prettyprint source linenums');
let i = 0;
let lineNumber = 0;
let lineId;
let lines;
let totalLines;
let anchorHash;
if (source && source[0]) {
anchorHash = document.location.hash.substring(1);
lines = source[0].getElementsByTagName('li');
totalLines = lines.length;
for (; i < totalLines; i++) {
lineNumber++;
lineId = `line${lineNumber}`;
lines[i].id = lineId;
if (lineId === anchorHash) {
lines[i].className += ' selected';
}
}
}
})();

@ -0,0 +1,202 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

@ -0,0 +1,2 @@
PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\f\r ]+/,null," \t\r\n "]],[["str",/^"(?:[^\n\f\r"\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*"/,null],["str",/^'(?:[^\n\f\r'\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*'/,null],["lang-css-str",/^url\(([^"')]*)\)/i],["kwd",/^(?:url|rgb|!important|@import|@page|@media|@charset|inherit)(?=[^\w-]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*)\s*:/i],["com",/^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//],["com",
/^(?:<\!--|--\>)/],["lit",/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],["lit",/^#[\da-f]{3,6}/i],["pln",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i],["pun",/^[^\s\w"']+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[["kwd",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[["str",/^[^"')]+/]]),["css-str"]);

@ -0,0 +1,28 @@
var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a=
[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&"-"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=["["];o&&b.push("^");b.push.apply(b,a);for(c=0;c<
f.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j==="("?++i:"\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j==="("?(++i,d[i]===void 0&&(f[c]="(?:")):"\\"===j.charAt(0)&&
(j=+j.substring(1))&&j<=i&&(f[c]="\\"+d[i]);for(i=c=0;c<b;++c)"^"===f[c]&&"^"!==f[c+1]&&(f[c]="");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){s=!0;l=!1;break}}for(var r=
{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(""+g);n.push("(?:"+y(g)+")")}return RegExp(n.join("|"),l?"gi":"g")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if("BR"===g||"LI"===g)h[s]="\n",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\r\n?/g,"\n"):g.replace(/[\t\n\r ]+/g," "),h[s]=g,t[s<<1]=y,y+=g.length,
t[s++<<1|1]=a)}}var e=/(?:^|\s)nocode(?:\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);m(a);return{a:h.join("").replace(/\n$/,""),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b===
"string")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b="pln")}if((c=b.length>=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m),
l=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,
q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/,
q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g,
"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a),
a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e}
for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute("value",
m);var r=s.createElement("OL");r.className="linenums";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className="L"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode("\xa0")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-markup":"default-code";return A[a]}function E(a){var m=
a.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\bMSIE\b/.test(navigator.userAgent),m=/\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,"\r"));i.nodeValue=
j;var u=i.ownerDocument,v=u.createElement("SPAN");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"],
H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],
J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+
I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),
["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",
/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),
["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes",
hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf("prettyprint")>=0){var k=k.match(g),f,b;if(b=
!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m,
250):a&&a()}for(var e=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\blang(?:uage)?-([\w.]+)(?!\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",
PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})();

@ -0,0 +1,358 @@
@font-face {
font-family: 'Open Sans';
font-weight: normal;
font-style: normal;
src: url('../fonts/OpenSans-Regular-webfont.eot');
src:
local('Open Sans'),
local('OpenSans'),
url('../fonts/OpenSans-Regular-webfont.eot?#iefix') format('embedded-opentype'),
url('../fonts/OpenSans-Regular-webfont.woff') format('woff'),
url('../fonts/OpenSans-Regular-webfont.svg#open_sansregular') format('svg');
}
@font-face {
font-family: 'Open Sans Light';
font-weight: normal;
font-style: normal;
src: url('../fonts/OpenSans-Light-webfont.eot');
src:
local('Open Sans Light'),
local('OpenSans Light'),
url('../fonts/OpenSans-Light-webfont.eot?#iefix') format('embedded-opentype'),
url('../fonts/OpenSans-Light-webfont.woff') format('woff'),
url('../fonts/OpenSans-Light-webfont.svg#open_sanslight') format('svg');
}
html
{
overflow: auto;
background-color: #fff;
font-size: 14px;
}
body
{
font-family: 'Open Sans', sans-serif;
line-height: 1.5;
color: #4d4e53;
background-color: white;
}
a, a:visited, a:active {
color: #0095dd;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
header
{
display: block;
padding: 0px 4px;
}
tt, code, kbd, samp {
font-family: Consolas, Monaco, 'Andale Mono', monospace;
}
.class-description {
font-size: 130%;
line-height: 140%;
margin-bottom: 1em;
margin-top: 1em;
}
.class-description:empty {
margin: 0;
}
#main {
float: left;
width: 70%;
}
article dl {
margin-bottom: 40px;
}
article img {
max-width: 100%;
}
section
{
display: block;
background-color: #fff;
padding: 12px 24px;
border-bottom: 1px solid #ccc;
margin-right: 30px;
}
.variation {
display: none;
}
.signature-attributes {
font-size: 60%;
color: #aaa;
font-style: italic;
font-weight: lighter;
}
nav
{
display: block;
float: right;
margin-top: 28px;
width: 30%;
box-sizing: border-box;
border-left: 1px solid #ccc;
padding-left: 16px;
}
nav ul {
font-family: 'Lucida Grande', 'Lucida Sans Unicode', arial, sans-serif;
font-size: 100%;
line-height: 17px;
padding: 0;
margin: 0;
list-style-type: none;
}
nav ul a, nav ul a:visited, nav ul a:active {
font-family: Consolas, Monaco, 'Andale Mono', monospace;
line-height: 18px;
color: #4D4E53;
}
nav h3 {
margin-top: 12px;
}
nav li {
margin-top: 6px;
}
footer {
display: block;
padding: 6px;
margin-top: 12px;
font-style: italic;
font-size: 90%;
}
h1, h2, h3, h4 {
font-weight: 200;
margin: 0;
}
h1
{
font-family: 'Open Sans Light', sans-serif;
font-size: 48px;
letter-spacing: -2px;
margin: 12px 24px 20px;
}
h2, h3.subsection-title
{
font-size: 30px;
font-weight: 700;
letter-spacing: -1px;
margin-bottom: 12px;
}
h3
{
font-size: 24px;
letter-spacing: -0.5px;
margin-bottom: 12px;
}
h4
{
font-size: 18px;
letter-spacing: -0.33px;
margin-bottom: 12px;
color: #4d4e53;
}
h5, .container-overview .subsection-title
{
font-size: 120%;
font-weight: bold;
letter-spacing: -0.01em;
margin: 8px 0 3px 0;
}
h6
{
font-size: 100%;
letter-spacing: -0.01em;
margin: 6px 0 3px 0;
font-style: italic;
}
table
{
border-spacing: 0;
border: 0;
border-collapse: collapse;
}
td, th
{
border: 1px solid #ddd;
margin: 0px;
text-align: left;
vertical-align: top;
padding: 4px 6px;
display: table-cell;
}
thead tr
{
background-color: #ddd;
font-weight: bold;
}
th { border-right: 1px solid #aaa; }
tr > th:last-child { border-right: 1px solid #ddd; }
.ancestors, .attribs { color: #999; }
.ancestors a, .attribs a
{
color: #999 !important;
text-decoration: none;
}
.clear
{
clear: both;
}
.important
{
font-weight: bold;
color: #950B02;
}
.yes-def {
text-indent: -1000px;
}
.type-signature {
color: #aaa;
}
.name, .signature {
font-family: Consolas, Monaco, 'Andale Mono', monospace;
}
.details { margin-top: 14px; border-left: 2px solid #DDD; }
.details dt { width: 120px; float: left; padding-left: 10px; padding-top: 6px; }
.details dd { margin-left: 70px; }
.details ul { margin: 0; }
.details ul { list-style-type: none; }
.details li { margin-left: 30px; padding-top: 6px; }
.details pre.prettyprint { margin: 0 }
.details .object-value { padding-top: 0; }
.description {
margin-bottom: 1em;
margin-top: 1em;
}
.code-caption
{
font-style: italic;
font-size: 107%;
margin: 0;
}
.source
{
border: 1px solid #ddd;
width: 80%;
overflow: auto;
}
.prettyprint.source {
width: inherit;
}
.source code
{
font-size: 100%;
line-height: 18px;
display: block;
padding: 4px 12px;
margin: 0;
background-color: #fff;
color: #4D4E53;
}
.prettyprint code span.line
{
display: inline-block;
}
.prettyprint.linenums
{
padding-left: 70px;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.prettyprint.linenums ol
{
padding-left: 0;
}
.prettyprint.linenums li
{
border-left: 3px #ddd solid;
}
.prettyprint.linenums li.selected,
.prettyprint.linenums li.selected *
{
background-color: lightyellow;
}
.prettyprint.linenums li *
{
-webkit-user-select: text;
-moz-user-select: text;
-ms-user-select: text;
user-select: text;
}
.params .name, .props .name, .name code {
color: #4D4E53;
font-family: Consolas, Monaco, 'Andale Mono', monospace;
font-size: 100%;
}
.params td.description > p:first-child,
.props td.description > p:first-child
{
margin-top: 0;
padding-top: 0;
}
.params td.description > p:last-child,
.props td.description > p:last-child
{
margin-bottom: 0;
padding-bottom: 0;
}
.disabled {
color: #454545;
}

@ -0,0 +1,111 @@
/* JSDoc prettify.js theme */
/* plain text */
.pln {
color: #000000;
font-weight: normal;
font-style: normal;
}
/* string content */
.str {
color: #006400;
font-weight: normal;
font-style: normal;
}
/* a keyword */
.kwd {
color: #000000;
font-weight: bold;
font-style: normal;
}
/* a comment */
.com {
font-weight: normal;
font-style: italic;
}
/* a type name */
.typ {
color: #000000;
font-weight: normal;
font-style: normal;
}
/* a literal value */
.lit {
color: #006400;
font-weight: normal;
font-style: normal;
}
/* punctuation */
.pun {
color: #000000;
font-weight: bold;
font-style: normal;
}
/* lisp open bracket */
.opn {
color: #000000;
font-weight: bold;
font-style: normal;
}
/* lisp close bracket */
.clo {
color: #000000;
font-weight: bold;
font-style: normal;
}
/* a markup tag name */
.tag {
color: #006400;
font-weight: normal;
font-style: normal;
}
/* a markup attribute name */
.atn {
color: #006400;
font-weight: normal;
font-style: normal;
}
/* a markup attribute value */
.atv {
color: #006400;
font-weight: normal;
font-style: normal;
}
/* a declaration */
.dec {
color: #000000;
font-weight: bold;
font-style: normal;
}
/* a variable name */
.var {
color: #000000;
font-weight: normal;
font-style: normal;
}
/* a function name */
.fun {
color: #000000;
font-weight: bold;
font-style: normal;
}
/* Specify class=linenums on a pre to get line numbering */
ol.linenums {
margin-top: 0;
margin-bottom: 0;
}

@ -0,0 +1,132 @@
/* Tomorrow Theme */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
/* Pretty printing styles. Used with prettify.js. */
/* SPAN elements with the classes below are added by prettyprint. */
/* plain text */
.pln {
color: #4d4d4c; }
@media screen {
/* string content */
.str {
color: #718c00; }
/* a keyword */
.kwd {
color: #8959a8; }
/* a comment */
.com {
color: #8e908c; }
/* a type name */
.typ {
color: #4271ae; }
/* a literal value */
.lit {
color: #f5871f; }
/* punctuation */
.pun {
color: #4d4d4c; }
/* lisp open bracket */
.opn {
color: #4d4d4c; }
/* lisp close bracket */
.clo {
color: #4d4d4c; }
/* a markup tag name */
.tag {
color: #c82829; }
/* a markup attribute name */
.atn {
color: #f5871f; }
/* a markup attribute value */
.atv {
color: #3e999f; }
/* a declaration */
.dec {
color: #f5871f; }
/* a variable name */
.var {
color: #c82829; }
/* a function name */
.fun {
color: #4271ae; } }
/* Use higher contrast and text-weight for printable form. */
@media print, projection {
.str {
color: #060; }
.kwd {
color: #006;
font-weight: bold; }
.com {
color: #600;
font-style: italic; }
.typ {
color: #404;
font-weight: bold; }
.lit {
color: #044; }
.pun, .opn, .clo {
color: #440; }
.tag {
color: #006;
font-weight: bold; }
.atn {
color: #404; }
.atv {
color: #060; } }
/* Style */
/*
pre.prettyprint {
background: white;
font-family: Consolas, Monaco, 'Andale Mono', monospace;
font-size: 12px;
line-height: 1.5;
border: 1px solid #ccc;
padding: 10px; }
*/
/* Specify class=linenums on a pre to get line numbering */
ol.linenums {
margin-top: 0;
margin-bottom: 0; }
/* IE indents via margin-left */
li.L0,
li.L1,
li.L2,
li.L3,
li.L4,
li.L5,
li.L6,
li.L7,
li.L8,
li.L9 {
/* */ }
/* Alternate shading for lines */
li.L1,
li.L3,
li.L5,
li.L7,
li.L9 {
/* */ }

@ -0,0 +1,9 @@
{
"name": "eecs448-project-34",
"version": "0.1.0",
"main": "index.js",
"license": "MIT",
"dependencies": {
"jsdoc": "^3.6.5"
}
}

@ -0,0 +1,156 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@babel/parser@^7.9.4":
version "7.11.5"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037"
integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==
argparse@^1.0.7:
version "1.0.10"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
dependencies:
sprintf-js "~1.0.2"
bluebird@^3.7.2:
version "3.7.2"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
catharsis@^0.8.11:
version "0.8.11"
resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.8.11.tgz#d0eb3d2b82b7da7a3ce2efb1a7b00becc6643468"
integrity sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g==
dependencies:
lodash "^4.17.14"
entities@~2.0.0:
version "2.0.3"
resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f"
integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==
escape-string-regexp@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
graceful-fs@^4.1.9:
version "4.2.4"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
js2xmlparser@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-4.0.1.tgz#670ef71bc5661f089cc90481b99a05a1227ae3bd"
integrity sha512-KrPTolcw6RocpYjdC7pL7v62e55q7qOMHvLX1UCLc5AAS8qeJ6nukarEJAF2KL2PZxlbGueEbINqZR2bDe/gUw==
dependencies:
xmlcreate "^2.0.3"
jsdoc@^3.6.5:
version "3.6.5"
resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-3.6.5.tgz#e004372ca6f2dcdf19b3d2ebcd7c725528485502"
integrity sha512-SbY+i9ONuxSK35cgVHaI8O9senTE4CDYAmGSDJ5l3+sfe62Ff4gy96osy6OW84t4K4A8iGnMrlRrsSItSNp3RQ==
dependencies:
"@babel/parser" "^7.9.4"
bluebird "^3.7.2"
catharsis "^0.8.11"
escape-string-regexp "^2.0.0"
js2xmlparser "^4.0.1"
klaw "^3.0.0"
markdown-it "^10.0.0"
markdown-it-anchor "^5.2.7"
marked "^0.8.2"
mkdirp "^1.0.4"
requizzle "^0.2.3"
strip-json-comments "^3.1.0"
taffydb "2.6.2"
underscore "~1.10.2"
klaw@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/klaw/-/klaw-3.0.0.tgz#b11bec9cf2492f06756d6e809ab73a2910259146"
integrity sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==
dependencies:
graceful-fs "^4.1.9"
linkify-it@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf"
integrity sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==
dependencies:
uc.micro "^1.0.1"
lodash@^4.17.14:
version "4.17.20"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
markdown-it-anchor@^5.2.7:
version "5.3.0"
resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz#d549acd64856a8ecd1bea58365ef385effbac744"
integrity sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA==
markdown-it@^10.0.0:
version "10.0.0"
resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-10.0.0.tgz#abfc64f141b1722d663402044e43927f1f50a8dc"
integrity sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==
dependencies:
argparse "^1.0.7"
entities "~2.0.0"
linkify-it "^2.0.0"
mdurl "^1.0.1"
uc.micro "^1.0.5"
marked@^0.8.2:
version "0.8.2"
resolved "https://registry.yarnpkg.com/marked/-/marked-0.8.2.tgz#4faad28d26ede351a7a1aaa5fec67915c869e355"
integrity sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw==
mdurl@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e"
integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=
mkdirp@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
requizzle@^0.2.3:
version "0.2.3"
resolved "https://registry.yarnpkg.com/requizzle/-/requizzle-0.2.3.tgz#4675c90aacafb2c036bd39ba2daa4a1cb777fded"
integrity sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==
dependencies:
lodash "^4.17.14"
sprintf-js@~1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
strip-json-comments@^3.1.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
taffydb@2.6.2:
version "2.6.2"
resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.6.2.tgz#7cbcb64b5a141b6a2efc2c5d2c67b4e150b2a268"
integrity sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=
uc.micro@^1.0.1, uc.micro@^1.0.5:
version "1.0.6"
resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac"
integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==
underscore@~1.10.2:
version "1.10.2"
resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.10.2.tgz#73d6aa3668f3188e4adb0f1943bd12cfd7efaaaf"
integrity sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg==
xmlcreate@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-2.0.3.tgz#df9ecd518fd3890ab3548e1b811d040614993497"
integrity sha512-HgS+X6zAztGa9zIK3Y3LXuJes33Lz9x+YyTxgrkIdabu2vqcGOWwdfCpf1hWLRrd553wd4QCDf6BBO6FfdsRiQ==

@ -0,0 +1,29 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Fantasy Football</title>
<link rel="stylesheet" href="./src/style/components.css">
</head>
<body>
<!-- This is the container where the Vue.js application will render to. -->
<div id="wrapper">
<!-- The top level component. -->
<app-top-level></app-top-level>
</div>
<script>
let loc = window.location.href
if ( loc.endsWith('index.html') ) loc = loc.slice(0, -('index.html').length)
loc = loc.split(/[?#]/)[0];
if ( !loc.endsWith('/') ) loc = `${loc}/`
window.APP_BASE_PATH = loc
</script>
<script src="./lib/vue-2.6.11.js"></script>
<script src="./lib/vues6.js" type="module"></script>
<script src="./src/module/start.js" type="module"></script>
</body>
</html>

@ -0,0 +1,9 @@
The files in this directory are external libraries used in this project.
- Vue.js
- A front-end framework. Used under the terms of the MIT license.
- https://github.com/vuejs/vue
- VuES6.js
- A kind-of crappy loader for defining Vue components using ES6 classes.
- Also used under the terms of the MIT license.
- https://code.garrettmills.dev/garrettmills/vues6

File diff suppressed because it is too large Load Diff

@ -0,0 +1,72 @@
import {uuid_v4} from '../src/module/util.js'
export default class VuES6Loader {
constructor(component_list) {
this.components = component_list
}
load() {
for ( const ComponentClass of Object.values(this.components) ) {
const method_properties = Object.getOwnPropertyNames(ComponentClass.prototype)
const watch = {}
method_properties.filter(x => x.startsWith('watch_')).some(method_name => {
const field_name = method_name.substr(6)
const handler = function(...args) {
return ComponentClass.prototype[method_name].bind(this)(...args)
}
watch[field_name] = handler
})
const methods = {}
method_properties.filter(x => !x.startsWith('watch_')).some(method_name => {
const handler = function(...args) {
return ComponentClass.prototype[method_name].bind(this)(...args)
}
methods[method_name] = handler
})
const ref_x_inst = {}
Vue.component(ComponentClass.selector, {
props: ComponentClass.props,
data: () => {
const uuid = uuid_v4();
const inst = new ComponentClass();
ref_x_inst[uuid] = inst;
inst.$_uuid = uuid;
return inst;
},
watch,
methods,
template: ComponentClass.template,
created: function() {
this.$_data_inst = ref_x_inst[this.$data.$_uuid];
this.$_data_inst.$_vue_inst = this;
if ( typeof this.vue_on_create === 'function' ) this.vue_on_create()
},
updated: function() {
if ( typeof this.vue_on_update === 'function' ) this.vue_on_update()
},
mounted: function() {
if ( typeof this.vue_on_mount === 'function' ) this.vue_on_mount()
},
destroyed: function() {
if ( typeof this.vue_on_destroy === 'function' ) this.vue_on_destroy()
},
})
}
}
}
export class Component {
static get selector() { return '' }
static get template() { return '' }
static get props() { return [] }
vue_on_create() {}
vue_on_update() {}
vue_on_mount() {}
vue_on_destroy() {}
}

@ -0,0 +1,25 @@
import TopLevelComponent from './components/TopLevel.component.js'
import MyTeamComponent from './components/pages/MyTeam.component.js'
import LinkComponent from './components/Link.component.js'
import AddPlayersComponent from './components/pages/AddPlayers.component.js'
import ScoresComponent from './components/pages/Scores.component.js'
import LeagueComponent from './components/pages/League.component.js'
import DraftBoardComponent from './components/pages/DraftBoard.component.js'
import GridComponent from './components/Grid.component.js'
import GridActionButtonComponent from './components/GridActionButton.component.js'
/*
* This is where various components we define should be registered.
* Once they are listed here, they will be automatically loaded by Vue.js.
*/
export default {
LinkComponent,
TopLevelComponent,
MyTeamComponent,
AddPlayersComponent,
ScoresComponent,
LeagueComponent,
DraftBoardComponent,
GridComponent,
GridActionButtonComponent,
}

@ -0,0 +1,72 @@
import {Component} from '../../lib/vues6.js'
/**
* An enum representing the different grid cell renderer types for the shared grid.
* @type {object}
*/
const GridCellRenderType = {
Simple: Symbol('simple'),
HTML: Symbol('html'),
Component: Symbol('component'),
}
export {GridCellRenderType}
const template = `
<div class="component-app-grid">
<table>
<tr>
<th v-if="show_row_numbers">#</th>
<th v-for="col of column_defs" :title="col.title || ''">{{ col.header || '' }}</th>
</tr>
<tr v-for="(row, idx) of data">
<td v-if="show_row_numbers">{{ idx + 1 }}</td>
<td v-for="col of column_defs">
<div v-if="!col.type || col.type === GridCellRenderType.Simple">{{ row[col.key] }}</div>
<div v-if="col.type === GridCellRenderType.HTML" v-html="col.renderer(row[col.key], row)"></div>
<div v-if="col.type === GridCellRenderType.Component">
<component :is="col.component" :row="row" :col="col" :idx="idx" @click="on_col_click(col, $event)"></component>
</div>
</td>
</tr>
</table>
</div>
`
/**
* Shared grid component used to show tables in various interfaces.
* @extends Component
*/
class GridComponent extends Component {
static get selector() { return 'app-grid' }
static get template() { return template }
static get props() {
return [
'show_row_numbers',
'column_defs',
'data',
]
}
GridCellRenderType = GridCellRenderType
/**
* Called when the component is instantiated.
* @return {Promise<void>}
*/
async vue_on_create() {
}
/**
* Called when the component renderer emits a click event, to pass it along to the column definition.
* @param {object} col - the column definition
* @param {object} row - the row clicked
* @param {object} passcol - the column emitted from the component
*/
on_col_click(col, [row, passcol]) {
col.on_click(row, passcol)
}
}
export default GridComponent

@ -0,0 +1,115 @@
import {Component} from '../../lib/vues6.js'
const template = `
<div class="component-action-button">
<button
v-if="!hidden"
v-bind:style="{border: '2px solid lightgrey', borderRadius: '3px', backgroundColor: color, color: 'white'}"
@click="on_click($event)"
>{{ text }}</button>
</div>
`
/**
* Component representing an action button that can be embedded in the shared grid.
* @extends Component
*/
class GridActionButtonComponent extends Component {
static get selector() { return 'app-action-button' }
static get template() { return template }
static get props() { return ['row', 'col'] }
/**
* The text shown on the action button.
* @type {string}
*/
text = ''
/**
* The CSS color of the action button.
* @type {string}
*/
color = 'white'
/**
* If true, the action button will be hidden.
* @type {boolean}
*/
hidden = false
/**
* Called when the component is instantiated. Updates the text, color, and hide status.
* @return {Promise<void>}
*/
async vue_on_create() {
this.update_text()
this.update_color()
this.update_hidden()
}
/**
* Called when the row value changes. Updates the text, color, and hide status.
*/
watch_row() {
this.update_text()
this.update_color()
this.update_hidden()
}
/**
* Called when the column value changes. Updates the text, color, and hide status.
*/
watch_col() {
this.update_text()
this.update_color()
this.update_hidden()
}
/**
* Determine the text to show on the button based on the column definition.
*/
update_text() {
if ( typeof this.col.button_text === 'function' ) {
this.text = this.col.button_text(this.row, this.col)
} else {
this.text = this.col.button_text || ''
}
}
/**
* Determine the color to show on the button based on the column definition.
*/
update_color() {
if ( typeof this.col.button_color === 'function' ) {
this.color = this.col.button_color(this.row, this.col)
} else {
this.color = this.col.button_color || 'white'
}
}
/**
* Determine whether the button should be shown or not, based on the column definition.
*/
update_hidden() {
if ( !('button_hidden' in this.col) ) {
this.hidden = false;
} else if ( typeof this.col.button_hidden === 'function' ) {
this.hidden = this.col.button_hidden(this.row, this.col)
} else {
this.hidden = this.col.button_hidden
}
}
/**
* Called when the button is clicked. Emits a click event and updates the text, color, and hide status.
* @param {MouseEvent} $event
*/
on_click($event) {
this.$emit('click', [this.row, this.col])
this.update_text()
this.update_color()
this.update_hidden()
}
}
export default GridActionButtonComponent

@ -0,0 +1,25 @@
import {Component} from '../../lib/vues6.js'
import {router} from '../module/routing.js'
const template = `
<a href="#" @click="on_click()">{{ text }}</a>
`
/**
* Component providing hyper-links that navigate to other pages in the SPA,
* without reloading the page.
*/
class LinkComponent extends Component {
static get selector() { return 'app-link' }
static get template() { return template }
static get props() { return ['href', 'args', 'text'] }
/**
* Called when the link is clicked. Navigates the router.
*/
on_click() {
router.navigate(this.href, this.args)
}
}
export default LinkComponent

@ -0,0 +1,99 @@
import {Component} from '../../lib/vues6.js'
import {router} from '../module/routing.js'
const template = `
<div class="top-level-container">
<div class="navbar-container">
<h1 class="title">Fantasy Football</h1>
<ul class="navbar">
<li class="navbar-item" v-for="item of navbar_items" :class="{ active: current_route === item.page }">
<app-link :href="item.page" :text="item.title"></app-link>
</li>
<li class="navbar-item">
<a href="#" @click="on_refresh($event)">Refresh</a>
</li>
</ul>
</div>
<div class="page-container">
<page-my-team v-if="current_route === 'my-team'"></page-my-team>
<page-add-players v-if="current_route === 'my-team/add-players'"></page-add-players>
<page-scores v-if="current_route === 'scores'"></page-scores>
<page-league v-if="current_route === 'league'"></page-league>
<page-draft-board v-if="current_route === 'draft-board'"></page-draft-board>
</div>
</div>
`
/**
* Top-level component which manages the display of the entire game.
* @extends Component
*/
class TopLevelComponent extends Component {
static get selector() { return 'app-top-level' }
static get template() { return template }
static get props() { return [] }
/**
* The currently loaded page route.
* @type {string}
*/
current_route = ''
/**
* Array of navigation bar items where "title" is the page name, and "page" is the page route.
* @type {Array<object>}
*/
navbar_items = [
{ title: 'My Team', page: 'my-team' },
{ title: 'Add Players', page: 'my-team/add-players' },
{ title: 'Scores', page: 'scores' },
{ title: 'League', page: 'league' },
{ title: 'Draft Board', page: 'draft-board' },
]
/**
* Called when the component is initialized.
* @return {Promise<void>}
*/
async vue_on_create() {
// Listen for navigation changes.
this.router_subscription = router.subscribe((path, args) => this.on_route_change(path, args))
const url_params = new URLSearchParams(window.location.search)
if ( url_params.has('then') ) {
const route = url_params.get('then')
router.navigate(route)
} else if ( !this.current_route ) {
router.navigate('my-team')
}
}
/**
* Called when the component is destroyed.
* @return {Promise<void>}
*/
async vue_on_destroy() {
// Stop listening for navigation changes.
this.router_subscription.unsubscribe()
}
/**
* Called when the navigation changes.
* @param {string} path
* @param {*} args
* @return {Promise<void>}
*/
async on_route_change(path, args) {
if ( path.startsWith('/') ) path = path.slice(1)
if ( path.endsWith('/') ) path = path.slice(0, -1)
this.current_route = path
}
on_refresh($event) {
window.location.href = `/?then=${this.current_route}`
}
}
export default TopLevelComponent

@ -0,0 +1,175 @@
import { Component } from '../../../lib/vues6.js'
import { fake_players } from '../../module/fake_data.js'
import { clone } from '../../module/util.js'
const template = `
<div class="page-add-players">
<div class="header">
<div class="left">
<h2>Add Players to Team</h2>
</div>
<div class="right">
<button :class="{ 'disable-click': my_team_only }" @click="to_my_team_only()">My Team</button><button :class="{ 'disable-click': !my_team_only }" @click="to_all_players()">All Players</button>
</div>
<div class="right">
<input type="text" placeholder="Quick filter..." v-model="quick_filter" @keyup="on_filter_change()">
</div>
</div>
<div class="item-grid">
<div class="item" v-for="player of filtered_players" @mouseover="on_photo_hover(player)"
@mouseleave="on_photo_leave(player)">
<div style="display: flex; flex-direction: column; height: 100%;">
<div class="item-icon" v-if="!player.showing_stats">
<img :src="player.image" :alt="player.name">
</div>
<div class="item-contents" v-if="!player.showing_stats">
<h1>{{ player.name }}</h1>
<p>#{{ player.number }} ({{ player.position }})</p>
</div>
<div class="item-contents" style="flex: 1;" v-else>
<div>
<p v-if="player.team_name"><b>Team: </b> {{ player.team_name }}</p>
<p><b>Position: </b> {{ player.position }}</p>
<p v-for="(value, stat) in player.stats"><b>{{ stat }}: </b> {{ value }}</p>
</div>
</div>
</div>
<div class="item-button">
<button
v-if="my_team.length < 15 && !my_team.includes(player)"
@click="add_to_team(player)"
class="add"
>Add to Team</button>
<button
v-if="my_team.includes(player)"
@click="remove_from_team(player)"
class="remove"
>Remove from Team</button>
</div>
</div>
</div>
</div>
`
/**
* A component which represents the "Add Players" page. Allows users to add/remove
* players from their team.
* @extends Component
*/
class AddPlayersComponent extends Component {
static get selector() { return 'page-add-players' }
static get props() { return [] }
static get template() { return template }
/**
* The current value of the quick filter for players. If empty string, no filter is applied.
* @type {string}
*/
quick_filter = ''
/**
* If true, then only the players on the user's team will be shown.
* @type {boolean}
*/
my_team_only = false
/**
* Array of players currently on the user's team.
* @type {object[]}
*/
my_team = []
/**
* Array of currently displayed players, after the filter has been applied.
* @type {object[]}
*/
filtered_players = []
/**
* Array of currently displayed players, before the filter has been applied.
* @type {object[]}
*/
possible_players = []
/**
* All available players, whether they are on the user's team or not.
* @type {object[]}
*/
all_players = clone(fake_players)
/**
* Called when the page is instantiated.
* @return {Promise<void>}
*/
async vue_on_create() {
this.possible_players = [...this.all_players];
this.filtered_players = [...this.possible_players];
}
/**
* Called when the quick-filter changes. Applies the filter to the displayed players.
*/
on_filter_change() {
const query = this.quick_filter.toLowerCase()
this.filtered_players = this.possible_players.filter(x => {
if (!query) return true;
return x.name.toLowerCase().includes(query) || x.position.toLowerCase().includes(query)
})
}
/**
* When called, change the display to show only the user's team.
*/
to_my_team_only() {
this.my_team_only = true;
this.possible_players = [...this.my_team]
this.on_filter_change()
}
/**
* When called, change the display to show all available players.
*/
to_all_players() {
this.my_team_only = false;
this.possible_players = [...this.all_players]
this.on_filter_change()
}
/**
* Add the given player to the user's team, if not already there.
* @param {object} player
*/
add_to_team(player) {
if (!this.my_team.includes(player)) {
this.my_team.push(player)
}
}
/**
* Remove the given player from the user's team, if there.
* @param {object} player
*/
remove_from_team(player) {
this.my_team = this.my_team.filter(x => x !== player)
player.showing_stats = false
if (this.my_team_only) this.to_my_team_only()
}
/**
* Called when the user hovers over a player. Toggles the stats to be shown.
* @param {object} player
*/
on_photo_hover(player) {
player.showing_stats = true
}
/**
* Called when the user un-hovers over a player. Toggles the stats to hide.
* @param {object} player
*/
on_photo_leave(player) {
player.showing_stats = false
}
}
export default AddPlayersComponent

@ -0,0 +1,125 @@
import {Component} from '../../../lib/vues6.js'
import {fake_players} from '../../module/fake_data.js'
import {GridCellRenderType} from '../Grid.component.js'
import {clone} from '../../module/util.js'
const template = `
<div class="page-draft-board">
<div class="header">
<div class="left">
<h2>Draft Board</h2>
</div>
</div>
<div class="body" style="display: flex; flex-direction: row">
<div class="picks" style="margin-right: 20px;">
<app-grid
:column_defs="top_picks_column_defs"
:data="top_picks"
:show_row_numbers="true"
></app-grid>
</div>
<app-grid
style="flex: 1"
:column_defs="column_defs"
:data="data"
:show_row_numbers="false"
></app-grid>
</div>
</div>
`
/**
* Component representing the draft board page.
* @extends Component
*/
class DraftBoardComponent extends Component {
static get selector() { return 'page-draft-board' }
static get template() { return template }
static get props() { return [] }
top_picks_column_defs = [
{
header: 'Player',
key: 'name',
type: GridCellRenderType.HTML,
renderer: (_, data) => `
<div class="center">
<img src="${data.image}" alt="${data.name}" height="50" style="border-radius: 50%">
<span>${data.name}</span>
</div>
`,
}
]
top_picks = []
column_defs = [
{
header: 'Name',
key: 'name',
type: GridCellRenderType.HTML,
renderer: (_, data) => `
<div class="center">
<img src="${data.image}" alt="${data.name}" height="50" style="border-radius: 50%">
<span>${data.name}</span>
</div>
`,
},
{
header: 'Team',
key: 'team_name',
},
{
header: 'Position',
key: 'position',
},
{
header: 'Points',
key: 'points',
},
{
header: 'Stats',
key: 'stats',
type: GridCellRenderType.HTML,
renderer: (value, row) => {
const stats = []
for ( const stat in value ) {
if ( !value.hasOwnProperty(stat) ) continue; // Prototypical member
stats.push(`
<div class="stat">
<div class="title">${stat}</div>
<div>${value[stat]}</div>
</div>
`)
}
return `
<div class="stats">
${stats.join('\n')}
</div>
`
},
},
{
header: '',
key: 'stats',
type: GridCellRenderType.Component,
component: Vue.component('app-action-button'),
button_color: (row, col) => '#CC5746',
button_text: (row, col) => 'Draft',
button_hidden: (row, col) => this.top_picks.includes(row),
on_click: (row, col) => {
this.top_picks.push(row);
},
},
]
data = clone(fake_players)
async vue_on_create() {
}
}
export default DraftBoardComponent

File diff suppressed because one or more lines are too long

@ -0,0 +1,264 @@
import {Component} from '../../../lib/vues6.js'
import {GridCellRenderType} from '../Grid.component.js'
const template = `
<div class="page-my-team">
<div class="header">
<div class="left team-name">
<h2>My Team - </h2><input placeholder="Click to edit team name..." type="text" v-model="team_name">
</div>
</div>
<div class="body" style="display: flex; flex-direction: row; margin-left: 10px; padding-bottom: 50px;" v-if="show_body">
<app-grid
:column_defs="overall_column_defs"
:data="overall_data"
:show_row_numbers="true"
style="flex: 1;"
></app-grid>
<div class="lineup-grids" style="margin-left: 30px; margin-right: 10px; flex: 1;">
<h3>Starting Lineup</h3>
<app-grid
:column_defs="lineup_column_defs"
:data="starting_players"
:show_row_numbers="false"
></app-grid>
<h3>Bench</h3>
<app-grid
:column_defs="lineup_column_defs"
:data="bench_players"
:show_row_numbers="false"
></app-grid>
</div>
</div>
</div>
`
/**
* Component representing the my-team page.
* @extends Component
*/
class MyTeamComponent extends Component {
static get selector() { return 'page-my-team' }
static get template() { return template }
static get props() { return [] }
/**
* The team name.
* @type {string}
*/
team_name = ''
/**
* If true, the body of the page will be shown. Otherwise, hidden.
* This is used to refresh the entire component at once.
* @type {boolean}
*/
show_body = true
/**
* The player currently being moved. If none, then will be set to undefined.
* @type {undefined}
*/
moving_player = undefined
/**
* Array of players filling starting line up positions. If no player is in
* a position, then only the "postition" key will be set.
* @type {object[]}
*/
starting_players = [
{
position: 'QB',
},
{
position: 'RB',
},
{
position: 'RB',
},
{
position: 'WR',
},
{
position: 'WR',
},
{
position: 'TE',
},
{
position: 'FLX',
},
{
position: 'DST',
},
]
/**
* Players on the bench.
* @type {object[]}
*/
bench_players = []
/**
* Column definitions for the starting/bench lineup grids.
* @type {object[]}
*/
lineup_column_defs = [
{
header: 'POS',
key: 'position',
},
{
header: 'Player',
key: 'player_name',
type: GridCellRenderType.HTML,
renderer: (_, data) => {
if ( !data.player_name ) {
return `<i style="color: darkgrey">none</i>`
} else {
return `
<div class="center">
<img src="${data.image}" alt="${data.player_name}" height="50" style="border-radius: 50%">
<span>${data.player_name}</span>
</div>
`
}
},
},
{
header: '',
key: 'player_name',
type: GridCellRenderType.Component,
component: Vue.component('app-action-button'),
button_color: (row, col) => this.moving_player ? '#CC5746' : '#0582CA',
button_text: (row, col) => {
return this.moving_player ? 'Here' : 'Move'
},
button_hidden: (row, col) => {
if ( this.moving_player && this.moving_player.player_name !== row.player_name ) return false;
if ( !row.player_name ) return true;
return this.moving_player && this.moving_player.player_name === row.player_name;
},
on_click: (row, col) => {
if ( !this.moving_player ) {
this.moving_player = row;
} else {
const old_row = {...row};
row.player_name = this.moving_player.player_name;
row.ecr = this.moving_player.ecr;
row.image = this.moving_player.image;
this.moving_player.player_name = old_row.player_name;
this.moving_player.ecr = old_row.ecr;
this.moving_player.image = old_row.image;
this.moving_player = undefined;
console.log(this.moving_player, row);
}
this.$_vue_inst.update(); // $_vue_inst refers to the Vue.component instance, not the data class.
},
},
]
/**
* Column definitions for the overall team grid.
* @type {object[]}
*/
overall_column_defs = [
{
header: 'Name',
key: 'player_name',
type: GridCellRenderType.HTML,
renderer: (_, data) => `
<div class="center">
<img src="${data.image}" alt="${data.player_name}" height="50" style="border-radius: 50%">
<span>${data.player_name}</span>
</div>
`,
},
{
header: 'POS',
key: 'position',
},
{
header: 'ECR',
title: 'Expected Coverage Rating',
key: 'ecr',
},
]
/**
* Data for the overall team grid (list of user's team players).
* @type {object[]}
*/
overall_data = [
{
player_name: 'Christian McCaffrey',
position: 'RB1',
ecr: '0.0',
"image": "https://images.generated.photos/eGoWRgqxtahGFDAD81-l8CNxdz1oe-huz3CQ7m3v0VI/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAzNDA0NDlfMDgz/MDY1Nl8wMTk4NTI4/LmpwZw.jpg",
},
{
player_name: 'Ezekiel Elliott',
position: 'RB3',
ecr: '1.0',
"image": "https://images.generated.photos/fd8kkioB4vLw_5MGwQXdDt9Q7Ley2_Ia8Cu390zaNVM/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA0Nzg2ODEuanBn.jpg",
},
{
player_name: 'Dalvin Cook',
position: 'RB5',
ecr: '0.0',
"image": "https://images.generated.photos/PEBx5b8_iPHU_nJpJbh3geUN8cBFglHVAAR9NktzXsk/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAxODI1NzlfMDgx/MTA0OV8wNDQzOTM5/LmpwZw.jpg",
},
{
player_name: 'Alvin Kamara',
position: 'RB6',
ecr: '-1.0',
"image": "https://images.generated.photos/cb3jAo-GBziFLxs85KJGt7a8bJdhz4sSy76PYAXkeg4/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA1ODU4MDBfMDMy/NjY2OF8wODEwNTA2/LmpwZw.jpg",
},
{
player_name: 'Michael Thomas',
position: 'WR1',
ecr: '3.0',
"image": "https://images.generated.photos/LLiy3FypH5A1suda78U82t_Kcn9AlJwZt1g3w1p5DwE/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAzODc0NjlfMDUy/MDc0NF8wNzc3NzQ5/LmpwZw.jpg",
},
{
player_name: 'Davante Adams',
position: 'WR2',
ecr: '4.0',
"image": "https://images.generated.photos/dW84LNLE4Kzp73NTTnL68U--dYuq8CCzD-dGTs76U38/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAyNjE1NjZfMDEz/NDM1NF8wMTg5MjI0/LmpwZw.jpg",
},
{
player_name: 'Travis Kelce',
position: 'TE1',
ecr: '-4.0',
"image": "https://images.generated.photos/erudOopARQnXWNaLqkIPRLLMLAVBr8m70aFC_dtYu1Y/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAzODA5MTVfMDkx/MzIzN18wNDQxMTk4/LmpwZw.jpg",
},
]
/**
* Called when the component is instantiated. Initializes the bench players data.
* @return {Promise<void>}
*/
async vue_on_create() {
this.bench_players = this.overall_data.map(x => { x = {...x, position: 'B'}; return x })
setTimeout(() => {
this.update();
}, 500);
}
/**
* Force re-render the entire component by briefly hiding it.
*/
update() {
this.show_body = false;
this.$nextTick(() => {
this.show_body = true;
});
}
}
export default MyTeamComponent

@ -0,0 +1,347 @@
import {Component} from '../../../lib/vues6.js'
import {GridCellRenderType} from '../Grid.component.js'
const template = `
<div class="page-scores">
<div class="header">
<div class="left">
<h2>Matchups & Scores - <small>Week {{ current_week }}</small></h2>
</div>
<div class="right">
<button :class="{ 'disable-click': current_week === max_week }" @click="to_next_week()">Next Week</button><button :class="{ 'disable-click': current_week === min_week }" @click="to_previous_week()">Previous Week</button>
</div>
</div>
<app-grid
:column_defs="column_defs"
:data="data"
:show_row_numbers="false"
></app-grid>
</div>
`
/**
* Component representing the scores & match-ups page.
* @extends Component
*/
class ScoresComponent extends Component {
static get selector() { return 'page-scores' }
static get template() { return template }
static get props() { return [] }
/**
* The number of the current week shown in the interface
* @type {number}
*/
current_week = 6
/**
* Most recent week number.
* @type {number}
*/
max_week = 6
/**
* Least recent week number.
* @type {number}
*/
min_week = 1
/**
* Array of arrays of data for each week with first item being week 1, second being week 2, &c.
* @type {object[][]}
*/
week_x_data = [
// Week 1 Data
[
{
"date": "11/2/2020",
"team_1": "Team 1",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 50,
"team_2": "Team 6",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 73
},
{
"date": "10/23/2020",
"team_1": "Team 2",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 66,
"team_2": "Team 5",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 71,
"winner": "Team 5",
"winner_score": "84",
"loser_score": "41",
},
{
"date": "10/31/2020",
"team_1": "Team 3",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 85,
"team_2": "Team 4",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 67
},
],
// Week 2 Data
[
{
"date": "11/2/2020",
"team_1": "Team 1",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 58,
"team_2": "Team 6",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 34
},
{
"date": "10/23/2020",
"team_1": "Team 2",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 57,
"team_2": "Team 5",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 27,
"winner": "Team 5",
"winner_score": "84",
"loser_score": "41",
},
{
"date": "10/31/2020",
"team_1": "Team 3",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 48,
"team_2": "Team 4",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 49
},
],
// Week 3 Data
[
{
"date": "11/2/2020",
"team_1": "Team 1",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 67,
"team_2": "Team 6",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 47
},
{
"date": "10/23/2020",
"team_1": "Team 2",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 83,
"team_2": "Team 5",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 62,
"winner": "Team 5",
"winner_score": "84",
"loser_score": "41",
},
{
"date": "10/31/2020",
"team_1": "Team 3",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 48,
"team_2": "Team 4",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 17
},
],
// Week 4 Data
[
{
"date": "11/2/2020",
"team_1": "Team 1",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 30,
"team_2": "Team 6",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 41
},
{
"date": "10/23/2020",
"team_1": "Team 2",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 65,
"team_2": "Team 5",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 27,
"winner": "Team 5",
"winner_score": "84",
"loser_score": "41",
},
{
"date": "10/31/2020",
"team_1": "Team 3",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 48,
"team_2": "Team 4",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 24
},
],
// Week 5 Data
[
{
"date": "11/2/2020",
"team_1": "Team 1",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 43,
"team_2": "Team 6",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 48
},
{
"date": "10/23/2020",
"team_1": "Team 2",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 57,
"team_2": "Team 5",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 61,
"winner": "Team 5",
"winner_score": "84",
"loser_score": "41",
},
{
"date": "10/31/2020",
"team_1": "Team 3",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 48,
"team_2": "Team 4",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 91
},
],
// Week 6 Data
[
{
"date": "11/2/2020",
"team_1": "Team 1",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 50,
"team_2": "Team 6",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 37
},
{
"date": "10/23/2020",
"team_1": "Team 2",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 36,
"team_2": "Team 5",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 71,
"winner": "Team 5",
"winner_score": "84",
"loser_score": "41",
},
{
"date": "10/31/2020",
"team_1": "Team 3",
"team_1_logo": "https://via.placeholder.com/150x100",
"team_1_projection": 48,
"team_2": "Team 4",
"team_2_logo": "https://via.placeholder.com/150x100",
"team_2_projection": 1
},
]
]
/**
* Column definitions for the matchups grid.
* @type {object[]}
*/
column_defs = [
{
header: 'Date',
type: GridCellRenderType.HTML,
key: 'date',
renderer: (_, data) => {
return `${data.date} @ ${data.team_1}`
}
},
{
header: 'Team 1',
type: GridCellRenderType.HTML,
key: 'team_1',
renderer: (_, data) => `
<div style="display: flex; flex-direction: row;">
<img src="${data.team_1_logo}" alt="${data.team_1}">
<div style="margin-left: 20px">
<b>${data.team_1}</b>
<p>Projection: ${data.team_1_projection}</p>
</div>
</div>
`
},
{
header: 'Team 2',
type: GridCellRenderType.HTML,
key: 'team_2',
renderer: (_, data) => `
<div style="display: flex; flex-direction: row;">
<img src="${data.team_2_logo}" alt="${data.team_2}">
<div style="margin-left: 20px">
<b>${data.team_2}</b>
<p>Projection: ${data.team_2_projection}</p>
</div>
</div>
`
},
{
header: 'Outcome',
type: GridCellRenderType.HTML,
key: 'winner',
renderer: (_, data) => {
if ( data?.winner ) {
return `
<div><b>Winner:</b> ${data.winner}</div>
<div><b>Score: </b> ${data.winner_score} / ${data.loser_score}</div>
`
} else {
return `N/A`
}
},
}
]
/**
* The currently shown week's data.
* @type {object[]}
*/
data = []
/**
* Called when the component is instantiated. Initializes the current week to the most recent week.
* @return {Promise<void>}
*/
async vue_on_create() {
this.data = this.week_x_data[this.max_week - 1];
}
/**
* When called, advances the data to the next-most recent week, if one exists.
*/
to_next_week() {
if ( this.current_week < this.max_week ) {
this.current_week += 1;
this.data = this.week_x_data[this.current_week - 1];
}
}
/**
* When called, advances the data to the next-least recent week, if one exists.
*/
to_previous_week() {
if ( this.current_week > this.min_week ) {
this.current_week -= 1;
this.data = this.week_x_data[this.current_week - 1];
}
}
}
export default ScoresComponent

@ -0,0 +1,361 @@
/** @module fake_data */
/**
* Array of players with stats info.
* @type {object[]}
*/
export const fake_players = [
{
"number": 14,
"name": "Andy Dalton",
"position": "Quarterback",
"stats":
{
"Passing Yards": "1" ,
"Rushing Yards": "551 YDS",
"completions": "1",
"TD": "1",
},
"team_name": "Dallas Cowboys",
"image": "https://images.generated.photos/-K9iBY4oOkLsqQfoTA1R8X0EKvR_BCbMXk0KNX4EIIs/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA0NzY1MjkuanBn.jpg",
"showing_stats": false,
"points": 13,
},
{
"number": 7,
"name": "Ben DiNucci",
"position": "Quarterback",
"stats":
{
"Passing Yards": "1" ,
"Rushing Yards": "551 YDS",
"completions": "1",
"TD": "1",
},
"team_name": "Dallas Cowboys",
"image": "https://images.generated.photos/EUa6Hmnt6682dl03Q5FPIeMqLnS833rfzOJaJXlYxqI/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAxNTk3OTFfMDU1/Nzg5OF8wMzgzMzIw/LmpwZw.jpg",
"showing_stats": false,
"points": 0,
},
{
"number": 3,
"name": "Garrett Gilbert",
"position": "Quarterback",
"stats":
{
"Passing Yards": "1" ,
"Rushing Yards": "551 YDS",
"completions": "1",
"TD": "1",
},
"team_name": "Dallas Cowboys",
"image": "https://images.generated.photos/eGoWRgqxtahGFDAD81-l8CNxdz1oe-huz3CQ7m3v0VI/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAzNDA0NDlfMDgz/MDY1Nl8wMTk4NTI4/LmpwZw.jpg",
"showing_stats": false,
"points": 0,
"speed": 0,
"price": "$0.00",
},
{
"number": 34,
"name": "Rico Dowdle",
"position": "Running back",
"stats":
{
"Rushing Yards": "1" ,
"Receiving Yards": "551 YDS",
"Receptions": "1",
"TD": "1",
},
"team_name": "Dallas Cowboys",
"image": "https://images.generated.photos/fd8kkioB4vLw_5MGwQXdDt9Q7Ley2_Ia8Cu390zaNVM/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA0Nzg2ODEuanBn.jpg",
"showing_stats": false,
"points": 0,
"speed": 0,
"price": "$0.00",
},
{
"number": 21,
"name": "Ezekiel Elliott",
"position": "Running back",
"stats":
{
"Rushing Yards": "1" ,
"Receiving Yards": "551 YDS",
"Receptions": "1",
"TD": "1",
},
"team_name": "Dallas Cowboys",
"image": "https://images.generated.photos/PEBx5b8_iPHU_nJpJbh3geUN8cBFglHVAAR9NktzXsk/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAxODI1NzlfMDgx/MTA0OV8wNDQzOTM5/LmpwZw.jpg",
"showing_stats": false,
"points": 18,
"speed": 0,
"price": "$0.00",
},
{
"number": 20,
"name": "Tony Pollard",
"position": "Running back",
"stats":
{
"Rushing Yards": "1" ,
"Receiving Yards": "551 YDS",
"Receptions": "1",
"TD": "1",
},
"team_name": "Dallas Cowboys",
"image": "https://images.generated.photos/cb3jAo-GBziFLxs85KJGt7a8bJdhz4sSy76PYAXkeg4/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA1ODU4MDBfMDMy/NjY2OF8wODEwNTA2/LmpwZw.jpg",
"showing_stats": false,
"points": 6,
"speed": 0,
"price": "$0.00",
},
{
"number": 85,
"name": "Noah Brown",
"position": "Wide receiver",
"stats":
{
"Rushing Yards": "1" ,
"Receiving Yards": "551 YDS",
"Receptions": "1",
"TD": "1",
},
"team_name": "Dallas Cowboys",
"image": "https://images.generated.photos/LLiy3FypH5A1suda78U82t_Kcn9AlJwZt1g3w1p5DwE/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAzODc0NjlfMDUy/MDc0NF8wNzc3NzQ5/LmpwZw.jpg",
"showing_stats": false,
"points": 0,
"speed": 0,
"price": "$0.00",
},
{
"number": 19,
"name": "Amari Cooper",
"position": "Wide receiver",
"stats":
{
"Rushing Yards": "1" ,
"Receiving Yards": "551 YDS",
"Receptions": "1",
"TD": "1",
},
"team_name": "Dallas Cowboys",
"image": "https://images.generated.photos/dW84LNLE4Kzp73NTTnL68U--dYuq8CCzD-dGTs76U38/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAyNjE1NjZfMDEz/NDM1NF8wMTg5MjI0/LmpwZw.jpg",
"showing_stats": false,
"points": 19,
"speed": 0,
"price": "$0.00",
},
{
"number": 13,
"name": "Michael Gallup",
"position": "Wide receiver",
"stats":
{
"Rushing Yards": "1" ,
"Receiving Yards": "551 YDS",
"Receptions": "1",
"TD": "1",
},
"team_name": "Dallas Cowboys",
"image": "https://images.generated.photos/erudOopARQnXWNaLqkIPRLLMLAVBr8m70aFC_dtYu1Y/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAzODA5MTVfMDkx/MzIzN18wNDQxMTk4/LmpwZw.jpg",
"showing_stats": false,
"points": 14,
},
{
"number": 88,
"name": "CeeDee Lamb",
"position": "Wide receiver",
"stats":
{
"Rushing Yards": "1" ,
"Receiving Yards": "551 YDS",
"Receptions": "1",
"TD": "1",
},
"team_name": "Dallas Cowboys",
"image": "https://images.generated.photos/WFV4nHHq5ZaBb1rdmFL5WEZTOanckWHEfkmDA1fOVfw/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAxNTYzNzNfMDI4/Nzc2N18wNzYxNDY3/LmpwZw.jpg",
"showing_stats": false,
"points": 11,
},
{
"number": 17,
"name": "Malik Turner",
"position": "Wide receiver",
"stats":
{
"Rushing Yards": "1" ,
"Receiving Yards": "551 YDS",
"Receptions": "1",
"TD": "1",
},
"team_name": "Dallas Cowboys",
"image": "https://images.generated.photos/PEBx5b8_iPHU_nJpJbh3geUN8cBFglHVAAR9NktzXsk/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAxODI1NzlfMDgx/MTA0OV8wNDQzOTM5/LmpwZw.jpg",
"showing_stats": false,
"points": 3,
},
{
"number": 11,
"name": "Cedrick Wilson Jr.",
"position": "Wide receiver",
"stats":
{
"Rushing Yards": "1" ,
"Receiving Yards": "551 YDS",
"Receptions": "1",
"TD": "1",
},
"team_name": "Dallas Cowboys",
"image": "https://images.generated.photos/fd8kkioB4vLw_5MGwQXdDt9Q7Ley2_Ia8Cu390zaNVM/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA0Nzg2ODEuanBn.jpg",
"showing_stats": false,
"points": 8,
},
{
"number": 80,
"name": "Blake Bell",
"position": "Tight end",
"stats":
{
"Rushing Yards": "1" ,
"Receiving Yards": "551 YDS",
"Receptions": "1",
"TD": "1",
},
"team_name": "Dallas Cowboys",
"image": "https://images.generated.photos/eGoWRgqxtahGFDAD81-l8CNxdz1oe-huz3CQ7m3v0VI/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAzNDA0NDlfMDgz/MDY1Nl8wMTk4NTI4/LmpwZw.jpg",
"showing_stats": false,
"points": 9,
},
{
"number": 84,
"name": "Sean McKeon",
"position": "Tight end",
"stats":
{
"Rushing Yards": "1" ,
"Receiving Yards": "551 YDS",
"Receptions": "1",
"TD": "1",
},
"team_name": "Dallas Cowboys",
"image": "https://images.generated.photos/EUa6Hmnt6682dl03Q5FPIeMqLnS833rfzOJaJXlYxqI/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzAxNTk3OTFfMDU1/Nzg5OF8wMzgzMzIw/LmpwZw.jpg",
"showing_stats": false,
"points": 0,
},
{
"number": 86,
"name": "Dalton Schultz",
"position": "Tight end",
"stats":
{
"Rushing Yards": "1" ,
"Receiving Yards": "551 YDS",
"Receptions": "1",
"TD": "1",
},
"team_name": "Dallas Cowboys",
"image": "https://images.generated.photos/-K9iBY4oOkLsqQfoTA1R8X0EKvR_BCbMXk0KNX4EIIs/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA0NzY1MjkuanBn.jpg",
"showing_stats": false,
"points": 13,
},
{
"number": 23,
"name": "Darian Thompson RB",
"position": "Running back",
"stats":
{
"Rushing Yards": "1" ,
"Receiving Yards": "551 YDS",
"Receptions": "1",
"TD": "1",
},
"team_name": "Kansas City Chiefs",
"image": "https://images.generated.photos/cb3jAo-GBziFLxs85KJGt7a8bJdhz4sSy76PYAXkeg4/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA1ODU4MDBfMDMy/NjY2OF8wODEwNTA2/LmpwZw.jpg",
"showing_stats": false,
"points": 4,
},
{
"number": 2,
"name": "Greg Zuerlein K",
"position": "Special team",
"stats":
{
"XP": "1" ,
"FG": "551 YDS",
},
"team_name": "Dallas Cowboys",
"image": "https://images.generated.photos/fd8kkioB4vLw_5MGwQXdDt9Q7Ley2_Ia8Cu390zaNVM/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA0Nzg2ODEuanBn.jpg",
"showing_stats": false,
"points": 11,
},
{
"number": "N/A",
"name": "Arizona Cardinals",
"position": "Defense",
"stats":
{
"Fumble": "1" ,
"YDS_Allowed": "551 YDS",
"Sacks": "1",
"INT": "1",
"TD": "0",
},
"team_name": "Arizona Cardinals",
"image": "https://images.generated.photos/fd8kkioB4vLw_5MGwQXdDt9Q7Ley2_Ia8Cu390zaNVM/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA0Nzg2ODEuanBn.jpg",
"showing_stats": false,
"points": 11,
},
{
"number": "N/A",
"name": "Kansas City Chiefs",
"position": "Defense",
"stats":
{
"Fumble": "1" ,
"YDS_Allowed": "551 YDS",
"Sacks": "1",
"INT": "1",
"TD": "0",
},
"team_name": "Kansas City Chiefs",
"image": "https://images.generated.photos/fd8kkioB4vLw_5MGwQXdDt9Q7Ley2_Ia8Cu390zaNVM/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA0Nzg2ODEuanBn.jpg",
"showing_stats": false,
"points": 11,
},
{
"number": "N/A",
"name": "Atlanta Falcons",
"position": "Defense",
"stats":
{
"Fumble": "1" ,
"YDS_Allowed": "551 YDS",
"Sacks": "1",
"INT": "1",
"TD": "0",
},
"team_name": "Atlanta Falcons",
"image": "https://images.generated.photos/fd8kkioB4vLw_5MGwQXdDt9Q7Ley2_Ia8Cu390zaNVM/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA0Nzg2ODEuanBn.jpg",
"showing_stats": false,
"points": 11,
},
{
"number": "N/A",
"name": "Baltimore Ravens",
"position": "Defense",
"stats":
{
"Fumble": "1" ,
"YDS_Allowed": "551 YDS",
"Sacks": "1",
"INT": "1",
"TD": "0",
},
"team_name": "Baltimore Ravens",
"image": "https://images.generated.photos/fd8kkioB4vLw_5MGwQXdDt9Q7Ley2_Ia8Cu390zaNVM/rs:fit:128:128/Z3M6Ly9nZW5lcmF0/ZWQtcGhvdG9zL3Yz/XzA0Nzg2ODEuanBn.jpg",
"showing_stats": false,
"points": 11,
},
]

@ -0,0 +1,94 @@
/** @module routing */
/**
* A bare-bones history-api based SPA router.
*/
class Router {
/**
* Arguments for the current route.
* @type {undefined|*}
*/
route_args = undefined
/**
* List of callback functions listening for route changes.
* @type {function[]}
*/
subscribers = []
/**
* Array of router history records.
* @type {object[]}
*/
history = []
/**
* Returns the APP_BASE_PATH of the application.
* @return {string}
*/
get base_path() {
return APP_BASE_PATH
}
/**
* Navigate the app to the given path with the given args.
* @param {string} path
* @param {*} args
*/
navigate(path, args) {
this.route_args = args
this.history.push({path, args})
window.history.pushState({}, path, this.build_url(path))
this.subscribers.forEach(sub => sub(path, args))
}
/**
* Navigate back one route.
*/
back() {
window.history.back()
if ( this.history.length < 2 ) return;
this.history.pop()
const { path, args } = this.history[this.history.length - 1]
this.subscribers.forEach(sub => sub(path, args))
}
/**
* Subscribe to listen for route changes. Returns an object with an unsubscribe() property.
* @param {function} handler - callback called when the route changes
* @return {object} - subscription manager
*/
subscribe(handler) {
if ( !this.subscribers.includes(handler) ) {
this.subscribers.push(handler)
}
return {
unsubscribe: () => {
this.subscribers = this.subscribers.filter(handler)
}
}
}
/**
* Given an array of route parts, build a joined URL route.
* @param {...string} parts
* @return {string}
*/
build_url(...parts) {
parts = [this.base_path, ...parts].map(part => {
if ( part.endsWith('/') ) part = part.slice(0, -1)
if ( part.startsWith('/') ) part = part.slice(1)
return part
})
return parts.join('/')
}
}
/**
* Global router instance.
* @type {Router}
*/
const router = new Router()
export { router }

@ -0,0 +1,22 @@
import components from '../components.js'
import VuES6Loader from '../../lib/vues6.js'
/*
* This is a little script to load the components into Vue in a nice way.
*/
const loader = new VuES6Loader(components)
loader.load()
/*
* This is the Vue app itself.
*/
const app = new Vue({
el: '#wrapper',
data: {},
})
/*
* In case either needs to be accessed, they can with:
* import { app, loader } from './start.js'
*/
export { app, loader }

@ -0,0 +1,41 @@
/** @module util */
/**
* Makes a deep copy of the value passed in.
* @param {*} obj
* @return {*}
*/
export function clone(obj) {
// If it's just a value, return it.
if ( typeof obj !== 'object' || obj === null ) return obj
// If it's an array, copy its values.
if ( Array.isArray(obj) ) return obj.map(x => clone(x))
// If it's an object, copy its properties.
const copy = {}
for ( const prop in obj ) {
copy[prop] = clone(obj[prop])
}
return copy
}
/**
* Generate an absolute URL to a file w/in the project directory.
* @param {string} path
* @return {string}
*/
export function appUrl(path) {
if ( path.startsWith('/') ) path = path.slice(1)
return `${APP_BASE_PATH}${path}`
}
/**
* Generates a UUIDv4. Taken from: https://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid
* @return {string}
*/
export function uuid_v4() {
return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c =>
(c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
);
}

@ -0,0 +1,260 @@
@import url('https://fonts.googleapis.com/css2?family=Roboto+Condensed:wght@300;400;700&display=swap');
body {
font-family: 'Roboto Condensed', sans-serif;
}
:root {
--color-text-dark: #022D50;
--color-text-light: #FDFFFC;
--color-accent-1: #0582CA;
--color-accent-2: #00A6FB;
--color-accent-3: #CC5746;
}
#wrapper {
height: 100%;
width: 100%;
position: fixed;
top: 0;
left: 0;
overflow-y: scroll;
}
.top-level-container {
flex: 1;
display: flex;
flex-direction: column;
}
/****** NAVIGATION BAR STYLES ******/
.navbar-container {
background: var(--color-text-light);
color: var(--color-text-dark);
position: fixed;
width: 100%;
}
.navbar-container .title {
margin-left: 20px;
}
.navbar {
list-style-type: none;
margin: 0;
padding: 0;
color: var(--color-text-light);
background: var(--color-text-dark);
overflow: hidden;
}
.navbar .navbar-item {
display: inline;
float: left;
transition: all linear 150ms;
}
.navbar .navbar-item:hover, .navbar .navbar-item.active {
background: var(--color-text-light);
color: var(--color-text-dark);
}
.navbar .navbar-item a {
display: block;
text-align: center;
text-decoration: none;
padding: 15px;
}
.page-container {
margin-top: 130px;
}
/******** SHARED GRID STYLES ********/
.component-app-grid table {
width: 100%;
border: 1px solid var(--color-text-dark);
border-collapse: collapse;
}
.component-app-grid th, .component-app-grid td {
padding: 10px;
border: 1px solid var(--color-text-dark);
border-collapse: collapse;
}
div.center {
display: table;
align-items: center;
text-align: center;
}
div.center img {
vertical-align: middle;
display: table-cell;
}
div.center span {
padding: 10px;
vertical-align: middle;
display: table-cell;
}
#ranking{
text-align: center;
}
#record{
text-align: center;
}
.header {
padding-left: 15px;
display: flex;
flex-direction: row;
}
.header .left {
flex: 1;
}
.header .right {
margin-right: 20px;
}
.header .right button {
margin: 0;
margin-top: 25px;
border: 1px solid lightgray;
padding: 5px 20px;
}
.header .right button:hover:not(.disable-click) {
background: lightgrey;
cursor: pointer;
}
.header .right button.disable-click {
background: darkgrey;
}
/********* ADD PLAYERS PAGE **********/
.page-add-players {
display: flex;
flex-direction: column;
}
.page-add-players .header input {
border: 1px solid lightgray;
padding: 5px;
border-radius: 3px;
margin-top: 24px;
}
.page-add-players .item-grid {
flex: 1;
display: flex;
flex-direction: row;
height: 270px;
flex-wrap: wrap;
}
.page-add-players .item-grid .item {
margin: 15px;
border: 1px solid darkgrey;
border-radius: 5px;
padding: 10px;
min-width: 180px;
min-height: 270px;
display: flex;
flex-direction: column;
}
.page-add-players .item-grid .item .item-icon {
text-align: center;
}
.page-add-players .item-grid .item .item-icon img {
height: 100px;
border-radius: 50%;
}
.page-add-players .item-grid .item .item-contents h1 {
font-size: 1.5em;
}
.page-add-players .item-grid .item .item-button button {
width: 100%;
color: white;
border-radius: 5px;
}
.page-add-players .item-grid .item .item-button button.add {
border: 1px solid #009900;
background: darkgreen;
}
.page-add-players .item-grid .item .item-button button.add:hover {
background: #009900;
cursor: pointer;
}
.page-add-players .item-grid .item .item-button button.remove {
border: 1px solid #ff1a1a;
background: #cc0000;
}
.page-add-players .item-grid .item .item-button button.remove:hover {
background: #ff1a1a;
cursor: pointer;
}
/************ MY TEAM PAGE **************/
.page-my-team .header .team-name {
display: flex;
flex-direction: row;
}
.page-my-team .header .team-name input {
margin-left: 5px;
border: none;
font-size: 15pt;
font-family: 'Roboto Condensed', sans-serif;
flex: 1;
}
/************ League PAGE **************/
#ranking{
text-align: center;
}
#record{
text-align: center;
}
.page-league .stats {
display: flex;
flex-direction: row;
}
.page-league .stats .stat {
margin-right: 10px;
}
.page-league .stats .stat .title {
font-weight: bold;
}
/************ Draft Board PAGE **************/
.page-draft-board .stats {
display: flex;
flex-direction: row;
}
.page-draft-board .stats .stat {
margin-right: 10px;
}
.page-draft-board .stats .stat .title {
font-weight: bold;
}
Loading…
Cancel
Save