Skip to content

Commit

Permalink
Fixed web-based project open and save
Browse files Browse the repository at this point in the history
  • Loading branch information
ajkolenc committed Jan 31, 2025
1 parent da7f095 commit 79f0396
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 36 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ enable_testing()

list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/environment/cmake)

set(AP_BASE_URL "AdaptationPathways" CACHE STRING
set(AP_BASE_URL "PathwaysGenerator" CACHE STRING
"Base url for web app. Use empty string for testing locally."
)

Expand Down
25 changes: 25 additions & 0 deletions source/package/adaptation_pathways/app/service/project_service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import base64

import jsonpickle

from ..model.pathways_project import PathwaysProject


class ProjectService:
@staticmethod
def to_json(project: PathwaysProject) -> str:
text: str = jsonpickle.encode(project)
return text

@staticmethod
def from_json(project_json: str) -> PathwaysProject:
project = jsonpickle.decode(project_json)
return project

@staticmethod
def to_data_url(project: PathwaysProject) -> str:
text = ProjectService.to_json(project)
text_bytes = text.encode("utf-8")
text_64_bytes = base64.b64encode(text_bytes)
text_64_str = text_64_bytes.decode("utf-8")
return f"data:text/plain;base64,{text_64_str}"
34 changes: 28 additions & 6 deletions source/package/pathways_app/assets/js/pathways.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,21 @@
setTimeout(function () {
var oldMessageHandler = pythonWorker.onmessage;
pythonWorker.onmessage = function (message) {
if (message.data == "open_project") {
openFile();
} else {
try {
msgObj = JSON.parse(message.data);
switch (msgObj.action) {
case "open_project":
openFile();
break;
case "save_project":
saveFile(msgObj.content, msgObj.filename);
break;
default:
oldMessageHandler(message);
break;
}
} catch (e) {
console.error(e);
oldMessageHandler(message);
}
};
Expand All @@ -16,11 +28,10 @@ file_open_input.multiple = false;

function openFile() {
file_open_input.onchange = (e) => {
// getting a hold of the file reference
if (e.target.files.length == 0) return;

var file = e.target.files[0];
console.log(file);

// setting up the reader
var reader = new FileReader();
reader.readAsText(file, "UTF-8");

Expand All @@ -37,3 +48,14 @@ function openFile() {

file_open_input.click();
}

var file_download_link = document.createElement("a");

function saveFile(data, filename) {
var blob = new Blob([data], {
type: "text/plain;charset=utf-8",
});
file_download_link.href = URL.createObjectURL(blob);
file_download_link.download = filename;
file_download_link.click();
}
2 changes: 1 addition & 1 deletion source/package/pathways_app/pyproject.toml.in
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ cleanup = false
base_url = "@AP_BASE_URL@"
# renderer = "canvaskit"
# use_color_emoji = false
route_url_strategy = "path"
route_url_strategy = "hash"

[project]
name = "Pathways Generator"
Expand Down
50 changes: 22 additions & 28 deletions source/package/pathways_app/src/pathways_app.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
import base64
import json
from typing import Callable

import flet as ft
import jsonpickle
from pyodide.code import run_js
from src.config import Config
from src.data import create_empty_project

from adaptation_pathways.app.model.pathways_project import PathwaysProject
from adaptation_pathways.app.service.project_service import ProjectService


is_web = True
Expand Down Expand Up @@ -41,10 +39,14 @@ def __init__(self, page: ft.Page):
old_send = flet_js.send

def new_send(data: str):
message = json.loads(data)
message: dict = json.loads(data)
action = message.get("action", None)
if action == "open_project_result":
self.on_project_text_received(message.payload)
project_text = message.get("payload", None)
if project_text is None:
print("Open project failed: no payload received")
else:
self.on_project_text_received(project_text)
else:
old_send(data)

Expand Down Expand Up @@ -82,9 +84,6 @@ def notify_project_info_changed(self):
for listener in self.on_project_info_changed:
listener()

def on_event(self, event):
print(event)

def open_link(self, url: str):
self.page.launch_url(url)

Expand All @@ -95,11 +94,7 @@ def new_project(self):

def open_project(self):
if is_web:
run_js(
"""
self.postMessage('open_project');
"""
)
run_js('self.postMessage(\'{ "action": "open_project" }\');')
else:
self.file_opener.pick_files(
"Choose a Project File",
Expand All @@ -112,34 +107,33 @@ def on_file_opened(self, event: ft.FilePickerResultEvent):
if len(event.files) == 0:
return

print(event.files[0].path)
with open(event.files[0].path, encoding="utf-8") as file:
text = file.read()
file.close()

self.project = jsonpickle.decode(text)
self.project = ProjectService.from_json(text)
self.page.go("/project")
self.notify_project_changed()

def on_project_text_received(self, content: str):
project_dict = json.loads(content)
self.project = PathwaysProject(**project_dict)
self.project = ProjectService.from_json(content)
self.page.go("/project")
self.notify_project_changed()

def save_project(self):
filename = f"{self.project.name}.{Config.project_extension}"

if is_web:
text: str = jsonpickle.encode(self.project)
text_bytes = text.encode("uft-8")
text_64_bytes = base64.b64encode(text_bytes)
text_64_text = text_64_bytes.decode("utf-8")
self.open_link(f"data:text/plain;base64,{text_64_text}")
project_json = ProjectService.to_json(self.project)
# Escapes quotes properly
project_json = json.dumps(project_json)

message_json = f'{{ "action": "save_project", "filename":"{filename}", "content":{project_json} }}'
message_json = json.dumps(message_json)

run_js(f"self.postMessage({message_json});")
else:
print("Saving on desktop")
self.file_saver.save_file(
"Save Pathways Project",
f"{self.project.name}.{Config.project_extension}",
)
self.file_saver.save_file("Save Pathways Project", filename)

def on_file_saved(self, event: ft.FilePickerResultEvent):
if event.path is None:
Expand All @@ -148,7 +142,7 @@ def on_file_saved(self, event: ft.FilePickerResultEvent):

try:
with open(event.path, "w", encoding="utf-8") as file:
text = jsonpickle.encode(self.project)
text = ProjectService.to_json(self.project)
file.write(text)
file.close()
except Exception as error:
Expand Down

0 comments on commit 79f0396

Please sign in to comment.