diff options
-rw-r--r-- | app/connections.apd | 2 | ||||
-rw-r--r-- | assets/home.html | 2 | ||||
-rw-r--r-- | include/RedDAV/RedBrowser.php | 24 | ||||
-rw-r--r-- | library/bootstrap-tagsinput/LICENSE | 20 | ||||
-rw-r--r-- | library/bootstrap-tagsinput/README | 1 | ||||
-rw-r--r-- | library/bootstrap-tagsinput/README.md | 879 | ||||
-rw-r--r-- | library/bootstrap-tagsinput/bootstrap-tagsinput.css | 46 | ||||
-rw-r--r-- | library/bootstrap-tagsinput/bootstrap-tagsinput.js | 643 | ||||
-rw-r--r-- | mod/filestorage.php | 3 | ||||
-rw-r--r-- | view/css/conversation.css | 4 | ||||
-rw-r--r-- | view/css/mod_cloud.css | 5 | ||||
-rw-r--r-- | view/js/autocomplete.js | 4 | ||||
-rw-r--r-- | view/js/main.js | 12 | ||||
-rw-r--r-- | view/js/mod_filestorage.js | 1 | ||||
-rw-r--r-- | view/php/theme_init.php | 2 | ||||
-rw-r--r-- | view/theme/redbasic/css/style.css | 68 | ||||
-rw-r--r-- | view/tpl/attach_edit.tpl | 14 | ||||
-rw-r--r-- | view/tpl/cloud_actionspanel.tpl | 42 | ||||
-rw-r--r-- | view/tpl/cloud_directory.tpl | 14 | ||||
-rw-r--r-- | view/tpl/cloud_header.tpl | 13 | ||||
-rwxr-xr-x | view/tpl/jot.tpl | 12 |
21 files changed, 1708 insertions, 103 deletions
diff --git a/app/connections.apd b/app/connections.apd index 80f9b4570..146e553e5 100644 --- a/app/connections.apd +++ b/app/connections.apd @@ -1,4 +1,4 @@ url: $baseurl/connections requires: local_user -name: Address Book +name: Connections photo: $baseurl/app/connections.png diff --git a/assets/home.html b/assets/home.html index a0d048682..cad2045d0 100644 --- a/assets/home.html +++ b/assets/home.html @@ -239,7 +239,7 @@ function update_element() { <div lang="en" class="wrapper"> <div class="tr" style="font-size: 1.4em; color: #666; margin-left: 75px; margin-right: 75px;"> -One of the traditional problems with independent publishing on the internet has always been the fact that independent publishers often operate as isolated islands within their own website, and spend most of their resources attracting visitors. The rise of corporate providers and social networking services alleviated many of these problems; however centralisation has led to a situation where your content where is no longer under your direct control. It is shared fully with corporate advertisers and governments, but ironically you are now often asked to pay money to ensure that your friends can see it. What if you could have advantages of scale and connections that centralisation typically offers whilst maintaining independent control over your own web presence? +One of the traditional problems with independent publishing on the internet has always been the fact that independent publishers often operate as isolated islands within their own website, and spend most of their resources attracting visitors. The rise of corporate providers and social networking services alleviated many of these problems; however centralisation has led to a situation where your content is no longer under your direct control. It is shared fully with corporate advertisers and governments, but ironically you are now often asked to pay money to ensure that your friends can see it. What if you could have advantages of scale and connections that centralisation typically offers whilst maintaining independent control over your own web presence? </div> <br /> <div class="tr" style="font-size: 1.4em; color: #666; margin-left: 75px; margin-right: 75px;"> diff --git a/include/RedDAV/RedBrowser.php b/include/RedDAV/RedBrowser.php index eb08fd79f..78aacf92b 100644 --- a/include/RedDAV/RedBrowser.php +++ b/include/RedDAV/RedBrowser.php @@ -238,11 +238,21 @@ class RedBrowser extends DAV\Browser\Plugin { $quota['limit'] = $limit; $quota['desc'] = $quotaDesc; - $html .= replace_macros(get_markup_template('cloud_directory.tpl'), array( + $output = ''; + if ($this->enablePost) { + $this->server->broadcastEvent('onHTMLActionsPanel', array($parent, &$output)); + } + + $html .= replace_macros(get_markup_template('cloud_header.tpl'), array( '$header' => t('Files') . ": " . $this->escapeHTML($path) . "/", + '$quota' => $quota, + '$total' => t('Total'), + '$actionspanel' => $output + )); + + $html .= replace_macros(get_markup_template('cloud_directory.tpl'), array( '$parentpath' => $parentpath, '$entries' => $f, - '$quota' => $quota, '$name' => t('Name'), '$type' => t('Type'), '$size' => t('Size'), @@ -250,15 +260,9 @@ class RedBrowser extends DAV\Browser\Plugin { '$parent' => t('parent'), '$edit' => t('Edit'), '$delete' => t('Delete'), - '$total' => t('Total') + '$nick' => $this->auth->getCurrentUser() )); - $output = ''; - if ($this->enablePost) { - $this->server->broadcastEvent('onHTMLActionsPanel', array($parent, &$output)); - } - $html .= $output; - get_app()->page['content'] = $html; load_pdl(get_app()); construct_page(get_app()); @@ -371,4 +375,4 @@ class RedBrowser extends DAV\Browser\Plugin { } return $id; } -}
\ No newline at end of file +} diff --git a/library/bootstrap-tagsinput/LICENSE b/library/bootstrap-tagsinput/LICENSE new file mode 100644 index 000000000..58bc985ba --- /dev/null +++ b/library/bootstrap-tagsinput/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2013 Tim Schlechter + +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. diff --git a/library/bootstrap-tagsinput/README b/library/bootstrap-tagsinput/README new file mode 100644 index 000000000..a7c96d53a --- /dev/null +++ b/library/bootstrap-tagsinput/README @@ -0,0 +1 @@ +Taken from https://github.com/gdibble/bootstrap-tagsinput/tree/traditionalPlaceholderEffect which has proper support for placeholders diff --git a/library/bootstrap-tagsinput/README.md b/library/bootstrap-tagsinput/README.md new file mode 100644 index 000000000..363c0d50b --- /dev/null +++ b/library/bootstrap-tagsinput/README.md @@ -0,0 +1,879 @@ + + + + +<!DOCTYPE html> +<html lang="en" class=""> + <head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# object: http://ogp.me/ns/object# article: http://ogp.me/ns/article# profile: http://ogp.me/ns/profile#"> + <meta charset='utf-8'> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta http-equiv="Content-Language" content="en"> + + + <title>bootstrap-tagsinput/README.md at master · TimSchlechter/bootstrap-tagsinput · GitHub</title> + <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub"> + <link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub"> + <link rel="apple-touch-icon" sizes="57x57" href="/apple-touch-icon-114.png"> + <link rel="apple-touch-icon" sizes="114x114" href="/apple-touch-icon-114.png"> + <link rel="apple-touch-icon" sizes="72x72" href="/apple-touch-icon-144.png"> + <link rel="apple-touch-icon" sizes="144x144" href="/apple-touch-icon-144.png"> + <meta property="fb:app_id" content="1401488693436528"> + + <meta content="@github" name="twitter:site" /><meta content="summary" name="twitter:card" /><meta content="TimSchlechter/bootstrap-tagsinput" name="twitter:title" /><meta content="bootstrap-tagsinput - jQuery tags input plugin based on Twitter Bootstrap." name="twitter:description" /><meta content="https://avatars1.githubusercontent.com/u/2721613?v=3&s=400" name="twitter:image:src" /> +<meta content="GitHub" property="og:site_name" /><meta content="object" property="og:type" /><meta content="https://avatars1.githubusercontent.com/u/2721613?v=3&s=400" property="og:image" /><meta content="TimSchlechter/bootstrap-tagsinput" property="og:title" /><meta content="https://github.com/TimSchlechter/bootstrap-tagsinput" property="og:url" /><meta content="bootstrap-tagsinput - jQuery tags input plugin based on Twitter Bootstrap." property="og:description" /> + + <meta name="browser-stats-url" content="/_stats"> + <link rel="assets" href="https://assets-cdn.github.com/"> + <link rel="conduit-xhr" href="https://ghconduit.com:25035"> + + <meta name="pjax-timeout" content="1000"> + + + <meta name="msapplication-TileImage" content="/windows-tile.png"> + <meta name="msapplication-TileColor" content="#ffffff"> + <meta name="selected-link" value="repo_source" data-pjax-transient> + <meta name="google-analytics" content="UA-3769691-2"> + + <meta content="collector.githubapp.com" name="octolytics-host" /><meta content="collector-cdn.github.com" name="octolytics-script-host" /><meta content="github" name="octolytics-app-id" /><meta content="05C412F3:5EFA:620CC:54968B9C" name="octolytics-dimension-request_id" /> + + <meta content="Rails, view, blob#show" name="analytics-event" /> + + + + <link rel="icon" type="image/x-icon" href="https://assets-cdn.github.com/favicon.ico"> + + + <meta content="authenticity_token" name="csrf-param" /> +<meta content="pq46YRAN8EIxwiqw1PBmOS18o8ukCrBKyIwYs6EhhTJPiGbEXhKdJxdkbRWl+VYne3E3iSUijxSIsYnZnQddlg==" name="csrf-token" /> + + <link href="https://assets-cdn.github.com/assets/github-9bcf5def7eb44e2a101b20aaecf3707f4b0a10ab8f4d6eebec29371f821c4b29.css" media="all" rel="stylesheet" type="text/css" /> + <link href="https://assets-cdn.github.com/assets/github2-47bc67324d463c7cecb5ee4c009628c91db85b0e9288a9e663f2d06ff9e03088.css" media="all" rel="stylesheet" type="text/css" /> + + + + + <meta http-equiv="x-pjax-version" content="cffc32e08a29062b908cc3ddb47285af"> + + + <meta name="description" content="bootstrap-tagsinput - jQuery tags input plugin based on Twitter Bootstrap."> + <meta name="go-import" content="github.com/TimSchlechter/bootstrap-tagsinput git https://github.com/TimSchlechter/bootstrap-tagsinput.git"> + + <meta content="2721613" name="octolytics-dimension-user_id" /><meta content="TimSchlechter" name="octolytics-dimension-user_login" /><meta content="11534941" name="octolytics-dimension-repository_id" /><meta content="TimSchlechter/bootstrap-tagsinput" name="octolytics-dimension-repository_nwo" /><meta content="true" name="octolytics-dimension-repository_public" /><meta content="false" name="octolytics-dimension-repository_is_fork" /><meta content="11534941" name="octolytics-dimension-repository_network_root_id" /><meta content="TimSchlechter/bootstrap-tagsinput" name="octolytics-dimension-repository_network_root_nwo" /> + <link href="https://github.com/TimSchlechter/bootstrap-tagsinput/commits/master.atom" rel="alternate" title="Recent Commits to bootstrap-tagsinput:master" type="application/atom+xml"> + + </head> + + + <body class="logged_out env-production vis-public page-blob"> + <a href="#start-of-content" tabindex="1" class="accessibility-aid js-skip-to-content">Skip to content</a> + <div class="wrapper"> + + + + + + + + <div class="header header-logged-out" role="banner"> + <div class="container clearfix"> + + <a class="header-logo-wordmark" href="https://github.com/" ga-data-click="(Logged out) Header, go to homepage, icon:logo-wordmark"> + <span class="mega-octicon octicon-logo-github"></span> + </a> + + <div class="header-actions" role="navigation"> + <a class="button primary" href="/join" data-ga-click="(Logged out) Header, clicked Sign up, text:sign-up">Sign up</a> + <a class="button" href="/login?return_to=%2FTimSchlechter%2Fbootstrap-tagsinput%2Fblob%2Fmaster%2FREADME.md" data-ga-click="(Logged out) Header, clicked Sign in, text:sign-in">Sign in</a> + </div> + + <div class="site-search repo-scope js-site-search" role="search"> + <form accept-charset="UTF-8" action="/TimSchlechter/bootstrap-tagsinput/search" class="js-site-search-form" data-global-search-url="/search" data-repo-search-url="/TimSchlechter/bootstrap-tagsinput/search" method="get"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /></div> + <input type="text" + class="js-site-search-field is-clearable" + data-hotkey="s" + name="q" + placeholder="Search" + data-global-scope-placeholder="Search GitHub" + data-repo-scope-placeholder="Search" + tabindex="1" + autocapitalize="off"> + <div class="scope-badge">This repository</div> +</form> + </div> + + <ul class="header-nav left" role="navigation"> + <li class="header-nav-item"> + <a class="header-nav-link" href="/explore" data-ga-click="(Logged out) Header, go to explore, text:explore">Explore</a> + </li> + <li class="header-nav-item"> + <a class="header-nav-link" href="/features" data-ga-click="(Logged out) Header, go to features, text:features">Features</a> + </li> + <li class="header-nav-item"> + <a class="header-nav-link" href="https://enterprise.github.com/" data-ga-click="(Logged out) Header, go to enterprise, text:enterprise">Enterprise</a> + </li> + <li class="header-nav-item"> + <a class="header-nav-link" href="/blog" data-ga-click="(Logged out) Header, go to blog, text:blog">Blog</a> + </li> + </ul> + + </div> +</div> + + + + <div id="start-of-content" class="accessibility-aid"></div> + <div class="site" itemscope itemtype="http://schema.org/WebPage"> + <div id="js-flash-container"> + + </div> + <div class="pagehead repohead instapaper_ignore readability-menu"> + <div class="container"> + +<ul class="pagehead-actions"> + + + <li> + <a href="/login?return_to=%2FTimSchlechter%2Fbootstrap-tagsinput" + class="minibutton with-count star-button tooltipped tooltipped-n" + aria-label="You must be signed in to star a repository" rel="nofollow"> + <span class="octicon octicon-star"></span> + Star + </a> + + <a class="social-count js-social-count" href="/TimSchlechter/bootstrap-tagsinput/stargazers"> + 755 + </a> + + </li> + + <li> + <a href="/login?return_to=%2FTimSchlechter%2Fbootstrap-tagsinput" + class="minibutton with-count js-toggler-target fork-button tooltipped tooltipped-n" + aria-label="You must be signed in to fork a repository" rel="nofollow"> + <span class="octicon octicon-repo-forked"></span> + Fork + </a> + <a href="/TimSchlechter/bootstrap-tagsinput/network" class="social-count"> + 307 + </a> + </li> +</ul> + + <h1 itemscope itemtype="http://data-vocabulary.org/Breadcrumb" class="entry-title public"> + <span class="mega-octicon octicon-repo"></span> + <span class="author"><a href="/TimSchlechter" class="url fn" itemprop="url" rel="author"><span itemprop="title">TimSchlechter</span></a></span><!-- + --><span class="path-divider">/</span><!-- + --><strong><a href="/TimSchlechter/bootstrap-tagsinput" class="js-current-repository" data-pjax="#js-repo-pjax-container">bootstrap-tagsinput</a></strong> + + <span class="page-context-loader"> + <img alt="" height="16" src="https://assets-cdn.github.com/images/spinners/octocat-spinner-32.gif" width="16" /> + </span> + + </h1> + </div><!-- /.container --> + </div><!-- /.repohead --> + + <div class="container"> + <div class="repository-with-sidebar repo-container new-discussion-timeline "> + <div class="repository-sidebar clearfix"> + +<nav class="sunken-menu repo-nav js-repo-nav js-sidenav-container-pjax js-octicon-loaders" + role="navigation" + data-pjax="#js-repo-pjax-container" + data-issue-count-url="/TimSchlechter/bootstrap-tagsinput/issues/counts"> + <ul class="sunken-menu-group"> + <li class="tooltipped tooltipped-w" aria-label="Code"> + <a href="/TimSchlechter/bootstrap-tagsinput" aria-label="Code" class="selected js-selected-navigation-item sunken-menu-item" data-hotkey="g c" data-selected-links="repo_source repo_downloads repo_commits repo_releases repo_tags repo_branches /TimSchlechter/bootstrap-tagsinput"> + <span class="octicon octicon-code"></span> <span class="full-word">Code</span> + <img alt="" class="mini-loader" height="16" src="https://assets-cdn.github.com/images/spinners/octocat-spinner-32.gif" width="16" /> +</a> </li> + + <li class="tooltipped tooltipped-w" aria-label="Issues"> + <a href="/TimSchlechter/bootstrap-tagsinput/issues" aria-label="Issues" class="js-selected-navigation-item sunken-menu-item" data-hotkey="g i" data-selected-links="repo_issues repo_labels repo_milestones /TimSchlechter/bootstrap-tagsinput/issues"> + <span class="octicon octicon-issue-opened"></span> <span class="full-word">Issues</span> + <span class="js-issue-replace-counter"></span> + <img alt="" class="mini-loader" height="16" src="https://assets-cdn.github.com/images/spinners/octocat-spinner-32.gif" width="16" /> +</a> </li> + + <li class="tooltipped tooltipped-w" aria-label="Pull Requests"> + <a href="/TimSchlechter/bootstrap-tagsinput/pulls" aria-label="Pull Requests" class="js-selected-navigation-item sunken-menu-item" data-hotkey="g p" data-selected-links="repo_pulls /TimSchlechter/bootstrap-tagsinput/pulls"> + <span class="octicon octicon-git-pull-request"></span> <span class="full-word">Pull Requests</span> + <span class="js-pull-replace-counter"></span> + <img alt="" class="mini-loader" height="16" src="https://assets-cdn.github.com/images/spinners/octocat-spinner-32.gif" width="16" /> +</a> </li> + + + </ul> + <div class="sunken-menu-separator"></div> + <ul class="sunken-menu-group"> + + <li class="tooltipped tooltipped-w" aria-label="Pulse"> + <a href="/TimSchlechter/bootstrap-tagsinput/pulse" aria-label="Pulse" class="js-selected-navigation-item sunken-menu-item" data-selected-links="pulse /TimSchlechter/bootstrap-tagsinput/pulse"> + <span class="octicon octicon-pulse"></span> <span class="full-word">Pulse</span> + <img alt="" class="mini-loader" height="16" src="https://assets-cdn.github.com/images/spinners/octocat-spinner-32.gif" width="16" /> +</a> </li> + + <li class="tooltipped tooltipped-w" aria-label="Graphs"> + <a href="/TimSchlechter/bootstrap-tagsinput/graphs" aria-label="Graphs" class="js-selected-navigation-item sunken-menu-item" data-selected-links="repo_graphs repo_contributors /TimSchlechter/bootstrap-tagsinput/graphs"> + <span class="octicon octicon-graph"></span> <span class="full-word">Graphs</span> + <img alt="" class="mini-loader" height="16" src="https://assets-cdn.github.com/images/spinners/octocat-spinner-32.gif" width="16" /> +</a> </li> + </ul> + + +</nav> + + <div class="only-with-full-nav"> + + +<div class="clone-url open" + data-protocol-type="http" + data-url="/users/set_protocol?protocol_selector=http&protocol_type=clone"> + <h3><span class="text-emphasized">HTTPS</span> clone URL</h3> + <div class="input-group js-zeroclipboard-container"> + <input type="text" class="input-mini input-monospace js-url-field js-zeroclipboard-target" + value="https://github.com/TimSchlechter/bootstrap-tagsinput.git" readonly="readonly"> + <span class="input-group-button"> + <button aria-label="Copy to clipboard" class="js-zeroclipboard minibutton zeroclipboard-button" data-copied-hint="Copied!" type="button"><span class="octicon octicon-clippy"></span></button> + </span> + </div> +</div> + + +<div class="clone-url " + data-protocol-type="subversion" + data-url="/users/set_protocol?protocol_selector=subversion&protocol_type=clone"> + <h3><span class="text-emphasized">Subversion</span> checkout URL</h3> + <div class="input-group js-zeroclipboard-container"> + <input type="text" class="input-mini input-monospace js-url-field js-zeroclipboard-target" + value="https://github.com/TimSchlechter/bootstrap-tagsinput" readonly="readonly"> + <span class="input-group-button"> + <button aria-label="Copy to clipboard" class="js-zeroclipboard minibutton zeroclipboard-button" data-copied-hint="Copied!" type="button"><span class="octicon octicon-clippy"></span></button> + </span> + </div> +</div> + + + +<p class="clone-options">You can clone with + <a href="#" class="js-clone-selector" data-protocol="http">HTTPS</a> or <a href="#" class="js-clone-selector" data-protocol="subversion">Subversion</a>. + <a href="https://help.github.com/articles/which-remote-url-should-i-use" class="help tooltipped tooltipped-n" aria-label="Get help on which URL is right for you."> + <span class="octicon octicon-question"></span> + </a> +</p> + + + + <a href="/TimSchlechter/bootstrap-tagsinput/archive/master.zip" + class="minibutton sidebar-button" + aria-label="Download the contents of TimSchlechter/bootstrap-tagsinput as a zip file" + title="Download the contents of TimSchlechter/bootstrap-tagsinput as a zip file" + rel="nofollow"> + <span class="octicon octicon-cloud-download"></span> + Download ZIP + </a> + </div> + </div><!-- /.repository-sidebar --> + + <div id="js-repo-pjax-container" class="repository-content context-loader-container" data-pjax-container> + + +<a href="/TimSchlechter/bootstrap-tagsinput/blob/a4657365808a224fe8aa950c14b96ecfce58b290/README.md" class="hidden js-permalink-shortcut" data-hotkey="y">Permalink</a> + +<!-- blob contrib key: blob_contributors:v21:002463f2fb860593a8410f2c5c54cd3a --> + +<div class="file-navigation js-zeroclipboard-container"> + +<div class="select-menu js-menu-container js-select-menu left"> + <span class="minibutton select-menu-button js-menu-target css-truncate" data-hotkey="w" + data-master-branch="master" + data-ref="master" + title="master" + role="button" aria-label="Switch branches or tags" tabindex="0" aria-haspopup="true"> + <span class="octicon octicon-git-branch"></span> + <i>branch:</i> + <span class="js-select-button css-truncate-target">master</span> + </span> + + <div class="select-menu-modal-holder js-menu-content js-navigation-container" data-pjax aria-hidden="true"> + + <div class="select-menu-modal"> + <div class="select-menu-header"> + <span class="select-menu-title">Switch branches/tags</span> + <span class="octicon octicon-x js-menu-close" role="button" aria-label="Close"></span> + </div> <!-- /.select-menu-header --> + + <div class="select-menu-filters"> + <div class="select-menu-text-filter"> + <input type="text" aria-label="Filter branches/tags" id="context-commitish-filter-field" class="js-filterable-field js-navigation-enable" placeholder="Filter branches/tags"> + </div> + <div class="select-menu-tabs"> + <ul> + <li class="select-menu-tab"> + <a href="#" data-tab-filter="branches" class="js-select-menu-tab">Branches</a> + </li> + <li class="select-menu-tab"> + <a href="#" data-tab-filter="tags" class="js-select-menu-tab">Tags</a> + </li> + </ul> + </div><!-- /.select-menu-tabs --> + </div><!-- /.select-menu-filters --> + + <div class="select-menu-list select-menu-tab-bucket js-select-menu-tab-bucket" data-tab-filter="branches"> + + <div data-filterable-for="context-commitish-filter-field" data-filterable-type="substring"> + + + <div class="select-menu-item js-navigation-item "> + <span class="select-menu-item-icon octicon octicon-check"></span> + <a href="/TimSchlechter/bootstrap-tagsinput/blob/gh-pages/README.md" + data-name="gh-pages" + data-skip-pjax="true" + rel="nofollow" + class="js-navigation-open select-menu-item-text css-truncate-target" + title="gh-pages">gh-pages</a> + </div> <!-- /.select-menu-item --> + <div class="select-menu-item js-navigation-item selected"> + <span class="select-menu-item-icon octicon octicon-check"></span> + <a href="/TimSchlechter/bootstrap-tagsinput/blob/master/README.md" + data-name="master" + data-skip-pjax="true" + rel="nofollow" + class="js-navigation-open select-menu-item-text css-truncate-target" + title="master">master</a> + </div> <!-- /.select-menu-item --> + </div> + + <div class="select-menu-no-results">Nothing to show</div> + </div> <!-- /.select-menu-list --> + + <div class="select-menu-list select-menu-tab-bucket js-select-menu-tab-bucket" data-tab-filter="tags"> + <div data-filterable-for="context-commitish-filter-field" data-filterable-type="substring"> + + + <div class="select-menu-item js-navigation-item "> + <span class="select-menu-item-icon octicon octicon-check"></span> + <a href="/TimSchlechter/bootstrap-tagsinput/tree/0.4.2/README.md" + data-name="0.4.2" + data-skip-pjax="true" + rel="nofollow" + class="js-navigation-open select-menu-item-text css-truncate-target" + title="0.4.2">0.4.2</a> + </div> <!-- /.select-menu-item --> + <div class="select-menu-item js-navigation-item "> + <span class="select-menu-item-icon octicon octicon-check"></span> + <a href="/TimSchlechter/bootstrap-tagsinput/tree/0.4.1/README.md" + data-name="0.4.1" + data-skip-pjax="true" + rel="nofollow" + class="js-navigation-open select-menu-item-text css-truncate-target" + title="0.4.1">0.4.1</a> + </div> <!-- /.select-menu-item --> + <div class="select-menu-item js-navigation-item "> + <span class="select-menu-item-icon octicon octicon-check"></span> + <a href="/TimSchlechter/bootstrap-tagsinput/tree/0.4/README.md" + data-name="0.4" + data-skip-pjax="true" + rel="nofollow" + class="js-navigation-open select-menu-item-text css-truncate-target" + title="0.4">0.4</a> + </div> <!-- /.select-menu-item --> + <div class="select-menu-item js-navigation-item "> + <span class="select-menu-item-icon octicon octicon-check"></span> + <a href="/TimSchlechter/bootstrap-tagsinput/tree/0.3.14/README.md" + data-name="0.3.14" + data-skip-pjax="true" + rel="nofollow" + class="js-navigation-open select-menu-item-text css-truncate-target" + title="0.3.14">0.3.14</a> + </div> <!-- /.select-menu-item --> + <div class="select-menu-item js-navigation-item "> + <span class="select-menu-item-icon octicon octicon-check"></span> + <a href="/TimSchlechter/bootstrap-tagsinput/tree/0.3.13/README.md" + data-name="0.3.13" + data-skip-pjax="true" + rel="nofollow" + class="js-navigation-open select-menu-item-text css-truncate-target" + title="0.3.13">0.3.13</a> + </div> <!-- /.select-menu-item --> + <div class="select-menu-item js-navigation-item "> + <span class="select-menu-item-icon octicon octicon-check"></span> + <a href="/TimSchlechter/bootstrap-tagsinput/tree/0.3.12/README.md" + data-name="0.3.12" + data-skip-pjax="true" + rel="nofollow" + class="js-navigation-open select-menu-item-text css-truncate-target" + title="0.3.12">0.3.12</a> + </div> <!-- /.select-menu-item --> + <div class="select-menu-item js-navigation-item "> + <span class="select-menu-item-icon octicon octicon-check"></span> + <a href="/TimSchlechter/bootstrap-tagsinput/tree/0.3.11/README.md" + data-name="0.3.11" + data-skip-pjax="true" + rel="nofollow" + class="js-navigation-open select-menu-item-text css-truncate-target" + title="0.3.11">0.3.11</a> + </div> <!-- /.select-menu-item --> + <div class="select-menu-item js-navigation-item "> + <span class="select-menu-item-icon octicon octicon-check"></span> + <a href="/TimSchlechter/bootstrap-tagsinput/tree/0.3.10/README.md" + data-name="0.3.10" + data-skip-pjax="true" + rel="nofollow" + class="js-navigation-open select-menu-item-text css-truncate-target" + title="0.3.10">0.3.10</a> + </div> <!-- /.select-menu-item --> + <div class="select-menu-item js-navigation-item "> + <span class="select-menu-item-icon octicon octicon-check"></span> + <a href="/TimSchlechter/bootstrap-tagsinput/tree/0.3.9/README.md" + data-name="0.3.9" + data-skip-pjax="true" + rel="nofollow" + class="js-navigation-open select-menu-item-text css-truncate-target" + title="0.3.9">0.3.9</a> + </div> <!-- /.select-menu-item --> + <div class="select-menu-item js-navigation-item "> + <span class="select-menu-item-icon octicon octicon-check"></span> + <a href="/TimSchlechter/bootstrap-tagsinput/tree/0.3.8/README.md" + data-name="0.3.8" + data-skip-pjax="true" + rel="nofollow" + class="js-navigation-open select-menu-item-text css-truncate-target" + title="0.3.8">0.3.8</a> + </div> <!-- /.select-menu-item --> + <div class="select-menu-item js-navigation-item "> + <span class="select-menu-item-icon octicon octicon-check"></span> + <a href="/TimSchlechter/bootstrap-tagsinput/tree/0.3.7/README.md" + data-name="0.3.7" + data-skip-pjax="true" + rel="nofollow" + class="js-navigation-open select-menu-item-text css-truncate-target" + title="0.3.7">0.3.7</a> + </div> <!-- /.select-menu-item --> + <div class="select-menu-item js-navigation-item "> + <span class="select-menu-item-icon octicon octicon-check"></span> + <a href="/TimSchlechter/bootstrap-tagsinput/tree/0.3.6/README.md" + data-name="0.3.6" + data-skip-pjax="true" + rel="nofollow" + class="js-navigation-open select-menu-item-text css-truncate-target" + title="0.3.6">0.3.6</a> + </div> <!-- /.select-menu-item --> + <div class="select-menu-item js-navigation-item "> + <span class="select-menu-item-icon octicon octicon-check"></span> + <a href="/TimSchlechter/bootstrap-tagsinput/tree/0.3.5/README.md" + data-name="0.3.5" + data-skip-pjax="true" + rel="nofollow" + class="js-navigation-open select-menu-item-text css-truncate-target" + title="0.3.5">0.3.5</a> + </div> <!-- /.select-menu-item --> + <div class="select-menu-item js-navigation-item "> + <span class="select-menu-item-icon octicon octicon-check"></span> + <a href="/TimSchlechter/bootstrap-tagsinput/tree/0.3.4/README.md" + data-name="0.3.4" + data-skip-pjax="true" + rel="nofollow" + class="js-navigation-open select-menu-item-text css-truncate-target" + title="0.3.4">0.3.4</a> + </div> <!-- /.select-menu-item --> + <div class="select-menu-item js-navigation-item "> + <span class="select-menu-item-icon octicon octicon-check"></span> + <a href="/TimSchlechter/bootstrap-tagsinput/tree/0.3.3/README.md" + data-name="0.3.3" + data-skip-pjax="true" + rel="nofollow" + class="js-navigation-open select-menu-item-text css-truncate-target" + title="0.3.3">0.3.3</a> + </div> <!-- /.select-menu-item --> + <div class="select-menu-item js-navigation-item "> + <span class="select-menu-item-icon octicon octicon-check"></span> + <a href="/TimSchlechter/bootstrap-tagsinput/tree/0.3.2/README.md" + data-name="0.3.2" + data-skip-pjax="true" + rel="nofollow" + class="js-navigation-open select-menu-item-text css-truncate-target" + title="0.3.2">0.3.2</a> + </div> <!-- /.select-menu-item --> + <div class="select-menu-item js-navigation-item "> + <span class="select-menu-item-icon octicon octicon-check"></span> + <a href="/TimSchlechter/bootstrap-tagsinput/tree/0.3.1/README.md" + data-name="0.3.1" + data-skip-pjax="true" + rel="nofollow" + class="js-navigation-open select-menu-item-text css-truncate-target" + title="0.3.1">0.3.1</a> + </div> <!-- /.select-menu-item --> + <div class="select-menu-item js-navigation-item "> + <span class="select-menu-item-icon octicon octicon-check"></span> + <a href="/TimSchlechter/bootstrap-tagsinput/tree/0.3.0/README.md" + data-name="0.3.0" + data-skip-pjax="true" + rel="nofollow" + class="js-navigation-open select-menu-item-text css-truncate-target" + title="0.3.0">0.3.0</a> + </div> <!-- /.select-menu-item --> + <div class="select-menu-item js-navigation-item "> + <span class="select-menu-item-icon octicon octicon-check"></span> + <a href="/TimSchlechter/bootstrap-tagsinput/tree/0.2.3/README.md" + data-name="0.2.3" + data-skip-pjax="true" + rel="nofollow" + class="js-navigation-open select-menu-item-text css-truncate-target" + title="0.2.3">0.2.3</a> + </div> <!-- /.select-menu-item --> + <div class="select-menu-item js-navigation-item "> + <span class="select-menu-item-icon octicon octicon-check"></span> + <a href="/TimSchlechter/bootstrap-tagsinput/tree/0.2.2/README.md" + data-name="0.2.2" + data-skip-pjax="true" + rel="nofollow" + class="js-navigation-open select-menu-item-text css-truncate-target" + title="0.2.2">0.2.2</a> + </div> <!-- /.select-menu-item --> + <div class="select-menu-item js-navigation-item "> + <span class="select-menu-item-icon octicon octicon-check"></span> + <a href="/TimSchlechter/bootstrap-tagsinput/tree/0.2.1/README.md" + data-name="0.2.1" + data-skip-pjax="true" + rel="nofollow" + class="js-navigation-open select-menu-item-text css-truncate-target" + title="0.2.1">0.2.1</a> + </div> <!-- /.select-menu-item --> + <div class="select-menu-item js-navigation-item "> + <span class="select-menu-item-icon octicon octicon-check"></span> + <a href="/TimSchlechter/bootstrap-tagsinput/tree/0.2.0/README.md" + data-name="0.2.0" + data-skip-pjax="true" + rel="nofollow" + class="js-navigation-open select-menu-item-text css-truncate-target" + title="0.2.0">0.2.0</a> + </div> <!-- /.select-menu-item --> + <div class="select-menu-item js-navigation-item "> + <span class="select-menu-item-icon octicon octicon-check"></span> + <a href="/TimSchlechter/bootstrap-tagsinput/tree/0.1.1/README.md" + data-name="0.1.1" + data-skip-pjax="true" + rel="nofollow" + class="js-navigation-open select-menu-item-text css-truncate-target" + title="0.1.1">0.1.1</a> + </div> <!-- /.select-menu-item --> + <div class="select-menu-item js-navigation-item "> + <span class="select-menu-item-icon octicon octicon-check"></span> + <a href="/TimSchlechter/bootstrap-tagsinput/tree/0.1.0/README.md" + data-name="0.1.0" + data-skip-pjax="true" + rel="nofollow" + class="js-navigation-open select-menu-item-text css-truncate-target" + title="0.1.0">0.1.0</a> + </div> <!-- /.select-menu-item --> + </div> + + <div class="select-menu-no-results">Nothing to show</div> + </div> <!-- /.select-menu-list --> + + </div> <!-- /.select-menu-modal --> + </div> <!-- /.select-menu-modal-holder --> +</div> <!-- /.select-menu --> + + <div class="button-group right"> + <a href="/TimSchlechter/bootstrap-tagsinput/find/master" + class="js-show-file-finder minibutton empty-icon tooltipped tooltipped-s" + data-pjax + data-hotkey="t" + aria-label="Quickly jump between files"> + <span class="octicon octicon-list-unordered"></span> + </a> + <button aria-label="Copy file path to clipboard" class="js-zeroclipboard minibutton zeroclipboard-button" data-copied-hint="Copied!" type="button"><span class="octicon octicon-clippy"></span></button> + </div> + + <div class="breadcrumb js-zeroclipboard-target"> + <span class='repo-root js-repo-root'><span itemscope="" itemtype="http://data-vocabulary.org/Breadcrumb"><a href="/TimSchlechter/bootstrap-tagsinput" class="" data-branch="master" data-direction="back" data-pjax="true" itemscope="url"><span itemprop="title">bootstrap-tagsinput</span></a></span></span><span class="separator">/</span><strong class="final-path">README.md</strong> + </div> +</div> + + + <div class="commit file-history-tease"> + <div class="file-history-tease-header"> + <img alt="Tim Schlechter" class="avatar" data-user="2721613" height="24" src="https://avatars3.githubusercontent.com/u/2721613?v=3&s=48" width="24" /> + <span class="author"><a href="/TimSchlechter" rel="author">TimSchlechter</a></span> + <time datetime="2014-07-30T18:40:53Z" is="relative-time">Jul 30, 2014</time> + <div class="commit-title"> + <a href="/TimSchlechter/bootstrap-tagsinput/commit/a64536d346d252a6fb5d013a53ff0b6a6a991ba8" class="message" data-pjax="true" title="Release build 0.4">Release build 0.4</a> + </div> + </div> + + <div class="participation"> + <p class="quickstat"> + <a href="#blob_contributors_box" rel="facebox"> + <strong>1</strong> + contributor + </a> + </p> + + </div> + <div id="blob_contributors_box" style="display:none"> + <h2 class="facebox-header">Users who have contributed to this file</h2> + <ul class="facebox-user-list"> + <li class="facebox-user-list-item"> + <img alt="Tim Schlechter" data-user="2721613" height="24" src="https://avatars3.githubusercontent.com/u/2721613?v=3&s=48" width="24" /> + <a href="/TimSchlechter">TimSchlechter</a> + </li> + </ul> + </div> + </div> + +<div class="file-box"> + <div class="file"> + <div class="meta clearfix"> + <div class="info file-name"> + <span>70 lines (61 sloc)</span> + <span class="meta-divider"></span> + <span>3.157 kb</span> + </div> + <div class="actions"> + <div class="button-group"> + <a href="/TimSchlechter/bootstrap-tagsinput/raw/master/README.md" class="minibutton " id="raw-url">Raw</a> + <a href="/TimSchlechter/bootstrap-tagsinput/blame/master/README.md" class="minibutton js-update-url-with-hash">Blame</a> + <a href="/TimSchlechter/bootstrap-tagsinput/commits/master/README.md" class="minibutton " rel="nofollow">History</a> + </div><!-- /.button-group --> + + + <a class="octicon-button disabled tooltipped tooltipped-w" href="#" + aria-label="You must be signed in to make or propose changes"><span class="octicon octicon-pencil"></span></a> + + <a class="octicon-button danger disabled tooltipped tooltipped-w" href="#" + aria-label="You must be signed in to make or propose changes"> + <span class="octicon octicon-trashcan"></span> + </a> + </div><!-- /.actions --> + </div> + + <div id="readme" class="blob instapaper_body"> + <article class="markdown-body entry-content" itemprop="mainContentOfPage"><h1> +<a id="user-content-bootstrap-tags-input-" class="anchor" href="#bootstrap-tags-input-" aria-hidden="true"><span class="octicon octicon-link"></span></a>Bootstrap Tags Input <a href="https://travis-ci.org/TimSchlechter/bootstrap-tagsinput"><img src="https://camo.githubusercontent.com/2d02546931244241329b98071825212a0d77dd4e/68747470733a2f2f7472617669732d63692e6f72672f54696d5363686c6563687465722f626f6f7473747261702d74616773696e7075742e7376673f6272616e63683d6d6173746572" alt="Build Status" data-canonical-src="https://travis-ci.org/TimSchlechter/bootstrap-tagsinput.svg?branch=master" style="max-width:100%;"></a> +</h1> + +<p>Bootstrap Tags Input is a jQuery plugin providing a Twitter Bootstrap user interface for managing tags.</p> + +<h2> +<a id="user-content-usage" class="anchor" href="#usage" aria-hidden="true"><span class="octicon octicon-link"></span></a>Usage</h2> + +<p>Examples can be found <a href="http://timschlechter.github.com/bootstrap-tagsinput/examples/">here</a>.</p> + +<h2> +<a id="user-content-features" class="anchor" href="#features" aria-hidden="true"><span class="octicon octicon-link"></span></a>Features</h2> + +<ul class="task-list"> +<li>Objects as tags</li> +<li>True multi value</li> +<li>Typeahead</li> +<li>Designed for Bootstrap 2.3.2 and 3</li> +</ul> + +<h3> +<a id="user-content-objects-as-tags" class="anchor" href="#objects-as-tags" aria-hidden="true"><span class="octicon octicon-link"></span></a>Objects as tags</h3> + +<p>Not just support for using strings! This means you can use different values +for a tag's label and value. Each tag also holds a reference to the object +by which it was created, so by calling <code>tagsinput('items')</code> an +array of the original items is returned.</p> + +<h3> +<a id="user-content-true-multi-value-support" class="anchor" href="#true-multi-value-support" aria-hidden="true"><span class="octicon octicon-link"></span></a>True multi value support</h3> + +<p>Other implementations just concatenate the values to a comma separated string. +This results in <code>val()</code> returning just this string, and when +submitting the form, only one big, concatenated value is sent in the request.</p> + +<p>Bootstrap Tags Input provides true multivalue support. Just use a +<code><select multiple /></code> as your input element, and +<code>val()</code> will return an array of the tag values. When submitting the +form, an array of values will be sent with the request.</p> + +<h3> +<a id="user-content-typeahead-support" class="anchor" href="#typeahead-support" aria-hidden="true"><span class="octicon octicon-link"></span></a>Typeahead support</h3> + +<p>Integrates with Twitter Bootstraps' 2.3.2 typeahead, or use custom typeahead when using Bootstrap 3.</p> + +<h2> +<a id="user-content-development" class="anchor" href="#development" aria-hidden="true"><span class="octicon octicon-link"></span></a>Development</h2> + +<p>Install dependencies:</p> + +<pre> +npm install +bower install +</pre> + +<p>Test:</p> + +<pre> +grunt test +</pre> + +<p>Build:</p> + +<pre> +grunt build +</pre> + +<h2> +<a id="user-content-history" class="anchor" href="#history" aria-hidden="true"><span class="octicon octicon-link"></span></a>History</h2> + +<ul class="task-list"> +<li>0.4 + +<ul class="task-list"> +<li><a href="https://github.com/TimSchlechter/bootstrap-tagsinput/pull/73">Fix typeahead when using Bootstrap 3</a></li> +</ul> +</li> +<li>0.3.13 + +<ul class="task-list"> +<li> <a href="https://github.com/TimSchlechter/bootstrap-tagsinput/issues/5">#5: Trigger events on original input/select</a> +</li> +<li> Loads of fixes merged with help of @janvt, @rlidwka and @kuraga: thanks for helping me out!</li> +</ul> +</li> +<li>0.3.9 + +<ul class="task-list"> +<li> <a href="https://github.com/TimSchlechter/bootstrap-tagsinput/issues/48">#48: Type ahead stops when entering second character</a> +</li> +</ul> +</li> +<li>0.3.8 + +<ul class="task-list"> +<li> <a href="https://github.com/TimSchlechter/bootstrap-tagsinput/pull/43">#43: Add support for placeholder</a> +</li> +<li> <a href="https://github.com/TimSchlechter/bootstrap-tagsinput/pull/46">#46: ie 8 compatibility, replace indexOf method</a> +</li> +</ul> +</li> +<li>0.3.7 + +<ul class="task-list"> +<li> <a href="https://github.com/TimSchlechter/bootstrap-tagsinput/issues/39">#39: flash when duplicate is entered</a> +</li> +</ul> +</li> +<li>0.3.6 + +<ul class="task-list"> +<li> <a href="https://github.com/TimSchlechter/bootstrap-tagsinput/issues/34">#34: Error in ReloadPage</a> +</li> +</ul> +</li> +<li>0.3.5 + +<ul class="task-list"> +<li> <a href="https://github.com/TimSchlechter/bootstrap-tagsinput/issues/10">#10: confirmKeys option</a> +</li> +</ul> +</li> +<li>0.3.4 + +<ul class="task-list"> +<li> <a href="https://github.com/TimSchlechter/bootstrap-tagsinput/pull/24">#24: Add bsTagsInput angular directive & example for bootstrap3 with typeahea...</a> +</li> +<li> <a href="https://github.com/TimSchlechter/bootstrap-tagsinput/pull/28">#28: Limit number of tags, enable/disable input</a> +</li> +<li> <a href="https://github.com/TimSchlechter/bootstrap-tagsinput/pull/33">#33: Avoid conflict with other selects when checking for value presence</a> +</li> +</ul> +</li> +</ul> + +<h2> +<a id="user-content-license" class="anchor" href="#license" aria-hidden="true"><span class="octicon octicon-link"></span></a>License</h2> + +<p>This project is licensed under <a href="https://raw.github.com/TimSchlechter/bootstrap-tagsinput/master/LICENSE" title="Read more about the MIT license">MIT</a>.</p> +</article> + </div> + + </div> +</div> + +<a href="#jump-to-line" rel="facebox[.linejump]" data-hotkey="l" style="display:none">Jump to Line</a> +<div id="jump-to-line" style="display:none"> + <form accept-charset="UTF-8" class="js-jump-to-line-form"> + <input class="linejump-input js-jump-to-line-field" type="text" placeholder="Jump to line…" autofocus> + <button type="submit" class="button">Go</button> + </form> +</div> + + </div> + + </div><!-- /.repo-container --> + <div class="modal-backdrop"></div> + </div><!-- /.container --> + </div><!-- /.site --> + + + </div><!-- /.wrapper --> + + <div class="container"> + <div class="site-footer" role="contentinfo"> + <ul class="site-footer-links right"> + <li><a href="https://status.github.com/">Status</a></li> + <li><a href="https://developer.github.com">API</a></li> + <li><a href="http://training.github.com">Training</a></li> + <li><a href="http://shop.github.com">Shop</a></li> + <li><a href="/blog">Blog</a></li> + <li><a href="/about">About</a></li> + + </ul> + + <a href="/" aria-label="Homepage"> + <span class="mega-octicon octicon-mark-github" title="GitHub"></span> + </a> + + <ul class="site-footer-links"> + <li>© 2014 <span title="0.02664s from github-fe122-cp1-prd.iad.github.net">GitHub</span>, Inc.</li> + <li><a href="/site/terms">Terms</a></li> + <li><a href="/site/privacy">Privacy</a></li> + <li><a href="/security">Security</a></li> + <li><a href="/contact">Contact</a></li> + </ul> + </div><!-- /.site-footer --> +</div><!-- /.container --> + + + <div class="fullscreen-overlay js-fullscreen-overlay" id="fullscreen_overlay"> + <div class="fullscreen-container js-suggester-container"> + <div class="textarea-wrap"> + <textarea name="fullscreen-contents" id="fullscreen-contents" class="fullscreen-contents js-fullscreen-contents" placeholder=""></textarea> + <div class="suggester-container"> + <div class="suggester fullscreen-suggester js-suggester js-navigation-container"></div> + </div> + </div> + </div> + <div class="fullscreen-sidebar"> + <a href="#" class="exit-fullscreen js-exit-fullscreen tooltipped tooltipped-w" aria-label="Exit Zen Mode"> + <span class="mega-octicon octicon-screen-normal"></span> + </a> + <a href="#" class="theme-switcher js-theme-switcher tooltipped tooltipped-w" + aria-label="Switch themes"> + <span class="octicon octicon-color-mode"></span> + </a> + </div> +</div> + + + + <div id="ajax-error-message" class="flash flash-error"> + <span class="octicon octicon-alert"></span> + <a href="#" class="octicon octicon-x flash-close js-ajax-error-dismiss" aria-label="Dismiss error"></a> + Something went wrong with that request. Please try again. + </div> + + + <script crossorigin="anonymous" src="https://assets-cdn.github.com/assets/frameworks-fc447938e306b7b2c26a33cfee9dfda9052aeb1aa6ad84b72f1b35fd008efe9e.js" type="text/javascript"></script> + <script async="async" crossorigin="anonymous" src="https://assets-cdn.github.com/assets/github-56c56f7fe2ed90ca50b9eefebccd56f3b9729a85d7ba17f0f9c9ebd02f20a7e3.js" type="text/javascript"></script> + + + </body> +</html> + diff --git a/library/bootstrap-tagsinput/bootstrap-tagsinput.css b/library/bootstrap-tagsinput/bootstrap-tagsinput.css new file mode 100644 index 000000000..55f7c09df --- /dev/null +++ b/library/bootstrap-tagsinput/bootstrap-tagsinput.css @@ -0,0 +1,46 @@ +.bootstrap-tagsinput { + background-color: #fff; + border: 1px solid #ccc; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + display: inline-block; + padding: 4px 6px; + margin-bottom: 10px; + color: #555; + vertical-align: middle; + border-radius: 4px; + max-width: 100%; + line-height: 22px; + cursor: text; +} +.bootstrap-tagsinput input { + border: none; + box-shadow: none; + outline: none; + background-color: transparent; + padding: 0; + margin: 0; + width: auto !important; + max-width: inherit; +} +.bootstrap-tagsinput input:focus { + border: none; + box-shadow: none; +} +.bootstrap-tagsinput .tag { + margin-right: 2px; + color: white; +} +.bootstrap-tagsinput .tag [data-role="remove"] { + margin-left: 8px; + cursor: pointer; +} +.bootstrap-tagsinput .tag [data-role="remove"]:after { + content: "x"; + padding: 0px 2px; +} +.bootstrap-tagsinput .tag [data-role="remove"]:hover { + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} +.bootstrap-tagsinput .tag [data-role="remove"]:hover:active { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} diff --git a/library/bootstrap-tagsinput/bootstrap-tagsinput.js b/library/bootstrap-tagsinput/bootstrap-tagsinput.js new file mode 100644 index 000000000..89cc3b5a4 --- /dev/null +++ b/library/bootstrap-tagsinput/bootstrap-tagsinput.js @@ -0,0 +1,643 @@ +(function ($) { + "use strict"; + + var defaultOptions = { + tagClass: function(item) { + return 'label label-info'; + }, + itemValue: function(item) { + return item ? item.toString() : item; + }, + itemText: function(item) { + return this.itemValue(item); + }, + freeInput: true, + addOnBlur: true, + maxTags: undefined, + maxChars: undefined, + confirmKeys: [13, 44], + onTagExists: function(item, $tag) { + $tag.hide().fadeIn(); + }, + trimValue: false, + allowDuplicates: false + }; + + /** + * Constructor function + */ + function TagsInput(element, options) { + this.itemsArray = []; + + this.$element = $(element); + this.$element.hide(); + + this.isSelect = (element.tagName === 'SELECT'); + this.multiple = (this.isSelect && element.hasAttribute('multiple')); + this.objectItems = options && options.itemValue; + this.placeholderText = element.hasAttribute('placeholder') ? this.$element.attr('placeholder') : ''; + this.inputSize = Math.max(1, this.placeholderText.length); + + this.$container = $('<div class="bootstrap-tagsinput"></div>'); + this.$input = $('<input type="text" placeholder="' + this.placeholderText + '"/>').appendTo(this.$container); + + this.$element.after(this.$container); + + var inputWidth = (this.inputSize < 3 ? 3 : this.inputSize) + "em"; + this.$input.get(0).style.cssText = "width: " + inputWidth + " !important;"; + this.build(options); + } + + TagsInput.prototype = { + constructor: TagsInput, + + /** + * Adds the given item as a new tag. Pass true to dontPushVal to prevent + * updating the elements val() + */ + add: function(item, dontPushVal) { + var self = this; + + if (self.options.maxTags && self.itemsArray.length >= self.options.maxTags) + return; + + // Ignore falsey values, except false + if (item !== false && !item) + return; + + // Trim value + if (typeof item === "string" && self.options.trimValue) { + item = $.trim(item); + } + + // Throw an error when trying to add an object while the itemValue option was not set + if (typeof item === "object" && !self.objectItems) + throw("Can't add objects when itemValue option is not set"); + + // Ignore strings only containg whitespace + if (item.toString().match(/^\s*$/)) + return; + + // If SELECT but not multiple, remove current tag + if (self.isSelect && !self.multiple && self.itemsArray.length > 0) + self.remove(self.itemsArray[0]); + + if (typeof item === "string" && this.$element[0].tagName === 'INPUT') { + var items = item.split(','); + if (items.length > 1) { + for (var i = 0; i < items.length; i++) { + this.add(items[i], true); + } + + if (!dontPushVal) + self.pushVal(); + return; + } + } + + // raise beforeItemAdd arg + var beforeItemAddEvent = $.Event('beforeItemAdd', { item: item, cancel: false }); + self.$element.trigger(beforeItemAddEvent); + if (beforeItemAddEvent.cancel) + return; + + item = beforeItemAddEvent.item + + var itemValue = self.options.itemValue(item), + itemText = self.options.itemText(item), + tagClass = self.options.tagClass(item); + + // Ignore items allready added + var existing = $.grep(self.itemsArray, function(item) { return self.options.itemValue(item) === itemValue; } )[0]; + if (existing && !self.options.allowDuplicates) { + // Invoke onTagExists + if (self.options.onTagExists) { + var $existingTag = $(".tag", self.$container).filter(function() { return $(this).data("item") === existing; }); + self.options.onTagExists(item, $existingTag); + } + return; + } + + // if length greater than limit + if (self.items().toString().length + item.length + 1 > self.options.maxInputLength) + return; + + // register item in internal array and map + self.itemsArray.push(item); + + //remove placeholder if there is an item, restore if no item(s) + if (self.itemsArray.length) + self.$input.attr('placeholder', ''); + else + self.$input.attr('placeholder', self.placeholderText); + + // add a tag element + var $tag = $('<span class="tag ' + htmlEncode(tagClass) + '">' + htmlEncode(itemText) + '<span data-role="remove"></span></span>'); + $tag.data('item', item); + self.findInputWrapper().before($tag); + $tag.after(' '); + + // add <option /> if item represents a value not present in one of the <select />'s options + if (self.isSelect && !$('option[value="' + encodeURIComponent(itemValue) + '"]',self.$element)[0]) { + var $option = $('<option selected>' + htmlEncode(itemText) + '</option>'); + $option.data('item', item); + $option.attr('value', itemValue); + self.$element.append($option); + } + + //remove placeholder if there is an item, restore if no item(s) + if (self.itemsArray.length) + self.$input.attr('placeholder', ''); + else + self.$input.attr('placeholder', self.placeholderText); + + if (!dontPushVal) + self.pushVal(); + + // Add class when reached maxTags + if (self.options.maxTags === self.itemsArray.length || self.items().toString().length === self.options.maxInputLength) + self.$container.addClass('bootstrap-tagsinput-max'); + + self.$element.trigger($.Event('itemAdded', { item: item })); + }, + + /** + * Removes the given item. Pass true to dontPushVal to prevent updating the + * elements val() + */ + remove: function(item, dontPushVal) { + var self = this; + + if (self.objectItems) { + if (typeof item === "object") + item = $.grep(self.itemsArray, function(other) { return self.options.itemValue(other) == self.options.itemValue(item); } ); + else + item = $.grep(self.itemsArray, function(other) { return self.options.itemValue(other) == item; } ); + + item = item[item.length-1]; + } + + if (item) { + var beforeItemRemoveEvent = $.Event('beforeItemRemove', { item: item, cancel: false }); + self.$element.trigger(beforeItemRemoveEvent); + if (beforeItemRemoveEvent.cancel) + return; + + $('.tag', self.$container).filter(function() { return $(this).data('item') === item; }).remove(); + $('option', self.$element).filter(function() { return $(this).data('item') === item; }).remove(); + if($.inArray(item, self.itemsArray) !== -1) + self.itemsArray.splice($.inArray(item, self.itemsArray), 1); + } + + //remove placeholder if there is an item, restore if no item(s) + if (self.itemsArray.length) + self.$input.attr('placeholder', ''); + else + self.$input.attr('placeholder', self.placeholderText); + + if (!dontPushVal) + self.pushVal(); + + // Remove class when reached maxTags + if (self.options.maxTags > self.itemsArray.length) + self.$container.removeClass('bootstrap-tagsinput-max'); + + self.$element.trigger($.Event('itemRemoved', { item: item })); + }, + + /** + * Removes all items + */ + removeAll: function() { + var self = this; + + $('.tag', self.$container).remove(); + $('option', self.$element).remove(); + + while(self.itemsArray.length > 0) + self.itemsArray.pop(); + + //remove placeholder if there is an item, restore if no item(s) + if (self.itemsArray.length) + self.$input.attr('placeholder', ''); + else + self.$input.attr('placeholder', self.placeholderText); + + self.pushVal(); + }, + + /** + * Refreshes the tags so they match the text/value of their corresponding + * item. + */ + refresh: function() { + var self = this; + $('.tag', self.$container).each(function() { + var $tag = $(this), + item = $tag.data('item'), + itemValue = self.options.itemValue(item), + itemText = self.options.itemText(item), + tagClass = self.options.tagClass(item); + + // Update tag's class and inner text + $tag.attr('class', null); + $tag.addClass('tag ' + htmlEncode(tagClass)); + $tag.contents().filter(function() { + return this.nodeType == 3; + })[0].nodeValue = htmlEncode(itemText); + + if (self.isSelect) { + var option = $('option', self.$element).filter(function() { return $(this).data('item') === item; }); + option.attr('value', itemValue); + } + }); + }, + + /** + * Returns the items added as tags + */ + items: function() { + return this.itemsArray; + }, + + /** + * Assembly value by retrieving the value of each item, and set it on the + * element. + */ + pushVal: function() { + var self = this, + val = $.map(self.items(), function(item) { + return self.options.itemValue(item).toString(); + }); + + self.$element.val(val, true).trigger('change'); + }, + + /** + * Initializes the tags input behaviour on the element + */ + build: function(options) { + var self = this; + + self.options = $.extend({}, defaultOptions, options); + // When itemValue is set, freeInput should always be false + if (self.objectItems) + self.options.freeInput = false; + + makeOptionItemFunction(self.options, 'itemValue'); + makeOptionItemFunction(self.options, 'itemText'); + makeOptionFunction(self.options, 'tagClass'); + + // Typeahead Bootstrap version 2.3.2 + if (self.options.typeahead) { + var typeahead = self.options.typeahead || {}; + + makeOptionFunction(typeahead, 'source'); + + self.$input.typeahead($.extend({}, typeahead, { + source: function (query, process) { + function processItems(items) { + var texts = []; + + for (var i = 0; i < items.length; i++) { + var text = self.options.itemText(items[i]); + map[text] = items[i]; + texts.push(text); + } + process(texts); + } + + this.map = {}; + var map = this.map, + data = typeahead.source(query); + + if ($.isFunction(data.success)) { + // support for Angular callbacks + data.success(processItems); + } else if ($.isFunction(data.then)) { + // support for Angular promises + data.then(processItems); + } else { + // support for functions and jquery promises + $.when(data) + .then(processItems); + } + }, + updater: function (text) { + self.add(this.map[text]); + }, + matcher: function (text) { + return (text.toLowerCase().indexOf(this.query.trim().toLowerCase()) !== -1); + }, + sorter: function (texts) { + return texts.sort(); + }, + highlighter: function (text) { + var regex = new RegExp( '(' + this.query + ')', 'gi' ); + return text.replace( regex, "<strong>$1</strong>" ); + } + })); + } + + // typeahead.js + if (self.options.typeaheadjs) { + var typeaheadjs = self.options.typeaheadjs || {}; + + self.$input.typeahead(null, typeaheadjs).on('typeahead:selected', $.proxy(function (obj, datum) { + if (typeaheadjs.valueKey) + self.add(datum[typeaheadjs.valueKey]); + else + self.add(datum); + self.$input.typeahead('val', ''); + }, self)); + } + + self.$container.on('click', $.proxy(function(event) { + if (! self.$element.attr('disabled')) { + self.$input.removeAttr('disabled'); + } + self.$input.focus(); + }, self)); + + if (self.options.addOnBlur && self.options.freeInput) { + self.$input.on('focusout', $.proxy(function(event) { + // HACK: only process on focusout when no typeahead opened, to + // avoid adding the typeahead text as tag + if ($('.typeahead, .twitter-typeahead', self.$container).length === 0) { + self.add(self.$input.val()); + self.$input.val(''); + } + }, self)); + } + + + self.$container.on('keydown', 'input', $.proxy(function(event) { + var $input = $(event.target), + $inputWrapper = self.findInputWrapper(); + + if (self.$element.attr('disabled')) { + self.$input.attr('disabled', 'disabled'); + return; + } + + switch (event.which) { + // BACKSPACE + case 8: + if (doGetCaretPosition($input[0]) === 0) { + var prev = $inputWrapper.prev(); + if (prev) { + self.remove(prev.data('item')); + } + } + break; + + // DELETE + case 46: + if (doGetCaretPosition($input[0]) === 0) { + var next = $inputWrapper.next(); + if (next) { + self.remove(next.data('item')); + } + } + break; + + // LEFT ARROW + case 37: + // Try to move the input before the previous tag + var $prevTag = $inputWrapper.prev(); + if ($input.val().length === 0 && $prevTag[0]) { + $prevTag.before($inputWrapper); + $input.focus(); + } + break; + // RIGHT ARROW + case 39: + // Try to move the input after the next tag + var $nextTag = $inputWrapper.next(); + if ($input.val().length === 0 && $nextTag[0]) { + $nextTag.after($inputWrapper); + $input.focus(); + } + break; + default: + // ignore + } + + // Reset internal input's size + var textLength = $input.val().length, + wordSpace = Math.ceil(textLength / 5), + size = textLength + wordSpace + 1; + $input.attr('size', Math.max(this.inputSize, $input.val().length)); + }, self)); + + self.$container.on('keypress', 'input', $.proxy(function(event) { + var $input = $(event.target); + + if (self.$element.attr('disabled')) { + self.$input.attr('disabled', 'disabled'); + return; + } + + var text = $input.val(), + maxLengthReached = self.options.maxChars && text.length >= self.options.maxChars; + if (self.options.freeInput && (keyCombinationInList(event, self.options.confirmKeys) || maxLengthReached)) { + self.add(maxLengthReached ? text.substr(0, self.options.maxChars) : text); + $input.val(''); + event.preventDefault(); + } + + // Reset internal input's size + var textLength = $input.val().length, + wordSpace = Math.ceil(textLength / 5), + size = textLength + wordSpace + 1; + $input.attr('size', Math.max(this.inputSize, $input.val().length)); + }, self)); + + // Remove icon clicked + self.$container.on('click', '[data-role=remove]', $.proxy(function(event) { + if (self.$element.attr('disabled')) { + return; + } + self.remove($(event.target).closest('.tag').data('item')); + }, self)); + + // Only add existing value as tags when using strings as tags + if (self.options.itemValue === defaultOptions.itemValue) { + if (self.$element[0].tagName === 'INPUT') { + self.add(self.$element.val()); + } else { + $('option', self.$element).each(function() { + self.add($(this).attr('value'), true); + }); + } + } + }, + + /** + * Removes all tagsinput behaviour and unregsiter all event handlers + */ + destroy: function() { + var self = this; + + // Unbind events + self.$container.off('keypress', 'input'); + self.$container.off('click', '[role=remove]'); + + self.$container.remove(); + self.$element.removeData('tagsinput'); + self.$element.show(); + }, + + /** + * Sets focus on the tagsinput + */ + focus: function() { + this.$input.focus(); + }, + + /** + * Returns the internal input element + */ + input: function() { + return this.$input; + }, + + /** + * Returns the element which is wrapped around the internal input. This + * is normally the $container, but typeahead.js moves the $input element. + */ + findInputWrapper: function() { + var elt = this.$input[0], + container = this.$container[0]; + while(elt && elt.parentNode !== container) + elt = elt.parentNode; + + return $(elt); + } + }; + + /** + * Register JQuery plugin + */ + $.fn.tagsinput = function(arg1, arg2) { + var results = []; + + this.each(function() { + var tagsinput = $(this).data('tagsinput'); + // Initialize a new tags input + if (!tagsinput) { + tagsinput = new TagsInput(this, arg1); + $(this).data('tagsinput', tagsinput); + results.push(tagsinput); + + if (this.tagName === 'SELECT') { + $('option', $(this)).attr('selected', 'selected'); + } + + // Init tags from $(this).val() + $(this).val($(this).val()); + } else if (!arg1 && !arg2) { + // tagsinput already exists + // no function, trying to init + results.push(tagsinput); + } else if(tagsinput[arg1] !== undefined) { + // Invoke function on existing tags input + var retVal = tagsinput[arg1](arg2); + if (retVal !== undefined) + results.push(retVal); + } + }); + + if ( typeof arg1 == 'string') { + // Return the results from the invoked function calls + return results.length > 1 ? results : results[0]; + } else { + return results; + } + }; + + $.fn.tagsinput.Constructor = TagsInput; + + /** + * Most options support both a string or number as well as a function as + * option value. This function makes sure that the option with the given + * key in the given options is wrapped in a function + */ + function makeOptionItemFunction(options, key) { + if (typeof options[key] !== 'function') { + var propertyName = options[key]; + options[key] = function(item) { return item[propertyName]; }; + } + } + function makeOptionFunction(options, key) { + if (typeof options[key] !== 'function') { + var value = options[key]; + options[key] = function() { return value; }; + } + } + /** + * HtmlEncodes the given value + */ + var htmlEncodeContainer = $('<div />'); + function htmlEncode(value) { + if (value) { + return htmlEncodeContainer.text(value).html(); + } else { + return ''; + } + } + + /** + * Returns the position of the caret in the given input field + * http://flightschool.acylt.com/devnotes/caret-position-woes/ + */ + function doGetCaretPosition(oField) { + var iCaretPos = 0; + if (document.selection) { + oField.focus (); + var oSel = document.selection.createRange(); + oSel.moveStart ('character', -oField.value.length); + iCaretPos = oSel.text.length; + } else if (oField.selectionStart || oField.selectionStart == '0') { + iCaretPos = oField.selectionStart; + } + return (iCaretPos); + } + + /** + * Returns boolean indicates whether user has pressed an expected key combination. + * @param object keyPressEvent: JavaScript event object, refer + * http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html + * @param object lookupList: expected key combinations, as in: + * [13, {which: 188, shiftKey: true}] + */ + function keyCombinationInList(keyPressEvent, lookupList) { + var found = false; + $.each(lookupList, function (index, keyCombination) { + if (typeof (keyCombination) === 'number' && keyPressEvent.which === keyCombination) { + found = true; + return false; + } + + if (keyPressEvent.which === keyCombination.which) { + var alt = !keyCombination.hasOwnProperty('altKey') || keyPressEvent.altKey === keyCombination.altKey, + shift = !keyCombination.hasOwnProperty('shiftKey') || keyPressEvent.shiftKey === keyCombination.shiftKey, + ctrl = !keyCombination.hasOwnProperty('ctrlKey') || keyPressEvent.ctrlKey === keyCombination.ctrlKey; + if (alt && shift && ctrl) { + found = true; + return false; + } + } + }); + + return found; + } + + /** + * Initialize tagsinput behaviour on inputs and selects which have + * data-role=tagsinput + */ + $(function() { + $("input[data-role=tagsinput], select[multiple][data-role=tagsinput]").tagsinput(); + }); +})(window.jQuery); diff --git a/mod/filestorage.php b/mod/filestorage.php index e27087a92..1767ea6bf 100644 --- a/mod/filestorage.php +++ b/mod/filestorage.php @@ -146,7 +146,8 @@ function filestorage_content(&$a) { '$submit' => t('Submit') )); - return $o; + echo $o; + killme(); } goaway(z_root() . '/cloud/' . $which); diff --git a/view/css/conversation.css b/view/css/conversation.css index 1e9930443..7a5ffc2f7 100644 --- a/view/css/conversation.css +++ b/view/css/conversation.css @@ -8,9 +8,7 @@ code { /* jot */ -#jot-title, -#jot-category, -#jot-pagetitle { +.jothidden input { border: 0px; margin: 0px; padding: 8px; diff --git a/view/css/mod_cloud.css b/view/css/mod_cloud.css new file mode 100644 index 000000000..cc5fe890f --- /dev/null +++ b/view/css/mod_cloud.css @@ -0,0 +1,5 @@ +#files-mkdir-tools, +#files-upload-tools { + display: none; +} + diff --git a/view/js/autocomplete.js b/view/js/autocomplete.js index fa293fdfd..e62959a6c 100644 --- a/view/js/autocomplete.js +++ b/view/js/autocomplete.js @@ -50,9 +50,9 @@ function replace(item) { smilies = { match: /(^|\s)(:[a-z]{2,})$/, index: 2, - search: function(term, callback) { $.getJSON('https://caterva.eu/smilies/json').done(function(data) { callback($.map(data, function(entry) { return entry['text'].indexOf(term) === 0 ? entry : null })) }) }, + search: function(term, callback) { $.getJSON('/smilies/json').done(function(data) { callback($.map(data, function(entry) { return entry['text'].indexOf(term) === 0 ? entry : null })) }) }, template: function(item) { return item['icon'] + item['text'] }, - replace: function(item) { return item['text'] + ' '; }, + replace: function(item) { return "$1"+item['text'] + ' '; }, } this.textcomplete([contacts,smilies],{}); }; diff --git a/view/js/main.js b/view/js/main.js index a851e7e63..f49cea78c 100644 --- a/view/js/main.js +++ b/view/js/main.js @@ -208,6 +208,7 @@ var pageHasMoreContent = true; var updateCountsOnly = false; var divmore_height = 400; + var last_filestorage_id = null; $(function() { $.ajaxSetup({cache: false}); @@ -842,6 +843,17 @@ function updateConvItems(mode,data) { }); } + function filestorage(event,nick,id) { + $('#perms-panel-' + last_filestorage_id).html(''); + $('#file-edit-' + id).spin('tiny'); + delete acl; + $.get('filestorage/' + nick + '/' + id + '/edit', function(data) { + $('#perms-panel-' + id).html(data); + $('#file-edit-' + id).spin(false); + last_filestorage_id = id; + }); + } + function post_comment(id) { unpause(); commentBusy = true; diff --git a/view/js/mod_filestorage.js b/view/js/mod_filestorage.js index 88c1cf7d8..bee37767f 100644 --- a/view/js/mod_filestorage.js +++ b/view/js/mod_filestorage.js @@ -13,4 +13,5 @@ $(document).ready(function() { } }).trigger('change'); + }); diff --git a/view/php/theme_init.php b/view/php/theme_init.php index ff8b54c55..f28f9aa8d 100644 --- a/view/php/theme_init.php +++ b/view/php/theme_init.php @@ -11,6 +11,7 @@ head_add_css('library/colorbox/colorbox.css'); head_add_css('view/css/conversation.css'); head_add_css('view/css/widgets.css'); head_add_css('library/justifiedGallery/dist/css/justifiedGallery.css'); +head_add_css('library/bootstrap-tagsinput/bootstrap-tagsinput.css'); head_add_js('jquery.js'); head_add_js('jquery-migrate-1.1.1.js'); @@ -41,6 +42,7 @@ head_add_js('crypto.js'); head_add_js('library/jslider/bin/jquery.slider.min.js'); head_add_js('docready.js'); head_add_js('library/colorbox/jquery.colorbox-min.js'); +head_add_js('library/bootstrap-tagsinput/bootstrap-tagsinput.js'); /** * Those who require this feature will know what to do with it. diff --git a/view/theme/redbasic/css/style.css b/view/theme/redbasic/css/style.css index 382bed90e..4681ef5ba 100644 --- a/view/theme/redbasic/css/style.css +++ b/view/theme/redbasic/css/style.css @@ -1746,44 +1746,23 @@ img.mail-list-sender-photo { max-width: $converse_width; } -#jot-title, -#jot-category, -#jot-pagetitle { +.jothidden { font-weight: bold; - border: solid 1px #ffffff; border-radius: $radiuspx; } -#jot-category::-webkit-input-placeholder { +.jothidden input::-webkit-input-placeholder { font-weight: bold; } -#jot-category:-moz-placeholder { +.jothidden input::-moz-placeholder { font-weight: bold; } -#jot-title::-webkit-input-placeholder { - font-weight: bold; -} - -#jot-title:-moz-placeholder { - font-weight: bold; +.jothidden >input, .jothidden >input { + border: 1px solid #fff; } - -#jot-pagetitle::-webkit-input-placeholder { - font-weight: bold; -} - -#jot-pagetitle:-moz-placeholder { - font-weight: bold; -} - -#jot-title:hover, -#jot-title:focus, -#jot-pagetitle:hover, -#jot-pagetitle:focus, -#jot-category:hover, -#jot-category:focus { +.jothidden >input:hover, .jothidden >input:focus { border: 1px solid #cccccc; } @@ -2076,18 +2055,8 @@ nav .dropdown-menu>li>a:hover,nav .dropdown-menu>li>a:focus{ color: $nav_active_icon_colour; } -/* Files */ - -#attach-edit-perms { - margin-top: 25px; - margin-bottom: 20px; - font-weight: bold; - font-size: 17px; -} - /* bootstrap overrides */ - blockquote { font-size: $font_size; font-style: italic; @@ -2368,3 +2337,28 @@ aside .nav > li > a:hover, aside .nav > li > a:focus { .bb_observer img { border: 3px solid red !important; } + +.bootstrap-tagsinput .tag:before { + /* Copied from icon-asterisk, is there a better way to do it? */ + font-family: FontAwesome; + font-weight: normal; + font-style: normal; + text-decoration: inherit; + content:"\f069"; +} + +/* Modified original CSS to match input in Redbasic */ +.bootstrap-tagsinput { + border-color:#fff; + background-color: #fff; + box-shadow: none; + display: inline-block; + border-radius: $radiuspx; + cursor: text; + padding: 0 6px; + width: 70% !important; +} + +.jothidden .bootstrap-tagsinput:hover, .jothidden .bootstrap-tagsinput:focus { + border: 1px solid #cccccc; +} diff --git a/view/tpl/attach_edit.tpl b/view/tpl/attach_edit.tpl index a2a4af16b..bf39e6158 100644 --- a/view/tpl/attach_edit.tpl +++ b/view/tpl/attach_edit.tpl @@ -1,16 +1,16 @@ -<div id="attach-edit-backlink">< <a href="{{$parentpath}}">{{$backlink}}</a></div> - -<h1>{{$header}}</h1> - <form action="filestorage/{{$channelnick}}/{{$file.id}}/edit" method="post" > <div id="attach-edit-perms" > <button id="dbtn-acl" class="btn btn-default btn-sm" data-toggle="modal" data-target="#aclModal" title="{{$permset}}" onclick="return false;"> <i id="jot-perms-icon" class="icon-{{$lockstate}} jot-icons"></i> </button> -{{$aclselect}} {{$file.filename}} +<button id="dbtn-submit" class="btn btn-primary btn-sm" type="submit" name="submit"> + {{$submit}} +</button> </div> +{{$aclselect}} + <input type="hidden" name="channelnick" value="{{$channelnick}}" /> <input type="hidden" name="filehash" value="{{$file.hash}}" /> <input type="hidden" name="uid" value="{{$uid}}" /> @@ -28,9 +28,7 @@ <div class="cut-paste-desc">{{$cpldesc}}</div> <input type="text" id="linkpasteinput" name="cutpasteextlink" value="{{$cloudpath}}" onclick="this.select();"/><br /> - <div class="clear"></div> -<input id="dbtn-submit" type="submit" name="submit" value="{{$submit}}" /> -</form> +</form> diff --git a/view/tpl/cloud_actionspanel.tpl b/view/tpl/cloud_actionspanel.tpl index 00f243c1e..d88bc94c4 100644 --- a/view/tpl/cloud_actionspanel.tpl +++ b/view/tpl/cloud_actionspanel.tpl @@ -1,27 +1,17 @@ -<div class="generic-content-wrapper-styled"> - -<table> - <tr> - <td><strong>{{$folder_header}}</strong> </td> - <td> - <form method="post" action=""> - <input type="hidden" name="sabreAction" value="mkcol"> - <input type="text" name="name"> - <input type="submit" value="{{$folder_submit}}"> - </form> - </td> - </tr> - <tr> - <td><strong>{{$upload_header}}</strong> </td> - <td> - <form method="post" action="" enctype="multipart/form-data"> - <input type="hidden" name="sabreAction" value="put"> - <input type="file" name="file" style="display: inline;"> - <input type="submit" value="{{$upload_submit}}"> - <!-- Name (optional): <input type="text" name="name"> we should rather provide a rename action in edit form--> - </form> - </td> - </tr> -</table> - +<div id="files-mkdir-tools" class="section-content-tools-wrapper form-group"> + <label for="files-mkdir">{{$folder_header}}</label> + <form method="post" action=""> + <input type="hidden" name="sabreAction" value="mkcol"> + <input id="files-mkdir" type="text" name="name"> + <input type="submit" value="{{$folder_submit}}"> + </form> +</div> +<div id="files-upload-tools" class="section-content-tools-wrapper form-group"> + <label for="files-upload">{{$upload_header}}</label> + <form method="post" action="" enctype="multipart/form-data"> + <input type="hidden" name="sabreAction" value="put"> + <input id="files-upload" type="file" name="file" style="display: inline;"> + <input type="submit" value="{{$upload_submit}}"> + <!-- Name (optional): <input type="text" name="name"> we should rather provide a rename action in edit form--> + </form> </div> diff --git a/view/tpl/cloud_directory.tpl b/view/tpl/cloud_directory.tpl index 639a6bf61..f37895e09 100644 --- a/view/tpl/cloud_directory.tpl +++ b/view/tpl/cloud_directory.tpl @@ -1,5 +1,5 @@ <div class="generic-content-wrapper-styled"> -<h1>{{$header}}</h1> + <table id="cloud-index"> <tr> <th></th> @@ -26,8 +26,9 @@ <td style="min-width: 15em"><a href="{{$item.fullPath}}">{{$item.displayName}}</a></td> {{if $item.is_owner}} <td>{{$item.attachIcon}}</td> - <td style="position:relative;"><a href="{{$item.fileStorageUrl}}/{{$item.attachId}}/edit" title="{{$edit}}"><i class="icon-pencil btn btn-default"></i></a></td> - <td><a href="{{$item.fileStorageUrl}}/{{$item.attachId}}/delete" title="{{$delete}}" onclick="return confirmDelete();"><i class="icon-remove btn btn-default drop-icons"></i></a></td> + <td style="position:relative;"><i id="file-edit-{{$item.attachId}}" class="fakelink icon-pencil" onclick="filestorage(event, '{{$nick}}', {{$item.attachId}});"></i></td> + <td><a href="{{$item.fileStorageUrl}}/{{$item.attachId}}/delete" title="{{$delete}}" onclick="return confirmDelete();"><i class="icon-remove drop-icons"></i></a></td> + {{else}} <td></td><td></td><td></td> {{/if}} @@ -35,11 +36,8 @@ <td>{{$item.sizeFormatted}}</td> <td>{{$item.lastmodified}}</td> </tr> + <tr><td id="perms-panel-{{$item.attachId}}" colspan="8"></td></tr> {{/foreach}} - <tr><td colspan="8"><hr></td></tr> -</table> -{{if $quota.limit || $quota.used}} - <p><strong>{{$total}}</strong> {{$quota.desc}}</p> -{{/if}} +</table> </div> diff --git a/view/tpl/cloud_header.tpl b/view/tpl/cloud_header.tpl new file mode 100644 index 000000000..f5f123edb --- /dev/null +++ b/view/tpl/cloud_header.tpl @@ -0,0 +1,13 @@ +<div class="section-title-wrapper"> + {{if $actionspanel}} + <div class="pull-right"> + <button id="files-create-btn"class="btn btn-xs btn-primary" title="{{if $quota.limit || $quota.used}}{{$quota.desc}}{{/if}}" onclick="openClose('files-mkdir-tools'); closeMenu('files-upload-tools');"><i class="icon-folder-close-alt"></i> Create</button> + <button id="files-upload-btn" class="btn btn-xs btn-success" title="{{if $quota.limit || $quota.used}}{{$quota.desc}}{{/if}}" onclick="openClose('files-upload-tools'); closeMenu('files-mkdir-tools');"><i class="icon-upload"></i> Upload</button> + </div> + {{/if}} + <h2>{{$header}}</h2> + <div class="clear"></div> +</div> +{{if $actionspanel}} + {{$actionspanel}} +{{/if}} diff --git a/view/tpl/jot.tpl b/view/tpl/jot.tpl index 34acce879..00ef77d93 100755 --- a/view/tpl/jot.tpl +++ b/view/tpl/jot.tpl @@ -19,17 +19,17 @@ <span class="channel-id-select-desc">{{$id_seltext}}</span> {{$id_select}} </div> {{/if}} - <div id="jot-title-wrap"> - <input name="title" id="jot-title" type="text" placeholder="{{$placeholdertitle}}" value="{{$title}}" class="jothidden" style="display:none"> + <div id="jot-title-wrap" class="jothidden" style="display:none"> + <input name="title" id="jot-title" type="text" placeholder="{{$placeholdertitle}}" value="{{$title}}"> </div> {{if $catsenabled}} - <div id="jot-category-wrap"> - <input name="category" id="jot-category" type="text" placeholder="{{$placeholdercategory}}" value="{{$category}}" class="jothidden" style="display:none" /> + <div id="jot-category-wrap" class="jothidden" style="display:none"> + <input name="category" id="jot-category" type="text" placeholder="{{$placeholdercategory}}" value="{{$category}}" data-role="tagsinput"/> </div> {{/if}} {{if $webpage}} - <div id="jot-pagetitle-wrap"> - <input name="pagetitle" id="jot-pagetitle" type="text" placeholder="{{$placeholdpagetitle}}" value="{{$pagetitle}}" class="jothidden" style="display:none" /> + <div id="jot-pagetitle-wrap" class="jothidden" style="display:none"> + <input name="pagetitle" id="jot-pagetitle" type="text" placeholder="{{$placeholdpagetitle}}" value="{{$pagetitle}}" /> </div> {{/if}} <div id="jot-text-wrap"> |