Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • develop
  • master
  • git-fixes
  • 4.1_templates-symlink
  • 4.0_templates
5 results

Target

Select target project
No results found
Select Git revision
  • develop
  • master
  • git-fixes
  • 4.1_templates-symlink
  • 4.0_templates
5 results
Show changes

Commits on Source 146

46 additional commits have been omitted to prevent performance issues.
1000 files
+ 4176
0
Compare changes
  • Side-by-side
  • Inline

Files

.gitignore

0 → 100644
+3 −0
Original line number Original line Diff line number Diff line
vagrant/dev/.vagrant
data
tmp

.gitmodules

0 → 100644
+3 −0
Original line number Original line Diff line number Diff line
[submodule "elgg"]
	path = elgg
	url = https://github.com/Elgg/Elgg.git

CONTRIBUTING.md

0 → 100644
+8 −0
Original line number Original line Diff line number Diff line
# Contributing
This project follows the normal github workflow.

## Working on a feature or issue
* Please make a fork of the repository if you do not already have one.
* Create a branch for the feature/issue with a name like `feature-x` or `issue-#`.
* Commit your changes to that branch.
* Create a pull request with your changes.

README.md

0 → 100644
+27 −0
Original line number Original line Diff line number Diff line
# Planet Red
Planet Red is UNL's implementation of elgg

## Directory Structure
* elgg - the elgg directory.  Currently a submodule, checked out at 1.8.19
* vagrant - various vagrant boxes for development/testing.  Use vagrant/dev/ for development
* plugins - Our custom plugins such as auth and themes that need to be symlinked.  Keeping the plugins out of the elgg directory makes for easy upgrades.

## Setup
1. Initialize submodules by running `git submodule init` and then `gitsubmodule update`

## Using Vagrant
For now, use the dev vagrant box at vagrant/dev/
1. `cd vagrant/dev/`
2. `vagrant up`
3. go to http://localhost:8005 to view the project 

## Using Elgg Clean theme
1. `vagrant ssh`
2. `ln -s /var/www/html/plugins/unl_theme /var/www/html/elgg/mod`
3. `ln -s /var/www/html/plugins/cas_auth_unl /var/www/html/elgg/mod`

## TODO
* implement the UNLedu Framework 4.0 theme at plugins/unl_theme
* implement UNL auth at plugins/cas_auth_unl
* make sure profile image routes still work
 No newline at end of file
Original line number Original line Diff line number Diff line
Subproject commit 83a56e7201288ccbfb036d8251df992f8446da3e
+8 −0
Original line number Original line Diff line number Diff line
{
	"folders":
	[
		{
			"path": "."
		}
	]
}
+3 −0
Original line number Original line Diff line number Diff line
vendor
migration.lock
 No newline at end of file
+62 −0
Original line number Original line Diff line number Diff line
<?php
require_once __DIR__ . '/../../elgg/vendor/autoload.php';

if (!isset($argv[1])) {
    echo "usage: php add_user.php username" . PHP_EOL;
    exit();
}

\Elgg\Application::start();

$uid = $argv[1];

$info = array();

if (!$json = @file_get_contents(UnlCAS::DIRECTORY_URL . '?uid=' . $uid . '&format=json')) {
    echo 'unable to get that ID' . PHP_EOL;
    exit();
}

if (!$json = json_decode($json, true)) {
    echo 'error decoding data' . PHP_EOL;
    exit();
}

$map = array(
    'givenName' => 'first_name',
    'sn' => 'last_name',
    'mail' => 'email'
);

foreach ($map as $from => $to) {
    if (isset($json[$from][0])) {
        $info[$to] = $json[$from][0];
    }
}

$info['name'] = $info['first_name'] . ' ' . $info['last_name'];

if (!isset($info['email'])) {
    echo 'no email is available' . PHP_EOL;
    exit();
}

$password = generate_random_cleartext_password();

$elgg_uid = str_replace('-', '_', $uid);
$elgg_uid = 'unl_' . $elgg_uid;

try {
    $user_guid = register_user($elgg_uid, $password, $info['name'], $info['email'], false);
} catch (RegistrationException $e) {
    //Looks like we had an invalid email address... ask for it again.
    echo 'Unable to register, probably due to invalid email address or the user already exists' . PHP_EOL;
    exit();
}

if (!$user_guid) {
    echo 'Unable to register' . PHP_EOL;
    exit();
}

echo 'User added: ' . $elgg_uid . PHP_EOL;
+6 −0
Original line number Original line Diff line number Diff line
{
  "require": {
    "jasig/phpcas": "1.3.x-dev",
    "tedivm/stash": "~0.13"
  }
}
+129 −0
Original line number Original line Diff line number Diff line
{
    "_readme": [
        "This file locks the dependencies of your project to a known state",
        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
        "This file is @generated automatically"
    ],
    "content-hash": "3c159cf3bf5c282651e8fefe10c17c8e",
    "packages": [
        {
            "name": "jasig/phpcas",
            "version": "dev-master",
            "source": {
                "type": "git",
                "url": "https://github.com/apereo/phpCAS.git",
                "reference": "7a949dee79aaadc16161d7d4863b5c0871546222"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/apereo/phpCAS/zipball/7a949dee79aaadc16161d7d4863b5c0871546222",
                "reference": "7a949dee79aaadc16161d7d4863b5c0871546222",
                "shasum": ""
            },
            "require": {
                "ext-curl": "*",
                "php": ">=5.4.0"
            },
            "require-dev": {
                "phpunit/phpunit": "~3.7.10"
            },
            "type": "library",
            "extra": {
                "branch-alias": {
                    "dev-master": "1.3.x-dev"
                }
            },
            "autoload": {
                "classmap": [
                    "source/"
                ]
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "Apache-2.0"
            ],
            "authors": [
                {
                    "name": "Joachim Fritschi",
                    "homepage": "https://wiki.jasig.org/display/~fritschi"
                },
                {
                    "name": "Adam Franco",
                    "homepage": "https://wiki.jasig.org/display/~adamfranco"
                }
            ],
            "description": "Provides a simple API for authenticating users against a CAS server",
            "homepage": "https://wiki.jasig.org/display/CASC/phpCAS",
            "keywords": [
                "apereo",
                "cas",
                "jasig"
            ],
            "time": "2018-03-15T13:17:25+00:00"
        },
        {
            "name": "tedivm/stash",
            "version": "v0.13.2",
            "source": {
                "type": "git",
                "url": "https://github.com/tedious/Stash.git",
                "reference": "3489b13bad93c81a898fcb1054ae954575e1a7b6"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/tedious/Stash/zipball/3489b13bad93c81a898fcb1054ae954575e1a7b6",
                "reference": "3489b13bad93c81a898fcb1054ae954575e1a7b6",
                "shasum": ""
            },
            "require": {
                "php": "^5.4|^7.0"
            },
            "require-dev": {
                "fabpot/php-cs-fixer": "^1.9",
                "phpunit/phpunit": "4.7.*",
                "satooshi/php-coveralls": "1.0.*"
            },
            "type": "library",
            "autoload": {
                "psr-4": {
                    "Stash\\": "src/Stash/"
                }
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "BSD-3-Clause"
            ],
            "authors": [
                {
                    "name": "Robert Hafner",
                    "email": "tedivm@tedivm.com"
                },
                {
                    "name": "Josh Hall-Bachner",
                    "email": "charlequin@gmail.com"
                }
            ],
            "description": "The place to keep your cache.",
            "homepage": "http://github.com/tedious/Stash",
            "keywords": [
                "apc",
                "cache",
                "caching",
                "memcached",
                "redis",
                "sessions"
            ],
            "time": "2015-12-29T00:07:05+00:00"
        }
    ],
    "packages-dev": [],
    "aliases": [],
    "minimum-stability": "stable",
    "stability-flags": {
        "jasig/phpcas": 20
    },
    "prefer-stable": false,
    "prefer-lowest": false,
    "platform": [],
    "platform-dev": []
}
+12 −0
Original line number Original line Diff line number Diff line
<?xml version="1.0" encoding="UTF-8" ?>
<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
        <name>CAS Auth UNL</name>
        <author>UNL</author>
        <version>1.0</version>
        <description>CAS Authetication.  Modified from the original LDAP plugin for use at UNL.</description>

        <requires>
                <type>elgg_release</type>
                <version>1.9</version>
        </requires>
</plugin_manifest>
+105 −0
Original line number Original line Diff line number Diff line
<?php
require_once __DIR__ . '/../../elgg/vendor/autoload.php';

\Elgg\Application::start();

$lock_file = __DIR__ . '/migration.lock';

$lock = @file_get_contents($lock_file);

$lock_data = json_decode($lock, true);

if (!$lock) {
    $lock_data = array(
        'last_guid' => 0,
        'icontime' => 0
    );
}

if (!$users = @file_get_contents('https://planetred.unl.edu/sync.php?start='.$lock_data['last_guid'] . '&icontime='.$lock_data['icontime'])) {
    echo 'FAILED TO CONNECT' . PHP_EOL;
    exit();
}

$users = json_decode($users, true);

if (!$users) {
    echo 'FAILED TO DECODE' . PHP_EOL;
    exit();
}

//Copy over avatar stuffs
$context = stream_context_create(
    array(
        'http' => array(
            'follow_location' => false
        )
    )
);

$icon_sizes = array('master', 'large', 'medium', 'small', 'tiny', 'topbar');

foreach ($users as $source_user) {
    if (0 !== stripos($source_user['username'], 'unl_')) {
        //Not a UNL authenticated user
        continue;
    }

    $target_user = get_user_by_username($source_user['username']);
    
    if (!$target_user) {
        //create user
        echo 'creating user: ' . $source_user['username'] . PHP_EOL;

        $password = generate_random_cleartext_password();

        try {
            $target_guid = register_user($source_user['username'], $password, $source_user['name'], $source_user['email'], false);
        } catch (RegistrationException $e) {
            echo "\t Unable to create user: " . $e->getMessage() . PHP_EOL;
            continue;
        }
        
        if (!$target_guid) {
            continue;
        }
        
        $target_user = get_user($target_guid);
    }

    foreach ($icon_sizes as $size) {
        if (!$icon = @file_get_contents('http://planetred.unl.edu/pg/icon/'.$source_user['username'].'/'.$size, false, $context)) {
            //No icon was found, skip.
            echo 'SKIP' . PHP_EOL;
            continue;
        }
        
        echo 'Creating ' . $size . ' icon for ' . $source_user['username'] . PHP_EOL;

        $file = new ElggFile();
        $file->owner_guid = $target_user->guid;
        $file->setFilename("profile/{$target_user->guid}{$size}.jpg");
        $file->open('write');
        $file->write($icon);
        $file->close();
        
        //Don't overload the server
        usleep(500000);
    }

    // reset crop coordinates
    $target_user->x1 = 0;
    $target_user->x2 = 0;
    $target_user->y1 = 0;
    $target_user->y2 = 0;

    $target_user->icontime = time();
    
    //Update the lock file
    $lock_data = array(
        'last_guid' => $source_user['guid'],
        'icontime' => time()
    );
    
    file_put_contents($lock_file, json_encode($lock_data));
}
+10 −0
Original line number Original line Diff line number Diff line
# CAS AUTH UNL

This plugin implements SSO (single sign on) via CAS for UNL. It overrides the default login and logout actions, as well as implements auto-login via the presen of the UNL sso cookie.

Users who do not have an email address that is publicly available will be asked to provide one upon first login.

## Install
1. symlink to the elgg/mod directory
2. run composer install
3. Activate in the elgg admin interface
+308 −0
Original line number Original line Diff line number Diff line
<?php
    /**
     * Elgg UNL CAS authentication
     * 
     * @package cas_auth_unl
     * @license BSD http://www1.unl.edu/wdn/wiki/Software_License
     * @author University of Nebraska-Lincoln
     * @copyright 2010 Regents of the University of Nebraska 
     * @link http://www.unl.edu/
     */

    global $CONFIG;

    require_once __DIR__ . '/vendor/autoload.php';
 
    function cas_auth_unl_init() {
        global $CONFIG;
        
        $auth = new UnlCAS();
        $auth->autoLogin();
        $auth->singleLogOut();

        // Set up login page, this creates the url /login to be used as our login page
        elgg_register_page_handler('login', 'cas_auth_unl_login_page_handler');
        elgg_register_page_handler('logout', 'cas_auth_unl_logout_page_handler');
        elgg_register_page_handler('register', 'cas_auth_unl_registration_page_handler');
        
        /* set up getemail page */
        elgg_register_page_handler('getemail', 'cas_auth_unl_getemail_page_handler');

        elgg_register_action('getemail', $CONFIG->pluginspath . 'cas_auth_unl/actions/getemail.php', 'public');
        elgg_register_action('logout', $CONFIG->pluginspath . 'cas_auth_unl/actions/logout.php', 'public');
    }

    // Fire up the plugin initialization using the elgg handler
    elgg_register_event_handler('init','system','cas_auth_unl_init');

    function cas_auth_unl_login_page_handler($page = NULL) {
        // If we're not logged in, display the login page
        if (!elgg_is_logged_in()) {
            $auth = new UnlCAS();
            $auth->forceLogin();
        }

        // Otherwise, forward to the index page
        forward();
    }
    
    function cas_auth_unl_logout_page_handler($page = NULL) {
        if (elgg_is_logged_in()) {
            // If we're not logged in, display the login page
            $auth = new UnlCAS();
            $auth->forceLogout();
        }
        
        // Otherwise, forward to the index page
        forward();
    }

    function cas_auth_unl_registration_page_handler($page = NULL) {
        if (elgg_is_logged_in()) {
            // Otherwise, forward to the index page
            forward();
        }

        if (!isset($_SESSION['cas_auth_unl']['register']['uid'])) {
            //They are not already in the registration process
            forward();
        }

        if (!isset($_POST['email'])) {
            forward();
        }
        
        // If we're not logged in, display the login page
        $auth = new UnlCAS();
        $unl_uid = $_SESSION['cas_auth_unl']['register']['uid'];
        $auth->register($unl_uid, $_POST['email']);
        $auth->login($unl_uid);
        forward();
    }

    function cas_auth_unl_getemail_page_handler($page = NULL) {
        if (!elgg_get_logged_in_user_entity()) {
            echo elgg_view_page(elgg_echo('Your Email'), elgg_view("account/forms/getemail")); 
        } else {
            forward();
        }
    }
    
class UnlCAS {
    
    var $client;  
    var $casInitialized = false;
    
    const DIRECTORY_URL = 'https://directory.unl.edu/';
    
    public static $cert_path = '/etc/pki/tls/cert.pem';
    
    function __construct() {
        if (!\phpCAS::isInitialized()) {
            \phpCAS::client(CAS_VERSION_2_0, 'shib.unl.edu', 443, 'idp/profile/cas');
            \phpCAS::setCasServerCACert(self::$cert_path);
            
            \phpCAS::setPostAuthenticateCallback(function($logoutTicket) {
                $auth = new UnlCAS();
                $auth->loginOrRegister(\phpCAS::getUser());

                $session = elgg_get_session();

                $pool = $auth->getSessionMapPool();
                $item = $pool->getItem($logoutTicket);
                $item->set(array(
                    'session_id' => $session->getId(),
                    'date_created' => time()
                ));
            });
            
            \phpCAS::setSingleSignoutCallback(function ($logoutTicket) {
                $auth = new UnlCAS();
                $pool = $auth->getSessionMapPool();
                $item = $pool->getItem($logoutTicket);

                if ($item->isMiss()) {
                    return null;
                }
                
                $data = $item->get();

                $handler = new Elgg\Http\DatabaseSessionHandler(_elgg_services()->db);
                if (!$handler->destroy($data['session_id'])) {
                    throw new \Exception('unable to destroy session on single sign out');
                }
                
                //Remove the cached item
                $item->clear();
            });
            
        }
    }
    
    public function getSessionMapPool()
    {
        // Setting a custom path is done by passing an options array to the constructor.
        $options = array('path' => __DIR__ .'/../../tmp/elgg_session_map');
        
        $driver = new Stash\Driver\FileSystem($options);

        $pool = new Stash\Pool($driver);
        
        return $pool;
    }
    
    public function singleLogOut()
    {
        \phpCAS::handleLogoutRequests(false);
    }
    
    public function autoLogin()
    {
        if ('pg' == elgg_get_context() && false !== strpos($_SERVER['REQUEST_URI'], '/pg/icon/')) {
            //Don't auto-login on profile icon view
            return;
        }
        
        if (false !== strpos($_SERVER['REQUEST_URI'], '/mod/profile/icondirect.php')) {
            //prevent auto-login for the icondirect.php endpoint too
            return;
        }

        if (!array_key_exists('unl_sso', $_COOKIE)) {
            //No unl_sso cookie was found, no need to auto-login.
            return;
        }
        
        if (elgg_get_logged_in_user_entity()) {
            //We are already logged in, no need to auto-login
            return;
        }
        
        //Everything looks good.  Log in!
        $result = \phpCAS::checkAuthentication();

        if ($result) {
            //Make sure we are still authenticated with CAS
            //setPostAuthenticateCallback() will actually do the work
            \phpCAS::renewAuthentication();
        }
    }
    
    protected function loginOrRegister($unl_uid)
    {
        $elgg_uid = $this->toElggUID($unl_uid);
        $user = get_user_by_username($elgg_uid);
        
        if (!$user) {
            $this->register($unl_uid);
            $this->login($unl_uid);
        } else {
            $this->login($unl_uid);
        }
    }
    
    public function login($unl_uid)
    {
        $user = get_user_by_username($this->toElggUID($unl_uid));

        //Log the user into elgg
        login($user);
    }
    
    public function register($unl_uid, $student_email = false)
    {
        $elgg_uid = $this->toElggUID($unl_uid);
        $directory_info = $this->getDirectoryInfo($unl_uid);
        
        $name = 'unknown';
        $email = false;
        
        if ($student_email) {
            $email = $student_email;
        }
        
        if (isset($directory_info['name'])) {
            $name = $directory_info['name'];
        }
        
        if (isset($directory_info['email'])) {
            //Override the student email with the one from the directory
            $email = $directory_info['email'];
        }
        
        if (false === $email) {
            $_SESSION['cas_auth_unl']['register']['uid'] = $unl_uid;
            forward('getemail');
        }
        
        $password = generate_random_cleartext_password();
        
        try {
            $user_guid = register_user($elgg_uid, $password, $name, $email, false);
        } catch (RegistrationException $e) {
            //Looks like we had an invalid email address... ask for it again.
            register_error(elgg_echo($e->getMessage()));
            forward('getemail');
        }
        
        if (!$user_guid) {
            register_error(elgg_echo("registerbad"));
        }
        
        //Make sure that this gets unset
        unset($_SESSION['cas_auth_unl']);
        
        return true;
    }
    
    protected function getDirectoryInfo($uid)
    {
        $info = array();

        if (!$json = @file_get_contents(self::DIRECTORY_URL . '?uid=' . $uid . '&format=json')) {
            return $info;
        }

        if (!$json = json_decode($json, true)) {
            return $info;
        }

        $map = array(
            'givenName' => 'first_name',
            'sn' => 'last_name',
            'mail' => 'email'
        );

        foreach ($map as $from => $to) {
            if (isset($json[$from][0])) {
                $info[$to] = $json[$from][0];
            }
        }
        
        $info['name'] = $info['first_name'] . ' ' . $info['last_name'];

        return $info;
    }
    
    protected function toElggUID($unl_uid)
    {
        $unl_uid = str_replace('-','_',$unl_uid);
        return 'unl_' . $unl_uid;
    }
    
    public function forceLogin() {
        //Due to the weirdness of phpCAS, it might think we are still logged in (when we are not)
        $_SESSION['phpCAS'] = array();

        \phpCAS::forceAuthentication();
    }
    
    public function forceLogout()
    {
        //log out of elgg
        logout();
        
        //log out of CAS
        \phpCAS::logout();
    }
}
Original line number Original line Diff line number Diff line
<?php
 /**
 * Elgg Get Email Only SSO register form
 * 
 * @package Elgg
 * @subpackage Core
 * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
 * @author Curverider Ltd
 * @copyright Curverider Ltd 2008-2009
 * @link http://elgg.org/
 */

// if we're returning from a failed email validation, we'll put the failed email in the email form field
$theiremail = get_input('e');
?>
<h2  class="sec_header">Email Verification</h2>
<div class="three_col left">
    <p>We just want to make sure we have your correct e-mail and then we'll log you in.</p>
    <?php 
    $form_body = "<p><label>" . elgg_echo('email') . "<br />" . elgg_view('input/text' , array('name' => 'email', 'class' => "general-textarea", 'value' => $theiremail)) . "</label><br />";
    $form_body .= elgg_view('input/submit', array('value' => elgg_echo('Complete Registration and Login!'))) ."</p>";
    
    $ts = time();
    $token = generate_action_token($ts); 
    echo elgg_view('input/form', array('body' => $form_body, 'action' => $vars['url']."register?__elgg_ts=$ts&__elgg_token=$token"));
    ?>
</div>
<div class="col right">
    <div class="zenbox cool">
        <h3>Email Address Usage</h3>
     <p>Your email address is only used to send notifications from Planet Red.</p>
    </div>
</div>
+104 −0
Original line number Original line Diff line number Diff line
Version History
===============

4.1 (2015-12-17):

- added: admin option to disable river item creation (fixes #5)
- added: composer support
- chore: refactoring for performance and coding style

4.0 (2014-11-10):

- changes for Elgg 1.9

3.3.1 (2014-11-10):

- changed: restored the default events, couldn't find the reason for the removal (fixes #4)
- applied Elgg coding standards

3.3 (2013-04-05):

- added: Spanish translation (thanks to Iknaxio Marx http://community.elgg.org/profile/iknaxio)
- added: notification on friend accept
- added: French translation (thanks to https://github.com/GeekShadow PR #3)
- changed: layout and code cleanup
- changed: styling of topbar icon (inspired by https://github.com/minhtinh2604 PR #1)
- removed: CSS because it's no longer needed

3.2 (2012-06-11):

- added: direct link to add/remove friend in member listing
- added: Dutch translation
- added: river view now works both ways
- added: river cleanup
- fixed: small error in Englisch language file (thanks to Matt Beckett http://community.elgg.org/pg/profile/Beck24)
- fixed: old link in notification
- changed: small code optimalizations

3.1 (2012-03-02):

- added: german translation (thanks to Opteron http://community.elgg.org/pg/profile/Opteron)
- fixed: wrong link in new request notify (thanks to Lee http://community.elgg.org/pg/profile/8toenails)

3.0.2 (2011-12-23):

- fixed: river events in Elgg 1.8.1+
- changed: required Elgg version to 1.8.1

3.0.1 (2011-11-28):

- fixed: page_handler issue with Elgg 1.8.1
- changed: moved version history from README.txt to CHANGES.txt

3.0 (2011-11-08):

- changed: Elgg 1.8 compatibility

2.3 (2011-09-23):

- added: dutch translation
- fixed: link on profile actions when pending friend request

2.2.4 (2011-09-19):

- fixed: elgg depricated functions
- changed: used more elgg functions
- changed: user profile menu now shows pending request

2.2.3 (2011-08-10):

- fixed: conflict with invitefriends (thanks to AV-2 http://community.elgg.org/pg/profile/vectorraster)

2.2.2 (2011-06-21):

- fixed: depricated notice in start.php
	
2.2.1 (2011-06-15):

- changed: layout of listings
- fixed: depricated notice in topbar

2.2:

- changed: removed action_gatekeepers from actions
	
2.1:

- added: CSS fix to hide friendsof on profile and user pulldown menu
- added: friends menu no longer showing friendsof
- fixed: collections links now showing
- changed: menu title language handling
- changed: CSS for topbar
	
2.0:

- added: menu options in friends and messages
- added: option to revoke a request
- added: listing of sent requests
- changed: listing of received friend requests
- changed: Elgg topbar icon
	
1.5:

- latest release by Bosssumon and Zac Hopkinson
 No newline at end of file
+18 −0
Original line number Original line Diff line number Diff line
Friend request
==============

[![Build Status](https://scrutinizer-ci.com/g/ColdTrick/friend_request/badges/build.png?b=master)](https://scrutinizer-ci.com/g/ColdTrick/friend_request/build-status/master)
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/ColdTrick/friend_request/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/ColdTrick/friend_request/?branch=master)
[![Latest Stable Version](https://poser.pugx.org/coldtrick/friend_request/v/stable.svg)](https://packagist.org/packages/coldtrick/friend_request)
[![License](https://poser.pugx.org/coldtrick/friend_request/license.svg)](https://packagist.org/packages/coldtrick/friend_request)

Let users confirm friend requests. Make all friend requests reciprocal.

Features
-----------

- Add friends like on Facebook / LinkedIn, so you have to approve a request

Credits
----------
The original idea for this plugin was made by Bosssumon and Zac Hopkinson
Original line number Original line Diff line number Diff line
<?php
	
$friend_guid = (int) get_input('guid');
$friend = get_user($friend_guid);
if (empty($friend)) {
	register_error(elgg_echo('error:missing_data'));
	forward(REFERER);
}

$user = elgg_get_logged_in_user_entity();

if (!remove_entity_relationship($friend->getGUID(), 'friendrequest', $user->getGUID())) {
	register_error(elgg_echo('friend_request:approve:fail', [$friend->name]));
	forward(REFERER);
}

$user->addFriend($friend->getGUID());
$friend->addFriend($user->getGUID()); //Friends mean reciprical...

// notify the user about the acceptance
$subject = elgg_echo('friend_request:approve:subject', [$user->name]);
$message = elgg_echo('friend_request:approve:message', [$friend->name, $user->name]);

$params = [
	'action' => 'add_friend',
	'object' => $user,
];
notify_user($friend->getGUID(), $user->getGUID(), $subject, $message, $params);

// add to river
friend_request_create_river_events($user->getGUID(), $friend->getGUID());

system_message(elgg_echo('friend_request:approve:successful', [$friend->name]));

forward(REFERER);
Original line number Original line Diff line number Diff line
<?php
	
$friend_guid = (int) get_input('guid');

$friend = get_user($friend_guid);
if (empty($friend)) {
	register_error(elgg_echo('error:missing_data'));
	forward(REFERER);
}

$user = elgg_get_logged_in_user_entity();

if (!remove_entity_relationship($friend->getGUID(), 'friendrequest', $user->getGUID())) {
	register_error(elgg_echo('friend_request:decline:fail'));
	forward(REFERER);
}

$subject = elgg_echo('friend_request:decline:subject', [$user->name]);
$message = elgg_echo('friend_request:decline:message', [$friend->name, $user->name]);

$params = [
	'action' => 'friend_request_decline',
	'object' => $user,
];

notify_user($friend->getGUID(), $user->getGUID(), $subject, $message, $params);

system_message(elgg_echo('friend_request:decline:success'));

forward(REFERER);
Original line number Original line Diff line number Diff line
<?php
	
//Get our data
$friend_guid = (int) get_input('friend');
$friend = get_user($friend_guid);

$user = elgg_get_logged_in_user_entity();

// Now we need to attempt to create the relationship
if (empty($user) || empty($friend)) {
	register_error(elgg_echo('friend_request:add:failure'));
	forward(REFERER);
}

// New for v1.1 - If the other user is already a friend (fan) of this user we should auto-approve the friend request...
if (check_entity_relationship($friend->getGUID(), 'friend', $user->getGUID())) {
	try {
		
		$user->addFriend($friend->getGUID());
		
		system_message(elgg_echo('friends:add:successful', [$friend->name]));
		forward(REFERER);
	} catch (Exception $e) {
		register_error(elgg_echo('friends:add:failure', [$friend->name]));
		forward(REFERER);
	}
} elseif (check_entity_relationship($friend->getGUID(), 'friendrequest', $user->getGUID())) {
	// Check if your potential friend already invited you, if so make friends
	if (remove_entity_relationship($friend->getGUID(), 'friendrequest', $user->getGUID())) {
		
		// Friends mean reciprical...
		$user->addFriend($friend->getGUID());
		$friend->addFriend($user->getGUID());
		
		system_message(elgg_echo('friend_request:approve:successful', [$friend->name]));
		
		// add to river
		friend_request_create_river_events($user->getGUID(), $friend->getGUID());
		
		forward(REFERER);
	} else {
		register_error(elgg_echo('friend_request:approve:fail', [$friend->name]));
		forward(REFERER);
	}
} else {
	try {
		if (!add_entity_relationship($user->getGUID(), 'friendrequest', $friend->getGUID())) {
			register_error(elgg_echo('friend_request:add:exists', [$friend->name]));
			forward(REFERER);
		}
	} catch (Exception $e) {
		// add_entity_relationship calls insert_data which CAN raise Exceptions.
		register_error(elgg_echo('friend_request:add:exists', [$friend->name]));
		forward(REFERER);
	}
}

system_message(elgg_echo('friend_request:add:successful', array($friend->name)));
forward(REFERER);
Original line number Original line Diff line number Diff line
<?php
	
// Get the GUID of the user to friend
$friend_guid = (int) get_input('friend');

// Get the user
$friend = get_user($friend_guid);
if (empty($friend)) {
	register_error(elgg_echo('error:missing_data'));
	forward(REFERER);
}

$user = elgg_get_logged_in_user_entity();

// remove friend from user
try {
	$user->removeFriend($friend->getGUID());
	
	// remove river items
	elgg_delete_river([
		'view' => 'river/relationship/friend/create',
		'subject_guid' => $user->getGUID(),
		'object_guid' => $friend->getGUID(),
	]);
} catch (Exception $e) {
	register_error(elgg_echo('friends:remove:failure', [$friend->name]));
	forward(REFERER);
}

// remove user from friend
try {
	// V1.1 - Old relationships might not have the 2 as friends...
	$friend->removeFriend($user->getGUID());

	// remove river items
	elgg_delete_river([
	'view' => 'river/relationship/friend/create',
	'subject_guid' => $friend->getGUID(),
	'object_guid' => $user->getGUID(),
	]);
} catch (Exception $e) {
	// do nothing
}

system_message(elgg_echo('friends:remove:successful', [$friend->name]));
forward(REFERER);
Original line number Original line Diff line number Diff line
<?php
	
$friend_guid = (int) get_input('guid');
$friend = get_user($friend_guid);
if (empty($friend)) {
	register_error(elgg_echo('error:missing_data'));
	forward(REFERER);
}

$user = elgg_get_logged_in_user_entity();

if (remove_entity_relationship($user->getGUID(), 'friendrequest', $friend->getGUID())) {
	system_message(elgg_echo('friend_request:revoke:success'));
} else {
	register_error(elgg_echo('friend_request:revoke:fail'));
}

forward(REFERER);
Original line number Original line Diff line number Diff line
<?php

namespace ColdTrick\FriendRequest;

class PageHandler {
	
	/**
	 * Handle /friend_request pages
	 *
	 * @param array $page the url segments
	 *
	 * @return bool
	 */
	public static function friendRequest($page) {
		
		$include_file = false;
		$pages_path = elgg_get_plugins_path() . 'friend_request/pages/';
		
		if (isset($page[0])) {
			set_input('username', $page[0]);
			
			$include_file = "{$pages_path}index.php";
		}
		
		if (!empty($include_file)) {
			include($include_file);
			return true;
		}
		
		return false;
	}
}
Original line number Original line Diff line number Diff line
<?php

namespace ColdTrick\FriendRequest;

class PageMenu {
	
	/**
	 * Remove menu items from the page menu
	 *
	 * @param string          $hook         the name of the hook
	 * @param string          $type         the type of the hook
	 * @param \ElggMenuItem[] $return_value the current return value
	 * @param array           $params       supplied params
	 *
	 * @return void|\ElggMenuItem[]
	 */
	public static function registerCleanup($hook, $type, $return_value, $params) {
		
		if (empty($return_value) || !is_array($return_value)) {
			return;
		}
		
		$remove_items = [
			'friends:of',
		];
		foreach ($return_value as $index => $menu_item) {
			if (!in_array($menu_item->getName(), $remove_items)) {
				continue;
			}
			
			unset($return_value[$index]);
		}
		
		return $return_value;
	}
	
	/**
	 * Add menu items to the page menu
	 *
	 * @param string          $hook         the name of the hook
	 * @param string          $type         the type of the hook
	 * @param \ElggMenuItem[] $return_value the current return value
	 * @param array           $params       supplied params
	 *
	 * @return void|\ElggMenuItem[]
	 */
	public static function register($hook, $type, $return_value, $params) {
		
		$page_owner = elgg_get_page_owner_entity();
		if (!($page_owner instanceof \ElggUser)) {
			return;
		}
		
		if (!$page_owner->canEdit()) {
			return;
		}
		
		// count pending requests
		$options = [
			'type' => 'user',
			'count' => true,
			'relationship' => 'friendrequest',
			'relationship_guid' => $page_owner->getGUID(),
			'inverse_relationship' => true,
		];
		
		$count = elgg_get_entities_from_relationship($options);
		$extra = '';
		if (!empty($count)) {
			$extra = ' [' . $count . ']';
		}
		
		// add menu item
		$return_value[] = \ElggMenuItem::factory([
			'name' => 'friend_request',
			'text' => elgg_echo('friend_request:menu') . $extra,
			'href' => "friend_request/{$page_owner->username}",
			'contexts' => ['friends', 'friendsof', 'collections', 'messages'],
		]);
		
		return $return_value;
	}
		
}
Original line number Original line Diff line number Diff line
<?php

namespace ColdTrick\FriendRequest;

class Relationships {
	
	/**
	 * Send a notification on a friend request
	 *
	 * @param string            $event        the name of the event
	 * @param string            $type         the type of the event
	 * @param \ElggRelationship $relationship supplied param
	 *
	 * @return void
	 */
	public static function createFriendRequest($event, $type, $relationship) {
		
		if (!($relationship instanceof \ElggRelationship)) {
			return;
		}
		
		if ($relationship->relationship !== 'friendrequest') {
			return;
		}
		
		$requester = get_user($relationship->guid_one);
		$new_friend = get_user($relationship->guid_two);
		
		if (empty($requester) || empty($new_friend)) {
			return;
		}
		
		$view_friends_url = elgg_normalize_url("friend_request/{$new_friend->username}");
		
		// Notify target user
		$subject = elgg_echo('friend_request:newfriend:subject', [$requester->name]);
		$message = elgg_echo('friend_request:newfriend:body', [
			$requester->name,
			$view_friends_url
		]);
		
		$params = [
			'action' => 'friend_request',
			'object' => $requester,
		];
		notify_user($new_friend->getGUID(), $requester->getGUID(), $subject, $message, $params);
	}
}
Original line number Original line Diff line number Diff line
<?php

namespace ColdTrick\FriendRequest;

class TopbarMenu {
	
	/**
	 * Add menu items to the topbar
	 *
	 * @param string          $hook         the name of the hook
	 * @param string          $type         the type of the hook
	 * @param \ElggMenuItem[] $return_value the current return value
	 * @param array           $params       supplied params
	 *
	 * @return void|\ElggMenuItem[]
	 */
	public static function register($hook, $type, $return_value, $params) {
		
		$user = elgg_get_logged_in_user_entity();
		if (empty($user)) {
			return;
		}
		
		$options = [
			'type' => 'user',
			'count' => true,
			'relationship' => 'friendrequest',
			'relationship_guid' => $user->getGUID(),
			'inverse_relationship' => true,
		];
	
		$count = elgg_get_entities_from_relationship($options);
		if (empty($count)) {
			return;
		}
		
		$return_value[] = \ElggMenuItem::factory([
			'name' => 'friend_request',
			'href' => "friend_request/{$user->username}",
			'text' => elgg_view_icon('user') . elgg_format_element('span', ['class' => 'friend-request-new'], $count),
			'title' => elgg_echo('friend_request:menu'),
			'priority' => 301
		]);
		
		return $return_value;
	}
}
Original line number Original line Diff line number Diff line
<?php

namespace ColdTrick\FriendRequest;

class Users {
	
	/**
	 * Add menu items to the entity menu
	 *
	 * @param string          $hook         the name of the hook
	 * @param string          $type         the type of the hook
	 * @param \ElggMenuItem[] $return_value the current return value
	 * @param array           $params       supplied params
	 *
	 * @return void|\ElggMenuItem[]
	 */
	public static function registerEntityMenu($hook, $type, $return_value, $params) {
		
		if (empty($params) || !is_array($params)) {
			return;
		}
		
		$user = elgg_get_logged_in_user_entity();
		if (empty($user)) {
			return;
		}
		
		$entity = elgg_extract('entity', $params);
		if (!($entity instanceof \ElggUser)) {
			return;
		}
		
		if ($entity->getGUID() === $user->getGUID()) {
			// looking at yourself
			return;
		}
		
		// are we friends
		if (!$entity->isFriendOf($user->getGUID())) {
			// no, check if pending request
			if (check_entity_relationship($user->getGUID(), 'friendrequest', $entity->getGUID())) {
				// pending request
				$return_value[] = \ElggMenuItem::factory([
					'name' => 'friend_request',
					'text' => elgg_echo('friend_request:friend:add:pending'),
					'href' => "friend_request/{$user->username}#friend_request_sent_listing",
					'priority' => 500,
				]);
			} else {
				// add as friend
				$return_value[] = \ElggMenuItem::factory([
					'name' => 'add_friend',
					'text' => elgg_echo('friend:add'),
					'href' => "action/friends/add?friend={$entity->getGUID()}",
					'is_action' => true,
					'priority' => 500,
				]);
			}
		} else {
			// is friend, se remove friend link
			$return_value[] = \ElggMenuItem::factory([
				'name' => 'remove_friend',
				'text' => elgg_echo('friend:remove'),
				'href' => "action/friends/remove?friend={$entity->getGUID()}",
				'is_action' => true,
				'priority' => 500,
			]);
		}
		
		return $return_value;
	}
	
	/**
	 * Add menu items to the hover menu
	 *
	 * @param string          $hook         the name of the hook
	 * @param string          $type         the type of the hook
	 * @param \ElggMenuItem[] $return_value the current return value
	 * @param array           $params       supplied params
	 *
	 * @return void|\ElggMenuItem[]
	 */
	public static function registerUserHoverMenu($hook, $type, $return_value, $params) {
		
		if (empty($params) || !is_array($params)) {
			return;
		}
	
		$user = elgg_get_logged_in_user_entity();
		if (empty($user)) {
			return;
		}
		
		$entity = elgg_extract('entity', $params);
		if (!($entity instanceof \ElggUser)) {
			return;
		}
		
		if ($entity->getGUID() === $user->getGUID()) {
			// looking at yourself
			return;
		}
		
		$requested = check_entity_relationship($user->getGUID(), 'friendrequest', $entity->getGUID());
		$is_friend = $entity->isFriend($user->getGUID());
		
		foreach ($return_value as $index => $item) {
			// change the text of the button to tell you already requested a friendship
			switch ($item->getName()) {
				case 'add_friend':
					if ($requested) {
						$item->setItemClass('hidden');
					}
					
					break;
				case 'remove_friend':
					if (!$requested && !$is_friend) {
						unset($return_value[$index]);
					}
					break;
			}
		}
		
		if ($requested) {
			$return_value[] = \ElggMenuItem::factory([
				'name' => 'friend_request',
				'text' => elgg_echo('friend_request:friend:add:pending'),
				'href' => "friend_request/{$user->username}#friend_request_sent_listing",
				'section' => 'action',
			]);
		}
		
		return $return_value;
	}
}
+18 −0
Original line number Original line Diff line number Diff line
{
	"name": "coldtrick/friend_request",
	"description": "Let users confirm friend requests. Make friends like on Facebook or LinkedIn",
	"type": "elgg-plugin",
	"keywords": ["elgg", "plugin", "friends"],
	"license": "GPL-2.0",
	"support": {
		"source": "https://github.com/ColdTrick/friend_request",
		"issues": "https://github.com/ColdTrick/friend_request/issues"
	},
	"require": {
		"composer/installers": "^1.0.8"
	},
	"require-dev": {
		"coldtrick/sniffs": "dev-master"
	}
}
 No newline at end of file
+224 −0
Original line number Original line Diff line number Diff line
{
    "_readme": [
        "This file locks the dependencies of your project to a known state",
        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
        "This file is @generated automatically"
    ],
    "hash": "b1d86b10fb2064dd6babf7236e7b0182",
    "content-hash": "9964fcb7fc93e622d853d45a46febc22",
    "packages": [
        {
            "name": "composer/installers",
            "version": "v1.0.22",
            "source": {
                "type": "git",
                "url": "https://github.com/composer/installers.git",
                "reference": "bd9b14f094c89c8b5804a4e41edeb7853bb85046"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/composer/installers/zipball/bd9b14f094c89c8b5804a4e41edeb7853bb85046",
                "reference": "bd9b14f094c89c8b5804a4e41edeb7853bb85046",
                "shasum": ""
            },
            "require": {
                "composer-plugin-api": "1.0.0"
            },
            "replace": {
                "roundcube/plugin-installer": "*",
                "shama/baton": "*"
            },
            "require-dev": {
                "composer/composer": "1.0.*@dev",
                "phpunit/phpunit": "4.1.*"
            },
            "type": "composer-plugin",
            "extra": {
                "class": "Composer\\Installers\\Plugin",
                "branch-alias": {
                    "dev-master": "1.0-dev"
                }
            },
            "autoload": {
                "psr-0": {
                    "Composer\\Installers\\": "src/"
                }
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Kyle Robinson Young",
                    "email": "kyle@dontkry.com",
                    "homepage": "https://github.com/shama"
                }
            ],
            "description": "A multi-framework Composer library installer",
            "homepage": "http://composer.github.com/installers/",
            "keywords": [
                "Craft",
                "Dolibarr",
                "Hurad",
                "MODX Evo",
                "OXID",
                "SMF",
                "Thelia",
                "WolfCMS",
                "agl",
                "aimeos",
                "annotatecms",
                "bitrix",
                "cakephp",
                "chef",
                "codeigniter",
                "concrete5",
                "croogo",
                "dokuwiki",
                "drupal",
                "elgg",
                "fuelphp",
                "grav",
                "installer",
                "joomla",
                "kohana",
                "laravel",
                "lithium",
                "magento",
                "mako",
                "mediawiki",
                "modulework",
                "moodle",
                "phpbb",
                "piwik",
                "ppi",
                "puppet",
                "roundcube",
                "shopware",
                "silverstripe",
                "symfony",
                "typo3",
                "wordpress",
                "zend",
                "zikula"
            ],
            "time": "2015-10-29 23:28:48"
        }
    ],
    "packages-dev": [
        {
            "name": "coldtrick/sniffs",
            "version": "dev-master",
            "source": {
                "type": "git",
                "url": "https://github.com/ColdTrick/elgg-coding-standards.git",
                "reference": "694bae972522ffbec467a7a9b6a2f4299beb47e6"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/ColdTrick/elgg-coding-standards/zipball/694bae972522ffbec467a7a9b6a2f4299beb47e6",
                "reference": "694bae972522ffbec467a7a9b6a2f4299beb47e6",
                "shasum": ""
            },
            "require": {
                "squizlabs/php_codesniffer": ">=1.3.4"
            },
            "type": "library",
            "autoload": {
                "psr-0": {
                    "Elgg_Sniffs_": "src/"
                }
            },
            "notification-url": "https://packagist.org/downloads/",
            "description": "Elgg coding standards",
            "time": "2015-02-17 14:47:25"
        },
        {
            "name": "squizlabs/php_codesniffer",
            "version": "2.5.0",
            "source": {
                "type": "git",
                "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
                "reference": "e4fb41d5d0387d556e2c25534d630b3cce90ea67"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/e4fb41d5d0387d556e2c25534d630b3cce90ea67",
                "reference": "e4fb41d5d0387d556e2c25534d630b3cce90ea67",
                "shasum": ""
            },
            "require": {
                "ext-tokenizer": "*",
                "ext-xmlwriter": "*",
                "php": ">=5.1.2"
            },
            "require-dev": {
                "phpunit/phpunit": "~4.0"
            },
            "bin": [
                "scripts/phpcs",
                "scripts/phpcbf"
            ],
            "type": "library",
            "extra": {
                "branch-alias": {
                    "dev-master": "2.0.x-dev"
                }
            },
            "autoload": {
                "classmap": [
                    "CodeSniffer.php",
                    "CodeSniffer/CLI.php",
                    "CodeSniffer/Exception.php",
                    "CodeSniffer/File.php",
                    "CodeSniffer/Fixer.php",
                    "CodeSniffer/Report.php",
                    "CodeSniffer/Reporting.php",
                    "CodeSniffer/Sniff.php",
                    "CodeSniffer/Tokens.php",
                    "CodeSniffer/Reports/",
                    "CodeSniffer/Tokenizers/",
                    "CodeSniffer/DocGenerators/",
                    "CodeSniffer/Standards/AbstractPatternSniff.php",
                    "CodeSniffer/Standards/AbstractScopeSniff.php",
                    "CodeSniffer/Standards/AbstractVariableSniff.php",
                    "CodeSniffer/Standards/IncorrectPatternException.php",
                    "CodeSniffer/Standards/Generic/Sniffs/",
                    "CodeSniffer/Standards/MySource/Sniffs/",
                    "CodeSniffer/Standards/PEAR/Sniffs/",
                    "CodeSniffer/Standards/PSR1/Sniffs/",
                    "CodeSniffer/Standards/PSR2/Sniffs/",
                    "CodeSniffer/Standards/Squiz/Sniffs/",
                    "CodeSniffer/Standards/Zend/Sniffs/"
                ]
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "BSD-3-Clause"
            ],
            "authors": [
                {
                    "name": "Greg Sherwood",
                    "role": "lead"
                }
            ],
            "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
            "homepage": "http://www.squizlabs.com/php-codesniffer",
            "keywords": [
                "phpcs",
                "standards"
            ],
            "time": "2015-12-11 00:12:46"
        }
    ],
    "aliases": [],
    "minimum-stability": "stable",
    "stability-flags": {
        "coldtrick/sniffs": 20
    },
    "prefer-stable": false,
    "prefer-lowest": false,
    "platform": [],
    "platform-dev": []
}
+55 −0
Original line number Original line Diff line number Diff line
<?php
    $german = array(
        'friend_request' => "Freundschaftsanfrage",
        'friend_request:menu' => "Freundschaftsanfragen",
        'friend_request:title' => "Freundschaftsanfragen für: %s",
   
        'friend_request:new' => "Neue Freundschaftsanfrage",
       
        'friend_request:friend:add:pending' => "Ausstehende Freundschaftsanfragen",
       
        'friend_request:newfriend:subject' => "%s möchte mit dir befreundet sein!",
        'friend_request:newfriend:body' => "%s möchte mit dir befreundet sein und wartet auf deine Bestätigung! Logge dich jetzt ein um die Anfrage zu Bestätigen!

Du kannst ausstehende Freundschaftsanfragen hier (Stelle sicher, dass du eingeloggt bist, bevor du auf den folgenden Link klickst, ansonsten wirst du nur zum Login weitergeleitet.):

%s

(Diese Email kann nicht beantwortet werden.)",
       
        // Actions
        // Anfragen
        'friend_request:add:failure' => "Sorry, aufgrund eines Systemfehlers konnte deine Freundschaftsanfragen nicht abgeschlossen werden. Bitte versuche es erneut.",
        'friend_request:add:successful' => "Du hast %s eine Freundschaftsanfrage gesendet. Die Freundschaftsanfrage muss erst bestätigt werden, bevor sie/er deiner Freundesliste hinzugefügt wird.",
        'friend_request:add:exists' => "Du hast %s bereits eine Freundschaftsanfrage gesendet.",
       
        // Bestätigte Anfragen
        'friend_request:approve' => "Bestätigen",
        'friend_request:approve:successful' => "%s ist nun mit dir befreundet",
        'friend_request:approve:fail' => "Während des anfreundens mit %s ist ein Fehler aufgetreten",
   
        // Abgelehnte Anfragen
        'friend_request:decline' => "Ablehnen",
        'friend_request:decline:subject' => "%s hat deine Freundschaftsanfrage abgelehnt",
        'friend_request:decline:message' => "Liebe/r %s,

%s hat deine Freundschaftsanfrage abgelehnt.",
        'friend_request:decline:success' => "Freundschaftsanfrage abgelehnt",
        'friend_request:decline:fail' => "Während der Ablehnung der Freundschaftsanfrage ist ein Fehler aufgetreten. Bitte versuche es erneut.",
       
        // Widerrufene Anfragen
        'friend_request:revoke' => "Widerrufen",
        'friend_request:revoke:success' => "Die Freundschaftsanfragen wurde widerrufen",
        'friend_request:revoke:fail' => "Während des Widerrufs der Freundschaftsanfrage ist ein Fehler aufgetreten. Bitte versuche es erneut.",
   
        // Views
        // Empfangen
        'friend_request:received:title' => "Empfangene Freundschaftsanfragen",
        'friend_request:received:none' => "Es warten keine ausstehenden Freundschaftsanfragen auf Bestätigung.",
   
        // Gesendet
        'friend_request:sent:title' => "Gesendete Freundschaftsanfragen",
        'friend_request:sent:none' => "Es stehen keine gesendete Freundschaftsanfragen aus",
    );
                   
    add_translation("de", $german);
+63 −0
Original line number Original line Diff line number Diff line
<?php

return [
	'friend_request' => "Friend Request",
	'friend_request:menu' => "Friend Requests",
	'friend_request:title' => "Friend Requests for: %s",

	'friend_request:new' => "New friend request",
	
	'friend_request:friend:add:pending' => "Friend request pending",
	
	// plugins settings
	'friend_request:settings:add_river' => "Create river entries when a friend request is accepted",
	
	// notifications
	'friend_request:newfriend:subject' => "%s wants to be your friend!",
	'friend_request:newfriend:body' => "%s wants to be your friend! But they are waiting for you to approve the request...so login now so you can approve the request!

You can view your pending friend requests at:
%s

Make sure you are logged into the website before clicking on the following link otherwise you will be redirected to the login page.

(You cannot reply to this email.)",
		
	// Actions
	// Add request
	'friend_request:add:failure' => "Sorry, because of a system error we were unable to complete your request. Please try again.",
	'friend_request:add:successful' => "You have requested to be friends with %s. They must approve your request before they will show on your friends list.",
	'friend_request:add:exists' => "You've already requested to be friends with %s.",
	
	// Approve request
	'friend_request:approve' => "Approve",
	'friend_request:approve:subject' => "%s has accepted your friend request",
	'friend_request:approve:message' => "Dear %s,

%s has accepted your request to become a friend.",
	'friend_request:approve:successful' => "%s is now a friend",
	'friend_request:approve:fail' => "Error while creating friend relation with %s",

	// Decline request
	'friend_request:decline' => "Decline",
	'friend_request:decline:subject' => "%s has declined your friend request",
	'friend_request:decline:message' => "Dear %s,

%s has declined your request to become a friend.",
	'friend_request:decline:success' => "Friend request successfully declined",
	'friend_request:decline:fail' => "Error while declining Friend request, please try again",
	
	// Revoke request
	'friend_request:revoke' => "Revoke",
	'friend_request:revoke:success' => "Friend request successfully revoked",
	'friend_request:revoke:fail' => "Error while revoking Friend request, please try again",

	// Views
	// Received
	'friend_request:received:title' => "Received Friend requests",
	'friend_request:received:none' => "No requests pending your approval",

	// Sent
	'friend_request:sent:title' => "Sent Friend requests",
	'friend_request:sent:none' => "No sent requests pending approval",
];
+57 −0
Original line number Original line Diff line number Diff line
<?php
	$spanish = array(
		'friend_request' => "Solicitud de Amistad",
		'friend_request:menu' => "Solicitudes de Amistad",
		'friend_request:title' => "Solicitudes de Amistad para: %s",
	
		'friend_request:new' => "Nueva Solicitud de Amistad",
		
		'friend_request:friend:add:pending' => "Solicitud de Amistad Pendiente",
		
		'friend_request:newfriend:subject' => "%s quiere ser tu amigo!",
		'friend_request:newfriend:body' => "%s quiere ser tu amigo! Pero est&aacute; esperando la aprobaci&oacute;n de la solicitud ... as&iacute; que inicia sesi&oacute;n ahora para que puedas aprobar la petici&oacute;n!!

Puedes ver tus solicitudes de amistad pendientes en:
%s

Aseg&uacute;rate de haber iniciado sesi&oacute;n en el sitio web antes de hacer clic en el siguiente enlace, de lo contrario ser&aacute;s redirigido a la p&aacute;gina de inicio de sesi&oacute;n.

(No respondas a este mensaje.)",
		
		// Actions
		// Add request
		'friend_request:add:failure' => "Lo sentimos, debido a un error del sistema no se pudo completar tu solicitud. Por favor, int&eacute;ntelo de nuevo.",
		'friend_request:add:successful' => "Haz solicitado ser amigo de %s. Deben aprobar tu solicitud antes de que se muestre en tu lista de amigos.",
		'friend_request:add:exists' => "Ya has solicitado ser amigo de %s.",
		
		// Approve request
		'friend_request:approve' => "Aprobar",
		'friend_request:approve:successful' => "%s es ahora un Amigo",
		'friend_request:approve:fail' => "Error al crear relaci&oacute;n de Amistad con %s",
	
		// Decline request
		'friend_request:decline' => "Rechazar",
		'friend_request:decline:subject' => "%s ha rechazado tu solicitud de amistad",
		'friend_request:decline:message' => "Estimado(a) %s,

%s ha rechazado tu solicitud para convertirse en amigos.",
		'friend_request:decline:success' => "Solicitud de Amistad exitosamente rechazada",
		'friend_request:decline:fail' => "Error al rechazar la Solicitud de Amistad, por favor int&eacute;ntelo de nuevo",
		
		// Revoke request
		'friend_request:revoke' => "Revocar",
		'friend_request:revoke:success' => "Solicitud de Amistad exitosamente revocada",
		'friend_request:revoke:fail' => "Error al revocar la Solicitud de Amistad, por favor int&eacute;ntelo de nuevo",
	
		// Views
		// Received
		'friend_request:received:title' => "Solicitudes de Amistad recibidas",
		'friend_request:received:none' => "No hay solicitudes pendientes de aprobaci&oacute;n",
	
		// Sent
		'friend_request:sent:title' => "Solicitudes de Amistad enviadas",
		'friend_request:sent:none' => "No hay solicitudes enviadas pendientes de aprobaci&oacute;n",
	);
					
	add_translation("es", $spanish);
 No newline at end of file
+38 −0
Original line number Original line Diff line number Diff line
<?php
$language = array (
  'friend_request' => 'Demande d\'ami',
  'friend_request:menu' => 'Demandes d\'ami',
  'friend_request:title' => 'Demandes d\'ami pour : %s',
  'friend_request:new' => 'Nouvelle demande d\'ami',
  'friend_request:friend:add:pending' => 'Demande d\'ami en attente',
  'friend_request:newfriend:subject' => '%s veut devenir votre ami!',
  'friend_request:newfriend:body' => '%s veulent devenir votre ami ! Mais ils attendent que vous approuviez votre requête... alors connectez-vous pour les approuver !

Vous pouvez voir les demandes d\'ami en attente sur :
%s

Assurez-vous d\'être connecté sur le site web avant de cliquer sur le lien suivant, sinon vous serez redirigé sur la page de connexion.

(Vous ne pouvez pas répondre à cet e-mail.)',
  'friend_request:add:failure' => 'Désolé, mais à cause d\'une erreur système nous n\'avons pas pu traiter votre demande. S\'il vous plaît essayez de nouveau.',
  'friend_request:add:successful' => 'Vous avez demandé d\'être amis avec %s. Ils doivent approuver votre demande avant d\'apparaitre dans votre liste d\'amis.',
  'friend_request:add:exists' => 'Vous avez déjà demandé d\'être amis avec %s.',
  'friend_request:approve' => 'Accepter',
  'friend_request:approve:successful' => '%s est maintenant votre ami',
  'friend_request:approve:fail' => 'Erreur durant la création de la relation d\'ami avec %s',
  'friend_request:decline' => 'Décliner',
  'friend_request:decline:subject' => '%s a refusé votre demande d\'ami',
  'friend_request:decline:message' => 'Cher %s,

%s a décliné votre invitation pour devenir son ami.',
  'friend_request:decline:success' => 'Demande d\'ami refusée avec succès',
  'friend_request:decline:fail' => 'Erreur lors du refus de la demande d\'ami, merci de réessayer.',
  'friend_request:revoke' => 'Révoquer',
  'friend_request:revoke:success' => 'Demande d\'ami révoquée avec succès',
  'friend_request:revoke:fail' => 'Erreur lors de la révocation de la demande ami, merci de réessayer',
  'friend_request:received:title' => 'Demandes d\'ami reçues',
  'friend_request:received:none' => 'Pas de demandes en attente de votre approbation',
  'friend_request:sent:title' => 'Demandes d\'ami envoyées',
  'friend_request:sent:none' => 'Pas de demandes envoyées en attente d\'approbation',
);
add_translation("fr", $language);
+47 −0
Original line number Original line Diff line number Diff line
<?php
/**
 * This file was created by Translation Editor v2.0.1
 * On 2015-12-17 12:04
 */

return array (
  'friend_request:settings:add_river' => 'Creëer een melding op de river als een vriendschapsverzoek wordt geaccepteerd',
  'friend_request:approve:subject' => '%s heeft je vriendschapsverzoek geaccepteerd',
  'friend_request:approve:message' => 'Beste %s,

%s heeft je vriendschapsverzoek geaccepteerd.',
  'friend_request' => 'Vriendschap verzoek',
  'friend_request:menu' => 'Vriendschap verzoeken',
  'friend_request:title' => 'Vriendschap verzoeken voor: %s',
  'friend_request:new' => 'Nieuw vriendschap verzoek',
  'friend_request:friend:add:pending' => 'Vriendschap verzoek verzonden',
  'friend_request:newfriend:subject' => '%s wil je vriend worden!',
  'friend_request:newfriend:body' => '%s wil je vriend worden! Echter zul jij dit goed moeten keuren, dus meld je nu aan om het vriendschap verzoek goed te keuren.

Je kunt de openstaande vriendschap verzoeken hier bekijken:
%s

Indien je niet bent aangemeld zul je worden doorgestuurd naar de startpagina, na het aanmelden wordt je doorgestuurd naar het overzicht.

(Je kunt niet reageren op dit bericht)',
  'friend_request:add:failure' => 'Wegens een fout kon je verzoek niet worden verwerkt. Probeer het nogmaals',
  'friend_request:add:successful' => 'Je wilt graag vrienden worden met %s. Dit moet nog worden goedgekeurd voordat hij/zij verschijnt in je vriendenlijst',
  'friend_request:add:exists' => 'Je hebt reeds verzocht vrienden te worden met %s',
  'friend_request:approve' => 'Goedkeuren',
  'friend_request:approve:successful' => '%s is nu een vriend',
  'friend_request:approve:fail' => 'Er is een fout opgetreden tijdens het maken van de vriendschap relatie met %s',
  'friend_request:decline' => 'Afwijzen',
  'friend_request:decline:subject' => '%s heeft je vriendschap verzoek afgewezen',
  'friend_request:decline:message' => 'Beste %s,

%s heeft je vriendschap verzoek afgewezen.',
  'friend_request:decline:success' => 'Vriendschap verzoek succesvol afgewezen',
  'friend_request:decline:fail' => 'Er is een fout opgetreden tijdens het afwijzen van het vriendschap verzoek. Probeer het nogmaals',
  'friend_request:revoke' => 'Intrekken',
  'friend_request:revoke:success' => 'Vriendschap verzoek succesvol ingetrokken',
  'friend_request:revoke:fail' => 'Er is een fout opgetreden tijdens het intrekken van het vriendschap verzoek',
  'friend_request:received:title' => 'Ontvangen vriendschap verzoeken',
  'friend_request:received:none' => 'Er zijn geen ontvangen vriendschap verzoeken gevonden die wachten op goedkeuring',
  'friend_request:sent:title' => 'Verzonden vriendschap verzoeken',
  'friend_request:sent:none' => 'Er zijn geen verzonden vriendschap verzoeken gevonden die wachten op goedkeuring',
);
Original line number Original line Diff line number Diff line
<?php
/**
 * All helper functions are bundled here
 */

/**
 * Create river events when a friend is added
 *
 * @param int $user_guid   the user who is accepting
 * @param int $friend_guid the friend who he accepted
 *
 * @return bool
 */
function friend_request_create_river_events($user_guid, $friend_guid) {
	
	$user_guid = sanitise_int($user_guid, false);
	$friend_guid = sanitise_int($friend_guid, false);
	
	if (empty($user_guid) || empty($friend_guid)) {
		return false;
	}
	
	// check plugin setting
	if (elgg_get_plugin_setting('add_river', 'friend_request') === 'no') {
		// no event are to be created
		return true;
	}
	
	// add to river
	elgg_create_river_item([
		'view' => 'river/relationship/friend/create',
		'action_type' => 'friend',
		'subject_guid' => $user_guid,
		'object_guid' => $friend_guid,
	]);
	elgg_create_river_item([
		'view' => 'river/relationship/friend/create',
		'action_type' => 'friend',
		'subject_guid' => $friend_guid,
		'object_guid' => $user_guid,
	]);
	
	return true;
}
+21 −0
Original line number Original line Diff line number Diff line
<?xml version="1.0" encoding="UTF-8"?>
<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
	<name>Friend request</name>
	<description>Let users confirm friend requests. Make friends like on Facebook or LinkedIn</description>
	<version>4.1</version>
	<id>friend_request</id>
	<author>ColdTrick IT Solutions</author>
	<website>http://www.coldtrick.com/</website>
	<repository>https://github.com/ColdTrick/friend_request</repository>
	<bugtracker>https://github.com/ColdTrick/friend_request/issues</bugtracker>
	<copyright>(C) ColdTrick IT Solutions 2011 - 2015</copyright>
	<license>GNU General Public License version 2</license>
	
	<requires>
		<type>elgg_release</type>
		<version>1.9</version>
	</requires>
	
 	<category>ColdTrick</category>
</plugin_manifest>
 No newline at end of file
+57 −0
Original line number Original line Diff line number Diff line
<?php

elgg_gatekeeper();

$user = elgg_get_page_owner_entity();
if (!($user instanceof ElggUser)) {
	$user = elgg_get_logged_in_user_entity();
	elgg_set_page_owner_guid($user->getGUID());
}

if (!$user->canEdit()) {
	forward(REFERER);
}

// set the correct context and page owner
elgg_push_context('friends');

// breadcrumb
elgg_push_breadcrumb(elgg_echo('friends'), "friends/{$user->username}");
elgg_push_breadcrumb(elgg_echo('friend_request:menu'));

$options = [
	'type' => 'user',
	'limit' => false,
	'relationship' => 'friendrequest',
	'relationship_guid' => $user->getGUID(),
	'inverse_relationship' => true,
];

// Get all received requests
$received_requests = elgg_get_entities_from_relationship($options);

// Get all received requests
$options['inverse_relationship'] = false;
$sent_requests = elgg_get_entities_from_relationship($options);

// Get page elements
$title_text = elgg_echo('friend_request:title', [$user->name]);

$content = elgg_view('friend_request/received', [
	'entities' => $received_requests,
]);
$content .= elgg_view('friend_request/sent', [
	'entities' => $sent_requests,
]);

// Build page
$body = elgg_view_layout('content', [
	'title' => $title_text,
	'content' => $content,
	'filter' => false,
]);

// Draw page
echo elgg_view_page($title_text, $body);
	
 No newline at end of file
+54 −0
Original line number Original line Diff line number Diff line
<?php
/**
 * The main plugin file for Friend Request
 */

// load library files
require_once(dirname(__FILE__) . '/lib/functions.php');

// default event handlers
elgg_register_event_handler('init', 'system', 'friend_request_init');

/**
 * Gets called during system initialization
 *
 * @return void
 */
function friend_request_init() {
	// extend css
	elgg_extend_view('css/elgg', 'css/friend_request/site');
	
	// Page handlers
	// unregister friendsof
	elgg_unregister_page_handler('friendsof');
	
	// This will let users view their friend requests
	elgg_register_page_handler('friend_request', '\ColdTrick\FriendRequest\PageHandler::friendRequest');
	
	// Events
	// unregister default elgg friend handler
	elgg_unregister_event_handler('create', 'friend', '_elgg_send_friend_notification');
	// Handle our add action event
	elgg_register_event_handler('create', 'relationship', '\ColdTrick\FriendRequest\Relationships::createFriendRequest');
	
	// Plugin hooks
	elgg_register_plugin_hook_handler('register', 'menu:topbar', '\ColdTrick\FriendRequest\TopbarMenu::register');
	elgg_register_plugin_hook_handler('register', 'menu:page', '\ColdTrick\FriendRequest\PageMenu::registerCleanup');
	elgg_register_plugin_hook_handler('register', 'menu:page', '\ColdTrick\FriendRequest\PageMenu::register');
	elgg_register_plugin_hook_handler('register', 'menu:user_hover', '\ColdTrick\FriendRequest\Users::registerUserHoverMenu');
	elgg_register_plugin_hook_handler('register', 'menu:entity', '\ColdTrick\FriendRequest\Users::registerEntityMenu');
	
	// Actions
	// This overwrites the original friend requesting stuff.
	elgg_register_action('friends/add', dirname(__FILE__) . '/actions/friends/add.php');
	// We need to override the friend remove action to remove the relationship we created
	elgg_register_action('friends/remove', dirname(__FILE__) . '/actions/friends/removefriend.php');
	
	// friend request actions
	elgg_register_action('friend_request/approve', dirname(__FILE__) . '/actions/approve.php');
	elgg_register_action('friend_request/decline', dirname(__FILE__) . '/actions/decline.php');
	elgg_register_action('friend_request/revoke', dirname(__FILE__) . '/actions/revoke.php');
	
}
	
 No newline at end of file
Original line number Original line Diff line number Diff line
<?php ?>
.friend-request-new {
	color: white;
	background-color: red;
	
	-webkit-border-radius: 10px; 
	-moz-border-radius: 10px;
	border-radius: 10px;
	
	-webkit-box-shadow: -2px 2px 4px rgba(0, 0, 0, 0.50);
	-moz-box-shadow: -2px 2px 4px rgba(0, 0, 0, 0.50);
	box-shadow: -2px 2px 4px rgba(0, 0, 0, 0.50);
	
	position: absolute;
	text-align: center;
	top: 0px;
	left: 28px;
	min-width: 16px;
	height: 16px;
	font-size: 10px;
	font-weight: bold;
}
 No newline at end of file
Original line number Original line Diff line number Diff line
<?php

$entities = elgg_extract('entities', $vars);

$content = '';

if (!empty($entities)) {
	
	$lis = [];
	
	foreach ($entities as $entity) {
		$icon = elgg_view_entity_icon($entity, 'small');
		
		$info = elgg_view('output/url', [
			'href' => $entity->getURL(),
			'text' => $entity->name,
			'is_trusted' => true,
		]);
		$info .= '<br />';
		$info .= elgg_view('output/url', [
			'href' => "action/friend_request/approve?guid={$entity->getGUID()}",
			'text' => elgg_echo('friend_request:approve'),
			'is_action' => true,
		]);
		$info .= '&nbsp;|&nbsp;';
		$info .= elgg_view('output/url', [
			'href' => "action/friend_request/decline?guid={$entity->getGUID()}",
			'text' => elgg_echo('friend_request:decline'),
			'is_action' => true,
		]);
		
		$lis[] = elgg_format_element('li', ['class' => 'elgg-item elgg-item-user'], elgg_view_image_block($icon, $info));
	}
	
	$content = elgg_format_element('ul', ['class' => 'elgg-list elgg-list-entity'], implode('', $lis));
	
} else {
	$content = elgg_echo('friend_request:received:none');
}

echo elgg_view_module('info', elgg_echo('friend_request:received:title'), $content, ['class' => 'mbm']);
Original line number Original line Diff line number Diff line
<?php

$entities = elgg_extract('entities', $vars, false);

$content = '';

if (!empty($entities)) {
	
	$lis = [];
	
	foreach ($entities as $entity) {
		$icon = elgg_view_entity_icon($entity, 'small');
		
		$info = elgg_view('output/url', [
			'href' => $entity->getURL(),
			'text' => $entity->name,
			'is_trusted' => true,
		]);
		$info .= '<br />';
		$info .= elgg_view('output/url', [
			'href' => "action/friend_request/revoke?guid={$entity->getGUID()}",
			'text' => elgg_echo('friend_request:revoke'),
			'is_action' => true,
		]);
		
		$lis[] = elgg_format_element('li', ['class' => 'elgg-item elgg-item-user'], elgg_view_image_block($icon, $info));
	}
	
	$content = elgg_format_element('ul', ['class' => 'elgg-list elgg-list-entity'], implode('', $lis));
} else {
	$content = elgg_echo('friend_request:sent:none');
}

echo elgg_view_module('info', elgg_echo('friend_request:sent:title'), $content, ['class' => 'mbm']);
Original line number Original line Diff line number Diff line
<?php

$plugin = elgg_extract('entity', $vars);

$yesno_options = [
	'yes' => elgg_echo('option:yes'),
	'no' => elgg_echo('option:no'),
];

$add_river = elgg_echo('friend_request:settings:add_river');
$add_river .= elgg_view('input/select', [
	'name' => 'params[add_river]',
	'value' => $plugin->add_river,
	'options_values' => $yesno_options,
	'class' => 'mls',
]);

echo elgg_format_element('div', [], $add_river);
+11 −0
Original line number Original line Diff line number Diff line
<?xml version="1.0" encoding="UTF-8" ?>
<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
        <name>UNL Avatars</name>
        <author>UNL</author>
        <version>1.0</version>
        <description>Adds legacy and public Avatar (icon) support</description>
        <requires>
                <type>elgg_release</type>
                <version>2.0</version>
        </requires>
</plugin_manifest>
+58 −0
Original line number Original line Diff line number Diff line
<?php

function unl_avatars_init() {
    elgg_register_page_handler('pg', 'unl_avatars_pg_handler');
    elgg_register_plugin_hook_handler('entity:icon:url', 'user', 'unl_avatars_alter_default_user_icons', 999);
}

// Fire up the plugin initialization using the elgg handler
elgg_register_event_handler('init','system','unl_avatars_init');

function unl_avatars_pg_handler($segments) {
    if (!isset($segments[0])) {
        return false;
    }
    
    if ('profile' == $segments[0]) {
        return unl_avatars_pg_profile($segments);
    }
    
    if ('icon' == $segments[0]) {
        return unl_avatars_pg_icon($segments);
    }
    
    return false;
}

function unl_avatars_pg_icon($segments) {
    if (!isset($segments[1], $segments[2])) {
        return false;
    }

    $username = $segments[1];
    $size = $segments[2];

    if (!$user = get_user_by_username($username)) {
        //The legacy behavior was to return the default image rather than a 404
        forward(elgg_get_simplecache_url("icons/user/default{$size}.gif"));
    }

    //Forward to the new guy
    forward('mod/profile/icondirect.php?guid='.$user->guid.'&size='.$size);
}

function unl_avatars_pg_profile($segments) {
    if (!isset($segments[1])) {
        return false;
    }

    forward('profile/'.$segments[1]);
}

    
function unl_avatars_alter_default_user_icons($hook, $type, $returnValue, $params) {
    //Always point to the icondirect.php file
    $icon_time = $params['entity']->icontime;
    $value = 'mod/profile/icondirect.php?lastcache='.$icon_time.'&guid='.$params['entity']->guid.'&size='.$params['size'];
    return $value;
}
+2 −0
Original line number Original line Diff line number Diff line
vendor
 No newline at end of file
+7 −0
Original line number Original line Diff line number Diff line
{
    "require": {
        "unl/php-wdn-templates": "^5.3"
    },
    "prefer-stable": true
}
 No newline at end of file
+290 −0
Original line number Original line Diff line number Diff line
{
    "_readme": [
        "This file locks the dependencies of your project to a known state",
        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
        "This file is @generated automatically"
    ],
    "content-hash": "38d0d2e02cf6eb2c0c01fa3cb2f8d24a",
    "packages": [
        {
            "name": "unl/php-dwt-parser",
            "version": "v1.0.1",
            "source": {
                "type": "git",
                "url": "https://github.com/unl/phpdwtparser.git",
                "reference": "1de8770c4d8675771d1529c2f81d96e0aa51931f"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/unl/phpdwtparser/zipball/1de8770c4d8675771d1529c2f81d96e0aa51931f",
                "reference": "1de8770c4d8675771d1529c2f81d96e0aa51931f",
                "shasum": ""
            },
            "require": {
                "php": ">=5.5",
                "zaininnari/html-minifier": "*",
                "zendframework/zend-code": "^2.5"
            },
            "require-dev": {
                "phpunit/phpunit": "~4.0"
            },
            "bin": [
                "bin/createTemplates.php"
            ],
            "type": "library",
            "autoload": {
                "psr-4": {
                    "UNL\\DWT\\": "src/"
                }
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "BSD-3-Clause"
            ],
            "authors": [
                {
                    "name": "Kevin Abel (kabel)",
                    "email": "kabel2@unl.edu",
                    "role": "Developer"
                },
                {
                    "name": "Brett Bieber (saltybeagle)",
                    "email": "brett.bieber@gmail.com",
                    "role": "Retired Developer"
                }
            ],
            "description": "A PHP library for parsing DWT files and turning them into PHP classes",
            "homepage": "http://wdn.unl.edu/",
            "time": "2016-01-05T21:35:46+00:00"
        },
        {
            "name": "unl/php-wdn-templates",
            "version": "v5.3.4",
            "source": {
                "type": "git",
                "url": "https://github.com/unl/phpunltemplates.git",
                "reference": "845d8e05a6ae636797b350659f64b5f03b466166"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/unl/phpunltemplates/zipball/845d8e05a6ae636797b350659f64b5f03b466166",
                "reference": "845d8e05a6ae636797b350659f64b5f03b466166",
                "shasum": ""
            },
            "require": {
                "php": ">=5.5",
                "unl/php-dwt-parser": "1.0.*"
            },
            "require-dev": {
                "phpunit/phpunit": "~5.0"
            },
            "type": "library",
            "autoload": {
                "psr-4": {
                    "UNL\\Templates\\": "src/"
                }
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "BSD-3-Clause"
            ],
            "authors": [
                {
                    "name": "Jeff Sturek (jsturek)",
                    "email": "jsturek8@unl.edu",
                    "role": "Developer"
                },
                {
                    "name": "Kevin Abel (kabel)",
                    "email": "kabel2@unl.edu",
                    "role": "Retired Developer"
                },
                {
                    "name": "Brett Bieber (saltybeagle)",
                    "email": "brett.bieber@gmail.com",
                    "role": "Retired Developer"
                },
                {
                    "name": "Ned Hummel (nhummel2)",
                    "email": "nhummel2@math.unl.edu",
                    "role": "Retired Developer"
                }
            ],
            "description": "A PHP library for rendering the UNL templates",
            "homepage": "http://wdn.unl.edu/",
            "support": {
                "issues": "https://github.com/unl/phpunltemplates/issues",
                "source": "https://github.com/unl/phpunltemplates/tree/v5.3.4"
            },
            "time": "2022-01-24T19:05:47+00:00"
        },
        {
            "name": "zaininnari/html-minifier",
            "version": "0.4.2",
            "source": {
                "type": "git",
                "url": "https://github.com/zaininnari/html-minifier.git",
                "reference": "5b94d85705626f9bb33b7c667bc4400088ed4ece"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/zaininnari/html-minifier/zipball/5b94d85705626f9bb33b7c667bc4400088ed4ece",
                "reference": "5b94d85705626f9bb33b7c667bc4400088ed4ece",
                "shasum": ""
            },
            "require": {
                "php": ">=5.3.0"
            },
            "require-dev": {
                "satooshi/php-coveralls": "dev-master"
            },
            "type": "library",
            "autoload": {
                "psr-0": {
                    "zz": "src/"
                }
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "The BSD 3-Clause License"
            ],
            "authors": [
                {
                    "name": "Google inc",
                    "homepage": "http://www.chromium.org/blink",
                    "role": "Author"
                },
                {
                    "name": "zaininnari",
                    "homepage": "https://github.com/zaininnari/",
                    "role": "Developer"
                }
            ],
            "description": "The Blink HTMLTokenizer ported to PHP.",
            "homepage": "https://github.com/zaininnari/html-minifier",
            "keywords": [
                "Blink",
                "HTML minify",
                "php"
            ],
            "time": "2015-08-18T14:10:55+00:00"
        },
        {
            "name": "zendframework/zend-code",
            "version": "2.6.3",
            "source": {
                "type": "git",
                "url": "https://github.com/zendframework/zend-code.git",
                "reference": "95033f061b083e16cdee60530ec260d7d628b887"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/zendframework/zend-code/zipball/95033f061b083e16cdee60530ec260d7d628b887",
                "reference": "95033f061b083e16cdee60530ec260d7d628b887",
                "shasum": ""
            },
            "require": {
                "php": "^5.5 || 7.0.0 - 7.0.4 || ^7.0.6",
                "zendframework/zend-eventmanager": "^2.6 || ^3.0"
            },
            "require-dev": {
                "doctrine/annotations": "~1.0",
                "fabpot/php-cs-fixer": "1.7.*",
                "phpunit/phpunit": "^4.8.21",
                "zendframework/zend-stdlib": "^2.7 || ^3.0"
            },
            "suggest": {
                "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features",
                "zendframework/zend-stdlib": "Zend\\Stdlib component"
            },
            "type": "library",
            "extra": {
                "branch-alias": {
                    "dev-master": "2.6-dev",
                    "dev-develop": "2.7-dev"
                }
            },
            "autoload": {
                "psr-4": {
                    "Zend\\Code\\": "src/"
                }
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "BSD-3-Clause"
            ],
            "description": "provides facilities to generate arbitrary code using an object oriented interface",
            "homepage": "https://github.com/zendframework/zend-code",
            "keywords": [
                "code",
                "zf2"
            ],
            "abandoned": "laminas/laminas-code",
            "time": "2016-04-20T17:26:42+00:00"
        },
        {
            "name": "zendframework/zend-eventmanager",
            "version": "3.2.1",
            "source": {
                "type": "git",
                "url": "https://github.com/zendframework/zend-eventmanager.git",
                "reference": "a5e2583a211f73604691586b8406ff7296a946dd"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd",
                "reference": "a5e2583a211f73604691586b8406ff7296a946dd",
                "shasum": ""
            },
            "require": {
                "php": "^5.6 || ^7.0"
            },
            "require-dev": {
                "athletic/athletic": "^0.1",
                "container-interop/container-interop": "^1.1.0",
                "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2",
                "zendframework/zend-coding-standard": "~1.0.0",
                "zendframework/zend-stdlib": "^2.7.3 || ^3.0"
            },
            "suggest": {
                "container-interop/container-interop": "^1.1.0, to use the lazy listeners feature",
                "zendframework/zend-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature"
            },
            "type": "library",
            "extra": {
                "branch-alias": {
                    "dev-master": "3.2-dev",
                    "dev-develop": "3.3-dev"
                }
            },
            "autoload": {
                "psr-4": {
                    "Zend\\EventManager\\": "src/"
                }
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "BSD-3-Clause"
            ],
            "description": "Trigger and listen to events within a PHP application",
            "homepage": "https://github.com/zendframework/zend-eventmanager",
            "keywords": [
                "event",
                "eventmanager",
                "events",
                "zf2"
            ],
            "abandoned": "laminas/laminas-eventmanager",
            "time": "2018-04-25T15:33:34+00:00"
        }
    ],
    "packages-dev": [],
    "aliases": [],
    "minimum-stability": "stable",
    "stability-flags": [],
    "prefer-stable": true,
    "prefer-lowest": false,
    "platform": [],
    "platform-dev": [],
    "plugin-api-version": "2.1.0"
}
+12 −0
Original line number Original line Diff line number Diff line
/**
 * Modbash Clean Elgg Theme
 *
 * Copyright (c) 2015 ModBash
 *
 * @author     Shane Barron <admin@modbash.com>
 * @copyright  2015 SocialApparatus
 * @license    GNU General Public License (GPL) version 2
 * @version    1
 * @link       http://modbash.com
 */
 No newline at end of file
+815 −0
Original line number Original line Diff line number Diff line

form input[type=email],form input[type=number],form input[type=password],form input[type=search],form input[type=tel],form input[type=text],form input[type=url],form textarea {
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    background-color: var(--bg-input);
    border: 1px solid var(--b-input);
    border-radius: 3px;
    color: inherit;
    font-family: inherit;
    padding: .56em .75em;
    -webkit-transition: border-color .4s ease-out,-webkit-box-shadow .4s ease-out;
    transition: border-color .4s ease-out,-webkit-box-shadow .4s ease-out;
    transition: border-color .4s ease-out,box-shadow .4s ease-out;
    transition: border-color .4s ease-out,box-shadow .4s ease-out,-webkit-box-shadow .4s ease-out;
    width: 100%
}

form input[type=email]:hover,form input[type=number]:hover,form input[type=password]:hover,form input[type=search]:hover,form input[type=tel]:hover,form input[type=text]:hover,form input[type=url]:hover,form textarea:hover {
    border-color: var(--b-input-hover);
    -webkit-transition: border-color .2s ease-out;
    transition: border-color .2s ease-out
}

form input[type=email]:focus,form input[type=number]:focus,form input[type=password]:focus,form input[type=search]:focus,form input[type=tel]:focus,form input[type=text]:focus,form input[type=url]:focus,form textarea:focus {
    border-color: var(--b-input-focus);
    -webkit-box-shadow: 0 0 0 3px var(--bg-body),0 0 0 5px var(--b-input-focus);
    box-shadow: 0 0 0 3px var(--bg-body),0 0 0 5px var(--b-input-focus);
    outline: none;
    -webkit-transition: -webkit-box-shadow .2s ease-out;
    transition: -webkit-box-shadow .2s ease-out;
    transition: box-shadow .2s ease-out;
    transition: box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out
}

.centered {
    float: none!important;
    margin: 0 auto!important
}

.clear {
    clear: both
}

.clear-top {
    margin-top: 0!important
}

.hidden {
    display: none
}

table:not(.dcf-table):not(.ui-datepicker-calendar):not(.dcf-datepicker-dialog-calendar) {
    background-color: transparent;
    border-bottom: 1px solid var(--b-table);
    max-width: 100%;
    width: 100%
}

table:not(.dcf-table):not(.ui-datepicker-calendar):not(.dcf-datepicker-dialog-calendar) tbody,table:not(.dcf-table):not(.ui-datepicker-calendar):not(.dcf-datepicker-dialog-calendar) thead {
    font-size: .84em
}

table:not(.dcf-table):not(.ui-datepicker-calendar):not(.dcf-datepicker-dialog-calendar) td,table:not(.dcf-table):not(.ui-datepicker-calendar):not(.dcf-datepicker-dialog-calendar) th {
    border: 1px solid var(--b-table);
    padding-left: 1em;
    padding-right: 1em
}

table:not(.dcf-table):not(.ui-datepicker-calendar):not(.dcf-datepicker-dialog-calendar) thead td,table:not(.dcf-table):not(.ui-datepicker-calendar):not(.dcf-datepicker-dialog-calendar) thead th {
    padding-bottom: .75em;
    padding-top: 1.33em;
    vertical-align: bottom
}

table:not(.dcf-table):not(.ui-datepicker-calendar):not(.dcf-datepicker-dialog-calendar) tbody td,table:not(.dcf-table):not(.ui-datepicker-calendar):not(.dcf-datepicker-dialog-calendar) tbody th {
    padding-bottom: .75em;
    padding-top: .75em;
    vertical-align: top
}

table:not(.dcf-table):not(.ui-datepicker-calendar):not(.dcf-datepicker-dialog-calendar) tbody tr:nth-of-type(2n) {
    background-color: var(--bg-table-stripe)
}

.dcf-main li>a, .dcf-main p a {
	border: none;
}

.elgg-layout img {
	border-radius: 3px;
}

.form-inline .form-group{
	width: 80%;
	float: left;
}

.form-inline .form-group input {
	padding: .5em;
	border-radius: 4px 0 0 4px;
}

.form-inline button {
	border-radius: 0 4px 4px 0;
    width: 20%;
    padding: 1.069em 0.033em 1em;
}

.unl-wdn-elgg-sidebar {
    margin-top: 5.8em;
}

ol.breadcrumb {
	font-size: .75em;
    margin-bottom: 1em;
}

ol.breadcrumb > li {
	font-size: 1em;
	display: inline;
	margin-right: 0.5em;
	font-family: "Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif;
}

ol.breadcrumb > li:after {
	content: ">";
	display: inline;
	margin-left: 0.5em;
	color: #454545;
}

ol.breadcrumb > li:last-child:after {
	content: "";
	display: inline;
	margin-left: 0.5em;
}

h1, h2, h3, h4, h5, h6 {
    font-weight: 400;
    color: #474746;
    font-family: "Tungsten A","Tungsten B",Impact,Haettenschweiler,"Arial Narrow Bold","Franklin Gothic Bold",Charcoal,"Helvetica Inserat","Bitstream Vera Sans Bold","Arial Black",sans-serif;
    font-weight: 600;
    font-style: normal;
    line-height: 1em;
    margin: 1em 0 1rem 0;
    -webkit-font-feature-settings: "kern";
    font-feature-settings: "kern";
}

h2 {
    font-size: 38px;
    font-size: 2.9230769rem;
}

h3 {
    font-size: 30px;
    font-size: 2.3076923rem;
}

@media (min-width: 768px){
	h2 {
	    font-size: 41px;
	    font-size: 2.5625rem;
	}
	h3 {
	    font-size: 38px;
	    font-size: 2.375rem;
	}
}

.elgg-subtext {
	font-family: "Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif;
}

a.elgg-button {
	color: #fff;
}

.elgg-system-messages {
	margin-top: 1em;
}

.elgg-menu-filter {
	padding: 0;
}

.elgg-htabs > li, .elgg-htabs > li:after, .elgg-htabs > li > a, .elgg-htabs > li > span {
    position: relative;
    display: inline-block;
}
.elgg-htabs > li, .elgg-htabs > li:after, .elgg-htabs > li > a, .elgg-htabs > li > span {
    vertical-align: middle;
}

.nav-pills.elgg-menu-hz > li, .nav-pills.elgg-htabs > li {
	border: none;
	background-color: #5b5b5a;
	border-radius: 0;
	color: #fff;
	font-family: "Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif;
	font-size: 0.75em;
	margin-right: 1em;
}

.nav-pills.elgg-menu-hz > li.active, .nav-pills.elgg-htabs > li.active {
	background-color: #909090;
}

.nav-pills.elgg-menu-hz > .active > a, .nav-pills.elgg-htabs > .active > a {
	background-color: #909090;
	top: 0;
    margin-bottom: 0;
}

.nav-pills.elgg-menu-hz > li > a:hover, .nav-pills.elgg-htabs > li > a:hover {
    background: #d00000;
    color: #fff;
}

.nav-pills.elgg-menu-hz > li a, .nav-pills.elgg-htabs > li a{
	background-color: #5b5b5a;
	color: #fff;
	height: 2.2em;
	margin-bottom: 0;
}

.nav-pills.elgg-menu-hz, .nav-pills.elgg-htabs  {
    border-bottom: 1px solid #787878;
}

.nav-pills.elgg-menu-hz > li > a, .nav-pills.elgg-htabs > li > a{
    padding:4px 10px;
}

ul.nav-pills.nav-stacked, ul.elgg-menu-owner-block, ul.nav-pills.elgg-htabs {
	list-style-type: none;
	padding: 0;
}

ul.elgg-menu.elgg-menu-hz.nav.nav-pills {
    padding: 0;
}

.elgg-menu a {
	margin-bottom: 0;
}
}

ul.elgg-list.elgg-list-river {
	padding: 0;
}

.elgg-list h3 {
	margin: 0;
}

.elgg-list-river > li, .elgg-list > li {
    border-bottom: none;
    box-shadow: 0px 1px 3px rgba(0,0,0,0.3);
    margin-bottom: 1em;
    list-style-type: none;
    border-top: 5px solid #5b5b5a;
    background-color: #eceae3;
    /* padding: 1em; */
    border-radius: 6px;
    position: relative;
}

.elgg-list-river > li:hover {
    border-top: 5px solid #d00000;
}

.elgg-image-block .elgg-image {
    float: left;
    padding: 1em;
}

.elgg-avatar {
    position: relative;
    display: inline-block;
}

.elgg-avatar img{
    border-radius: 100%;
    overflow: hidden;
}

ul.elgg-list {
	padding: 0;
}

.elgg-list-river .elgg-body, .thewire-post .elgg-body, .elgg-list .elgg-body{
    padding: 1em;
    float: right;
    width: calc(100% - 132px);
}

.elgg-item.elgg-item-user .elgg-body{
	padding: 1em;
    float: right;
    width: calc(100% - 234px);
}

.elgg-river-message:before, .thewire-post .elgg-content:before, #profile-details .wire-status:before {
    display: block;
    content: "";
    height: 14px;
    width: 14px;
    background-color: inherit;
    position: absolute;
    top: 15px;
    left: -9px;
    transform: rotate(45deg);
    border: 1px solid #ccc;
    z-index: 2;
}

.elgg-river-message:after, .thewire-post .elgg-content:after, #profile-details .wire-status:after {
	display: block;
    content: "";
    height: 16px;
    width: 16px;
    background-color: inherit;
    position: absolute;
    top: 15px;
    left: -7px;
    transform: rotate(45deg);
    z-index: 3;
    visibility: visible;
}

.elgg-river-attachments, .elgg-river-message, .elgg-river-content, .thewire-post .elgg-content, #profile-details .wire-status {
    position: relative;
	margin-bottom: .75em;
}


.elgg-river-message, .thewire-post .elgg-content, #profile-details .wire-status{
    border-radius: 6px;
    display: inline-block;
	background-color: #fefdfa;
    box-shadow: 1px 1px 2px rgba(0,0,0,.25);
    padding: 1em;
    margin: 0 0 .5em 0;
    border:1px solid #ccc;
}

.elgg-river-content{
    border-left:3px solid #00BD3C;
    padding: .75em 1em 0.4em 1em;
}
.elgg-river-attachments{
    border-left:3px solid #1B9AE8;
    padding: .75em 1em 0.4em 1em;
}

.elgg-river-summary, .thewire-post .elgg-subtext, .elgg-list .elgg-subtext {
	font-family: "Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif;
	font-size: .75em;
    margin: .5em 0 .75em 0;
}

ul.elgg-menu-hover {
	padding: 0;
}

.fa-lg{
    margin: 0 0.5em;
}

.elgg-list-river .elgg-body .fa-lg.elgg-icon-arrow-right, .thewire-post .elgg-body .fa-lg.elgg-icon-arrow-right {
    vertical-align: 75%;
}

.elgg-owner-block {
	text-align: center;
}

.elgg-menu-extras {
    padding: 0;
}

.elgg-owner-block h3 {
	margin: 0;
}

.elgg-owner-block .elgg-image {
	float: none;
	width:100%;
}

.elgg-avatar-large > a > img {
     height: auto; 
}

ol.breadcrumb {
	display: none;
}

ul.elgg-tags {
    min-height: 16px;
    padding: 0;
    list-style: none;
    margin-bottom: 10px;
	font-family: "Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif;
	font-size: 1em;

}

ul.elgg-tags li{
    display: inline-block;
}

li.elgg-tag {
    background-color: #fff;
    padding: .422em .75em;
    margin: 0 .75em 0.75em 0;
    text-transform: uppercase;
    box-shadow: 0px 2px 4px RGBA(0,0,0,0.25);
    vertical-align: top;
}

.elgg-layout .pr-profile-image {
	border-radius: 100%;
}

#profile-details .PR-profile-info b, .groups-profile-fields b {
    font-weight: bold;
    display: inline-block;
    width: 25%;
}

#profile-details .PR-profile-info span, .groups-profile-fields span {
	font-size: .75em;
    display: inline-block;
    width: 75%;
    float: right;
    line-height: 2.7em;
}

.groups-profile-fields .elgg-icon-tag, #profile-details .elgg-icon-tag {
	font-size: 1rem !important;
}

#profile-details .even, .groups-profile-fields  .even{
	background-color: rgba(236, 234, 227, 0.3);
}

#profile-details .odd, #profile-details .even, .groups-profile-fields .odd, .groups-profile-fields .even {
	font-family: "Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif;
	padding: 1em;
}

#profile-details .wire-status{
    margin: 0 0 2em 0;
}

#profile-details .wire-status .elgg-body{
    font-size: 1.25em;
    font-style: italic;
}

#profile-details .wire-status .elgg-subtext{
    font-family: "Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif;
    font-size: .75em;
    font-style: normal;
    margin: 0 0 0 1em;
    text-align: right;
    display: inline-block;
}

.PR-profile-info, .groups-profile-fields {
    border: 1px solid #ccc;
    border-radius: 3px;
}

.groups-profile .elgg-body {
	padding: 1em 0 1em 1em;
}

.groups-profile-fields p {
	margin: 0;
}

.PR-about-me {
	margin-bottom: 2em;
}


#profile-details h3, .elgg-list h3 {
	font-size: 1.25em;
    font-family: "Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif;
}

.ellg-list .elgg-menu > li > a {
    margin-bottom: 0;
}

.ellg-list .elgg-menu li .elgg-access {
    font-family: "Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif;
}

.elgg-river-timestamp {
	white-space: nowrap;
}

.elgg-owner-block .elgg-subtext {
	font-style: italic;
    font-family: "Mercury SSm A","Mercury SSm B",Georgia,Baskerville,"Baskerville Old Face","Hoefler Text",Garamond,"Times New Roman",serif;
}

#comments {
	box-shadow: 0px 1px 3px rgba(0,0,0,0.3);
    border-top: 5px solid #5b5b5a;
    background-color: #eceae3;
    border-radius: 6px;
    padding: 1em;
}

.elgg-comments .elgg-list {
	margin: 0;
}

.elgg-comments .elgg-list > li {
	background-color: transparent;
	box-shadow: none;
	border-top:none;
	padding: 0;
}

ul.elgg-river-comments.elgg-list {
	border-left: 3px solid #d00000;
}

ul.elgg-river-comments.elgg-list > li {
    background-color: transparent;
    box-shadow: none;
    border: none;
    margin-bottom: 0;
    padding: 0 1em;
}

ul.elgg-river-comments.elgg-list li .elgg-body, .elgg-comments .elgg-list .elgg-body {
    width: calc(100% - 62px);	
}

.elgg-comments .elgg-list .elgg-body .elgg-output:before, ul.elgg-river-comments.elgg-list li .elgg-body .elgg-output:before {
    display: block;
    content: "";
    height: 14px;
    width: 14px;
    background-color: inherit;
    position: absolute;
    top: 15px;
    left: -9px;
    transform: rotate(45deg);
    border: 1px solid #ccc;
    z-index: 2;
}

.elgg-comments .elgg-list .elgg-body .elgg-output:after, ul.elgg-river-comments.elgg-list li .elgg-body .elgg-output:after {
	display: block;
    content: "";
    height: 16px;
    width: 16px;
    background-color: inherit;
    position: absolute;
    top: 15px;
    left: -7px;
    transform: rotate(45deg);
    z-index: 3;
    visibility: visible;
}

.elgg-comments .elgg-list .elgg-image, ul.elgg-river-comments.elgg-list li .elgg-image {
	margin-top: 2.3em;	
}

.elgg-comments .elgg-list .elgg-body .elgg-output p {
	margin: 0;
}

.elgg-comments .elgg-list .elgg-body .elgg-output, ul.elgg-river-comments.elgg-list li .elgg-body .elgg-output {
    position: relative;
	margin-bottom: .75em;
    border-radius: 6px;
    display: table;
	background-color: #fefdfa;
    box-shadow: 1px 1px 2px rgba(0,0,0,.25);
    padding: 1em;
    margin: 0 0 .5em 0;
    border:1px solid #ccc;
}






ul.elgg-pagination:after {
    content: "";
    display: table;
    clear: both
}

ul.elgg-pagination li {
    display: block;
    float: left;
    font-family: "Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif;
    font-weight: 400;
    font-style: normal;
    font-size: 12px;
    font-size: .9230769rem;
    margin: .254em;
    vertical-align: middle
}

@media (min-width: 768px) {
    ul.elgg-pagination li {
        font-size:13px;
        font-size: .8125rem
    }
}

ul.elgg-pagination li a {
    display: block;
    padding: .422em .602em .317em;
    border: 1px solid #d5d5d2;
    transition: border ease-out .2s
}

ul.elgg-pagination li a:active,ul.elgg-pagination li a:hover {
    color: #6a0000;
    border: 1px solid #6a0000
}

ul.elgg-pagination li.ellipsis, ul.elgg-pagination li.elgg-state-disabled {
    padding: .422em .602em .317em
}

ul.elgg-pagination li.active, ul.elgg-pagination li.elgg-state-selected {
    padding: .422em .602em .317em;
    color: #fff;
    background-color: #5b5b5a;
    border: 1px solid #5b5b5a
}

ul#groups-tools > li {
	border-radius: 3px;
	padding: 1em;
	border:1px solid #ccc;
}

ul#groups-tools {
	padding: 0;
}

#groups-tools .elgg-module {
	margin-bottom: 0;
}

.elgg-gallery li h3 {
	margin: 0;
    font-family: "Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif;
	font-size: 1.25em;
}

.nav-pills.nav-stacked {
	text-align: center;
}


ul.elgg-menu.elgg-menu-hover-admin {
    padding: 0;
}
.elgg-menu-hover-admin .elgg-menu-hover-actions, ul.elgg-menu.elgg-menu-hover-admin, ul.elgg-menu.elgg-menu-hover-actions {
	padding: 0;
}

ul.elgg-menu.elgg-menu-hover {
	padding: .75em;
	min-height: 4em;
    box-shadow: 0px 1px 3px rgba(0,0,0,0.3);
    border-radius: 6px;
}

ul.elgg-menu.elgg-menu-hover li {
    font-family: "Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif;
    list-style: none;
    padding: 0;
}

.file-photo {
	text-align: left;
}

.elgg-message {
    font-family: "Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif;
    padding:1em;
    list-style:none;
    margin-top:3em;
    color:#fff;
    border-radius: 6px;
}

.elgg-message.elgg-state-success {
    background-color:#008A2C;
}

.elgg-message.elgg-state-error {
    background-color:#D00000;
}

.elgg-item-object-messages > .elgg-image-block > .elgg-body {
    width: calc(100% - 51px);
}

.messages-owner {
    font-size: 1.25em;
	font-family: "Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif;
}

.messages-delete {
	position:absolute;
	top:1.25em;
	right:1em;
}

.pr-message-checkbox {
	position:absolute;
	top: 1.25em;
	left: 1.25em;
}

.messages-timestamp {
	font-size:.75em;
	font-family: "Gotham SSm A","Gotham SSm B",Verdana,"Verdana Ref",Geneva,Tahoma,"Lucida Grande","Lucida Sans Unicode","Lucida Sans","DejaVu Sans","Bitstream Vera Sans","Liberation Sans",sans-serif;
}

.elgg-item-object-messages {
	padding:0;
}

.pr-wire-from form fieldset {
    border: 0;
    margin: 0 0 2em 0;
    padding: 0;
}

.pr-wire-from {
	padding: 1em;
	border-bottom: none;
    box-shadow: 0px 1px 3px rgba(0,0,0,0.3);
    margin-bottom: 1em;
    list-style-type: none;
    background-color: #eceae3;
    border-radius: 6px;
}

@media (max-width: 1600px) {
	.groups-profile-fields b {
		display: block;
	    width: 100%;
	    float: none;
	}
	.groups-profile-fields span {
	    display: block;
	    width: 100%;
	    float: none;
	}
}

@media (max-width: 900px) {

	.groups-profile .elgg-image {
		float: none;
		width: 100%;
		padding: 0;
	}
	.groups-profile .elgg-body {
		width: 100%;
		padding: 0;
	}
}

@media (max-width: 756px) {

	#profile-details .PR-profile-info b {
		display: block;
	    width: 100%;
	    float: none;
	}
	#profile-details .PR-profile-info span {
	    display: block;
	    width: 100%;
	    float: none;
	}

	.elgg-item.elgg-item-user .elgg-body {
		width: 100%;
	}

	.elgg-item.elgg-item-user .elgg-image {
		float: none;
	}

	.elgg-item.elgg-item-user .elgg-image .elgg-avatar {
		display: block;
		margin: 0 auto;
		width: 200px;
	}

}
 No newline at end of file
+91 −0
Original line number Original line Diff line number Diff line
/**
 * Modbash Clean Elgg Theme
 *
 * Copyright (c) 2015 ModBash
 *
 * @author     Shane Barron <admin@modbash.com>
 * @copyright  2015 SocialApparatus
 * @license    GNU General Public License (GPL) version 2
 * @version    1
 * @link       http://modbash.com
 */

.elgg-form-login,
.elgg-form-account {
    max-width:1000px;
}
.elgg-menu > li > a {
    margin-bottom: 5px;
}
.fileinput {
    margin-bottom:5px;
}
.profile .elgg-inner {
    border:none;
}
.elgg-input-access {
    margin:0px;
}
.elgg-page-body {
    padding:0px;
}

.elgg-menu-extras li {
    margin-right:5px;
}
.elgg-module-widget > .elgg-body,
.elgg-body,
.elgg-module {
    overflow:initial;
}
.bootstrap-select:not([class*="col-"]):not([class*="form-control"]):not(.input-group-btn) {
    width:auto;
}
.profile .btn-group {
    margin-top:20px;
    margin-bottom:20px;
}
.profile .elgg-menu-owner-block {
    margin-bottom:20px;
}
.elgg-form-avatar-upload label {
    margin-bottom:10px;
}
.selectpicker {
    margin-top:5px;
    margin-bottom:5px;
}
.bookmark span {
    margin-right:5px;
}
.groups-profile .elgg-body {
    overflow:hidden;
}
.elgg-menu-footer > li::after {
    display:none;
}
.elgg-menu-widget > .elgg-menu-item-settings {
    right:30px;
}
.elgg-page-footer {
    padding-top:20px;
}

/**
Fix message reply
**/
#messages-reply-form {
    display: block !important;
}

.elgg-menu-item-reply {
    display: none !important;
}

/**
Avatar generator styles
Framework sets max-width: 100%, which causes problems with the preview
**/
#user-avatar-preview img {
    max-width: inherit !important;
}
Original line number Original line Diff line number Diff line
/*
 * jQuery UI Autocomplete HTML Extension
 *
 * Copyright 2010, Scott González (http://scottgonzalez.com)
 * Dual licensed under the MIT or GPL Version 2 licenses.
 *
 * http://github.com/scottgonzalez/jquery-ui-extensions
 */
(function(factory) {
	if (typeof define === 'function' && define.amd) {
		// AMD
		define(['jquery'], factory);
	} else if (typeof module === 'object' && module.exports) {
		factory(require('jquery'));
	} else {
		// Browser globals
		factory(jQuery);
	}
}(function(jQuery) {
(function( $ ) {

	var proto = $.ui.autocomplete.prototype,
		initSource = proto._initSource;

	function filter( array, term ) {
		var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
		return $.grep( array, function(value) {
			return matcher.test( $( "<div>" ).html( value.label || value.value || value ).text() );
		});
	}

	$.extend( proto, {
		_initSource: function() {
			if ( this.options.html && $.isArray(this.options.source) ) {
				this.source = function( request, response ) {
					response( filter( this.options.source, request.term ) );
				};
			} else {
				initSource.call( this );
			}
		},

		_renderItem: function( ul, item) {
			return $( "<li></li>" )
				.data( "item.autocomplete", item )
				.append( $( "<a></a>" )[ this.options.html ? "html" : "text" ]( item.label ) )
				.appendTo( ul );
		}
	});

})( jQuery );
}));
 No newline at end of file
+3 −0
Original line number Original line Diff line number Diff line
require(['idm'], function(idm) {
	idm.setLogoutURL('/logout');
});
Original line number Original line Diff line number Diff line
/**
 * Avatar cropping
 */

elgg.provide('elgg.avatarCropper');

/**
 * Register the avatar cropper.
 *
 * If the hidden inputs have the coordinates from a previous cropping, begin
 * the selection and preview with that displayed.
 */
elgg.avatarCropper.init = function() {
	//Load imgAreaSelect with requirejs (this is all that this override does)
	require(['jquery', 'unl_theme/jquery.imgareaselect'], function($) {
		var params = {
			selectionOpacity: 0,
			aspectRatio: '1:1',
			onSelectEnd: elgg.avatarCropper.selectChange,
			onSelectChange: elgg.avatarCropper.preview
		};

		if ($('input[name=x2]').val()) {
			params.x1 = $('input[name=x1]').val();
			params.x2 = $('input[name=x2]').val();
			params.y1 = $('input[name=y1]').val();
			params.y2 = $('input[name=y2]').val();
		}

		$('#user-avatar-cropper').imgAreaSelect(params);

		if ($('input[name=x2]').val()) {

			// TODO figure out why this is necessary
			$(window).on('load', function () {
				var ias = $('#user-avatar-cropper').imgAreaSelect({instance: true});
				var selection = ias.getSelection();
				elgg.avatarCropper.preview($('#user-avatar-cropper'), selection);
			});
		}
	});
};

/**
 * Handler for changing select area.
 *
 * @param {Object} img       reference to the image
 * @param {Object} selection imgareaselect selection object
 * @return void
 */
elgg.avatarCropper.preview = function(img, selection) {
	// catch for the first click on the image
	if (selection.width === 0 || selection.height === 0) {
		return;
	}

	var origWidth = $("#user-avatar-cropper").width();
	var origHeight = $("#user-avatar-cropper").height();
	var scaleX = 100 / selection.width;
	var scaleY = 100 / selection.height;
	$('#user-avatar-preview > img').css({
		width: Math.round(scaleX * origWidth) + 'px',
		height: Math.round(scaleY * origHeight) + 'px',
		marginLeft: '-' + Math.round(scaleX * selection.x1) + 'px',
		marginTop: '-' + Math.round(scaleY * selection.y1) + 'px'
	});
};

/**
 * Handler for updating the form inputs after select ends
 *
 * @param {Object} img       reference to the image
 * @param {Object} selection imgareaselect selection object
 * @return void
 */
elgg.avatarCropper.selectChange = function(img, selection) {
	$('input[name=x1]').val(selection.x1);
	$('input[name=x2]').val(selection.x2);
	$('input[name=y1]').val(selection.y1);
	$('input[name=y2]').val(selection.y2);
};

elgg.register_hook_handler('init', 'system', elgg.avatarCropper.init);
 No newline at end of file
+24 −0
Original line number Original line Diff line number Diff line
<?php

/**
 * Modbash Clean Elgg Theme
 *
 * Copyright (c) 2015 ModBash
 *
 * @author     Shane Barron <admin@modbash.com>
 * @copyright  2015 SocialApparatus
 * @license    GNU General Public License (GPL) version 2
 * @version    1
 * @link       http://modbash.com
 */
$english = array(
    "your-account" => "Your Account",
    "view-your-profile" => "Your Profile",
    "edit-your-profile" => "Edit Profile",
    "edit-your-avatar" => "Edit Avatar",
    "view-your-inbox" => "Your Inbox",
    "view-your-friends" => "Your Friends",
    "view-your-settings" => "Your Settings",
    "signin" => "Sign In",
);
add_translation("en", $english);
+15 −0
Original line number Original line Diff line number Diff line
<?xml version="1.0" encoding="UTF-8"?>
<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
    <name>UNL Theme</name>
    <id>unl_theme</id>
    <author>UNL</author>
    <version>4.1</version>
    <category>theme</category>
    <description>UNL Theme based on the elgg_clean theme</description>
    <website>http://modbash.com</website>
    <license>GNU Public License V2</license>
    <requires>
        <type>elgg_release</type>
        <version>1.8</version>
    </requires>
</plugin_manifest>
+149 −0
Original line number Original line Diff line number Diff line
<?php

/**
 * Modbash Clean Elgg Theme
 *
 * Copyright (c) 2015 ModBash
 *
 * @author     Shane Barron <admin@modbash.com>
 * @copyright  2015 SocialApparatus
 * @license    GNU General Public License (GPL) version 2
 * @version    1
 * @link       http://modbash.com
 */
require_once __DIR__ . '/vendor/autoload.php';
elgg_register_event_handler('init', 'system', 'unl_theme_init');


function unl_theme_init() {

    elgg_unextend_view('page/elements/header', 'search/header');
    elgg_extend_view('page/elements/sidebar', 'search/header', 0);
    
    elgg_require_js("elgg/Plugin");
    elgg_require_js("elgg/spinner");

    if (elgg_get_context() != "admin") {
        elgg_require_js("unl_theme/js");
    }

    elgg_register_event_handler('pagesetup', 'system', 'unl_theme_pagesetup', 1000);

    elgg_register_plugin_hook_handler('head', 'page', 'unl_theme_setup_head');

    $bower = elgg_get_site_url() . "mod/unl_theme/vendors/bower_components/";

    elgg_register_css("open", "https://fonts.googleapis.com/css?family=Open+Sans:400,700,700italic,400italic");
    elgg_register_css("passion", "https://fonts.googleapis.com/css?family=Passion+One");
    elgg_register_css("unl_theme", elgg_get_site_url() . "mod/unl_theme/css/unl_theme.css", 10000);
    elgg_register_css("font-awesome", "{$bower}fontawesome/css/font-awesome.min.css");
    // elgg_register_css("fuelux", "{$bower}fuelux/dist/css/fuelux.min.css");
    elgg_register_css("agency", elgg_get_site_url() . "mod/unl_theme/css/planetred.css", 20000);
    elgg_register_css("home", elgg_get_site_url() . "mod/unl_theme/css/home.css", 30000);
    elgg_register_js('respond', 'mod/unl_theme/vendors/bower_components/respond/src/respond.js');
    elgg_define_js("bootstrap", array("src" => "{$bower}bootstrap/dist/js/bootstrap.min.js"));
    elgg_register_js("bootstrap-select", "{$bower}bootstrap-select/dist/js/bootstrap-select.min.js");
    elgg_register_js("jasny", "{$bower}jasny-bootstrap/dist/js/jasny-bootstrap.min.js");
    elgg_register_js("cbpAnimatedHeader", elgg_get_site_url() . "mod/unl_theme/js/cbpAnimatedHeader.js");
    elgg_register_js("classie", elgg_get_site_url() . "mod/unl_theme/js/classie.js");
    elgg_register_js("scrollspy", "{$bower}scrollspy/jquery.scrollspy.js");
    // elgg_register_js("parallax", "{$boder}jquery-parallax/scripts/jquery.parallax-1.13.js");
    // elgg_register_js("scrollto", "{$bower}jquery-parallax/scripts/jquery.scrollTo-1.4.2-min.js");
    // elgg_define_js('fuelux', array(
        // 'src' => "{$bower}fuelux/dist/js/fuelux.js",
    // ));

    if (elgg_get_context() != "admin") {
        /**
         * Elgg has its own requireJS, and expects a different baseURL than the UNL framework. Reset back to the framework.
         * Only do this for the main interface, the admin interface requires requirejs.
         */
        $base_url = elgg_get_site_url();

        //Add paths stuff to the requirejs config
        _elgg_services()->amdConfig->removePath('languages/en');
        _elgg_services()->amdConfig->addPath('languages/en', $base_url.'js/languages');
        _elgg_services()->amdConfig->addPath('elgg/reportedcontent', $base_url.'mod/reportedcontent/views/default/elgg/reportedcontent');
        _elgg_services()->amdConfig->addPath('elgg/UserPicker', $base_url.'views/default/elgg/UserPicker');
        _elgg_services()->amdConfig->addPath('unl_theme/js', $base_url.'mod/unl_theme/views/default/js/unl_theme/js');
        _elgg_services()->amdConfig->addPath('unl_theme/jquery.imgareaselect', $base_url.'mod/unl_theme/js/jquery.imgareaselect');
        _elgg_services()->amdConfig->addPath('bootstrap', $base_url.'mod/unl_theme/vendors/bower_components/bootstrap/dist/js/bootstrap');
        _elgg_services()->amdConfig->addPath('moment', $base_url.'mod/unl_theme/vendors/bower_components/moment/moment');
        _elgg_services()->amdConfig->addPath('jquery.ui.autocomplete.html', $base_url.'mod/unl_theme/js/jquery.ui.autocomplete.html');
        
        //Tell elgg not to load its own version of require
        // WDN Template version 5.0 hack, use elgg version of require, jquery-ui, and jquery.imgareaselect
        //elgg_unregister_js('require');  // !!! Leave commented out ^
        //elgg_unregister_js('jquery-ui'); // !!! Leave commented out ^
        //elgg_unregister_js('jquery.imgareaselect'); // !!! Leave commented out ^
        
        //Load our own cropper that uses requirejs (make sure it loads last)
        elgg_register_js('elgg.avatar_cropper', $base_url.'mod/unl_theme/js/ui.avatar_cropper.js', 'head', 9000);
        
        //elgg_load_js("agency");
        elgg_load_js('respond');
        elgg_load_js("bootstrap");
        elgg_load_js("jscolor");
        elgg_load_js("unl_theme");
        elgg_load_js("bootstrap-select");
        elgg_load_js("jasny");
        elgg_load_js("parallax");
        elgg_load_js("scrollto");
        // elgg_require_js("fuelux");
        elgg_load_css("bootstrap");
        elgg_load_css("open");
        elgg_load_css("passion");
        elgg_load_css("font-awesome");
        elgg_load_css("bootstrap-select");
        elgg_load_css("unl_theme");
        elgg_load_css("jasny");
        // elgg_load_css("fuelux");
        elgg_load_css("agency");

        // Disable and Hide activity page
        elgg_unregister_page_handler('activity');
        elgg_unregister_menu_item('site', 'activity');
    }

    // non-members do not get visible links to RSS feeds
    if (!elgg_is_logged_in()) {
        elgg_unregister_plugin_hook_handler('output:before', 'layout', 'elgg_views_add_rss_link');
    }
    elgg_register_action("unl_theme/contact", elgg_get_plugins_path() . "unl_theme/actions/contact.php", "public");
}

/**
 * Rearrange menu items
 */
function unl_theme_pagesetup() {
    elgg_unextend_view('page/elements/header', 'search/header');
}

/**
 * Register items for the html head
 *
 * @param string $hook Hook name ('head')
 * @param string $type Hook type ('page')
 * @param array  $data Array of items for head
 * @return array
 */
function unl_theme_setup_head($hook, $type, $data) {
    $data['metas'][] = array(
        'name' => 'viewport',
        'content' => 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0',
    );
    $data['links'][] = array(
        'id' => 'favicon',
        'rel' => 'shortcut icon',
        'href' => 'https://unlcms.unl.edu/wdn/templates_4.1/includes/icons/favicon.ico',
    );
    $data['links'][] = array(
        'rel' => 'apple-touch-icon',
        'href' => elgg_normalize_url('mod/unl_theme/graphics/homescreen.png'),
    );

    return $data;
}


Original line number Original line Diff line number Diff line
{
  "name": "bootstrap-select",
  "main": [
    "less/bootstrap-select.less",
    "dist/css/bootstrap-select.css",
    "dist/js/bootstrap-select.js"
  ],
  "version": "1.6.4",
  "homepage": "http://silviomoreto.github.io/bootstrap-select",
  "authors": [
    "silviomoreto"
  ],
  "keywords": [
    "form",
    "bootstrap",
    "select",
    "replacement"
  ],
  "dependencies": {
    "jquery": ">=1.8"
  },
  "license": "MIT",
  "ignore": [
    ".gitignore",
    "CONTRIBUTING.md",
    "Gruntfile.js",
    "README.md",
    "composer.json",
    "package.json",
    "test.html"
  ],
  "_release": "1.6.4",
  "_resolution": {
    "type": "version",
    "tag": "v1.6.4",
    "commit": "f2a963c00eed9a72f48759507f423f08d7506627"
  },
  "_source": "git://github.com/silviomoreto/bootstrap-select.git",
  "_target": "~1.6.4",
  "_originalSource": "bootstrap-select",
  "_direct": true
}
 No newline at end of file
Original line number Original line Diff line number Diff line
The MIT License (MIT)

Copyright (c) 2013-2015 bootstrap-select

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Original line number Original line Diff line number Diff line
{
  "name": "bootstrap-select",
  "main": [
    "less/bootstrap-select.less",
    "dist/css/bootstrap-select.css",
    "dist/js/bootstrap-select.js"
  ],
  "version": "1.6.4",
  "homepage": "http://silviomoreto.github.io/bootstrap-select",
  "authors": [
    "silviomoreto"
  ],
  "keywords": [
    "form",
    "bootstrap",
    "select",
    "replacement"
  ],
  "dependencies": {
    "jquery": ">=1.8"
  },
  "license": "MIT",
  "ignore": [
    ".gitignore",
    "CONTRIBUTING.md",
    "Gruntfile.js",
    "README.md",
    "composer.json",
    "package.json",
    "test.html"
  ]
}
Original line number Original line Diff line number Diff line
/*!
 * Bootstrap-select v1.6.4 (http://silviomoreto.github.io/bootstrap-select)
 *
 * Copyright 2013-2015 bootstrap-select
 * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
 */

.bootstrap-select {
  width: 220px \0;
  /*IE9 and below*/
}
.bootstrap-select > .btn {
  width: 100%;
  padding-right: 25px;
}
.has-error .bootstrap-select .dropdown-toggle,
.error .bootstrap-select .dropdown-toggle {
  border-color: #b94a48;
}
.bootstrap-select.fit-width {
  width: auto !important;
}
.bootstrap-select:not([class*="col-"]):not([class*="form-control"]):not(.input-group-btn) {
  width: 220px;
}
.bootstrap-select .btn:focus {
  outline: thin dotted #333333 !important;
  outline: 5px auto -webkit-focus-ring-color !important;
  outline-offset: -2px;
}
.bootstrap-select.form-control {
  margin-bottom: 0;
  padding: 0;
  border: none;
}
.bootstrap-select.form-control:not([class*="col-"]) {
  width: 100%;
}
.bootstrap-select.btn-group:not(.input-group-btn),
.bootstrap-select.btn-group[class*="col-"] {
  float: none;
  display: inline-block;
  margin-left: 0;
}
.bootstrap-select.btn-group.dropdown-menu-right,
.bootstrap-select.btn-group[class*="col-"].dropdown-menu-right,
.row-fluid .bootstrap-select.btn-group[class*="col-"].dropdown-menu-right {
  float: right;
}
.form-inline .bootstrap-select.btn-group,
.form-horizontal .bootstrap-select.btn-group,
.form-group .bootstrap-select.btn-group {
  margin-bottom: 0;
}
.form-group-lg .bootstrap-select.btn-group.form-control,
.form-group-sm .bootstrap-select.btn-group.form-control {
  padding: 0;
}
.form-inline .bootstrap-select.btn-group .form-control {
  width: 100%;
}
.bootstrap-select.btn-group > .disabled {
  cursor: not-allowed;
}
.bootstrap-select.btn-group > .disabled:focus {
  outline: none !important;
}
.bootstrap-select.btn-group .btn .filter-option {
  display: inline-block;
  overflow: hidden;
  width: 100%;
  text-align: left;
}
.bootstrap-select.btn-group .btn .caret {
  position: absolute;
  top: 50%;
  right: 12px;
  margin-top: -2px;
  vertical-align: middle;
}
.bootstrap-select.btn-group[class*="col-"] .btn {
  width: 100%;
}
.bootstrap-select.btn-group .dropdown-menu {
  min-width: 100%;
  z-index: 1035;
  -webkit-box-sizing: border-box;
     -moz-box-sizing: border-box;
          box-sizing: border-box;
}
.bootstrap-select.btn-group .dropdown-menu.inner {
  position: static;
  border: 0;
  padding: 0;
  margin: 0;
  border-radius: 0;
  -webkit-box-shadow: none;
          box-shadow: none;
}
.bootstrap-select.btn-group .dropdown-menu li {
  position: relative;
}
.bootstrap-select.btn-group .dropdown-menu li:not(.disabled) a:hover small,
.bootstrap-select.btn-group .dropdown-menu li:not(.disabled) a:focus small,
.bootstrap-select.btn-group .dropdown-menu li.active:not(.disabled) a small {
  color: rgba(100, 177, 216, 0.4);
}
.bootstrap-select.btn-group .dropdown-menu li.disabled a {
  cursor: not-allowed;
}
.bootstrap-select.btn-group .dropdown-menu li a {
  cursor: pointer;
}
.bootstrap-select.btn-group .dropdown-menu li a.opt {
  position: relative;
  padding-left: 2.25em;
}
.bootstrap-select.btn-group .dropdown-menu li a span.check-mark {
  display: none;
}
.bootstrap-select.btn-group .dropdown-menu li a span.text {
  display: inline-block;
}
.bootstrap-select.btn-group .dropdown-menu li small {
  padding-left: 0.5em;
}
.bootstrap-select.btn-group .dropdown-menu .notify {
  position: absolute;
  bottom: 5px;
  width: 96%;
  margin: 0 2%;
  min-height: 26px;
  padding: 3px 5px;
  background: #f5f5f5;
  border: 1px solid #e3e3e3;
  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
  pointer-events: none;
  opacity: 0.9;
  -webkit-box-sizing: border-box;
     -moz-box-sizing: border-box;
          box-sizing: border-box;
}
.bootstrap-select.btn-group .no-results {
  padding: 3px;
  background: #f5f5f5;
  margin: 0 5px;
}
.bootstrap-select.btn-group.fit-width .btn .filter-option {
  position: static;
}
.bootstrap-select.btn-group.fit-width .btn .caret {
  position: static;
  top: auto;
  margin-top: -1px;
}
.bootstrap-select.btn-group.show-tick .dropdown-menu li.selected a span.check-mark {
  position: absolute;
  display: inline-block;
  right: 15px;
  margin-top: 5px;
}
.bootstrap-select.btn-group.show-tick .dropdown-menu li a span.text {
  margin-right: 34px;
}
.bootstrap-select.show-menu-arrow.open > .btn {
  z-index: 1036;
}
.bootstrap-select.show-menu-arrow .dropdown-toggle:before {
  content: '';
  border-left: 7px solid transparent;
  border-right: 7px solid transparent;
  border-bottom: 7px solid rgba(204, 204, 204, 0.2);
  position: absolute;
  bottom: -4px;
  left: 9px;
  display: none;
}
.bootstrap-select.show-menu-arrow .dropdown-toggle:after {
  content: '';
  border-left: 6px solid transparent;
  border-right: 6px solid transparent;
  border-bottom: 6px solid white;
  position: absolute;
  bottom: -4px;
  left: 10px;
  display: none;
}
.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:before {
  bottom: auto;
  top: -3px;
  border-top: 7px solid rgba(204, 204, 204, 0.2);
  border-bottom: 0;
}
.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:after {
  bottom: auto;
  top: -3px;
  border-top: 6px solid white;
  border-bottom: 0;
}
.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:before {
  right: 12px;
  left: auto;
}
.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:after {
  right: 13px;
  left: auto;
}
.bootstrap-select.show-menu-arrow.open > .dropdown-toggle:before,
.bootstrap-select.show-menu-arrow.open > .dropdown-toggle:after {
  display: block;
}
.bs-searchbox,
.bs-actionsbox,
.bs-donebutton {
  padding: 4px 8px;
}
.bs-actionsbox {
  float: left;
  width: 100%;
  -webkit-box-sizing: border-box;
     -moz-box-sizing: border-box;
          box-sizing: border-box;
}
.bs-actionsbox .btn-group button {
  width: 50%;
}
.bs-donebutton {
  float: left;
  width: 100%;
  -webkit-box-sizing: border-box;
     -moz-box-sizing: border-box;
          box-sizing: border-box;
}
.bs-donebutton .btn-group button {
  width: 100%;
}
.bs-searchbox + .bs-actionsbox {
  padding: 0 8px 4px;
}
.bs-searchbox input.form-control {
  margin-bottom: 0;
  width: 100%;
}
.mobile-device {
  position: absolute;
  top: 0;
  left: 0;
  display: block !important;
  width: 100%;
  height: 100% !important;
  opacity: 0;
}
/*# sourceMappingURL=bootstrap-select.css.map */
 No newline at end of file
Original line number Original line Diff line number Diff line
{"version":3,"sources":["less/bootstrap-select.less","bootstrap-select.css"],"names":[],"mappings":"AAQA;EACE,iBAAA;ECPA,kBAAiB;EAClB;ADKD;EAKI,aAAA;EACA,qBAAA;ECPH;ADWC;;EAEE,uBAAA;ECTH;ADYC;EACE,wBAAA;ECVH;ADaC;EACE,cAAA;ECXH;ADTD;EAwBI,yCAAA;EACA,uDAAA;EACA,sBAAA;ECZH;ADgBD;EACE,kBAAA;EACA,YAAA;EACA,cAAA;ECdD;ADgBC;EACE,aAAA;ECdH;ADoBC;;EAEE,aAAA;EACA,uBAAA;EACA,gBAAA;EClBH;ADyBG;;;EACE,cAAA;ECrBL;ADyBC;;;EAGE,kBAAA;ECvBH;AD0BC;;EAEE,YAAA;ECxBH;AD6BC;EACE,aAAA;EC3BH;ADJD;EA7CE,qBAAA;ECoDD;AD8BG;EACE,0BAAA;EC5BL;ADVD;EA6CM,uBAAA;EACA,kBAAA;EACA,aAAA;EACA,kBAAA;EChCL;ADhBD;EAoDM,oBAAA;EACA,UAAA;EACA,aAAA;EACA,kBAAA;EACA,wBAAA;ECjCL;ADqCC;EACE,aAAA;ECnCH;AD1BD;EAkEI,iBAAA;EACA,eAAA;EACA,gCAAA;KAAA,6BAAA;UAAA,wBAAA;ECrCH;ADuCG;EACE,kBAAA;EACA,WAAA;EACA,YAAA;EACA,WAAA;EACA,kBAAA;EACA,0BAAA;UAAA,kBAAA;ECrCL;ADvCD;EAgFM,oBAAA;ECtCL;ADwCK;;;EAGE,iCAAA;ECtCP;ADyCK;EArIJ,qBAAA;EC+FD;ADlDD;EA6FQ,iBAAA;ECxCP;AD0CO;EACE,oBAAA;EACA,sBAAA;ECxCT;ADzDD;EAqGU,eAAA;ECzCT;AD5DD;EAwGU,uBAAA;ECzCT;AD/DD;EA6GQ,qBAAA;EC3CP;ADlED;EAkHM,oBAAA;EACA,aAAA;EACA,YAAA;EACA,cAAA;EACA,kBAAA;EACA,kBAAA;EACA,qBAAA;EACA,2BAAA;EACA,yDAAA;UAAA,iDAAA;EACA,sBAAA;EACA,cAAA;EACA,gCAAA;KAAA,6BAAA;UAAA,wBAAA;EC7CL;ADhFD;EAkII,cAAA;EACA,qBAAA;EACA,eAAA;EC/CH;ADkDC;EAEI,kBAAA;ECjDL;AD+CC;EAMI,kBAAA;EACA,WAAA;EACA,kBAAA;EClDL;ADuDG;EACE,oBAAA;EACA,uBAAA;EACA,aAAA;EACA,iBAAA;ECrDL;ADgDC;EASI,oBAAA;ECtDL;AD4DC;EACE,eAAA;EC1DH;AD8DG;EACE,aAAA;EACA,oCAAA;EACA,qCAAA;EACA,mDAAA;EACA,oBAAA;EACA,cAAA;EACA,WAAA;EACA,eAAA;EC5DL;AD+DG;EACE,aAAA;EACA,oCAAA;EACA,qCAAA;EACA,gCAAA;EACA,oBAAA;EACA,cAAA;EACA,YAAA;EACA,eAAA;EC7DL;ADkEG;EACE,cAAA;EACA,WAAA;EACA,gDAAA;EACA,kBAAA;EChEL;ADmEG;EACE,cAAA;EACA,WAAA;EACA,6BAAA;EACA,kBAAA;ECjEL;ADsEG;EACE,aAAA;EACA,YAAA;ECpEL;ADuEG;EACE,aAAA;EACA,YAAA;ECrEL;AD0EG;;EAEE,gBAAA;ECxEL;AD6ED;;;EAGE,kBAAA;EC3ED;AD8ED;EACE,aAAA;EACA,aAAA;EACA,gCAAA;KAAA,6BAAA;UAAA,wBAAA;EC5ED;AD8EC;EACE,YAAA;EC5EH;ADgFD;EACE,aAAA;EACA,aAAA;EACA,gCAAA;KAAA,6BAAA;UAAA,wBAAA;EC9ED;ADgFC;EACE,aAAA;EC9EH;ADmFC;EACE,oBAAA;ECjFH;ADoFC;EACE,kBAAA;EACA,aAAA;EClFH;ADsFD;EACE,oBAAA;EACA,QAAA;EACA,SAAA;EACA,2BAAA;EACA,aAAA;EACA,yBAAA;EACA,YAAA;ECpFD","file":"bootstrap-select.css","sourcesContent":["@import \"variables\";\n\n// Mixins\n.cursor-disabled() {\n  cursor: not-allowed;\n}\n\n// Rules\n.bootstrap-select {\n  width: 220px \\0; /*IE9 and below*/\n\n  // The selectpicker button\n  > .btn {\n    width: 100%;\n    padding-right: 25px;\n  }\n\n  // Error display\n  .has-error & .dropdown-toggle,\n  .error & .dropdown-toggle {\n    border-color: @color-red-error;\n  }\n\n  &.fit-width {\n    width: auto !important;\n  }\n\n  &:not([class*=\"col-\"]):not([class*=\"form-control\"]):not(.input-group-btn) {\n    width: @width-default;\n  }\n\n  .btn:focus {\n    outline: thin dotted #333333 !important;\n    outline: 5px auto -webkit-focus-ring-color !important;\n    outline-offset: -2px;\n  }\n}\n\n.bootstrap-select.form-control {\n  margin-bottom: 0;\n  padding: 0;\n  border: none;\n\n  &:not([class*=\"col-\"]) {\n    width: 100%;\n  }\n}\n\n// The selectpicker components\n.bootstrap-select.btn-group {\n  &:not(.input-group-btn),\n  &[class*=\"col-\"] {\n    float: none;\n    display: inline-block;\n    margin-left: 0;\n  }\n\n  // Forces the pull to the right, if necessary\n  &,\n  &[class*=\"col-\"],\n  .row-fluid &[class*=\"col-\"] {\n    &.dropdown-menu-right {\n      float: right;\n    }\n  }\n\n  .form-inline &,\n  .form-horizontal &,\n  .form-group & {\n    margin-bottom: 0;\n  }\n\n  .form-group-lg &.form-control,\n  .form-group-sm &.form-control {\n    padding: 0;\n  }\n\n  // Set the width of the live search (and any other form control within an inline form)\n  // see https://github.com/silviomoreto/bootstrap-select/issues/685\n  .form-inline & .form-control {\n    width: 100%;\n  }\n\n  > .disabled {\n    .cursor-disabled();\n\n    &:focus {\n      outline: none !important;\n    }\n  }\n\n  // The selectpicker button\n  .btn {\n    .filter-option {\n      display: inline-block;\n      overflow: hidden;\n      width: 100%;\n      text-align: left;\n    }\n\n    .caret {\n      position: absolute;\n      top: 50%;\n      right: 12px;\n      margin-top: -2px;\n      vertical-align: middle;\n    }\n  }\n\n  &[class*=\"col-\"] .btn {\n    width: 100%;\n  }\n\n  // The selectpicker dropdown\n  .dropdown-menu {\n    min-width: 100%;\n    z-index: @zindex-select-dropdown;\n    box-sizing: border-box;\n\n    &.inner {\n      position: static;\n      border: 0;\n      padding: 0;\n      margin: 0;\n      border-radius: 0;\n      box-shadow: none;\n    }\n\n    li {\n      position: relative;\n\n      &:not(.disabled) a:hover small,\n      &:not(.disabled) a:focus small,\n      &.active:not(.disabled) a small {\n        color: @color-blue-hover;\n      }\n\n      &.disabled a {\n        .cursor-disabled();\n      }\n\n      a {\n        cursor: pointer;\n\n        &.opt {\n          position: relative;\n          padding-left: 2.25em;\n        }\n\n        span.check-mark {\n          display: none;\n        }\n        span.text {\n          display: inline-block;\n        }\n      }\n\n      small {\n        padding-left: 0.5em;\n      }\n    }\n\n    .notify {\n      position: absolute;\n      bottom: 5px;\n      width: 96%;\n      margin: 0 2%;\n      min-height: 26px;\n      padding: 3px 5px;\n      background: rgb(245, 245, 245);\n      border: 1px solid rgb(227, 227, 227);\n      box-shadow: inset 0 1px 1px fade(rgb(0, 0, 0), 5%);\n      pointer-events: none;\n      opacity: 0.9;\n      box-sizing: border-box;\n    }\n  }\n\n  .no-results {\n    padding: 3px;\n    background: #f5f5f5;\n    margin: 0 5px;\n  }\n\n  &.fit-width .btn {\n    .filter-option {\n      position: static;\n    }\n\n    .caret {\n      position: static;\n      top: auto;\n      margin-top: -1px;\n    }\n  }\n\n  &.show-tick .dropdown-menu li {\n    &.selected a span.check-mark {\n      position: absolute;\n      display: inline-block;\n      right: 15px;\n      margin-top: 5px;\n    }\n\n    a span.text {\n      margin-right: 34px;\n    }\n  }\n}\n\n.bootstrap-select.show-menu-arrow {\n  &.open > .btn {\n    z-index: (@zindex-select-dropdown + 1);\n  }\n\n  .dropdown-toggle {\n    &:before {\n      content: '';\n      border-left: 7px solid transparent;\n      border-right: 7px solid transparent;\n      border-bottom: 7px solid @color-grey-arrow;\n      position: absolute;\n      bottom: -4px;\n      left: 9px;\n      display: none;\n    }\n\n    &:after {\n      content: '';\n      border-left: 6px solid transparent;\n      border-right: 6px solid transparent;\n      border-bottom: 6px solid white;\n      position: absolute;\n      bottom: -4px;\n      left: 10px;\n      display: none;\n    }\n  }\n\n  &.dropup .dropdown-toggle {\n    &:before {\n      bottom: auto;\n      top: -3px;\n      border-top: 7px solid @color-grey-arrow;\n      border-bottom: 0;\n    }\n\n    &:after {\n      bottom: auto;\n      top: -3px;\n      border-top: 6px solid white;\n      border-bottom: 0;\n    }\n  }\n\n  &.pull-right .dropdown-toggle {\n    &:before {\n      right: 12px;\n      left: auto;\n    }\n\n    &:after {\n      right: 13px;\n      left: auto;\n    }\n  }\n\n  &.open > .dropdown-toggle {\n    &:before,\n    &:after {\n      display: block;\n    }\n  }\n}\n\n.bs-searchbox,\n.bs-actionsbox,\n.bs-donebutton {\n  padding: 4px 8px;\n}\n\n.bs-actionsbox {\n  float: left;\n  width: 100%;\n  box-sizing: border-box;\n\n  & .btn-group button {\n    width: 50%;\n  }\n}\n\n.bs-donebutton {\n  float: left;\n  width: 100%;\n  box-sizing: border-box;\n\n  & .btn-group button {\n    width: 100%;\n  }\n}\n\n.bs-searchbox {\n  & + .bs-actionsbox {\n    padding: 0 8px 4px;\n  }\n\n  & input.form-control {\n    margin-bottom: 0;\n    width: 100%;\n  }\n}\n\n.mobile-device {\n  position: absolute;\n  top: 0;\n  left: 0;\n  display: block !important;\n  width: 100%;\n  height: 100% !important;\n  opacity: 0;\n}\n",".bootstrap-select {\n  width: 220px \\0;\n  /*IE9 and below*/\n}\n.bootstrap-select > .btn {\n  width: 100%;\n  padding-right: 25px;\n}\n.has-error .bootstrap-select .dropdown-toggle,\n.error .bootstrap-select .dropdown-toggle {\n  border-color: #b94a48;\n}\n.bootstrap-select.fit-width {\n  width: auto !important;\n}\n.bootstrap-select:not([class*=\"col-\"]):not([class*=\"form-control\"]):not(.input-group-btn) {\n  width: 220px;\n}\n.bootstrap-select .btn:focus {\n  outline: thin dotted #333333 !important;\n  outline: 5px auto -webkit-focus-ring-color !important;\n  outline-offset: -2px;\n}\n.bootstrap-select.form-control {\n  margin-bottom: 0;\n  padding: 0;\n  border: none;\n}\n.bootstrap-select.form-control:not([class*=\"col-\"]) {\n  width: 100%;\n}\n.bootstrap-select.btn-group:not(.input-group-btn),\n.bootstrap-select.btn-group[class*=\"col-\"] {\n  float: none;\n  display: inline-block;\n  margin-left: 0;\n}\n.bootstrap-select.btn-group.dropdown-menu-right,\n.bootstrap-select.btn-group[class*=\"col-\"].dropdown-menu-right,\n.row-fluid .bootstrap-select.btn-group[class*=\"col-\"].dropdown-menu-right {\n  float: right;\n}\n.form-inline .bootstrap-select.btn-group,\n.form-horizontal .bootstrap-select.btn-group,\n.form-group .bootstrap-select.btn-group {\n  margin-bottom: 0;\n}\n.form-group-lg .bootstrap-select.btn-group.form-control,\n.form-group-sm .bootstrap-select.btn-group.form-control {\n  padding: 0;\n}\n.form-inline .bootstrap-select.btn-group .form-control {\n  width: 100%;\n}\n.bootstrap-select.btn-group > .disabled {\n  cursor: not-allowed;\n}\n.bootstrap-select.btn-group > .disabled:focus {\n  outline: none !important;\n}\n.bootstrap-select.btn-group .btn .filter-option {\n  display: inline-block;\n  overflow: hidden;\n  width: 100%;\n  text-align: left;\n}\n.bootstrap-select.btn-group .btn .caret {\n  position: absolute;\n  top: 50%;\n  right: 12px;\n  margin-top: -2px;\n  vertical-align: middle;\n}\n.bootstrap-select.btn-group[class*=\"col-\"] .btn {\n  width: 100%;\n}\n.bootstrap-select.btn-group .dropdown-menu {\n  min-width: 100%;\n  z-index: 1035;\n  box-sizing: border-box;\n}\n.bootstrap-select.btn-group .dropdown-menu.inner {\n  position: static;\n  border: 0;\n  padding: 0;\n  margin: 0;\n  border-radius: 0;\n  box-shadow: none;\n}\n.bootstrap-select.btn-group .dropdown-menu li {\n  position: relative;\n}\n.bootstrap-select.btn-group .dropdown-menu li:not(.disabled) a:hover small,\n.bootstrap-select.btn-group .dropdown-menu li:not(.disabled) a:focus small,\n.bootstrap-select.btn-group .dropdown-menu li.active:not(.disabled) a small {\n  color: rgba(100, 177, 216, 0.4);\n}\n.bootstrap-select.btn-group .dropdown-menu li.disabled a {\n  cursor: not-allowed;\n}\n.bootstrap-select.btn-group .dropdown-menu li a {\n  cursor: pointer;\n}\n.bootstrap-select.btn-group .dropdown-menu li a.opt {\n  position: relative;\n  padding-left: 2.25em;\n}\n.bootstrap-select.btn-group .dropdown-menu li a span.check-mark {\n  display: none;\n}\n.bootstrap-select.btn-group .dropdown-menu li a span.text {\n  display: inline-block;\n}\n.bootstrap-select.btn-group .dropdown-menu li small {\n  padding-left: 0.5em;\n}\n.bootstrap-select.btn-group .dropdown-menu .notify {\n  position: absolute;\n  bottom: 5px;\n  width: 96%;\n  margin: 0 2%;\n  min-height: 26px;\n  padding: 3px 5px;\n  background: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n  pointer-events: none;\n  opacity: 0.9;\n  box-sizing: border-box;\n}\n.bootstrap-select.btn-group .no-results {\n  padding: 3px;\n  background: #f5f5f5;\n  margin: 0 5px;\n}\n.bootstrap-select.btn-group.fit-width .btn .filter-option {\n  position: static;\n}\n.bootstrap-select.btn-group.fit-width .btn .caret {\n  position: static;\n  top: auto;\n  margin-top: -1px;\n}\n.bootstrap-select.btn-group.show-tick .dropdown-menu li.selected a span.check-mark {\n  position: absolute;\n  display: inline-block;\n  right: 15px;\n  margin-top: 5px;\n}\n.bootstrap-select.btn-group.show-tick .dropdown-menu li a span.text {\n  margin-right: 34px;\n}\n.bootstrap-select.show-menu-arrow.open > .btn {\n  z-index: 1036;\n}\n.bootstrap-select.show-menu-arrow .dropdown-toggle:before {\n  content: '';\n  border-left: 7px solid transparent;\n  border-right: 7px solid transparent;\n  border-bottom: 7px solid rgba(204, 204, 204, 0.2);\n  position: absolute;\n  bottom: -4px;\n  left: 9px;\n  display: none;\n}\n.bootstrap-select.show-menu-arrow .dropdown-toggle:after {\n  content: '';\n  border-left: 6px solid transparent;\n  border-right: 6px solid transparent;\n  border-bottom: 6px solid white;\n  position: absolute;\n  bottom: -4px;\n  left: 10px;\n  display: none;\n}\n.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:before {\n  bottom: auto;\n  top: -3px;\n  border-top: 7px solid rgba(204, 204, 204, 0.2);\n  border-bottom: 0;\n}\n.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:after {\n  bottom: auto;\n  top: -3px;\n  border-top: 6px solid white;\n  border-bottom: 0;\n}\n.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:before {\n  right: 12px;\n  left: auto;\n}\n.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:after {\n  right: 13px;\n  left: auto;\n}\n.bootstrap-select.show-menu-arrow.open > .dropdown-toggle:before,\n.bootstrap-select.show-menu-arrow.open > .dropdown-toggle:after {\n  display: block;\n}\n.bs-searchbox,\n.bs-actionsbox,\n.bs-donebutton {\n  padding: 4px 8px;\n}\n.bs-actionsbox {\n  float: left;\n  width: 100%;\n  box-sizing: border-box;\n}\n.bs-actionsbox .btn-group button {\n  width: 50%;\n}\n.bs-donebutton {\n  float: left;\n  width: 100%;\n  box-sizing: border-box;\n}\n.bs-donebutton .btn-group button {\n  width: 100%;\n}\n.bs-searchbox + .bs-actionsbox {\n  padding: 0 8px 4px;\n}\n.bs-searchbox input.form-control {\n  margin-bottom: 0;\n  width: 100%;\n}\n.mobile-device {\n  position: absolute;\n  top: 0;\n  left: 0;\n  display: block !important;\n  width: 100%;\n  height: 100% !important;\n  opacity: 0;\n}\n/*# sourceMappingURL=bootstrap-select.css.map */"]}
 No newline at end of file
Original line number Original line Diff line number Diff line
/*!
 * Bootstrap-select v1.6.4 (http://silviomoreto.github.io/bootstrap-select)
 *
 * Copyright 2013-2015 bootstrap-select
 * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
 */.bootstrap-select{width:220px \0}.bootstrap-select>.btn{width:100%;padding-right:25px}.error .bootstrap-select .dropdown-toggle,.has-error .bootstrap-select .dropdown-toggle{border-color:#b94a48}.bootstrap-select.fit-width{width:auto!important}.bootstrap-select:not([class*=col-]):not([class*=form-control]):not(.input-group-btn){width:220px}.bootstrap-select .btn:focus{outline:thin dotted #333!important;outline:5px auto -webkit-focus-ring-color!important;outline-offset:-2px}.bootstrap-select.form-control{margin-bottom:0;padding:0;border:none}.bootstrap-select.form-control:not([class*=col-]){width:100%}.bootstrap-select.btn-group:not(.input-group-btn),.bootstrap-select.btn-group[class*=col-]{float:none;display:inline-block;margin-left:0}.bootstrap-select.btn-group.dropdown-menu-right,.bootstrap-select.btn-group[class*=col-].dropdown-menu-right,.row-fluid .bootstrap-select.btn-group[class*=col-].dropdown-menu-right{float:right}.form-group .bootstrap-select.btn-group,.form-horizontal .bootstrap-select.btn-group,.form-inline .bootstrap-select.btn-group{margin-bottom:0}.form-group-lg .bootstrap-select.btn-group.form-control,.form-group-sm .bootstrap-select.btn-group.form-control{padding:0}.form-inline .bootstrap-select.btn-group .form-control{width:100%}.bootstrap-select.btn-group>.disabled{cursor:not-allowed}.bootstrap-select.btn-group>.disabled:focus{outline:0!important}.bootstrap-select.btn-group .btn .filter-option{display:inline-block;overflow:hidden;width:100%;text-align:left}.bootstrap-select.btn-group .btn .caret{position:absolute;top:50%;right:12px;margin-top:-2px;vertical-align:middle}.bootstrap-select.btn-group[class*=col-] .btn{width:100%}.bootstrap-select.btn-group .dropdown-menu{min-width:100%;z-index:1035;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bootstrap-select.btn-group .dropdown-menu.inner{position:static;border:0;padding:0;margin:0;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.bootstrap-select.btn-group .dropdown-menu li{position:relative}.bootstrap-select.btn-group .dropdown-menu li.active:not(.disabled) a small,.bootstrap-select.btn-group .dropdown-menu li:not(.disabled) a:focus small,.bootstrap-select.btn-group .dropdown-menu li:not(.disabled) a:hover small{color:rgba(100,177,216,.4)}.bootstrap-select.btn-group .dropdown-menu li.disabled a{cursor:not-allowed}.bootstrap-select.btn-group .dropdown-menu li a{cursor:pointer}.bootstrap-select.btn-group .dropdown-menu li a.opt{position:relative;padding-left:2.25em}.bootstrap-select.btn-group .dropdown-menu li a span.check-mark{display:none}.bootstrap-select.btn-group .dropdown-menu li a span.text{display:inline-block}.bootstrap-select.btn-group .dropdown-menu li small{padding-left:.5em}.bootstrap-select.btn-group .dropdown-menu .notify{position:absolute;bottom:5px;width:96%;margin:0 2%;min-height:26px;padding:3px 5px;background:#f5f5f5;border:1px solid #e3e3e3;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05);pointer-events:none;opacity:.9;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bootstrap-select.btn-group .no-results{padding:3px;background:#f5f5f5;margin:0 5px}.bootstrap-select.btn-group.fit-width .btn .filter-option{position:static}.bootstrap-select.btn-group.fit-width .btn .caret{position:static;top:auto;margin-top:-1px}.bootstrap-select.btn-group.show-tick .dropdown-menu li.selected a span.check-mark{position:absolute;display:inline-block;right:15px;margin-top:5px}.bootstrap-select.btn-group.show-tick .dropdown-menu li a span.text{margin-right:34px}.bootstrap-select.show-menu-arrow.open>.btn{z-index:1036}.bootstrap-select.show-menu-arrow .dropdown-toggle:before{content:'';border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid rgba(204,204,204,.2);position:absolute;bottom:-4px;left:9px;display:none}.bootstrap-select.show-menu-arrow .dropdown-toggle:after{content:'';border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;bottom:-4px;left:10px;display:none}.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:before{bottom:auto;top:-3px;border-top:7px solid rgba(204,204,204,.2);border-bottom:0}.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:after{bottom:auto;top:-3px;border-top:6px solid #fff;border-bottom:0}.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:before{right:12px;left:auto}.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:after{right:13px;left:auto}.bootstrap-select.show-menu-arrow.open>.dropdown-toggle:after,.bootstrap-select.show-menu-arrow.open>.dropdown-toggle:before{display:block}.bs-actionsbox,.bs-donebutton,.bs-searchbox{padding:4px 8px}.bs-actionsbox{float:left;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bs-actionsbox .btn-group button{width:50%}.bs-donebutton{float:left;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bs-donebutton .btn-group button{width:100%}.bs-searchbox+.bs-actionsbox{padding:0 8px 4px}.bs-searchbox input.form-control{margin-bottom:0;width:100%}.mobile-device{position:absolute;top:0;left:0;display:block!important;width:100%;height:100%!important;opacity:0}
 No newline at end of file
Original line number Original line Diff line number Diff line
/*!
 * Bootstrap-select v1.6.4 (http://silviomoreto.github.io/bootstrap-select)
 *
 * Copyright 2013-2015 bootstrap-select
 * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
 */
(function ($) {
  $.fn.selectpicker.defaults = {
    noneSelectedText: 'Nic není vybráno',
    noneResultsText: 'Žádné výsledky {0}',
    countSelectedText: 'Označeno {0} z {1}',
    maxOptionsText: ['Limit překročen ({n} {var} max)', 'Limit skupiny překročen ({n} {var} max)', ['položek', 'položka']],
    multipleSeparator: ', '
  };
})(jQuery);
Original line number Original line Diff line number Diff line
/*!
 * Bootstrap-select v1.6.4 (http://silviomoreto.github.io/bootstrap-select)
 *
 * Copyright 2013-2015 bootstrap-select
 * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
 */
!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Nic není vybráno",noneResultsText:"Žádné výsledky {0}",countSelectedText:"Označeno {0} z {1}",maxOptionsText:["Limit překročen ({n} {var} max)","Limit skupiny překročen ({n} {var} max)",["položek","položka"]],multipleSeparator:", "}}(jQuery);
 No newline at end of file
Original line number Original line Diff line number Diff line
/*!
 * Bootstrap-select v1.6.4 (http://silviomoreto.github.io/bootstrap-select)
 *
 * Copyright 2013-2015 bootstrap-select
 * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
 */
!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Bitte wählen...",noneResultsText:"Keine Ergebnisse für {0}",countSelectedText:"{0} von {1} ausgewählt",maxOptionsText:["Limit erreicht ({n} {var} max.)","Gruppen-Limit erreicht ({n} {var} max.)",["Eintrag","Einträge"]],multipleSeparator:", "}}(jQuery);
 No newline at end of file