]> source.dussan.org Git - nextcloud-server.git/commitdiff
Add option to enable app for specific groups
authorRobin Appelman <icewind@owncloud.com>
Fri, 18 Apr 2014 12:29:45 +0000 (14:29 +0200)
committerThomas Müller <thomas.mueller@tmit.eu>
Tue, 3 Jun 2014 10:42:35 +0000 (12:42 +0200)
lib/private/app.php
settings/ajax/enableapp.php
settings/apps.php
settings/js/apps.js
settings/templates/apps.php

index 676df47245a2bdf7ec739aa2dde68d9b1840bc86..aa0fdd6da6cc3cc0fcd78210420e28c47312cbde 100644 (file)
@@ -208,12 +208,13 @@ class OC_App {
        /**
         * enables an app
         * @param mixed $app app
+        * @param array $groups (optional) when set, only these groups will have access to the app
         * @throws \Exception
         * @return void
         *
         * This function set an app as enabled in appconfig.
         */
-       public static function enable($app) {
+       public static function enable($app, $groups = null) {
                self::$enabledAppsCache = array(); // flush
                if (!OC_Installer::isInstalled($app)) {
                        // check if app is a shipped app or not. OCS apps have an integer as id, shipped apps use a string
@@ -242,7 +243,11 @@ class OC_App {
                                        )
                                );
                        } else {
-                               OC_Appconfig::setValue($app, 'enabled', 'yes');
+                               if (!is_null($groups)) {
+                                       OC_Appconfig::setValue($app, 'enabled', json_encode($groups));
+                               }else{
+                                       OC_Appconfig::setValue($app, 'enabled', 'yes');
+                               }
                                if (isset($appdata['id'])) {
                                        OC_Appconfig::setValue($app, 'ocsid', $appdata['id']);
                                }
@@ -723,10 +728,15 @@ class OC_App {
                                        continue;
                                }
 
-                               if (OC_Appconfig::getValue($app, 'enabled', 'no') == 'yes') {
+                               $enabled = OC_Appconfig::getValue($app, 'enabled', 'no');
+                               $info['groups'] = null;
+                               if ($enabled === 'yes') {
                                        $active = true;
-                               } else {
+                               } else if($enabled === 'no') {
                                        $active = false;
+                               } else {
+                                       $active = true;
+                                       $info['groups'] = $enabled;
                                }
 
                                $info['active'] = $active;
index 735794360b33eba5c9b7bfeabd777e9570176431..81ca1e0338d40d69288cb3d557be32f9e7bfd229 100644 (file)
@@ -3,8 +3,10 @@
 OC_JSON::checkAdminUser();
 OCP\JSON::callCheck();
 
+$groups = isset($_POST['groups']) ? $_POST['groups'] : null;
+
 try {
-       OC_App::enable(OC_App::cleanAppId($_POST['appid']));
+       OC_App::enable(OC_App::cleanAppId($_POST['appid']), $groups);
        OC_JSON::success();
 } catch (Exception $e) {
        OC_Log::write('core', $e->getMessage(), OC_Log::ERROR);
index 6fd2efc2018020397daa17099692afa76a608e5c..7573c8b573f77605211c6b850e3a91bd9101b868 100644 (file)
@@ -25,13 +25,16 @@ OC_Util::checkAdminUser();
 
 // Load the files we need
 OC_Util::addStyle( "settings", "settings" );
+OC_Util::addScript("core", "multiselect");
 OC_App::setActiveNavigationEntry( "core_apps" );
 
 $combinedApps = OC_App::listAllApps();
+$groups = \OC_Group::getGroups();
 
 $tmpl = new OC_Template( "settings", "apps", "user" );
 
 $tmpl->assign('apps', $combinedApps);
+$tmpl->assign('groups', $groups);
 
 $appid = (isset($_GET['appid'])?strip_tags($_GET['appid']):'');
 
index 05db4c9a04833a9a06babde22392f7436b2dc528..2093242032a2ac1845b587f4acb7f906a8f86c3d 100644 (file)
@@ -88,12 +88,35 @@ OC.Settings.Apps = OC.Settings.Apps || {
                } else {
                        page.find(".warning").hide();
                }
+
+               $('#group_select > option').each(function (i, el) {
+                       if (app.groups.length === 0 || app.groups.indexOf(el.value) >= 0) {
+                               $(el).attr('selected', 'selected');
+                       } else {
+                               $(el).attr('selected', null);
+                       }
+               });
+               page.find("div.multiselect").parent().remove();
+               if (app.active) {
+                       if (app.groups.length) {
+                               $('#group_select').multiSelect();
+                               page.find("#groups_enable").attr('checked','checked');
+                       } else {
+                               page.find("#groups_enable").attr('checked', null);
+                       }
+                       page.find("#groups_enable").show();
+                       page.find("label[for='groups_enable']").show();
+               } else {
+                       page.find("#groups_enable").hide();
+                       page.find("label[for='groups_enable']").hide();
+               }
        },
-       enableApp:function(appid, active, element) {
+       enableApp:function(appid, active, element, groups) {
                console.log('enableApp:', appid, active, element);
+               groups = groups || [];
                var appitem=$('#app-navigation ul li[data-id="'+appid+'"]');
                element.val(t('settings','Please wait....'));
-               if(active) {
+               if(active && !groups.length) {
                        $.post(OC.filePath('settings','ajax','disableapp.php'),{appid:appid},function(result) {
                                if(!result || result.status !== 'success') {
                                        if (result.data && result.data.message) {
@@ -108,14 +131,17 @@ OC.Settings.Apps = OC.Settings.Apps || {
                                }
                                else {
                                        appitem.data('active',false);
+                                       appitem.data('groups', '');
                                        element.data('active',false);
                                        OC.Settings.Apps.removeNavigation(appid);
                                        appitem.removeClass('active');
                                        element.val(t('settings','Enable'));
+                                       element.parent().find("#groups_enable").hide();
+                                       element.parent().find("label[for='groups_enable']").hide();
                                }
                        },'json');
                } else {
-                       $.post(OC.filePath('settings','ajax','enableapp.php'),{appid:appid},function(result) {
+                       $.post(OC.filePath('settings','ajax','enableapp.php'),{appid: appid, groups: groups},function(result) {
                                if(!result || result.status !== 'success') {
                                        if (result.data && result.data.message) {
                                                OC.Settings.Apps.showErrorMessage(result.data.message);
@@ -132,6 +158,13 @@ OC.Settings.Apps = OC.Settings.Apps || {
                                        element.data('active',true);
                                        appitem.addClass('active');
                                        element.val(t('settings','Disable'));
+                                       element.parent().find("#groups_enable").show();
+                                       element.parent().find("label[for='groups_enable']").show();
+                                       if (groups) {
+                                               appitem.data('groups', JSON.stringify(groups));
+                                       } else {
+                                               appitem.data('groups', '');
+                                       }
                                }
                        },'json')
                        .fail(function() {
@@ -244,6 +277,7 @@ OC.Settings.Apps = OC.Settings.Apps || {
 $(document).ready(function(){
        $('#app-navigation ul li').each(function(index,li){
                var app = OC.get('appData_'+$(li).data('id'));
+               app.groups= $(li).data('groups') || [];
                $(li).data('app',app);
                $(this).find('span.hidden').remove();
        });
@@ -281,6 +315,15 @@ $(document).ready(function(){
                }
        });
 
+       $('#group_select').change(function() {
+               var element = $('#app-content input.enable');
+               var groups = $(this).val();
+               var appid = element.data('appid');
+               if (appid) {
+                       OC.Settings.Apps.enableApp(appid, false, element, groups);
+               }
+       });
+
        if(appid) {
                var item = $('#app-navigation ul li[data-id="'+appid+'"]');
                if(item) {
@@ -289,4 +332,16 @@ $(document).ready(function(){
                        $('#app-navigation').animate({scrollTop: $(item).offset().top-70}, 'slow','swing');
                }
        }
+
+       $("#groups_enable").change(function() {
+               if (this.checked) {
+                       $("div.multiselect").parent().remove();
+                       $('#group_select').multiSelect();
+               } else {
+                       $('#group_select').hide().val(null);
+                       $("div.multiselect").parent().remove();
+               }
+
+               $('#group_select').change();
+       });
 });
index b7f3b6121ada859d8b4f998c0a9ab93036ee4084..fa4cb48bce08ae5bf0dc8f96c6876af05a352d92 100644 (file)
@@ -16,7 +16,7 @@
                <?php endif; ?>
 
                <?php foreach($_['apps'] as $app):?>
-               <li <?php if($app['active']) print_unescaped('class="active"')?> data-id="<?php p($app['id']) ?>"
+               <li <?php if($app['active']) print_unescaped('class="active"')?> data-id="<?php p($app['id']) ?>" data-groups="<?php p($app['groups']) ?>"
                        <?php if ( isset( $app['ocs_id'] ) ) { print_unescaped("data-id-ocs=\"{".OC_Util::sanitizeHTML($app['ocs_id'])."}\""); } ?>
                                data-type="<?php p($app['internal'] ? 'internal' : 'external') ?>" data-installed="1">
                        <a class="app<?php if(!$app['internal']) p(' externalapp') ?>"
                print_unescaped($l->t('<span class="licence"></span>-licensed by <span class="author"></span>'));?></p>
        <input class="enable hidden" type="submit" />
        <input class="update hidden" type="submit" value="<?php p($l->t('Update')); ?>" />
+       <input class="hidden" type="checkbox" id="groups_enable"/>
+       <label class="hidden" for="groups_enable"><?php p($l->t('Only for specific groups')); ?></label>
+       <select class="hidden" id="group_select" multiple="multiple" title="<?php p($l->t('All')); ?>">
+               <?php foreach($_['groups'] as $group):?>
+                       <option value="<?php p($group);?>"><?php p($group); ?></option>
+               <?php endforeach;?>
+       </select>
        <div class="warning hidden"></div>
        </div>
 </div>