Fix Linux Desktop Application (#491)

* Use separate functions for adding files and folders to configuration for indexing
* Add a loading bar while data is syncing
* Bump the minor version for the application
This commit is contained in:
sabaimran
2023-10-03 11:43:19 -07:00
committed by GitHub
parent 63b3696af0
commit 3f962a55c3
6 changed files with 70 additions and 16 deletions

View File

@@ -48,6 +48,12 @@
<div class="card-description-row"> <div class="card-description-row">
<div id="current-files"></div> <div id="current-files"></div>
</div> </div>
<div class="card-action-row">
<button id="update-file" class="card-button">
Add
<img class="add-files-icon" src="./assets/icons/circular-add.svg" alt="Add">
</button>
</div>
<div class="card-title-row"> <div class="card-title-row">
<img class="card-icon" src="./assets/icons/folder.svg" alt="Folder"> <img class="card-icon" src="./assets/icons/folder.svg" alt="Folder">
<h3 class="card-title"> <h3 class="card-title">
@@ -61,7 +67,7 @@
<div id="current-folders"></div> <div id="current-folders"></div>
</div> </div>
<div class="card-action-row"> <div class="card-action-row">
<button id="update-data" class="card-button"> <button id="update-folder" class="card-button">
Add Add
<img class="add-files-icon" src="./assets/icons/circular-add.svg" alt="Add"> <img class="add-files-icon" src="./assets/icons/circular-add.svg" alt="Add">
</button> </button>
@@ -73,6 +79,8 @@
<input id="sync-force" type="checkbox" name="sync-force" value="force"> <input id="sync-force" type="checkbox" name="sync-force" value="force">
<label for="sync-force">Force Sync</label> <label for="sync-force">Force Sync</label>
</div> </div>
<div id="loading-bar" style="display: none;">
</div>
<div class="card-description-row"> <div class="card-description-row">
<div id="sync-status"></div> <div id="sync-status"></div>
</div> </div>
@@ -131,6 +139,34 @@
text-align: center; text-align: center;
} }
#loading-bar {
height: 10px;
width: 100%;
background-color: #ddd;
position: relative;
overflow: hidden;
}
#loading-bar:before {
content: "";
display: block;
position: absolute;
left: -200px;
width: 200px;
height: 100%;
background-color: #2980b9;
animation: loading-bar 2s linear infinite;
}
@keyframes loading-bar {
0% {
left: -200px;
}
100% {
left: 100%;
}
}
#khoj-host-url { #khoj-host-url {
padding: 4px; padding: 4px;
box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.2); box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.2);

View File

@@ -193,8 +193,13 @@ function pushDataToKhoj (regenerate = false) {
pushDataToKhoj(); pushDataToKhoj();
async function handleFileOpen (event, key) { async function handleFileOpen (type) {
const { canceled, filePaths } = await dialog.showOpenDialog({properties: ['openFile', 'openDirectory'], filters: [{ name: "Valid Khoj Files", extensions: validFileTypes}] }); let { canceled, filePaths } = {canceled: true, filePaths: []};
if (type === 'file') {
({ canceled, filePaths } = await dialog.showOpenDialog({properties: ['openFile' ], filters: [{ name: "Valid Khoj Files", extensions: validFileTypes}] }));
} else if (type === 'folder') {
({ canceled, filePaths } = await dialog.showOpenDialog({properties: ['openDirectory' ]}));
}
if (!canceled) { if (!canceled) {
const files = store.get('files') || []; const files = store.get('files') || [];
const folders = store.get('folders') || []; const folders = store.get('folders') || [];
@@ -310,7 +315,9 @@ const createWindow = () => {
app.whenReady().then(() => { app.whenReady().then(() => {
ipcMain.on('set-title', handleSetTitle); ipcMain.on('set-title', handleSetTitle);
ipcMain.handle('getStoreValue', handleFileOpen); ipcMain.handle('handleFileOpen', (event, type) => {
return handleFileOpen(type);
});
ipcMain.on('update-state', (event, arg) => { ipcMain.on('update-state', (event, arg) => {
console.log(arg); console.log(arg);

View File

@@ -2,7 +2,7 @@
"name": "Khoj", "name": "Khoj",
"homepage": ".", "homepage": ".",
"productName": "Khoj", "productName": "Khoj",
"version": "1.0.0", "version": "1.0.1",
"description": "Scaffolding for the desktop entrypoint to Khoj", "description": "Scaffolding for the desktop entrypoint to Khoj",
"main": "main.js", "main": "main.js",
"repository": "\"https://github.com/khoj-ai/khoj\"", "repository": "\"https://github.com/khoj-ai/khoj\"",
@@ -10,7 +10,7 @@
"license": "MIT", "license": "MIT",
"private": false, "private": false,
"devDependencies": { "devDependencies": {
"electron": "26.1.0" "electron": "25.0.0"
}, },
"scripts": { "scripts": {
"start": "yarn electron ." "start": "yarn electron ."

View File

@@ -16,7 +16,7 @@ contextBridge.exposeInMainWorld('electronAPI', {
}) })
contextBridge.exposeInMainWorld('storeValueAPI', { contextBridge.exposeInMainWorld('storeValueAPI', {
getStoreValue: (key) => ipcRenderer.invoke('getStoreValue', key) handleFileOpen: (key) => ipcRenderer.invoke('handleFileOpen', key)
}) })
contextBridge.exposeInMainWorld('getFilesAPI', { contextBridge.exposeInMainWorld('getFilesAPI', {

View File

@@ -1,5 +1,7 @@
const getButton = document.getElementById('update-data') const setFolderButton = document.getElementById('update-folder');
const setFileButton = document.getElementById('update-file');
const showKey = document.getElementById('show-key'); const showKey = document.getElementById('show-key');
const loadingBar = document.getElementById('loading-bar');
async function removeFile(filePath) { async function removeFile(filePath) {
const updatedFiles = await window.removeFileAPI.removeFile(filePath); const updatedFiles = await window.removeFileAPI.removeFile(filePath);
@@ -115,9 +117,16 @@ function makeFolderElement(folder) {
} }
})(); })();
getButton.addEventListener('click', async () => { setFolderButton.addEventListener('click', async () => {
const key = 'foo'; await handleFileOpen('folder');
const value = await window.storeValueAPI.getStoreValue(key); });
setFileButton.addEventListener('click', async () => {
await handleFileOpen('file');
});
async function handleFileOpen(type) {
const value = await window.storeValueAPI.handleFileOpen(type);
console.log(value); console.log(value);
let currentFilesElement = document.getElementById("current-files"); let currentFilesElement = document.getElementById("current-files");
let currentFoldersElement = document.getElementById("current-folders"); let currentFoldersElement = document.getElementById("current-folders");
@@ -137,10 +146,11 @@ getButton.addEventListener('click', async () => {
currentFoldersElement.appendChild(folderElement); currentFoldersElement.appendChild(folderElement);
}); });
} }
}); }
window.updateStateAPI.onUpdateState((event, state) => { window.updateStateAPI.onUpdateState((event, state) => {
console.log("state was updated", state); console.log("state was updated", state);
loadingBar.style.display = 'none';
let syncStatusElement = document.getElementById("sync-status"); let syncStatusElement = document.getElementById("sync-status");
const currentTime = new Date(); const currentTime = new Date();
if (state.completed == false) { if (state.completed == false) {
@@ -174,6 +184,7 @@ urlInput.addEventListener('blur', async () => {
const syncButton = document.getElementById('sync-data'); const syncButton = document.getElementById('sync-data');
const syncForceToggle = document.getElementById('sync-force'); const syncForceToggle = document.getElementById('sync-force');
syncButton.addEventListener('click', async () => { syncButton.addEventListener('click', async () => {
loadingBar.style.display = 'block';
const regenerate = syncForceToggle.checked; const regenerate = syncForceToggle.checked;
await window.syncDataAPI.syncData(regenerate); await window.syncDataAPI.syncData(regenerate);
}); });

View File

@@ -379,10 +379,10 @@ electron-updater@^4.6.1:
lodash.isequal "^4.5.0" lodash.isequal "^4.5.0"
semver "^7.3.5" semver "^7.3.5"
electron@^26.1.0: electron@25.0.0:
version "26.1.0" version "25.0.0"
resolved "https://registry.yarnpkg.com/electron/-/electron-26.1.0.tgz#d26fefba5a5c68069b07a117d87aee1c4e5d172d" resolved "https://registry.yarnpkg.com/electron/-/electron-25.0.0.tgz#3c7cb7e74a271ebc183acaeefc4dd09f2eb079e5"
integrity sha512-qEh19H09Pysn3ibms5nZ0haIh5pFoOd7/5Ww7gzmAwDQOulRi8Sa2naeueOyIb1GKpf+6L4ix3iceYRAuA5r5Q== integrity sha512-8Bjlpw52XW447RKjYGaaizWI4x0dv4gATNn7ssuonySbDgeJNqUnIJQGBrpXyB3VUROVmhXnTWB9VWRzv6uVlA==
dependencies: dependencies:
"@electron/get" "^2.0.0" "@electron/get" "^2.0.0"
"@types/node" "^18.11.18" "@types/node" "^18.11.18"