Skip to content

Commit

Permalink
Version 3.1.0 - Added Google Sheets support
Browse files Browse the repository at this point in the history
  • Loading branch information
AdamSmasherDerby committed Jan 20, 2024
1 parent 00d719b commit e509941
Show file tree
Hide file tree
Showing 7 changed files with 166 additions and 18 deletions.
7 changes: 5 additions & 2 deletions README.md
Expand Up @@ -165,5 +165,8 @@ Flamingo icon from http://www.iconsmind.com
* May or may not also fix a bug where European users saw the date off by one day on the display.
* 2.2.6 - November 15, 2022
* Upgrade to new version of xlsx importer to fix issue with extlst tag not being parsed correctly.
* 3.0.0 - February 5, 2022
* Added support for JRDA statsbook. Seems a good a reason as any for a new major version number.
* 3.0.0 - February 5, 2023
* Added support for JRDA statsbook. Seems a good a reason as any for a new major version number.
* 3.1.0 - January 19, 2024
* Added ability to load statsbook from Google Sheets link.
* Corrected year of prior update in this README file.
52 changes: 51 additions & 1 deletion main.js
Expand Up @@ -7,7 +7,8 @@ const isDev = require('electron-is-dev')
let menu,
win,
helpWin,
aboutWin
aboutWin,
urlWin

let showConsole = false

Expand Down Expand Up @@ -211,6 +212,46 @@ let openHelp = () => {

}

let openURLwin = () => {
urlWin = new BrowserWindow ({
parent: win,
title: 'Google Sheets URL Entry',
icon: __dirname + '/build/flamingo-white.png',
width: 800,
height: 300,
x: win.getPosition()[0] + 20,
y: win.getPosition()[1] + 20,
webPreferences: {
nodeIntegration: true
}
})

if (showConsole){
urlWin.webContents.openDevTools()
}

urlWin.setMenu(null)

urlWin.loadURL(url.format({
pathname: path.join(__dirname, 'src/openurl.html'),
protocol: 'file',
slashes: true
}))

urlWin.webContents.on('new-window', function(e, url) {
e.preventDefault()
require('electron').shell.openExternal(url)
})

urlWin.on('closed', () => {
aboutWin = null
})

urlWin.webContents.on('did-finish-load', () => {
urlWin.webContents.send('set-version', app.getVersion())
})
}

//app.on('ready', createWindow)

app.whenReady().then(() => createWindow())
Expand All @@ -234,6 +275,15 @@ ipc.on('enable-menu-items', () => {
menu.items.find(x => x.label == 'File').submenu.items.find(x => x.label == 'Export Roster to CRG JSON (beta)').enabled = true
})

ipc.on('open-get-url-window', () => {
openURLwin()
})

ipc.on('url-submitted', (event, statsbookURL) => {
urlWin.close()
win.webContents.send('load-google-sheet',statsbookURL)
})

ipc.on('error-thrown', (event, msg, url, lineNo, columnNo) => {
dialog.showMessageBox(win, {
type: 'error',
Expand Down
3 changes: 2 additions & 1 deletion package.json
@@ -1,6 +1,6 @@
{
"name": "statsbooktool",
"version": "3.0.0",
"version": "3.1.0",
"description": "A tool for error checking WFTDA Statsbooks",
"main": "main.js",
"author": "Adam Smasher (Daniel Alt) <dan@fnerk.com>",
Expand Down Expand Up @@ -34,6 +34,7 @@
"popper.js": "^1.14.3",
"typeface-raleway": "^0.0.54",
"uuid": "^3.2.1",
"valid-url": "^1.0.9",
"xlsx": "^0.18.5",
"xmlbuilder": "^10.0.0"
},
Expand Down
3 changes: 2 additions & 1 deletion src/index.html
Expand Up @@ -26,7 +26,8 @@ <h1><strong>StatsBook Tool</strong></h1>
<div class="col">
<div id="drag-file">
<input type="file" name="file" id="file-select" class="inputfile" accept=".xlsx" />
<label for="file-select">Choose a file <span class="box__dragndrop"> or drag it here.</span></label>
<label for="file-select">Choose a file <span class="box__dragndrop"> or drag it here.<br><br>
<button type="button" class="btn btn-secondary" id="geturlbutton">Enter Google Sheets URL</button></span></label>
</div>
</div>
<div class="col">
Expand Down
68 changes: 55 additions & 13 deletions src/index.js
Expand Up @@ -7,6 +7,8 @@ const { remote } = require('electron')
const { Menu, MenuItem } = remote
const mousetrap = require('mousetrap')
const fs = require('fs')
const request = require('request')
var validURL = require('valid-url')

const download = require('./tools/download')

Expand All @@ -21,6 +23,11 @@ let fileInfoBox = document.getElementById('file-info-box')
let outBox = document.getElementById('output-box')
let newVersionWarningBox = document.getElementById('newVersionWarning')
let refreshButton = {}
let geturlbutton = document.getElementById('geturlbutton')

geturlbutton.onclick = () => {
ipc.send('open-get-url-window')
}

const menu = new Menu()
menu.append( new MenuItem( { role: 'copy'} ))
Expand All @@ -36,6 +43,7 @@ let template2018 = require('../assets/2018statsbook.json')
let template2017 = require('../assets/2017statsbook.json')
let template2023jrda = require('../assets/2023jrda.json')
let sbErrorTemplate = require('../assets/sberrors.json')
//const { load } = require('npm')

// Globals
let sbData = {}, // derbyJSON formatted statsbook data
Expand All @@ -46,7 +54,8 @@ let sbData = {}, // derbyJSON formatted statsbook data
sbFilename = '',
sbVersion = '',
warningData = {},
sbFile = new File([''],'')
sbFile = new File([''],''),
googleSheet = ''
const teamList = ['home','away']
let anSP = /^sp\*?$/i
let mySP = /^sp$/i
Expand Down Expand Up @@ -82,6 +91,7 @@ fileSelect.onchange = (e) => {
}

sbFile = e.target.files[0]
googleSheet = ''

makeReader(sbFile)
return false
Expand All @@ -99,22 +109,49 @@ holder.ondrop = (e) => {
}

sbFile = e.dataTransfer.files[0]
googleSheet = ''

makeReader(sbFile)
return false
}

ipc.on('load-google-sheet', (event, statsbookURL) => {

statsbookURL = statsbookURL.replace(/(\/d\/[a-zA-Z0-9-_]*\/)(.*)/gm,'$1export?format=xlsx')

if (!validURL.isUri(statsbookURL)){
//error not valid url
fileInfoBox.innerHTML = `Error: ${statsbookURL} is not a valid URL`
return
}
googleSheet = statsbookURL

loadGoogleSheet(googleSheet)
})

let loadGoogleSheet = (statsbookURL) => {
request.get(statsbookURL, { encoding: null }, function (err, res, data) {
if (err || res.statusCode != 200) {
fileInfoBox.innerHTML = `Unable to load file. Error: ${err}`
return
}
const buf = Buffer.from(data)
const workbook = XLSX.read(buf)

readSbData(workbook)
})
}


let makeReader = (sbFile) => {
sbFilename = sbFile.name
let data = fs.readFileSync(sbFile.path)
data = new Uint8Array(data)
readSbData(data)
}

let readSbData = (data) => {
// Take raw data from Excel File and process the file.

var workbook = XLSX.read(data, {type: 'array'})
readSbData(workbook)
}

let readSbData = (workbook) => {
// Reinitialize globals
sbData = {}
sbErrors = JSON.parse(JSON.stringify(sbErrorTemplate))
Expand Down Expand Up @@ -179,13 +216,18 @@ let createRefreshButton = () => {
fileInfoBox.innerHTML += '<button id="refresh" type="button" class="btn btn-secondary btn-sm">Refresh (f5)</button>'
refreshButton = document.getElementById('refresh')

refreshButton.onclick = () => {
makeReader(sbFile)
}
if (googleSheet == '' ){
// If a local file has been loaded
refreshButton.onclick = () => {
makeReader(sbFile)
}

mousetrap.bind('f5', () => {
makeReader(sbFile)
})
mousetrap.bind('f5', () => {
makeReader(sbFile)
})
} else {
loadGoogleSheet(googleSheet)
}
}

let getVersion = (workbook) => {
Expand Down
34 changes: 34 additions & 0 deletions src/openurl.html
@@ -0,0 +1,34 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>StatsBook Tool</title>
<link rel="stylesheet" href="../node_modules/typeface-raleway/index.css">
<link rel="stylesheet" href="../node_modules/bootstrap/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="../css/index.css">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-sm-12">
<H3>Enter Statsbook URL</H3><br>
<P>Note: do NOT use any sort of URL shortener - full Google Sheets URL is required.</P>
<form>
<div class="form-group">
<input class="form-control" type="url" id="urlBox" name="statsbook_url" placeholder="docs.google.com/spreadsheets/d/13TAnjWUAheMgH_kDDwdd1LH3JghDLT88QsR-VR2OnzM/">
</div>
<button id="submitURLbutton" type="button" class="btn btn-primary">Submit</button>
</form>
</div>
</div>
</div>

<script>
window.jQuery = window.$ = require('jquery');
</script>
<script src="../node_modules/popper.js/dist/umd/popper.js"></script>
<script src="../node_modules/bootstrap/dist/js/bootstrap.js"></script>

</body>
<script src="openurl.js"></script>
</html>
17 changes: 17 additions & 0 deletions src/openurl.js
@@ -0,0 +1,17 @@
const electron = require('electron')
const ipc = electron.ipcRenderer

let submitURLbutton = document.getElementById('submitURLbutton')
let urlBox = document.getElementById('urlBox')

submitURLbutton.onclick = () => {
ipc.send('url-submitted',urlBox.value)
}

// Submit URL if user hits "Enter"
urlBox.addEventListener('keypress', function(event) {
if (event.key === 'Enter') {
event.preventDefault()
submitURLbutton.click()
}
})

0 comments on commit e509941

Please sign in to comment.