|
|
- {header}
-
- <script src="https://code.jquery.com/jquery-3.3.1.min.js"
- integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
- crossorigin="anonymous">
- </script>
-
- <style>
-
- :root {
- --primary:rgba(16,116,231,1);
- --secondary:rgba(46,188,79,1);
- --dark:rgba(36,41,46,1);
- --dark-2:rgba(43,49,55,1);
- --white:rgba(255,255,255,1);
- }
-
- .vis-timeline {
- border: none;
- font-size: 16px;
- color: var(--white);
- background-color: var(--dark);
- }
- .vis-item {
- font-size: 16px;
- color: var(--dark);
- background-color: var(--white);
- box-sizing: border-box;
- box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.06), 0px 4px 6px rgba(0, 0, 0, 0.06);
- border-color: transparent;
- }
- .vis-item.vis-box {
- border-radius: 2px;
- padding: 0;
- border: none;
- }
- .vis-item .vis-item-content {
- padding: 8px 10px;
- }
- .vis-item.vis-box.vis-selected {
- border: 2px solid var(--primary);
- }
- .vis-item.vis-line {
- border-width: 2px;
- border-color: var(--primary)
- }
- .vis-item.vis-dot {
- border-color: var(--primary);
- }
- .vis-item.vis-selected {
- border-color: var(--primary);
- background-color: var(--white);
- box-shadow: 0px 20px 25px rgba(0, 0, 0, 0.2), 0px 10px 10px rgba(0, 0, 0, 0.14);
- }
- .vis-time-axis .vis-text {
- color: var(--white)!important;
- padding-top: 8px;
- padding-left: 16px;
- }
- .vis-time-axis .vis-grid.vis-minor {
- border-width: 2px;
- border-color: rgba(255, 255, 255, .29);
- }
- .vis-labelset .vis-label {
- color: var(--white);
- }
- .vis-time-axis .vis-grid.vis-major {
- border-width: 1px;
- border-color: rgba(255, 255, 255, .5);
- }
- </style>
-
-
- <br><br><br><br><br>
- <div id="timeline"></div>
- <br><br>
- <div class="container">
-
- <div class="row">
- <div class="col-md-8 col-12">
- <div class="blogPost">
- <div id=POST_PICTURE>
- </div>
-
- <div class="p-4">
- <b><h3 id="POST_TITLE"></h3></b>
- <h5>
- <span class="w3-opacity"><div id="POST_PUBLISHED"></div></span>
- </h5>
- <div id="POST_BODY"></div>
- </div>
- </div>
- <br>
- <br><br>
- </div>
- <div class="col-md-4 col-12">
- {>sideBar}
- </div>
- </div>
- </div>
-
- <script src="/includes/js/vis/dist/vis-timeline-graph2d.min.js"></script>
- <link href="/includes/js/vis/dist/vis-timeline-graph2d.min.css" rel="stylesheet" type="text/css" />
-
-
- <script type="text/javascript">
-
- /**
- * Runs a get request using ajax
- */
- function runAjax(url, successCallBack, errorCallBack)
- {
- console.log(url);
- $.ajax({
- type:'GET',
- url: url,
- crossDomain: true,
- dataType: "json",
- success: successCallBack,
- error:errorCallBack,
- timeout: 3000
- });
- }
-
- /** Lazy loads youtube videos on the page
- */
- function lazyLoad()
- {
- var youtube = document.querySelectorAll( ".youtube" );
-
- for (var i = 0; i < youtube.length; i++) {
-
- var source = "https://img.youtube.com/vi/"+ youtube[i].dataset.embed +"/sddefault.jpg";
-
- var image = new Image();
- image.src = source;
- image.addEventListener( "load", function() {
- youtube[ i ].appendChild( image );
- }( i ) );
-
- youtube[i].addEventListener( "click", function() {
-
- var iframe = document.createElement( "iframe" );
-
- iframe.setAttribute( "frameborder", "0" );
- iframe.setAttribute( "allowfullscreen", "" );
- iframe.setAttribute( "src", "https://www.youtube.com/embed/"+ this.dataset.embed +"?rel=0&showinfo=0&autoplay=1" );
-
- this.innerHTML = "";
- this.appendChild( iframe );
- } );
- };
- }
-
-
- function renderPostOnPage(postID)
- {
- runAjax("api/render/" + postID,
- (html)=>
- {
- //uses ajax to update blog page
- $('#POST_TITLE').text(html.name);
- $('#POST_PUBLISHED').text(html.published);
- $('#POST_BODY').html(html.blogBody);
- $('#POST_PICTURE').html(html.hasPicture ?
- '<img src="/blogContent/headerImages/' + html.picture_url + '" style="width:100%;">' :
- '');
-
- //lazy loads youtube videos
- lazyLoad();
-
- //highlights code
- document.querySelectorAll('pre code').forEach((block) => {
- hljs.highlightBlock(block);
- });
- //renders latex math
- MathJax.Hub.Queue(["Typeset",MathJax.Hub]);
- },
- (err)=>
- {
- console.log(err);
- });
- }
-
-
- /**
- * After a timeline event gets clicked this will
- * query the api for the blog post content and
- * display it on the page.
- */
- function timeLineClick(properties)
- {
- if(properties.item !== null)
- {
- renderPostOnPage(properties.item);
- }
- }
-
- /**
- * Fetches all the
- */
- function fetchPosts()
- {
- return new Promise((resolve, reject)=>
- {
- runAjax("api/posts", (data)=>
- {
- var datasetContents = [];
-
- for(var i=0; i < data.length; i++)
- {
- datasetContents.push(
- {
- start: new Date(data[i].published),
- content: data[i].name,
- id: data[i].post_id
- }
- );
- }
- resolve(datasetContents);
- renderPostOnPage(data[0].post_id);
- },
- (error)=>
- {
- resolve([]);
- });
- });
- }
-
-
- var container = document.getElementById('timeline');
-
- $(document).ready(function()
- {
- fetchPosts().then((data)=>
- {
- var options =
- {
- editable: false,
- margin: {
- item: 20,
- axis: 40
- },
- start:data[12].start,
- end:data[0].start
- };
-
- var items = new vis.DataSet(data);
- var timeline = new vis.Timeline(container, items, options);
- timeline.on('click', timeLineClick);
- });
- });
-
- </script>
-
-
- {footer}
|