├── .gitattributes
├── .gitignore
├── app
├── commands
│ └── .gitkeep
├── config
│ ├── app.php
│ ├── auth.php
│ ├── cache.php
│ ├── compile.php
│ ├── config.php
│ ├── database.php
│ ├── local
│ │ ├── app.php
│ │ ├── cache.php
│ │ ├── database.php
│ │ └── session.php
│ ├── mail.php
│ ├── packages
│ │ └── .gitkeep
│ ├── queue.php
│ ├── remote.php
│ ├── session.php
│ ├── testing
│ │ ├── cache.php
│ │ └── session.php
│ ├── view.php
│ └── workbench.php
├── controllers
│ ├── .gitkeep
│ ├── Admin
│ │ └── SeoController.php
│ ├── Api
│ │ ├── ProductsController.php
│ │ └── SearchController.php
│ ├── BaseController.php
│ └── HomeController.php
├── database
│ ├── migrations
│ │ └── .gitkeep
│ ├── production.sqlite
│ └── seeds
│ │ ├── .gitkeep
│ │ └── DatabaseSeeder.php
├── filters.php
├── lang
│ └── en
│ │ ├── pagination.php
│ │ ├── reminders.php
│ │ └── validation.php
├── models
│ ├── Category.php
│ ├── Product.php
│ ├── Review.php
│ ├── Seo.php
│ └── User.php
├── routes.php
├── start
│ ├── artisan.php
│ ├── global.php
│ └── local.php
├── storage
│ ├── .gitignore
│ ├── cache
│ │ └── .gitignore
│ ├── logs
│ │ └── .gitignore
│ ├── meta
│ │ └── .gitignore
│ ├── sessions
│ │ └── .gitignore
│ └── views
│ │ └── .gitignore
├── tests
│ ├── ExampleTest.php
│ └── TestCase.php
└── views
│ ├── admin
│ └── seo
│ │ ├── edit.blade.php
│ │ └── list.blade.php
│ ├── categories
│ └── single.blade.php
│ ├── emails
│ └── auth
│ │ └── reminder.blade.php
│ ├── index.blade.php
│ ├── layout.blade.php
│ ├── partials
│ └── sidebar
│ │ └── categories.blade.php
│ └── products
│ └── single.blade.php
├── artisan
├── bootstrap
├── autoload.php
├── paths.php
└── start.php
├── composer.json
├── install.sql
├── pagination.gif
├── phpunit.xml
├── public
├── .htaccess
├── css
│ └── styles.css
├── img
│ ├── icons
│ │ ├── banner
│ │ │ ├── 1.jpg
│ │ │ ├── 2.jpg
│ │ │ ├── 3.jpg
│ │ │ ├── 4.jpg
│ │ │ └── 5.jpg
│ │ ├── category-icon.png
│ │ ├── product-1.jpg
│ │ ├── product-2.jpg
│ │ ├── product-3.jpg
│ │ ├── product-4.jpg
│ │ └── product-5.jpg
│ └── spinner.gif
├── index.php
├── js
│ ├── expanding.js
│ ├── jquery.charcounter.js
│ ├── main.js
│ ├── starrr.js
│ └── vendor
│ │ ├── backbone-min.js
│ │ ├── backbone.paginator.min.js
│ │ ├── spin.min.js
│ │ └── underscore-min.js
├── packages
│ └── .gitkeep
├── robots.txt
└── vendor
│ └── selectize
│ ├── css
│ ├── selectize.bootstrap2.css
│ ├── selectize.bootstrap3.css
│ ├── selectize.css
│ ├── selectize.default.css
│ └── selectize.legacy.css
│ ├── js
│ ├── selectize.js
│ ├── selectize.min.js
│ └── standalone
│ │ ├── selectize.js
│ │ └── selectize.min.js
│ └── less
│ ├── plugins
│ ├── drag_drop.less
│ ├── dropdown_header.less
│ ├── optgroup_columns.less
│ └── remove_button.less
│ ├── selectize.bootstrap2.less
│ ├── selectize.bootstrap3.less
│ ├── selectize.default.less
│ ├── selectize.legacy.less
│ └── selectize.less
├── readme.md
└── server.php
/.gitattributes:
--------------------------------------------------------------------------------
1 | * text=auto
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /bootstrap/compiled.php
2 | /vendor
3 | composer.phar
4 | composer.lock
5 | .DS_Store
6 | Thumbs.db
--------------------------------------------------------------------------------
/app/commands/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msurguy/laravel-backbone-pagination/453686c0d0da1f2629a5790e15df66d81dfbea0c/app/commands/.gitkeep
--------------------------------------------------------------------------------
/app/config/app.php:
--------------------------------------------------------------------------------
1 | false,
17 |
18 | /*
19 | |--------------------------------------------------------------------------
20 | | Application URL
21 | |--------------------------------------------------------------------------
22 | |
23 | | This URL is used by the console to properly generate URLs when using
24 | | the Artisan command line tool. You should set this to the root of
25 | | your application so that it is used when running Artisan tasks.
26 | |
27 | */
28 |
29 | 'url' => 'http://localhost',
30 |
31 | /*
32 | |--------------------------------------------------------------------------
33 | | Application Timezone
34 | |--------------------------------------------------------------------------
35 | |
36 | | Here you may specify the default timezone for your application, which
37 | | will be used by the PHP date and date-time functions. We have gone
38 | | ahead and set this to a sensible default for you out of the box.
39 | |
40 | */
41 |
42 | 'timezone' => 'UTC',
43 |
44 | /*
45 | |--------------------------------------------------------------------------
46 | | Application Locale Configuration
47 | |--------------------------------------------------------------------------
48 | |
49 | | The application locale determines the default locale that will be used
50 | | by the translation service provider. You are free to set this value
51 | | to any of the locales which will be supported by the application.
52 | |
53 | */
54 |
55 | 'locale' => 'en',
56 |
57 | /*
58 | |--------------------------------------------------------------------------
59 | | Encryption Key
60 | |--------------------------------------------------------------------------
61 | |
62 | | This key is used by the Illuminate encrypter service and should be set
63 | | to a random, 32 character string, otherwise these encrypted strings
64 | | will not be safe. Please do this before deploying an application!
65 | |
66 | */
67 |
68 | 'key' => 'SgiePGY4571j2VYRDQlEHaULBdzL27CR',
69 |
70 | /*
71 | |--------------------------------------------------------------------------
72 | | Autoloaded Service Providers
73 | |--------------------------------------------------------------------------
74 | |
75 | | The service providers listed here will be automatically loaded on the
76 | | request to your application. Feel free to add your own services to
77 | | this array to grant expanded functionality to your applications.
78 | |
79 | */
80 |
81 | 'providers' => array(
82 | 'Illuminate\Foundation\Providers\ArtisanServiceProvider',
83 | 'Illuminate\Auth\AuthServiceProvider',
84 | 'Illuminate\Cache\CacheServiceProvider',
85 | 'Illuminate\Session\CommandsServiceProvider',
86 | 'Illuminate\Foundation\Providers\ConsoleSupportServiceProvider',
87 | 'Illuminate\Routing\ControllerServiceProvider',
88 | 'Illuminate\Cookie\CookieServiceProvider',
89 | 'Illuminate\Database\DatabaseServiceProvider',
90 | 'Illuminate\Encryption\EncryptionServiceProvider',
91 | 'Illuminate\Filesystem\FilesystemServiceProvider',
92 | 'Illuminate\Hashing\HashServiceProvider',
93 | 'Illuminate\Html\HtmlServiceProvider',
94 | 'Illuminate\Log\LogServiceProvider',
95 | 'Illuminate\Mail\MailServiceProvider',
96 | 'Illuminate\Database\MigrationServiceProvider',
97 | 'Illuminate\Pagination\PaginationServiceProvider',
98 | 'Illuminate\Queue\QueueServiceProvider',
99 | 'Illuminate\Redis\RedisServiceProvider',
100 | 'Illuminate\Remote\RemoteServiceProvider',
101 | 'Illuminate\Auth\Reminders\ReminderServiceProvider',
102 | 'Illuminate\Database\SeedServiceProvider',
103 | 'Illuminate\Session\SessionServiceProvider',
104 | 'Illuminate\Translation\TranslationServiceProvider',
105 | 'Illuminate\Validation\ValidationServiceProvider',
106 | 'Illuminate\View\ViewServiceProvider',
107 | 'Illuminate\Workbench\WorkbenchServiceProvider',
108 | ),
109 |
110 | /*
111 | |--------------------------------------------------------------------------
112 | | Service Provider Manifest
113 | |--------------------------------------------------------------------------
114 | |
115 | | The service provider manifest is used by Laravel to lazy load service
116 | | providers which are not needed for each request, as well to keep a
117 | | list of all of the services. Here, you may set its storage spot.
118 | |
119 | */
120 |
121 | 'manifest' => storage_path().'/meta',
122 |
123 | /*
124 | |--------------------------------------------------------------------------
125 | | Class Aliases
126 | |--------------------------------------------------------------------------
127 | |
128 | | This array of class aliases will be registered when this application
129 | | is started. However, feel free to register as many as you wish as
130 | | the aliases are "lazy" loaded so they don't hinder performance.
131 | |
132 | */
133 |
134 | 'aliases' => array(
135 |
136 | 'App' => 'Illuminate\Support\Facades\App',
137 | 'Artisan' => 'Illuminate\Support\Facades\Artisan',
138 | 'Auth' => 'Illuminate\Support\Facades\Auth',
139 | 'Blade' => 'Illuminate\Support\Facades\Blade',
140 | 'Cache' => 'Illuminate\Support\Facades\Cache',
141 | 'ClassLoader' => 'Illuminate\Support\ClassLoader',
142 | 'Config' => 'Illuminate\Support\Facades\Config',
143 | 'Controller' => 'Illuminate\Routing\Controller',
144 | 'Cookie' => 'Illuminate\Support\Facades\Cookie',
145 | 'Crypt' => 'Illuminate\Support\Facades\Crypt',
146 | 'DB' => 'Illuminate\Support\Facades\DB',
147 | 'Eloquent' => 'Illuminate\Database\Eloquent\Model',
148 | 'Event' => 'Illuminate\Support\Facades\Event',
149 | 'File' => 'Illuminate\Support\Facades\File',
150 | 'Form' => 'Illuminate\Support\Facades\Form',
151 | 'Hash' => 'Illuminate\Support\Facades\Hash',
152 | 'HTML' => 'Illuminate\Support\Facades\HTML',
153 | 'Input' => 'Illuminate\Support\Facades\Input',
154 | 'Lang' => 'Illuminate\Support\Facades\Lang',
155 | 'Log' => 'Illuminate\Support\Facades\Log',
156 | 'Mail' => 'Illuminate\Support\Facades\Mail',
157 | 'Paginator' => 'Illuminate\Support\Facades\Paginator',
158 | 'Password' => 'Illuminate\Support\Facades\Password',
159 | 'Queue' => 'Illuminate\Support\Facades\Queue',
160 | 'Redirect' => 'Illuminate\Support\Facades\Redirect',
161 | 'Redis' => 'Illuminate\Support\Facades\Redis',
162 | 'Request' => 'Illuminate\Support\Facades\Request',
163 | 'Response' => 'Illuminate\Support\Facades\Response',
164 | 'Route' => 'Illuminate\Support\Facades\Route',
165 | 'Schema' => 'Illuminate\Support\Facades\Schema',
166 | 'Seeder' => 'Illuminate\Database\Seeder',
167 | 'Session' => 'Illuminate\Support\Facades\Session',
168 | 'SSH' => 'Illuminate\Support\Facades\SSH',
169 | 'Str' => 'Illuminate\Support\Str',
170 | 'URL' => 'Illuminate\Support\Facades\URL',
171 | 'Validator' => 'Illuminate\Support\Facades\Validator',
172 | 'View' => 'Illuminate\Support\Facades\View',
173 | ),
174 |
175 | );
176 |
--------------------------------------------------------------------------------
/app/config/auth.php:
--------------------------------------------------------------------------------
1 | 'eloquent',
19 |
20 | /*
21 | |--------------------------------------------------------------------------
22 | | Authentication Model
23 | |--------------------------------------------------------------------------
24 | |
25 | | When using the "Eloquent" authentication driver, we need to know which
26 | | Eloquent model should be used to retrieve your users. Of course, it
27 | | is often just the "User" model but you may use whatever you like.
28 | |
29 | */
30 |
31 | 'model' => 'User',
32 |
33 | /*
34 | |--------------------------------------------------------------------------
35 | | Authentication Table
36 | |--------------------------------------------------------------------------
37 | |
38 | | When using the "Database" authentication driver, we need to know which
39 | | table should be used to retrieve your users. We have chosen a basic
40 | | default value but you may easily change it to any table you like.
41 | |
42 | */
43 |
44 | 'table' => 'users',
45 |
46 | /*
47 | |--------------------------------------------------------------------------
48 | | Password Reminder Settings
49 | |--------------------------------------------------------------------------
50 | |
51 | | Here you may set the settings for password reminders, including a view
52 | | that should be used as your password reminder e-mail. You will also
53 | | be able to set the name of the table that holds the reset tokens.
54 | |
55 | | The "expire" time is the number of minutes that the reminder should be
56 | | considered valid. This security feature keeps tokens short-lived so
57 | | they have less time to be guessed. You may change this as needed.
58 | |
59 | */
60 |
61 | 'reminder' => array(
62 |
63 | 'email' => 'emails.auth.reminder',
64 |
65 | 'table' => 'password_reminders',
66 |
67 | 'expire' => 60,
68 |
69 | ),
70 |
71 | );
--------------------------------------------------------------------------------
/app/config/cache.php:
--------------------------------------------------------------------------------
1 | 'redis',
19 |
20 | /*
21 | |--------------------------------------------------------------------------
22 | | File Cache Location
23 | |--------------------------------------------------------------------------
24 | |
25 | | When using the "file" cache driver, we need a location where the cache
26 | | files may be stored. A sensible default has been specified, but you
27 | | are free to change it to any other place on disk that you desire.
28 | |
29 | */
30 |
31 | 'path' => storage_path().'/cache',
32 |
33 | /*
34 | |--------------------------------------------------------------------------
35 | | Database Cache Connection
36 | |--------------------------------------------------------------------------
37 | |
38 | | When using the "database" cache driver you may specify the connection
39 | | that should be used to store the cached items. When this option is
40 | | null the default database connection will be utilized for cache.
41 | |
42 | */
43 |
44 | 'connection' => null,
45 |
46 | /*
47 | |--------------------------------------------------------------------------
48 | | Database Cache Table
49 | |--------------------------------------------------------------------------
50 | |
51 | | When using the "database" cache driver we need to know the table that
52 | | should be used to store the cached items. A default table name has
53 | | been provided but you're free to change it however you deem fit.
54 | |
55 | */
56 |
57 | 'table' => 'cache',
58 |
59 | /*
60 | |--------------------------------------------------------------------------
61 | | Memcached Servers
62 | |--------------------------------------------------------------------------
63 | |
64 | | Now you may specify an array of your Memcached servers that should be
65 | | used when utilizing the Memcached cache driver. All of the servers
66 | | should contain a value for "host", "port", and "weight" options.
67 | |
68 | */
69 |
70 | 'memcached' => array(
71 |
72 | array('host' => '127.0.0.1', 'port' => 11211, 'weight' => 100),
73 |
74 | ),
75 |
76 | /*
77 | |--------------------------------------------------------------------------
78 | | Cache Key Prefix
79 | |--------------------------------------------------------------------------
80 | |
81 | | When utilizing a RAM based store such as APC or Memcached, there might
82 | | be other applications utilizing the same cache. So, we'll specify a
83 | | value to get prefixed to all our keys so we can avoid collisions.
84 | |
85 | */
86 |
87 | 'prefix' => 'shop',
88 |
89 | );
--------------------------------------------------------------------------------
/app/config/compile.php:
--------------------------------------------------------------------------------
1 | array(
7 | 'products' => 'Products',
8 | 'categories' => 'Categories',
9 | ),
10 | );
--------------------------------------------------------------------------------
/app/config/database.php:
--------------------------------------------------------------------------------
1 | PDO::FETCH_CLASS,
17 |
18 | /*
19 | |--------------------------------------------------------------------------
20 | | Default Database Connection Name
21 | |--------------------------------------------------------------------------
22 | |
23 | | Here you may specify which of the database connections below you wish
24 | | to use as your default connection for all database work. Of course
25 | | you may use many connections at once using the Database library.
26 | |
27 | */
28 |
29 | 'default' => 'mysql',
30 |
31 | /*
32 | |--------------------------------------------------------------------------
33 | | Database Connections
34 | |--------------------------------------------------------------------------
35 | |
36 | | Here are each of the database connections setup for your application.
37 | | Of course, examples of configuring each database platform that is
38 | | supported by Laravel is shown below to make development simple.
39 | |
40 | |
41 | | All database work in Laravel is done through the PHP PDO facilities
42 | | so make sure you have the driver for your particular database of
43 | | choice installed on your machine before you begin development.
44 | |
45 | */
46 |
47 | 'connections' => array(
48 |
49 | 'sqlite' => array(
50 | 'driver' => 'sqlite',
51 | 'database' => __DIR__.'/../database/production.sqlite',
52 | 'prefix' => '',
53 | ),
54 |
55 | 'mysql' => array(
56 | 'driver' => 'mysql',
57 | 'host' => getenv('db_host'),
58 | 'database' => getenv('db_name'),
59 | 'username' => getenv('db_username'),
60 | 'password' => getenv('db_password'),
61 | 'charset' => 'utf8',
62 | 'collation' => 'utf8_unicode_ci',
63 | 'prefix' => '',
64 | ),
65 |
66 | 'pgsql' => array(
67 | 'driver' => 'pgsql',
68 | 'host' => 'localhost',
69 | 'database' => 'database',
70 | 'username' => 'root',
71 | 'password' => '',
72 | 'charset' => 'utf8',
73 | 'prefix' => '',
74 | 'schema' => 'public',
75 | ),
76 |
77 | 'sqlsrv' => array(
78 | 'driver' => 'sqlsrv',
79 | 'host' => 'localhost',
80 | 'database' => 'database',
81 | 'username' => 'root',
82 | 'password' => '',
83 | 'prefix' => '',
84 | ),
85 |
86 | ),
87 |
88 | /*
89 | |--------------------------------------------------------------------------
90 | | Migration Repository Table
91 | |--------------------------------------------------------------------------
92 | |
93 | | This table keeps track of all the migrations that have already run for
94 | | your application. Using this information, we can determine which of
95 | | the migrations on disk haven't actually been run in the database.
96 | |
97 | */
98 |
99 | 'migrations' => 'migrations',
100 |
101 | /*
102 | |--------------------------------------------------------------------------
103 | | Redis Databases
104 | |--------------------------------------------------------------------------
105 | |
106 | | Redis is an open source, fast, and advanced key-value store that also
107 | | provides a richer set of commands than a typical key-value systems
108 | | such as APC or Memcached. Laravel makes it easy to dig right in.
109 | |
110 | */
111 |
112 |
113 | 'redis' => array(
114 |
115 | 'cluster' => false,
116 |
117 | 'default' => array(
118 | 'host' => '127.0.0.1',
119 | 'port' => 6379,
120 | 'database' => 0,
121 | ),
122 |
123 | ),
124 |
125 | );
126 |
--------------------------------------------------------------------------------
/app/config/local/app.php:
--------------------------------------------------------------------------------
1 | true,
6 |
7 | );
8 |
--------------------------------------------------------------------------------
/app/config/local/cache.php:
--------------------------------------------------------------------------------
1 | 'file',
5 | );
--------------------------------------------------------------------------------
/app/config/local/database.php:
--------------------------------------------------------------------------------
1 | array(
6 |
7 | 'mysql' => array(
8 | 'driver' => 'mysql',
9 | 'host' => 'localhost',
10 | 'database' => 'shop-pagination',
11 | 'username' => 'root',
12 | 'password' => 'root',
13 | 'charset' => 'utf8',
14 | 'collation' => 'utf8_unicode_ci',
15 | 'prefix' => '',
16 | )
17 | )
18 | );
19 |
--------------------------------------------------------------------------------
/app/config/local/session.php:
--------------------------------------------------------------------------------
1 | 'native',
6 |
7 | );
--------------------------------------------------------------------------------
/app/config/mail.php:
--------------------------------------------------------------------------------
1 | 'smtp',
19 |
20 | /*
21 | |--------------------------------------------------------------------------
22 | | SMTP Host Address
23 | |--------------------------------------------------------------------------
24 | |
25 | | Here you may provide the host address of the SMTP server used by your
26 | | applications. A default option is provided that is compatible with
27 | | the Postmark mail service, which will provide reliable delivery.
28 | |
29 | */
30 |
31 | 'host' => 'smtp.mailgun.org',
32 |
33 | /*
34 | |--------------------------------------------------------------------------
35 | | SMTP Host Port
36 | |--------------------------------------------------------------------------
37 | |
38 | | This is the SMTP port used by your application to delivery e-mails to
39 | | users of your application. Like the host we have set this value to
40 | | stay compatible with the Postmark e-mail application by default.
41 | |
42 | */
43 |
44 | 'port' => 587,
45 |
46 | /*
47 | |--------------------------------------------------------------------------
48 | | Global "From" Address
49 | |--------------------------------------------------------------------------
50 | |
51 | | You may wish for all e-mails sent by your application to be sent from
52 | | the same address. Here, you may specify a name and address that is
53 | | used globally for all e-mails that are sent by your application.
54 | |
55 | */
56 |
57 | 'from' => array('address' => null, 'name' => null),
58 |
59 | /*
60 | |--------------------------------------------------------------------------
61 | | E-Mail Encryption Protocol
62 | |--------------------------------------------------------------------------
63 | |
64 | | Here you may specify the encryption protocol that should be used when
65 | | the application send e-mail messages. A sensible default using the
66 | | transport layer security protocol should provide great security.
67 | |
68 | */
69 |
70 | 'encryption' => 'tls',
71 |
72 | /*
73 | |--------------------------------------------------------------------------
74 | | SMTP Server Username
75 | |--------------------------------------------------------------------------
76 | |
77 | | If your SMTP server requires a username for authentication, you should
78 | | set it here. This will get used to authenticate with your server on
79 | | connection. You may also set the "password" value below this one.
80 | |
81 | */
82 |
83 | 'username' => null,
84 |
85 | /*
86 | |--------------------------------------------------------------------------
87 | | SMTP Server Password
88 | |--------------------------------------------------------------------------
89 | |
90 | | Here you may set the password required by your SMTP server to send out
91 | | messages from your application. This will be given to the server on
92 | | connection so that the application will be able to send messages.
93 | |
94 | */
95 |
96 | 'password' => null,
97 |
98 | /*
99 | |--------------------------------------------------------------------------
100 | | Sendmail System Path
101 | |--------------------------------------------------------------------------
102 | |
103 | | When using the "sendmail" driver to send e-mails, we will need to know
104 | | the path to where Sendmail lives on this server. A default path has
105 | | been provided here, which will work well on most of your systems.
106 | |
107 | */
108 |
109 | 'sendmail' => '/usr/sbin/sendmail -bs',
110 |
111 | /*
112 | |--------------------------------------------------------------------------
113 | | Mail "Pretend"
114 | |--------------------------------------------------------------------------
115 | |
116 | | When this option is enabled, e-mail will not actually be sent over the
117 | | web and will instead be written to your application's logs files so
118 | | you may inspect the message. This is great for local development.
119 | |
120 | */
121 |
122 | 'pretend' => false,
123 |
124 | );
--------------------------------------------------------------------------------
/app/config/packages/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msurguy/laravel-backbone-pagination/453686c0d0da1f2629a5790e15df66d81dfbea0c/app/config/packages/.gitkeep
--------------------------------------------------------------------------------
/app/config/queue.php:
--------------------------------------------------------------------------------
1 | 'sync',
19 |
20 | 'failed' => array(
21 | 'database' => 'mysql', 'table' => 'failed_jobs',
22 | ),
23 |
24 | /*
25 | |--------------------------------------------------------------------------
26 | | Queue Connections
27 | |--------------------------------------------------------------------------
28 | |
29 | | Here you may configure the connection information for each server that
30 | | is used by your application. A default configuration has been added
31 | | for each back-end shipped with Laravel. You are free to add more.
32 | |
33 | */
34 |
35 | 'connections' => array(
36 |
37 | 'sync' => array(
38 | 'driver' => 'sync',
39 | ),
40 |
41 | 'beanstalkd' => array(
42 | 'driver' => 'beanstalkd',
43 | 'host' => 'localhost',
44 | 'queue' => 'default',
45 | ),
46 |
47 | 'sqs' => array(
48 | 'driver' => 'sqs',
49 | 'key' => 'your-public-key',
50 | 'secret' => 'your-secret-key',
51 | 'queue' => 'your-queue-url',
52 | 'region' => 'us-east-1',
53 | ),
54 |
55 | 'iron' => array(
56 | 'driver' => 'iron',
57 | 'project' => 'your-project-id',
58 | 'token' => 'your-token',
59 | 'queue' => 'your-queue-name',
60 | ),
61 |
62 | ),
63 |
64 | );
65 |
--------------------------------------------------------------------------------
/app/config/remote.php:
--------------------------------------------------------------------------------
1 | 'production',
17 |
18 | /*
19 | |--------------------------------------------------------------------------
20 | | Remote Server Connections
21 | |--------------------------------------------------------------------------
22 | |
23 | | These are the servers that will be accessible via the SSH task runner
24 | | facilities of Laravel. This feature radically simplifies executing
25 | | tasks on your servers, such as deploying out these applications.
26 | |
27 | */
28 |
29 | 'connections' => array(
30 |
31 | 'production' => array(
32 | 'host' => '',
33 | 'username' => '',
34 | 'password' => '',
35 | 'key' => '',
36 | 'keyphrase' => '',
37 | 'root' => '/var/www',
38 | ),
39 |
40 | ),
41 |
42 | /*
43 | |--------------------------------------------------------------------------
44 | | Remote Server Groups
45 | |--------------------------------------------------------------------------
46 | |
47 | | Here you may list connections under a single group name, which allows
48 | | you to easily access all of the servers at once using a short name
49 | | that is extremely easy to remember, such as "web" or "database".
50 | |
51 | */
52 |
53 | 'groups' => array(
54 |
55 | 'web' => array('production')
56 |
57 | ),
58 |
59 | );
--------------------------------------------------------------------------------
/app/config/session.php:
--------------------------------------------------------------------------------
1 | 'redis',
20 |
21 | /*
22 | |--------------------------------------------------------------------------
23 | | Session Lifetime
24 | |--------------------------------------------------------------------------
25 | |
26 | | Here you may specify the number of minutes that you wish the session
27 | | to be allowed to remain idle before it expires. If you want them
28 | | to immediately expire when the browser closes, set it to zero.
29 | |
30 | */
31 |
32 | 'lifetime' => 180,
33 |
34 | /*
35 | |--------------------------------------------------------------------------
36 | | Session File Location
37 | |--------------------------------------------------------------------------
38 | |
39 | | When using the native session driver, we need a location where session
40 | | files may be stored. A default has been set for you but a different
41 | | location may be specified. This is only needed for file sessions.
42 | |
43 | */
44 |
45 | 'files' => storage_path().'/sessions',
46 |
47 | /*
48 | |--------------------------------------------------------------------------
49 | | Session Database Connection
50 | |--------------------------------------------------------------------------
51 | |
52 | | When using the "database" session driver, you may specify the database
53 | | connection that should be used to manage your sessions. This should
54 | | correspond to a connection in your "database" configuration file.
55 | |
56 | */
57 |
58 | 'connection' => null,
59 |
60 | /*
61 | |--------------------------------------------------------------------------
62 | | Session Database Table
63 | |--------------------------------------------------------------------------
64 | |
65 | | When using the "database" session driver, you may specify the table we
66 | | should use to manage the sessions. Of course, a sensible default is
67 | | provided for you; however, you are free to change this as needed.
68 | |
69 | */
70 |
71 | 'table' => 'sessions',
72 |
73 | /*
74 | |--------------------------------------------------------------------------
75 | | Session Sweeping Lottery
76 | |--------------------------------------------------------------------------
77 | |
78 | | Some session drivers must manually sweep their storage location to get
79 | | rid of old sessions from storage. Here are the chances that it will
80 | | happen on a given request. By default, the odds are 2 out of 100.
81 | |
82 | */
83 |
84 | 'lottery' => array(2, 100),
85 |
86 | /*
87 | |--------------------------------------------------------------------------
88 | | Session Cookie Name
89 | |--------------------------------------------------------------------------
90 | |
91 | | Here you may change the name of the cookie used to identify a session
92 | | instance by ID. The name specified here will get used every time a
93 | | new session cookie is created by the framework for every driver.
94 | |
95 | */
96 |
97 | 'cookie' => 'shop_session',
98 |
99 | /*
100 | |--------------------------------------------------------------------------
101 | | Session Cookie Path
102 | |--------------------------------------------------------------------------
103 | |
104 | | The session cookie path determines the path for which the cookie will
105 | | be regarded as available. Typically, this will be the root path of
106 | | your application but you are free to change this when necessary.
107 | |
108 | */
109 |
110 | 'path' => '/',
111 |
112 | /*
113 | |--------------------------------------------------------------------------
114 | | Session Cookie Domain
115 | |--------------------------------------------------------------------------
116 | |
117 | | Here you may change the domain of the cookie used to identify a session
118 | | in your application. This will determine which domains the cookie is
119 | | available to in your application. A sensible default has been set.
120 | |
121 | */
122 |
123 | 'domain' => null,
124 |
125 | 'expire_on_close' => false,
126 |
127 | );
--------------------------------------------------------------------------------
/app/config/testing/cache.php:
--------------------------------------------------------------------------------
1 | 'array',
19 |
20 | );
--------------------------------------------------------------------------------
/app/config/testing/session.php:
--------------------------------------------------------------------------------
1 | 'array',
20 |
21 | );
--------------------------------------------------------------------------------
/app/config/view.php:
--------------------------------------------------------------------------------
1 | array(__DIR__.'/../views'),
17 |
18 | /*
19 | |--------------------------------------------------------------------------
20 | | Pagination View
21 | |--------------------------------------------------------------------------
22 | |
23 | | This view will be used to render the pagination link output, and can
24 | | be easily customized here to show any view you like. A clean view
25 | | compatible with Twitter's Bootstrap is given to you by default.
26 | |
27 | */
28 |
29 | // Bootstrap 3 paginator
30 | 'pagination' => 'pagination::slider-3',
31 |
32 | );
33 |
--------------------------------------------------------------------------------
/app/config/workbench.php:
--------------------------------------------------------------------------------
1 | '',
17 |
18 | /*
19 | |--------------------------------------------------------------------------
20 | | Workbench Author E-Mail Address
21 | |--------------------------------------------------------------------------
22 | |
23 | | Like the option above, your e-mail address is used when generating new
24 | | workbench packages. The e-mail is placed in your composer.json file
25 | | automatically after the package is created by the workbench tool.
26 | |
27 | */
28 |
29 | 'email' => '',
30 |
31 | );
--------------------------------------------------------------------------------
/app/controllers/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msurguy/laravel-backbone-pagination/453686c0d0da1f2629a5790e15df66d81dfbea0c/app/controllers/.gitkeep
--------------------------------------------------------------------------------
/app/controllers/Admin/SeoController.php:
--------------------------------------------------------------------------------
1 | type = Input::get('type','products');
11 | }
12 |
13 | public function index()
14 | {
15 | switch ($this->type) {
16 | case 'categories':
17 | $list = Category::with('seo')->get(array('id','name'));
18 | break;
19 | default:
20 | $list = Product::with('seo')->get(array('id','name'));
21 | break;
22 | }
23 |
24 | $this->layout->content = View::make('admin.seo.list', array('type' => $this->type, 'list' => $list));
25 | }
26 |
27 | public function create()
28 | {
29 | $itemID = Input::get('id');
30 | $item = $this->getItem($this->type, $itemID);
31 | $this->layout->content = View::make('admin.seo.edit', array('type' => $this->type, 'item'=>$item));
32 | }
33 |
34 | public function store()
35 | {
36 | $itemID = Input::get('id');
37 |
38 | $item = $this->getItem($this->type, $itemID);
39 |
40 | $seo = new Seo;
41 | $seo->updateFromInput();
42 | $item->seo()->save($seo);
43 |
44 | return Redirect::to('admin/seo/'.$seo->id.'/edit?type='.$this->type.'&id='.$itemID)->with('seo_created', true);
45 | }
46 |
47 | public function edit($id)
48 | {
49 | $itemID = Input::get('id');
50 | $item = $this->getItem($this->type, $itemID);
51 | $seo = Seo::find($id);
52 |
53 | $this->layout->content = View::make('admin.seo.edit', array('type' => $this->type, 'seo' => $seo,'item'=>$item));
54 | }
55 |
56 | public function update($id)
57 | {
58 | $seo = Seo::find($id);
59 |
60 | $itemID = Input::get('id');
61 |
62 | $seo->updateFromInput();
63 |
64 | return Redirect::to('admin/seo/'.$id.'/edit?type='.$this->type.'&id='.$itemID)->with('seo_updated', true);;
65 | }
66 |
67 | public function getItem($type, $itemID)
68 | {
69 | switch ($type) {
70 | case 'categories':
71 | $item = Category::whereId($itemID)->get(array('id','name'))->first();
72 | break;
73 | default:
74 | $item = Product::whereId($itemID)->get(array('id','name'))->first();
75 | break;
76 | }
77 |
78 | return $item;
79 | }
80 |
81 | }
--------------------------------------------------------------------------------
/app/controllers/Api/ProductsController.php:
--------------------------------------------------------------------------------
1 | count();
36 |
37 | // Retrieve the products using Laravel's Eloquent ORM methods
38 | $products = $sortedProducts->take($perPage)->offset($offset)->get(array('slug','rating_cache','name','short_description','icon','banner','pricing'));
39 |
40 | // Return the results as JSON data
41 | return Response::json(array(
42 | 'data'=>$products->toArray(),
43 | 'total' => $count
44 | ));
45 | }
46 | }
--------------------------------------------------------------------------------
/app/controllers/Api/SearchController.php:
--------------------------------------------------------------------------------
1 | & $item) {
14 | $item[$element] = $type;
15 | }
16 | return $data;
17 | }
18 |
19 | public function appendURL($data, $prefix)
20 | {
21 | // operate on the item passed by reference, adding the url based on slug
22 | foreach ($data as $key => & $item) {
23 | $item['url'] = url($prefix.'/'.$item['slug']);
24 | }
25 | return $data;
26 | }
27 |
28 | public function index()
29 | {
30 | $query = e(Input::get('q',''));
31 |
32 | if(!$query && $query == '') return Response::json(array(), 400);
33 |
34 | $products = Product::where('published', true)
35 | ->where('name','like','%'.$query.'%')
36 | ->orderBy('name','asc')
37 | ->take(5)
38 | ->get(array('slug','name','icon'))->toArray();
39 |
40 | $categories = Category::where('name','like','%'.$query.'%')
41 | ->has('products')
42 | ->take(5)
43 | ->get(array('slug', 'name'))
44 | ->toArray();
45 |
46 | // Data normalization
47 | $categories = $this->appendValue($categories, url('img/icons/category-icon.png'),'icon');
48 |
49 | $products = $this->appendURL($products, 'products');
50 | $categories = $this->appendURL($categories, 'categories');
51 |
52 | // Add type of data to each item of each set of results
53 | $products = $this->appendValue($products, 'product', 'class');
54 | $categories = $this->appendValue($categories, 'category', 'class');
55 |
56 | // Merge all data into one array
57 | $data = array_merge($products, $categories);
58 |
59 | return Response::json(array(
60 | 'data'=>$data
61 | ));
62 | }
63 | }
--------------------------------------------------------------------------------
/app/controllers/BaseController.php:
--------------------------------------------------------------------------------
1 | layout))
13 | {
14 | $this->layout = View::make($this->layout);
15 | }
16 | }
17 |
18 | }
--------------------------------------------------------------------------------
/app/controllers/HomeController.php:
--------------------------------------------------------------------------------
1 | call('UserTableSeeder');
15 | }
16 |
17 | }
--------------------------------------------------------------------------------
/app/filters.php:
--------------------------------------------------------------------------------
1 | '« Previous',
17 |
18 | 'next' => 'Next »',
19 |
20 | );
--------------------------------------------------------------------------------
/app/lang/en/reminders.php:
--------------------------------------------------------------------------------
1 | "Passwords must be six characters and match the confirmation.",
17 |
18 | "user" => "We can't find a user with that e-mail address.",
19 |
20 | "token" => "This password reset token is invalid.",
21 |
22 | );
--------------------------------------------------------------------------------
/app/lang/en/validation.php:
--------------------------------------------------------------------------------
1 | "The :attribute must be accepted.",
17 | "active_url" => "The :attribute is not a valid URL.",
18 | "after" => "The :attribute must be a date after :date.",
19 | "alpha" => "The :attribute may only contain letters.",
20 | "alpha_dash" => "The :attribute may only contain letters, numbers, and dashes.",
21 | "alpha_num" => "The :attribute may only contain letters and numbers.",
22 | "array" => "The :attribute must be an array.",
23 | "before" => "The :attribute must be a date before :date.",
24 | "between" => array(
25 | "numeric" => "The :attribute must be between :min - :max.",
26 | "file" => "The :attribute must be between :min - :max kilobytes.",
27 | "string" => "The :attribute must be between :min - :max characters.",
28 | "array" => "The :attribute must have between :min - :max items.",
29 | ),
30 | "confirmed" => "The :attribute confirmation does not match.",
31 | "date" => "The :attribute is not a valid date.",
32 | "date_format" => "The :attribute does not match the format :format.",
33 | "different" => "The :attribute and :other must be different.",
34 | "digits" => "The :attribute must be :digits digits.",
35 | "digits_between" => "The :attribute must be between :min and :max digits.",
36 | "email" => "The :attribute format is invalid.",
37 | "exists" => "The selected :attribute is invalid.",
38 | "image" => "The :attribute must be an image.",
39 | "in" => "The selected :attribute is invalid.",
40 | "integer" => "The :attribute must be an integer.",
41 | "ip" => "The :attribute must be a valid IP address.",
42 | "max" => array(
43 | "numeric" => "The :attribute may not be greater than :max.",
44 | "file" => "The :attribute may not be greater than :max kilobytes.",
45 | "string" => "The :attribute may not be greater than :max characters.",
46 | "array" => "The :attribute may not have more than :max items.",
47 | ),
48 | "mimes" => "The :attribute must be a file of type: :values.",
49 | "min" => array(
50 | "numeric" => "The :attribute must be at least :min.",
51 | "file" => "The :attribute must be at least :min kilobytes.",
52 | "string" => "The :attribute must be at least :min characters.",
53 | "array" => "The :attribute must have at least :min items.",
54 | ),
55 | "not_in" => "The selected :attribute is invalid.",
56 | "numeric" => "The :attribute must be a number.",
57 | "regex" => "The :attribute format is invalid.",
58 | "required" => "The :attribute field is required.",
59 | "required_if" => "The :attribute field is required when :other is :value.",
60 | "required_with" => "The :attribute field is required when :values is present.",
61 | "required_without" => "The :attribute field is required when :values is not present.",
62 | "same" => "The :attribute and :other must match.",
63 | "size" => array(
64 | "numeric" => "The :attribute must be :size.",
65 | "file" => "The :attribute must be :size kilobytes.",
66 | "string" => "The :attribute must be :size characters.",
67 | "array" => "The :attribute must contain :size items.",
68 | ),
69 | "unique" => "The :attribute has already been taken.",
70 | "url" => "The :attribute format is invalid.",
71 |
72 | /*
73 | |--------------------------------------------------------------------------
74 | | Custom Validation Language Lines
75 | |--------------------------------------------------------------------------
76 | |
77 | | Here you may specify custom validation messages for attributes using the
78 | | convention "attribute.rule" to name the lines. This makes it quick to
79 | | specify a specific custom language line for a given attribute rule.
80 | |
81 | */
82 |
83 | 'custom' => array(),
84 |
85 | /*
86 | |--------------------------------------------------------------------------
87 | | Custom Validation Attributes
88 | |--------------------------------------------------------------------------
89 | |
90 | | The following language lines are used to swap attribute place-holders
91 | | with something more reader friendly such as E-Mail Address instead
92 | | of "email". This simply helps us make messages a little cleaner.
93 | |
94 | */
95 |
96 | 'attributes' => array(),
97 |
98 | );
99 |
--------------------------------------------------------------------------------
/app/models/Category.php:
--------------------------------------------------------------------------------
1 | belongsToMany('Product');
8 | }
9 |
10 | public function seo()
11 | {
12 | return $this->morphMany('Seo', 'seoble');
13 | }
14 | }
--------------------------------------------------------------------------------
/app/models/Product.php:
--------------------------------------------------------------------------------
1 | hasMany('Review');
9 | }
10 |
11 | public function categories()
12 | {
13 | return $this->belongsToMany('Category');
14 | }
15 |
16 | public function seo()
17 | {
18 | return $this->morphMany('Seo', 'seoble');
19 | }
20 |
21 | // Getters
22 | public function getIconAttribute()
23 | {
24 | return $this->attributes['icon'] ? url($this->attributes['icon']) : 'http://placehold.it/20x20';
25 | }
26 |
27 | public function getBannerAttribute()
28 | {
29 | return $this->attributes['banner'] ? url($this->attributes['banner']) : 'http://placehold.it/300x240';
30 | }
31 |
32 | // Scopes
33 |
34 | public function scopePublished($query)
35 | {
36 | return $query->where('published', true);
37 | }
38 |
39 | public function scopePopular($query)
40 | {
41 | return $query->published()->orderBy('rating_cache','desc');
42 | }
43 |
44 | public function scopeNewest($query)
45 | {
46 | return $query->published()->orderBy('created_at','desc');
47 | }
48 |
49 | public function scopeByname($query)
50 | {
51 | return $query->published()->orderBy('name','asc');
52 | }
53 |
54 | // The way average rating is calculated (and stored) is by getting an average of all ratings,
55 | // storing the calculated value in the rating_cache column (so that we don't have to do calculations later)
56 | // and incrementing the rating_count column by 1
57 |
58 | public function recalculateRating($rating)
59 | {
60 | $reviews = $this->reviews()->notSpam()->approved();
61 | $avgRating = $reviews->avg('rating');
62 | $this->rating_cache = round($avgRating,1);
63 | $this->rating_count = $reviews->count();
64 | $this->save();
65 | }
66 | }
--------------------------------------------------------------------------------
/app/models/Review.php:
--------------------------------------------------------------------------------
1 | 'required|min:10',
11 | 'rating'=>'required|integer|between:1,5'
12 | );
13 | }
14 |
15 | // Relationships
16 | public function user()
17 | {
18 | return $this->belongsTo('User');
19 | }
20 |
21 | public function product()
22 | {
23 | return $this->belongsTo('Product');
24 | }
25 |
26 | // Scopes
27 | public function scopeApproved($query)
28 | {
29 | return $query->where('approved', true);
30 | }
31 |
32 | public function scopeSpam($query)
33 | {
34 | return $query->where('spam', true);
35 | }
36 |
37 | public function scopeNotSpam($query)
38 | {
39 | return $query->where('spam', false);
40 | }
41 |
42 | // Attribute presenters
43 | public function getTimeagoAttribute()
44 | {
45 | $date = \Carbon\Carbon::createFromTimeStamp(strtotime($this->created_at))->diffForHumans();
46 | return $date;
47 | }
48 |
49 | // this function takes in product ID, comment and the rating and attaches the review to the product by its ID, then the average rating for the product is recalculated
50 | public function storeReviewForProduct($slug, $comment, $rating)
51 | {
52 | $product = Product::whereSlug($slug)->firstOrFail();
53 |
54 | //$this->user_id = Auth::user()->id;
55 | $this->comment = $comment;
56 | $this->rating = $rating;
57 | $product->reviews()->save($this);
58 |
59 | // recalculate ratings for the specified product
60 | $product->recalculateRating($rating);
61 | }
62 | }
--------------------------------------------------------------------------------
/app/models/Seo.php:
--------------------------------------------------------------------------------
1 | morphTo();
10 | }
11 |
12 | public function updateFromInput()
13 | {
14 | $this->title = e(Input::get('title'));
15 | $this->description = e(Input::get('description'));
16 | $this->keywords = e(Input::get('keywords'));
17 | $this->save();
18 | return true;
19 | }
20 |
21 | }
--------------------------------------------------------------------------------
/app/models/User.php:
--------------------------------------------------------------------------------
1 | getKey();
30 | }
31 |
32 | /**
33 | * Get the password for the user.
34 | *
35 | * @return string
36 | */
37 | public function getAuthPassword()
38 | {
39 | return $this->password;
40 | }
41 |
42 | /**
43 | * Get the e-mail address where password reminders are sent.
44 | *
45 | * @return string
46 | */
47 | public function getReminderEmail()
48 | {
49 | return $this->email;
50 | }
51 |
52 | public function getRememberToken()
53 | {
54 | return $this->remember_token;
55 | }
56 |
57 | public function setRememberToken($value)
58 | {
59 | $this->remember_token = $value;
60 | }
61 |
62 | public function getRememberTokenName()
63 | {
64 | return 'remember_token';
65 | }
66 |
67 | }
--------------------------------------------------------------------------------
/app/routes.php:
--------------------------------------------------------------------------------
1 | $products,
16 | 'categories' => $categories
17 | ));
18 | });
19 |
20 | // Route that shows an individual product by its slug
21 | Route::get('products/{slug}', function($slug)
22 | {
23 | $product = Product::whereSlug($slug)->firstOrFail();
24 | $categories = Category::all();
25 | $seo = $product->seo()->first();
26 |
27 | // Get all reviews that are not spam for the product and paginate them
28 | $reviews = $product->reviews()->with('user')->approved()->notSpam()->orderBy('created_at','desc')->paginate(100);
29 |
30 | return View::make('products.single', array(
31 | 'product' => $product,
32 | 'reviews' => $reviews,
33 | 'categories'=> $categories,
34 | 'seo' => $seo
35 | ));
36 | });
37 |
38 | // Route that handles submission of review - rating/comment
39 | Route::post('products/{slug}', array('before'=>'csrf', function($slug)
40 | {
41 | $input = array(
42 | 'comment' => Input::get('comment'),
43 | 'rating' => Input::get('rating')
44 | );
45 | // instantiate Rating model
46 | $review = new Review;
47 |
48 | // Validate that the user's input corresponds to the rules specified in the review model
49 | $validator = Validator::make( $input, $review->getCreateRules());
50 |
51 | // If input passes validation - store the review in DB, otherwise return to product page with error message
52 | if ($validator->passes()) {
53 | $review->storeReviewForProduct($slug, $input['comment'], $input['rating']);
54 | return Redirect::to('products/'.$slug.'#reviews-anchor')->with('review_posted',true);
55 | }
56 |
57 | return Redirect::to('products/'.$slug.'#reviews-anchor')->withErrors($validator)->withInput();
58 | }));
59 |
60 | // Route that shows an individual category by its slug
61 | Route::get('categories/{slug}', function($slug)
62 | {
63 | $category = Category::whereSlug($slug)->firstOrFail();
64 | $categories = Category::all();
65 | $seo = $category->seo()->first();
66 |
67 | return View::make('categories.single', array(
68 | 'category' => $category,
69 | 'categories'=> $categories,
70 | 'seo' => $seo
71 | ));
72 | });
73 |
74 | Route::get('api/search', 'ApiSearchController@index');
75 |
--------------------------------------------------------------------------------
/app/start/artisan.php:
--------------------------------------------------------------------------------
1 | client->request('GET', '/');
13 |
14 | $this->assertTrue($this->client->getResponse()->isOk());
15 | }
16 |
17 | }
--------------------------------------------------------------------------------
/app/tests/TestCase.php:
--------------------------------------------------------------------------------
1 |
3 |
22 | @stop
23 |
24 | @section('content')
25 |
26 |
27 | @if(Session::has('seo_created'))
28 |
29 |
The SEO data has been created!
30 |
31 | @endif
32 |
33 | @if(Session::has('seo_updated'))
34 |
35 |
The SEO data has been updated!
36 |
37 | @endif
38 |
39 |
40 |
41 |
42 |
43 | {{ Form::open(array('url'=>'admin/seo','method'=>'get','id'=>'selectForm','class'=>'form-vertical'))}}
44 | {{ Form::select('type', Config::get('config.seo_mapping'), $type, array('id'=> 'typeSelect' ,'class'=> 'form-control'))}}
45 | {{ Form::close()}}
46 |
47 |
50 |
51 |
52 |
53 |
54 | @if(isset($seo))
55 | {{ Form::model($seo, array('url' => 'admin/seo/'.$seo->id, 'method' => 'put')) }}
56 | @else
57 | {{ Form::open(array('url' => 'admin/seo')) }}
58 | @endif
59 |
60 |
61 |
62 |
63 | {{Form::label('title')}}
64 | {{ Form::text('title', null ,array('class'=>'form-control', 'placeholder'=>'SEO Title'))}}
65 |
66 |
67 |
68 | {{ Form::label('keywords')}}
69 | {{ Form::text('keywords', null ,array('class'=>'form-control', 'placeholder'=>'SEO Keywords'))}}
70 |
71 |
72 |
73 | {{ Form::label('description')}}
74 | {{ Form::textarea('description', null ,array('class'=>'form-control', 'placeholder'=>'SEO Description','rows' => 4))}}
75 |
76 |
77 | {{ Form::hidden('type', $type)}}
78 | {{ Form::hidden('id', $item->id)}}
79 |
80 |
81 | {{ Form::submit('Submit', array('class'=>'btn btn-default'))}}
82 |
83 |
84 | {{ Form::close()}}
85 |
86 |
87 | @stop
88 |
--------------------------------------------------------------------------------
/app/views/admin/seo/list.blade.php:
--------------------------------------------------------------------------------
1 | @section('scripts')
2 |
9 | @stop
10 |
11 | @section('content')
12 |
13 | {{ Form::open(array('url'=>'admin/seo','method'=>'get','id'=>'selectForm','class'=>'form-horizontal'))}}
14 |
15 |
16 | SEO
17 |
18 |
19 |
20 |
21 |
22 |
23 | {{ Form::select('type', Config::get('config.seo_mapping'), $type, array('id'=> 'typeSelect' ,'class'=> 'form-control'))}}
24 |
25 |
26 | {{ Form::close()}}
27 |
28 |
29 |
30 |
31 |
32 |
33 | Name |
34 | SEO Title |
35 | SEO Description |
36 | SEO Keywords |
37 | Action |
38 |
39 |
40 |
41 | @foreach ($list as $item)
42 |
43 |
44 | {{ $item->name }} |
45 | @if($seo = $item->seo->first())
46 | {{$seo->title}} |
47 | {{$seo->description}} |
48 | {{$seo->keywords}} |
49 | Edit |
50 | @else
51 | |
52 | |
53 | |
54 |
55 | Add
56 | |
57 | @endif
58 |
59 | @endforeach
60 |
61 |
62 |
63 |
64 | @stop
65 |
--------------------------------------------------------------------------------
/app/views/categories/single.blade.php:
--------------------------------------------------------------------------------
1 | @extends('layout')
2 |
3 | @section('title')
4 | {{{ $seo->title or 'Viewing Category '.$category->name }}}
5 | @endsection
6 |
7 | @section('description')
8 | {{{ $seo->description or 'My great category'}}}
9 | @endsection
10 |
11 | @section('keywords')
12 | {{{ $seo->keywords or 'default, keywords, for, my, category' }}}
13 | @endsection
14 |
15 | @section('content')
16 |
17 |
18 | @include('partials.sidebar.categories', array('categories' => $categories,'current' => $category->id))
19 |
20 |
21 | @foreach($category->products as $product)
22 |
23 |
24 |

25 |
26 |
${{ number_format($product->pricing, 2);}}
27 |
28 |
{{$product->short_description}}
29 |
30 |
31 |
{{$product->rating_count}} {{ Str::plural('review', $product->rating_count);}}
32 |
33 | @for ($i=1; $i <= 5 ; $i++)
34 |
35 | @endfor
36 |
37 |
38 |
39 |
40 | @endforeach
41 |
42 |
43 | @stop
--------------------------------------------------------------------------------
/app/views/emails/auth/reminder.blade.php:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Password Reset
8 |
9 |
10 | To reset your password, complete this form: {{ URL::to('password/reset', array($token)) }}.
11 |
12 |
13 |
--------------------------------------------------------------------------------
/app/views/index.blade.php:
--------------------------------------------------------------------------------
1 | @extends('layout')
2 |
3 | @section('content')
4 |
5 |
6 | @include('partials.sidebar.categories', array('categories' => $categories,'current' => 0))
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |

20 |
21 |
22 |

23 |
24 |
25 |

26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
45 |
46 |
47 |
48 |
49 |
50 |
51 | @stop
52 |
53 |
54 | @section('scripts')
55 |
56 |
57 |
58 |
59 |
60 |
77 |
78 |
98 |
99 |
109 |
110 |
275 | @stop
276 |
--------------------------------------------------------------------------------
/app/views/layout.blade.php:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | @yield('title','My shop')
10 |
11 |
12 |
13 |
14 |
15 |
16 | @yield('styles')
17 |
18 |
19 |
52 |
53 |
54 | @yield('content')
55 |
56 |
63 |
64 |
65 |
66 |
69 |
70 |
71 |
72 |
73 | @yield('scripts')
74 |
75 |
76 |
77 |
78 |
--------------------------------------------------------------------------------
/app/views/partials/sidebar/categories.blade.php:
--------------------------------------------------------------------------------
1 | Shop Categories
2 |
3 |
--------------------------------------------------------------------------------
/app/views/products/single.blade.php:
--------------------------------------------------------------------------------
1 | @extends('layout')
2 |
3 | @section('title')
4 | {{{ $seo->title or 'Viewing Product '.$product->name }}}
5 | @endsection
6 |
7 | @section('description')
8 | {{{ $seo->description or 'My great product'}}}
9 | @endsection
10 |
11 | @section('keywords')
12 | {{{ $seo->keywords or 'default, keywords, for, my, product' }}}
13 | @endsection
14 |
15 | @section('scripts')
16 | {{HTML::script('js/expanding.js')}}
17 | {{HTML::script('js/starrr.js')}}
18 |
19 |
65 | @stop
66 |
67 | @section('styles')
68 |
83 | @stop
84 |
85 | @section('content')
86 |
87 |
88 | @include('partials.sidebar.categories', array('categories' => $categories,'current' => 0))
89 |
90 |
91 |
92 |

93 |
94 |
${{ number_format($product->pricing, 2);}}
95 |
96 |
{{$product->short_description}}
97 |
{{$product->long_description}}
98 |
99 |
100 | @foreach($product->categories as $category)
101 | {{{ $category->name }}}
102 | @endforeach
103 |
104 |
105 |
106 |
{{$product->rating_count}} {{ Str::plural('review', $product->rating_count);}}
107 |
108 | @for ($i=1; $i <= 5 ; $i++)
109 |
110 | @endfor
111 | {{ number_format($product->rating_cache, 1);}} stars
112 |
113 |
114 |
115 |
116 |
117 |
118 | @if(Session::get('errors'))
119 |
120 |
121 |
There were errors while submitting this review:
122 | @foreach($errors->all(':message') as $message)
123 | {{$message}}
124 | @endforeach
125 |
126 | @endif
127 | @if(Session::has('review_posted'))
128 |
129 |
130 |
Your review has been posted!
131 |
132 | @endif
133 | @if(Session::has('review_removed'))
134 |
135 |
136 |
Your review has been removed!
137 |
138 | @endif
139 |
140 |
141 |
144 |
145 |
146 | {{Form::open()}}
147 | {{Form::hidden('rating', null, array('id'=>'ratings-hidden'))}}
148 | {{Form::textarea('comment', null, array('rows'=>'5','id'=>'new-review','class'=>'form-control animated','placeholder'=>'Enter your review here...'))}}
149 |
150 |
151 |
Cancel
152 |
153 |
154 | {{Form::close()}}
155 |
156 |
157 |
158 | @foreach($reviews as $review)
159 |
160 |
161 |
162 | @for ($i=1; $i <= 5 ; $i++)
163 |
164 | @endfor
165 |
166 | {{ $review->user ? $review->user->name : 'Anonymous'}}
{{$review->timeago}}
167 |
168 |
{{{$review->comment}}}
169 |
170 |
171 | @endforeach
172 | {{ $reviews->links(); }}
173 |
174 |
175 |
176 |
177 | @stop
--------------------------------------------------------------------------------
/artisan:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env php
2 | setRequestForConsoleEnvironment();
45 |
46 | $artisan = Illuminate\Console\Application::start($app);
47 |
48 | /*
49 | |--------------------------------------------------------------------------
50 | | Run The Artisan Application
51 | |--------------------------------------------------------------------------
52 | |
53 | | When we run the console application, the current CLI command will be
54 | | executed in this console and the response sent back to a terminal
55 | | or another output device for the developers. Here goes nothing!
56 | |
57 | */
58 |
59 | $status = $artisan->run();
60 |
61 | /*
62 | |--------------------------------------------------------------------------
63 | | Shutdown The Application
64 | |--------------------------------------------------------------------------
65 | |
66 | | Once Artisan has finished running. We will fire off the shutdown events
67 | | so that any final work may be done by the application before we shut
68 | | down the process. This is the last thing to happen to the request.
69 | |
70 | */
71 |
72 | $app->shutdown();
73 |
74 | exit($status);
--------------------------------------------------------------------------------
/bootstrap/autoload.php:
--------------------------------------------------------------------------------
1 | __DIR__.'/../app',
17 |
18 | /*
19 | |--------------------------------------------------------------------------
20 | | Public Path
21 | |--------------------------------------------------------------------------
22 | |
23 | | The public path contains the assets for your web application, such as
24 | | your JavaScript and CSS files, and also contains the primary entry
25 | | point for web requests into these applications from the outside.
26 | |
27 | */
28 |
29 | 'public' => __DIR__.'/../public',
30 |
31 | /*
32 | |--------------------------------------------------------------------------
33 | | Base Path
34 | |--------------------------------------------------------------------------
35 | |
36 | | The base path is the root of the Laravel installation. Most likely you
37 | | will not need to change this value. But, if for some wild reason it
38 | | is necessary you will do so here, just proceed with some caution.
39 | |
40 | */
41 |
42 | 'base' => __DIR__.'/..',
43 |
44 | /*
45 | |--------------------------------------------------------------------------
46 | | Storage Path
47 | |--------------------------------------------------------------------------
48 | |
49 | | The storage path is used by Laravel to store cached Blade views, logs
50 | | and other pieces of information. You may modify the path here when
51 | | you want to change the location of this directory for your apps.
52 | |
53 | */
54 |
55 | 'storage' => __DIR__.'/../app/storage',
56 |
57 | );
58 |
--------------------------------------------------------------------------------
/bootstrap/start.php:
--------------------------------------------------------------------------------
1 | detectEnvironment(array(
28 |
29 | 'local' => array('localhost','Maxoffsky-PC'),
30 |
31 | ));
32 |
33 | /*
34 | |--------------------------------------------------------------------------
35 | | Bind Paths
36 | |--------------------------------------------------------------------------
37 | |
38 | | Here we are binding the paths configured in paths.php to the app. You
39 | | should not be changing these here. If you need to change these you
40 | | may do so within the paths.php file and they will be bound here.
41 | |
42 | */
43 |
44 | $app->bindInstallPaths(require __DIR__.'/paths.php');
45 |
46 | /*
47 | |--------------------------------------------------------------------------
48 | | Load The Application
49 | |--------------------------------------------------------------------------
50 | |
51 | | Here we will load the Illuminate application. We'll keep this is in a
52 | | separate location so we can isolate the creation of an application
53 | | from the actual running of the application with a given request.
54 | |
55 | */
56 |
57 | $framework = $app['path.base'].'/vendor/laravel/framework/src';
58 |
59 | require $framework.'/Illuminate/Foundation/start.php';
60 |
61 | /*
62 | |--------------------------------------------------------------------------
63 | | Return The Application
64 | |--------------------------------------------------------------------------
65 | |
66 | | This script returns the application instance. The instance is given to
67 | | the calling script so we can separate the building of the instances
68 | | from the actual running of the application and sending responses.
69 | |
70 | */
71 |
72 | return $app;
73 |
--------------------------------------------------------------------------------
/composer.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "laravel/laravel",
3 | "description": "The Laravel Framework.",
4 | "keywords": ["framework", "laravel"],
5 | "license": "MIT",
6 | "require": {
7 | "laravel/framework": "4.1.*"
8 | },
9 | "autoload": {
10 | "classmap": [
11 | "app/commands",
12 | "app/controllers",
13 | "app/models",
14 | "app/database/migrations",
15 | "app/database/seeds",
16 | "app/tests/TestCase.php"
17 | ]
18 | },
19 | "scripts": {
20 | "post-install-cmd": [
21 | "php artisan optimize"
22 | ],
23 | "post-update-cmd": [
24 | "php artisan clear-compiled",
25 | "php artisan optimize"
26 | ],
27 | "post-create-project-cmd": [
28 | "php artisan key:generate"
29 | ]
30 | },
31 | "config": {
32 | "preferred-install": "dist"
33 | },
34 | "minimum-stability": "dev"
35 | }
36 |
--------------------------------------------------------------------------------
/pagination.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msurguy/laravel-backbone-pagination/453686c0d0da1f2629a5790e15df66d81dfbea0c/pagination.gif
--------------------------------------------------------------------------------
/phpunit.xml:
--------------------------------------------------------------------------------
1 |
2 |
13 |
14 |
15 | ./app/tests/
16 |
17 |
18 |
--------------------------------------------------------------------------------
/public/.htaccess:
--------------------------------------------------------------------------------
1 |
2 |
3 | Options -MultiViews
4 |
5 |
6 | RewriteEngine On
7 |
8 | # Redirect Trailing Slashes...
9 | RewriteRule ^(.*)/$ /$1 [L,R=301]
10 |
11 | # Handle Front Controller...
12 | RewriteCond %{REQUEST_FILENAME} !-d
13 | RewriteCond %{REQUEST_FILENAME} !-f
14 | RewriteRule ^ index.php [L]
15 |
--------------------------------------------------------------------------------
/public/css/styles.css:
--------------------------------------------------------------------------------
1 | .thumbnail{ padding: 0;}
2 |
3 | .carousel-control, .item{
4 | border-radius: 4px;
5 | }
6 |
7 | .caption{
8 | height: 130px;
9 | overflow: hidden;
10 | }
11 |
12 | .caption h4
13 | {
14 | white-space: nowrap;
15 | }
16 |
17 | .thumbnail img{
18 | width: 100%;
19 | }
20 |
21 | .ratings
22 | {
23 | color: #d17581;
24 | padding-left: 10px;
25 | padding-right: 10px;
26 | }
27 |
28 | .thumbnail .caption-full {
29 | padding: 9px;
30 | color: #333;
31 | }
32 |
33 | footer{
34 | margin-top: 50px;
35 | margin-bottom: 30px;
36 | }
37 |
38 | /* Search in the navigation bar */
39 |
40 | .form-control.selectize-control{
41 | height: 34px;
42 | }
43 |
44 | .selectize-dropdown-content img{ width:20px; height:20px; margin-right: 3px; float:left; }
45 |
46 | .selectize-control::before {
47 | -moz-transition: opacity 0.2s;
48 | -webkit-transition: opacity 0.2s;
49 | transition: opacity 0.2s;
50 | content: ' ';
51 | z-index: 2;
52 | position: absolute;
53 | display: block;
54 | top: 10px;
55 | right: 34px;
56 | width: 16px;
57 | height: 16px;
58 | background: url(../img/spinner.gif);
59 | background-size: 16px 16px;
60 | opacity: 0;
61 | }
62 | .selectize-control.loading::before {
63 | opacity: 1;
64 | }
65 |
--------------------------------------------------------------------------------
/public/img/icons/banner/1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msurguy/laravel-backbone-pagination/453686c0d0da1f2629a5790e15df66d81dfbea0c/public/img/icons/banner/1.jpg
--------------------------------------------------------------------------------
/public/img/icons/banner/2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msurguy/laravel-backbone-pagination/453686c0d0da1f2629a5790e15df66d81dfbea0c/public/img/icons/banner/2.jpg
--------------------------------------------------------------------------------
/public/img/icons/banner/3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msurguy/laravel-backbone-pagination/453686c0d0da1f2629a5790e15df66d81dfbea0c/public/img/icons/banner/3.jpg
--------------------------------------------------------------------------------
/public/img/icons/banner/4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msurguy/laravel-backbone-pagination/453686c0d0da1f2629a5790e15df66d81dfbea0c/public/img/icons/banner/4.jpg
--------------------------------------------------------------------------------
/public/img/icons/banner/5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msurguy/laravel-backbone-pagination/453686c0d0da1f2629a5790e15df66d81dfbea0c/public/img/icons/banner/5.jpg
--------------------------------------------------------------------------------
/public/img/icons/category-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msurguy/laravel-backbone-pagination/453686c0d0da1f2629a5790e15df66d81dfbea0c/public/img/icons/category-icon.png
--------------------------------------------------------------------------------
/public/img/icons/product-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msurguy/laravel-backbone-pagination/453686c0d0da1f2629a5790e15df66d81dfbea0c/public/img/icons/product-1.jpg
--------------------------------------------------------------------------------
/public/img/icons/product-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msurguy/laravel-backbone-pagination/453686c0d0da1f2629a5790e15df66d81dfbea0c/public/img/icons/product-2.jpg
--------------------------------------------------------------------------------
/public/img/icons/product-3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msurguy/laravel-backbone-pagination/453686c0d0da1f2629a5790e15df66d81dfbea0c/public/img/icons/product-3.jpg
--------------------------------------------------------------------------------
/public/img/icons/product-4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msurguy/laravel-backbone-pagination/453686c0d0da1f2629a5790e15df66d81dfbea0c/public/img/icons/product-4.jpg
--------------------------------------------------------------------------------
/public/img/icons/product-5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msurguy/laravel-backbone-pagination/453686c0d0da1f2629a5790e15df66d81dfbea0c/public/img/icons/product-5.jpg
--------------------------------------------------------------------------------
/public/img/spinner.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msurguy/laravel-backbone-pagination/453686c0d0da1f2629a5790e15df66d81dfbea0c/public/img/spinner.gif
--------------------------------------------------------------------------------
/public/index.php:
--------------------------------------------------------------------------------
1 |
7 | */
8 |
9 | /*
10 | |--------------------------------------------------------------------------
11 | | Register The Auto Loader
12 | |--------------------------------------------------------------------------
13 | |
14 | | Composer provides a convenient, automatically generated class loader
15 | | for our application. We just need to utilize it! We'll require it
16 | | into the script here so that we do not have to worry about the
17 | | loading of any our classes "manually". Feels great to relax.
18 | |
19 | */
20 |
21 | require __DIR__.'/../bootstrap/autoload.php';
22 |
23 | /*
24 | |--------------------------------------------------------------------------
25 | | Turn On The Lights
26 | |--------------------------------------------------------------------------
27 | |
28 | | We need to illuminate PHP development, so let's turn on the lights.
29 | | This bootstraps the framework and gets it ready for use, then it
30 | | will load up this application so that we can run it and send
31 | | the responses back to the browser and delight these users.
32 | |
33 | */
34 |
35 | $app = require_once __DIR__.'/../bootstrap/start.php';
36 |
37 | /*
38 | |--------------------------------------------------------------------------
39 | | Run The Application
40 | |--------------------------------------------------------------------------
41 | |
42 | | Once we have the application, we can simply call the run method,
43 | | which will execute the request and send the response back to
44 | | the client's browser allowing them to enjoy the creative
45 | | and wonderful application we have whipped up for them.
46 | |
47 | */
48 |
49 | $app->run();
--------------------------------------------------------------------------------
/public/js/expanding.js:
--------------------------------------------------------------------------------
1 | /*!
2 | Autosize v1.18.1 - 2013-11-05
3 | Automatically adjust textarea height based on user input.
4 | (c) 2013 Jack Moore - http://www.jacklmoore.com/autosize
5 | license: http://www.opensource.org/licenses/mit-license.php
6 | */
7 | (function(e){var t,o={className:"autosizejs",append:"",callback:!1,resizeDelay:10},i='',n=["fontFamily","fontSize","fontWeight","fontStyle","letterSpacing","textTransform","wordSpacing","textIndent"],s=e(i).data("autosize",!0)[0];s.style.lineHeight="99px","99px"===e(s).css("lineHeight")&&n.push("lineHeight"),s.style.lineHeight="",e.fn.autosize=function(i){return this.length?(i=e.extend({},o,i||{}),s.parentNode!==document.body&&e(document.body).append(s),this.each(function(){function o(){var t,o;"getComputedStyle"in window?(t=window.getComputedStyle(u,null),o=u.getBoundingClientRect().width,e.each(["paddingLeft","paddingRight","borderLeftWidth","borderRightWidth"],function(e,i){o-=parseInt(t[i],10)}),s.style.width=o+"px"):s.style.width=Math.max(p.width(),0)+"px"}function a(){var a={};if(t=u,s.className=i.className,d=parseInt(p.css("maxHeight"),10),e.each(n,function(e,t){a[t]=p.css(t)}),e(s).css(a),o(),window.chrome){var r=u.style.width;u.style.width="0px",u.offsetWidth,u.style.width=r}}function r(){var e,n;t!==u?a():o(),s.value=u.value+i.append,s.style.overflowY=u.style.overflowY,n=parseInt(u.style.height,10),s.scrollTop=0,s.scrollTop=9e4,e=s.scrollTop,d&&e>d?(u.style.overflowY="scroll",e=d):(u.style.overflowY="hidden",c>e&&(e=c)),e+=w,n!==e&&(u.style.height=e+"px",f&&i.callback.call(u,u))}function l(){clearTimeout(h),h=setTimeout(function(){var e=p.width();e!==g&&(g=e,r())},parseInt(i.resizeDelay,10))}var d,c,h,u=this,p=e(u),w=0,f=e.isFunction(i.callback),z={height:u.style.height,overflow:u.style.overflow,overflowY:u.style.overflowY,wordWrap:u.style.wordWrap,resize:u.style.resize},g=p.width();p.data("autosize")||(p.data("autosize",!0),("border-box"===p.css("box-sizing")||"border-box"===p.css("-moz-box-sizing")||"border-box"===p.css("-webkit-box-sizing"))&&(w=p.outerHeight()-p.height()),c=Math.max(parseInt(p.css("minHeight"),10)-w||0,p.height()),p.css({overflow:"hidden",overflowY:"hidden",wordWrap:"break-word",resize:"none"===p.css("resize")||"vertical"===p.css("resize")?"none":"horizontal"}),"onpropertychange"in u?"oninput"in u?p.on("input.autosize keyup.autosize",r):p.on("propertychange.autosize",function(){"value"===event.propertyName&&r()}):p.on("input.autosize",r),i.resizeDelay!==!1&&e(window).on("resize.autosize",l),p.on("autosize.resize",r),p.on("autosize.resizeIncludeStyle",function(){t=null,r()}),p.on("autosize.destroy",function(){t=null,clearTimeout(h),e(window).off("resize",l),p.off("autosize").off(".autosize").css(z).removeData("autosize")}),r())})):this}})(window.jQuery||window.$);
--------------------------------------------------------------------------------
/public/js/jquery.charcounter.js:
--------------------------------------------------------------------------------
1 | /**
2 | *
3 | * jquery.charcounter.js version 1.2
4 | * requires jQuery version 1.2 or higher
5 | * Copyright (c) 2007 Tom Deater (http://www.tomdeater.com)
6 | * Licensed under the MIT License:
7 | * http://www.opensource.org/licenses/mit-license.php
8 | *
9 | */
10 |
11 | (function($) {
12 | /**
13 | * attaches a character counter to each textarea element in the jQuery object
14 | * usage: $("#myTextArea").charCounter(max, settings);
15 | */
16 |
17 | $.fn.charCounter = function (max, settings) {
18 | max = max || 100;
19 | settings = $.extend({
20 | container: "",
21 | classname: "charcounter",
22 | format: "(%1 characters remaining)",
23 | pulse: true,
24 | delay: 0
25 | }, settings);
26 | var p, timeout;
27 |
28 | function count(el, container) {
29 | el = $(el);
30 | if (el.val().length > max) {
31 | el.val(el.val().substring(0, max));
32 | if (settings.pulse && !p) {
33 | pulse(container, true);
34 | };
35 | };
36 | if (settings.delay > 0) {
37 | if (timeout) {
38 | window.clearTimeout(timeout);
39 | }
40 | timeout = window.setTimeout(function () {
41 | container.html(settings.format.replace(/%1/, (max - el.val().length)));
42 | }, settings.delay);
43 | } else {
44 | container.html(settings.format.replace(/%1/, (max - el.val().length)));
45 | }
46 | };
47 |
48 | function pulse(el, again) {
49 | if (p) {
50 | window.clearTimeout(p);
51 | p = null;
52 | };
53 | el.animate({ opacity: 0.1 }, 100, function () {
54 | $(this).animate({ opacity: 1.0 }, 100);
55 | });
56 | if (again) {
57 | p = window.setTimeout(function () { pulse(el) }, 200);
58 | };
59 | };
60 |
61 | return this.each(function () {
62 | var container;
63 | if (!settings.container.match(/^<.+>$/)) {
64 | // use existing element to hold counter message
65 | container = $(settings.container);
66 | } else {
67 | // append element to hold counter message (clean up old element first)
68 | $(this).next("." + settings.classname).remove();
69 | container = $(settings.container)
70 | .insertAfter(this)
71 | .addClass(settings.classname);
72 | }
73 | $(this)
74 | .unbind(".charCounter")
75 | .bind("keydown.charCounter", function () { count(this, container); })
76 | .bind("keypress.charCounter", function () { count(this, container); })
77 | .bind("keyup.charCounter", function () { count(this, container); })
78 | .bind("focus.charCounter", function () { count(this, container); })
79 | .bind("mouseover.charCounter", function () { count(this, container); })
80 | .bind("mouseout.charCounter", function () { count(this, container); })
81 | .bind("paste.charCounter", function () {
82 | var me = this;
83 | setTimeout(function () { count(me, container); }, 10);
84 | });
85 | if (this.addEventListener) {
86 | this.addEventListener('input', function () { count(this, container); }, false);
87 | };
88 | count(this, container);
89 | });
90 | };
91 |
92 | })(jQuery);
--------------------------------------------------------------------------------
/public/js/main.js:
--------------------------------------------------------------------------------
1 | $(document).ready(function(){
2 | $('#searchbox').selectize({
3 | valueField: 'url',
4 | labelField: 'name',
5 | searchField: ['name'],
6 | maxOptions: 10,
7 | options: [],
8 | create: false,
9 | render: {
10 | option: function(item, escape) {
11 | return '
' +escape(item.name)+'
';
12 | }
13 | },
14 | optgroups: [
15 | {value: 'product', label: 'Products'},
16 | {value: 'category', label: 'Categories'}
17 | ],
18 | optgroupField: 'class',
19 | optgroupOrder: ['product','category'],
20 | load: function(query, callback) {
21 | if (!query.length) return callback();
22 | $.ajax({
23 | url: root+'/api/search',
24 | type: 'GET',
25 | dataType: 'json',
26 | data: {
27 | q: query
28 | },
29 | error: function() {
30 | callback();
31 | },
32 | success: function(res) {
33 | callback(res.data);
34 | }
35 | });
36 | },
37 | onChange: function(){
38 | window.location = this.items[0];
39 | }
40 | });
41 | });
--------------------------------------------------------------------------------
/public/js/starrr.js:
--------------------------------------------------------------------------------
1 | // Starrr plugin (https://github.com/dobtco/starrr)
2 | var __slice = [].slice;
3 |
4 | (function($, window) {
5 | var Starrr;
6 |
7 | Starrr = (function() {
8 | Starrr.prototype.defaults = {
9 | rating: void 0,
10 | numStars: 5,
11 | change: function(e, value) {}
12 | };
13 |
14 | function Starrr($el, options) {
15 | var i, _, _ref,
16 | _this = this;
17 |
18 | this.options = $.extend({}, this.defaults, options);
19 | this.$el = $el;
20 | _ref = this.defaults;
21 | for (i in _ref) {
22 | _ = _ref[i];
23 | if (this.$el.data(i) != null) {
24 | this.options[i] = this.$el.data(i);
25 | }
26 | }
27 | this.createStars();
28 | this.syncRating();
29 | this.$el.on('mouseover.starrr', 'span', function(e) {
30 | return _this.syncRating(_this.$el.find('span').index(e.currentTarget) + 1);
31 | });
32 | this.$el.on('mouseout.starrr', function() {
33 | return _this.syncRating();
34 | });
35 | this.$el.on('click.starrr', 'span', function(e) {
36 | return _this.setRating(_this.$el.find('span').index(e.currentTarget) + 1);
37 | });
38 | this.$el.on('starrr:change', this.options.change);
39 | }
40 |
41 | Starrr.prototype.createStars = function() {
42 | var _i, _ref, _results;
43 |
44 | _results = [];
45 | for (_i = 1, _ref = this.options.numStars; 1 <= _ref ? _i <= _ref : _i >= _ref; 1 <= _ref ? _i++ : _i--) {
46 | _results.push(this.$el.append(""));
47 | }
48 | return _results;
49 | };
50 |
51 | Starrr.prototype.setRating = function(rating) {
52 | if (this.options.rating === rating) {
53 | rating = void 0;
54 | }
55 | this.options.rating = rating;
56 | this.syncRating();
57 | return this.$el.trigger('starrr:change', rating);
58 | };
59 |
60 | Starrr.prototype.syncRating = function(rating) {
61 | var i, _i, _j, _ref;
62 |
63 | rating || (rating = this.options.rating);
64 | if (rating) {
65 | for (i = _i = 0, _ref = rating - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
66 | this.$el.find('span').eq(i).removeClass('glyphicon-star-empty').addClass('glyphicon-star');
67 | }
68 | }
69 | if (rating && rating < 5) {
70 | for (i = _j = rating; rating <= 4 ? _j <= 4 : _j >= 4; i = rating <= 4 ? ++_j : --_j) {
71 | this.$el.find('span').eq(i).removeClass('glyphicon-star').addClass('glyphicon-star-empty');
72 | }
73 | }
74 | if (!rating) {
75 | return this.$el.find('span').removeClass('glyphicon-star').addClass('glyphicon-star-empty');
76 | }
77 | };
78 |
79 | return Starrr;
80 |
81 | })();
82 | return $.fn.extend({
83 | starrr: function() {
84 | var args, option;
85 |
86 | option = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
87 | return this.each(function() {
88 | var data;
89 |
90 | data = $(this).data('star-rating');
91 | if (!data) {
92 | $(this).data('star-rating', (data = new Starrr($(this), option)));
93 | }
94 | if (typeof option === 'string') {
95 | return data[option].apply(data, args);
96 | }
97 | });
98 | }
99 | });
100 | })(window.jQuery, window);
101 |
102 | $(function() {
103 | return $(".starrr").starrr();
104 | });
105 |
--------------------------------------------------------------------------------
/public/js/vendor/backbone.paginator.min.js:
--------------------------------------------------------------------------------
1 | /*! backbone.paginator - v0.8.1 - 7/3/2013
2 | * http://github.com/addyosmani/backbone.paginator
3 | * Copyright (c) 2013 Addy Osmani; Licensed MIT */
4 | Backbone.Paginator=function(a,b,c){"use strict";var d=b.map(a.VERSION.split("."),function(a){return parseInt(a,10)}),e={};e.version="0.8.1",e.clientPager=a.Collection.extend({useDiacriticsPlugin:!0,useLevenshteinPlugin:!0,sortColumn:"",sortDirection:"desc",lastSortColumn:"",fieldFilterRules:[],lastFieldFilterRules:[],filterFields:"",filterExpression:"",lastFilterExpression:"",defaults_ui:{firstPage:0,currentPage:1,perPage:5,totalPages:10,pagesInRange:4},initialize:function(){this.on("add",this.addModel,this),this.on("remove",this.removeModel,this),this.setDefaults()},setDefaults:function(){var a=b.defaults(this.paginator_ui,this.defaults_ui);b.defaults(this,a)},addModel:function(a){this.origModels.push(a)},removeModel:function(a){var c=b.indexOf(this.origModels,a);this.origModels.splice(c,1)},sync:function(e,f,g){var h=this;this.setDefaults();var i={};b.each(b.result(h,"server_api"),function(a,c){b.isFunction(a)&&(a=b.bind(a,h),a=a()),i[c]=a});var j=b.clone(h.paginator_core);b.each(j,function(a,c){b.isFunction(a)&&(a=b.bind(a,h),a=a()),j[c]=a}),j=b.defaults(j,{timeout:25e3,cache:!1,type:"GET",dataType:"jsonp"}),j=b.extend(j,{data:decodeURIComponent(c.param(i)),processData:!1,url:b.result(j,"url")},g);var k=!(0===d[0]&&9===d[1]&&10===d[2]),l=j.success;j.success=function(a,b,c){l&&(k?l(a,b,c):l(f,a,j)),f&&f.trigger&&f.trigger("sync",f,a,j)};var m=j.error;j.error=function(a){m&&m(f,a,j),f&&f.trigger&&f.trigger("error",f,a,j)};var n=j.xhr=a.ajax(j);return f&&f.trigger&&f.trigger("request",f,n,j),n},nextPage:function(a){this.currentPage1&&(this.currentPage=--this.currentPage,this.pager(a))},goTo:function(a,b){void 0!==a&&(this.currentPage=parseInt(a,10),this.pager(b))},howManyPer:function(a){if(void 0!==a){var b=this.perPage;this.perPage=parseInt(a,10),this.currentPage=Math.ceil((b*(this.currentPage-1)+1)/a),this.pager()}},setSort:function(a,b){void 0!==a&&void 0!==b&&(this.lastSortColumn=this.sortColumn,this.sortColumn=a,this.sortDirection=b,this.pager(),this.info())},setFieldFilter:function(a){b.isEmpty(a)?(this.lastFieldFilterRules=this.fieldFilterRules,this.fieldFilterRules="",this.pager(),this.info()):(this.lastFieldFilterRules=this.fieldFilterRules,this.fieldFilterRules=a,this.pager(),this.info())},doFakeFieldFilter:function(a){if(!b.isEmpty(a)){var c=this.origModels;return void 0===c&&(c=this.models),c=this._fieldFilter(c,a),""!==this.filterExpression&&(c=this._filter(c,this.filterFields,this.filterExpression)),c.length}},setFilter:function(a,b){void 0!==a&&void 0!==b&&(this.filterFields=a,this.lastFilterExpression=this.filterExpression,this.filterExpression=b,this.pager(),this.info())},doFakeFilter:function(a,c){if(void 0!==a&&void 0!==c){var d=this.origModels;return void 0===d&&(d=this.models),b.isEmpty(this.fieldFilterRules)||(d=this._fieldFilter(d,this.fieldFilterRules)),d=this._filter(d,a,c),d.length}},pager:function(a){var c=this,d=this.perPage,e=(c.currentPage-1)*d,f=e+d;void 0===c.origModels&&(c.origModels=c.models),c.models=c.origModels.slice(),""!==this.sortColumn&&(c.models=c._sort(c.models,this.sortColumn,this.sortDirection)),b.isEmpty(this.fieldFilterRules)||(c.models=c._fieldFilter(c.models,this.fieldFilterRules)),""!==this.filterExpression&&(c.models=c._filter(c.models,this.filterFields,this.filterExpression)),this.lastSortColumn===this.sortColumn&&this.lastFilterExpression===this.filterExpression&&b.isEqual(this.fieldFilterRules,this.lastFieldFilterRules)||(e=0,f=e+d,c.currentPage=1,this.lastSortColumn=this.sortColumn,this.lastFieldFilterRules=this.fieldFilterRules,this.lastFilterExpression=this.filterExpression),c.sortedAndFilteredModels=c.models.slice(),c.info(),c.reset(c.models.slice(e,f)),b.result(a,"success")},_sort:function(a,c,d){return a=a.sort(function(a,e){var f=a.get(c),g=e.get(c);if(b.isUndefined(f)||b.isUndefined(g)||null===f||null===g)return 0;if(f=f.toString().toLowerCase(),g=g.toString().toLowerCase(),"desc"===d)if(!f.match(/[^\-\d\.]/)&&f.match(/-?[\d\.]+/)&&!g.match(/[^\-\d\.]/)&&g.match(/-?[\d\.]+/)){if(g-0>f-0)return 1;if(f-0>g-0)return-1}else{if(g>f)return 1;if(f>g)return-1}else if(!f.match(/[^\-\d\.]/)&&f.match(/-?[\d\.]+/)&&!g.match(/[^\-\d\.]/)&&g.match(/-?[\d\.]+/)){if(g-0>f-0)return-1;if(f-0>g-0)return 1}else{if(g>f)return-1;if(f>g)return 1}if(a.cid&&e.cid){var h=a.cid,i=e.cid;if(i>h)return-1;if(h>i)return 1}return 0})},_fieldFilter:function(a,c){if(b.isEmpty(c))return a;var d=[];return b.each(a,function(a){var e=!0;b.each(c,function(c){if(!e)return!1;if(e=!1,"function"===c.type){var d=b.wrap(c.value,function(b){return b(a.get(c.field))});d()&&(e=!0)}else"required"===c.type?b.isEmpty(a.get(c.field).toString())||(e=!0):"min"===c.type?!b.isNaN(Number(a.get(c.field)))&&!b.isNaN(Number(c.value))&&Number(a.get(c.field))>=Number(c.value)&&(e=!0):"max"===c.type?!b.isNaN(Number(a.get(c.field)))&&!b.isNaN(Number(c.value))&&Number(a.get(c.field))<=Number(c.value)&&(e=!0):"range"===c.type?!b.isNaN(Number(a.get(c.field)))&&b.isObject(c.value)&&!b.isNaN(Number(c.value.min))&&!b.isNaN(Number(c.value.max))&&Number(a.get(c.field))>=Number(c.value.min)&&Number(a.get(c.field))<=Number(c.value.max)&&(e=!0):"minLength"===c.type?a.get(c.field).toString().length>=c.value&&(e=!0):"maxLength"===c.type?a.get(c.field).toString().length<=c.value&&(e=!0):"rangeLength"===c.type?b.isObject(c.value)&&!b.isNaN(Number(c.value.min))&&!b.isNaN(Number(c.value.max))&&a.get(c.field).toString().length>=c.value.min&&a.get(c.field).toString().length<=c.value.max&&(e=!0):"oneOf"===c.type?b.isArray(c.value)&&b.include(c.value,a.get(c.field))&&(e=!0):"equalTo"===c.type?c.value===a.get(c.field)&&(e=!0):"containsAllOf"===c.type?b.isArray(c.value)&&b.isArray(a.get(c.field))&&b.intersection(c.value,a.get(c.field)).length===c.value.length&&(e=!0):"pattern"===c.type?a.get(c.field).toString().match(c.value)&&(e=!0):e=!1}),e&&d.push(a)}),d},_filter:function(c,d,e){var f=this,g={};if(b.isString(d)?g[d]={cmp_method:"regexp"}:b.isArray(d)?b.each(d,function(a){g[a]={cmp_method:"regexp"}}):b.each(d,function(a,c){g[c]=b.defaults(a,{cmp_method:"regexp"})}),d=g,b.has(a.Paginator,"removeDiacritics")&&f.useDiacriticsPlugin&&(e=a.Paginator.removeDiacritics(e)),""===e||!b.isString(e))return c;var h=b.map(e.match(/\w+/gi),function(a){return a.toLowerCase()}),i="("+b.uniq(h).join("|")+")",j=new RegExp(i,"igm"),k=[];return b.each(c,function(c){var g=[];b.each(d,function(d,i){var k=c.get(i);if(k){var l=[];if(k=b.has(a.Paginator,"removeDiacritics")&&f.useDiacriticsPlugin?a.Paginator.removeDiacritics(k.toString()):k.toString(),"levenshtein"===d.cmp_method&&b.has(a.Paginator,"levenshtein")&&f.useLevenshteinPlugin){var m=a.Paginator.levenshtein(k,e);b.defaults(d,{max_distance:0}),m<=d.max_distance&&(l=b.uniq(h))}else l=k.match(j);l=b.map(l,function(a){return a.toString().toLowerCase()}),b.each(l,function(a){g.push(a)})}}),g=b.uniq(b.without(g,"")),b.isEmpty(b.difference(h,g))&&k.push(c)}),k},info:function(){var a=this,b={},c=a.sortedAndFilteredModels?a.sortedAndFilteredModels.length:a.length,d=Math.ceil(c/a.perPage);return b={totalUnfilteredRecords:a.origModels.length,totalRecords:c,currentPage:a.currentPage,perPage:this.perPage,totalPages:d,lastPage:d,previous:!1,next:!1,startRecord:0===c?0:(a.currentPage-1)*this.perPage+1,endRecord:Math.min(c,a.currentPage*this.perPage)},a.currentPage>1&&(b.previous=a.currentPage-1),a.currentPage1)if(1+e>=f)for(c=1,d=f;d>=c;c++)b.push(c);else if(a.currentPage<=this.pagesInRange+1)for(c=1,d=2+e;d>c;c++)b.push(c);else if(f-this.pagesInRange>a.currentPage&&a.currentPage>this.pagesInRange)for(c=a.currentPage-this.pagesInRange;c<=a.currentPage+this.pagesInRange;c++)b.push(c);else for(c=f-e;f>=c;c++)b.push(c);return b},bootstrap:function(a){return b.extend(this,a),this.goTo(1),this.info(),this}}),e.clientPager.prototype.prevPage=e.clientPager.prototype.previousPage;var f=function(){var a=new c.Deferred;return a.reject(),a.promise()};return e.requestPager=a.Collection.extend({sync:function(e,f,g){var h=this;h.setDefaults();var i={};b.each(b.result(h,"server_api"),function(a,c){b.isFunction(a)&&(a=b.bind(a,h),a=a()),i[c]=a});var j=b.clone(h.paginator_core);b.each(j,function(a,c){b.isFunction(a)&&(a=b.bind(a,h),a=a()),j[c]=a}),j=b.defaults(j,{timeout:25e3,cache:!1,type:"GET",dataType:"jsonp"}),g.data=g.data?decodeURIComponent(c.param(b.extend(i,g.data))):decodeURIComponent(c.param(i)),j=b.extend(j,{data:decodeURIComponent(c.param(i)),processData:!1,url:b.result(j,"url")},g);var k=!(0===d[0]&&9===d[1]&&10===d[2]),l=j.success;j.success=function(a,b,c){l&&(k?l(a,b,c):l(f,a,j)),d[0]<1&&f&&f.trigger&&f.trigger("sync",f,a,j)};var m=j.error;j.error=function(a){m&&m(a),f&&f.trigger&&f.trigger("error",f,a,j)};var n=j.xhr=a.ajax(j);return f&&f.trigger&&f.trigger("request",f,n,j),n},setDefaults:function(){var a=this;b.defaults(a.paginator_ui,{firstPage:0,currentPage:1,perPage:5,totalPages:10,pagesInRange:4}),b.each(a.paginator_ui,function(c,d){b.isUndefined(a[d])&&(a[d]=a.paginator_ui[d])})},requestNextPage:function(a){return void 0!==this.currentPage?(this.currentPage+=1,this.pager(a)):f()},requestPreviousPage:function(a){return void 0!==this.currentPage?(this.currentPage-=1,this.pager(a)):f()},updateOrder:function(a,b){return void 0!==a?(this.sortField=a,this.pager(b)):f()},goTo:function(a,b){return void 0!==a?(this.currentPage=parseInt(a,10),this.pager(b)):f()},howManyPer:function(a,b){return void 0!==a?(this.currentPage=this.firstPage,this.perPage=a,this.pager(b)):f()},info:function(){var a={totalRecords:this.totalRecords||0,currentPage:this.currentPage,firstPage:this.firstPage,totalPages:Math.ceil(this.totalRecords/this.perPage),lastPage:this.totalPages,perPage:this.perPage,previous:!1,next:!1};return this.currentPage>1&&(a.previous=this.currentPage-1),this.currentPage1)if(1+e>=f)for(c=1,d=f;d>=c;c++)b.push(c);else if(a.currentPage<=this.pagesInRange+1)for(c=1,d=2+e;d>c;c++)b.push(c);else if(f-this.pagesInRange>a.currentPage&&a.currentPage>this.pagesInRange)for(c=a.currentPage-this.pagesInRange;c<=a.currentPage+this.pagesInRange;c++)b.push(c);else for(c=f-e;f>=c;c++)b.push(c);return b},pager:function(a){return b.isObject(a)||(a={}),this.fetch(a)},url:function(){return void 0!==this.paginator_core&&void 0!==this.paginator_core.url?this.paginator_core.url:null},bootstrap:function(a){return b.extend(this,a),this.setDefaults(),this.info(),this}}),e.requestPager.prototype.nextPage=e.requestPager.prototype.requestNextPage,e.requestPager.prototype.prevPage=e.requestPager.prototype.requestPreviousPage,e}(Backbone,_,jQuery);
--------------------------------------------------------------------------------
/public/js/vendor/spin.min.js:
--------------------------------------------------------------------------------
1 | (function(t,e){if(typeof exports=="object")module.exports=e();else if(typeof define=="function"&&define.amd)define(e);else t.Spinner=e()})(this,function(){"use strict";var t=["webkit","Moz","ms","O"],e={},i;function o(t,e){var i=document.createElement(t||"div"),o;for(o in e)i[o]=e[o];return i}function n(t){for(var e=1,i=arguments.length;e>1):parseInt(n.left,10)+s)+"px",top:(n.top=="auto"?l.y-a.y+(t.offsetHeight>>1):parseInt(n.top,10)+s)+"px"})}r.setAttribute("role","progressbar");e.lines(r,e.opts);if(!i){var d=0,p=(n.lines-1)*(1-n.direction)/2,c,h=n.fps,m=h/n.speed,y=(1-n.opacity)/(m*n.trail/100),g=m/n.lines;(function v(){d++;for(var t=0;t>1)+"px"})}for(;r',e)}r.addRule(".spin-vml","behavior:url(#default#VML)");c.prototype.lines=function(e,i){var o=i.length+i.width,r=2*o;function s(){return f(t("group",{coordsize:r+" "+r,coordorigin:-o+" "+-o}),{width:r,height:r})}var a=-(i.width+i.length)*2+"px",l=f(s(),{position:"absolute",top:a,left:a}),u;function p(e,r,a){n(l,n(f(s(),{rotation:360/i.lines*e+"deg",left:~~r}),n(f(t("roundrect",{arcsize:i.corners}),{width:o,height:i.width,left:i.radius,top:-i.width>>1,filter:a}),t("fill",{color:d(i.color,e),opacity:i.opacity}),t("stroke",{opacity:0}))))}if(i.shadow)for(u=1;u<=i.lines;u++)p(u,-2,"progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)");for(u=1;u<=i.lines;u++)p(u);return n(e,l)};c.prototype.opacity=function(t,e,i,o){var n=t.firstChild;o=o.shadow&&o.lines||0;if(n&&e+o
15 | */
16 |
17 | .selectize-control.plugin-drag_drop.multi > .selectize-input > div.ui-sortable-placeholder {
18 | background: #f2f2f2 !important;
19 | background: rgba(0, 0, 0, 0.06) !important;
20 | border: 0 none !important;
21 | visibility: visible !important;
22 | -webkit-box-shadow: inset 0 0 12px 4px #ffffff;
23 | box-shadow: inset 0 0 12px 4px #ffffff;
24 | }
25 |
26 | .selectize-control.plugin-drag_drop .ui-sortable-placeholder::after {
27 | content: '!';
28 | visibility: hidden;
29 | }
30 |
31 | .selectize-control.plugin-drag_drop .ui-sortable-helper {
32 | -webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
33 | box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
34 | }
35 |
36 | .selectize-dropdown-header {
37 | position: relative;
38 | padding: 3px 12px;
39 | background: #f8f8f8;
40 | border-bottom: 1px solid #d0d0d0;
41 | -webkit-border-radius: 4px 4px 0 0;
42 | -moz-border-radius: 4px 4px 0 0;
43 | border-radius: 4px 4px 0 0;
44 | }
45 |
46 | .selectize-dropdown-header-close {
47 | position: absolute;
48 | top: 50%;
49 | right: 12px;
50 | margin-top: -12px;
51 | font-size: 20px !important;
52 | line-height: 20px;
53 | color: #333333;
54 | opacity: 0.4;
55 | }
56 |
57 | .selectize-dropdown-header-close:hover {
58 | color: #000000;
59 | }
60 |
61 | .selectize-dropdown.plugin-optgroup_columns .optgroup {
62 | float: left;
63 | border-top: 0 none;
64 | border-right: 1px solid #f2f2f2;
65 | -webkit-box-sizing: border-box;
66 | -moz-box-sizing: border-box;
67 | box-sizing: border-box;
68 | }
69 |
70 | .selectize-dropdown.plugin-optgroup_columns .optgroup:last-child {
71 | border-right: 0 none;
72 | }
73 |
74 | .selectize-dropdown.plugin-optgroup_columns .optgroup:before {
75 | display: none;
76 | }
77 |
78 | .selectize-dropdown.plugin-optgroup_columns .optgroup-header {
79 | border-top: 0 none;
80 | }
81 |
82 | .selectize-control.plugin-remove_button [data-value] {
83 | position: relative;
84 | padding-right: 24px !important;
85 | }
86 |
87 | .selectize-control.plugin-remove_button [data-value] .remove {
88 | position: absolute;
89 | top: 0;
90 | right: 0;
91 | bottom: 0;
92 | display: inline-block;
93 | width: 17px;
94 | padding: 1px 0 0 0;
95 | font-size: 12px;
96 | font-weight: bold;
97 | color: inherit;
98 | text-align: center;
99 | text-decoration: none;
100 | vertical-align: middle;
101 | border-left: 1px solid rgba(0, 0, 0, 0);
102 | -webkit-border-radius: 0 2px 2px 0;
103 | -moz-border-radius: 0 2px 2px 0;
104 | border-radius: 0 2px 2px 0;
105 | -webkit-box-sizing: border-box;
106 | -moz-box-sizing: border-box;
107 | box-sizing: border-box;
108 | }
109 |
110 | .selectize-control.plugin-remove_button [data-value] .remove:hover {
111 | background: rgba(0, 0, 0, 0.05);
112 | }
113 |
114 | .selectize-control.plugin-remove_button [data-value].active .remove {
115 | border-left-color: rgba(0, 0, 0, 0);
116 | }
117 |
118 | .selectize-control.plugin-remove_button .disabled [data-value] .remove:hover {
119 | background: none;
120 | }
121 |
122 | .selectize-control.plugin-remove_button .disabled [data-value] .remove {
123 | border-left-color: rgba(77, 77, 77, 0);
124 | }
125 |
126 | .selectize-control {
127 | position: relative;
128 | }
129 |
130 | .selectize-dropdown,
131 | .selectize-input,
132 | .selectize-input input {
133 | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
134 | font-size: 14px;
135 | -webkit-font-smoothing: inherit;
136 | line-height: 20px;
137 | color: #333333;
138 | }
139 |
140 | .selectize-input,
141 | .selectize-control.single .selectize-input.input-active {
142 | display: inline-block;
143 | cursor: text;
144 | background: #ffffff;
145 | }
146 |
147 | .selectize-input {
148 | position: relative;
149 | z-index: 1;
150 | display: inline-block;
151 | width: 100%;
152 | padding: 6px 12px;
153 | overflow: hidden;
154 | border: 1px solid #cccccc;
155 | -webkit-border-radius: 4px;
156 | -moz-border-radius: 4px;
157 | border-radius: 4px;
158 | -webkit-box-shadow: none;
159 | box-shadow: none;
160 | -webkit-box-sizing: border-box;
161 | -moz-box-sizing: border-box;
162 | box-sizing: border-box;
163 | }
164 |
165 | .selectize-control.multi .selectize-input.has-items {
166 | padding: 5px 12px 2px;
167 | }
168 |
169 | .selectize-input.full {
170 | background-color: #ffffff;
171 | }
172 |
173 | .selectize-input.disabled,
174 | .selectize-input.disabled * {
175 | cursor: default !important;
176 | }
177 |
178 | .selectize-input.focus {
179 | -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.15);
180 | box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.15);
181 | }
182 |
183 | .selectize-input.dropdown-active {
184 | -webkit-border-radius: 4px 4px 0 0;
185 | -moz-border-radius: 4px 4px 0 0;
186 | border-radius: 4px 4px 0 0;
187 | }
188 |
189 | .selectize-input > * {
190 | display: -moz-inline-stack;
191 | display: inline-block;
192 | *display: inline;
193 | vertical-align: baseline;
194 | zoom: 1;
195 | }
196 |
197 | .selectize-control.multi .selectize-input > div {
198 | padding: 1px 3px;
199 | margin: 0 3px 3px 0;
200 | color: #333333;
201 | cursor: pointer;
202 | background: #efefef;
203 | border: 0 solid rgba(0, 0, 0, 0);
204 | }
205 |
206 | .selectize-control.multi .selectize-input > div.active {
207 | color: #ffffff;
208 | background: #428bca;
209 | border: 0 solid rgba(0, 0, 0, 0);
210 | }
211 |
212 | .selectize-control.multi .selectize-input.disabled > div,
213 | .selectize-control.multi .selectize-input.disabled > div.active {
214 | color: #808080;
215 | background: #ffffff;
216 | border: 0 solid rgba(77, 77, 77, 0);
217 | }
218 |
219 | .selectize-input > input {
220 | max-width: 100% !important;
221 | max-height: none !important;
222 | min-height: 0 !important;
223 | padding: 0 !important;
224 | margin: 0 !important;
225 | line-height: inherit !important;
226 | text-indent: 0 !important;
227 | background: none !important;
228 | border: 0 none !important;
229 | -webkit-box-shadow: none !important;
230 | box-shadow: none !important;
231 | -webkit-user-select: auto !important;
232 | }
233 |
234 | .selectize-input > input:focus {
235 | outline: none !important;
236 | }
237 |
238 | .selectize-input::after {
239 | display: block;
240 | clear: left;
241 | content: ' ';
242 | }
243 |
244 | .selectize-input.dropdown-active::before {
245 | position: absolute;
246 | right: 0;
247 | bottom: 0;
248 | left: 0;
249 | display: block;
250 | height: 1px;
251 | background: #ffffff;
252 | content: ' ';
253 | }
254 |
255 | .selectize-dropdown {
256 | position: absolute;
257 | z-index: 10;
258 | margin: -1px 0 0 0;
259 | background: #ffffff;
260 | border: 1px solid #cccccc;
261 | border-top: 0 none;
262 | -webkit-border-radius: 0 0 4px 4px;
263 | -moz-border-radius: 0 0 4px 4px;
264 | border-radius: 0 0 4px 4px;
265 | -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
266 | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
267 | -webkit-box-sizing: border-box;
268 | -moz-box-sizing: border-box;
269 | box-sizing: border-box;
270 | }
271 |
272 | .selectize-dropdown [data-selectable] {
273 | overflow: hidden;
274 | cursor: pointer;
275 | }
276 |
277 | .selectize-dropdown [data-selectable] .highlight {
278 | background: rgba(255, 237, 40, 0.4);
279 | -webkit-border-radius: 1px;
280 | -moz-border-radius: 1px;
281 | border-radius: 1px;
282 | }
283 |
284 | .selectize-dropdown [data-selectable],
285 | .selectize-dropdown .optgroup-header {
286 | padding: 3px 12px;
287 | }
288 |
289 | .selectize-dropdown .optgroup:first-child .optgroup-header {
290 | border-top: 0 none;
291 | }
292 |
293 | .selectize-dropdown .optgroup-header {
294 | color: #999999;
295 | cursor: default;
296 | background: #ffffff;
297 | }
298 |
299 | .selectize-dropdown .active {
300 | color: #262626;
301 | background-color: #f5f5f5;
302 | }
303 |
304 | .selectize-dropdown .active.create {
305 | color: #262626;
306 | }
307 |
308 | .selectize-dropdown .create {
309 | color: rgba(51, 51, 51, 0.5);
310 | }
311 |
312 | .selectize-dropdown-content {
313 | max-height: 200px;
314 | overflow-x: hidden;
315 | overflow-y: auto;
316 | }
317 |
318 | .selectize-control.single .selectize-input,
319 | .selectize-control.single .selectize-input input {
320 | cursor: pointer;
321 | }
322 |
323 | .selectize-control.single .selectize-input.input-active,
324 | .selectize-control.single .selectize-input.input-active input {
325 | cursor: text;
326 | }
327 |
328 | .selectize-control.single .selectize-input:after {
329 | position: absolute;
330 | top: 50%;
331 | right: 17px;
332 | display: block;
333 | width: 0;
334 | height: 0;
335 | margin-top: -3px;
336 | border-color: #000000 transparent transparent transparent;
337 | border-style: solid;
338 | border-width: 5px 5px 0 5px;
339 | content: ' ';
340 | }
341 |
342 | .selectize-control.single .selectize-input.dropdown-active:after {
343 | margin-top: -4px;
344 | border-color: transparent transparent #000000 transparent;
345 | border-width: 0 5px 5px 5px;
346 | }
347 |
348 | .selectize-control.rtl.single .selectize-input:after {
349 | right: auto;
350 | left: 17px;
351 | }
352 |
353 | .selectize-control.rtl .selectize-input > input {
354 | margin: 0 4px 0 -2px !important;
355 | }
356 |
357 | .selectize-control .selectize-input.disabled {
358 | background-color: #ffffff;
359 | opacity: 0.5;
360 | }
361 |
362 | .selectize-dropdown,
363 | .selectize-dropdown.form-control {
364 | z-index: 1000;
365 | height: auto;
366 | padding: 0;
367 | margin: 2px 0 0 0;
368 | background: #ffffff;
369 | border: 1px solid #cccccc;
370 | border: 1px solid rgba(0, 0, 0, 0.15);
371 | -webkit-border-radius: 4px;
372 | -moz-border-radius: 4px;
373 | border-radius: 4px;
374 | -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
375 | box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
376 | }
377 |
378 | .selectize-dropdown .optgroup-header {
379 | font-size: 12px;
380 | line-height: 1.428571429;
381 | }
382 |
383 | .selectize-dropdown .optgroup:first-child:before {
384 | display: none;
385 | }
386 |
387 | .selectize-dropdown .optgroup:before {
388 | display: block;
389 | height: 1px;
390 | margin: 9px 0;
391 | margin-right: -12px;
392 | margin-left: -12px;
393 | overflow: hidden;
394 | background-color: #e5e5e5;
395 | content: ' ';
396 | }
397 |
398 | .selectize-dropdown-content {
399 | padding: 5px 0;
400 | }
401 |
402 | .selectize-dropdown-header {
403 | padding: 6px 12px;
404 | }
405 |
406 | .selectize-input {
407 | min-height: 34px;
408 | }
409 |
410 | .selectize-input.dropdown-active {
411 | -webkit-border-radius: 4px;
412 | -moz-border-radius: 4px;
413 | border-radius: 4px;
414 | }
415 |
416 | .selectize-input.dropdown-active::before {
417 | display: none;
418 | }
419 |
420 | .selectize-input.focus {
421 | border-color: #66afe9;
422 | outline: 0;
423 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
424 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
425 | }
426 |
427 | .selectize-control.multi .selectize-input.has-items {
428 | padding-right: 9px;
429 | padding-left: 9px;
430 | }
431 |
432 | .selectize-control.multi .selectize-input > div {
433 | -webkit-border-radius: 3px;
434 | -moz-border-radius: 3px;
435 | border-radius: 3px;
436 | }
437 |
438 | .form-control.selectize-control {
439 | height: auto;
440 | padding: 0;
441 | background: none;
442 | border: none;
443 | -webkit-border-radius: 0;
444 | -moz-border-radius: 0;
445 | border-radius: 0;
446 | -webkit-box-shadow: none;
447 | box-shadow: none;
448 | }
--------------------------------------------------------------------------------
/public/vendor/selectize/css/selectize.css:
--------------------------------------------------------------------------------
1 | /**
2 | * selectize.css (v0.8.5)
3 | * Copyright (c) 2013 Brian Reavis & contributors
4 | *
5 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
6 | * file except in compliance with the License. You may obtain a copy of the License at:
7 | * http://www.apache.org/licenses/LICENSE-2.0
8 | *
9 | * Unless required by applicable law or agreed to in writing, software distributed under
10 | * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11 | * ANY KIND, either express or implied. See the License for the specific language
12 | * governing permissions and limitations under the License.
13 | *
14 | * @author Brian Reavis
15 | */
16 |
17 | .selectize-control.plugin-drag_drop.multi > .selectize-input > div.ui-sortable-placeholder {
18 | background: #f2f2f2 !important;
19 | background: rgba(0, 0, 0, 0.06) !important;
20 | border: 0 none !important;
21 | visibility: visible !important;
22 | -webkit-box-shadow: inset 0 0 12px 4px #ffffff;
23 | box-shadow: inset 0 0 12px 4px #ffffff;
24 | }
25 |
26 | .selectize-control.plugin-drag_drop .ui-sortable-placeholder::after {
27 | content: '!';
28 | visibility: hidden;
29 | }
30 |
31 | .selectize-control.plugin-drag_drop .ui-sortable-helper {
32 | -webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
33 | box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
34 | }
35 |
36 | .selectize-dropdown-header {
37 | position: relative;
38 | padding: 5px 8px;
39 | background: #f8f8f8;
40 | border-bottom: 1px solid #d0d0d0;
41 | -webkit-border-radius: 3px 3px 0 0;
42 | -moz-border-radius: 3px 3px 0 0;
43 | border-radius: 3px 3px 0 0;
44 | }
45 |
46 | .selectize-dropdown-header-close {
47 | position: absolute;
48 | top: 50%;
49 | right: 8px;
50 | margin-top: -12px;
51 | font-size: 20px !important;
52 | line-height: 20px;
53 | color: #303030;
54 | opacity: 0.4;
55 | }
56 |
57 | .selectize-dropdown-header-close:hover {
58 | color: #000000;
59 | }
60 |
61 | .selectize-dropdown.plugin-optgroup_columns .optgroup {
62 | float: left;
63 | border-top: 0 none;
64 | border-right: 1px solid #f2f2f2;
65 | -webkit-box-sizing: border-box;
66 | -moz-box-sizing: border-box;
67 | box-sizing: border-box;
68 | }
69 |
70 | .selectize-dropdown.plugin-optgroup_columns .optgroup:last-child {
71 | border-right: 0 none;
72 | }
73 |
74 | .selectize-dropdown.plugin-optgroup_columns .optgroup:before {
75 | display: none;
76 | }
77 |
78 | .selectize-dropdown.plugin-optgroup_columns .optgroup-header {
79 | border-top: 0 none;
80 | }
81 |
82 | .selectize-control.plugin-remove_button [data-value] {
83 | position: relative;
84 | padding-right: 24px !important;
85 | }
86 |
87 | .selectize-control.plugin-remove_button [data-value] .remove {
88 | position: absolute;
89 | top: 0;
90 | right: 0;
91 | bottom: 0;
92 | display: inline-block;
93 | width: 17px;
94 | padding: 2px 0 0 0;
95 | font-size: 12px;
96 | font-weight: bold;
97 | color: inherit;
98 | text-align: center;
99 | text-decoration: none;
100 | vertical-align: middle;
101 | border-left: 1px solid #d0d0d0;
102 | -webkit-border-radius: 0 2px 2px 0;
103 | -moz-border-radius: 0 2px 2px 0;
104 | border-radius: 0 2px 2px 0;
105 | -webkit-box-sizing: border-box;
106 | -moz-box-sizing: border-box;
107 | box-sizing: border-box;
108 | }
109 |
110 | .selectize-control.plugin-remove_button [data-value] .remove:hover {
111 | background: rgba(0, 0, 0, 0.05);
112 | }
113 |
114 | .selectize-control.plugin-remove_button [data-value].active .remove {
115 | border-left-color: #cacaca;
116 | }
117 |
118 | .selectize-control.plugin-remove_button .disabled [data-value] .remove:hover {
119 | background: none;
120 | }
121 |
122 | .selectize-control.plugin-remove_button .disabled [data-value] .remove {
123 | border-left-color: #ffffff;
124 | }
125 |
126 | .selectize-control {
127 | position: relative;
128 | }
129 |
130 | .selectize-dropdown,
131 | .selectize-input,
132 | .selectize-input input {
133 | font-family: inherit;
134 | font-size: 13px;
135 | -webkit-font-smoothing: inherit;
136 | line-height: 18px;
137 | color: #303030;
138 | }
139 |
140 | .selectize-input,
141 | .selectize-control.single .selectize-input.input-active {
142 | display: inline-block;
143 | cursor: text;
144 | background: #ffffff;
145 | }
146 |
147 | .selectize-input {
148 | position: relative;
149 | z-index: 1;
150 | display: inline-block;
151 | width: 100%;
152 | padding: 8px 8px;
153 | overflow: hidden;
154 | border: 1px solid #d0d0d0;
155 | -webkit-border-radius: 3px;
156 | -moz-border-radius: 3px;
157 | border-radius: 3px;
158 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.1);
159 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.1);
160 | -webkit-box-sizing: border-box;
161 | -moz-box-sizing: border-box;
162 | box-sizing: border-box;
163 | }
164 |
165 | .selectize-control.multi .selectize-input.has-items {
166 | padding: 6px 8px 3px;
167 | }
168 |
169 | .selectize-input.full {
170 | background-color: #ffffff;
171 | }
172 |
173 | .selectize-input.disabled,
174 | .selectize-input.disabled * {
175 | cursor: default !important;
176 | }
177 |
178 | .selectize-input.focus {
179 | -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.15);
180 | box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.15);
181 | }
182 |
183 | .selectize-input.dropdown-active {
184 | -webkit-border-radius: 3px 3px 0 0;
185 | -moz-border-radius: 3px 3px 0 0;
186 | border-radius: 3px 3px 0 0;
187 | }
188 |
189 | .selectize-input > * {
190 | display: -moz-inline-stack;
191 | display: inline-block;
192 | *display: inline;
193 | vertical-align: baseline;
194 | zoom: 1;
195 | }
196 |
197 | .selectize-control.multi .selectize-input > div {
198 | padding: 2px 6px;
199 | margin: 0 3px 3px 0;
200 | color: #303030;
201 | cursor: pointer;
202 | background: #f2f2f2;
203 | border: 0 solid #d0d0d0;
204 | }
205 |
206 | .selectize-control.multi .selectize-input > div.active {
207 | color: #303030;
208 | background: #e8e8e8;
209 | border: 0 solid #cacaca;
210 | }
211 |
212 | .selectize-control.multi .selectize-input.disabled > div,
213 | .selectize-control.multi .selectize-input.disabled > div.active {
214 | color: #7d7d7d;
215 | background: #ffffff;
216 | border: 0 solid #ffffff;
217 | }
218 |
219 | .selectize-input > input {
220 | max-width: 100% !important;
221 | max-height: none !important;
222 | min-height: 0 !important;
223 | padding: 0 !important;
224 | margin: 0 2px 0 0 !important;
225 | line-height: inherit !important;
226 | text-indent: 0 !important;
227 | background: none !important;
228 | border: 0 none !important;
229 | -webkit-box-shadow: none !important;
230 | box-shadow: none !important;
231 | -webkit-user-select: auto !important;
232 | }
233 |
234 | .selectize-input > input:focus {
235 | outline: none !important;
236 | }
237 |
238 | .selectize-input::after {
239 | display: block;
240 | clear: left;
241 | content: ' ';
242 | }
243 |
244 | .selectize-input.dropdown-active::before {
245 | position: absolute;
246 | right: 0;
247 | bottom: 0;
248 | left: 0;
249 | display: block;
250 | height: 1px;
251 | background: #f0f0f0;
252 | content: ' ';
253 | }
254 |
255 | .selectize-dropdown {
256 | position: absolute;
257 | z-index: 10;
258 | margin: -1px 0 0 0;
259 | background: #ffffff;
260 | border: 1px solid #d0d0d0;
261 | border-top: 0 none;
262 | -webkit-border-radius: 0 0 3px 3px;
263 | -moz-border-radius: 0 0 3px 3px;
264 | border-radius: 0 0 3px 3px;
265 | -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
266 | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
267 | -webkit-box-sizing: border-box;
268 | -moz-box-sizing: border-box;
269 | box-sizing: border-box;
270 | }
271 |
272 | .selectize-dropdown [data-selectable] {
273 | overflow: hidden;
274 | cursor: pointer;
275 | }
276 |
277 | .selectize-dropdown [data-selectable] .highlight {
278 | background: rgba(125, 168, 208, 0.2);
279 | -webkit-border-radius: 1px;
280 | -moz-border-radius: 1px;
281 | border-radius: 1px;
282 | }
283 |
284 | .selectize-dropdown [data-selectable],
285 | .selectize-dropdown .optgroup-header {
286 | padding: 5px 8px;
287 | }
288 |
289 | .selectize-dropdown .optgroup:first-child .optgroup-header {
290 | border-top: 0 none;
291 | }
292 |
293 | .selectize-dropdown .optgroup-header {
294 | color: #303030;
295 | cursor: default;
296 | background: #ffffff;
297 | }
298 |
299 | .selectize-dropdown .active {
300 | color: #495c68;
301 | background-color: #f5fafd;
302 | }
303 |
304 | .selectize-dropdown .active.create {
305 | color: #495c68;
306 | }
307 |
308 | .selectize-dropdown .create {
309 | color: rgba(48, 48, 48, 0.5);
310 | }
311 |
312 | .selectize-dropdown-content {
313 | max-height: 200px;
314 | overflow-x: hidden;
315 | overflow-y: auto;
316 | }
317 |
318 | .selectize-control.single .selectize-input,
319 | .selectize-control.single .selectize-input input {
320 | cursor: pointer;
321 | }
322 |
323 | .selectize-control.single .selectize-input.input-active,
324 | .selectize-control.single .selectize-input.input-active input {
325 | cursor: text;
326 | }
327 |
328 | .selectize-control.single .selectize-input:after {
329 | position: absolute;
330 | top: 50%;
331 | right: 15px;
332 | display: block;
333 | width: 0;
334 | height: 0;
335 | margin-top: -3px;
336 | border-color: #808080 transparent transparent transparent;
337 | border-style: solid;
338 | border-width: 5px 5px 0 5px;
339 | content: ' ';
340 | }
341 |
342 | .selectize-control.single .selectize-input.dropdown-active:after {
343 | margin-top: -4px;
344 | border-color: transparent transparent #808080 transparent;
345 | border-width: 0 5px 5px 5px;
346 | }
347 |
348 | .selectize-control.rtl.single .selectize-input:after {
349 | right: auto;
350 | left: 15px;
351 | }
352 |
353 | .selectize-control.rtl .selectize-input > input {
354 | margin: 0 4px 0 -2px !important;
355 | }
356 |
357 | .selectize-control .selectize-input.disabled {
358 | background-color: #fafafa;
359 | opacity: 0.5;
360 | }
--------------------------------------------------------------------------------
/public/vendor/selectize/css/selectize.legacy.css:
--------------------------------------------------------------------------------
1 | /**
2 | * selectize.legacy.css (v0.8.5) - Default Theme
3 | * Copyright (c) 2013 Brian Reavis & contributors
4 | *
5 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
6 | * file except in compliance with the License. You may obtain a copy of the License at:
7 | * http://www.apache.org/licenses/LICENSE-2.0
8 | *
9 | * Unless required by applicable law or agreed to in writing, software distributed under
10 | * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11 | * ANY KIND, either express or implied. See the License for the specific language
12 | * governing permissions and limitations under the License.
13 | *
14 | * @author Brian Reavis
15 | */
16 |
17 | .selectize-control.plugin-drag_drop.multi > .selectize-input > div.ui-sortable-placeholder {
18 | background: #f2f2f2 !important;
19 | background: rgba(0, 0, 0, 0.06) !important;
20 | border: 0 none !important;
21 | visibility: visible !important;
22 | -webkit-box-shadow: inset 0 0 12px 4px #ffffff;
23 | box-shadow: inset 0 0 12px 4px #ffffff;
24 | }
25 |
26 | .selectize-control.plugin-drag_drop .ui-sortable-placeholder::after {
27 | content: '!';
28 | visibility: hidden;
29 | }
30 |
31 | .selectize-control.plugin-drag_drop .ui-sortable-helper {
32 | -webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
33 | box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
34 | }
35 |
36 | .selectize-dropdown-header {
37 | position: relative;
38 | padding: 7px 10px;
39 | background: #f8f8f8;
40 | border-bottom: 1px solid #d0d0d0;
41 | -webkit-border-radius: 3px 3px 0 0;
42 | -moz-border-radius: 3px 3px 0 0;
43 | border-radius: 3px 3px 0 0;
44 | }
45 |
46 | .selectize-dropdown-header-close {
47 | position: absolute;
48 | top: 50%;
49 | right: 10px;
50 | margin-top: -12px;
51 | font-size: 20px !important;
52 | line-height: 20px;
53 | color: #303030;
54 | opacity: 0.4;
55 | }
56 |
57 | .selectize-dropdown-header-close:hover {
58 | color: #000000;
59 | }
60 |
61 | .selectize-dropdown.plugin-optgroup_columns .optgroup {
62 | float: left;
63 | border-top: 0 none;
64 | border-right: 1px solid #f2f2f2;
65 | -webkit-box-sizing: border-box;
66 | -moz-box-sizing: border-box;
67 | box-sizing: border-box;
68 | }
69 |
70 | .selectize-dropdown.plugin-optgroup_columns .optgroup:last-child {
71 | border-right: 0 none;
72 | }
73 |
74 | .selectize-dropdown.plugin-optgroup_columns .optgroup:before {
75 | display: none;
76 | }
77 |
78 | .selectize-dropdown.plugin-optgroup_columns .optgroup-header {
79 | border-top: 0 none;
80 | }
81 |
82 | .selectize-control.plugin-remove_button [data-value] {
83 | position: relative;
84 | padding-right: 24px !important;
85 | }
86 |
87 | .selectize-control.plugin-remove_button [data-value] .remove {
88 | position: absolute;
89 | top: 0;
90 | right: 0;
91 | bottom: 0;
92 | display: inline-block;
93 | width: 17px;
94 | padding: 1px 0 0 0;
95 | font-size: 12px;
96 | font-weight: bold;
97 | color: inherit;
98 | text-align: center;
99 | text-decoration: none;
100 | vertical-align: middle;
101 | border-left: 1px solid #74b21e;
102 | -webkit-border-radius: 0 2px 2px 0;
103 | -moz-border-radius: 0 2px 2px 0;
104 | border-radius: 0 2px 2px 0;
105 | -webkit-box-sizing: border-box;
106 | -moz-box-sizing: border-box;
107 | box-sizing: border-box;
108 | }
109 |
110 | .selectize-control.plugin-remove_button [data-value] .remove:hover {
111 | background: rgba(0, 0, 0, 0.05);
112 | }
113 |
114 | .selectize-control.plugin-remove_button [data-value].active .remove {
115 | border-left-color: #6f9839;
116 | }
117 |
118 | .selectize-control.plugin-remove_button .disabled [data-value] .remove:hover {
119 | background: none;
120 | }
121 |
122 | .selectize-control.plugin-remove_button .disabled [data-value] .remove {
123 | border-left-color: #b4b4b4;
124 | }
125 |
126 | .selectize-control {
127 | position: relative;
128 | }
129 |
130 | .selectize-dropdown,
131 | .selectize-input,
132 | .selectize-input input {
133 | font-family: inherit;
134 | font-size: 13px;
135 | -webkit-font-smoothing: inherit;
136 | line-height: 20px;
137 | color: #303030;
138 | }
139 |
140 | .selectize-input,
141 | .selectize-control.single .selectize-input.input-active {
142 | display: inline-block;
143 | cursor: text;
144 | background: #ffffff;
145 | }
146 |
147 | .selectize-input {
148 | position: relative;
149 | z-index: 1;
150 | display: inline-block;
151 | width: 100%;
152 | padding: 10px 10px;
153 | overflow: hidden;
154 | border: 1px solid #d0d0d0;
155 | -webkit-border-radius: 3px;
156 | -moz-border-radius: 3px;
157 | border-radius: 3px;
158 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.1);
159 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.1);
160 | -webkit-box-sizing: border-box;
161 | -moz-box-sizing: border-box;
162 | box-sizing: border-box;
163 | }
164 |
165 | .selectize-control.multi .selectize-input.has-items {
166 | padding: 8px 10px 4px;
167 | }
168 |
169 | .selectize-input.full {
170 | background-color: #f2f2f2;
171 | }
172 |
173 | .selectize-input.disabled,
174 | .selectize-input.disabled * {
175 | cursor: default !important;
176 | }
177 |
178 | .selectize-input.focus {
179 | -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.15);
180 | box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.15);
181 | }
182 |
183 | .selectize-input.dropdown-active {
184 | -webkit-border-radius: 3px 3px 0 0;
185 | -moz-border-radius: 3px 3px 0 0;
186 | border-radius: 3px 3px 0 0;
187 | }
188 |
189 | .selectize-input > * {
190 | display: -moz-inline-stack;
191 | display: inline-block;
192 | *display: inline;
193 | vertical-align: baseline;
194 | zoom: 1;
195 | }
196 |
197 | .selectize-control.multi .selectize-input > div {
198 | padding: 1px 5px;
199 | margin: 0 4px 4px 0;
200 | color: #3d5d18;
201 | cursor: pointer;
202 | background: #b8e76f;
203 | border: 1px solid #74b21e;
204 | }
205 |
206 | .selectize-control.multi .selectize-input > div.active {
207 | color: #303030;
208 | background: #92c836;
209 | border: 1px solid #6f9839;
210 | }
211 |
212 | .selectize-control.multi .selectize-input.disabled > div,
213 | .selectize-control.multi .selectize-input.disabled > div.active {
214 | color: #878787;
215 | background: #f8f8f8;
216 | border: 1px solid #b4b4b4;
217 | }
218 |
219 | .selectize-input > input {
220 | max-width: 100% !important;
221 | max-height: none !important;
222 | min-height: 0 !important;
223 | padding: 0 !important;
224 | margin: 0 2px 0 0 !important;
225 | line-height: inherit !important;
226 | text-indent: 0 !important;
227 | background: none !important;
228 | border: 0 none !important;
229 | -webkit-box-shadow: none !important;
230 | box-shadow: none !important;
231 | -webkit-user-select: auto !important;
232 | }
233 |
234 | .selectize-input > input:focus {
235 | outline: none !important;
236 | }
237 |
238 | .selectize-input::after {
239 | display: block;
240 | clear: left;
241 | content: ' ';
242 | }
243 |
244 | .selectize-input.dropdown-active::before {
245 | position: absolute;
246 | right: 0;
247 | bottom: 0;
248 | left: 0;
249 | display: block;
250 | height: 1px;
251 | background: #f0f0f0;
252 | content: ' ';
253 | }
254 |
255 | .selectize-dropdown {
256 | position: absolute;
257 | z-index: 10;
258 | margin: -1px 0 0 0;
259 | background: #ffffff;
260 | border: 1px solid #d0d0d0;
261 | border-top: 0 none;
262 | -webkit-border-radius: 0 0 3px 3px;
263 | -moz-border-radius: 0 0 3px 3px;
264 | border-radius: 0 0 3px 3px;
265 | -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
266 | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
267 | -webkit-box-sizing: border-box;
268 | -moz-box-sizing: border-box;
269 | box-sizing: border-box;
270 | }
271 |
272 | .selectize-dropdown [data-selectable] {
273 | overflow: hidden;
274 | cursor: pointer;
275 | }
276 |
277 | .selectize-dropdown [data-selectable] .highlight {
278 | background: rgba(255, 237, 40, 0.4);
279 | -webkit-border-radius: 1px;
280 | -moz-border-radius: 1px;
281 | border-radius: 1px;
282 | }
283 |
284 | .selectize-dropdown [data-selectable],
285 | .selectize-dropdown .optgroup-header {
286 | padding: 7px 10px;
287 | }
288 |
289 | .selectize-dropdown .optgroup:first-child .optgroup-header {
290 | border-top: 0 none;
291 | }
292 |
293 | .selectize-dropdown .optgroup-header {
294 | color: #303030;
295 | cursor: default;
296 | background: #f8f8f8;
297 | }
298 |
299 | .selectize-dropdown .active {
300 | color: #303030;
301 | background-color: #fffceb;
302 | }
303 |
304 | .selectize-dropdown .active.create {
305 | color: #303030;
306 | }
307 |
308 | .selectize-dropdown .create {
309 | color: rgba(48, 48, 48, 0.5);
310 | }
311 |
312 | .selectize-dropdown-content {
313 | max-height: 200px;
314 | overflow-x: hidden;
315 | overflow-y: auto;
316 | }
317 |
318 | .selectize-control.single .selectize-input,
319 | .selectize-control.single .selectize-input input {
320 | cursor: pointer;
321 | }
322 |
323 | .selectize-control.single .selectize-input.input-active,
324 | .selectize-control.single .selectize-input.input-active input {
325 | cursor: text;
326 | }
327 |
328 | .selectize-control.single .selectize-input:after {
329 | position: absolute;
330 | top: 50%;
331 | right: 15px;
332 | display: block;
333 | width: 0;
334 | height: 0;
335 | margin-top: -3px;
336 | border-color: #808080 transparent transparent transparent;
337 | border-style: solid;
338 | border-width: 5px 5px 0 5px;
339 | content: ' ';
340 | }
341 |
342 | .selectize-control.single .selectize-input.dropdown-active:after {
343 | margin-top: -4px;
344 | border-color: transparent transparent #808080 transparent;
345 | border-width: 0 5px 5px 5px;
346 | }
347 |
348 | .selectize-control.rtl.single .selectize-input:after {
349 | right: auto;
350 | left: 15px;
351 | }
352 |
353 | .selectize-control.rtl .selectize-input > input {
354 | margin: 0 4px 0 -2px !important;
355 | }
356 |
357 | .selectize-control .selectize-input.disabled {
358 | background-color: #fafafa;
359 | opacity: 0.5;
360 | }
361 |
362 | .selectize-control.multi .selectize-input [data-value] {
363 | text-shadow: 0 1px 0 rgba(255, 255, 255, 0.1);
364 | background-color: #b2e567;
365 | background-image: -moz-linear-gradient(top, #b8e76f, #a9e25c);
366 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b8e76f), to(#a9e25c));
367 | background-image: -webkit-linear-gradient(top, #b8e76f, #a9e25c);
368 | background-image: -o-linear-gradient(top, #b8e76f, #a9e25c);
369 | background-image: linear-gradient(to bottom, #b8e76f, #a9e25c);
370 | background-repeat: repeat-x;
371 | -webkit-border-radius: 3px;
372 | -moz-border-radius: 3px;
373 | border-radius: 3px;
374 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffb8e76f', endColorstr='#ffa9e25c', GradientType=0);
375 | -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
376 | box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
377 | }
378 |
379 | .selectize-control.multi .selectize-input [data-value].active {
380 | background-color: #88c332;
381 | background-image: -moz-linear-gradient(top, #92c836, #7abc2c);
382 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#92c836), to(#7abc2c));
383 | background-image: -webkit-linear-gradient(top, #92c836, #7abc2c);
384 | background-image: -o-linear-gradient(top, #92c836, #7abc2c);
385 | background-image: linear-gradient(to bottom, #92c836, #7abc2c);
386 | background-repeat: repeat-x;
387 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff92c836', endColorstr='#ff7abc2c', GradientType=0);
388 | }
389 |
390 | .selectize-control.single .selectize-input {
391 | background-color: #f3f3f3;
392 | background-image: -moz-linear-gradient(top, #f5f5f5, #efefef);
393 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#efefef));
394 | background-image: -webkit-linear-gradient(top, #f5f5f5, #efefef);
395 | background-image: -o-linear-gradient(top, #f5f5f5, #efefef);
396 | background-image: linear-gradient(to bottom, #f5f5f5, #efefef);
397 | background-repeat: repeat-x;
398 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffefefef', GradientType=0);
399 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.8), 0 2px 0 #e0e0e0, 0 3px 0 #c8c8c8, 0 4px 1px rgba(0, 0, 0, 0.1);
400 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.8), 0 2px 0 #e0e0e0, 0 3px 0 #c8c8c8, 0 4px 1px rgba(0, 0, 0, 0.1);
401 | }
402 |
403 | .selectize-control.single .selectize-input,
404 | .selectize-dropdown.single {
405 | border-color: #b8b8b8;
406 | }
407 |
408 | .selectize-dropdown .optgroup-header {
409 | font-size: 0.8em;
410 | font-weight: bold;
411 | border-top: 1px solid #f0f0f0;
412 | border-bottom: 1px solid #f0f0f0;
413 | }
--------------------------------------------------------------------------------
/public/vendor/selectize/less/plugins/drag_drop.less:
--------------------------------------------------------------------------------
1 | .selectize-control.plugin-drag_drop {
2 | &.multi > .selectize-input > div.ui-sortable-placeholder {
3 | visibility: visible !important;
4 | background: #f2f2f2 !important;
5 | background: rgba(0,0,0,0.06) !important;
6 | border: 0 none !important;
7 | .selectize-box-shadow(inset 0 0 12px 4px #fff);
8 | }
9 | .ui-sortable-placeholder::after {
10 | content: '!';
11 | visibility: hidden;
12 | }
13 | .ui-sortable-helper {
14 | .selectize-box-shadow(0 2px 5px rgba(0,0,0,0.2));
15 | }
16 | }
--------------------------------------------------------------------------------
/public/vendor/selectize/less/plugins/dropdown_header.less:
--------------------------------------------------------------------------------
1 | .selectize-dropdown-header {
2 | position: relative;
3 | padding: @selectize-padding-dropdown-item-y @selectize-padding-dropdown-item-x;
4 | border-bottom: 1px solid @selectize-color-border;
5 | background: mix(@selectize-color-dropdown, @selectize-color-border, 85%);
6 | .selectize-border-radius(@selectize-border-radius @selectize-border-radius 0 0);
7 | }
8 | .selectize-dropdown-header-close {
9 | position: absolute;
10 | right: @selectize-padding-dropdown-item-x;
11 | top: 50%;
12 | color: @selectize-color-text;
13 | opacity: 0.4;
14 | margin-top: -12px;
15 | line-height: 20px;
16 | font-size: 20px !important;
17 | }
18 | .selectize-dropdown-header-close:hover {
19 | color: darken(@selectize-color-text, 25%);
20 | }
--------------------------------------------------------------------------------
/public/vendor/selectize/less/plugins/optgroup_columns.less:
--------------------------------------------------------------------------------
1 | .selectize-dropdown.plugin-optgroup_columns {
2 | .optgroup {
3 | border-right: 1px solid #f2f2f2;
4 | border-top: 0 none;
5 | float: left;
6 | .selectize-box-sizing(border-box);
7 | }
8 | .optgroup:last-child {
9 | border-right: 0 none;
10 | }
11 | .optgroup:before {
12 | display: none;
13 | }
14 | .optgroup-header {
15 | border-top: 0 none;
16 | }
17 | }
--------------------------------------------------------------------------------
/public/vendor/selectize/less/plugins/remove_button.less:
--------------------------------------------------------------------------------
1 | .selectize-control.plugin-remove_button {
2 | [data-value] {
3 | position: relative;
4 | padding-right: 24px !important;
5 | }
6 | [data-value] .remove {
7 | position: absolute;
8 | top: 0;
9 | right: 0;
10 | bottom: 0;
11 | width: 17px;
12 | text-align: center;
13 | font-weight: bold;
14 | font-size: 12px;
15 | color: inherit;
16 | text-decoration: none;
17 | vertical-align: middle;
18 | display: inline-block;
19 | padding: @selectize-padding-item-y 0 0 0;
20 | border-left: 1px solid @selectize-color-item-border;
21 | .selectize-border-radius(0 2px 2px 0);
22 | .selectize-box-sizing(border-box);
23 | }
24 | [data-value] .remove:hover {
25 | background: rgba(0,0,0,0.05);
26 | }
27 | [data-value].active .remove {
28 | border-left-color: @selectize-color-item-active-border;
29 | }
30 | .disabled [data-value] .remove:hover {
31 | background: none;
32 | }
33 | .disabled [data-value] .remove {
34 | border-left-color: lighten(desaturate(@selectize-color-item-border, 100%), @selectize-lighten-disabled-item-border);
35 | }
36 | }
--------------------------------------------------------------------------------
/public/vendor/selectize/less/selectize.bootstrap2.less:
--------------------------------------------------------------------------------
1 | /**
2 | * selectize.bootstrap2.css (v0.8.5) - Bootstrap 2 Theme
3 | * Copyright (c) 2013 Brian Reavis & contributors
4 | *
5 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
6 | * file except in compliance with the License. You may obtain a copy of the License at:
7 | * http://www.apache.org/licenses/LICENSE-2.0
8 | *
9 | * Unless required by applicable law or agreed to in writing, software distributed under
10 | * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11 | * ANY KIND, either express or implied. See the License for the specific language
12 | * governing permissions and limitations under the License.
13 | *
14 | * @author Brian Reavis
15 | */
16 |
17 | @import "selectize";
18 |
19 | @selectize-font-family: @baseFontFamily;
20 | @selectize-font-size: @baseFontSize;
21 | @selectize-line-height: @baseLineHeight;
22 |
23 | @selectize-color-text: @textColor;
24 | @selectize-color-highlight: rgba(255,237,40,0.4);
25 | @selectize-color-input: @inputBackground;
26 | @selectize-color-input-full: @inputBackground;
27 | @selectize-color-disabled: @inputBackground;
28 | @selectize-color-item: @btnBackgroundHighlight;
29 | @selectize-color-item-border: @btnBorder;
30 | @selectize-color-item-active: @dropdownLinkBackgroundHover;
31 | @selectize-color-item-active-text: @dropdownLinkColorHover;
32 | @selectize-color-item-active-border: darken(@selectize-color-item-active, 5%);
33 | @selectize-color-optgroup: @dropdownBackground;
34 | @selectize-color-optgroup-text: @grayLight;
35 | @selectize-color-optgroup-border: @dropdownDividerTop;
36 | @selectize-color-dropdown: @dropdownBackground;
37 | @selectize-color-dropdown-border: @inputBorder;
38 | @selectize-color-dropdown-border-top: @dropdownDividerTop;
39 | @selectize-color-dropdown-item-active: @dropdownLinkBackgroundHover;
40 | @selectize-color-dropdown-item-active-text: @dropdownLinkColorHover;
41 | @selectize-color-dropdown-item-create-active-text: @dropdownLinkColorHover;
42 | @selectize-lighten-disabled-item: 8%;
43 | @selectize-lighten-disabled-item-text: 8%;
44 | @selectize-lighten-disabled-item-border: 8%;
45 | @selectize-opacity-disabled: 0.5;
46 | @selectize-shadow-input: none;
47 | @selectize-shadow-input-focus: inset 0 1px 2px rgba(0,0,0,0.15);
48 | @selectize-border-radius: @inputBorderRadius;
49 |
50 | @selectize-padding-x: 10px;
51 | @selectize-padding-y: 7px;
52 | @selectize-padding-dropdown-item-x: @selectize-padding-x;
53 | @selectize-padding-dropdown-item-y: 3px;
54 | @selectize-padding-item-x: 3px;
55 | @selectize-padding-item-y: 1px;
56 | @selectize-margin-item-x: 3px;
57 | @selectize-margin-item-y: 3px;
58 | @selectize-caret-margin: 0;
59 |
60 | @selectize-arrow-size: 5px;
61 | @selectize-arrow-color: @black;
62 | @selectize-arrow-offset: @selectize-padding-x + 5px;
63 |
64 | @selectize-width-item-border: 1px;
65 |
66 | .selectize-dropdown {
67 | margin: 2px 0 0 0;
68 | z-index: @zindexDropdown;
69 | border: 1px solid @dropdownBorder;
70 | border-radius: @baseBorderRadius;
71 | .box-shadow(0 5px 10px rgba(0,0,0,.2));
72 |
73 | .optgroup-header {
74 | font-size: 11px;
75 | font-weight: bold;
76 | text-shadow: 0 1px 0 rgba(255,255,255,.5);
77 | text-transform: uppercase;
78 | }
79 | .optgroup:first-child:before {
80 | display: none;
81 | }
82 | .optgroup:before {
83 | content: ' ';
84 | display: block;
85 | .nav-divider();
86 | margin-left: @selectize-padding-dropdown-item-x * -1;
87 | margin-right: @selectize-padding-dropdown-item-x * -1;
88 | }
89 |
90 | [data-selectable].active {
91 | #gradient > .vertical(@dropdownLinkBackgroundHover, darken(@dropdownLinkBackgroundHover, 5%));
92 | }
93 | }
94 |
95 | .selectize-dropdown-content {
96 | padding: 5px 0;
97 | }
98 |
99 | .selectize-dropdown-header {
100 | padding: @selectize-padding-dropdown-item-y * 2 @selectize-padding-dropdown-item-x;
101 | }
102 |
103 | .selectize-input {
104 | .transition(~"border linear .2s, box-shadow linear .2s");
105 |
106 | &.dropdown-active {
107 | .selectize-border-radius(@selectize-border-radius);
108 | }
109 | &.dropdown-active::before {
110 | display: none;
111 | }
112 | &.input-active, &.input-active:hover, .selectize-control.multi &.focus {
113 | background: @selectize-color-input !important;
114 | border-color: rgba(82,168,236,.8) !important;
115 | outline: 0 !important;
116 | outline: thin dotted \9 !important;
117 | .box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6)") !important;
118 | }
119 | }
120 |
121 | .selectize-control {
122 | &.single {
123 | .selectize-input {
124 | .buttonBackground(@btnBackground, @btnBackgroundHighlight, @grayDark, 0 1px 1px rgba(255,255,255,.75));
125 | .box-shadow(~"inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)");
126 | &:hover {
127 | color: @grayDark;
128 | text-decoration: none;
129 | background-position: 0 -15px;
130 | .transition(background-position .1s linear);
131 | }
132 | &.disabled {
133 | background: @btnBackgroundHighlight !important;
134 | .box-shadow(none);
135 | }
136 | }
137 | }
138 | &.multi {
139 | .selectize-input {
140 | .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
141 | &.has-items {
142 | @padding-x: @selectize-padding-x - @selectize-padding-item-x;
143 | padding-left: @padding-x;
144 | padding-right: @padding-x;
145 | }
146 | }
147 | .selectize-input > div {
148 | .gradientBar(@btnBackground, @btnBackgroundHighlight, @selectize-color-item-text, none);
149 | *background-color: @selectize-color-item;
150 | border: @selectize-width-item-border solid @selectize-color-item-border;
151 | .border-radius(@baseBorderRadius);
152 | .box-shadow(~"inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)");
153 | &.active {
154 | .box-shadow(~"0 1px 2px rgba(0,0,0,.05)");
155 | .gradientBar(@selectize-color-item-active, @selectize-color-item-active-border, @selectize-color-item-active-text, none);
156 | *background-color: @selectize-color-item-active;
157 | border: @selectize-width-item-border solid @dropdownLinkBackgroundHover;
158 | }
159 | }
160 | }
161 | }
--------------------------------------------------------------------------------
/public/vendor/selectize/less/selectize.bootstrap3.less:
--------------------------------------------------------------------------------
1 | /**
2 | * selectize.bootstrap3.css (v0.8.5) - Bootstrap 3 Theme
3 | * Copyright (c) 2013 Brian Reavis & contributors
4 | *
5 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
6 | * file except in compliance with the License. You may obtain a copy of the License at:
7 | * http://www.apache.org/licenses/LICENSE-2.0
8 | *
9 | * Unless required by applicable law or agreed to in writing, software distributed under
10 | * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11 | * ANY KIND, either express or implied. See the License for the specific language
12 | * governing permissions and limitations under the License.
13 | *
14 | * @author Brian Reavis
15 | */
16 |
17 | @import "selectize";
18 |
19 | @selectize-font-family: @font-family-base;
20 | @selectize-font-size: @font-size-base;
21 | @selectize-line-height: @line-height-computed;
22 |
23 | @selectize-color-text: @text-color;
24 | @selectize-color-highlight: rgba(255,237,40,0.4);
25 | @selectize-color-input: @input-bg;
26 | @selectize-color-input-full: @input-bg;
27 | @selectize-color-disabled: @input-bg;
28 | @selectize-color-item: #efefef;
29 | @selectize-color-item-border: rgba(0,0,0,0);
30 | @selectize-color-item-active: @component-active-bg;
31 | @selectize-color-item-active-text: #fff;
32 | @selectize-color-item-active-border: rgba(0,0,0,0);
33 | @selectize-color-optgroup: @dropdown-bg;
34 | @selectize-color-optgroup-text: @dropdown-header-color;
35 | @selectize-color-optgroup-border: @dropdown-divider-bg;
36 | @selectize-color-dropdown: @dropdown-bg;
37 | @selectize-color-dropdown-border-top: mix(@input-border, @input-bg, 0.8);
38 | @selectize-color-dropdown-item-active: @dropdown-link-hover-bg;
39 | @selectize-color-dropdown-item-active-text: @dropdown-link-hover-color;
40 | @selectize-color-dropdown-item-create-active-text: @dropdown-link-hover-color;
41 | @selectize-opacity-disabled: 0.5;
42 | @selectize-shadow-input: none;
43 | @selectize-shadow-input-focus: inset 0 1px 2px rgba(0,0,0,0.15);
44 | @selectize-border: 1px solid @input-border;
45 | @selectize-border-radius: @input-border-radius;
46 |
47 | @selectize-width-item-border: 0;
48 | @selectize-padding-x: @padding-base-horizontal;
49 | @selectize-padding-y: @padding-base-vertical;
50 | @selectize-padding-dropdown-item-x: @padding-base-horizontal;
51 | @selectize-padding-dropdown-item-y: 3px;
52 | @selectize-padding-item-x: 3px;
53 | @selectize-padding-item-y: 1px;
54 | @selectize-margin-item-x: 3px;
55 | @selectize-margin-item-y: 3px;
56 | @selectize-caret-margin: 0;
57 |
58 | @selectize-arrow-size: 5px;
59 | @selectize-arrow-color: @dropdown-caret-color;
60 | @selectize-arrow-offset: @selectize-padding-x + 5px;
61 |
62 | .selectize-dropdown, .selectize-dropdown.form-control {
63 | height: auto;
64 | padding: 0;
65 | margin: 2px 0 0 0;
66 | z-index: @zindex-dropdown;
67 | background: @selectize-color-dropdown;
68 | border: 1px solid @dropdown-fallback-border;
69 | border: 1px solid @dropdown-border;
70 | .selectize-border-radius(@border-radius-base);
71 | .selectize-box-shadow(0 6px 12px rgba(0,0,0,.175));
72 | }
73 |
74 | .selectize-dropdown {
75 | .optgroup-header {
76 | font-size: @font-size-small;
77 | line-height: @line-height-base;
78 | }
79 | .optgroup:first-child:before {
80 | display: none;
81 | }
82 | .optgroup:before {
83 | content: ' ';
84 | display: block;
85 | .nav-divider();
86 | margin-left: @selectize-padding-dropdown-item-x * -1;
87 | margin-right: @selectize-padding-dropdown-item-x * -1;
88 | }
89 | }
90 |
91 | .selectize-dropdown-content {
92 | padding: 5px 0;
93 | }
94 |
95 | .selectize-dropdown-header {
96 | padding: @selectize-padding-dropdown-item-y * 2 @selectize-padding-dropdown-item-x;
97 | }
98 |
99 | .selectize-input {
100 | min-height: @input-height-base;
101 |
102 | &.dropdown-active {
103 | .selectize-border-radius(@selectize-border-radius);
104 | }
105 | &.dropdown-active::before {
106 | display: none;
107 | }
108 | &.focus {
109 | @color: @input-border-focus;
110 | @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);
111 | border-color: @color;
112 | outline: 0;
113 | .selectize-box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}");
114 | }
115 | }
116 |
117 | .selectize-control {
118 | &.multi {
119 | .selectize-input.has-items {
120 | padding-left: @selectize-padding-x - @selectize-padding-item-x;
121 | padding-right: @selectize-padding-x - @selectize-padding-item-x;
122 | }
123 | .selectize-input > div {
124 | .selectize-border-radius(@selectize-border-radius - 1px);
125 | }
126 | }
127 | }
128 |
129 | .form-control.selectize-control {
130 | padding: 0;
131 | height: auto;
132 | border: none;
133 | background: none;
134 | .selectize-box-shadow(none);
135 | .selectize-border-radius(0);
136 | }
--------------------------------------------------------------------------------
/public/vendor/selectize/less/selectize.default.less:
--------------------------------------------------------------------------------
1 | /**
2 | * selectize.default.css (v0.8.5) - Default Theme
3 | * Copyright (c) 2013 Brian Reavis & contributors
4 | *
5 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
6 | * file except in compliance with the License. You may obtain a copy of the License at:
7 | * http://www.apache.org/licenses/LICENSE-2.0
8 | *
9 | * Unless required by applicable law or agreed to in writing, software distributed under
10 | * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11 | * ANY KIND, either express or implied. See the License for the specific language
12 | * governing permissions and limitations under the License.
13 | *
14 | * @author Brian Reavis
15 | */
16 |
17 | @import "selectize";
18 |
19 | @selectize-color-item: #1da7ee;
20 | @selectize-color-item-text: #fff;
21 | @selectize-color-item-active-text: #fff;
22 | @selectize-color-item-border: #0073bb;
23 | @selectize-color-item-active: #92c836;
24 | @selectize-color-item-active-border: #00578d;
25 | @selectize-width-item-border: 1px;
26 | @selectize-caret-margin: 0 1px;
27 |
28 | .selectize-control {
29 | &.multi {
30 | .selectize-input {
31 | &.has-items {
32 | @padding-x: @selectize-padding-x - 3px;
33 | padding-left: @padding-x;
34 | padding-right: @padding-x;
35 | }
36 | &.disabled [data-value] {
37 | color: #999;
38 | text-shadow: none;
39 | background: none;
40 | .selectize-box-shadow(none);
41 |
42 | &, .remove {
43 | border-color: #e6e6e6;
44 | }
45 | .remove {
46 | background: none;
47 | }
48 | }
49 | [data-value] {
50 | text-shadow: 0 1px 0 rgba(0,51,83,0.3);
51 | .selectize-border-radius(3px);
52 | .selectize-vertical-gradient(#1da7ee, #178ee9);
53 | .selectize-box-shadow(~"0 1px 0 rgba(0,0,0,0.2),inset 0 1px rgba(255,255,255,0.03)");
54 | &.active {
55 | .selectize-vertical-gradient(#008fd8, #0075cf);
56 | }
57 | }
58 | }
59 | }
60 | &.single {
61 | .selectize-input {
62 | .selectize-box-shadow(~"0 1px 0 rgba(0,0,0,0.05), inset 0 1px 0 rgba(255,255,255,0.8)");
63 | .selectize-vertical-gradient(#fefefe, #f2f2f2);
64 | }
65 | }
66 | }
67 |
68 | .selectize-control.single .selectize-input, .selectize-dropdown.single {
69 | border-color: #b8b8b8;
70 | }
71 |
72 | .selectize-dropdown {
73 | .optgroup-header {
74 | padding-top: @selectize-padding-dropdown-item-y + 2px;
75 | font-weight: bold;
76 | font-size: 0.85em;
77 | }
78 | .optgroup {
79 | border-top: 1px solid @selectize-color-dropdown-border-top;
80 | &:first-child {
81 | border-top: 0 none;
82 | }
83 | }
84 | }
--------------------------------------------------------------------------------
/public/vendor/selectize/less/selectize.legacy.less:
--------------------------------------------------------------------------------
1 | /**
2 | * selectize.legacy.css (v0.8.5) - Default Theme
3 | * Copyright (c) 2013 Brian Reavis & contributors
4 | *
5 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
6 | * file except in compliance with the License. You may obtain a copy of the License at:
7 | * http://www.apache.org/licenses/LICENSE-2.0
8 | *
9 | * Unless required by applicable law or agreed to in writing, software distributed under
10 | * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11 | * ANY KIND, either express or implied. See the License for the specific language
12 | * governing permissions and limitations under the License.
13 | *
14 | * @author Brian Reavis
15 | */
16 |
17 | @import "selectize";
18 |
19 | @selectize-font-size: 13px;
20 | @selectize-line-height: 20px;
21 |
22 | @selectize-color-input-full: #f2f2f2;
23 | @selectize-color-item: #b8e76f;
24 | @selectize-color-item-text: #3d5d18;
25 | @selectize-color-item-border: #74b21e;
26 | @selectize-color-item-active: #92c836;
27 | @selectize-color-item-active-border: #6f9839;
28 | @selectize-color-highlight: rgba(255,237,40,0.4);
29 | @selectize-color-dropdown-item-active: #fffceb;
30 | @selectize-color-dropdown-item-active-text: @selectize-color-text;
31 | @selectize-color-optgroup: #f8f8f8;
32 | @selectize-color-optgroup-text: @selectize-color-text;
33 | @selectize-width-item-border: 1px;
34 |
35 | @selectize-padding-x: 10px;
36 | @selectize-padding-y: 10px;
37 | @selectize-padding-item-x: 5px;
38 | @selectize-padding-item-y: 1px;
39 | @selectize-padding-dropdown-item-x: 10px;
40 | @selectize-padding-dropdown-item-y: 7px;
41 | @selectize-margin-item-x: 4px;
42 | @selectize-margin-item-y: 4px;
43 |
44 | .selectize-control {
45 | &.multi {
46 | .selectize-input [data-value] {
47 | text-shadow: 0 1px 0 rgba(255,255,255,0.1);
48 | .selectize-border-radius(3px);
49 | .selectize-vertical-gradient(#b8e76f, #a9e25c);
50 | .selectize-box-shadow(0 1px 1px rgba(0,0,0,0.1));
51 | &.active {
52 | .selectize-vertical-gradient(#92c836, #7abc2c);
53 | }
54 | }
55 | }
56 | &.single {
57 | .selectize-input {
58 | .selectize-box-shadow(~"inset 0 1px 0 rgba(255,255,255,0.8), 0 2px 0 #e0e0e0, 0 3px 0 #c8c8c8, 0 4px 1px rgba(0,0,0,0.1)");
59 | .selectize-vertical-gradient(#f5f5f5, #efefef);
60 | }
61 | }
62 | }
63 |
64 | .selectize-control.single .selectize-input, .selectize-dropdown.single {
65 | border-color: #b8b8b8;
66 | }
67 |
68 | .selectize-dropdown {
69 | .optgroup-header {
70 | font-weight: bold;
71 | font-size: 0.8em;
72 | border-bottom: 1px solid @selectize-color-dropdown-border-top;
73 | border-top: 1px solid @selectize-color-dropdown-border-top;
74 | }
75 | }
--------------------------------------------------------------------------------
/public/vendor/selectize/less/selectize.less:
--------------------------------------------------------------------------------
1 | @import "plugins/drag_drop";
2 | @import "plugins/dropdown_header";
3 | @import "plugins/optgroup_columns";
4 | @import "plugins/remove_button";
5 |
6 | // base styles
7 |
8 | @selectize-font-family: inherit;
9 | @selectize-font-smoothing: inherit;
10 | @selectize-font-size: 13px;
11 | @selectize-line-height: 18px;
12 |
13 | @selectize-color-text: #303030;
14 | @selectize-color-border: #d0d0d0;
15 | @selectize-color-highlight: rgba(125,168,208,0.2);
16 | @selectize-color-input: #fff;
17 | @selectize-color-input-full: @selectize-color-input;
18 | @selectize-color-disabled: #fafafa;
19 | @selectize-color-item: #f2f2f2;
20 | @selectize-color-item-text: @selectize-color-text;
21 | @selectize-color-item-border: #d0d0d0;
22 | @selectize-color-item-active: #e8e8e8;
23 | @selectize-color-item-active-text: @selectize-color-text;
24 | @selectize-color-item-active-border: #cacaca;
25 | @selectize-color-dropdown: #fff;
26 | @selectize-color-dropdown-border: @selectize-color-border;
27 | @selectize-color-dropdown-border-top: #f0f0f0;
28 | @selectize-color-dropdown-item-active: #f5fafd;
29 | @selectize-color-dropdown-item-active-text: #495c68;
30 | @selectize-color-dropdown-item-create-text: rgba(red(@selectize-color-text), green(@selectize-color-text), blue(@selectize-color-text), 0.5);
31 | @selectize-color-dropdown-item-create-active-text: @selectize-color-dropdown-item-active-text;
32 | @selectize-color-optgroup: @selectize-color-dropdown;
33 | @selectize-color-optgroup-text: @selectize-color-text;
34 | @selectize-lighten-disabled-item: 30%;
35 | @selectize-lighten-disabled-item-text: 30%;
36 | @selectize-lighten-disabled-item-border: 30%;
37 | @selectize-opacity-disabled: 0.5;
38 |
39 | @selectize-shadow-input: inset 0 1px 1px rgba(0,0,0,0.1);
40 | @selectize-shadow-input-focus: inset 0 1px 2px rgba(0,0,0,0.15);
41 | @selectize-border: 1px solid @selectize-color-border;
42 | @selectize-border-radius: 3px;
43 |
44 | @selectize-width-item-border: 0;
45 | @selectize-max-height-dropdown: 200px;
46 |
47 | @selectize-padding-x: 8px;
48 | @selectize-padding-y: 8px;
49 | @selectize-padding-item-x: 6px;
50 | @selectize-padding-item-y: 2px;
51 | @selectize-padding-dropdown-item-x: @selectize-padding-x;
52 | @selectize-padding-dropdown-item-y: 5px;
53 | @selectize-margin-item-x: 3px;
54 | @selectize-margin-item-y: 3px;
55 |
56 | @selectize-arrow-size: 5px;
57 | @selectize-arrow-color: #808080;
58 | @selectize-arrow-offset: 15px;
59 |
60 | @selectize-caret-margin: 0 2px 0 0;
61 | @selectize-caret-margin-rtl: 0 4px 0 -2px;
62 |
63 | .selectize-border-radius (@radii) {
64 | -webkit-border-radius: @radii;
65 | -moz-border-radius: @radii;
66 | border-radius: @radii;
67 | }
68 | .selectize-unselectable () {
69 | -webkit-user-select: none;
70 | -moz-user-select: none;
71 | -ms-user-select: none;
72 | user-select: none;
73 | }
74 | .selectize-box-shadow (@shadow) {
75 | -webkit-box-shadow: @shadow;
76 | box-shadow: @shadow;
77 | }
78 | .selectize-box-sizing (@type: border-box) {
79 | -webkit-box-sizing: @type;
80 | -moz-box-sizing: @type;
81 | box-sizing: @type;
82 | }
83 | .selectize-vertical-gradient (@color-top, @color-bottom) {
84 | background-color: mix(@color-top, @color-bottom, 60%);
85 | background-image: -moz-linear-gradient(top, @color-top, @color-bottom); // FF 3.6+
86 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@color-top), to(@color-bottom)); // Safari 4+, Chrome 2+
87 | background-image: -webkit-linear-gradient(top, @color-top, @color-bottom); // Safari 5.1+, Chrome 10+
88 | background-image: -o-linear-gradient(top, @color-top, @color-bottom); // Opera 11.10
89 | background-image: linear-gradient(to bottom, @color-top, @color-bottom); // Standard, IE10
90 | background-repeat: repeat-x;
91 | filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@color-top),argb(@color-bottom))); // IE9 and down
92 | }
93 |
94 | .selectize-control {
95 | position: relative;
96 | }
97 |
98 | .selectize-dropdown, .selectize-input, .selectize-input input {
99 | color: @selectize-color-text;
100 | font-family: @selectize-font-family;
101 | font-size: @selectize-font-size;
102 | line-height: @selectize-line-height;
103 | -webkit-font-smoothing: @selectize-font-smoothing;
104 | }
105 |
106 | .selectize-input, .selectize-control.single .selectize-input.input-active {
107 | background: @selectize-color-input;
108 | cursor: text;
109 | display: inline-block;
110 | }
111 |
112 | .selectize-input {
113 | border: @selectize-border;
114 | padding: @selectize-padding-y @selectize-padding-x;
115 | display: inline-block;
116 | width: 100%;
117 | overflow: hidden;
118 | position: relative;
119 | z-index: 1;
120 | .selectize-box-sizing(border-box);
121 | .selectize-box-shadow(@selectize-shadow-input);
122 | .selectize-border-radius(@selectize-border-radius);
123 |
124 | .selectize-control.multi &.has-items {
125 | @padding-x: @selectize-padding-x;
126 | @padding-top: @selectize-padding-y - @selectize-padding-item-y - @selectize-width-item-border;
127 | @padding-bottom: @selectize-padding-y - @selectize-padding-item-y - @selectize-margin-item-y - @selectize-width-item-border;
128 | padding: @padding-top @padding-x @padding-bottom;
129 | }
130 |
131 | &.full {
132 | background-color: @selectize-color-input-full;
133 | }
134 | &.disabled, &.disabled * {
135 | cursor: default !important;
136 | }
137 | &.focus {
138 | .selectize-box-shadow(@selectize-shadow-input-focus);
139 | }
140 | &.dropdown-active {
141 | .selectize-border-radius(@selectize-border-radius @selectize-border-radius 0 0);
142 | }
143 |
144 | > * {
145 | vertical-align: baseline;
146 | display: -moz-inline-stack;
147 | display: inline-block;
148 | zoom: 1;
149 | *display: inline;
150 | }
151 | .selectize-control.multi & > div {
152 | cursor: pointer;
153 | margin: 0 @selectize-margin-item-x @selectize-margin-item-y 0;
154 | padding: @selectize-padding-item-y @selectize-padding-item-x;
155 | background: @selectize-color-item;
156 | color: @selectize-color-item-text;
157 | border: @selectize-width-item-border solid @selectize-color-item-border;
158 |
159 | &.active {
160 | background: @selectize-color-item-active;
161 | color: @selectize-color-item-active-text;
162 | border: @selectize-width-item-border solid @selectize-color-item-active-border;
163 | }
164 | }
165 | .selectize-control.multi &.disabled > div {
166 | &, &.active {
167 | color: lighten(desaturate(@selectize-color-item-text, 100%), @selectize-lighten-disabled-item-text);
168 | background: lighten(desaturate(@selectize-color-item, 100%), @selectize-lighten-disabled-item);
169 | border: @selectize-width-item-border solid lighten(desaturate(@selectize-color-item-border, 100%), @selectize-lighten-disabled-item-border);
170 | }
171 | }
172 | > input {
173 | padding: 0 !important;
174 | min-height: 0 !important;
175 | max-height: none !important;
176 | max-width: 100% !important;
177 | margin: @selectize-caret-margin !important;
178 | text-indent: 0 !important;
179 | border: 0 none !important;
180 | background: none !important;
181 | line-height: inherit !important;
182 | -webkit-user-select: auto !important;
183 | .selectize-box-shadow(none) !important;
184 | &:focus { outline: none !important; }
185 | }
186 | }
187 |
188 | .selectize-input::after {
189 | content: ' ';
190 | display: block;
191 | clear: left;
192 | }
193 |
194 | .selectize-input.dropdown-active::before {
195 | content: ' ';
196 | display: block;
197 | position: absolute;
198 | background: @selectize-color-dropdown-border-top;
199 | height: 1px;
200 | bottom: 0;
201 | left: 0;
202 | right: 0;
203 | }
204 |
205 | .selectize-dropdown {
206 | position: absolute;
207 | z-index: 10;
208 | border: @selectize-border;
209 | background: @selectize-color-dropdown;
210 | margin: -1px 0 0 0;
211 | border-top: 0 none;
212 | .selectize-box-sizing(border-box);
213 | .selectize-box-shadow(0 1px 3px rgba(0,0,0,0.1));
214 | .selectize-border-radius(0 0 @selectize-border-radius @selectize-border-radius);
215 |
216 | [data-selectable] {
217 | cursor: pointer;
218 | overflow: hidden;
219 | .highlight {
220 | background: @selectize-color-highlight;
221 | .selectize-border-radius(1px);
222 | }
223 | }
224 | [data-selectable], .optgroup-header {
225 | padding: @selectize-padding-dropdown-item-y @selectize-padding-dropdown-item-x;
226 | }
227 | .optgroup:first-child .optgroup-header {
228 | border-top: 0 none;
229 | }
230 | .optgroup-header {
231 | color: @selectize-color-optgroup-text;
232 | background: @selectize-color-optgroup;
233 | cursor: default;
234 | }
235 | .active {
236 | background-color: @selectize-color-dropdown-item-active;
237 | color: @selectize-color-dropdown-item-active-text;
238 | &.create {
239 | color: @selectize-color-dropdown-item-create-active-text;
240 | }
241 | }
242 | .create {
243 | color: @selectize-color-dropdown-item-create-text;
244 | }
245 | }
246 |
247 | .selectize-dropdown-content {
248 | overflow-y: auto;
249 | overflow-x: hidden;
250 | max-height: @selectize-max-height-dropdown;
251 | }
252 |
253 | .selectize-control.single .selectize-input {
254 | &, input { cursor: pointer; }
255 | &.input-active, &.input-active input { cursor: text; }
256 |
257 | &:after {
258 | content: ' ';
259 | display: block;
260 | position: absolute;
261 | top: 50%;
262 | right: @selectize-arrow-offset;
263 | margin-top: round(-@selectize-arrow-size / 2);
264 | width: 0;
265 | height: 0;
266 | border-style: solid;
267 | border-width: @selectize-arrow-size @selectize-arrow-size 0 @selectize-arrow-size;
268 | border-color: @selectize-arrow-color transparent transparent transparent;
269 | }
270 | &.dropdown-active:after {
271 | margin-top: @selectize-arrow-size * -0.8;
272 | border-width: 0 @selectize-arrow-size @selectize-arrow-size @selectize-arrow-size;
273 | border-color: transparent transparent @selectize-arrow-color transparent;
274 | }
275 | }
276 |
277 | .selectize-control.rtl {
278 | &.single .selectize-input:after {
279 | left: @selectize-arrow-offset;
280 | right: auto;
281 | }
282 | .selectize-input > input {
283 | margin: @selectize-caret-margin-rtl !important;
284 | }
285 | }
286 |
287 | .selectize-control .selectize-input.disabled {
288 | opacity: @selectize-opacity-disabled;
289 | background-color: @selectize-color-disabled;
290 | }
291 |
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 | ## Laravel Backbone - based in-place pagination demo Store application
2 |
3 | See demo at: http://demos.maxoffsky.com/ajax-pagination/
4 | Tutorial at: http://maxoffsky.com/code-blog/in-place-pagination-using-backbone-js-laravel-shop-tutorial
5 |
6 | This application demonstrates usage of [Backbone Paginator](http://backbone-paginator.github.io/backbone.paginator/) Backbone.js plugin to provide the user with nice seamless pagination without a page refresh:
7 | 
8 |
9 | The pagination API controller is in app/controllers/Api/ProductsController.php
10 | The page using Backbone and pagination is in app/views/index.blade.php
11 |
12 | ### Installation instructions:
13 | - Download this repo
14 | - Set up a MySQL DB named 'shop-pagination' and import install.sql file into it, make sure you edit credentials in app/config/database.php to match yours
15 | - Open up terminal and CD into the folder of this repo
16 | - Run "php artisan serve" to run the application
17 | - Open up the browser and navigate to "localhost:8000" to see it in action
18 |
19 | ### Star this repo!
20 |
21 | The more people star my repos - the more I will give back to the community.
22 |
23 | ### Read more on my blog and follow on Twitter
24 |
25 | I post tutorials all the time on my blog : http://maxoffsky.com, stay updated on my Twitter: http://twitter.com/msurguy
26 |
27 | ### License
28 |
29 | The Laravel backbone pagination is open-sourced software licensed under the [MIT license](http://opensource.org/licenses/MIT)
30 |
--------------------------------------------------------------------------------
/server.php:
--------------------------------------------------------------------------------
1 |