Skip to content

Commit 847d1a3

Browse files
committed
chore: do not create default project folders in documents if user deleted it
1 parent a7e38ec commit 847d1a3

File tree

6 files changed

+69
-24
lines changed

6 files changed

+69
-24
lines changed

src/assets/new-project/assets/js/code-editor.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,10 @@ function initCodeEditor() {
221221
};
222222
document.getElementById("defaultProjectButton").onclick = function() {
223223
Metrics.countEvent(Metrics.EVENT_TYPE.NEW_PROJECT, "main.Click", "default-project");
224-
openProject(newProjectExtension.getWelcomeProjectPath());
224+
newProjectExtension.setupStartupProject()
225+
.then(()=>{
226+
openProject(newProjectExtension.getWelcomeProjectPath());
227+
}).catch(console.error);
225228
};
226229

227230
const banner = document.getElementById("download-phcode-banner");

src/extensionsIntegrated/Phoenix/default-projects.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,15 @@ define(function (require, exports, module) {
2525
Strings = require("strings"),
2626
ZipUtils = require("utils/ZipUtils");
2727

28-
async function _setupStartupProject() {
28+
async function setupStartupProject(forceCreate) {
2929
console.log("setting up startup project", ProjectManager.getWelcomeProjectPath());
30+
if(!forceCreate){
31+
let exists = await Phoenix.VFS.existsAsync(ProjectManager.getWelcomeProjectPath());
32+
if(exists){
33+
console.log("Startup project already exists, using", ProjectManager.getWelcomeProjectPath());
34+
return;
35+
}
36+
}
3037
await ZipUtils.unzipURLToLocation('assets/default-project/en.zip', ProjectManager.getWelcomeProjectPath());
3138
const indexHtmlPath = `${ProjectManager.getWelcomeProjectPath()}index.html`;
3239
fs.readFile(indexHtmlPath, 'utf8', function (err, text) {
@@ -55,10 +62,11 @@ define(function (require, exports, module) {
5562
}
5663

5764
exports.setupExploreProject = setupExploreProject;
65+
exports.setupStartupProject = setupStartupProject;
5866

5967
exports.init = async function () {
6068
if(Phoenix.firstBoot){
61-
_setupStartupProject();
69+
setupStartupProject(true);
6270
}
6371
if(!Phoenix.isNativeApp) {
6472
// in browsers, we do this as the user wont see the explore project in documents folder anyway and will

src/extensionsIntegrated/Phoenix/new-project.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ define(function (require, exports, module) {
5959
if(window.testEnvironment){
6060
return;
6161
}
62+
if(newProjectDialogueObj && newProjectDialogueObj.isVisible()){
63+
return;
64+
}
6265
let templateVars = {
6366
Strings: Strings,
6467
newProjectURL: `${window.Phoenix.baseURL}assets/new-project/code-editor.html`
@@ -118,6 +121,14 @@ define(function (require, exports, module) {
118121
return true;
119122
}
120123

124+
function projectOpened() {
125+
if(ProjectManager.getProjectRoot().fullPath === ProjectManager.getPlaceholderProjectPath()){
126+
_showNewProjectDialogue();
127+
}
128+
}
129+
130+
ProjectManager.on(ProjectManager.EVENT_AFTER_PROJECT_OPEN, projectOpened);
131+
121132
function init() {
122133
_addMenuEntries();
123134
const shouldShowWelcome = PhStore.getItem("new-project.showWelcomeScreen") || 'Y';
@@ -388,6 +399,7 @@ define(function (require, exports, module) {
388399
exports.showFolderSelect = showFolderSelect;
389400
exports.showErrorDialogue = showErrorDialogue;
390401
exports.setupExploreProject = defaultProjects.setupExploreProject;
402+
exports.setupStartupProject = defaultProjects.setupStartupProject;
391403
exports.alreadyExists = window.Phoenix.VFS.existsAsync;
392404
exports.Metrics = Metrics;
393405
exports.EVENT_NEW_PROJECT_DIALOGUE_CLOSED = "newProjectDlgClosed";

src/extensionsIntegrated/RecentProjects/main.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,11 @@ define(function (require, exports, module) {
7777
* Add a project to the stored list of recent projects, up to MAX_PROJECTS.
7878
*/
7979
function add() {
80-
var root = FileUtils.stripTrailingSlash(ProjectManager.getProjectRoot().fullPath),
80+
const projectToAdd = ProjectManager.getProjectRoot().fullPath;
81+
if(projectToAdd === ProjectManager.getPlaceholderProjectPath()){
82+
return;
83+
}
84+
var root = FileUtils.stripTrailingSlash(projectToAdd),
8185
recentProjects = getRecentProjects(),
8286
index = recentProjects.indexOf(root);
8387

src/project/ProjectManager.js

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -742,8 +742,8 @@ define(function (require, exports, module) {
742742
return ProjectModel._ensureTrailingSlash(Phoenix.VFS.getDefaultProjectDir());
743743
}
744744

745-
function _getPlaceholderProjectPath() {
746-
return "/no_project_loaded";
745+
function getPlaceholderProjectPath() {
746+
return "/no_project_loaded/";
747747
}
748748

749749
function getExploreProjectPath() {
@@ -1151,36 +1151,43 @@ define(function (require, exports, module) {
11511151
});
11521152
}
11531153

1154-
function _loadWelcomeProject(welcomeProjectPath) {
1154+
function _loadWelcomeProject() {
1155+
const welcomeProjectPath = getWelcomeProjectPath();
11551156
const result = new $.Deferred();
11561157
const rootEntry = FileSystem.getDirectoryForPath(welcomeProjectPath);
11571158
function _loadRootEntry() {
11581159
_loadExistingProject(rootEntry)
11591160
.done(result.resolve)
11601161
.fail(result.reject);
11611162
}
1163+
function _loadPlaceholderProject() {
1164+
// default project could not be created. As a last ditch effort to continue boot, we will
1165+
// use a vfs path `/no_project_loaded` to continue boot.
1166+
Phoenix.VFS.ensureExistsDir(getPlaceholderProjectPath(), (placeHolderErr)=>{
1167+
if(placeHolderErr){
1168+
window.logger.reportError(placeHolderErr, "Error creating /no_project_loaded");
1169+
alert("Unrecoverable error, startup project could not be created.");
1170+
return;
1171+
}
1172+
const placeholderProject = FileSystem.getDirectoryForPath(getPlaceholderProjectPath());
1173+
_loadExistingProject(placeholderProject)
1174+
.done(result.resolve)
1175+
.fail(result.reject);
1176+
});
1177+
}
11621178
rootEntry.exists(function (err, exists) {
11631179
if (exists) {
11641180
_loadRootEntry();
11651181
} else {
1166-
// create the welcome project
1182+
// create the welcome project only on first boot in desktop builds. The user may delete the phoenix
1183+
// project directory as he doesn't want phoenix folders in his documents. we should respect that.
1184+
if(Phoenix.isNativeApp && !Phoenix.firstBoot) {
1185+
_loadPlaceholderProject();
1186+
return;
1187+
}
11671188
_createDefaultProject()
11681189
.then(_loadRootEntry)
1169-
.catch(()=>{
1170-
// default project could not be created. As a last ditch effort to continue boot, we will
1171-
// use a vfs path `/no_project_loaded` to continue boot.
1172-
Phoenix.VFS.ensureExistsDir(_getPlaceholderProjectPath(), (placeHolderErr)=>{
1173-
if(placeHolderErr){
1174-
window.logger.reportError(placeHolderErr, "Error creating /no_project_loaded");
1175-
alert("Unrecoverable error, startup project could not be created.");
1176-
return;
1177-
}
1178-
const placeholderProject = FileSystem.getDirectoryForPath(_getPlaceholderProjectPath());
1179-
_loadExistingProject(placeholderProject)
1180-
.done(result.resolve)
1181-
.fail(result.reject);
1182-
});
1183-
});
1190+
.catch(_loadPlaceholderProject);
11841191
}
11851192
});
11861193
return result.promise();
@@ -1255,7 +1262,7 @@ define(function (require, exports, module) {
12551262
}
12561263
if(rootPath === getWelcomeProjectPath()) {
12571264
// welcome project path is always guaranteed to be present!
1258-
return _loadWelcomeProject(rootPath);
1265+
return _loadWelcomeProject();
12591266
}
12601267
return _loadProjectInternal(rootPath);
12611268
}
@@ -2220,6 +2227,7 @@ define(function (require, exports, module) {
22202227
exports.getStartupProjectPath = getStartupProjectPath;
22212228
exports.getProjectRelativePath = getProjectRelativePath;
22222229
exports.getWelcomeProjectPath = getWelcomeProjectPath;
2230+
exports.getPlaceholderProjectPath = getPlaceholderProjectPath;
22232231
exports.getExploreProjectPath = getExploreProjectPath;
22242232
exports.getLocalProjectsPath = getLocalProjectsPath;
22252233
exports.isWelcomeProjectPath = isWelcomeProjectPath;

src/widgets/Dialogs.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,16 @@ define(function (require, exports, module) {
245245
return this._$dlg;
246246
};
247247

248+
/**
249+
* Determines whether the dialog is currently shown. Note that even if other dialogs occlude this dialog when
250+
* multiple dialogs are shown, this will still return true.
251+
*
252+
* @returns {boolean} true if the dialog is visible, false otherwise.
253+
*/
254+
Dialog.prototype.isVisible = function () {
255+
return this._$dlg.is(":visible");
256+
};
257+
248258
/**
249259
* The dialog promise
250260
* @type {$.Promise}

0 commit comments

Comments
 (0)