236 lines
No EOL
4.4 KiB
JavaScript
236 lines
No EOL
4.4 KiB
JavaScript
import { StorageManager } from "../../storage/storageManager.js";
|
|
import { VirtualFolderLink } from "../folder/virtualFolderLink.js";
|
|
import { loadDefaultData } from "./defaultData.js";
|
|
import { VirtualFile } from "../file/virtualFile.js";
|
|
import { VirtualFolder } from "../folder/virtualFolder.js";
|
|
|
|
/**
|
|
* A virtual folder that serves as the root folder
|
|
*/
|
|
export class VirtualRoot extends VirtualFolder {
|
|
/** @type {boolean} */
|
|
initiated = false;
|
|
|
|
/** @type {boolean} */
|
|
loadedDefaultData = false;
|
|
|
|
constructor() {
|
|
super("root");
|
|
this.root = this;
|
|
this.isRoot = true;
|
|
this.shortcuts = {};
|
|
}
|
|
|
|
loadDefaultData() {
|
|
loadDefaultData(this);
|
|
}
|
|
|
|
loadData() {
|
|
const data = StorageManager.load("data");
|
|
if (data == null)
|
|
return;
|
|
|
|
let object;
|
|
try {
|
|
object = JSON.parse(data);
|
|
} catch (error) {
|
|
console.error(error);
|
|
}
|
|
if (object == null)
|
|
return;
|
|
|
|
const shortcuts = { ...object.scs };
|
|
|
|
const addFile = ({
|
|
nam: name,
|
|
ext: extension,
|
|
src: source,
|
|
cnt: content,
|
|
lnk: link,
|
|
ico: iconUrl,
|
|
}, parent = this) => {
|
|
if (link) {
|
|
parent.createFileLink(name, (fileLink) => {
|
|
fileLink.setLinkedPath(link);
|
|
if (iconUrl != null) {
|
|
fileLink.setIconUrl(iconUrl);
|
|
}
|
|
});
|
|
return;
|
|
}
|
|
|
|
parent.createFile(name, extension, (file) => {
|
|
if (source != null) {
|
|
file.setSource(source);
|
|
} else if (content != null) {
|
|
file.setContent(content);
|
|
}
|
|
if (iconUrl != null) {
|
|
file.setIconUrl(iconUrl);
|
|
}
|
|
});
|
|
};
|
|
|
|
const addFolder = ({
|
|
nam: name,
|
|
fds: folders,
|
|
fls: files,
|
|
lnk: link,
|
|
ico: iconUrl,
|
|
}, parent = this) => {
|
|
if (link) {
|
|
parent.createFolderLink(name, (folderLink) => {
|
|
folderLink.setLinkedPath(link);
|
|
if (iconUrl != null) {
|
|
folderLink.setIconUrl(iconUrl);
|
|
}
|
|
});
|
|
return;
|
|
}
|
|
|
|
parent.createFolder(name, (folder) => {
|
|
if (Object.values(shortcuts).includes(folder.displayPath)) {
|
|
let alias;
|
|
for (const [key, value] of Object.entries(shortcuts)) {
|
|
if (value === folder.displayPath)
|
|
alias = key;
|
|
}
|
|
folder.setAlias(alias);
|
|
}
|
|
if (folders != null) {
|
|
folders.forEach((subFolder) => {
|
|
addFolder(subFolder, folder);
|
|
});
|
|
}
|
|
if (files != null) {
|
|
files.forEach((file) => {
|
|
addFile(file, folder);
|
|
});
|
|
}
|
|
if (iconUrl != null) {
|
|
folder.setIconUrl(iconUrl);
|
|
}
|
|
});
|
|
};
|
|
|
|
if (object.fds != null) {
|
|
object.fds.forEach((subFolder) => {
|
|
addFolder(subFolder);
|
|
});
|
|
}
|
|
if (object.fls != null) {
|
|
object.fls.forEach((file) => {
|
|
addFile(file);
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Calls the storage manager's store function with this root's data as a string
|
|
*/
|
|
saveData() {
|
|
if (!this.initiated)
|
|
return;
|
|
|
|
const data = this.toString();
|
|
|
|
if (data == null)
|
|
return;
|
|
|
|
StorageManager.store("data", data);
|
|
}
|
|
|
|
/**
|
|
* Initiates this root by loading the default data and then the user's data on top
|
|
* @returns {VirtualRoot}
|
|
*/
|
|
init() {
|
|
this.initiated = false;
|
|
|
|
// Load default data
|
|
this.loadedDefaultData = false;
|
|
this.setAlias("/");
|
|
this.loadDefaultData();
|
|
this.loadedDefaultData = true;
|
|
|
|
// Load user's data
|
|
this.loadData();
|
|
this.initiated = true;
|
|
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Adds a shortcut to a file or folder
|
|
* @param {string} name
|
|
* @param {VirtualFile | VirtualFolder | VirtualFolderLink} destination
|
|
* @returns {VirtualRoot}
|
|
*/
|
|
addShortcut(name, destination) {
|
|
this.shortcuts[name] = destination;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Tells the storage manager to clear all data and reloads the window
|
|
*/
|
|
reset() {
|
|
if (window.confirm("Are you sure you want to reset all your data?")) {
|
|
StorageManager.clear();
|
|
window.location.reload(false);
|
|
}
|
|
}
|
|
|
|
static isValidName(name) {
|
|
// TO DO
|
|
}
|
|
|
|
static isValidFileName(name) {
|
|
// TO DO
|
|
}
|
|
|
|
static isValidFolderName(name) {
|
|
// TO DO
|
|
}
|
|
|
|
get path() {
|
|
return "";
|
|
}
|
|
|
|
get displayPath() {
|
|
return "/";
|
|
}
|
|
|
|
/**
|
|
* @returns {object | null}
|
|
*/
|
|
toJSON() {
|
|
const object = super.toJSON();
|
|
|
|
if (object == null)
|
|
return null;
|
|
|
|
if (Object.entries(this.shortcuts).length > 0) {
|
|
object.scs = {};
|
|
|
|
for (const [key, value] of Object.entries(this.shortcuts)) {
|
|
if (!value.root)
|
|
object.scs[key] = value.absolutePath;
|
|
}
|
|
}
|
|
|
|
return object;
|
|
}
|
|
|
|
/**
|
|
* @returns {string | null}
|
|
*/
|
|
toString() {
|
|
const json = this.toJSON();
|
|
|
|
if (json == null)
|
|
return null;
|
|
|
|
return JSON.stringify(json);
|
|
}
|
|
} |