diff --git a/bin/Release/AppX/vs.appxrecipe b/bin/Release/AppX/vs.appxrecipe
index 4fb3e2fd..9c29c41c 100644
--- a/bin/Release/AppX/vs.appxrecipe
+++ b/bin/Release/AppX/vs.appxrecipe
@@ -32,7 +32,7 @@
AppxManifest.xml
true
- 2017-08-23T13:15:45.669
+ 2017-08-23T21:52:36.698
@@ -603,11 +603,11 @@
www\js\app.js
- 2017-08-23T13:14:12.160
+ 2017-08-23T21:52:28.917
www\js\init.js
- 2017-08-23T13:15:28.105
+ 2017-08-23T21:44:15.407
www\js\lib\abstractFilesystemAccess.js
@@ -1528,7 +1528,7 @@
resources.pri
true
- 2017-08-23T10:02:58.575
+ 2017-08-23T20:53:00.126
diff --git a/bin/Release/AppX/www/js/app.js b/bin/Release/AppX/www/js/app.js
index d5907a0e..75e4db70 100644
--- a/bin/Release/AppX/www/js/app.js
+++ b/bin/Release/AppX/www/js/app.js
@@ -190,15 +190,20 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'abstractFile
});
$('#btnRescanDeviceStorage').on("click", function (e) {
+ document.getElementById('returntoArticle_top').innerHTML = "";
+ document.getElementById('returntoArticle_bottom').innerHTML = "";
+ //Stop app from jumping straight into to first archive if user initiated the scan (to give user a chance to select the archive manually)
+ params['rescan'] = true;
+ //Reload any ZIM files in local storage (whcih the usar can't otherwise select with the filepicker)
if (params['localStorage']) {
scanUWPFolderforArchives(params['localStorage']);
- return;
}
if (storages.length) {
searchForArchivesInStorage();
} else {
displayFileSelect();
- $('archiveFiles').click();
+ //$('archiveFiles').click();
+ $('btnConfigure').click();
}
});
// Bottom bar :
@@ -308,6 +313,20 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'abstractFile
$('#searchingForArticles').hide();
return false;
});
+ // TODO: I've set up two event listeners below because the archive list doesn't "change" if there is only one element in it
+ // See if this can be simplified.... (but note that keyboard users might not click)
+ $('#archiveList').on('change', function () {
+ console.log("***Archive List change event fired")
+ setLocalArchiveFromArchiveList()
+ });
+ $('#archiveList').on('click', function () {
+ console.log("***Archive List click event fired: checking length of options list")
+ var comboArchiveList = document.getElementById('archiveList');
+ if (comboArchiveList.options.length == 1) {
+ console.log("***Only one item, so, fire away...");
+ setLocalArchiveFromArchiveList();
+ }
+ });
$('input:radio[name=contentInjectionMode]').on('change', function (e) {
if (checkWarnServiceWorkerMode(this.value)) {
document.getElementById('returntoArticle_top').innerHTML = "";
@@ -381,7 +400,7 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'abstractFile
document.getElementById('cssUIDarkThemeCheck').checked = params['cssUITheme'] == 'dark' ? true : false;
cssUIThemeSet(params['cssUITheme']);
$('input:radio[name=cssInjectionMode]').filter('[value="' + params['cssSource'] + '"]').prop('checked', true);
- //First run of new version code
+ //Code below triggers display of modal info box if app is run for the first time, or it has been upgraded to new version
if (cookies.getItem('version') != params['version']) {
document.getElementById('myModal').style.display = "block";
document.getElementsByClassName("close")[0].onclick = function () {
@@ -583,7 +602,7 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'abstractFile
populateDropDownListOfArchives(directories);
}
else {
- if (storages.length) {
+ if (storages.length || params['localStorage']) {
searchForArchivesInStorage();
} else {
displayFileSelect();
@@ -602,7 +621,11 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'abstractFile
// If DeviceStorage is available, we look for archives in it
$("#btnConfigure").click();
$('#scanningForArchives').show();
- zimArchiveLoader.scanForArchives(storages, populateDropDownListOfArchives);
+ if (params['localStorage'] && typeof Windows !== 'undefined' && typeof Windows.Storage !== 'undefined') {
+ scanUWPFolderforArchives(params['localStorage']);
+ } else {
+ zimArchiveLoader.scanForArchives(storages, populateDropDownListOfArchives);
+ }
}
if ($.isFunction(navigator.getDeviceStorages)) {
@@ -612,7 +635,8 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'abstractFile
});
}
- if (Windows && Windows.Storage || (storages !== null && storages.length > 0)) {
+ if ((storages !== null && storages.length > 0) ||
+ (typeof Windows !== 'undefined' && typeof Windows.Storage !== 'undefined')) {
// Make a fake first access to device storage, in order to ask the user for confirmation if necessary.
// This way, it is only done once at this moment, instead of being done several times in callbacks
// After that, we can start looking for archives
@@ -682,10 +706,10 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'abstractFile
// Store the list of archives in a cookie, to avoid rescanning at each start
cookies.setItem("listOfArchives", archiveDirectories.join('|'), Infinity);
comboArchiveList.size = comboArchiveList.length;
-
- $('#archiveList').on('change', setLocalArchiveFromArchiveList);
+ //$('#archiveList').on('mouseup', setLocalArchiveFromArchiveList());
+ //$(comboArchiveList).on('click', setLocalArchiveFromArchiveList());
if (comboArchiveList.options.length > 0) {
- var lastSelectedArchive = cookies.getItem("lastSelectedArchive");
+ var lastSelectedArchive = cookies.getItem("lastSelectedArchive") || params['storedFile'];
if (lastSelectedArchive !== null && lastSelectedArchive !== undefined && lastSelectedArchive !== "") {
// Attempt to select the corresponding item in the list, if it exists
if ($("#archiveList option[value='" + lastSelectedArchive + "']").length > 0) {
@@ -780,7 +804,12 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'abstractFile
//archiveDirectory = MSApp.createFileFromStorageFile(file);
selectedArchive = zimArchiveLoader.loadArchiveFromDeviceStorage(selectedStorage, archiveDirectory, function (archive) {
// The archive is set : go back to home page to start searching
- $('#btnHome').click();
+ if (params['rescan']) {
+ $('#btnConfigure').click()
+ params['rescan'] = false;
+ } else {
+ $('#btnHome').click();
+ }
});
} else {
console.error("The picked file could not be found in the selected folder!");
@@ -816,11 +845,16 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'abstractFile
*/
function displayFileSelect() {
$('#openLocalFiles').show();
- var comboArchiveList = document.getElementById('archiveList');
- if (comboArchiveList.length > 0) { comboArchiveList.size = comboArchiveList.length; }
- //$('#archiveFile').on('change', setLocalArchiveFromFileSelect);
- $('#archiveFile').on('click', pickFileUWP); //UWP FilePicker [kiwix-js-windows #3]
- $('#archiveFiles').on('click', pickFolderUWP); //UWP FolderPicker
+ //TODO - check if this is necessary or if it causes the archiveList change event to fire
+ //Make archive list combo box fit the number of files
+ //var comboArchiveList = document.getElementById('archiveList');
+ //if (comboArchiveList.length > 0) { comboArchiveList.size = comboArchiveList.length; }
+ if (typeof Windows !== 'undefined' && typeof Windows.Storage !== 'undefined') {
+ $('#archiveFile').on('click', pickFileUWP); //UWP FilePicker [kiwix-js-windows #3]
+ $('#archiveFiles').on('click', pickFolderUWP); //UWP FolderPicker
+ } else {
+ $('#archiveFile').on('change', setLocalArchiveFromFileSelect);
+ }
}
function pickFileUWP() { //Support UWP FilePicker [kiwix-js-windows #3]
@@ -850,11 +884,15 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'abstractFile
folderPicker.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.downloads;
folderPicker.fileTypeFilter.replaceAll([".zim", ".dat", ".idx", ".txt", ".zimaa"]);
- folderPicker.pickSingleFolderAsync().then(scanUWPFolderForArchives(folder));
+ folderPicker.pickSingleFolderAsync().done(function (folder) {
+ if (folder) {
+ scanUWPFolderforArchives(folder);
+ }
+ });
}
function scanUWPFolderforArchives (folder) {
- if (folder) {
+ if (folder) {
// Application now has read/write access to all contents in the picked folder (including sub-folder contents)
// Cache folder so the contents can be accessed at a later time
Windows.Storage.AccessCache.StorageApplicationPermissions.futureAccessList.addOrReplace(params['falFolderToken'], folder);
@@ -862,7 +900,7 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'abstractFile
// Query the folder.
var query = folder.createFileQuery();
query.getFilesAsync().done(function (files) {
- // Display file list with storage provider and availability.
+ // Display file list
var archiveDisplay = document.getElementById('chooseArchiveFromLocalStorage');
if (!files) {
archiveDisplay.style.display = "inline";
diff --git a/bin/Release/AppX/www/js/init.js b/bin/Release/AppX/www/js/init.js
index 7328adfd..21626ff9 100644
--- a/bin/Release/AppX/www/js/init.js
+++ b/bin/Release/AppX/www/js/init.js
@@ -32,11 +32,15 @@ params['cssTheme'] = getCookie('cssTheme') || 'light'; //Set default to 'light'
params['cssUITheme'] = getCookie('cssUITheme') || 'light'; //Set default to 'light' or 'dark' to use respective themes for UI
params['imageDisplay'] = getCookie('imageDisplay') || true; //Set default to display images from Zim
params['imageDisplay'] = params['imageDisplay'] == "false" ? false : (params['imageDisplay'] == "true" ? true : params['imageDisplay']);
-params['useMathJax'] = params['useMathJax'] || true; //Set default to true to display math formulae with MathJax, false to use fallback SVG images
-params['storedFile'] = getCookie('lastSelectedArchive') || ""; //For packaged Kiwix JS (e.g. with Wikivoyage file), set this to the filename and place file in default storage
+params['useMathJax'] = params['useMathJax'] || true; //Set default to true to display math formulae with MathJax, false to use fallback SVG images only
+params['storedFile'] = getCookie('lastSelectedArchive') || "wikipedia_en_ray_charles_2015-06.zimaa"; //For packaged Kiwix JS (e.g. with Wikivoyage file), set this to the filename (for split files, give the first chunk *.zimaa) and place file(s) in default storage
params['falFileToken'] = params['falFileToken'] || "zimfile";
params['falFolderToken'] = params['falFolderToken'] || "zimfilestore";
-if (params['storedFile'] && Windows && Windows.Storage) { //UWP
+params['localStorage'] = params['localStorage'] || ""; //These will be set programmatically below
+params['pickedFile'] = params['pickeFile'] || "";
+params['pickedFolder'] = params['pickedFolder'] || "";
+
+if (params['storedFile'] && typeof Windows !== 'undefined' && typeof Windows.Storage !== 'undefined') { //UWP
//DEV change "archives" below if you wish to store local archives in a different location in the installation package
Windows.ApplicationModel.Package.current.installedLocation.getFolderAsync("archives").done(function (folder) {
if (folder) params['localStorage'] = folder;
diff --git a/www/js/app.js b/www/js/app.js
index d5907a0e..75e4db70 100644
--- a/www/js/app.js
+++ b/www/js/app.js
@@ -190,15 +190,20 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'abstractFile
});
$('#btnRescanDeviceStorage').on("click", function (e) {
+ document.getElementById('returntoArticle_top').innerHTML = "";
+ document.getElementById('returntoArticle_bottom').innerHTML = "";
+ //Stop app from jumping straight into to first archive if user initiated the scan (to give user a chance to select the archive manually)
+ params['rescan'] = true;
+ //Reload any ZIM files in local storage (whcih the usar can't otherwise select with the filepicker)
if (params['localStorage']) {
scanUWPFolderforArchives(params['localStorage']);
- return;
}
if (storages.length) {
searchForArchivesInStorage();
} else {
displayFileSelect();
- $('archiveFiles').click();
+ //$('archiveFiles').click();
+ $('btnConfigure').click();
}
});
// Bottom bar :
@@ -308,6 +313,20 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'abstractFile
$('#searchingForArticles').hide();
return false;
});
+ // TODO: I've set up two event listeners below because the archive list doesn't "change" if there is only one element in it
+ // See if this can be simplified.... (but note that keyboard users might not click)
+ $('#archiveList').on('change', function () {
+ console.log("***Archive List change event fired")
+ setLocalArchiveFromArchiveList()
+ });
+ $('#archiveList').on('click', function () {
+ console.log("***Archive List click event fired: checking length of options list")
+ var comboArchiveList = document.getElementById('archiveList');
+ if (comboArchiveList.options.length == 1) {
+ console.log("***Only one item, so, fire away...");
+ setLocalArchiveFromArchiveList();
+ }
+ });
$('input:radio[name=contentInjectionMode]').on('change', function (e) {
if (checkWarnServiceWorkerMode(this.value)) {
document.getElementById('returntoArticle_top').innerHTML = "";
@@ -381,7 +400,7 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'abstractFile
document.getElementById('cssUIDarkThemeCheck').checked = params['cssUITheme'] == 'dark' ? true : false;
cssUIThemeSet(params['cssUITheme']);
$('input:radio[name=cssInjectionMode]').filter('[value="' + params['cssSource'] + '"]').prop('checked', true);
- //First run of new version code
+ //Code below triggers display of modal info box if app is run for the first time, or it has been upgraded to new version
if (cookies.getItem('version') != params['version']) {
document.getElementById('myModal').style.display = "block";
document.getElementsByClassName("close")[0].onclick = function () {
@@ -583,7 +602,7 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'abstractFile
populateDropDownListOfArchives(directories);
}
else {
- if (storages.length) {
+ if (storages.length || params['localStorage']) {
searchForArchivesInStorage();
} else {
displayFileSelect();
@@ -602,7 +621,11 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'abstractFile
// If DeviceStorage is available, we look for archives in it
$("#btnConfigure").click();
$('#scanningForArchives').show();
- zimArchiveLoader.scanForArchives(storages, populateDropDownListOfArchives);
+ if (params['localStorage'] && typeof Windows !== 'undefined' && typeof Windows.Storage !== 'undefined') {
+ scanUWPFolderforArchives(params['localStorage']);
+ } else {
+ zimArchiveLoader.scanForArchives(storages, populateDropDownListOfArchives);
+ }
}
if ($.isFunction(navigator.getDeviceStorages)) {
@@ -612,7 +635,8 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'abstractFile
});
}
- if (Windows && Windows.Storage || (storages !== null && storages.length > 0)) {
+ if ((storages !== null && storages.length > 0) ||
+ (typeof Windows !== 'undefined' && typeof Windows.Storage !== 'undefined')) {
// Make a fake first access to device storage, in order to ask the user for confirmation if necessary.
// This way, it is only done once at this moment, instead of being done several times in callbacks
// After that, we can start looking for archives
@@ -682,10 +706,10 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'abstractFile
// Store the list of archives in a cookie, to avoid rescanning at each start
cookies.setItem("listOfArchives", archiveDirectories.join('|'), Infinity);
comboArchiveList.size = comboArchiveList.length;
-
- $('#archiveList').on('change', setLocalArchiveFromArchiveList);
+ //$('#archiveList').on('mouseup', setLocalArchiveFromArchiveList());
+ //$(comboArchiveList).on('click', setLocalArchiveFromArchiveList());
if (comboArchiveList.options.length > 0) {
- var lastSelectedArchive = cookies.getItem("lastSelectedArchive");
+ var lastSelectedArchive = cookies.getItem("lastSelectedArchive") || params['storedFile'];
if (lastSelectedArchive !== null && lastSelectedArchive !== undefined && lastSelectedArchive !== "") {
// Attempt to select the corresponding item in the list, if it exists
if ($("#archiveList option[value='" + lastSelectedArchive + "']").length > 0) {
@@ -780,7 +804,12 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'abstractFile
//archiveDirectory = MSApp.createFileFromStorageFile(file);
selectedArchive = zimArchiveLoader.loadArchiveFromDeviceStorage(selectedStorage, archiveDirectory, function (archive) {
// The archive is set : go back to home page to start searching
- $('#btnHome').click();
+ if (params['rescan']) {
+ $('#btnConfigure').click()
+ params['rescan'] = false;
+ } else {
+ $('#btnHome').click();
+ }
});
} else {
console.error("The picked file could not be found in the selected folder!");
@@ -816,11 +845,16 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'abstractFile
*/
function displayFileSelect() {
$('#openLocalFiles').show();
- var comboArchiveList = document.getElementById('archiveList');
- if (comboArchiveList.length > 0) { comboArchiveList.size = comboArchiveList.length; }
- //$('#archiveFile').on('change', setLocalArchiveFromFileSelect);
- $('#archiveFile').on('click', pickFileUWP); //UWP FilePicker [kiwix-js-windows #3]
- $('#archiveFiles').on('click', pickFolderUWP); //UWP FolderPicker
+ //TODO - check if this is necessary or if it causes the archiveList change event to fire
+ //Make archive list combo box fit the number of files
+ //var comboArchiveList = document.getElementById('archiveList');
+ //if (comboArchiveList.length > 0) { comboArchiveList.size = comboArchiveList.length; }
+ if (typeof Windows !== 'undefined' && typeof Windows.Storage !== 'undefined') {
+ $('#archiveFile').on('click', pickFileUWP); //UWP FilePicker [kiwix-js-windows #3]
+ $('#archiveFiles').on('click', pickFolderUWP); //UWP FolderPicker
+ } else {
+ $('#archiveFile').on('change', setLocalArchiveFromFileSelect);
+ }
}
function pickFileUWP() { //Support UWP FilePicker [kiwix-js-windows #3]
@@ -850,11 +884,15 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'abstractFile
folderPicker.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.downloads;
folderPicker.fileTypeFilter.replaceAll([".zim", ".dat", ".idx", ".txt", ".zimaa"]);
- folderPicker.pickSingleFolderAsync().then(scanUWPFolderForArchives(folder));
+ folderPicker.pickSingleFolderAsync().done(function (folder) {
+ if (folder) {
+ scanUWPFolderforArchives(folder);
+ }
+ });
}
function scanUWPFolderforArchives (folder) {
- if (folder) {
+ if (folder) {
// Application now has read/write access to all contents in the picked folder (including sub-folder contents)
// Cache folder so the contents can be accessed at a later time
Windows.Storage.AccessCache.StorageApplicationPermissions.futureAccessList.addOrReplace(params['falFolderToken'], folder);
@@ -862,7 +900,7 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'abstractFile
// Query the folder.
var query = folder.createFileQuery();
query.getFilesAsync().done(function (files) {
- // Display file list with storage provider and availability.
+ // Display file list
var archiveDisplay = document.getElementById('chooseArchiveFromLocalStorage');
if (!files) {
archiveDisplay.style.display = "inline";
diff --git a/www/js/init.js b/www/js/init.js
index 7328adfd..21626ff9 100644
--- a/www/js/init.js
+++ b/www/js/init.js
@@ -32,11 +32,15 @@ params['cssTheme'] = getCookie('cssTheme') || 'light'; //Set default to 'light'
params['cssUITheme'] = getCookie('cssUITheme') || 'light'; //Set default to 'light' or 'dark' to use respective themes for UI
params['imageDisplay'] = getCookie('imageDisplay') || true; //Set default to display images from Zim
params['imageDisplay'] = params['imageDisplay'] == "false" ? false : (params['imageDisplay'] == "true" ? true : params['imageDisplay']);
-params['useMathJax'] = params['useMathJax'] || true; //Set default to true to display math formulae with MathJax, false to use fallback SVG images
-params['storedFile'] = getCookie('lastSelectedArchive') || ""; //For packaged Kiwix JS (e.g. with Wikivoyage file), set this to the filename and place file in default storage
+params['useMathJax'] = params['useMathJax'] || true; //Set default to true to display math formulae with MathJax, false to use fallback SVG images only
+params['storedFile'] = getCookie('lastSelectedArchive') || "wikipedia_en_ray_charles_2015-06.zimaa"; //For packaged Kiwix JS (e.g. with Wikivoyage file), set this to the filename (for split files, give the first chunk *.zimaa) and place file(s) in default storage
params['falFileToken'] = params['falFileToken'] || "zimfile";
params['falFolderToken'] = params['falFolderToken'] || "zimfilestore";
-if (params['storedFile'] && Windows && Windows.Storage) { //UWP
+params['localStorage'] = params['localStorage'] || ""; //These will be set programmatically below
+params['pickedFile'] = params['pickeFile'] || "";
+params['pickedFolder'] = params['pickedFolder'] || "";
+
+if (params['storedFile'] && typeof Windows !== 'undefined' && typeof Windows.Storage !== 'undefined') { //UWP
//DEV change "archives" below if you wish to store local archives in a different location in the installation package
Windows.ApplicationModel.Package.current.installedLocation.getFolderAsync("archives").done(function (folder) {
if (folder) params['localStorage'] = folder;