Skip to content

Commit 6044db9

Browse files
committed
MOBILE-1902 wiki: Detect subwiki correctly to get offline pages
1 parent 01b76f6 commit 6044db9

File tree

7 files changed

+163
-85
lines changed

7 files changed

+163
-85
lines changed

www/addons/mod/wiki/controllers/edit.js

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -129,11 +129,7 @@ angular.module('mm.addons.mod_wiki')
129129
}
130130

131131
return promise.catch(function(message) {
132-
if (message) {
133-
$mmUtil.showErrorModal(message);
134-
} else {
135-
$mmUtil.showErrorModal('Error saving wiki data.');
136-
}
132+
$mmUtil.showErrorModalDefault(message, 'Error saving wiki data.');
137133
}).finally(function() {
138134
modal.dismiss();
139135
});
@@ -174,7 +170,9 @@ angular.module('mm.addons.mod_wiki')
174170
pageid: pageId,
175171
pagetitle: $scope.page.title,
176172
wikiid: wikiId,
177-
subwikiid: subwikiId
173+
subwikiid: subwikiId,
174+
userid: userId,
175+
groupid: groupId
178176
};
179177
}
180178

@@ -197,11 +195,13 @@ angular.module('mm.addons.mod_wiki')
197195
pageid: null,
198196
pagetitle: $scope.page.title,
199197
wikiid: wikiId,
200-
subwikiid: subwikiId
198+
subwikiid: subwikiId,
199+
userid: userId,
200+
groupid: groupId
201201
};
202202
}
203203
} else {
204-
$mmUtil.showModal('mm.core.success','mm.core.datastoredoffline');
204+
$mmUtil.showModal('mm.core.success', 'mm.core.datastoredoffline');
205205
}
206206

207207
return $ionicHistory.goBack();
@@ -218,9 +218,22 @@ angular.module('mm.addons.mod_wiki')
218218
// In case we're editing an offline page, check if the page loaded in back view is different than this view.
219219
function backViewPageIsDifferentOffline() {
220220
// We cannot precisely detect when the state is the same but this is close to it.
221-
var backView = $ionicHistory.backView();
222-
return backView.stateName != 'site.mod_wiki' || backView.stateParams.moduleid != module.id ||
223-
backView.stateParams.subwikiid != subwikiId || backView.stateParams.pagetitle != $scope.page.title;
221+
var backView = $ionicHistory.backView(),
222+
backViewParams = backView.stateParams;
223+
if (backView.stateName != 'site.mod_wiki' || backViewParams.moduleid != module.id || backViewParams.wikiid != wikiId ||
224+
backViewParams.pagetitle != $scope.page.title) {
225+
return true;
226+
}
227+
228+
// Check subwiki using subwiki or user and group.
229+
var backSubwikiId = parseInt(backViewParams.subwikiid, 10) || 0;
230+
if (backSubwikiId > 0 && subwikiId > 0) {
231+
return backSubwikiId != subwikiId;
232+
}
233+
234+
var backUserId = parseInt(backViewParams.userid, 10) || 0,
235+
backGroupId = parseInt(backViewParams.groupid, 10) || 0;
236+
return userId != backUserId || groupId != backGroupId;
224237
}
225238

226239
// Renew lock and control versions.

www/addons/mod/wiki/controllers/index.js

Lines changed: 109 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -258,9 +258,11 @@ angular.module('mm.addons.mod_wiki')
258258
}
259259

260260
$scope.subwikiData.count = subwikiList.count;
261-
$scope.subwikiData.subwikiSelected = $stateParams.subwikiid || subwikiList.subwikiSelected;
262-
$scope.subwikiData.userSelected = $stateParams.userid || subwikiList.userSelected;
263-
$scope.subwikiData.groupSelected = $stateParams.groupid || subwikiList.groupSelected;
261+
setSelectedWiki($stateParams.subwikiid, $stateParams.userid, $stateParams.groupid);
262+
// If anything was selected using stateparams, set the selected on cache.
263+
if (!isAnySubwikiSelected()) {
264+
setSelectedWiki(subwikiList.subwikiSelected, subwikiList.userSelected, subwikiList.groupSelected);
265+
}
264266

265267
$scope.subwikiData.subwikis = subwikiList.subwikis;
266268
return $q.when();
@@ -276,7 +278,7 @@ angular.module('mm.addons.mod_wiki')
276278
tabsDelegate.select(action == 'map' ? 1 : 0);
277279
}
278280

279-
if ($scope.subwikiData.subwikiSelected === false || $scope.subwikiData.count <= 0) {
281+
if (!isAnySubwikiSelected() || $scope.subwikiData.count <= 0) {
280282
return $q.reject($translate.instant('mma.mod_wiki.errornowikiavailable'));
281283
}
282284
}).then(function() {
@@ -333,19 +335,16 @@ angular.module('mm.addons.mod_wiki')
333335
promises = [],
334336
userGroupsIds = [],
335337
allParticipants = false,
336-
myGroups = false,
338+
showMyGroupsLabel = false,
337339
multiLevelList = false,
338340
currentUserId = $mmSite.getUserId() || false,
339341
allParticipantsTitle = $translate.instant('mm.core.allparticipants'),
340342
nonInGroupTitle = $translate.instant('mma.mod_wiki.notingroup'),
341343
myGroupsTitle = $translate.instant('mm.core.mygroups'),
342-
otherGroupsTitle = $translate.instant('mm.core.othergroups'),
343-
selectedUserId = false;
344+
otherGroupsTitle = $translate.instant('mm.core.othergroups');
344345

345346
$scope.subwikiData.subwikis = [];
346-
$scope.subwikiData.subwikiSelected = $stateParams.subwikiid || false;
347-
$scope.subwikiData.userSelected =  $stateParams.userid || false;
348-
$scope.subwikiData.groupSelected =  $stateParams.groupid || false;
347+
setSelectedWiki($stateParams.subwikiid, $stateParams.userid, $stateParams.groupid);
349348
$scope.subwikiData.count = 0;
350349

351350
// Group mode available.
@@ -413,20 +412,7 @@ angular.module('mm.addons.mod_wiki')
413412
groupLabel: groupLabel,
414413
canedit: subwiki.canedit
415414
});
416-
myGroups = true;
417-
}
418-
}
419-
420-
// If no subwikiid received as view param, select always the current user
421-
// or the first subwiki if not previously selected.
422-
if (!$stateParams.subwikiid && ((userId > 0 && currentUserId == userId) || !$scope.subwikiData.subwikiSelected ||
423-
$scope.subwikiData.subwikiSelected < 1)) {
424-
425-
// Check if there is one more propperly selected.
426-
if (!$scope.subwikiData.userSelected || $scope.subwikiData.userSelected != currentUserId) {
427-
$scope.subwikiData.subwikiSelected = subwiki.id;
428-
$scope.subwikiData.userSelected = userId;
429-
$scope.subwikiData.groupSelected = groupId;
415+
showMyGroupsLabel = true;
430416
}
431417
}
432418
});
@@ -435,13 +421,71 @@ angular.module('mm.addons.mod_wiki')
435421
var groupValue = -1,
436422
grouping;
437423

438-
439424
subwikiList.sort(function(a, b) {
440425
return a.group - b.group;
441426
});
442427

443428
$scope.subwikiData.count = subwikiList.length;
444429

430+
// If no subwiki is received as view param, select always the most propper.
431+
if ((!$stateParams.subwikiid || (!$stateParams.userid && !$stateParams.groupid)) && !isAnySubwikiSelected() &&
432+
subwikiList.length > 0) {
433+
var firstCanEdit = false;
434+
candidateNoFirstPage = false,
435+
candidateFirstPage = false;
436+
for (var x in subwikiList) {
437+
var subwiki = subwikiList[x];
438+
if (subwiki.canedit) {
439+
var candidateSubwikiId = false;
440+
if (subwiki.user > 0) {
441+
// Check if it's the current user.
442+
if (currentUserId == subwiki.user) {
443+
candidateSubwikiId = subwiki.id;
444+
}
445+
} else if (subwiki.group > 0) {
446+
// Check if it's a current user' group.
447+
if (showMyGroupsLabel) {
448+
candidateSubwikiId = subwiki.id;
449+
}
450+
} else if (subwiki.id > 0) {
451+
candidateSubwikiId = subwiki.id;
452+
}
453+
454+
if (candidateSubwikiId !== false) {
455+
if (candidateSubwikiId > 0) {
456+
// Subwiki found and created, no need to keep looking.
457+
candidateFirstPage = x;
458+
break;
459+
} else if (candidateNoFirstPage === false) {
460+
candidateNoFirstPage = x;
461+
}
462+
} else if (firstCanEdit === false) {
463+
firstCanEdit = x;
464+
}
465+
}
466+
}
467+
468+
var subWikiToTake;
469+
if (candidateFirstPage !== false) {
470+
// Take the candidate that already has the first page created.
471+
subWikiToTake = candidateFirstPage;
472+
} else if (candidateNoFirstPage !== false) {
473+
// No first page created, take the first candidate.
474+
subWikiToTake = candidateNoFirstPage;
475+
} else if (firstCanEdit !== false) {
476+
// None selected, take the first the user can edit.
477+
subWikiToTake = firstCanEdit;
478+
} else {
479+
// Otherwise take the very first.
480+
subWikiToTake = 0;
481+
}
482+
483+
if (typeof subwikiList[subWikiToTake] != "undefined") {
484+
setSelectedWiki(subwikiList[subWikiToTake].id, subwikiList[subWikiToTake].user,
485+
subwikiList[subWikiToTake].group);
486+
}
487+
}
488+
445489
if (multiLevelList) {
446490
// As we loop over each subwiki, add it to the current group
447491
for (var i in subwikiList) {
@@ -458,7 +502,7 @@ angular.module('mm.addons.mod_wiki')
458502
// Add the subwiki to the currently active grouping.
459503
grouping.subwikis.push(subwiki);
460504
}
461-
} else if (myGroups) {
505+
} else if (showMyGroupsLabel) {
462506
var noGrouping = {label: "", subwikis: []},
463507
myGroupsGrouping = {label: myGroupsTitle, subwikis: []},
464508
otherGroupsGrouping = {label: otherGroupsTitle, subwikis: []};
@@ -470,7 +514,7 @@ angular.module('mm.addons.mod_wiki')
470514
// Add the subwiki to the currently active grouping.
471515
if (typeof subwiki.canedit == 'undefined') {
472516
noGrouping.subwikis.push(subwiki);
473-
} else if(subwiki.canedit) {
517+
} else if (subwiki.canedit) {
474518
myGroupsGrouping.subwikis.push(subwiki);
475519
} else {
476520
otherGroupsGrouping.subwikis.push(subwiki);
@@ -540,26 +584,20 @@ angular.module('mm.addons.mod_wiki')
540584

541585
// Fetch the page to be shown.
542586
function fetchWikiPage() {
543-
var groupId, userId, subwikiId;
544587
// Search the current Subwiki.
545588
currentSubwiki = false;
546-
angular.forEach(loadedSubwikis, function(subwiki) {
547-
subwikiId = parseInt(subwiki.id, 10);
548-
userId = parseInt(subwiki.userid, 10);
549-
groupId = parseInt(subwiki.groupid, 10);
550-
if (!currentSubwiki && subwikiId == $scope.subwikiData.subwikiSelected && userId == $scope.subwikiData.userSelected &&
551-
groupId == $scope.subwikiData.groupSelected) {
552-
currentSubwiki = subwiki;
589+
for (var x in loadedSubwikis) {
590+
if ($scope.isSubwikiSelected(loadedSubwikis[x])) {
591+
currentSubwiki = loadedSubwikis[x];
592+
break;
553593
}
554-
});
594+
}
555595

556596
if (!currentSubwiki) {
557597
return $q.reject();
558598
}
559599

560-
$scope.subwikiData.subwikiSelected = parseInt(currentSubwiki.id, 10);
561-
$scope.subwikiData.userSelected = parseInt(currentSubwiki.userid, 10);
562-
$scope.subwikiData.groupSelected = parseInt(currentSubwiki.groupid, 10);
600+
setSelectedWiki(currentSubwiki.id, currentSubwiki.userid, currentSubwiki.groupid);
563601

564602
// We need fetchSubwikis to finish before calling fetchSubwikiPages because it needs subwikiid and pageid variable.
565603
return fetchSubwikiPages(currentSubwiki).then(function() {
@@ -569,9 +607,7 @@ angular.module('mm.addons.mod_wiki')
569607
return fetchPageContents(currentPage).then(function(pageContents) {
570608
if (pageContents) {
571609
$scope.title = pageContents.title;
572-
$scope.subwikiData.subwikiSelected = parseInt(pageContents.subwikiid, 10);
573-
$scope.subwikiData.userSelected = parseInt(pageContents.userid, 10);
574-
$scope.subwikiData.groupSelected = parseInt(pageContents.groupid, 10);
610+
setSelectedWiki(pageContents.subwikiid, pageContents.userid, pageContents.groupid);
575611

576612
$scope.pageContent = replaceEditLinks(pageContents.cachedcontent);
577613
$scope.canEdit = pageContents.caneditpage && $mmaModWiki.isPluginEnabledForEditing();
@@ -608,11 +644,12 @@ angular.module('mm.addons.mod_wiki')
608644
return $mmaModWikiOffline.getSubwikiNewPages(subwiki.id, subwiki.wikiid, subwiki.userid, subwiki.groupid)
609645
.then(function(offlinePages) {
610646

611-
// If no page specified, search first page in the offline pages.
612-
if (!currentPage && !pageTitle) {
647+
// If no page specified, search page title in the offline pages.
648+
if (!currentPage) {
649+
var searchTitle = pageTitle ? pageTitle : wiki.firstpagetitle;
613650
angular.forEach(offlinePages, function(subwikiPage) {
614-
if (!currentPage && subwikiPage.title == wiki.firstpagetitle) {
615-
currentPage = subwikiPage.id;
651+
if (!currentPage && subwikiPage.title == searchTitle) {
652+
pageTitle = subwikiPage.title;
616653
}
617654
});
618655
}
@@ -631,7 +668,7 @@ angular.module('mm.addons.mod_wiki')
631668
// Convenience function to get wiki page contents.
632669
function fetchPageContents(pageId) {
633670
if (!pageId) {
634-
var title = title || wiki.firstpagetitle;
671+
var title = pageTitle || wiki.firstpagetitle;
635672

636673
// No page ID but we received a title. This means we're trying to load an offline page.
637674
return $mmaModWikiOffline.getNewPage(title, currentSubwiki.id, currentSubwiki.wikiid, currentSubwiki.userid,
@@ -864,6 +901,31 @@ angular.module('mm.addons.mod_wiki')
864901
}
865902
});
866903

904+
// Sets the selected subwiki for the subwiki picker.
905+
function setSelectedWiki(subwiki, user, group) {
906+
$scope.subwikiData.subwikiSelected = (subwiki = parseInt(subwiki, 10)) > 0 ? subwiki : 0;
907+
$scope.subwikiData.userSelected = parseInt(user, 10) || 0;
908+
$scope.subwikiData.groupSelected = parseInt(group, 10) || 0;
909+
}
910+
911+
// Checks if the given subwiki is the one picked on the subwiki picker.
912+
$scope.isSubwikiSelected = function(subwiki) {
913+
var subwikiId = parseInt(subwiki.id, 10) || 0;
914+
if (subwikiId > 0 && $scope.subwikiData.subwikiSelected > 0) {
915+
return subwikiId == $scope.subwikiData.subwikiSelected;
916+
}
917+
918+
var userId = parseInt(subwiki.user, 10) || parseInt(subwiki.userid, 10) || 0,
919+
groupId = parseInt(subwiki.group, 10) || parseInt(subwiki.groupid, 10) || 0;
920+
return userId == $scope.subwikiData.userSelected && groupId == $scope.subwikiData.groupSelected;
921+
};
922+
923+
// Checks if there is any subwiki selected.
924+
function isAnySubwikiSelected() {
925+
return $scope.subwikiData.subwikiSelected > 0 || $scope.subwikiData.userSelected > 0 ||
926+
$scope.subwikiData.groupSelected > 0;
927+
}
928+
867929
$scope.$on('$destroy', function() {
868930
popover && popover.remove();
869931
newPageObserver && newPageObserver.off && newPageObserver.off();

www/addons/mod/wiki/services/wiki.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -580,12 +580,14 @@ angular.module('mm.addons.mod_wiki')
580580
contentformat: 'html'
581581
};
582582

583-
if (subwikiId) {
583+
subwikiId = parseInt(subwikiId, 10) || 0;
584+
wikiId = parseInt(wikiId, 10) > 0 ? parseInt(wikiId, 10) : 0;
585+
if (subwikiId && subwikiId > 0) {
584586
params.subwikiid = subwikiId;
585587
} else if (wikiId) {
586588
params.wikiid = wikiId;
587-
params.userid = userId || 0;
588-
params.groupid = groupId || 0;
589+
params.userid = parseInt(userId, 10) > 0 ? parseInt(userId, 10) : 0;
590+
params.groupid = parseInt(groupId, 10) > 0 ? parseInt(groupId, 10) : 0;
589591
}
590592

591593
return site.write('mod_wiki_new_page', params).catch(function(error) {

0 commit comments

Comments
 (0)