Skip to content

Commit e509941

Browse files
Version 3.1.0 - Added Google Sheets support
1 parent 00d719b commit e509941

File tree

7 files changed

+166
-18
lines changed

7 files changed

+166
-18
lines changed

README.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,5 +165,8 @@ Flamingo icon from http://www.iconsmind.com
165165
* May or may not also fix a bug where European users saw the date off by one day on the display.
166166
* 2.2.6 - November 15, 2022
167167
* Upgrade to new version of xlsx importer to fix issue with extlst tag not being parsed correctly.
168-
* 3.0.0 - February 5, 2022
169-
* Added support for JRDA statsbook. Seems a good a reason as any for a new major version number.
168+
* 3.0.0 - February 5, 2023
169+
* Added support for JRDA statsbook. Seems a good a reason as any for a new major version number.
170+
* 3.1.0 - January 19, 2024
171+
* Added ability to load statsbook from Google Sheets link.
172+
* Corrected year of prior update in this README file.

main.js

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ const isDev = require('electron-is-dev')
77
let menu,
88
win,
99
helpWin,
10-
aboutWin
10+
aboutWin,
11+
urlWin
1112

1213
let showConsole = false
1314

@@ -211,6 +212,46 @@ let openHelp = () => {
211212

212213
}
213214

215+
let openURLwin = () => {
216+
urlWin = new BrowserWindow ({
217+
parent: win,
218+
title: 'Google Sheets URL Entry',
219+
icon: __dirname + '/build/flamingo-white.png',
220+
width: 800,
221+
height: 300,
222+
x: win.getPosition()[0] + 20,
223+
y: win.getPosition()[1] + 20,
224+
webPreferences: {
225+
nodeIntegration: true
226+
}
227+
})
228+
229+
if (showConsole){
230+
urlWin.webContents.openDevTools()
231+
}
232+
233+
urlWin.setMenu(null)
234+
235+
urlWin.loadURL(url.format({
236+
pathname: path.join(__dirname, 'src/openurl.html'),
237+
protocol: 'file',
238+
slashes: true
239+
}))
240+
241+
urlWin.webContents.on('new-window', function(e, url) {
242+
e.preventDefault()
243+
require('electron').shell.openExternal(url)
244+
})
245+
246+
urlWin.on('closed', () => {
247+
aboutWin = null
248+
})
249+
250+
urlWin.webContents.on('did-finish-load', () => {
251+
urlWin.webContents.send('set-version', app.getVersion())
252+
})
253+
}
254+
214255
//app.on('ready', createWindow)
215256

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

278+
ipc.on('open-get-url-window', () => {
279+
openURLwin()
280+
})
281+
282+
ipc.on('url-submitted', (event, statsbookURL) => {
283+
urlWin.close()
284+
win.webContents.send('load-google-sheet',statsbookURL)
285+
})
286+
237287
ipc.on('error-thrown', (event, msg, url, lineNo, columnNo) => {
238288
dialog.showMessageBox(win, {
239289
type: 'error',

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "statsbooktool",
3-
"version": "3.0.0",
3+
"version": "3.1.0",
44
"description": "A tool for error checking WFTDA Statsbooks",
55
"main": "main.js",
66
"author": "Adam Smasher (Daniel Alt) <dan@fnerk.com>",
@@ -34,6 +34,7 @@
3434
"popper.js": "^1.14.3",
3535
"typeface-raleway": "^0.0.54",
3636
"uuid": "^3.2.1",
37+
"valid-url": "^1.0.9",
3738
"xlsx": "^0.18.5",
3839
"xmlbuilder": "^10.0.0"
3940
},

src/index.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ <h1><strong>StatsBook Tool</strong></h1>
2626
<div class="col">
2727
<div id="drag-file">
2828
<input type="file" name="file" id="file-select" class="inputfile" accept=".xlsx" />
29-
<label for="file-select">Choose a file <span class="box__dragndrop"> or drag it here.</span></label>
29+
<label for="file-select">Choose a file <span class="box__dragndrop"> or drag it here.<br><br>
30+
<button type="button" class="btn btn-secondary" id="geturlbutton">Enter Google Sheets URL</button></span></label>
3031
</div>
3132
</div>
3233
<div class="col">

src/index.js

Lines changed: 55 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ const { remote } = require('electron')
77
const { Menu, MenuItem } = remote
88
const mousetrap = require('mousetrap')
99
const fs = require('fs')
10+
const request = require('request')
11+
var validURL = require('valid-url')
1012

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

@@ -21,6 +23,11 @@ let fileInfoBox = document.getElementById('file-info-box')
2123
let outBox = document.getElementById('output-box')
2224
let newVersionWarningBox = document.getElementById('newVersionWarning')
2325
let refreshButton = {}
26+
let geturlbutton = document.getElementById('geturlbutton')
27+
28+
geturlbutton.onclick = () => {
29+
ipc.send('open-get-url-window')
30+
}
2431

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

4048
// Globals
4149
let sbData = {}, // derbyJSON formatted statsbook data
@@ -46,7 +54,8 @@ let sbData = {}, // derbyJSON formatted statsbook data
4654
sbFilename = '',
4755
sbVersion = '',
4856
warningData = {},
49-
sbFile = new File([''],'')
57+
sbFile = new File([''],''),
58+
googleSheet = ''
5059
const teamList = ['home','away']
5160
let anSP = /^sp\*?$/i
5261
let mySP = /^sp$/i
@@ -82,6 +91,7 @@ fileSelect.onchange = (e) => {
8291
}
8392

8493
sbFile = e.target.files[0]
94+
googleSheet = ''
8595

8696
makeReader(sbFile)
8797
return false
@@ -99,22 +109,49 @@ holder.ondrop = (e) => {
99109
}
100110

101111
sbFile = e.dataTransfer.files[0]
112+
googleSheet = ''
113+
102114
makeReader(sbFile)
103115
return false
104116
}
105117

118+
ipc.on('load-google-sheet', (event, statsbookURL) => {
119+
120+
statsbookURL = statsbookURL.replace(/(\/d\/[a-zA-Z0-9-_]*\/)(.*)/gm,'$1export?format=xlsx')
121+
122+
if (!validURL.isUri(statsbookURL)){
123+
//error not valid url
124+
fileInfoBox.innerHTML = `Error: ${statsbookURL} is not a valid URL`
125+
return
126+
}
127+
googleSheet = statsbookURL
128+
129+
loadGoogleSheet(googleSheet)
130+
})
131+
132+
let loadGoogleSheet = (statsbookURL) => {
133+
request.get(statsbookURL, { encoding: null }, function (err, res, data) {
134+
if (err || res.statusCode != 200) {
135+
fileInfoBox.innerHTML = `Unable to load file. Error: ${err}`
136+
return
137+
}
138+
const buf = Buffer.from(data)
139+
const workbook = XLSX.read(buf)
140+
141+
readSbData(workbook)
142+
})
143+
}
144+
145+
106146
let makeReader = (sbFile) => {
107147
sbFilename = sbFile.name
108148
let data = fs.readFileSync(sbFile.path)
109149
data = new Uint8Array(data)
110-
readSbData(data)
111-
}
112-
113-
let readSbData = (data) => {
114-
// Take raw data from Excel File and process the file.
115-
116150
var workbook = XLSX.read(data, {type: 'array'})
151+
readSbData(workbook)
152+
}
117153

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

182-
refreshButton.onclick = () => {
183-
makeReader(sbFile)
184-
}
219+
if (googleSheet == '' ){
220+
// If a local file has been loaded
221+
refreshButton.onclick = () => {
222+
makeReader(sbFile)
223+
}
185224

186-
mousetrap.bind('f5', () => {
187-
makeReader(sbFile)
188-
})
225+
mousetrap.bind('f5', () => {
226+
makeReader(sbFile)
227+
})
228+
} else {
229+
loadGoogleSheet(googleSheet)
230+
}
189231
}
190232

191233
let getVersion = (workbook) => {

src/openurl.html

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta charset="UTF-8">
5+
<title>StatsBook Tool</title>
6+
<link rel="stylesheet" href="../node_modules/typeface-raleway/index.css">
7+
<link rel="stylesheet" href="../node_modules/bootstrap/dist/css/bootstrap.min.css">
8+
<link rel="stylesheet" href="../css/index.css">
9+
</head>
10+
<body>
11+
<div class="container">
12+
<div class="row">
13+
<div class="col-sm-12">
14+
<H3>Enter Statsbook URL</H3><br>
15+
<P>Note: do NOT use any sort of URL shortener - full Google Sheets URL is required.</P>
16+
<form>
17+
<div class="form-group">
18+
<input class="form-control" type="url" id="urlBox" name="statsbook_url" placeholder="docs.google.com/spreadsheets/d/13TAnjWUAheMgH_kDDwdd1LH3JghDLT88QsR-VR2OnzM/">
19+
</div>
20+
<button id="submitURLbutton" type="button" class="btn btn-primary">Submit</button>
21+
</form>
22+
</div>
23+
</div>
24+
</div>
25+
26+
<script>
27+
window.jQuery = window.$ = require('jquery');
28+
</script>
29+
<script src="../node_modules/popper.js/dist/umd/popper.js"></script>
30+
<script src="../node_modules/bootstrap/dist/js/bootstrap.js"></script>
31+
32+
</body>
33+
<script src="openurl.js"></script>
34+
</html>

src/openurl.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
const electron = require('electron')
2+
const ipc = electron.ipcRenderer
3+
4+
let submitURLbutton = document.getElementById('submitURLbutton')
5+
let urlBox = document.getElementById('urlBox')
6+
7+
submitURLbutton.onclick = () => {
8+
ipc.send('url-submitted',urlBox.value)
9+
}
10+
11+
// Submit URL if user hits "Enter"
12+
urlBox.addEventListener('keypress', function(event) {
13+
if (event.key === 'Enter') {
14+
event.preventDefault()
15+
submitURLbutton.click()
16+
}
17+
})

0 commit comments

Comments
 (0)