Skip to content

Commit

Permalink
Options page update
Browse files Browse the repository at this point in the history
Implemented Options page. Events can now be edited or deleted.
  • Loading branch information
AsifulNobel committed Feb 17, 2017
1 parent 6f1619d commit 2bcf35b
Show file tree
Hide file tree
Showing 11 changed files with 2,791 additions and 38 deletions.
4 changes: 4 additions & 0 deletions css/font-awesome.min.css

Large diffs are not rendered by default.

Binary file added fonts/FontAwesome.otf
Binary file not shown.
Binary file added fonts/fontawesome-webfont.eot
Binary file not shown.
2,671 changes: 2,671 additions & 0 deletions fonts/fontawesome-webfont.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added fonts/fontawesome-webfont.ttf
Binary file not shown.
Binary file added fonts/fontawesome-webfont.woff
Binary file not shown.
Binary file added fonts/fontawesome-webfont.woff2
Binary file not shown.
5 changes: 3 additions & 2 deletions html/options.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@
<html>
<head>
<title>Countdown Timer Options</title>
<link rel="stylesheet" type="text/css" href="../css/font-awesome.min.css">
<script type="text/javascript" src="../js/directive.js"></script>
<script type="text/javascript" src="../js/options.js"></script>
</head>
<body>
<div>
<input type="text" name="timer-name" placeholder="Type Event Name" autofocus="yes">
<input type="datetime-local" name="timer-time">
<button id="add-button">Add Countdown</button>
<input type="datetime-local" name="timer-time" value="2020-01-01T00:00">
<i class="fa fa-plus-circle fa-lg" id="add-button"></i>
</div>

<div>
Expand Down
115 changes: 86 additions & 29 deletions js/directive.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,5 @@
var storage = chrome.storage.local;

function countApp() {
this.eventDict = {};
this.restoreCountdowns = restoreCountdowns;
this.saveEvents = saveEvents.bind(this); // For passing object context to callback
}

function replaceTimezone(timeStr) {
return timeStr.replace(/\sGMT.*$/, "");
}
Expand All @@ -18,28 +12,41 @@ function setError(errorMsg) {
document.getElementById('errors').innerHTML = errorMsg;
}

function restoreCountdowns(timersList, divFlag) {
function addZero(str) {
return str > 9 ? str : '0'+str;
}

function formatTime(timeStr) {
return timeStr.getFullYear()+'-'+(addZero(timeStr.getMonth()+1))+
'-'+addZero(timeStr.getDate())+'T'+addZero(timeStr.getHours())+':'+addZero(timeStr.getMinutes())
}

// ToDo: Modularize asynchronous callback functions for storage.get,
// so that those functions call another function with result of storage call.
function restoreCountdowns(timersList, divFlag) {
storage.get('events', function(items){
if (typeof items.events !== "undefined") {
this.eventDict = items.events
var eventDict = items.events

if (Object.keys(this.eventDict).length > 0 && timersList) {
if (divFlag == 0) {
for (var key in this.eventDict) {
if (Object.keys(eventDict).length > 0 && timersList) {
console.log(Object.keys(eventDict).length)

if (this.eventDict.hasOwnProperty(key)) {
if (divFlag == 0) {
for (var key in eventDict) {
if (eventDict.hasOwnProperty(key)) {
timersList.insertAdjacentHTML('beforeend',
'<li>' + key + ': ' + replaceTimezone(this.eventDict[key]) + '</li>')
'<li id="'+ key + '">' + key + ': ' + replaceTimezone(eventDict[key]) +
' <i class="fa fa-pencil-square-o edit-ev"></i> <i class="fa fa-times delete-ev"></i>'
+ '</li>')
}
}
}
else if (divFlag == 1) {
for (var key in this.eventDict) {
for (var key in eventDict) {

if (this.eventDict.hasOwnProperty(key)) {
if (eventDict.hasOwnProperty(key)) {
timersList.insertAdjacentHTML('beforeend',
'<div>' + key + ': ' + replaceTimezone(this.eventDict[key]) + '</div>')
'<div>' + key + ': ' + replaceTimezone(eventDict[key]) + '</div>')
}
}
}
Expand All @@ -48,31 +55,81 @@ function restoreCountdowns(timersList, divFlag) {
});
}

function saveEvents() {
function saveEvent() {
var eventTime = document.getElementsByName('timer-time');
var eventName = document.getElementsByName('timer-name');
var timersList = document.getElementById('timers');

console.log("Inside save...")
console.log(typeof this.eventDict !== "undefined")

if(eventTime.length > 0 && eventName.length > 0) {
var eventDateObj = new Date(eventTime[0].value);

if (eventName[0].value.length > 0) {
if (eventDateObj - Date.now() > 0) {

this.eventDict[eventName[0].value] = eventDateObj.toUTCString()
storage.set({events: this.eventDict}, function() {
timersList.insertAdjacentHTML('beforeend',
'<li>' + eventName[0].value + ': ' + replaceTimezone(eventDateObj.toUTCString()) + '</li>')
storage.get('events', function(items) {
if (typeof items.events !== "undefined") {
var eventDict = items.events

eventDict[eventName[0].value] = eventDateObj.toUTCString()

storage.set({events: eventDict}, function() {
timersList.insertAdjacentHTML('beforeend',
'<li id="'+ eventName[0].value + '">' + eventName[0].value + ': ' +
replaceTimezone(eventDateObj.toUTCString()) +
'<i class="fa fa-pencil-square-o edit-ev"></i><i class="fa fa-times delete-ev"></i>'
+ '</li>')

console.log("Successfully Added Event!");
});

storage.get('events', function(items){
if (typeof items.events !== "undefined")
console.log(items.events)
});
});
clearError();
}
})
}
else {
setError("Date must be in future.");
}
}
else {
setError("Event must have a name.");
}
}
}

function editEvent() {
// Gets called from event element adjacent edit button
var eventTime = document.getElementsByName('timer-time')[0];
var eventName = document.getElementsByName('timer-name')[0];

// Gets parent element which is the event entry
var parent = this.parentElement;
var parentText = parent.innerText.split(': ');

eventName.value = parentText[0];
eventTime.value = formatTime(new Date(parentText[1]));

// passes context to deleteEvent fn
deleteEvent.call(this);
}

function deleteEvent() {
var parent = this.parentElement;
var eventName = parent.innerText.split(': ')[0];

storage.get('events', function(items) {
if (typeof items.events !== "undefined") {
var eventDict = items.events

delete eventDict[eventName];

storage.set({events: eventDict}, function() {
console.log("Successfully Deleted Event!");
});

clearError();
}
})

parent.innerText = '';
parent.parentElement.removeChild(parent);
}
29 changes: 25 additions & 4 deletions js/options.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,30 @@
function masterFn() {
var capp = new countApp();
restoreCountdowns(document.getElementById('timers'), 0);
document.getElementById('add-button').addEventListener('click', saveEvent);
}

capp.restoreCountdowns(document.getElementById('timers'), 0);
document.getElementById('add-button').addEventListener('click', capp.saveEvents);
function buttonEventAdder() {
var editButtons = document.getElementsByClassName('edit-ev');
var deleteButtons = document.getElementsByClassName('delete-ev');

for(var i=0; i < editButtons.length; i++) {
editButtons[i].addEventListener('click', editEvent);

// Always will be same number of delete & edit buttons
deleteButtons[i].addEventListener('click', deleteEvent);
}
}

// waits until initial document without stylesheet and other resources is load
var fnList = [buttonEventAdder];

// Checks if document is fully loaded every 0.5 second
setInterval(function() {
if (document.readyState == "complete") {
for(var i = 0; i < fnList.length; i++) {
fnList[i]();
}
}
}, 500);

// waits until initial document with stylesheet and other resources is loaded
document.addEventListener('DOMContentLoaded', masterFn);
5 changes: 2 additions & 3 deletions js/timer.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
function masterFn() {
var capp = new countApp();

capp.restoreCountdowns(document.body, 1);
restoreCountdowns(document.body, 1);
}

// waits until initial document without stylesheet and other resources is load
document.addEventListener('DOMContentLoaded', masterFn);

0 comments on commit 2bcf35b

Please sign in to comment.