@@ -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 ( ) ;
0 commit comments