mirror of
https://github.com/kiwix/kiwix-js-pwa.git
synced 2025-09-10 04:40:27 -04:00
Support launching the app by double-clicking a ZIM file
Former-commit-id: b07e3d58e362ec2baa7e8262de2404556e171dbd [formerly f614418a5441c37936fe9120553832c279051fe0] Former-commit-id: e0d95ddb74db1b61db34f4e07af1073b9b944188
This commit is contained in:
parent
40a7e11f12
commit
ead488d826
@ -36,7 +36,7 @@
|
|||||||
</uap:VisualElements>
|
</uap:VisualElements>
|
||||||
<Extensions>
|
<Extensions>
|
||||||
<uap:Extension Category="windows.fileTypeAssociation">
|
<uap:Extension Category="windows.fileTypeAssociation">
|
||||||
<uap:FileTypeAssociation Name="zimarchive">
|
<uap:FileTypeAssociation Name="zimarchive" DesiredView="default">
|
||||||
<uap:DisplayName>ZIM Archive</uap:DisplayName>
|
<uap:DisplayName>ZIM Archive</uap:DisplayName>
|
||||||
<uap:InfoTip>Compressed ZIM FIle Archive</uap:InfoTip>
|
<uap:InfoTip>Compressed ZIM FIle Archive</uap:InfoTip>
|
||||||
<uap:SupportedFileTypes>
|
<uap:SupportedFileTypes>
|
||||||
|
@ -37,6 +37,18 @@
|
|||||||
<!-- Bootstrap -->
|
<!-- Bootstrap -->
|
||||||
<link href="css/bootstrap.min.css" rel="stylesheet" media="screen" />
|
<link href="css/bootstrap.min.css" rel="stylesheet" media="screen" />
|
||||||
<!-- link href="css/bootstrap-theme.min.css" rel="stylesheet" media="screen" /-->
|
<!-- link href="css/bootstrap-theme.min.css" rel="stylesheet" media="screen" /-->
|
||||||
|
<script type="text/javascript">
|
||||||
|
// This script is needed to retrieve launch arguments when the app is started by double-clicking on a file
|
||||||
|
var launchArguments = null;
|
||||||
|
if (typeof Windows !== 'undefined' && Windows.UI && Windows.UI.WebUI && Windows.UI.WebUI.WebUIApplication) {
|
||||||
|
Windows.UI.WebUI.WebUIApplication.addEventListener('activated', function (eventArgs) {
|
||||||
|
if (eventArgs.kind === Windows.ApplicationModel.Activation.ActivationKind.file) {
|
||||||
|
console.log("App was activated with a file: " + eventArgs.files[0].name);
|
||||||
|
launchArguments = eventArgs;
|
||||||
|
}
|
||||||
|
}, false);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
</head>
|
</head>
|
||||||
<body role="application" class="dark">
|
<body role="application" class="dark">
|
||||||
<!-- Modal info -->
|
<!-- Modal info -->
|
||||||
@ -409,7 +421,7 @@
|
|||||||
<div id="openLocalFiles" style="display: block;">
|
<div id="openLocalFiles" style="display: block;">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-6">
|
<div class="col-xs-6">
|
||||||
<input type="button" class="btn btn-primary" value="Select archive" id="archiveFile" accept=".zim" />
|
<input type="button" class="btn btn-primary" value="Select file" id="archiveFile" accept=".zim" />
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xs-6">
|
<div class="col-xs-6">
|
||||||
<input type="button" class="btn btn-primary" value="Select folder" id="archiveFiles" accept=".zim,.dat,.idx,.txt,.zimaa,.zimab,.zimac,.zimad,.zimae,.zimaf,.zimag,.zimah,.zimai,.zimaj,.zimak,.zimal,.zimam,.ziman,.zimao,.zimap,.zimaq,.zimar,.zimas,.zimat,.zimau,.zimav,.zimaw,.zimax,.zimay,.zimaz, .zimba, .zimbb, .zimbc, .zimbd, .zimbe, .zimbf, .zimbg, .zimbh, .zimbi, .zimbj, .zimbk, .zimbl, .zimbm, .zimbn, .zimbo, .zimbp, .zimbq, .zimbr, .zimbs, .zimbt, .zimbu, .zimbv, .zimbw, .zimbx, .zimby, .zimbz" />
|
<input type="button" class="btn btn-primary" value="Select folder" id="archiveFiles" accept=".zim,.dat,.idx,.txt,.zimaa,.zimab,.zimac,.zimad,.zimae,.zimaf,.zimag,.zimah,.zimai,.zimaj,.zimak,.zimal,.zimam,.ziman,.zimao,.zimap,.zimaq,.zimar,.zimas,.zimat,.zimau,.zimav,.zimaw,.zimax,.zimay,.zimaz, .zimba, .zimbb, .zimbc, .zimbd, .zimbe, .zimbf, .zimbg, .zimbh, .zimbi, .zimbj, .zimbk, .zimbl, .zimbm, .zimbn, .zimbo, .zimbp, .zimbq, .zimbr, .zimbs, .zimbt, .zimbu, .zimbv, .zimbw, .zimbx, .zimby, .zimbz" />
|
||||||
|
@ -666,27 +666,29 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'q', 'module'
|
|||||||
document.getElementById('scrollbox').style.height = document.documentElement.clientHeight + "px";
|
document.getElementById('scrollbox').style.height = document.documentElement.clientHeight + "px";
|
||||||
document.getElementById('search-article').style.overflowY = "auto";
|
document.getElementById('search-article').style.overflowY = "auto";
|
||||||
});
|
});
|
||||||
// TODO: I've set up two event listeners below because the archive list doesn't "change" if there is only one element in it
|
// Two event listeners are needed 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)
|
// (also note that keyboard users might not click)
|
||||||
|
var selectFired = false;
|
||||||
document.getElementById('archiveList').addEventListener('change', function () {
|
document.getElementById('archiveList').addEventListener('change', function () {
|
||||||
console.log("***Archive List change event fired");
|
this.click();
|
||||||
$('#openLocalFiles').hide();
|
|
||||||
setLocalArchiveFromArchiveList();
|
|
||||||
});
|
});
|
||||||
document.getElementById('archiveList').addEventListener('click', function () {
|
document.getElementById('archiveList').addEventListener('click', function () {
|
||||||
console.log("***Archive List click event fired: ***WHY***??? checking length of options list...");
|
if (selectFired) return;
|
||||||
//Doh, why are you testing for this? Surely you want to jump to the file if it's been clicked on? There was a reason @REMIND_ME....
|
selectFired = true;
|
||||||
//var comboArchiveList = document.getElementById('archiveList');
|
|
||||||
//if (comboArchiveList.options.length == 1) {
|
|
||||||
//console.log("***Only one item, so, fire away...");
|
|
||||||
$('#openLocalFiles').hide();
|
$('#openLocalFiles').hide();
|
||||||
|
// Void any previous picked file to prevent it launching
|
||||||
|
if (params.pickedFile && params.pickedFile.name !== this.options[this.selectedIndex].value) {
|
||||||
|
params.pickedFile = '';
|
||||||
|
}
|
||||||
setLocalArchiveFromArchiveList();
|
setLocalArchiveFromArchiveList();
|
||||||
//}
|
setTimeout(function () {
|
||||||
|
selectFired = false;
|
||||||
|
}, 0);
|
||||||
});
|
});
|
||||||
|
|
||||||
document.getElementById('archiveFile').addEventListener('click', function () {
|
document.getElementById('archiveFile').addEventListener('click', function () {
|
||||||
if (typeof Windows !== 'undefined' && typeof Windows.Storage !== 'undefined') {
|
if (typeof Windows !== 'undefined' && typeof Windows.Storage !== 'undefined') {
|
||||||
//UWP FilePicker [kiwix-js-windows #3]
|
//UWP FilePicker
|
||||||
pickFileUWP();
|
pickFileUWP();
|
||||||
} else {
|
} else {
|
||||||
//@TODO enable and provide classic filepicker
|
//@TODO enable and provide classic filepicker
|
||||||
@ -1254,7 +1256,7 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'q', 'module'
|
|||||||
* @type Array.<StorageFirefoxOS>
|
* @type Array.<StorageFirefoxOS>
|
||||||
*/
|
*/
|
||||||
var storages = [];
|
var storages = [];
|
||||||
//var storages = [appFolder.path]; //UWP
|
//var storages = [appFolder.path]; //UWP @UWP
|
||||||
function searchForArchivesInPreferencesOrStorage() {
|
function searchForArchivesInPreferencesOrStorage() {
|
||||||
// First see if the list of archives is stored in the cookie
|
// First see if the list of archives is stored in the cookie
|
||||||
var listOfArchivesFromCookie = cookies.getItem("listOfArchives");
|
var listOfArchivesFromCookie = cookies.getItem("listOfArchives");
|
||||||
@ -1301,8 +1303,11 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'q', 'module'
|
|||||||
// This way, it is only done once at this moment, instead of being done several times in callbacks
|
// 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
|
// After that, we can start looking for archives
|
||||||
//storages[0].get("fake-file-to-read").then(searchForArchivesInPreferencesOrStorage,
|
//storages[0].get("fake-file-to-read").then(searchForArchivesInPreferencesOrStorage,
|
||||||
//searchForArchivesInPreferencesOrStorage);
|
if (!params.pickedFile) {
|
||||||
searchForArchivesInPreferencesOrStorage();
|
searchForArchivesInPreferencesOrStorage();
|
||||||
|
} else {
|
||||||
|
processPickedFileUWP(params.pickedFile);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// If DeviceStorage is not available, we display the file select components
|
// If DeviceStorage is not available, we display the file select components
|
||||||
displayFileSelect();
|
displayFileSelect();
|
||||||
@ -1443,7 +1448,7 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'q', 'module'
|
|||||||
selectedStorage = storages[0];
|
selectedStorage = storages[0];
|
||||||
} else { //IT'S NOT FREAKIN FFOS!!!!!!!!!!
|
} else { //IT'S NOT FREAKIN FFOS!!!!!!!!!!
|
||||||
//Patched for UWP support:
|
//Patched for UWP support:
|
||||||
if (params.pickedFolder && typeof Windows !== 'undefined' && typeof Windows.Storage !== 'undefined') {
|
if (!params.pickedFile && params.pickedFolder && typeof MSApp !== 'undefined') {
|
||||||
var query = params.pickedFolder.createFileQuery();
|
var query = params.pickedFolder.createFileQuery();
|
||||||
query.getFilesAsync().done(function (files) {
|
query.getFilesAsync().done(function (files) {
|
||||||
var file;
|
var file;
|
||||||
@ -1538,7 +1543,7 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'q', 'module'
|
|||||||
*/
|
*/
|
||||||
function displayFileSelect() {
|
function displayFileSelect() {
|
||||||
document.getElementById('openLocalFiles').style.display = 'block';
|
document.getElementById('openLocalFiles').style.display = 'block';
|
||||||
document.getElementById('archiveFiles').addEventListener('change', setLocalArchiveFromFileSelect);
|
document.getElementById('rescanStorage').style.display = 'none';
|
||||||
}
|
}
|
||||||
// Make the whole app a drop zone
|
// Make the whole app a drop zone
|
||||||
var dropZone = document.getElementById('search-article');
|
var dropZone = document.getElementById('search-article');
|
||||||
@ -1547,7 +1552,10 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'q', 'module'
|
|||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
e.dataTransfer.dropEffect = 'copy';
|
e.dataTransfer.dropEffect = 'copy';
|
||||||
}, false);
|
}, false);
|
||||||
dropZone.addEventListener('drop', setLocalArchiveFromFileList);
|
dropZone.addEventListener('drop', function(files) {
|
||||||
|
params.rescan = false;
|
||||||
|
setLocalArchiveFromFileList(files);
|
||||||
|
});
|
||||||
|
|
||||||
function pickFileUWP() { //Support UWP FilePicker [kiwix-js-windows #3]
|
function pickFileUWP() { //Support UWP FilePicker [kiwix-js-windows #3]
|
||||||
// Create the picker object and set options
|
// Create the picker object and set options
|
||||||
@ -1555,13 +1563,15 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'q', 'module'
|
|||||||
filePicker.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.downloads;
|
filePicker.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.downloads;
|
||||||
// Filter folder contents
|
// Filter folder contents
|
||||||
filePicker.fileTypeFilter.replaceAll([".zim"]);
|
filePicker.fileTypeFilter.replaceAll([".zim"]);
|
||||||
|
filePicker.pickSingleFileAsync().then(processPickedFileUWP);
|
||||||
|
}
|
||||||
|
|
||||||
filePicker.pickSingleFileAsync().then(function (file) {
|
function processPickedFileUWP(file) {
|
||||||
if (file) {
|
if (file) {
|
||||||
// Cache file so the contents can be accessed at a later time
|
// Cache file so the contents can be accessed at a later time
|
||||||
Windows.Storage.AccessCache.StorageApplicationPermissions.futureAccessList.addOrReplace(params.falFileToken, file);
|
Windows.Storage.AccessCache.StorageApplicationPermissions.futureAccessList.addOrReplace(params.falFileToken, file);
|
||||||
params.pickedFile = file;
|
params.pickedFile = file;
|
||||||
Windows.Storage.AccessCache.StorageApplicationPermissions.futureAccessList.remove(params.falFolderToken);
|
if (params.pickedFolder) Windows.Storage.AccessCache.StorageApplicationPermissions.futureAccessList.remove(params.falFolderToken);
|
||||||
params.pickedFolder = "";
|
params.pickedFolder = "";
|
||||||
cookies.setItem("lastSelectedArchive", file.name, Infinity);
|
cookies.setItem("lastSelectedArchive", file.name, Infinity);
|
||||||
params.storedFile = file.name;
|
params.storedFile = file.name;
|
||||||
@ -1573,7 +1583,6 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'q', 'module'
|
|||||||
// The picker was dismissed with no selected file
|
// The picker was dismissed with no selected file
|
||||||
console.log("User closed folder picker without picking a file");
|
console.log("User closed folder picker without picking a file");
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function pickFolderUWP() { //Support UWP FilePicker [kiwix-js-windows #3]
|
function pickFolderUWP() { //Support UWP FilePicker [kiwix-js-windows #3]
|
||||||
@ -1646,6 +1655,9 @@ define(['jquery', 'zimArchiveLoader', 'util', 'uiUtil', 'cookies', 'q', 'module'
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// If the file name is already in the archive list, try to select it in the list
|
||||||
|
var listOfArchives = document.getElementById('archiveList');
|
||||||
|
if (listOfArchives) listOfArchives.value = files[0].name;
|
||||||
// Reset the cssDirEntryCache and cssBlobCache. Must be done when archive changes.
|
// Reset the cssDirEntryCache and cssBlobCache. Must be done when archive changes.
|
||||||
if (cssBlobCache)
|
if (cssBlobCache)
|
||||||
cssBlobCache = new Map();
|
cssBlobCache = new Map();
|
||||||
|
@ -58,10 +58,11 @@ params['omegaChar'] = getCookie('omegaChar') || 'Z'; //Set default end of alphab
|
|||||||
|
|
||||||
//Do not touch these values unless you know what they do! Some are global variables, some are set programmatically
|
//Do not touch these values unless you know what they do! Some are global variables, some are set programmatically
|
||||||
params['storedFile'] = getCookie('lastSelectedArchive') || params['packagedFile'];
|
params['storedFile'] = getCookie('lastSelectedArchive') || params['packagedFile'];
|
||||||
|
params.storedFile = launchArguments ? launchArguments.files[0].name : params.storedFile;
|
||||||
params['falFileToken'] = params['falFileToken'] || "zimfile"; //UWP support
|
params['falFileToken'] = params['falFileToken'] || "zimfile"; //UWP support
|
||||||
params['falFolderToken'] = params['falFolderToken'] || "zimfilestore"; //UWP support
|
params['falFolderToken'] = params['falFolderToken'] || "zimfilestore"; //UWP support
|
||||||
params['localStorage'] = params['localStorage'] || "";
|
params['localStorage'] = params['localStorage'] || "";
|
||||||
params['pickedFile'] = params['pickeFile'] || "";
|
params['pickedFile'] = launchArguments ? launchArguments.files[0] : "";
|
||||||
params['pickedFolder'] = params['pickedFolder'] || "";
|
params['pickedFolder'] = params['pickedFolder'] || "";
|
||||||
params['lastPageVisit'] = getCookie('lastPageVisit') || "";
|
params['lastPageVisit'] = getCookie('lastPageVisit') || "";
|
||||||
params['lastPageVisit'] = params['lastPageVisit'] ? decodeURIComponent(params['lastPageVisit']) : "";
|
params['lastPageVisit'] = params['lastPageVisit'] ? decodeURIComponent(params['lastPageVisit']) : "";
|
||||||
@ -124,13 +125,6 @@ if (params.storedFile && typeof Windows !== 'undefined' && typeof Windows.Storag
|
|||||||
console.error("This app doesn't appear to have access to local storage!");
|
console.error("This app doesn't appear to have access to local storage!");
|
||||||
});
|
});
|
||||||
var futureAccessList = Windows.Storage.AccessCache.StorageApplicationPermissions.futureAccessList;
|
var futureAccessList = Windows.Storage.AccessCache.StorageApplicationPermissions.futureAccessList;
|
||||||
if (futureAccessList.containsItem(params.falFileToken)) {
|
|
||||||
futureAccessList.getFileAsync(params.falFileToken).done(function (file) {
|
|
||||||
if (file) params.pickedFile = file;
|
|
||||||
}, function (err) {
|
|
||||||
console.error("The previously picked file is no longer accessible: " + err.message);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (futureAccessList.containsItem(params.falFolderToken)) {
|
if (futureAccessList.containsItem(params.falFolderToken)) {
|
||||||
futureAccessList.getFolderAsync(params.falFolderToken).then(function (folder) {
|
futureAccessList.getFolderAsync(params.falFolderToken).then(function (folder) {
|
||||||
if (folder) params.pickedFolder = folder;
|
if (folder) params.pickedFolder = folder;
|
||||||
@ -138,8 +132,22 @@ if (params.storedFile && typeof Windows !== 'undefined' && typeof Windows.Storag
|
|||||||
console.error("The previously picked folder is no longer accessible: " + err.message);
|
console.error("The previously picked folder is no longer accessible: " + err.message);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
//If we don't already have a picked file (e.g. by launching app with click on a ZIM file), then retrieve it from futureAccessList if possible
|
||||||
|
var listOfArchives = getCookie('listOfArchives');
|
||||||
|
// But don't get the picked file if we already have access to the folder and the file is in it!
|
||||||
|
if (listOfArchives && ~listOfArchives.indexOf(params.storedFile) && params.pickedFolder) {
|
||||||
|
params.pickedFile = '';
|
||||||
|
} else {
|
||||||
|
if (!params.pickedFile && futureAccessList.containsItem(params.falFileToken)) {
|
||||||
|
params.pickedFile = '';
|
||||||
|
futureAccessList.getFileAsync(params.falFileToken).done(function (file) {
|
||||||
|
if (file && file.name === params.storedFile) params.pickedFile = file;
|
||||||
|
}, function (err) {
|
||||||
|
console.error("The previously picked file is no longer accessible: " + err.message);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function getCookie(name) {
|
function getCookie(name) {
|
||||||
var regexp = new RegExp('(?:^|;)\\s*' + name + '=([^;]+)(?:;|$)');
|
var regexp = new RegExp('(?:^|;)\\s*' + name + '=([^;]+)(?:;|$)');
|
||||||
|
Loading…
x
Reference in New Issue
Block a user