Skip to content

Commit 27cab3a

Browse files
Fix local editing + download capabilities
1 parent d571e99 commit 27cab3a

8 files changed

Lines changed: 107 additions & 30 deletions

File tree

src/_shared/frametrail-core/storage/StorageAdapterDownload.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,22 @@ class StorageAdapterDownload extends StorageAdapter {
1616
constructor() {
1717
super();
1818
this._data = {}; // In-memory cache
19+
20+
// Pre-load user identity so isLoggedIn() works before init() is called.
21+
// If a returning user is stored in localStorage, use it immediately.
22+
// Otherwise set a default so the edit button is visible; init() will
23+
// prompt for a real name on the first save attempt.
24+
var storedUser = null;
25+
try { storedUser = JSON.parse(localStorage.getItem('frametrail_local_user')); } catch (e) {}
26+
this._userInfo = (storedUser && storedUser.id)
27+
? storedUser
28+
: { id: 'localuser', name: 'Local User', role: 'admin', mail: '', color: '#FF9800' };
1929
}
2030

2131
get type() { return 'download'; }
2232
get displayName() { return 'Download'; }
2333
get canSave() { return true; }
24-
get userInfo() { return this._userInfo || {}; }
34+
get userInfo() { return this._userInfo; }
2535

2636
async init() {
2737
var localUser = localStorage.getItem('frametrail_local_user');

src/_shared/modules/Database/module.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,12 @@
221221
success.call(this);
222222
});
223223

224+
} else if (FrameTrail.getState('storageMode') === 'download') {
225+
226+
// Download mode: no users file — start empty
227+
users = {};
228+
success.call(this);
229+
224230
} else if (!FrameTrail.module('RouteNavigation').environment.server) {
225231

226232
$.ajax({
@@ -872,8 +878,8 @@
872878
// clear previous data
873879
annotations = [];
874880

875-
if (!initAnnotations) {
876-
success();
881+
if (!initAnnotations || initAnnotations.length === 0) {
882+
return success();
877883
}
878884

879885
var countdown = initAnnotations.length;

src/_shared/modules/StorageManager/module.js

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,25 @@ FrameTrail.defineModule('StorageManager', function(FrameTrail) {
206206
}
207207

208208

209+
/**
210+
* Lazily initialize the Download adapter's user identity.
211+
* Called on first edit attempt in download mode.
212+
* Checks localStorage; if no user is stored, prompts for a name.
213+
*
214+
* @method ensureDownloadUser
215+
* @return {Promise<Object>} Resolves with the user info object
216+
*/
217+
function ensureDownloadUser() {
218+
var info = _downloadAdapter.userInfo;
219+
if (info && info.id) {
220+
return Promise.resolve(info);
221+
}
222+
return _downloadAdapter.init().then(function() {
223+
return _downloadAdapter.userInfo;
224+
});
225+
}
226+
227+
209228
/**
210229
* Get current user info from the active adapter.
211230
* @method getCurrentUserInfo
@@ -239,12 +258,13 @@ FrameTrail.defineModule('StorageManager', function(FrameTrail) {
239258
getLocalAdapter: getLocalAdapter,
240259
getDownloadAdapter: getDownloadAdapter,
241260
switchToLocal: switchToLocal,
242-
switchToServer: switchToServer,
243-
canSave: canSave,
244-
canSaveToServer: canSaveToServer,
245-
canSaveToLocal: canSaveToLocal,
246-
getCurrentUserInfo: getCurrentUserInfo,
247-
getFolderName: getFolderName
261+
switchToServer: switchToServer,
262+
canSave: canSave,
263+
canSaveToServer: canSaveToServer,
264+
canSaveToLocal: canSaveToLocal,
265+
getCurrentUserInfo: getCurrentUserInfo,
266+
getFolderName: getFolderName,
267+
ensureDownloadUser: ensureDownloadUser
248268
};
249269

250270
});

src/_shared/modules/TagModel/module.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838

3939
}
4040

41-
if (FrameTrail.getState('storageMode') === 'local') {
41+
if (FrameTrail.getState('storageMode') === 'local' || FrameTrail.getState('storageMode') === 'download') {
4242
var adapter = FrameTrail.module('StorageManager').getAdapter();
4343
adapter.readJSON('tagdefinitions.json').then(function(data) {
4444
tags = data;
@@ -88,7 +88,7 @@
8888

8989
function setTag (tagname, language, label, description, success, fail) {
9090

91-
if (FrameTrail.getState('storageMode') === 'local') {
91+
if (FrameTrail.getState('storageMode') === 'local' || FrameTrail.getState('storageMode') === 'download') {
9292
var adapter = FrameTrail.module('StorageManager').getAdapter();
9393
adapter.readJSON('tagdefinitions.json').catch(function() { return {}; }).then(function(data) {
9494
if (!data[tagname]) { data[tagname] = {}; }
@@ -120,7 +120,7 @@
120120

121121
function deleteLang (tagname, language, success, fail) {
122122

123-
if (FrameTrail.getState('storageMode') === 'local') {
123+
if (FrameTrail.getState('storageMode') === 'local' || FrameTrail.getState('storageMode') === 'download') {
124124
var adapter = FrameTrail.module('StorageManager').getAdapter();
125125
adapter.readJSON('tagdefinitions.json').catch(function() { return {}; }).then(function(data) {
126126
if (data[tagname]) {
@@ -152,7 +152,7 @@
152152

153153
function deleteTag (tagname, success, fail) {
154154

155-
if (FrameTrail.getState('storageMode') === 'local') {
155+
if (FrameTrail.getState('storageMode') === 'local' || FrameTrail.getState('storageMode') === 'download') {
156156
var adapter = FrameTrail.module('StorageManager').getAdapter();
157157
adapter.readJSON('tagdefinitions.json').catch(function() { return {}; }).then(function(data) {
158158
delete data[tagname];

src/_shared/modules/UserManagement/module.js

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,26 @@ FrameTrail.defineModule('UserManagement', function(FrameTrail){
522522
return;
523523
}
524524

525+
if (storageMode === 'download') {
526+
// Download mode — lazily init user identity (localStorage or prompt)
527+
var downloadUser = FrameTrail.module('StorageManager').getCurrentUserInfo();
528+
if (downloadUser && downloadUser.id) {
529+
isLoggedIn(function(loginStatus) {
530+
callback.call();
531+
});
532+
} else {
533+
FrameTrail.module('StorageManager').ensureDownloadUser().then(function() {
534+
isLoggedIn(function(loginStatus) {
535+
callback.call();
536+
});
537+
}).catch(function(err) {
538+
console.warn('Download user init failed:', err);
539+
if (callbackCancel) callbackCancel.call();
540+
});
541+
}
542+
return;
543+
}
544+
525545
isLoggedIn(function(loginStatus) {
526546

527547
if (loginStatus){
@@ -558,12 +578,12 @@ FrameTrail.defineModule('UserManagement', function(FrameTrail){
558578

559579
var storageMode = FrameTrail.getState('storageMode');
560580

561-
if (storageMode === 'local') {
562-
// Local mode — use local user info from StorageManager
581+
if (storageMode === 'local' || storageMode === 'download') {
582+
// Local / download mode — use user info from the active storage adapter
563583
var localUser = FrameTrail.module('StorageManager').getCurrentUserInfo();
564-
if (localUser) {
584+
if (localUser && localUser.id) {
565585
userID = localUser.id;
566-
userRole = localUser.role;
586+
userRole = localUser.role || 'admin';
567587
userMail = localUser.mail || '';
568588
userRegistrationDate = localUser.registrationDate;
569589
FrameTrail.changeState('username', localUser.name);

src/player/modules/PlayerLauncher/module.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,12 @@
7676
return;
7777
}
7878

79-
continueLoading();
79+
// Sync login state now that storageMode is known.
80+
// UserManagement.isLoggedIn() ran at module-init time before storageMode
81+
// was set, so loggedIn may be stale (false) for local/download modes.
82+
FrameTrail.module('UserManagement').isLoggedIn(function() {
83+
continueLoading();
84+
});
8085

8186
});
8287

src/player/modules/Sidebar/module.js

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -992,13 +992,20 @@ FrameTrail.defineModule('Sidebar', function(FrameTrail){
992992
*/
993993
function toogleUnsavedChanges(aBoolean) {
994994

995+
var isDownload = FrameTrail.getState('storageMode') === 'download';
996+
995997
if (aBoolean) {
996-
domElement.find('button[data-viewmode="video"]').addClass('unsavedChanges')
997-
SaveButton.addClass('unsavedChanges')
998+
domElement.find('button[data-viewmode="video"]').addClass('unsavedChanges');
999+
if (isDownload) {
1000+
SaveAsButton.addClass('unsavedChanges');
1001+
} else {
1002+
SaveButton.addClass('unsavedChanges');
1003+
}
9981004
} else {
999-
domElement.find('button[data-viewmode="video"]').removeClass('unsavedChanges')
1000-
domElement.find('button.editMode').removeClass('unsavedChanges')
1001-
SaveButton.removeClass('unsavedChanges')
1005+
domElement.find('button[data-viewmode="video"]').removeClass('unsavedChanges');
1006+
domElement.find('button.editMode').removeClass('unsavedChanges');
1007+
SaveButton.removeClass('unsavedChanges');
1008+
SaveAsButton.removeClass('unsavedChanges');
10021009
}
10031010

10041011
};
@@ -1062,7 +1069,12 @@ FrameTrail.defineModule('Sidebar', function(FrameTrail){
10621069

10631070
NewHypervideoButton.show();
10641071
ExportButton.hide();
1065-
SaveButton.show();
1072+
// In download mode Save writes to memory only — disable it; Save As is the real action
1073+
if (FrameTrail.getState('storageMode') === 'download') {
1074+
SaveButton.show().prop('disabled', true);
1075+
} else {
1076+
SaveButton.show().prop('disabled', false);
1077+
}
10661078
SaveAsButton.show();
10671079
UndoButton.show();
10681080
RedoButton.show();

src/player/modules/Titlebar/module.js

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ FrameTrail.defineModule('Titlebar', function(FrameTrail){
7575
});
7676

7777
UserSettingsButton.click(function(){
78-
if (FrameTrail.getState('storageMode') === 'local') {
78+
var _smBtn = FrameTrail.getState('storageMode');
79+
if (_smBtn === 'local' || _smBtn === 'download') {
7980
showLocalUserDialog();
8081
} else {
8182
FrameTrail.module('UserManagement').showAdministrationBox();
@@ -363,12 +364,13 @@ FrameTrail.defineModule('Titlebar', function(FrameTrail){
363364
// Show user settings and logout buttons if logged in
364365
if (FrameTrail.getState('loggedIn')) {
365366
UserSettingsButton.show();
366-
if (FrameTrail.getState('storageMode') !== 'local') {
367+
var _smLogin = FrameTrail.getState('storageMode');
368+
if (_smLogin !== 'local' && _smLogin !== 'download') {
367369
domElement.find('.logoutButton').show();
368370
}
369371
}
370-
// In local mode, always show user settings (for name/color change)
371-
if (FrameTrail.getState('storageMode') === 'local') {
372+
// In local/download mode, always show user settings (for name/color change)
373+
if (FrameTrail.getState('storageMode') === 'local' || FrameTrail.getState('storageMode') === 'download') {
372374
UserSettingsButton.show();
373375
}
374376

@@ -381,7 +383,8 @@ FrameTrail.defineModule('Titlebar', function(FrameTrail){
381383
StartEditButton.show();
382384

383385
// Hide Edit Button when no storage backend is available
384-
if (!FrameTrail.module('RouteNavigation').environment.server && FrameTrail.getState('storageMode') !== 'local') {
386+
var _sm = FrameTrail.getState('storageMode');
387+
if (!FrameTrail.module('RouteNavigation').environment.server && _sm !== 'local' && _sm !== 'download') {
385388
StartEditButton.hide();
386389
}
387390

@@ -411,7 +414,8 @@ FrameTrail.defineModule('Titlebar', function(FrameTrail){
411414

412415
// Only show user settings and logout buttons if in edit mode
413416
if (FrameTrail.getState('editMode')) {
414-
if (FrameTrail.getState('storageMode') !== 'local') {
417+
var _smCul = FrameTrail.getState('storageMode');
418+
if (_smCul !== 'local' && _smCul !== 'download') {
415419
domElement.find('.logoutButton').show();
416420
}
417421
UserSettingsButton.show();

0 commit comments

Comments
 (0)