├── .gitignore
├── .travis.yml
├── Command
└── JordiLlonchCrudCommand.php
├── Controller
└── DefaultController.php
├── DependencyInjection
├── Configuration.php
└── JordiLlonchCrudGeneratorExtension.php
├── Generator
└── JordiLlonchCrudGenerator.php
├── JordiLlonchCrudGeneratorBundle.php
├── LICENSE
├── README.md
├── Resources
├── config
│ ├── routing.yml
│ └── services.yml
├── public
│ ├── css
│ │ ├── bootstrap-responsive.css
│ │ ├── bootstrap-responsive.min.css
│ │ ├── bootstrap.css
│ │ ├── bootstrap.min.css
│ │ └── crud.css
│ ├── img
│ │ ├── glyphicons-halflings-white.png
│ │ └── glyphicons-halflings.png
│ └── js
│ │ ├── bootstrap.js
│ │ ├── bootstrap.min.js
│ │ └── jquery.min.js
├── skeleton
│ ├── crud
│ │ ├── actions
│ │ │ ├── create.php.twig
│ │ │ ├── delete.php.twig
│ │ │ ├── edit.php.twig
│ │ │ ├── index.php.twig
│ │ │ ├── new.php.twig
│ │ │ ├── show.php.twig
│ │ │ └── update.php.twig
│ │ ├── config
│ │ │ ├── routing.php.twig
│ │ │ ├── routing.xml.twig
│ │ │ └── routing.yml.twig
│ │ ├── controller.php.twig
│ │ ├── tests
│ │ │ ├── others
│ │ │ │ ├── full_scenario.php.twig
│ │ │ │ └── short_scenario.php.twig
│ │ │ └── test.php.twig
│ │ └── views
│ │ │ ├── edit.html.twig.twig
│ │ │ ├── index.html.twig.twig
│ │ │ ├── new.html.twig.twig
│ │ │ ├── others
│ │ │ ├── actions.html.twig.twig
│ │ │ └── record_actions.html.twig.twig
│ │ │ └── show.html.twig.twig
│ └── form
│ │ ├── FormFilterType.php.twig
│ │ └── FormType.php.twig
├── translations
│ ├── JordiLlonchCrudGeneratorBundle.ca.yml
│ ├── JordiLlonchCrudGeneratorBundle.en.yml
│ ├── JordiLlonchCrudGeneratorBundle.es.yml
│ ├── JordiLlonchCrudGeneratorBundle.fr.yml
│ ├── JordiLlonchCrudGeneratorBundle.pl.yml
│ └── JordiLlonchCrudGeneratorBundle.pt_BR.yml
└── views
│ └── layout.html.twig
├── Tests
├── Command
│ └── JordiLlonchCrudCommandTest.php
├── Generator
│ ├── JordiLlonchCrudGeneratorTest.php
│ └── JordiLlonchFormGeneratorTest.php
└── bootstrap.php
├── composer.json
├── phpunit.xml.dist
└── screenshot.png
/.gitignore:
--------------------------------------------------------------------------------
1 | vendor
2 | composer.lock
3 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: php
2 |
3 | php:
4 | - 5.3
5 | - 5.4
6 | - 5.5
7 |
8 | before_script:
9 | - wget http://getcomposer.org/composer.phar
10 | - php composer.phar --dev install
11 |
--------------------------------------------------------------------------------
/Command/JordiLlonchCrudCommand.php:
--------------------------------------------------------------------------------
1 |
9 | *
10 | * For the full copyright and license information, please view the LICENSE
11 | * file that was distributed with this source code.
12 | */
13 |
14 | namespace JordiLlonch\Bundle\CrudGeneratorBundle\Command;
15 |
16 | use JordiLlonch\Bundle\CrudGeneratorBundle\Generator\JordiLlonchCrudGenerator;
17 | use Sensio\Bundle\GeneratorBundle\Command\GenerateDoctrineCrudCommand;
18 | use Symfony\Component\Console\Input\InputInterface;
19 | use Symfony\Component\Console\Output\OutputInterface;
20 | use Symfony\Component\HttpKernel\Bundle\BundleInterface;
21 |
22 |
23 | class JordiLlonchCrudCommand extends GenerateDoctrineCrudCommand
24 | {
25 | protected $generator;
26 | protected $formGenerator;
27 |
28 | protected function configure()
29 | {
30 | parent::configure();
31 |
32 | $this->setName('jordillonch:generate:crud');
33 | $this->setDescription('A CRUD generator with paginating and filters.');
34 | }
35 |
36 | protected function createGenerator($bundle = null)
37 | {
38 | return new JordiLlonchCrudGenerator($this->getContainer()->get('filesystem'), $this->getContainer()->get('kernel')->getRootDir());
39 | }
40 |
41 | protected function getSkeletonDirs(BundleInterface $bundle = null)
42 | {
43 | $skeletonDirs = array();
44 |
45 | if (isset($bundle) && is_dir($dir = $bundle->getPath().'/Resources/SensioGeneratorBundle/skeleton')) {
46 | $skeletonDirs[] = $dir;
47 | }
48 |
49 | if (is_dir($dir = $this->getContainer()->get('kernel')->getRootdir().'/Resources/SensioGeneratorBundle/skeleton')) {
50 | $skeletonDirs[] = $dir;
51 | }
52 |
53 | $skeletonDirs[] = $this->getContainer()->get('kernel')->locateResource('@JordiLlonchCrudGeneratorBundle/Resources/skeleton');
54 | $skeletonDirs[] = $this->getContainer()->get('kernel')->locateResource('@JordiLlonchCrudGeneratorBundle/Resources');
55 |
56 | return $skeletonDirs;
57 | }
58 |
59 | protected function interact(InputInterface $input, OutputInterface $output)
60 | {
61 | if(method_exists($this, 'getDialogHelper') ) {
62 | $dialog = $this->getDialogHelper();
63 | } else {
64 | $dialog = $this->getQuestionHelper();
65 | }
66 |
67 | $dialog->writeSection($output, 'JordiLlonchCrudGeneratorBundle');
68 |
69 | parent::interact($input, $output);
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/Controller/DefaultController.php:
--------------------------------------------------------------------------------
1 | render('JordiLlonchCrudGeneratorBundle:Default:index.html.twig', array('name' => $name));
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/DependencyInjection/Configuration.php:
--------------------------------------------------------------------------------
1 | root('jordi_llonch_crud_generator');
22 |
23 | // Here you should define the parameters that are allowed to
24 | // configure your bundle. See the documentation linked above for
25 | // more information on that topic.
26 |
27 | return $treeBuilder;
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/DependencyInjection/JordiLlonchCrudGeneratorExtension.php:
--------------------------------------------------------------------------------
1 | processConfiguration($configuration, $configs);
24 |
25 | $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
26 | $loader->load('services.yml');
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/Generator/JordiLlonchCrudGenerator.php:
--------------------------------------------------------------------------------
1 |
8 | *
9 | * For the full copyright and license information, please view the LICENSE
10 | * file that was distributed with this source code.
11 | */
12 |
13 | namespace JordiLlonch\Bundle\CrudGeneratorBundle\Generator;
14 |
15 | use Sensio\Bundle\GeneratorBundle\Generator\DoctrineCrudGenerator;
16 | use Symfony\Component\HttpKernel\Bundle\BundleInterface;
17 | use Doctrine\ORM\Mapping\ClassMetadataInfo;
18 |
19 | class JordiLlonchCrudGenerator extends DoctrineCrudGenerator
20 | {
21 | protected $formFilterGenerator;
22 |
23 | public function generate(BundleInterface $bundle, $entity, ClassMetadataInfo $metadata, $format, $routePrefix, $needWriteActions, $forceOverwrite)
24 | {
25 | parent::generate($bundle, $entity, $metadata, $format, $routePrefix, $needWriteActions, $forceOverwrite);
26 |
27 | $this->generateFormFilter($bundle, $entity, $metadata, $forceOverwrite);
28 | }
29 |
30 | /**
31 | * Generates the entity form class if it does not exist.
32 | *
33 | * @param BundleInterface $bundle The bundle in which to create the class
34 | * @param string $entity The entity relative class name
35 | * @param ClassMetadataInfo $metadata The entity metadata class
36 | * @param $forceOverwrite
37 | *
38 | * @throws \RuntimeException
39 | */
40 | public function generateFormFilter(BundleInterface $bundle, $entity, ClassMetadataInfo $metadata, $forceOverwrite)
41 | {
42 | $parts = explode('\\', $entity);
43 | $entityClass = array_pop($parts);
44 |
45 | $this->className = $entityClass.'FilterType';
46 | $dirPath = $bundle->getPath().'/Form';
47 | $this->classPath = $dirPath.'/'.str_replace('\\', '/', $entity).'FilterType.php';
48 |
49 | if (!$forceOverwrite && file_exists($this->classPath)) {
50 | throw new \RuntimeException(sprintf('Unable to generate the %s form class as it already exists under the %s file', $this->className, $this->classPath));
51 | }
52 |
53 | if (count($metadata->identifier) > 1) {
54 | throw new \RuntimeException('The form generator does not support entity classes with multiple primary keys.');
55 | }
56 |
57 | $parts = explode('\\', $entity);
58 | array_pop($parts);
59 |
60 | $this->renderFile('form/FormFilterType.php.twig', $this->classPath, array(
61 | 'fields_data' => $this->getFieldsDataFromMetadata($metadata),
62 | 'namespace' => $bundle->getNamespace(),
63 | 'entity_namespace' => implode('\\', $parts),
64 | 'entity_class' => $entityClass,
65 | 'bundle' => $bundle->getName(),
66 | 'form_class' => $this->className,
67 | 'form_filter_type_name' => strtolower(str_replace('\\', '_', $bundle->getNamespace()).($parts ? '_' : '').implode('_', $parts).'_'.$this->className),
68 | ));
69 | }
70 |
71 | public function getFilterType($dbType, $columnName)
72 | {
73 | switch ($dbType) {
74 | case 'boolean':
75 | return 'filter_boolean';
76 | case 'datetime':
77 | case 'vardatetime':
78 | case 'datetimetz':
79 | return 'filter_date_range';
80 | case 'date':
81 | return 'filter_date_range';
82 | break;
83 | case 'decimal':
84 | case 'float':
85 | case 'integer':
86 | case 'bigint':
87 | case 'smallint':
88 | return 'filter_number_range';
89 | break;
90 | case 'string':
91 | case 'text':
92 | return 'filter_text';
93 | break;
94 | case 'time':
95 | return 'filter_text';
96 | break;
97 | case 'entity':
98 | case 'collection':
99 | return 'filter_entity';
100 | break;
101 | case 'array':
102 | throw new \Exception('The dbType "'.$dbType.'" is only for list implemented (column "'.$columnName.'")');
103 | break;
104 | case 'virtual':
105 | throw new \Exception('The dbType "'.$dbType.'" is only for list implemented (column "'.$columnName.'")');
106 | break;
107 | default:
108 | throw new \Exception('The dbType "'.$dbType.'" is not yet implemented (column "'.$columnName.'")');
109 | break;
110 | }
111 | }
112 |
113 | /**
114 | * Returns an array of fields data (name and filter widget to use).
115 | * Fields can be both column fields and association fields.
116 | *
117 | * @param ClassMetadataInfo $metadata
118 | * @return array $fields
119 | */
120 | private function getFieldsDataFromMetadata(ClassMetadataInfo $metadata)
121 | {
122 | $fieldsData = (array) $metadata->fieldMappings;
123 |
124 | // Convert type to filter widget
125 | foreach ($fieldsData as $fieldName => $data) {
126 | $fieldsData[$fieldName]['fieldName'] = $fieldName;
127 | $fieldsData[$fieldName]['filterWidget'] = $this->getFilterType($fieldsData[$fieldName]['type'], $fieldName);
128 | }
129 |
130 | return $fieldsData;
131 | }
132 |
133 | }
--------------------------------------------------------------------------------
/JordiLlonchCrudGeneratorBundle.php:
--------------------------------------------------------------------------------
1 | = 2.5
26 |
27 | "require": {
28 | ...
29 | "jordillonch/crud-generator": "dev-master"
30 | },
31 |
32 | #### Symfony 2.4
33 |
34 | "require": {
35 | ...
36 | "jordillonch/crud-generator": "2.4.*"
37 | },
38 |
39 | #### Symfony 2.3
40 |
41 | "require": {
42 | ...
43 | "jordillonch/crud-generator": "2.3.*"
44 | },
45 |
46 | #### Symfony 2.2
47 |
48 | "require": {
49 | ...
50 | "jordillonch/crud-generator": "2.2.*"
51 | },
52 | "minimum-stability": "dev",
53 |
54 | #### Symfony 2.1
55 |
56 | "require": {
57 | ...
58 | "jordillonch/crud-generator": "2.1.*"
59 | },
60 | "minimum-stability": "dev",
61 |
62 | Execute:
63 |
64 | php composer.phar update
65 |
66 | Add it to the `AppKernel.php` class:
67 |
68 | new Lexik\Bundle\FormFilterBundle\LexikFormFilterBundle(),
69 | new JordiLlonch\Bundle\CrudGeneratorBundle\JordiLlonchCrudGeneratorBundle(),
70 |
71 | Add it to your `app/config/config.yml`
72 |
73 | framework:
74 | translator: { fallback: en }
75 |
76 | twig:
77 | form:
78 | resources:
79 | - LexikFormFilterBundle:Form:form_div_layout.html.twig
80 |
81 | **This bundle works on Symfony 2.1, 2.2, 2.3, 2.4 and >= 2.5 version.**
82 |
83 |
84 | ## Dependencies
85 |
86 | This bundle extends [SensioGeneratorBundle](https://github.com/sensio/SensioGeneratorBundle) and add a paginator using [PagerFanta](https://github.com/whiteoctober/Pagerfanta/) and filter
87 | support using [LexikFormFilterBundle](https://github.com/lexik/LexikFormFilterBundle).
88 |
89 | ## Usage
90 |
91 | Use following command from console:
92 |
93 | app/console jordillonch:generate:crud
94 |
95 | As you will see there is no config file. You will generate a CRUD code with all fields from your entity. But after code generation you
96 | are free to modify the code because there is no magic just a simple code that is very easy to understand.
97 |
98 | You have to know that if you reuse the command to recreate same entity, first you must delete controller and form files
99 | from previous generation.
100 |
101 | ## Author
102 |
103 | Jordi Llonch - llonch.jordi at gmail dot com
104 |
105 | ### Translation support
106 |
107 | Gonzalo Alonso - gonkpo at gmail dot com
108 |
109 | ## License
110 |
111 | CrudGeneratorBundle is licensed under the MIT License. See the LICENSE file for full details.
--------------------------------------------------------------------------------
/Resources/config/routing.yml:
--------------------------------------------------------------------------------
1 | JordiLlonchCrudGeneratorBundle_homepage:
2 | pattern: /hello/{name}
3 | defaults: { _controller: JordiLlonchCrudGeneratorBundle:Default:index }
4 |
--------------------------------------------------------------------------------
/Resources/config/services.yml:
--------------------------------------------------------------------------------
1 | parameters:
2 | # jordi_llonch_crud_generator.example.class: JordiLlonch\Bundle\CrudGeneratorBundle\Example
3 |
4 | services:
5 | # jordi_llonch_crud_generator.example:
6 | # class: %jordi_llonch_crud_generator.example.class%
7 | # arguments: [@service_id, "plain_value", %parameter%]
8 |
--------------------------------------------------------------------------------
/Resources/public/css/bootstrap-responsive.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap Responsive v2.2.2
3 | *
4 | * Copyright 2012 Twitter, Inc
5 | * Licensed under the Apache License v2.0
6 | * http://www.apache.org/licenses/LICENSE-2.0
7 | *
8 | * Designed and built with all the love in the world @twitter by @mdo and @fat.
9 | */
10 |
11 | @-ms-viewport {
12 | width: device-width;
13 | }
14 |
15 | .clearfix {
16 | *zoom: 1;
17 | }
18 |
19 | .clearfix:before,
20 | .clearfix:after {
21 | display: table;
22 | line-height: 0;
23 | content: "";
24 | }
25 |
26 | .clearfix:after {
27 | clear: both;
28 | }
29 |
30 | .hide-text {
31 | font: 0/0 a;
32 | color: transparent;
33 | text-shadow: none;
34 | background-color: transparent;
35 | border: 0;
36 | }
37 |
38 | .input-block-level {
39 | display: block;
40 | width: 100%;
41 | min-height: 30px;
42 | -webkit-box-sizing: border-box;
43 | -moz-box-sizing: border-box;
44 | box-sizing: border-box;
45 | }
46 |
47 | .hidden {
48 | display: none;
49 | visibility: hidden;
50 | }
51 |
52 | .visible-phone {
53 | display: none !important;
54 | }
55 |
56 | .visible-tablet {
57 | display: none !important;
58 | }
59 |
60 | .hidden-desktop {
61 | display: none !important;
62 | }
63 |
64 | .visible-desktop {
65 | display: inherit !important;
66 | }
67 |
68 | @media (min-width: 768px) and (max-width: 979px) {
69 | .hidden-desktop {
70 | display: inherit !important;
71 | }
72 | .visible-desktop {
73 | display: none !important ;
74 | }
75 | .visible-tablet {
76 | display: inherit !important;
77 | }
78 | .hidden-tablet {
79 | display: none !important;
80 | }
81 | }
82 |
83 | @media (max-width: 767px) {
84 | .hidden-desktop {
85 | display: inherit !important;
86 | }
87 | .visible-desktop {
88 | display: none !important;
89 | }
90 | .visible-phone {
91 | display: inherit !important;
92 | }
93 | .hidden-phone {
94 | display: none !important;
95 | }
96 | }
97 |
98 | @media (min-width: 1200px) {
99 | .row {
100 | margin-left: -30px;
101 | *zoom: 1;
102 | }
103 | .row:before,
104 | .row:after {
105 | display: table;
106 | line-height: 0;
107 | content: "";
108 | }
109 | .row:after {
110 | clear: both;
111 | }
112 | [class*="span"] {
113 | float: left;
114 | min-height: 1px;
115 | margin-left: 30px;
116 | }
117 | .container,
118 | .navbar-static-top .container,
119 | .navbar-fixed-top .container,
120 | .navbar-fixed-bottom .container {
121 | width: 1170px;
122 | }
123 | .span12 {
124 | width: 1170px;
125 | }
126 | .span11 {
127 | width: 1070px;
128 | }
129 | .span10 {
130 | width: 970px;
131 | }
132 | .span9 {
133 | width: 870px;
134 | }
135 | .span8 {
136 | width: 770px;
137 | }
138 | .span7 {
139 | width: 670px;
140 | }
141 | .span6 {
142 | width: 570px;
143 | }
144 | .span5 {
145 | width: 470px;
146 | }
147 | .span4 {
148 | width: 370px;
149 | }
150 | .span3 {
151 | width: 270px;
152 | }
153 | .span2 {
154 | width: 170px;
155 | }
156 | .span1 {
157 | width: 70px;
158 | }
159 | .offset12 {
160 | margin-left: 1230px;
161 | }
162 | .offset11 {
163 | margin-left: 1130px;
164 | }
165 | .offset10 {
166 | margin-left: 1030px;
167 | }
168 | .offset9 {
169 | margin-left: 930px;
170 | }
171 | .offset8 {
172 | margin-left: 830px;
173 | }
174 | .offset7 {
175 | margin-left: 730px;
176 | }
177 | .offset6 {
178 | margin-left: 630px;
179 | }
180 | .offset5 {
181 | margin-left: 530px;
182 | }
183 | .offset4 {
184 | margin-left: 430px;
185 | }
186 | .offset3 {
187 | margin-left: 330px;
188 | }
189 | .offset2 {
190 | margin-left: 230px;
191 | }
192 | .offset1 {
193 | margin-left: 130px;
194 | }
195 | .row-fluid {
196 | width: 100%;
197 | *zoom: 1;
198 | }
199 | .row-fluid:before,
200 | .row-fluid:after {
201 | display: table;
202 | line-height: 0;
203 | content: "";
204 | }
205 | .row-fluid:after {
206 | clear: both;
207 | }
208 | .row-fluid [class*="span"] {
209 | display: block;
210 | float: left;
211 | width: 100%;
212 | min-height: 30px;
213 | margin-left: 2.564102564102564%;
214 | *margin-left: 2.5109110747408616%;
215 | -webkit-box-sizing: border-box;
216 | -moz-box-sizing: border-box;
217 | box-sizing: border-box;
218 | }
219 | .row-fluid [class*="span"]:first-child {
220 | margin-left: 0;
221 | }
222 | .row-fluid .controls-row [class*="span"] + [class*="span"] {
223 | margin-left: 2.564102564102564%;
224 | }
225 | .row-fluid .span12 {
226 | width: 100%;
227 | *width: 99.94680851063829%;
228 | }
229 | .row-fluid .span11 {
230 | width: 91.45299145299145%;
231 | *width: 91.39979996362975%;
232 | }
233 | .row-fluid .span10 {
234 | width: 82.90598290598291%;
235 | *width: 82.8527914166212%;
236 | }
237 | .row-fluid .span9 {
238 | width: 74.35897435897436%;
239 | *width: 74.30578286961266%;
240 | }
241 | .row-fluid .span8 {
242 | width: 65.81196581196582%;
243 | *width: 65.75877432260411%;
244 | }
245 | .row-fluid .span7 {
246 | width: 57.26495726495726%;
247 | *width: 57.21176577559556%;
248 | }
249 | .row-fluid .span6 {
250 | width: 48.717948717948715%;
251 | *width: 48.664757228587014%;
252 | }
253 | .row-fluid .span5 {
254 | width: 40.17094017094017%;
255 | *width: 40.11774868157847%;
256 | }
257 | .row-fluid .span4 {
258 | width: 31.623931623931625%;
259 | *width: 31.570740134569924%;
260 | }
261 | .row-fluid .span3 {
262 | width: 23.076923076923077%;
263 | *width: 23.023731587561375%;
264 | }
265 | .row-fluid .span2 {
266 | width: 14.52991452991453%;
267 | *width: 14.476723040552828%;
268 | }
269 | .row-fluid .span1 {
270 | width: 5.982905982905983%;
271 | *width: 5.929714493544281%;
272 | }
273 | .row-fluid .offset12 {
274 | margin-left: 105.12820512820512%;
275 | *margin-left: 105.02182214948171%;
276 | }
277 | .row-fluid .offset12:first-child {
278 | margin-left: 102.56410256410257%;
279 | *margin-left: 102.45771958537915%;
280 | }
281 | .row-fluid .offset11 {
282 | margin-left: 96.58119658119658%;
283 | *margin-left: 96.47481360247316%;
284 | }
285 | .row-fluid .offset11:first-child {
286 | margin-left: 94.01709401709402%;
287 | *margin-left: 93.91071103837061%;
288 | }
289 | .row-fluid .offset10 {
290 | margin-left: 88.03418803418803%;
291 | *margin-left: 87.92780505546462%;
292 | }
293 | .row-fluid .offset10:first-child {
294 | margin-left: 85.47008547008548%;
295 | *margin-left: 85.36370249136206%;
296 | }
297 | .row-fluid .offset9 {
298 | margin-left: 79.48717948717949%;
299 | *margin-left: 79.38079650845607%;
300 | }
301 | .row-fluid .offset9:first-child {
302 | margin-left: 76.92307692307693%;
303 | *margin-left: 76.81669394435352%;
304 | }
305 | .row-fluid .offset8 {
306 | margin-left: 70.94017094017094%;
307 | *margin-left: 70.83378796144753%;
308 | }
309 | .row-fluid .offset8:first-child {
310 | margin-left: 68.37606837606839%;
311 | *margin-left: 68.26968539734497%;
312 | }
313 | .row-fluid .offset7 {
314 | margin-left: 62.393162393162385%;
315 | *margin-left: 62.28677941443899%;
316 | }
317 | .row-fluid .offset7:first-child {
318 | margin-left: 59.82905982905982%;
319 | *margin-left: 59.72267685033642%;
320 | }
321 | .row-fluid .offset6 {
322 | margin-left: 53.84615384615384%;
323 | *margin-left: 53.739770867430444%;
324 | }
325 | .row-fluid .offset6:first-child {
326 | margin-left: 51.28205128205128%;
327 | *margin-left: 51.175668303327875%;
328 | }
329 | .row-fluid .offset5 {
330 | margin-left: 45.299145299145295%;
331 | *margin-left: 45.1927623204219%;
332 | }
333 | .row-fluid .offset5:first-child {
334 | margin-left: 42.73504273504273%;
335 | *margin-left: 42.62865975631933%;
336 | }
337 | .row-fluid .offset4 {
338 | margin-left: 36.75213675213675%;
339 | *margin-left: 36.645753773413354%;
340 | }
341 | .row-fluid .offset4:first-child {
342 | margin-left: 34.18803418803419%;
343 | *margin-left: 34.081651209310785%;
344 | }
345 | .row-fluid .offset3 {
346 | margin-left: 28.205128205128204%;
347 | *margin-left: 28.0987452264048%;
348 | }
349 | .row-fluid .offset3:first-child {
350 | margin-left: 25.641025641025642%;
351 | *margin-left: 25.53464266230224%;
352 | }
353 | .row-fluid .offset2 {
354 | margin-left: 19.65811965811966%;
355 | *margin-left: 19.551736679396257%;
356 | }
357 | .row-fluid .offset2:first-child {
358 | margin-left: 17.094017094017094%;
359 | *margin-left: 16.98763411529369%;
360 | }
361 | .row-fluid .offset1 {
362 | margin-left: 11.11111111111111%;
363 | *margin-left: 11.004728132387708%;
364 | }
365 | .row-fluid .offset1:first-child {
366 | margin-left: 8.547008547008547%;
367 | *margin-left: 8.440625568285142%;
368 | }
369 | input,
370 | textarea,
371 | .uneditable-input {
372 | margin-left: 0;
373 | }
374 | .controls-row [class*="span"] + [class*="span"] {
375 | margin-left: 30px;
376 | }
377 | input.span12,
378 | textarea.span12,
379 | .uneditable-input.span12 {
380 | width: 1156px;
381 | }
382 | input.span11,
383 | textarea.span11,
384 | .uneditable-input.span11 {
385 | width: 1056px;
386 | }
387 | input.span10,
388 | textarea.span10,
389 | .uneditable-input.span10 {
390 | width: 956px;
391 | }
392 | input.span9,
393 | textarea.span9,
394 | .uneditable-input.span9 {
395 | width: 856px;
396 | }
397 | input.span8,
398 | textarea.span8,
399 | .uneditable-input.span8 {
400 | width: 756px;
401 | }
402 | input.span7,
403 | textarea.span7,
404 | .uneditable-input.span7 {
405 | width: 656px;
406 | }
407 | input.span6,
408 | textarea.span6,
409 | .uneditable-input.span6 {
410 | width: 556px;
411 | }
412 | input.span5,
413 | textarea.span5,
414 | .uneditable-input.span5 {
415 | width: 456px;
416 | }
417 | input.span4,
418 | textarea.span4,
419 | .uneditable-input.span4 {
420 | width: 356px;
421 | }
422 | input.span3,
423 | textarea.span3,
424 | .uneditable-input.span3 {
425 | width: 256px;
426 | }
427 | input.span2,
428 | textarea.span2,
429 | .uneditable-input.span2 {
430 | width: 156px;
431 | }
432 | input.span1,
433 | textarea.span1,
434 | .uneditable-input.span1 {
435 | width: 56px;
436 | }
437 | .thumbnails {
438 | margin-left: -30px;
439 | }
440 | .thumbnails > li {
441 | margin-left: 30px;
442 | }
443 | .row-fluid .thumbnails {
444 | margin-left: 0;
445 | }
446 | }
447 |
448 | @media (min-width: 768px) and (max-width: 979px) {
449 | .row {
450 | margin-left: -20px;
451 | *zoom: 1;
452 | }
453 | .row:before,
454 | .row:after {
455 | display: table;
456 | line-height: 0;
457 | content: "";
458 | }
459 | .row:after {
460 | clear: both;
461 | }
462 | [class*="span"] {
463 | float: left;
464 | min-height: 1px;
465 | margin-left: 20px;
466 | }
467 | .container,
468 | .navbar-static-top .container,
469 | .navbar-fixed-top .container,
470 | .navbar-fixed-bottom .container {
471 | width: 724px;
472 | }
473 | .span12 {
474 | width: 724px;
475 | }
476 | .span11 {
477 | width: 662px;
478 | }
479 | .span10 {
480 | width: 600px;
481 | }
482 | .span9 {
483 | width: 538px;
484 | }
485 | .span8 {
486 | width: 476px;
487 | }
488 | .span7 {
489 | width: 414px;
490 | }
491 | .span6 {
492 | width: 352px;
493 | }
494 | .span5 {
495 | width: 290px;
496 | }
497 | .span4 {
498 | width: 228px;
499 | }
500 | .span3 {
501 | width: 166px;
502 | }
503 | .span2 {
504 | width: 104px;
505 | }
506 | .span1 {
507 | width: 42px;
508 | }
509 | .offset12 {
510 | margin-left: 764px;
511 | }
512 | .offset11 {
513 | margin-left: 702px;
514 | }
515 | .offset10 {
516 | margin-left: 640px;
517 | }
518 | .offset9 {
519 | margin-left: 578px;
520 | }
521 | .offset8 {
522 | margin-left: 516px;
523 | }
524 | .offset7 {
525 | margin-left: 454px;
526 | }
527 | .offset6 {
528 | margin-left: 392px;
529 | }
530 | .offset5 {
531 | margin-left: 330px;
532 | }
533 | .offset4 {
534 | margin-left: 268px;
535 | }
536 | .offset3 {
537 | margin-left: 206px;
538 | }
539 | .offset2 {
540 | margin-left: 144px;
541 | }
542 | .offset1 {
543 | margin-left: 82px;
544 | }
545 | .row-fluid {
546 | width: 100%;
547 | *zoom: 1;
548 | }
549 | .row-fluid:before,
550 | .row-fluid:after {
551 | display: table;
552 | line-height: 0;
553 | content: "";
554 | }
555 | .row-fluid:after {
556 | clear: both;
557 | }
558 | .row-fluid [class*="span"] {
559 | display: block;
560 | float: left;
561 | width: 100%;
562 | min-height: 30px;
563 | margin-left: 2.7624309392265194%;
564 | *margin-left: 2.709239449864817%;
565 | -webkit-box-sizing: border-box;
566 | -moz-box-sizing: border-box;
567 | box-sizing: border-box;
568 | }
569 | .row-fluid [class*="span"]:first-child {
570 | margin-left: 0;
571 | }
572 | .row-fluid .controls-row [class*="span"] + [class*="span"] {
573 | margin-left: 2.7624309392265194%;
574 | }
575 | .row-fluid .span12 {
576 | width: 100%;
577 | *width: 99.94680851063829%;
578 | }
579 | .row-fluid .span11 {
580 | width: 91.43646408839778%;
581 | *width: 91.38327259903608%;
582 | }
583 | .row-fluid .span10 {
584 | width: 82.87292817679558%;
585 | *width: 82.81973668743387%;
586 | }
587 | .row-fluid .span9 {
588 | width: 74.30939226519337%;
589 | *width: 74.25620077583166%;
590 | }
591 | .row-fluid .span8 {
592 | width: 65.74585635359117%;
593 | *width: 65.69266486422946%;
594 | }
595 | .row-fluid .span7 {
596 | width: 57.18232044198895%;
597 | *width: 57.12912895262725%;
598 | }
599 | .row-fluid .span6 {
600 | width: 48.61878453038674%;
601 | *width: 48.56559304102504%;
602 | }
603 | .row-fluid .span5 {
604 | width: 40.05524861878453%;
605 | *width: 40.00205712942283%;
606 | }
607 | .row-fluid .span4 {
608 | width: 31.491712707182323%;
609 | *width: 31.43852121782062%;
610 | }
611 | .row-fluid .span3 {
612 | width: 22.92817679558011%;
613 | *width: 22.87498530621841%;
614 | }
615 | .row-fluid .span2 {
616 | width: 14.3646408839779%;
617 | *width: 14.311449394616199%;
618 | }
619 | .row-fluid .span1 {
620 | width: 5.801104972375691%;
621 | *width: 5.747913483013988%;
622 | }
623 | .row-fluid .offset12 {
624 | margin-left: 105.52486187845304%;
625 | *margin-left: 105.41847889972962%;
626 | }
627 | .row-fluid .offset12:first-child {
628 | margin-left: 102.76243093922652%;
629 | *margin-left: 102.6560479605031%;
630 | }
631 | .row-fluid .offset11 {
632 | margin-left: 96.96132596685082%;
633 | *margin-left: 96.8549429881274%;
634 | }
635 | .row-fluid .offset11:first-child {
636 | margin-left: 94.1988950276243%;
637 | *margin-left: 94.09251204890089%;
638 | }
639 | .row-fluid .offset10 {
640 | margin-left: 88.39779005524862%;
641 | *margin-left: 88.2914070765252%;
642 | }
643 | .row-fluid .offset10:first-child {
644 | margin-left: 85.6353591160221%;
645 | *margin-left: 85.52897613729868%;
646 | }
647 | .row-fluid .offset9 {
648 | margin-left: 79.8342541436464%;
649 | *margin-left: 79.72787116492299%;
650 | }
651 | .row-fluid .offset9:first-child {
652 | margin-left: 77.07182320441989%;
653 | *margin-left: 76.96544022569647%;
654 | }
655 | .row-fluid .offset8 {
656 | margin-left: 71.2707182320442%;
657 | *margin-left: 71.16433525332079%;
658 | }
659 | .row-fluid .offset8:first-child {
660 | margin-left: 68.50828729281768%;
661 | *margin-left: 68.40190431409427%;
662 | }
663 | .row-fluid .offset7 {
664 | margin-left: 62.70718232044199%;
665 | *margin-left: 62.600799341718584%;
666 | }
667 | .row-fluid .offset7:first-child {
668 | margin-left: 59.94475138121547%;
669 | *margin-left: 59.838368402492065%;
670 | }
671 | .row-fluid .offset6 {
672 | margin-left: 54.14364640883978%;
673 | *margin-left: 54.037263430116376%;
674 | }
675 | .row-fluid .offset6:first-child {
676 | margin-left: 51.38121546961326%;
677 | *margin-left: 51.27483249088986%;
678 | }
679 | .row-fluid .offset5 {
680 | margin-left: 45.58011049723757%;
681 | *margin-left: 45.47372751851417%;
682 | }
683 | .row-fluid .offset5:first-child {
684 | margin-left: 42.81767955801105%;
685 | *margin-left: 42.71129657928765%;
686 | }
687 | .row-fluid .offset4 {
688 | margin-left: 37.01657458563536%;
689 | *margin-left: 36.91019160691196%;
690 | }
691 | .row-fluid .offset4:first-child {
692 | margin-left: 34.25414364640884%;
693 | *margin-left: 34.14776066768544%;
694 | }
695 | .row-fluid .offset3 {
696 | margin-left: 28.45303867403315%;
697 | *margin-left: 28.346655695309746%;
698 | }
699 | .row-fluid .offset3:first-child {
700 | margin-left: 25.69060773480663%;
701 | *margin-left: 25.584224756083227%;
702 | }
703 | .row-fluid .offset2 {
704 | margin-left: 19.88950276243094%;
705 | *margin-left: 19.783119783707537%;
706 | }
707 | .row-fluid .offset2:first-child {
708 | margin-left: 17.12707182320442%;
709 | *margin-left: 17.02068884448102%;
710 | }
711 | .row-fluid .offset1 {
712 | margin-left: 11.32596685082873%;
713 | *margin-left: 11.219583872105325%;
714 | }
715 | .row-fluid .offset1:first-child {
716 | margin-left: 8.56353591160221%;
717 | *margin-left: 8.457152932878806%;
718 | }
719 | input,
720 | textarea,
721 | .uneditable-input {
722 | margin-left: 0;
723 | }
724 | .controls-row [class*="span"] + [class*="span"] {
725 | margin-left: 20px;
726 | }
727 | input.span12,
728 | textarea.span12,
729 | .uneditable-input.span12 {
730 | width: 710px;
731 | }
732 | input.span11,
733 | textarea.span11,
734 | .uneditable-input.span11 {
735 | width: 648px;
736 | }
737 | input.span10,
738 | textarea.span10,
739 | .uneditable-input.span10 {
740 | width: 586px;
741 | }
742 | input.span9,
743 | textarea.span9,
744 | .uneditable-input.span9 {
745 | width: 524px;
746 | }
747 | input.span8,
748 | textarea.span8,
749 | .uneditable-input.span8 {
750 | width: 462px;
751 | }
752 | input.span7,
753 | textarea.span7,
754 | .uneditable-input.span7 {
755 | width: 400px;
756 | }
757 | input.span6,
758 | textarea.span6,
759 | .uneditable-input.span6 {
760 | width: 338px;
761 | }
762 | input.span5,
763 | textarea.span5,
764 | .uneditable-input.span5 {
765 | width: 276px;
766 | }
767 | input.span4,
768 | textarea.span4,
769 | .uneditable-input.span4 {
770 | width: 214px;
771 | }
772 | input.span3,
773 | textarea.span3,
774 | .uneditable-input.span3 {
775 | width: 152px;
776 | }
777 | input.span2,
778 | textarea.span2,
779 | .uneditable-input.span2 {
780 | width: 90px;
781 | }
782 | input.span1,
783 | textarea.span1,
784 | .uneditable-input.span1 {
785 | width: 28px;
786 | }
787 | }
788 |
789 | @media (max-width: 767px) {
790 | body {
791 | padding-right: 20px;
792 | padding-left: 20px;
793 | }
794 | .navbar-fixed-top,
795 | .navbar-fixed-bottom,
796 | .navbar-static-top {
797 | margin-right: -20px;
798 | margin-left: -20px;
799 | }
800 | .container-fluid {
801 | padding: 0;
802 | }
803 | .dl-horizontal dt {
804 | float: none;
805 | width: auto;
806 | clear: none;
807 | text-align: left;
808 | }
809 | .dl-horizontal dd {
810 | margin-left: 0;
811 | }
812 | .container {
813 | width: auto;
814 | }
815 | .row-fluid {
816 | width: 100%;
817 | }
818 | .row,
819 | .thumbnails {
820 | margin-left: 0;
821 | }
822 | .thumbnails > li {
823 | float: none;
824 | margin-left: 0;
825 | }
826 | [class*="span"],
827 | .uneditable-input[class*="span"],
828 | .row-fluid [class*="span"] {
829 | display: block;
830 | float: none;
831 | width: 100%;
832 | margin-left: 0;
833 | -webkit-box-sizing: border-box;
834 | -moz-box-sizing: border-box;
835 | box-sizing: border-box;
836 | }
837 | .span12,
838 | .row-fluid .span12 {
839 | width: 100%;
840 | -webkit-box-sizing: border-box;
841 | -moz-box-sizing: border-box;
842 | box-sizing: border-box;
843 | }
844 | .row-fluid [class*="offset"]:first-child {
845 | margin-left: 0;
846 | }
847 | .input-large,
848 | .input-xlarge,
849 | .input-xxlarge,
850 | input[class*="span"],
851 | select[class*="span"],
852 | textarea[class*="span"],
853 | .uneditable-input {
854 | display: block;
855 | width: 100%;
856 | min-height: 30px;
857 | -webkit-box-sizing: border-box;
858 | -moz-box-sizing: border-box;
859 | box-sizing: border-box;
860 | }
861 | .input-prepend input,
862 | .input-append input,
863 | .input-prepend input[class*="span"],
864 | .input-append input[class*="span"] {
865 | display: inline-block;
866 | width: auto;
867 | }
868 | .controls-row [class*="span"] + [class*="span"] {
869 | margin-left: 0;
870 | }
871 | .modal {
872 | position: fixed;
873 | top: 20px;
874 | right: 20px;
875 | left: 20px;
876 | width: auto;
877 | margin: 0;
878 | }
879 | .modal.fade {
880 | top: -100px;
881 | }
882 | .modal.fade.in {
883 | top: 20px;
884 | }
885 | }
886 |
887 | @media (max-width: 480px) {
888 | .nav-collapse {
889 | -webkit-transform: translate3d(0, 0, 0);
890 | }
891 | .page-header h1 small {
892 | display: block;
893 | line-height: 20px;
894 | }
895 | input[type="checkbox"],
896 | input[type="radio"] {
897 | border: 1px solid #ccc;
898 | }
899 | .form-horizontal .control-label {
900 | float: none;
901 | width: auto;
902 | padding-top: 0;
903 | text-align: left;
904 | }
905 | .form-horizontal .controls {
906 | margin-left: 0;
907 | }
908 | .form-horizontal .control-list {
909 | padding-top: 0;
910 | }
911 | .form-horizontal .form-actions {
912 | padding-right: 10px;
913 | padding-left: 10px;
914 | }
915 | .media .pull-left,
916 | .media .pull-right {
917 | display: block;
918 | float: none;
919 | margin-bottom: 10px;
920 | }
921 | .media-object {
922 | margin-right: 0;
923 | margin-left: 0;
924 | }
925 | .modal {
926 | top: 10px;
927 | right: 10px;
928 | left: 10px;
929 | }
930 | .modal-header .close {
931 | padding: 10px;
932 | margin: -10px;
933 | }
934 | .carousel-caption {
935 | position: static;
936 | }
937 | }
938 |
939 | @media (max-width: 979px) {
940 | body {
941 | padding-top: 0;
942 | }
943 | .navbar-fixed-top,
944 | .navbar-fixed-bottom {
945 | position: static;
946 | }
947 | .navbar-fixed-top {
948 | margin-bottom: 20px;
949 | }
950 | .navbar-fixed-bottom {
951 | margin-top: 20px;
952 | }
953 | .navbar-fixed-top .navbar-inner,
954 | .navbar-fixed-bottom .navbar-inner {
955 | padding: 5px;
956 | }
957 | .navbar .container {
958 | width: auto;
959 | padding: 0;
960 | }
961 | .navbar .brand {
962 | padding-right: 10px;
963 | padding-left: 10px;
964 | margin: 0 0 0 -5px;
965 | }
966 | .nav-collapse {
967 | clear: both;
968 | }
969 | .nav-collapse .nav {
970 | float: none;
971 | margin: 0 0 10px;
972 | }
973 | .nav-collapse .nav > li {
974 | float: none;
975 | }
976 | .nav-collapse .nav > li > a {
977 | margin-bottom: 2px;
978 | }
979 | .nav-collapse .nav > .divider-vertical {
980 | display: none;
981 | }
982 | .nav-collapse .nav .nav-header {
983 | color: #777777;
984 | text-shadow: none;
985 | }
986 | .nav-collapse .nav > li > a,
987 | .nav-collapse .dropdown-menu a {
988 | padding: 9px 15px;
989 | font-weight: bold;
990 | color: #777777;
991 | -webkit-border-radius: 3px;
992 | -moz-border-radius: 3px;
993 | border-radius: 3px;
994 | }
995 | .nav-collapse .btn {
996 | padding: 4px 10px 4px;
997 | font-weight: normal;
998 | -webkit-border-radius: 4px;
999 | -moz-border-radius: 4px;
1000 | border-radius: 4px;
1001 | }
1002 | .nav-collapse .dropdown-menu li + li a {
1003 | margin-bottom: 2px;
1004 | }
1005 | .nav-collapse .nav > li > a:hover,
1006 | .nav-collapse .dropdown-menu a:hover {
1007 | background-color: #f2f2f2;
1008 | }
1009 | .navbar-inverse .nav-collapse .nav > li > a,
1010 | .navbar-inverse .nav-collapse .dropdown-menu a {
1011 | color: #999999;
1012 | }
1013 | .navbar-inverse .nav-collapse .nav > li > a:hover,
1014 | .navbar-inverse .nav-collapse .dropdown-menu a:hover {
1015 | background-color: #111111;
1016 | }
1017 | .nav-collapse.in .btn-group {
1018 | padding: 0;
1019 | margin-top: 5px;
1020 | }
1021 | .nav-collapse .dropdown-menu {
1022 | position: static;
1023 | top: auto;
1024 | left: auto;
1025 | display: none;
1026 | float: none;
1027 | max-width: none;
1028 | padding: 0;
1029 | margin: 0 15px;
1030 | background-color: transparent;
1031 | border: none;
1032 | -webkit-border-radius: 0;
1033 | -moz-border-radius: 0;
1034 | border-radius: 0;
1035 | -webkit-box-shadow: none;
1036 | -moz-box-shadow: none;
1037 | box-shadow: none;
1038 | }
1039 | .nav-collapse .open > .dropdown-menu {
1040 | display: block;
1041 | }
1042 | .nav-collapse .dropdown-menu:before,
1043 | .nav-collapse .dropdown-menu:after {
1044 | display: none;
1045 | }
1046 | .nav-collapse .dropdown-menu .divider {
1047 | display: none;
1048 | }
1049 | .nav-collapse .nav > li > .dropdown-menu:before,
1050 | .nav-collapse .nav > li > .dropdown-menu:after {
1051 | display: none;
1052 | }
1053 | .nav-collapse .navbar-form,
1054 | .nav-collapse .navbar-search {
1055 | float: none;
1056 | padding: 10px 15px;
1057 | margin: 10px 0;
1058 | border-top: 1px solid #f2f2f2;
1059 | border-bottom: 1px solid #f2f2f2;
1060 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
1061 | -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
1062 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
1063 | }
1064 | .navbar-inverse .nav-collapse .navbar-form,
1065 | .navbar-inverse .nav-collapse .navbar-search {
1066 | border-top-color: #111111;
1067 | border-bottom-color: #111111;
1068 | }
1069 | .navbar .nav-collapse .nav.pull-right {
1070 | float: none;
1071 | margin-left: 0;
1072 | }
1073 | .nav-collapse,
1074 | .nav-collapse.collapse {
1075 | height: 0;
1076 | overflow: hidden;
1077 | }
1078 | .navbar .btn-navbar {
1079 | display: block;
1080 | }
1081 | .navbar-static .navbar-inner {
1082 | padding-right: 10px;
1083 | padding-left: 10px;
1084 | }
1085 | }
1086 |
1087 | @media (min-width: 980px) {
1088 | .nav-collapse.collapse {
1089 | height: auto !important;
1090 | overflow: visible !important;
1091 | }
1092 | }
1093 |
--------------------------------------------------------------------------------
/Resources/public/css/bootstrap-responsive.min.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap Responsive v2.2.2
3 | *
4 | * Copyright 2012 Twitter, Inc
5 | * Licensed under the Apache License v2.0
6 | * http://www.apache.org/licenses/LICENSE-2.0
7 | *
8 | * Designed and built with all the love in the world @twitter by @mdo and @fat.
9 | */@-ms-viewport{width:device-width}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .dropdown-menu a:hover{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:hover{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}}
10 |
--------------------------------------------------------------------------------
/Resources/public/css/crud.css:
--------------------------------------------------------------------------------
1 | .filters-right {
2 | float: right;
3 | }
4 | .likepaginator {
5 | margin: 18px 0;
6 | float: right;
7 | }
8 | .float-left {
9 | float: left;
10 | margin: 5px;
11 | }
12 | .form-errors {
13 | padding: 5px;
14 | }
15 | .form-errors > ul {
16 | list-style: none;
17 | }
18 | form.well ul li {
19 | border-radius: 3px 3px 3px 3px;
20 | padding: 1px 4px 2px;
21 | color: #FFFFFF;
22 | background-color: #B94A48;
23 | }
--------------------------------------------------------------------------------
/Resources/public/img/glyphicons-halflings-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jordillonch/CrudGeneratorBundle/4454128d38ed014da90ef8caaa636bd644a76bb8/Resources/public/img/glyphicons-halflings-white.png
--------------------------------------------------------------------------------
/Resources/public/img/glyphicons-halflings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jordillonch/CrudGeneratorBundle/4454128d38ed014da90ef8caaa636bd644a76bb8/Resources/public/img/glyphicons-halflings.png
--------------------------------------------------------------------------------
/Resources/public/js/bootstrap.js:
--------------------------------------------------------------------------------
1 | /* ===================================================
2 | * bootstrap-transition.js v2.2.2
3 | * http://twitter.github.com/bootstrap/javascript.html#transitions
4 | * ===================================================
5 | * Copyright 2012 Twitter, Inc.
6 | *
7 | * Licensed under the Apache License, Version 2.0 (the "License");
8 | * you may not use this file except in compliance with the License.
9 | * You may obtain a copy of the License at
10 | *
11 | * http://www.apache.org/licenses/LICENSE-2.0
12 | *
13 | * Unless required by applicable law or agreed to in writing, software
14 | * distributed under the License is distributed on an "AS IS" BASIS,
15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 | * See the License for the specific language governing permissions and
17 | * limitations under the License.
18 | * ========================================================== */
19 |
20 |
21 | !function ($) {
22 |
23 | "use strict"; // jshint ;_;
24 |
25 |
26 | /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
27 | * ======================================================= */
28 |
29 | $(function () {
30 |
31 | $.support.transition = (function () {
32 |
33 | var transitionEnd = (function () {
34 |
35 | var el = document.createElement('bootstrap')
36 | , transEndEventNames = {
37 | 'WebkitTransition' : 'webkitTransitionEnd'
38 | , 'MozTransition' : 'transitionend'
39 | , 'OTransition' : 'oTransitionEnd otransitionend'
40 | , 'transition' : 'transitionend'
41 | }
42 | , name
43 |
44 | for (name in transEndEventNames){
45 | if (el.style[name] !== undefined) {
46 | return transEndEventNames[name]
47 | }
48 | }
49 |
50 | }())
51 |
52 | return transitionEnd && {
53 | end: transitionEnd
54 | }
55 |
56 | })()
57 |
58 | })
59 |
60 | }(window.jQuery);/* ==========================================================
61 | * bootstrap-alert.js v2.2.2
62 | * http://twitter.github.com/bootstrap/javascript.html#alerts
63 | * ==========================================================
64 | * Copyright 2012 Twitter, Inc.
65 | *
66 | * Licensed under the Apache License, Version 2.0 (the "License");
67 | * you may not use this file except in compliance with the License.
68 | * You may obtain a copy of the License at
69 | *
70 | * http://www.apache.org/licenses/LICENSE-2.0
71 | *
72 | * Unless required by applicable law or agreed to in writing, software
73 | * distributed under the License is distributed on an "AS IS" BASIS,
74 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
75 | * See the License for the specific language governing permissions and
76 | * limitations under the License.
77 | * ========================================================== */
78 |
79 |
80 | !function ($) {
81 |
82 | "use strict"; // jshint ;_;
83 |
84 |
85 | /* ALERT CLASS DEFINITION
86 | * ====================== */
87 |
88 | var dismiss = '[data-dismiss="alert"]'
89 | , Alert = function (el) {
90 | $(el).on('click', dismiss, this.close)
91 | }
92 |
93 | Alert.prototype.close = function (e) {
94 | var $this = $(this)
95 | , selector = $this.attr('data-target')
96 | , $parent
97 |
98 | if (!selector) {
99 | selector = $this.attr('href')
100 | selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
101 | }
102 |
103 | $parent = $(selector)
104 |
105 | e && e.preventDefault()
106 |
107 | $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
108 |
109 | $parent.trigger(e = $.Event('close'))
110 |
111 | if (e.isDefaultPrevented()) return
112 |
113 | $parent.removeClass('in')
114 |
115 | function removeElement() {
116 | $parent
117 | .trigger('closed')
118 | .remove()
119 | }
120 |
121 | $.support.transition && $parent.hasClass('fade') ?
122 | $parent.on($.support.transition.end, removeElement) :
123 | removeElement()
124 | }
125 |
126 |
127 | /* ALERT PLUGIN DEFINITION
128 | * ======================= */
129 |
130 | var old = $.fn.alert
131 |
132 | $.fn.alert = function (option) {
133 | return this.each(function () {
134 | var $this = $(this)
135 | , data = $this.data('alert')
136 | if (!data) $this.data('alert', (data = new Alert(this)))
137 | if (typeof option == 'string') data[option].call($this)
138 | })
139 | }
140 |
141 | $.fn.alert.Constructor = Alert
142 |
143 |
144 | /* ALERT NO CONFLICT
145 | * ================= */
146 |
147 | $.fn.alert.noConflict = function () {
148 | $.fn.alert = old
149 | return this
150 | }
151 |
152 |
153 | /* ALERT DATA-API
154 | * ============== */
155 |
156 | $(document).on('click.alert.data-api', dismiss, Alert.prototype.close)
157 |
158 | }(window.jQuery);/* ============================================================
159 | * bootstrap-button.js v2.2.2
160 | * http://twitter.github.com/bootstrap/javascript.html#buttons
161 | * ============================================================
162 | * Copyright 2012 Twitter, Inc.
163 | *
164 | * Licensed under the Apache License, Version 2.0 (the "License");
165 | * you may not use this file except in compliance with the License.
166 | * You may obtain a copy of the License at
167 | *
168 | * http://www.apache.org/licenses/LICENSE-2.0
169 | *
170 | * Unless required by applicable law or agreed to in writing, software
171 | * distributed under the License is distributed on an "AS IS" BASIS,
172 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
173 | * See the License for the specific language governing permissions and
174 | * limitations under the License.
175 | * ============================================================ */
176 |
177 |
178 | !function ($) {
179 |
180 | "use strict"; // jshint ;_;
181 |
182 |
183 | /* BUTTON PUBLIC CLASS DEFINITION
184 | * ============================== */
185 |
186 | var Button = function (element, options) {
187 | this.$element = $(element)
188 | this.options = $.extend({}, $.fn.button.defaults, options)
189 | }
190 |
191 | Button.prototype.setState = function (state) {
192 | var d = 'disabled'
193 | , $el = this.$element
194 | , data = $el.data()
195 | , val = $el.is('input') ? 'val' : 'html'
196 |
197 | state = state + 'Text'
198 | data.resetText || $el.data('resetText', $el[val]())
199 |
200 | $el[val](data[state] || this.options[state])
201 |
202 | // push to event loop to allow forms to submit
203 | setTimeout(function () {
204 | state == 'loadingText' ?
205 | $el.addClass(d).attr(d, d) :
206 | $el.removeClass(d).removeAttr(d)
207 | }, 0)
208 | }
209 |
210 | Button.prototype.toggle = function () {
211 | var $parent = this.$element.closest('[data-toggle="buttons-radio"]')
212 |
213 | $parent && $parent
214 | .find('.active')
215 | .removeClass('active')
216 |
217 | this.$element.toggleClass('active')
218 | }
219 |
220 |
221 | /* BUTTON PLUGIN DEFINITION
222 | * ======================== */
223 |
224 | var old = $.fn.button
225 |
226 | $.fn.button = function (option) {
227 | return this.each(function () {
228 | var $this = $(this)
229 | , data = $this.data('button')
230 | , options = typeof option == 'object' && option
231 | if (!data) $this.data('button', (data = new Button(this, options)))
232 | if (option == 'toggle') data.toggle()
233 | else if (option) data.setState(option)
234 | })
235 | }
236 |
237 | $.fn.button.defaults = {
238 | loadingText: 'loading...'
239 | }
240 |
241 | $.fn.button.Constructor = Button
242 |
243 |
244 | /* BUTTON NO CONFLICT
245 | * ================== */
246 |
247 | $.fn.button.noConflict = function () {
248 | $.fn.button = old
249 | return this
250 | }
251 |
252 |
253 | /* BUTTON DATA-API
254 | * =============== */
255 |
256 | $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) {
257 | var $btn = $(e.target)
258 | if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
259 | $btn.button('toggle')
260 | })
261 |
262 | }(window.jQuery);/* ==========================================================
263 | * bootstrap-carousel.js v2.2.2
264 | * http://twitter.github.com/bootstrap/javascript.html#carousel
265 | * ==========================================================
266 | * Copyright 2012 Twitter, Inc.
267 | *
268 | * Licensed under the Apache License, Version 2.0 (the "License");
269 | * you may not use this file except in compliance with the License.
270 | * You may obtain a copy of the License at
271 | *
272 | * http://www.apache.org/licenses/LICENSE-2.0
273 | *
274 | * Unless required by applicable law or agreed to in writing, software
275 | * distributed under the License is distributed on an "AS IS" BASIS,
276 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
277 | * See the License for the specific language governing permissions and
278 | * limitations under the License.
279 | * ========================================================== */
280 |
281 |
282 | !function ($) {
283 |
284 | "use strict"; // jshint ;_;
285 |
286 |
287 | /* CAROUSEL CLASS DEFINITION
288 | * ========================= */
289 |
290 | var Carousel = function (element, options) {
291 | this.$element = $(element)
292 | this.options = options
293 | this.options.pause == 'hover' && this.$element
294 | .on('mouseenter', $.proxy(this.pause, this))
295 | .on('mouseleave', $.proxy(this.cycle, this))
296 | }
297 |
298 | Carousel.prototype = {
299 |
300 | cycle: function (e) {
301 | if (!e) this.paused = false
302 | this.options.interval
303 | && !this.paused
304 | && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
305 | return this
306 | }
307 |
308 | , to: function (pos) {
309 | var $active = this.$element.find('.item.active')
310 | , children = $active.parent().children()
311 | , activePos = children.index($active)
312 | , that = this
313 |
314 | if (pos > (children.length - 1) || pos < 0) return
315 |
316 | if (this.sliding) {
317 | return this.$element.one('slid', function () {
318 | that.to(pos)
319 | })
320 | }
321 |
322 | if (activePos == pos) {
323 | return this.pause().cycle()
324 | }
325 |
326 | return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))
327 | }
328 |
329 | , pause: function (e) {
330 | if (!e) this.paused = true
331 | if (this.$element.find('.next, .prev').length && $.support.transition.end) {
332 | this.$element.trigger($.support.transition.end)
333 | this.cycle()
334 | }
335 | clearInterval(this.interval)
336 | this.interval = null
337 | return this
338 | }
339 |
340 | , next: function () {
341 | if (this.sliding) return
342 | return this.slide('next')
343 | }
344 |
345 | , prev: function () {
346 | if (this.sliding) return
347 | return this.slide('prev')
348 | }
349 |
350 | , slide: function (type, next) {
351 | var $active = this.$element.find('.item.active')
352 | , $next = next || $active[type]()
353 | , isCycling = this.interval
354 | , direction = type == 'next' ? 'left' : 'right'
355 | , fallback = type == 'next' ? 'first' : 'last'
356 | , that = this
357 | , e
358 |
359 | this.sliding = true
360 |
361 | isCycling && this.pause()
362 |
363 | $next = $next.length ? $next : this.$element.find('.item')[fallback]()
364 |
365 | e = $.Event('slide', {
366 | relatedTarget: $next[0]
367 | })
368 |
369 | if ($next.hasClass('active')) return
370 |
371 | if ($.support.transition && this.$element.hasClass('slide')) {
372 | this.$element.trigger(e)
373 | if (e.isDefaultPrevented()) return
374 | $next.addClass(type)
375 | $next[0].offsetWidth // force reflow
376 | $active.addClass(direction)
377 | $next.addClass(direction)
378 | this.$element.one($.support.transition.end, function () {
379 | $next.removeClass([type, direction].join(' ')).addClass('active')
380 | $active.removeClass(['active', direction].join(' '))
381 | that.sliding = false
382 | setTimeout(function () { that.$element.trigger('slid') }, 0)
383 | })
384 | } else {
385 | this.$element.trigger(e)
386 | if (e.isDefaultPrevented()) return
387 | $active.removeClass('active')
388 | $next.addClass('active')
389 | this.sliding = false
390 | this.$element.trigger('slid')
391 | }
392 |
393 | isCycling && this.cycle()
394 |
395 | return this
396 | }
397 |
398 | }
399 |
400 |
401 | /* CAROUSEL PLUGIN DEFINITION
402 | * ========================== */
403 |
404 | var old = $.fn.carousel
405 |
406 | $.fn.carousel = function (option) {
407 | return this.each(function () {
408 | var $this = $(this)
409 | , data = $this.data('carousel')
410 | , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
411 | , action = typeof option == 'string' ? option : options.slide
412 | if (!data) $this.data('carousel', (data = new Carousel(this, options)))
413 | if (typeof option == 'number') data.to(option)
414 | else if (action) data[action]()
415 | else if (options.interval) data.cycle()
416 | })
417 | }
418 |
419 | $.fn.carousel.defaults = {
420 | interval: 5000
421 | , pause: 'hover'
422 | }
423 |
424 | $.fn.carousel.Constructor = Carousel
425 |
426 |
427 | /* CAROUSEL NO CONFLICT
428 | * ==================== */
429 |
430 | $.fn.carousel.noConflict = function () {
431 | $.fn.carousel = old
432 | return this
433 | }
434 |
435 | /* CAROUSEL DATA-API
436 | * ================= */
437 |
438 | $(document).on('click.carousel.data-api', '[data-slide]', function (e) {
439 | var $this = $(this), href
440 | , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
441 | , options = $.extend({}, $target.data(), $this.data())
442 | $target.carousel(options)
443 | e.preventDefault()
444 | })
445 |
446 | }(window.jQuery);/* =============================================================
447 | * bootstrap-collapse.js v2.2.2
448 | * http://twitter.github.com/bootstrap/javascript.html#collapse
449 | * =============================================================
450 | * Copyright 2012 Twitter, Inc.
451 | *
452 | * Licensed under the Apache License, Version 2.0 (the "License");
453 | * you may not use this file except in compliance with the License.
454 | * You may obtain a copy of the License at
455 | *
456 | * http://www.apache.org/licenses/LICENSE-2.0
457 | *
458 | * Unless required by applicable law or agreed to in writing, software
459 | * distributed under the License is distributed on an "AS IS" BASIS,
460 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
461 | * See the License for the specific language governing permissions and
462 | * limitations under the License.
463 | * ============================================================ */
464 |
465 |
466 | !function ($) {
467 |
468 | "use strict"; // jshint ;_;
469 |
470 |
471 | /* COLLAPSE PUBLIC CLASS DEFINITION
472 | * ================================ */
473 |
474 | var Collapse = function (element, options) {
475 | this.$element = $(element)
476 | this.options = $.extend({}, $.fn.collapse.defaults, options)
477 |
478 | if (this.options.parent) {
479 | this.$parent = $(this.options.parent)
480 | }
481 |
482 | this.options.toggle && this.toggle()
483 | }
484 |
485 | Collapse.prototype = {
486 |
487 | constructor: Collapse
488 |
489 | , dimension: function () {
490 | var hasWidth = this.$element.hasClass('width')
491 | return hasWidth ? 'width' : 'height'
492 | }
493 |
494 | , show: function () {
495 | var dimension
496 | , scroll
497 | , actives
498 | , hasData
499 |
500 | if (this.transitioning) return
501 |
502 | dimension = this.dimension()
503 | scroll = $.camelCase(['scroll', dimension].join('-'))
504 | actives = this.$parent && this.$parent.find('> .accordion-group > .in')
505 |
506 | if (actives && actives.length) {
507 | hasData = actives.data('collapse')
508 | if (hasData && hasData.transitioning) return
509 | actives.collapse('hide')
510 | hasData || actives.data('collapse', null)
511 | }
512 |
513 | this.$element[dimension](0)
514 | this.transition('addClass', $.Event('show'), 'shown')
515 | $.support.transition && this.$element[dimension](this.$element[0][scroll])
516 | }
517 |
518 | , hide: function () {
519 | var dimension
520 | if (this.transitioning) return
521 | dimension = this.dimension()
522 | this.reset(this.$element[dimension]())
523 | this.transition('removeClass', $.Event('hide'), 'hidden')
524 | this.$element[dimension](0)
525 | }
526 |
527 | , reset: function (size) {
528 | var dimension = this.dimension()
529 |
530 | this.$element
531 | .removeClass('collapse')
532 | [dimension](size || 'auto')
533 | [0].offsetWidth
534 |
535 | this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
536 |
537 | return this
538 | }
539 |
540 | , transition: function (method, startEvent, completeEvent) {
541 | var that = this
542 | , complete = function () {
543 | if (startEvent.type == 'show') that.reset()
544 | that.transitioning = 0
545 | that.$element.trigger(completeEvent)
546 | }
547 |
548 | this.$element.trigger(startEvent)
549 |
550 | if (startEvent.isDefaultPrevented()) return
551 |
552 | this.transitioning = 1
553 |
554 | this.$element[method]('in')
555 |
556 | $.support.transition && this.$element.hasClass('collapse') ?
557 | this.$element.one($.support.transition.end, complete) :
558 | complete()
559 | }
560 |
561 | , toggle: function () {
562 | this[this.$element.hasClass('in') ? 'hide' : 'show']()
563 | }
564 |
565 | }
566 |
567 |
568 | /* COLLAPSE PLUGIN DEFINITION
569 | * ========================== */
570 |
571 | var old = $.fn.collapse
572 |
573 | $.fn.collapse = function (option) {
574 | return this.each(function () {
575 | var $this = $(this)
576 | , data = $this.data('collapse')
577 | , options = typeof option == 'object' && option
578 | if (!data) $this.data('collapse', (data = new Collapse(this, options)))
579 | if (typeof option == 'string') data[option]()
580 | })
581 | }
582 |
583 | $.fn.collapse.defaults = {
584 | toggle: true
585 | }
586 |
587 | $.fn.collapse.Constructor = Collapse
588 |
589 |
590 | /* COLLAPSE NO CONFLICT
591 | * ==================== */
592 |
593 | $.fn.collapse.noConflict = function () {
594 | $.fn.collapse = old
595 | return this
596 | }
597 |
598 |
599 | /* COLLAPSE DATA-API
600 | * ================= */
601 |
602 | $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {
603 | var $this = $(this), href
604 | , target = $this.attr('data-target')
605 | || e.preventDefault()
606 | || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
607 | , option = $(target).data('collapse') ? 'toggle' : $this.data()
608 | $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
609 | $(target).collapse(option)
610 | })
611 |
612 | }(window.jQuery);/* ============================================================
613 | * bootstrap-dropdown.js v2.2.2
614 | * http://twitter.github.com/bootstrap/javascript.html#dropdowns
615 | * ============================================================
616 | * Copyright 2012 Twitter, Inc.
617 | *
618 | * Licensed under the Apache License, Version 2.0 (the "License");
619 | * you may not use this file except in compliance with the License.
620 | * You may obtain a copy of the License at
621 | *
622 | * http://www.apache.org/licenses/LICENSE-2.0
623 | *
624 | * Unless required by applicable law or agreed to in writing, software
625 | * distributed under the License is distributed on an "AS IS" BASIS,
626 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
627 | * See the License for the specific language governing permissions and
628 | * limitations under the License.
629 | * ============================================================ */
630 |
631 |
632 | !function ($) {
633 |
634 | "use strict"; // jshint ;_;
635 |
636 |
637 | /* DROPDOWN CLASS DEFINITION
638 | * ========================= */
639 |
640 | var toggle = '[data-toggle=dropdown]'
641 | , Dropdown = function (element) {
642 | var $el = $(element).on('click.dropdown.data-api', this.toggle)
643 | $('html').on('click.dropdown.data-api', function () {
644 | $el.parent().removeClass('open')
645 | })
646 | }
647 |
648 | Dropdown.prototype = {
649 |
650 | constructor: Dropdown
651 |
652 | , toggle: function (e) {
653 | var $this = $(this)
654 | , $parent
655 | , isActive
656 |
657 | if ($this.is('.disabled, :disabled')) return
658 |
659 | $parent = getParent($this)
660 |
661 | isActive = $parent.hasClass('open')
662 |
663 | clearMenus()
664 |
665 | if (!isActive) {
666 | $parent.toggleClass('open')
667 | }
668 |
669 | $this.focus()
670 |
671 | return false
672 | }
673 |
674 | , keydown: function (e) {
675 | var $this
676 | , $items
677 | , $active
678 | , $parent
679 | , isActive
680 | , index
681 |
682 | if (!/(38|40|27)/.test(e.keyCode)) return
683 |
684 | $this = $(this)
685 |
686 | e.preventDefault()
687 | e.stopPropagation()
688 |
689 | if ($this.is('.disabled, :disabled')) return
690 |
691 | $parent = getParent($this)
692 |
693 | isActive = $parent.hasClass('open')
694 |
695 | if (!isActive || (isActive && e.keyCode == 27)) return $this.click()
696 |
697 | $items = $('[role=menu] li:not(.divider):visible a', $parent)
698 |
699 | if (!$items.length) return
700 |
701 | index = $items.index($items.filter(':focus'))
702 |
703 | if (e.keyCode == 38 && index > 0) index-- // up
704 | if (e.keyCode == 40 && index < $items.length - 1) index++ // down
705 | if (!~index) index = 0
706 |
707 | $items
708 | .eq(index)
709 | .focus()
710 | }
711 |
712 | }
713 |
714 | function clearMenus() {
715 | $(toggle).each(function () {
716 | getParent($(this)).removeClass('open')
717 | })
718 | }
719 |
720 | function getParent($this) {
721 | var selector = $this.attr('data-target')
722 | , $parent
723 |
724 | if (!selector) {
725 | selector = $this.attr('href')
726 | selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
727 | }
728 |
729 | $parent = $(selector)
730 | $parent.length || ($parent = $this.parent())
731 |
732 | return $parent
733 | }
734 |
735 |
736 | /* DROPDOWN PLUGIN DEFINITION
737 | * ========================== */
738 |
739 | var old = $.fn.dropdown
740 |
741 | $.fn.dropdown = function (option) {
742 | return this.each(function () {
743 | var $this = $(this)
744 | , data = $this.data('dropdown')
745 | if (!data) $this.data('dropdown', (data = new Dropdown(this)))
746 | if (typeof option == 'string') data[option].call($this)
747 | })
748 | }
749 |
750 | $.fn.dropdown.Constructor = Dropdown
751 |
752 |
753 | /* DROPDOWN NO CONFLICT
754 | * ==================== */
755 |
756 | $.fn.dropdown.noConflict = function () {
757 | $.fn.dropdown = old
758 | return this
759 | }
760 |
761 |
762 | /* APPLY TO STANDARD DROPDOWN ELEMENTS
763 | * =================================== */
764 |
765 | $(document)
766 | .on('click.dropdown.data-api touchstart.dropdown.data-api', clearMenus)
767 | .on('click.dropdown touchstart.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
768 | .on('touchstart.dropdown.data-api', '.dropdown-menu', function (e) { e.stopPropagation() })
769 | .on('click.dropdown.data-api touchstart.dropdown.data-api' , toggle, Dropdown.prototype.toggle)
770 | .on('keydown.dropdown.data-api touchstart.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
771 |
772 | }(window.jQuery);/* =========================================================
773 | * bootstrap-modal.js v2.2.2
774 | * http://twitter.github.com/bootstrap/javascript.html#modals
775 | * =========================================================
776 | * Copyright 2012 Twitter, Inc.
777 | *
778 | * Licensed under the Apache License, Version 2.0 (the "License");
779 | * you may not use this file except in compliance with the License.
780 | * You may obtain a copy of the License at
781 | *
782 | * http://www.apache.org/licenses/LICENSE-2.0
783 | *
784 | * Unless required by applicable law or agreed to in writing, software
785 | * distributed under the License is distributed on an "AS IS" BASIS,
786 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
787 | * See the License for the specific language governing permissions and
788 | * limitations under the License.
789 | * ========================================================= */
790 |
791 |
792 | !function ($) {
793 |
794 | "use strict"; // jshint ;_;
795 |
796 |
797 | /* MODAL CLASS DEFINITION
798 | * ====================== */
799 |
800 | var Modal = function (element, options) {
801 | this.options = options
802 | this.$element = $(element)
803 | .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
804 | this.options.remote && this.$element.find('.modal-body').load(this.options.remote)
805 | }
806 |
807 | Modal.prototype = {
808 |
809 | constructor: Modal
810 |
811 | , toggle: function () {
812 | return this[!this.isShown ? 'show' : 'hide']()
813 | }
814 |
815 | , show: function () {
816 | var that = this
817 | , e = $.Event('show')
818 |
819 | this.$element.trigger(e)
820 |
821 | if (this.isShown || e.isDefaultPrevented()) return
822 |
823 | this.isShown = true
824 |
825 | this.escape()
826 |
827 | this.backdrop(function () {
828 | var transition = $.support.transition && that.$element.hasClass('fade')
829 |
830 | if (!that.$element.parent().length) {
831 | that.$element.appendTo(document.body) //don't move modals dom position
832 | }
833 |
834 | that.$element
835 | .show()
836 |
837 | if (transition) {
838 | that.$element[0].offsetWidth // force reflow
839 | }
840 |
841 | that.$element
842 | .addClass('in')
843 | .attr('aria-hidden', false)
844 |
845 | that.enforceFocus()
846 |
847 | transition ?
848 | that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) :
849 | that.$element.focus().trigger('shown')
850 |
851 | })
852 | }
853 |
854 | , hide: function (e) {
855 | e && e.preventDefault()
856 |
857 | var that = this
858 |
859 | e = $.Event('hide')
860 |
861 | this.$element.trigger(e)
862 |
863 | if (!this.isShown || e.isDefaultPrevented()) return
864 |
865 | this.isShown = false
866 |
867 | this.escape()
868 |
869 | $(document).off('focusin.modal')
870 |
871 | this.$element
872 | .removeClass('in')
873 | .attr('aria-hidden', true)
874 |
875 | $.support.transition && this.$element.hasClass('fade') ?
876 | this.hideWithTransition() :
877 | this.hideModal()
878 | }
879 |
880 | , enforceFocus: function () {
881 | var that = this
882 | $(document).on('focusin.modal', function (e) {
883 | if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
884 | that.$element.focus()
885 | }
886 | })
887 | }
888 |
889 | , escape: function () {
890 | var that = this
891 | if (this.isShown && this.options.keyboard) {
892 | this.$element.on('keyup.dismiss.modal', function ( e ) {
893 | e.which == 27 && that.hide()
894 | })
895 | } else if (!this.isShown) {
896 | this.$element.off('keyup.dismiss.modal')
897 | }
898 | }
899 |
900 | , hideWithTransition: function () {
901 | var that = this
902 | , timeout = setTimeout(function () {
903 | that.$element.off($.support.transition.end)
904 | that.hideModal()
905 | }, 500)
906 |
907 | this.$element.one($.support.transition.end, function () {
908 | clearTimeout(timeout)
909 | that.hideModal()
910 | })
911 | }
912 |
913 | , hideModal: function (that) {
914 | this.$element
915 | .hide()
916 | .trigger('hidden')
917 |
918 | this.backdrop()
919 | }
920 |
921 | , removeBackdrop: function () {
922 | this.$backdrop.remove()
923 | this.$backdrop = null
924 | }
925 |
926 | , backdrop: function (callback) {
927 | var that = this
928 | , animate = this.$element.hasClass('fade') ? 'fade' : ''
929 |
930 | if (this.isShown && this.options.backdrop) {
931 | var doAnimate = $.support.transition && animate
932 |
933 | this.$backdrop = $('
')
934 | .appendTo(document.body)
935 |
936 | this.$backdrop.click(
937 | this.options.backdrop == 'static' ?
938 | $.proxy(this.$element[0].focus, this.$element[0])
939 | : $.proxy(this.hide, this)
940 | )
941 |
942 | if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
943 |
944 | this.$backdrop.addClass('in')
945 |
946 | doAnimate ?
947 | this.$backdrop.one($.support.transition.end, callback) :
948 | callback()
949 |
950 | } else if (!this.isShown && this.$backdrop) {
951 | this.$backdrop.removeClass('in')
952 |
953 | $.support.transition && this.$element.hasClass('fade')?
954 | this.$backdrop.one($.support.transition.end, $.proxy(this.removeBackdrop, this)) :
955 | this.removeBackdrop()
956 |
957 | } else if (callback) {
958 | callback()
959 | }
960 | }
961 | }
962 |
963 |
964 | /* MODAL PLUGIN DEFINITION
965 | * ======================= */
966 |
967 | var old = $.fn.modal
968 |
969 | $.fn.modal = function (option) {
970 | return this.each(function () {
971 | var $this = $(this)
972 | , data = $this.data('modal')
973 | , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
974 | if (!data) $this.data('modal', (data = new Modal(this, options)))
975 | if (typeof option == 'string') data[option]()
976 | else if (options.show) data.show()
977 | })
978 | }
979 |
980 | $.fn.modal.defaults = {
981 | backdrop: true
982 | , keyboard: true
983 | , show: true
984 | }
985 |
986 | $.fn.modal.Constructor = Modal
987 |
988 |
989 | /* MODAL NO CONFLICT
990 | * ================= */
991 |
992 | $.fn.modal.noConflict = function () {
993 | $.fn.modal = old
994 | return this
995 | }
996 |
997 |
998 | /* MODAL DATA-API
999 | * ============== */
1000 |
1001 | $(document).on('click.modal.data-api', '[data-toggle="modal"]', function (e) {
1002 | var $this = $(this)
1003 | , href = $this.attr('href')
1004 | , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
1005 | , option = $target.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data())
1006 |
1007 | e.preventDefault()
1008 |
1009 | $target
1010 | .modal(option)
1011 | .one('hide', function () {
1012 | $this.focus()
1013 | })
1014 | })
1015 |
1016 | }(window.jQuery);
1017 | /* ===========================================================
1018 | * bootstrap-tooltip.js v2.2.2
1019 | * http://twitter.github.com/bootstrap/javascript.html#tooltips
1020 | * Inspired by the original jQuery.tipsy by Jason Frame
1021 | * ===========================================================
1022 | * Copyright 2012 Twitter, Inc.
1023 | *
1024 | * Licensed under the Apache License, Version 2.0 (the "License");
1025 | * you may not use this file except in compliance with the License.
1026 | * You may obtain a copy of the License at
1027 | *
1028 | * http://www.apache.org/licenses/LICENSE-2.0
1029 | *
1030 | * Unless required by applicable law or agreed to in writing, software
1031 | * distributed under the License is distributed on an "AS IS" BASIS,
1032 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1033 | * See the License for the specific language governing permissions and
1034 | * limitations under the License.
1035 | * ========================================================== */
1036 |
1037 |
1038 | !function ($) {
1039 |
1040 | "use strict"; // jshint ;_;
1041 |
1042 |
1043 | /* TOOLTIP PUBLIC CLASS DEFINITION
1044 | * =============================== */
1045 |
1046 | var Tooltip = function (element, options) {
1047 | this.init('tooltip', element, options)
1048 | }
1049 |
1050 | Tooltip.prototype = {
1051 |
1052 | constructor: Tooltip
1053 |
1054 | , init: function (type, element, options) {
1055 | var eventIn
1056 | , eventOut
1057 |
1058 | this.type = type
1059 | this.$element = $(element)
1060 | this.options = this.getOptions(options)
1061 | this.enabled = true
1062 |
1063 | if (this.options.trigger == 'click') {
1064 | this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
1065 | } else if (this.options.trigger != 'manual') {
1066 | eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'
1067 | eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'
1068 | this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
1069 | this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
1070 | }
1071 |
1072 | this.options.selector ?
1073 | (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
1074 | this.fixTitle()
1075 | }
1076 |
1077 | , getOptions: function (options) {
1078 | options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())
1079 |
1080 | if (options.delay && typeof options.delay == 'number') {
1081 | options.delay = {
1082 | show: options.delay
1083 | , hide: options.delay
1084 | }
1085 | }
1086 |
1087 | return options
1088 | }
1089 |
1090 | , enter: function (e) {
1091 | var self = $(e.currentTarget)[this.type](this._options).data(this.type)
1092 |
1093 | if (!self.options.delay || !self.options.delay.show) return self.show()
1094 |
1095 | clearTimeout(this.timeout)
1096 | self.hoverState = 'in'
1097 | this.timeout = setTimeout(function() {
1098 | if (self.hoverState == 'in') self.show()
1099 | }, self.options.delay.show)
1100 | }
1101 |
1102 | , leave: function (e) {
1103 | var self = $(e.currentTarget)[this.type](this._options).data(this.type)
1104 |
1105 | if (this.timeout) clearTimeout(this.timeout)
1106 | if (!self.options.delay || !self.options.delay.hide) return self.hide()
1107 |
1108 | self.hoverState = 'out'
1109 | this.timeout = setTimeout(function() {
1110 | if (self.hoverState == 'out') self.hide()
1111 | }, self.options.delay.hide)
1112 | }
1113 |
1114 | , show: function () {
1115 | var $tip
1116 | , inside
1117 | , pos
1118 | , actualWidth
1119 | , actualHeight
1120 | , placement
1121 | , tp
1122 |
1123 | if (this.hasContent() && this.enabled) {
1124 | $tip = this.tip()
1125 | this.setContent()
1126 |
1127 | if (this.options.animation) {
1128 | $tip.addClass('fade')
1129 | }
1130 |
1131 | placement = typeof this.options.placement == 'function' ?
1132 | this.options.placement.call(this, $tip[0], this.$element[0]) :
1133 | this.options.placement
1134 |
1135 | inside = /in/.test(placement)
1136 |
1137 | $tip
1138 | .detach()
1139 | .css({ top: 0, left: 0, display: 'block' })
1140 | .insertAfter(this.$element)
1141 |
1142 | pos = this.getPosition(inside)
1143 |
1144 | actualWidth = $tip[0].offsetWidth
1145 | actualHeight = $tip[0].offsetHeight
1146 |
1147 | switch (inside ? placement.split(' ')[1] : placement) {
1148 | case 'bottom':
1149 | tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
1150 | break
1151 | case 'top':
1152 | tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
1153 | break
1154 | case 'left':
1155 | tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
1156 | break
1157 | case 'right':
1158 | tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
1159 | break
1160 | }
1161 |
1162 | $tip
1163 | .offset(tp)
1164 | .addClass(placement)
1165 | .addClass('in')
1166 | }
1167 | }
1168 |
1169 | , setContent: function () {
1170 | var $tip = this.tip()
1171 | , title = this.getTitle()
1172 |
1173 | $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
1174 | $tip.removeClass('fade in top bottom left right')
1175 | }
1176 |
1177 | , hide: function () {
1178 | var that = this
1179 | , $tip = this.tip()
1180 |
1181 | $tip.removeClass('in')
1182 |
1183 | function removeWithAnimation() {
1184 | var timeout = setTimeout(function () {
1185 | $tip.off($.support.transition.end).detach()
1186 | }, 500)
1187 |
1188 | $tip.one($.support.transition.end, function () {
1189 | clearTimeout(timeout)
1190 | $tip.detach()
1191 | })
1192 | }
1193 |
1194 | $.support.transition && this.$tip.hasClass('fade') ?
1195 | removeWithAnimation() :
1196 | $tip.detach()
1197 |
1198 | return this
1199 | }
1200 |
1201 | , fixTitle: function () {
1202 | var $e = this.$element
1203 | if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
1204 | $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title')
1205 | }
1206 | }
1207 |
1208 | , hasContent: function () {
1209 | return this.getTitle()
1210 | }
1211 |
1212 | , getPosition: function (inside) {
1213 | return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), {
1214 | width: this.$element[0].offsetWidth
1215 | , height: this.$element[0].offsetHeight
1216 | })
1217 | }
1218 |
1219 | , getTitle: function () {
1220 | var title
1221 | , $e = this.$element
1222 | , o = this.options
1223 |
1224 | title = $e.attr('data-original-title')
1225 | || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
1226 |
1227 | return title
1228 | }
1229 |
1230 | , tip: function () {
1231 | return this.$tip = this.$tip || $(this.options.template)
1232 | }
1233 |
1234 | , validate: function () {
1235 | if (!this.$element[0].parentNode) {
1236 | this.hide()
1237 | this.$element = null
1238 | this.options = null
1239 | }
1240 | }
1241 |
1242 | , enable: function () {
1243 | this.enabled = true
1244 | }
1245 |
1246 | , disable: function () {
1247 | this.enabled = false
1248 | }
1249 |
1250 | , toggleEnabled: function () {
1251 | this.enabled = !this.enabled
1252 | }
1253 |
1254 | , toggle: function (e) {
1255 | var self = $(e.currentTarget)[this.type](this._options).data(this.type)
1256 | self[self.tip().hasClass('in') ? 'hide' : 'show']()
1257 | }
1258 |
1259 | , destroy: function () {
1260 | this.hide().$element.off('.' + this.type).removeData(this.type)
1261 | }
1262 |
1263 | }
1264 |
1265 |
1266 | /* TOOLTIP PLUGIN DEFINITION
1267 | * ========================= */
1268 |
1269 | var old = $.fn.tooltip
1270 |
1271 | $.fn.tooltip = function ( option ) {
1272 | return this.each(function () {
1273 | var $this = $(this)
1274 | , data = $this.data('tooltip')
1275 | , options = typeof option == 'object' && option
1276 | if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
1277 | if (typeof option == 'string') data[option]()
1278 | })
1279 | }
1280 |
1281 | $.fn.tooltip.Constructor = Tooltip
1282 |
1283 | $.fn.tooltip.defaults = {
1284 | animation: true
1285 | , placement: 'top'
1286 | , selector: false
1287 | , template: ''
1288 | , trigger: 'hover'
1289 | , title: ''
1290 | , delay: 0
1291 | , html: false
1292 | }
1293 |
1294 |
1295 | /* TOOLTIP NO CONFLICT
1296 | * =================== */
1297 |
1298 | $.fn.tooltip.noConflict = function () {
1299 | $.fn.tooltip = old
1300 | return this
1301 | }
1302 |
1303 | }(window.jQuery);/* ===========================================================
1304 | * bootstrap-popover.js v2.2.2
1305 | * http://twitter.github.com/bootstrap/javascript.html#popovers
1306 | * ===========================================================
1307 | * Copyright 2012 Twitter, Inc.
1308 | *
1309 | * Licensed under the Apache License, Version 2.0 (the "License");
1310 | * you may not use this file except in compliance with the License.
1311 | * You may obtain a copy of the License at
1312 | *
1313 | * http://www.apache.org/licenses/LICENSE-2.0
1314 | *
1315 | * Unless required by applicable law or agreed to in writing, software
1316 | * distributed under the License is distributed on an "AS IS" BASIS,
1317 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1318 | * See the License for the specific language governing permissions and
1319 | * limitations under the License.
1320 | * =========================================================== */
1321 |
1322 |
1323 | !function ($) {
1324 |
1325 | "use strict"; // jshint ;_;
1326 |
1327 |
1328 | /* POPOVER PUBLIC CLASS DEFINITION
1329 | * =============================== */
1330 |
1331 | var Popover = function (element, options) {
1332 | this.init('popover', element, options)
1333 | }
1334 |
1335 |
1336 | /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
1337 | ========================================== */
1338 |
1339 | Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
1340 |
1341 | constructor: Popover
1342 |
1343 | , setContent: function () {
1344 | var $tip = this.tip()
1345 | , title = this.getTitle()
1346 | , content = this.getContent()
1347 |
1348 | $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
1349 | $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)
1350 |
1351 | $tip.removeClass('fade top bottom left right in')
1352 | }
1353 |
1354 | , hasContent: function () {
1355 | return this.getTitle() || this.getContent()
1356 | }
1357 |
1358 | , getContent: function () {
1359 | var content
1360 | , $e = this.$element
1361 | , o = this.options
1362 |
1363 | content = $e.attr('data-content')
1364 | || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content)
1365 |
1366 | return content
1367 | }
1368 |
1369 | , tip: function () {
1370 | if (!this.$tip) {
1371 | this.$tip = $(this.options.template)
1372 | }
1373 | return this.$tip
1374 | }
1375 |
1376 | , destroy: function () {
1377 | this.hide().$element.off('.' + this.type).removeData(this.type)
1378 | }
1379 |
1380 | })
1381 |
1382 |
1383 | /* POPOVER PLUGIN DEFINITION
1384 | * ======================= */
1385 |
1386 | var old = $.fn.popover
1387 |
1388 | $.fn.popover = function (option) {
1389 | return this.each(function () {
1390 | var $this = $(this)
1391 | , data = $this.data('popover')
1392 | , options = typeof option == 'object' && option
1393 | if (!data) $this.data('popover', (data = new Popover(this, options)))
1394 | if (typeof option == 'string') data[option]()
1395 | })
1396 | }
1397 |
1398 | $.fn.popover.Constructor = Popover
1399 |
1400 | $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
1401 | placement: 'right'
1402 | , trigger: 'click'
1403 | , content: ''
1404 | , template: ''
1405 | })
1406 |
1407 |
1408 | /* POPOVER NO CONFLICT
1409 | * =================== */
1410 |
1411 | $.fn.popover.noConflict = function () {
1412 | $.fn.popover = old
1413 | return this
1414 | }
1415 |
1416 | }(window.jQuery);/* =============================================================
1417 | * bootstrap-scrollspy.js v2.2.2
1418 | * http://twitter.github.com/bootstrap/javascript.html#scrollspy
1419 | * =============================================================
1420 | * Copyright 2012 Twitter, Inc.
1421 | *
1422 | * Licensed under the Apache License, Version 2.0 (the "License");
1423 | * you may not use this file except in compliance with the License.
1424 | * You may obtain a copy of the License at
1425 | *
1426 | * http://www.apache.org/licenses/LICENSE-2.0
1427 | *
1428 | * Unless required by applicable law or agreed to in writing, software
1429 | * distributed under the License is distributed on an "AS IS" BASIS,
1430 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1431 | * See the License for the specific language governing permissions and
1432 | * limitations under the License.
1433 | * ============================================================== */
1434 |
1435 |
1436 | !function ($) {
1437 |
1438 | "use strict"; // jshint ;_;
1439 |
1440 |
1441 | /* SCROLLSPY CLASS DEFINITION
1442 | * ========================== */
1443 |
1444 | function ScrollSpy(element, options) {
1445 | var process = $.proxy(this.process, this)
1446 | , $element = $(element).is('body') ? $(window) : $(element)
1447 | , href
1448 | this.options = $.extend({}, $.fn.scrollspy.defaults, options)
1449 | this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)
1450 | this.selector = (this.options.target
1451 | || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
1452 | || '') + ' .nav li > a'
1453 | this.$body = $('body')
1454 | this.refresh()
1455 | this.process()
1456 | }
1457 |
1458 | ScrollSpy.prototype = {
1459 |
1460 | constructor: ScrollSpy
1461 |
1462 | , refresh: function () {
1463 | var self = this
1464 | , $targets
1465 |
1466 | this.offsets = $([])
1467 | this.targets = $([])
1468 |
1469 | $targets = this.$body
1470 | .find(this.selector)
1471 | .map(function () {
1472 | var $el = $(this)
1473 | , href = $el.data('target') || $el.attr('href')
1474 | , $href = /^#\w/.test(href) && $(href)
1475 | return ( $href
1476 | && $href.length
1477 | && [[ $href.position().top + self.$scrollElement.scrollTop(), href ]] ) || null
1478 | })
1479 | .sort(function (a, b) { return a[0] - b[0] })
1480 | .each(function () {
1481 | self.offsets.push(this[0])
1482 | self.targets.push(this[1])
1483 | })
1484 | }
1485 |
1486 | , process: function () {
1487 | var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
1488 | , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
1489 | , maxScroll = scrollHeight - this.$scrollElement.height()
1490 | , offsets = this.offsets
1491 | , targets = this.targets
1492 | , activeTarget = this.activeTarget
1493 | , i
1494 |
1495 | if (scrollTop >= maxScroll) {
1496 | return activeTarget != (i = targets.last()[0])
1497 | && this.activate ( i )
1498 | }
1499 |
1500 | for (i = offsets.length; i--;) {
1501 | activeTarget != targets[i]
1502 | && scrollTop >= offsets[i]
1503 | && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
1504 | && this.activate( targets[i] )
1505 | }
1506 | }
1507 |
1508 | , activate: function (target) {
1509 | var active
1510 | , selector
1511 |
1512 | this.activeTarget = target
1513 |
1514 | $(this.selector)
1515 | .parent('.active')
1516 | .removeClass('active')
1517 |
1518 | selector = this.selector
1519 | + '[data-target="' + target + '"],'
1520 | + this.selector + '[href="' + target + '"]'
1521 |
1522 | active = $(selector)
1523 | .parent('li')
1524 | .addClass('active')
1525 |
1526 | if (active.parent('.dropdown-menu').length) {
1527 | active = active.closest('li.dropdown').addClass('active')
1528 | }
1529 |
1530 | active.trigger('activate')
1531 | }
1532 |
1533 | }
1534 |
1535 |
1536 | /* SCROLLSPY PLUGIN DEFINITION
1537 | * =========================== */
1538 |
1539 | var old = $.fn.scrollspy
1540 |
1541 | $.fn.scrollspy = function (option) {
1542 | return this.each(function () {
1543 | var $this = $(this)
1544 | , data = $this.data('scrollspy')
1545 | , options = typeof option == 'object' && option
1546 | if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
1547 | if (typeof option == 'string') data[option]()
1548 | })
1549 | }
1550 |
1551 | $.fn.scrollspy.Constructor = ScrollSpy
1552 |
1553 | $.fn.scrollspy.defaults = {
1554 | offset: 10
1555 | }
1556 |
1557 |
1558 | /* SCROLLSPY NO CONFLICT
1559 | * ===================== */
1560 |
1561 | $.fn.scrollspy.noConflict = function () {
1562 | $.fn.scrollspy = old
1563 | return this
1564 | }
1565 |
1566 |
1567 | /* SCROLLSPY DATA-API
1568 | * ================== */
1569 |
1570 | $(window).on('load', function () {
1571 | $('[data-spy="scroll"]').each(function () {
1572 | var $spy = $(this)
1573 | $spy.scrollspy($spy.data())
1574 | })
1575 | })
1576 |
1577 | }(window.jQuery);/* ========================================================
1578 | * bootstrap-tab.js v2.2.2
1579 | * http://twitter.github.com/bootstrap/javascript.html#tabs
1580 | * ========================================================
1581 | * Copyright 2012 Twitter, Inc.
1582 | *
1583 | * Licensed under the Apache License, Version 2.0 (the "License");
1584 | * you may not use this file except in compliance with the License.
1585 | * You may obtain a copy of the License at
1586 | *
1587 | * http://www.apache.org/licenses/LICENSE-2.0
1588 | *
1589 | * Unless required by applicable law or agreed to in writing, software
1590 | * distributed under the License is distributed on an "AS IS" BASIS,
1591 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1592 | * See the License for the specific language governing permissions and
1593 | * limitations under the License.
1594 | * ======================================================== */
1595 |
1596 |
1597 | !function ($) {
1598 |
1599 | "use strict"; // jshint ;_;
1600 |
1601 |
1602 | /* TAB CLASS DEFINITION
1603 | * ==================== */
1604 |
1605 | var Tab = function (element) {
1606 | this.element = $(element)
1607 | }
1608 |
1609 | Tab.prototype = {
1610 |
1611 | constructor: Tab
1612 |
1613 | , show: function () {
1614 | var $this = this.element
1615 | , $ul = $this.closest('ul:not(.dropdown-menu)')
1616 | , selector = $this.attr('data-target')
1617 | , previous
1618 | , $target
1619 | , e
1620 |
1621 | if (!selector) {
1622 | selector = $this.attr('href')
1623 | selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
1624 | }
1625 |
1626 | if ( $this.parent('li').hasClass('active') ) return
1627 |
1628 | previous = $ul.find('.active:last a')[0]
1629 |
1630 | e = $.Event('show', {
1631 | relatedTarget: previous
1632 | })
1633 |
1634 | $this.trigger(e)
1635 |
1636 | if (e.isDefaultPrevented()) return
1637 |
1638 | $target = $(selector)
1639 |
1640 | this.activate($this.parent('li'), $ul)
1641 | this.activate($target, $target.parent(), function () {
1642 | $this.trigger({
1643 | type: 'shown'
1644 | , relatedTarget: previous
1645 | })
1646 | })
1647 | }
1648 |
1649 | , activate: function ( element, container, callback) {
1650 | var $active = container.find('> .active')
1651 | , transition = callback
1652 | && $.support.transition
1653 | && $active.hasClass('fade')
1654 |
1655 | function next() {
1656 | $active
1657 | .removeClass('active')
1658 | .find('> .dropdown-menu > .active')
1659 | .removeClass('active')
1660 |
1661 | element.addClass('active')
1662 |
1663 | if (transition) {
1664 | element[0].offsetWidth // reflow for transition
1665 | element.addClass('in')
1666 | } else {
1667 | element.removeClass('fade')
1668 | }
1669 |
1670 | if ( element.parent('.dropdown-menu') ) {
1671 | element.closest('li.dropdown').addClass('active')
1672 | }
1673 |
1674 | callback && callback()
1675 | }
1676 |
1677 | transition ?
1678 | $active.one($.support.transition.end, next) :
1679 | next()
1680 |
1681 | $active.removeClass('in')
1682 | }
1683 | }
1684 |
1685 |
1686 | /* TAB PLUGIN DEFINITION
1687 | * ===================== */
1688 |
1689 | var old = $.fn.tab
1690 |
1691 | $.fn.tab = function ( option ) {
1692 | return this.each(function () {
1693 | var $this = $(this)
1694 | , data = $this.data('tab')
1695 | if (!data) $this.data('tab', (data = new Tab(this)))
1696 | if (typeof option == 'string') data[option]()
1697 | })
1698 | }
1699 |
1700 | $.fn.tab.Constructor = Tab
1701 |
1702 |
1703 | /* TAB NO CONFLICT
1704 | * =============== */
1705 |
1706 | $.fn.tab.noConflict = function () {
1707 | $.fn.tab = old
1708 | return this
1709 | }
1710 |
1711 |
1712 | /* TAB DATA-API
1713 | * ============ */
1714 |
1715 | $(document).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
1716 | e.preventDefault()
1717 | $(this).tab('show')
1718 | })
1719 |
1720 | }(window.jQuery);/* =============================================================
1721 | * bootstrap-typeahead.js v2.2.2
1722 | * http://twitter.github.com/bootstrap/javascript.html#typeahead
1723 | * =============================================================
1724 | * Copyright 2012 Twitter, Inc.
1725 | *
1726 | * Licensed under the Apache License, Version 2.0 (the "License");
1727 | * you may not use this file except in compliance with the License.
1728 | * You may obtain a copy of the License at
1729 | *
1730 | * http://www.apache.org/licenses/LICENSE-2.0
1731 | *
1732 | * Unless required by applicable law or agreed to in writing, software
1733 | * distributed under the License is distributed on an "AS IS" BASIS,
1734 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1735 | * See the License for the specific language governing permissions and
1736 | * limitations under the License.
1737 | * ============================================================ */
1738 |
1739 |
1740 | !function($){
1741 |
1742 | "use strict"; // jshint ;_;
1743 |
1744 |
1745 | /* TYPEAHEAD PUBLIC CLASS DEFINITION
1746 | * ================================= */
1747 |
1748 | var Typeahead = function (element, options) {
1749 | this.$element = $(element)
1750 | this.options = $.extend({}, $.fn.typeahead.defaults, options)
1751 | this.matcher = this.options.matcher || this.matcher
1752 | this.sorter = this.options.sorter || this.sorter
1753 | this.highlighter = this.options.highlighter || this.highlighter
1754 | this.updater = this.options.updater || this.updater
1755 | this.source = this.options.source
1756 | this.$menu = $(this.options.menu)
1757 | this.shown = false
1758 | this.listen()
1759 | }
1760 |
1761 | Typeahead.prototype = {
1762 |
1763 | constructor: Typeahead
1764 |
1765 | , select: function () {
1766 | var val = this.$menu.find('.active').attr('data-value')
1767 | this.$element
1768 | .val(this.updater(val))
1769 | .change()
1770 | return this.hide()
1771 | }
1772 |
1773 | , updater: function (item) {
1774 | return item
1775 | }
1776 |
1777 | , show: function () {
1778 | var pos = $.extend({}, this.$element.position(), {
1779 | height: this.$element[0].offsetHeight
1780 | })
1781 |
1782 | this.$menu
1783 | .insertAfter(this.$element)
1784 | .css({
1785 | top: pos.top + pos.height
1786 | , left: pos.left
1787 | })
1788 | .show()
1789 |
1790 | this.shown = true
1791 | return this
1792 | }
1793 |
1794 | , hide: function () {
1795 | this.$menu.hide()
1796 | this.shown = false
1797 | return this
1798 | }
1799 |
1800 | , lookup: function (event) {
1801 | var items
1802 |
1803 | this.query = this.$element.val()
1804 |
1805 | if (!this.query || this.query.length < this.options.minLength) {
1806 | return this.shown ? this.hide() : this
1807 | }
1808 |
1809 | items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source
1810 |
1811 | return items ? this.process(items) : this
1812 | }
1813 |
1814 | , process: function (items) {
1815 | var that = this
1816 |
1817 | items = $.grep(items, function (item) {
1818 | return that.matcher(item)
1819 | })
1820 |
1821 | items = this.sorter(items)
1822 |
1823 | if (!items.length) {
1824 | return this.shown ? this.hide() : this
1825 | }
1826 |
1827 | return this.render(items.slice(0, this.options.items)).show()
1828 | }
1829 |
1830 | , matcher: function (item) {
1831 | return ~item.toLowerCase().indexOf(this.query.toLowerCase())
1832 | }
1833 |
1834 | , sorter: function (items) {
1835 | var beginswith = []
1836 | , caseSensitive = []
1837 | , caseInsensitive = []
1838 | , item
1839 |
1840 | while (item = items.shift()) {
1841 | if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
1842 | else if (~item.indexOf(this.query)) caseSensitive.push(item)
1843 | else caseInsensitive.push(item)
1844 | }
1845 |
1846 | return beginswith.concat(caseSensitive, caseInsensitive)
1847 | }
1848 |
1849 | , highlighter: function (item) {
1850 | var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
1851 | return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
1852 | return '' + match + ''
1853 | })
1854 | }
1855 |
1856 | , render: function (items) {
1857 | var that = this
1858 |
1859 | items = $(items).map(function (i, item) {
1860 | i = $(that.options.item).attr('data-value', item)
1861 | i.find('a').html(that.highlighter(item))
1862 | return i[0]
1863 | })
1864 |
1865 | items.first().addClass('active')
1866 | this.$menu.html(items)
1867 | return this
1868 | }
1869 |
1870 | , next: function (event) {
1871 | var active = this.$menu.find('.active').removeClass('active')
1872 | , next = active.next()
1873 |
1874 | if (!next.length) {
1875 | next = $(this.$menu.find('li')[0])
1876 | }
1877 |
1878 | next.addClass('active')
1879 | }
1880 |
1881 | , prev: function (event) {
1882 | var active = this.$menu.find('.active').removeClass('active')
1883 | , prev = active.prev()
1884 |
1885 | if (!prev.length) {
1886 | prev = this.$menu.find('li').last()
1887 | }
1888 |
1889 | prev.addClass('active')
1890 | }
1891 |
1892 | , listen: function () {
1893 | this.$element
1894 | .on('blur', $.proxy(this.blur, this))
1895 | .on('keypress', $.proxy(this.keypress, this))
1896 | .on('keyup', $.proxy(this.keyup, this))
1897 |
1898 | if (this.eventSupported('keydown')) {
1899 | this.$element.on('keydown', $.proxy(this.keydown, this))
1900 | }
1901 |
1902 | this.$menu
1903 | .on('click', $.proxy(this.click, this))
1904 | .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
1905 | }
1906 |
1907 | , eventSupported: function(eventName) {
1908 | var isSupported = eventName in this.$element
1909 | if (!isSupported) {
1910 | this.$element.setAttribute(eventName, 'return;')
1911 | isSupported = typeof this.$element[eventName] === 'function'
1912 | }
1913 | return isSupported
1914 | }
1915 |
1916 | , move: function (e) {
1917 | if (!this.shown) return
1918 |
1919 | switch(e.keyCode) {
1920 | case 9: // tab
1921 | case 13: // enter
1922 | case 27: // escape
1923 | e.preventDefault()
1924 | break
1925 |
1926 | case 38: // up arrow
1927 | e.preventDefault()
1928 | this.prev()
1929 | break
1930 |
1931 | case 40: // down arrow
1932 | e.preventDefault()
1933 | this.next()
1934 | break
1935 | }
1936 |
1937 | e.stopPropagation()
1938 | }
1939 |
1940 | , keydown: function (e) {
1941 | this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27])
1942 | this.move(e)
1943 | }
1944 |
1945 | , keypress: function (e) {
1946 | if (this.suppressKeyPressRepeat) return
1947 | this.move(e)
1948 | }
1949 |
1950 | , keyup: function (e) {
1951 | switch(e.keyCode) {
1952 | case 40: // down arrow
1953 | case 38: // up arrow
1954 | case 16: // shift
1955 | case 17: // ctrl
1956 | case 18: // alt
1957 | break
1958 |
1959 | case 9: // tab
1960 | case 13: // enter
1961 | if (!this.shown) return
1962 | this.select()
1963 | break
1964 |
1965 | case 27: // escape
1966 | if (!this.shown) return
1967 | this.hide()
1968 | break
1969 |
1970 | default:
1971 | this.lookup()
1972 | }
1973 |
1974 | e.stopPropagation()
1975 | e.preventDefault()
1976 | }
1977 |
1978 | , blur: function (e) {
1979 | var that = this
1980 | setTimeout(function () { that.hide() }, 150)
1981 | }
1982 |
1983 | , click: function (e) {
1984 | e.stopPropagation()
1985 | e.preventDefault()
1986 | this.select()
1987 | }
1988 |
1989 | , mouseenter: function (e) {
1990 | this.$menu.find('.active').removeClass('active')
1991 | $(e.currentTarget).addClass('active')
1992 | }
1993 |
1994 | }
1995 |
1996 |
1997 | /* TYPEAHEAD PLUGIN DEFINITION
1998 | * =========================== */
1999 |
2000 | var old = $.fn.typeahead
2001 |
2002 | $.fn.typeahead = function (option) {
2003 | return this.each(function () {
2004 | var $this = $(this)
2005 | , data = $this.data('typeahead')
2006 | , options = typeof option == 'object' && option
2007 | if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
2008 | if (typeof option == 'string') data[option]()
2009 | })
2010 | }
2011 |
2012 | $.fn.typeahead.defaults = {
2013 | source: []
2014 | , items: 8
2015 | , menu: ''
2016 | , item: ''
2017 | , minLength: 1
2018 | }
2019 |
2020 | $.fn.typeahead.Constructor = Typeahead
2021 |
2022 |
2023 | /* TYPEAHEAD NO CONFLICT
2024 | * =================== */
2025 |
2026 | $.fn.typeahead.noConflict = function () {
2027 | $.fn.typeahead = old
2028 | return this
2029 | }
2030 |
2031 |
2032 | /* TYPEAHEAD DATA-API
2033 | * ================== */
2034 |
2035 | $(document).on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
2036 | var $this = $(this)
2037 | if ($this.data('typeahead')) return
2038 | e.preventDefault()
2039 | $this.typeahead($this.data())
2040 | })
2041 |
2042 | }(window.jQuery);
2043 | /* ==========================================================
2044 | * bootstrap-affix.js v2.2.2
2045 | * http://twitter.github.com/bootstrap/javascript.html#affix
2046 | * ==========================================================
2047 | * Copyright 2012 Twitter, Inc.
2048 | *
2049 | * Licensed under the Apache License, Version 2.0 (the "License");
2050 | * you may not use this file except in compliance with the License.
2051 | * You may obtain a copy of the License at
2052 | *
2053 | * http://www.apache.org/licenses/LICENSE-2.0
2054 | *
2055 | * Unless required by applicable law or agreed to in writing, software
2056 | * distributed under the License is distributed on an "AS IS" BASIS,
2057 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2058 | * See the License for the specific language governing permissions and
2059 | * limitations under the License.
2060 | * ========================================================== */
2061 |
2062 |
2063 | !function ($) {
2064 |
2065 | "use strict"; // jshint ;_;
2066 |
2067 |
2068 | /* AFFIX CLASS DEFINITION
2069 | * ====================== */
2070 |
2071 | var Affix = function (element, options) {
2072 | this.options = $.extend({}, $.fn.affix.defaults, options)
2073 | this.$window = $(window)
2074 | .on('scroll.affix.data-api', $.proxy(this.checkPosition, this))
2075 | .on('click.affix.data-api', $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this))
2076 | this.$element = $(element)
2077 | this.checkPosition()
2078 | }
2079 |
2080 | Affix.prototype.checkPosition = function () {
2081 | if (!this.$element.is(':visible')) return
2082 |
2083 | var scrollHeight = $(document).height()
2084 | , scrollTop = this.$window.scrollTop()
2085 | , position = this.$element.offset()
2086 | , offset = this.options.offset
2087 | , offsetBottom = offset.bottom
2088 | , offsetTop = offset.top
2089 | , reset = 'affix affix-top affix-bottom'
2090 | , affix
2091 |
2092 | if (typeof offset != 'object') offsetBottom = offsetTop = offset
2093 | if (typeof offsetTop == 'function') offsetTop = offset.top()
2094 | if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
2095 |
2096 | affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?
2097 | false : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?
2098 | 'bottom' : offsetTop != null && scrollTop <= offsetTop ?
2099 | 'top' : false
2100 |
2101 | if (this.affixed === affix) return
2102 |
2103 | this.affixed = affix
2104 | this.unpin = affix == 'bottom' ? position.top - scrollTop : null
2105 |
2106 | this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))
2107 | }
2108 |
2109 |
2110 | /* AFFIX PLUGIN DEFINITION
2111 | * ======================= */
2112 |
2113 | var old = $.fn.affix
2114 |
2115 | $.fn.affix = function (option) {
2116 | return this.each(function () {
2117 | var $this = $(this)
2118 | , data = $this.data('affix')
2119 | , options = typeof option == 'object' && option
2120 | if (!data) $this.data('affix', (data = new Affix(this, options)))
2121 | if (typeof option == 'string') data[option]()
2122 | })
2123 | }
2124 |
2125 | $.fn.affix.Constructor = Affix
2126 |
2127 | $.fn.affix.defaults = {
2128 | offset: 0
2129 | }
2130 |
2131 |
2132 | /* AFFIX NO CONFLICT
2133 | * ================= */
2134 |
2135 | $.fn.affix.noConflict = function () {
2136 | $.fn.affix = old
2137 | return this
2138 | }
2139 |
2140 |
2141 | /* AFFIX DATA-API
2142 | * ============== */
2143 |
2144 | $(window).on('load', function () {
2145 | $('[data-spy="affix"]').each(function () {
2146 | var $spy = $(this)
2147 | , data = $spy.data()
2148 |
2149 | data.offset = data.offset || {}
2150 |
2151 | data.offsetBottom && (data.offset.bottom = data.offsetBottom)
2152 | data.offsetTop && (data.offset.top = data.offsetTop)
2153 |
2154 | $spy.affix(data)
2155 | })
2156 | })
2157 |
2158 |
2159 | }(window.jQuery);
--------------------------------------------------------------------------------
/Resources/public/js/bootstrap.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap.js by @fat & @mdo
3 | * Copyright 2012 Twitter, Inc.
4 | * http://www.apache.org/licenses/LICENSE-2.0.txt
5 | */
6 | !function($){"use strict";$(function(){$.support.transition=function(){var transitionEnd=function(){var name,el=document.createElement("bootstrap"),transEndEventNames={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(name in transEndEventNames)if(void 0!==el.style[name])return transEndEventNames[name]}();return transitionEnd&&{end:transitionEnd}}()})}(window.jQuery),!function($){"use strict";var dismiss='[data-dismiss="alert"]',Alert=function(el){$(el).on("click",dismiss,this.close)};Alert.prototype.close=function(e){function removeElement(){$parent.trigger("closed").remove()}var $parent,$this=$(this),selector=$this.attr("data-target");selector||(selector=$this.attr("href"),selector=selector&&selector.replace(/.*(?=#[^\s]*$)/,"")),$parent=$(selector),e&&e.preventDefault(),$parent.length||($parent=$this.hasClass("alert")?$this:$this.parent()),$parent.trigger(e=$.Event("close")),e.isDefaultPrevented()||($parent.removeClass("in"),$.support.transition&&$parent.hasClass("fade")?$parent.on($.support.transition.end,removeElement):removeElement())};var old=$.fn.alert;$.fn.alert=function(option){return this.each(function(){var $this=$(this),data=$this.data("alert");data||$this.data("alert",data=new Alert(this)),"string"==typeof option&&data[option].call($this)})},$.fn.alert.Constructor=Alert,$.fn.alert.noConflict=function(){return $.fn.alert=old,this},$(document).on("click.alert.data-api",dismiss,Alert.prototype.close)}(window.jQuery),!function($){"use strict";var Button=function(element,options){this.$element=$(element),this.options=$.extend({},$.fn.button.defaults,options)};Button.prototype.setState=function(state){var d="disabled",$el=this.$element,data=$el.data(),val=$el.is("input")?"val":"html";state+="Text",data.resetText||$el.data("resetText",$el[val]()),$el[val](data[state]||this.options[state]),setTimeout(function(){"loadingText"==state?$el.addClass(d).attr(d,d):$el.removeClass(d).removeAttr(d)},0)},Button.prototype.toggle=function(){var $parent=this.$element.closest('[data-toggle="buttons-radio"]');$parent&&$parent.find(".active").removeClass("active"),this.$element.toggleClass("active")};var old=$.fn.button;$.fn.button=function(option){return this.each(function(){var $this=$(this),data=$this.data("button"),options="object"==typeof option&&option;data||$this.data("button",data=new Button(this,options)),"toggle"==option?data.toggle():option&&data.setState(option)})},$.fn.button.defaults={loadingText:"loading..."},$.fn.button.Constructor=Button,$.fn.button.noConflict=function(){return $.fn.button=old,this},$(document).on("click.button.data-api","[data-toggle^=button]",function(e){var $btn=$(e.target);$btn.hasClass("btn")||($btn=$btn.closest(".btn")),$btn.button("toggle")})}(window.jQuery),!function($){"use strict";var Carousel=function(element,options){this.$element=$(element),this.options=options,"hover"==this.options.pause&&this.$element.on("mouseenter",$.proxy(this.pause,this)).on("mouseleave",$.proxy(this.cycle,this))};Carousel.prototype={cycle:function(e){return e||(this.paused=!1),this.options.interval&&!this.paused&&(this.interval=setInterval($.proxy(this.next,this),this.options.interval)),this},to:function(pos){var $active=this.$element.find(".item.active"),children=$active.parent().children(),activePos=children.index($active),that=this;if(!(pos>children.length-1||0>pos))return this.sliding?this.$element.one("slid",function(){that.to(pos)}):activePos==pos?this.pause().cycle():this.slide(pos>activePos?"next":"prev",$(children[pos]))},pause:function(e){return e||(this.paused=!0),this.$element.find(".next, .prev").length&&$.support.transition.end&&(this.$element.trigger($.support.transition.end),this.cycle()),clearInterval(this.interval),this.interval=null,this},next:function(){return this.sliding?void 0:this.slide("next")},prev:function(){return this.sliding?void 0:this.slide("prev")},slide:function(type,next){var e,$active=this.$element.find(".item.active"),$next=next||$active[type](),isCycling=this.interval,direction="next"==type?"left":"right",fallback="next"==type?"first":"last",that=this;if(this.sliding=!0,isCycling&&this.pause(),$next=$next.length?$next:this.$element.find(".item")[fallback](),e=$.Event("slide",{relatedTarget:$next[0]}),!$next.hasClass("active")){if($.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(e),e.isDefaultPrevented())return;$next.addClass(type),$next[0].offsetWidth,$active.addClass(direction),$next.addClass(direction),this.$element.one($.support.transition.end,function(){$next.removeClass([type,direction].join(" ")).addClass("active"),$active.removeClass(["active",direction].join(" ")),that.sliding=!1,setTimeout(function(){that.$element.trigger("slid")},0)})}else{if(this.$element.trigger(e),e.isDefaultPrevented())return;$active.removeClass("active"),$next.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return isCycling&&this.cycle(),this}}};var old=$.fn.carousel;$.fn.carousel=function(option){return this.each(function(){var $this=$(this),data=$this.data("carousel"),options=$.extend({},$.fn.carousel.defaults,"object"==typeof option&&option),action="string"==typeof option?option:options.slide;data||$this.data("carousel",data=new Carousel(this,options)),"number"==typeof option?data.to(option):action?data[action]():options.interval&&data.cycle()})},$.fn.carousel.defaults={interval:5e3,pause:"hover"},$.fn.carousel.Constructor=Carousel,$.fn.carousel.noConflict=function(){return $.fn.carousel=old,this},$(document).on("click.carousel.data-api","[data-slide]",function(e){var href,$this=$(this),$target=$($this.attr("data-target")||(href=$this.attr("href"))&&href.replace(/.*(?=#[^\s]+$)/,"")),options=$.extend({},$target.data(),$this.data());$target.carousel(options),e.preventDefault()})}(window.jQuery),!function($){"use strict";var Collapse=function(element,options){this.$element=$(element),this.options=$.extend({},$.fn.collapse.defaults,options),this.options.parent&&(this.$parent=$(this.options.parent)),this.options.toggle&&this.toggle()};Collapse.prototype={constructor:Collapse,dimension:function(){var hasWidth=this.$element.hasClass("width");return hasWidth?"width":"height"},show:function(){var dimension,scroll,actives,hasData;if(!this.transitioning){if(dimension=this.dimension(),scroll=$.camelCase(["scroll",dimension].join("-")),actives=this.$parent&&this.$parent.find("> .accordion-group > .in"),actives&&actives.length){if(hasData=actives.data("collapse"),hasData&&hasData.transitioning)return;actives.collapse("hide"),hasData||actives.data("collapse",null)}this.$element[dimension](0),this.transition("addClass",$.Event("show"),"shown"),$.support.transition&&this.$element[dimension](this.$element[0][scroll])}},hide:function(){var dimension;this.transitioning||(dimension=this.dimension(),this.reset(this.$element[dimension]()),this.transition("removeClass",$.Event("hide"),"hidden"),this.$element[dimension](0))},reset:function(size){var dimension=this.dimension();return this.$element.removeClass("collapse")[dimension](size||"auto")[0].offsetWidth,this.$element[null!==size?"addClass":"removeClass"]("collapse"),this},transition:function(method,startEvent,completeEvent){var that=this,complete=function(){"show"==startEvent.type&&that.reset(),that.transitioning=0,that.$element.trigger(completeEvent)};this.$element.trigger(startEvent),startEvent.isDefaultPrevented()||(this.transitioning=1,this.$element[method]("in"),$.support.transition&&this.$element.hasClass("collapse")?this.$element.one($.support.transition.end,complete):complete())},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var old=$.fn.collapse;$.fn.collapse=function(option){return this.each(function(){var $this=$(this),data=$this.data("collapse"),options="object"==typeof option&&option;data||$this.data("collapse",data=new Collapse(this,options)),"string"==typeof option&&data[option]()})},$.fn.collapse.defaults={toggle:!0},$.fn.collapse.Constructor=Collapse,$.fn.collapse.noConflict=function(){return $.fn.collapse=old,this},$(document).on("click.collapse.data-api","[data-toggle=collapse]",function(e){var href,$this=$(this),target=$this.attr("data-target")||e.preventDefault()||(href=$this.attr("href"))&&href.replace(/.*(?=#[^\s]+$)/,""),option=$(target).data("collapse")?"toggle":$this.data();$this[$(target).hasClass("in")?"addClass":"removeClass"]("collapsed"),$(target).collapse(option)})}(window.jQuery),!function($){"use strict";function clearMenus(){$(toggle).each(function(){getParent($(this)).removeClass("open")})}function getParent($this){var $parent,selector=$this.attr("data-target");return selector||(selector=$this.attr("href"),selector=selector&&/#/.test(selector)&&selector.replace(/.*(?=#[^\s]*$)/,"")),$parent=$(selector),$parent.length||($parent=$this.parent()),$parent}var toggle="[data-toggle=dropdown]",Dropdown=function(element){var $el=$(element).on("click.dropdown.data-api",this.toggle);$("html").on("click.dropdown.data-api",function(){$el.parent().removeClass("open")})};Dropdown.prototype={constructor:Dropdown,toggle:function(){var $parent,isActive,$this=$(this);if(!$this.is(".disabled, :disabled"))return $parent=getParent($this),isActive=$parent.hasClass("open"),clearMenus(),isActive||$parent.toggleClass("open"),$this.focus(),!1},keydown:function(e){var $this,$items,$parent,isActive,index;if(/(38|40|27)/.test(e.keyCode)&&($this=$(this),e.preventDefault(),e.stopPropagation(),!$this.is(".disabled, :disabled"))){if($parent=getParent($this),isActive=$parent.hasClass("open"),!isActive||isActive&&27==e.keyCode)return $this.click();$items=$("[role=menu] li:not(.divider):visible a",$parent),$items.length&&(index=$items.index($items.filter(":focus")),38==e.keyCode&&index>0&&index--,40==e.keyCode&&$items.length-1>index&&index++,~index||(index=0),$items.eq(index).focus())}}};var old=$.fn.dropdown;$.fn.dropdown=function(option){return this.each(function(){var $this=$(this),data=$this.data("dropdown");data||$this.data("dropdown",data=new Dropdown(this)),"string"==typeof option&&data[option].call($this)})},$.fn.dropdown.Constructor=Dropdown,$.fn.dropdown.noConflict=function(){return $.fn.dropdown=old,this},$(document).on("click.dropdown.data-api touchstart.dropdown.data-api",clearMenus).on("click.dropdown touchstart.dropdown.data-api",".dropdown form",function(e){e.stopPropagation()}).on("touchstart.dropdown.data-api",".dropdown-menu",function(e){e.stopPropagation()}).on("click.dropdown.data-api touchstart.dropdown.data-api",toggle,Dropdown.prototype.toggle).on("keydown.dropdown.data-api touchstart.dropdown.data-api",toggle+", [role=menu]",Dropdown.prototype.keydown)}(window.jQuery),!function($){"use strict";var Modal=function(element,options){this.options=options,this.$element=$(element).delegate('[data-dismiss="modal"]',"click.dismiss.modal",$.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};Modal.prototype={constructor:Modal,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var that=this,e=$.Event("show");this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.backdrop(function(){var transition=$.support.transition&&that.$element.hasClass("fade");that.$element.parent().length||that.$element.appendTo(document.body),that.$element.show(),transition&&that.$element[0].offsetWidth,that.$element.addClass("in").attr("aria-hidden",!1),that.enforceFocus(),transition?that.$element.one($.support.transition.end,function(){that.$element.focus().trigger("shown")}):that.$element.focus().trigger("shown")}))},hide:function(e){e&&e.preventDefault(),e=$.Event("hide"),this.$element.trigger(e),this.isShown&&!e.isDefaultPrevented()&&(this.isShown=!1,this.escape(),$(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),$.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal())},enforceFocus:function(){var that=this;$(document).on("focusin.modal",function(e){that.$element[0]===e.target||that.$element.has(e.target).length||that.$element.focus()})},escape:function(){var that=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(e){27==e.which&&that.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var that=this,timeout=setTimeout(function(){that.$element.off($.support.transition.end),that.hideModal()},500);this.$element.one($.support.transition.end,function(){clearTimeout(timeout),that.hideModal()})},hideModal:function(){this.$element.hide().trigger("hidden"),this.backdrop()},removeBackdrop:function(){this.$backdrop.remove(),this.$backdrop=null},backdrop:function(callback){var animate=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var doAnimate=$.support.transition&&animate;this.$backdrop=$('').appendTo(document.body),this.$backdrop.click("static"==this.options.backdrop?$.proxy(this.$element[0].focus,this.$element[0]):$.proxy(this.hide,this)),doAnimate&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),doAnimate?this.$backdrop.one($.support.transition.end,callback):callback()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),$.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one($.support.transition.end,$.proxy(this.removeBackdrop,this)):this.removeBackdrop()):callback&&callback()}};var old=$.fn.modal;$.fn.modal=function(option){return this.each(function(){var $this=$(this),data=$this.data("modal"),options=$.extend({},$.fn.modal.defaults,$this.data(),"object"==typeof option&&option);data||$this.data("modal",data=new Modal(this,options)),"string"==typeof option?data[option]():options.show&&data.show()})},$.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},$.fn.modal.Constructor=Modal,$.fn.modal.noConflict=function(){return $.fn.modal=old,this},$(document).on("click.modal.data-api",'[data-toggle="modal"]',function(e){var $this=$(this),href=$this.attr("href"),$target=$($this.attr("data-target")||href&&href.replace(/.*(?=#[^\s]+$)/,"")),option=$target.data("modal")?"toggle":$.extend({remote:!/#/.test(href)&&href},$target.data(),$this.data());e.preventDefault(),$target.modal(option).one("hide",function(){$this.focus()})})}(window.jQuery),!function($){"use strict";var Tooltip=function(element,options){this.init("tooltip",element,options)};Tooltip.prototype={constructor:Tooltip,init:function(type,element,options){var eventIn,eventOut;this.type=type,this.$element=$(element),this.options=this.getOptions(options),this.enabled=!0,"click"==this.options.trigger?this.$element.on("click."+this.type,this.options.selector,$.proxy(this.toggle,this)):"manual"!=this.options.trigger&&(eventIn="hover"==this.options.trigger?"mouseenter":"focus",eventOut="hover"==this.options.trigger?"mouseleave":"blur",this.$element.on(eventIn+"."+this.type,this.options.selector,$.proxy(this.enter,this)),this.$element.on(eventOut+"."+this.type,this.options.selector,$.proxy(this.leave,this))),this.options.selector?this._options=$.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(options){return options=$.extend({},$.fn[this.type].defaults,options,this.$element.data()),options.delay&&"number"==typeof options.delay&&(options.delay={show:options.delay,hide:options.delay}),options},enter:function(e){var self=$(e.currentTarget)[this.type](this._options).data(this.type);return self.options.delay&&self.options.delay.show?(clearTimeout(this.timeout),self.hoverState="in",this.timeout=setTimeout(function(){"in"==self.hoverState&&self.show()},self.options.delay.show),void 0):self.show()},leave:function(e){var self=$(e.currentTarget)[this.type](this._options).data(this.type);return this.timeout&&clearTimeout(this.timeout),self.options.delay&&self.options.delay.hide?(self.hoverState="out",this.timeout=setTimeout(function(){"out"==self.hoverState&&self.hide()},self.options.delay.hide),void 0):self.hide()},show:function(){var $tip,inside,pos,actualWidth,actualHeight,placement,tp;if(this.hasContent()&&this.enabled){switch($tip=this.tip(),this.setContent(),this.options.animation&&$tip.addClass("fade"),placement="function"==typeof this.options.placement?this.options.placement.call(this,$tip[0],this.$element[0]):this.options.placement,inside=/in/.test(placement),$tip.detach().css({top:0,left:0,display:"block"}).insertAfter(this.$element),pos=this.getPosition(inside),actualWidth=$tip[0].offsetWidth,actualHeight=$tip[0].offsetHeight,inside?placement.split(" ")[1]:placement){case"bottom":tp={top:pos.top+pos.height,left:pos.left+pos.width/2-actualWidth/2};break;case"top":tp={top:pos.top-actualHeight,left:pos.left+pos.width/2-actualWidth/2};break;case"left":tp={top:pos.top+pos.height/2-actualHeight/2,left:pos.left-actualWidth};break;case"right":tp={top:pos.top+pos.height/2-actualHeight/2,left:pos.left+pos.width}}$tip.offset(tp).addClass(placement).addClass("in")}},setContent:function(){var $tip=this.tip(),title=this.getTitle();$tip.find(".tooltip-inner")[this.options.html?"html":"text"](title),$tip.removeClass("fade in top bottom left right")},hide:function(){function removeWithAnimation(){var timeout=setTimeout(function(){$tip.off($.support.transition.end).detach()},500);$tip.one($.support.transition.end,function(){clearTimeout(timeout),$tip.detach()})}var $tip=this.tip();return $tip.removeClass("in"),$.support.transition&&this.$tip.hasClass("fade")?removeWithAnimation():$tip.detach(),this},fixTitle:function(){var $e=this.$element;($e.attr("title")||"string"!=typeof $e.attr("data-original-title"))&&$e.attr("data-original-title",$e.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(inside){return $.extend({},inside?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var title,$e=this.$element,o=this.options;return title=$e.attr("data-original-title")||("function"==typeof o.title?o.title.call($e[0]):o.title)},tip:function(){return this.$tip=this.$tip||$(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(e){var self=$(e.currentTarget)[this.type](this._options).data(this.type);self[self.tip().hasClass("in")?"hide":"show"]()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}};var old=$.fn.tooltip;$.fn.tooltip=function(option){return this.each(function(){var $this=$(this),data=$this.data("tooltip"),options="object"==typeof option&&option;data||$this.data("tooltip",data=new Tooltip(this,options)),"string"==typeof option&&data[option]()})},$.fn.tooltip.Constructor=Tooltip,$.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'',trigger:"hover",title:"",delay:0,html:!1},$.fn.tooltip.noConflict=function(){return $.fn.tooltip=old,this}}(window.jQuery),!function($){"use strict";var Popover=function(element,options){this.init("popover",element,options)};Popover.prototype=$.extend({},$.fn.tooltip.Constructor.prototype,{constructor:Popover,setContent:function(){var $tip=this.tip(),title=this.getTitle(),content=this.getContent();$tip.find(".popover-title")[this.options.html?"html":"text"](title),$tip.find(".popover-content")[this.options.html?"html":"text"](content),$tip.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var content,$e=this.$element,o=this.options;return content=$e.attr("data-content")||("function"==typeof o.content?o.content.call($e[0]):o.content)},tip:function(){return this.$tip||(this.$tip=$(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}});var old=$.fn.popover;$.fn.popover=function(option){return this.each(function(){var $this=$(this),data=$this.data("popover"),options="object"==typeof option&&option;data||$this.data("popover",data=new Popover(this,options)),"string"==typeof option&&data[option]()})},$.fn.popover.Constructor=Popover,$.fn.popover.defaults=$.extend({},$.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:''}),$.fn.popover.noConflict=function(){return $.fn.popover=old,this}}(window.jQuery),!function($){"use strict";function ScrollSpy(element,options){var href,process=$.proxy(this.process,this),$element=$(element).is("body")?$(window):$(element);this.options=$.extend({},$.fn.scrollspy.defaults,options),this.$scrollElement=$element.on("scroll.scroll-spy.data-api",process),this.selector=(this.options.target||(href=$(element).attr("href"))&&href.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=$("body"),this.refresh(),this.process()}ScrollSpy.prototype={constructor:ScrollSpy,refresh:function(){var $targets,self=this;this.offsets=$([]),this.targets=$([]),$targets=this.$body.find(this.selector).map(function(){var $el=$(this),href=$el.data("target")||$el.attr("href"),$href=/^#\w/.test(href)&&$(href);return $href&&$href.length&&[[$href.position().top+self.$scrollElement.scrollTop(),href]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){self.offsets.push(this[0]),self.targets.push(this[1])})},process:function(){var i,scrollTop=this.$scrollElement.scrollTop()+this.options.offset,scrollHeight=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,maxScroll=scrollHeight-this.$scrollElement.height(),offsets=this.offsets,targets=this.targets,activeTarget=this.activeTarget;if(scrollTop>=maxScroll)return activeTarget!=(i=targets.last()[0])&&this.activate(i);for(i=offsets.length;i--;)activeTarget!=targets[i]&&scrollTop>=offsets[i]&&(!offsets[i+1]||offsets[i+1]>=scrollTop)&&this.activate(targets[i])},activate:function(target){var active,selector;this.activeTarget=target,$(this.selector).parent(".active").removeClass("active"),selector=this.selector+'[data-target="'+target+'"],'+this.selector+'[href="'+target+'"]',active=$(selector).parent("li").addClass("active"),active.parent(".dropdown-menu").length&&(active=active.closest("li.dropdown").addClass("active")),active.trigger("activate")}};var old=$.fn.scrollspy;$.fn.scrollspy=function(option){return this.each(function(){var $this=$(this),data=$this.data("scrollspy"),options="object"==typeof option&&option;data||$this.data("scrollspy",data=new ScrollSpy(this,options)),"string"==typeof option&&data[option]()})},$.fn.scrollspy.Constructor=ScrollSpy,$.fn.scrollspy.defaults={offset:10},$.fn.scrollspy.noConflict=function(){return $.fn.scrollspy=old,this},$(window).on("load",function(){$('[data-spy="scroll"]').each(function(){var $spy=$(this);$spy.scrollspy($spy.data())})})}(window.jQuery),!function($){"use strict";var Tab=function(element){this.element=$(element)};Tab.prototype={constructor:Tab,show:function(){var previous,$target,e,$this=this.element,$ul=$this.closest("ul:not(.dropdown-menu)"),selector=$this.attr("data-target");selector||(selector=$this.attr("href"),selector=selector&&selector.replace(/.*(?=#[^\s]*$)/,"")),$this.parent("li").hasClass("active")||(previous=$ul.find(".active:last a")[0],e=$.Event("show",{relatedTarget:previous}),$this.trigger(e),e.isDefaultPrevented()||($target=$(selector),this.activate($this.parent("li"),$ul),this.activate($target,$target.parent(),function(){$this.trigger({type:"shown",relatedTarget:previous})})))},activate:function(element,container,callback){function next(){$active.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),element.addClass("active"),transition?(element[0].offsetWidth,element.addClass("in")):element.removeClass("fade"),element.parent(".dropdown-menu")&&element.closest("li.dropdown").addClass("active"),callback&&callback()}var $active=container.find("> .active"),transition=callback&&$.support.transition&&$active.hasClass("fade");transition?$active.one($.support.transition.end,next):next(),$active.removeClass("in")}};var old=$.fn.tab;$.fn.tab=function(option){return this.each(function(){var $this=$(this),data=$this.data("tab");data||$this.data("tab",data=new Tab(this)),"string"==typeof option&&data[option]()})},$.fn.tab.Constructor=Tab,$.fn.tab.noConflict=function(){return $.fn.tab=old,this},$(document).on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(e){e.preventDefault(),$(this).tab("show")})}(window.jQuery),!function($){"use strict";var Typeahead=function(element,options){this.$element=$(element),this.options=$.extend({},$.fn.typeahead.defaults,options),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.source=this.options.source,this.$menu=$(this.options.menu),this.shown=!1,this.listen()};Typeahead.prototype={constructor:Typeahead,select:function(){var val=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(val)).change(),this.hide()},updater:function(item){return item},show:function(){var pos=$.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});return this.$menu.insertAfter(this.$element).css({top:pos.top+pos.height,left:pos.left}).show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(){var items;return this.query=this.$element.val(),!this.query||this.query.length"+match+""})},render:function(items){var that=this;return items=$(items).map(function(i,item){return i=$(that.options.item).attr("data-value",item),i.find("a").html(that.highlighter(item)),i[0]}),items.first().addClass("active"),this.$menu.html(items),this},next:function(){var active=this.$menu.find(".active").removeClass("active"),next=active.next();next.length||(next=$(this.$menu.find("li")[0])),next.addClass("active")},prev:function(){var active=this.$menu.find(".active").removeClass("active"),prev=active.prev();prev.length||(prev=this.$menu.find("li").last()),prev.addClass("active")},listen:function(){this.$element.on("blur",$.proxy(this.blur,this)).on("keypress",$.proxy(this.keypress,this)).on("keyup",$.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",$.proxy(this.keydown,this)),this.$menu.on("click",$.proxy(this.click,this)).on("mouseenter","li",$.proxy(this.mouseenter,this))},eventSupported:function(eventName){var isSupported=eventName in this.$element;return isSupported||(this.$element.setAttribute(eventName,"return;"),isSupported="function"==typeof this.$element[eventName]),isSupported},move:function(e){if(this.shown){switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()}},keydown:function(e){this.suppressKeyPressRepeat=~$.inArray(e.keyCode,[40,38,9,13,27]),this.move(e)},keypress:function(e){this.suppressKeyPressRepeat||this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},blur:function(){var that=this;setTimeout(function(){that.hide()},150)},click:function(e){e.stopPropagation(),e.preventDefault(),this.select()},mouseenter:function(e){this.$menu.find(".active").removeClass("active"),$(e.currentTarget).addClass("active")}};var old=$.fn.typeahead;$.fn.typeahead=function(option){return this.each(function(){var $this=$(this),data=$this.data("typeahead"),options="object"==typeof option&&option;data||$this.data("typeahead",data=new Typeahead(this,options)),"string"==typeof option&&data[option]()})},$.fn.typeahead.defaults={source:[],items:8,menu:'',item:'',minLength:1},$.fn.typeahead.Constructor=Typeahead,$.fn.typeahead.noConflict=function(){return $.fn.typeahead=old,this},$(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(e){var $this=$(this);$this.data("typeahead")||(e.preventDefault(),$this.typeahead($this.data()))})}(window.jQuery),!function($){"use strict";var Affix=function(element,options){this.options=$.extend({},$.fn.affix.defaults,options),this.$window=$(window).on("scroll.affix.data-api",$.proxy(this.checkPosition,this)).on("click.affix.data-api",$.proxy(function(){setTimeout($.proxy(this.checkPosition,this),1)},this)),this.$element=$(element),this.checkPosition()};Affix.prototype.checkPosition=function(){if(this.$element.is(":visible")){var affix,scrollHeight=$(document).height(),scrollTop=this.$window.scrollTop(),position=this.$element.offset(),offset=this.options.offset,offsetBottom=offset.bottom,offsetTop=offset.top,reset="affix affix-top affix-bottom";"object"!=typeof offset&&(offsetBottom=offsetTop=offset),"function"==typeof offsetTop&&(offsetTop=offset.top()),"function"==typeof offsetBottom&&(offsetBottom=offset.bottom()),affix=null!=this.unpin&&scrollTop+this.unpin<=position.top?!1:null!=offsetBottom&&position.top+this.$element.height()>=scrollHeight-offsetBottom?"bottom":null!=offsetTop&&offsetTop>=scrollTop?"top":!1,this.affixed!==affix&&(this.affixed=affix,this.unpin="bottom"==affix?position.top-scrollTop:null,this.$element.removeClass(reset).addClass("affix"+(affix?"-"+affix:"")))}};var old=$.fn.affix;$.fn.affix=function(option){return this.each(function(){var $this=$(this),data=$this.data("affix"),options="object"==typeof option&&option;data||$this.data("affix",data=new Affix(this,options)),"string"==typeof option&&data[option]()})},$.fn.affix.Constructor=Affix,$.fn.affix.defaults={offset:0},$.fn.affix.noConflict=function(){return $.fn.affix=old,this},$(window).on("load",function(){$('[data-spy="affix"]').each(function(){var $spy=$(this),data=$spy.data();data.offset=data.offset||{},data.offsetBottom&&(data.offset.bottom=data.offsetBottom),data.offsetTop&&(data.offset.top=data.offsetTop),$spy.affix(data)})})}(window.jQuery);
--------------------------------------------------------------------------------
/Resources/skeleton/crud/actions/create.php.twig:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Creates a new {{ entity }} entity.
4 | *
5 | {% if 'annotation' == format %}
6 | * @Route("/", name="{{ route_name_prefix }}_create")
7 | * @Method("POST")
8 | * @Template("{{ bundle }}:{{ entity }}:new.html.twig")
9 | {% endif %}
10 | */
11 | public function createAction(Request $request)
12 | {
13 | $entity = new {{ entity_class }}();
14 | $form = $this->createForm(new {{ entity_class }}Type(), $entity);
15 | $form->bind($request);
16 |
17 | if ($form->isValid()) {
18 | $em = $this->getDoctrine()->getManager();
19 | $em->persist($entity);
20 | $em->flush();
21 | $this->get('session')->getFlashBag()->add('success', 'flash.create.success');
22 |
23 | {% if 'show' in actions -%}
24 | return $this->redirect($this->generateUrl('{{ route_name_prefix }}_show', array('id' => $entity->getId())));
25 | {%- else -%}
26 | return $this->redirect($this->generateUrl('{{ route_name_prefix }}'));
27 | {%- endif %}
28 |
29 | }
30 |
31 | {% if 'annotation' == format %}
32 | return array(
33 | 'entity' => $entity,
34 | 'form' => $form->createView(),
35 | );
36 | {% else %}
37 | return $this->render('{{ bundle }}:{{ entity|replace({'\\': '/'}) }}:new.html.twig', array(
38 | 'entity' => $entity,
39 | 'form' => $form->createView(),
40 | ));
41 | {% endif %}
42 | }
43 |
--------------------------------------------------------------------------------
/Resources/skeleton/crud/actions/delete.php.twig:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Deletes a {{ entity }} entity.
4 | *
5 | {% if 'annotation' == format %}
6 | * @Route("/{id}", name="{{ route_name_prefix }}_delete")
7 | * @Method("DELETE")
8 | {% endif %}
9 | */
10 | public function deleteAction(Request $request, $id)
11 | {
12 | $form = $this->createDeleteForm($id);
13 | $form->bind($request);
14 |
15 | if ($form->isValid()) {
16 | $em = $this->getDoctrine()->getManager();
17 | $entity = $em->getRepository('{{ bundle }}:{{ entity }}')->find($id);
18 |
19 | if (!$entity) {
20 | throw $this->createNotFoundException('Unable to find {{ entity }} entity.');
21 | }
22 |
23 | $em->remove($entity);
24 | $em->flush();
25 | $this->get('session')->getFlashBag()->add('success', 'flash.delete.success');
26 | } else {
27 | $this->get('session')->getFlashBag()->add('error', 'flash.delete.error');
28 | }
29 |
30 | return $this->redirect($this->generateUrl('{{ route_name_prefix }}'));
31 | }
32 |
33 | /**
34 | * Creates a form to delete a {{ entity }} entity by id.
35 | *
36 | * @param mixed $id The entity id
37 | *
38 | * @return Symfony\Component\Form\Form The form
39 | */
40 | private function createDeleteForm($id)
41 | {
42 | return $this->createFormBuilder(array('id' => $id))
43 | ->add('id', 'hidden')
44 | ->getForm()
45 | ;
46 | }
--------------------------------------------------------------------------------
/Resources/skeleton/crud/actions/edit.php.twig:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Displays a form to edit an existing {{ entity }} entity.
4 | *
5 | {% if 'annotation' == format %}
6 | * @Route("/{id}/edit", name="{{ route_name_prefix }}_edit")
7 | * @Method("GET")
8 | * @Template()
9 | {% endif %}
10 | */
11 | public function editAction($id)
12 | {
13 | $em = $this->getDoctrine()->getManager();
14 |
15 | $entity = $em->getRepository('{{ bundle }}:{{ entity }}')->find($id);
16 |
17 | if (!$entity) {
18 | throw $this->createNotFoundException('Unable to find {{ entity }} entity.');
19 | }
20 |
21 | $editForm = $this->createForm(new {{ entity_class }}Type(), $entity);
22 | $deleteForm = $this->createDeleteForm($id);
23 |
24 | {% if 'annotation' == format %}
25 | return array(
26 | 'entity' => $entity,
27 | 'edit_form' => $editForm->createView(),
28 | 'delete_form' => $deleteForm->createView(),
29 | );
30 | {% else %}
31 | return $this->render('{{ bundle }}:{{ entity|replace({'\\': '/'}) }}:edit.html.twig', array(
32 | 'entity' => $entity,
33 | 'edit_form' => $editForm->createView(),
34 | 'delete_form' => $deleteForm->createView(),
35 | ));
36 | {% endif %}
37 | }
38 |
--------------------------------------------------------------------------------
/Resources/skeleton/crud/actions/index.php.twig:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Lists all {{ entity }} entities.
4 | *
5 | {% if 'annotation' == format %}
6 | * @Route("/", name="{{ route_name_prefix }}")
7 | * @Method("GET")
8 | * @Template()
9 | {% endif %}
10 | */
11 | public function indexAction()
12 | {
13 | list($filterForm, $queryBuilder) = $this->filter();
14 |
15 | list($entities, $pagerHtml) = $this->paginator($queryBuilder);
16 |
17 | {% if 'annotation' == format %}
18 | return array(
19 | 'entities' => $entities,
20 | 'pagerHtml' => $pagerHtml,
21 | 'filterForm' => $filterForm->createView(),
22 | );
23 | {% else %}
24 | return $this->render('{{ bundle }}:{{ entity|replace({'\\': '/'}) }}:index.html.twig', array(
25 | 'entities' => $entities,
26 | 'pagerHtml' => $pagerHtml,
27 | 'filterForm' => $filterForm->createView(),
28 | ));
29 | {% endif %}
30 | }
31 |
32 | /**
33 | * Create filter form and process filter request.
34 | *
35 | */
36 | protected function filter()
37 | {
38 | $request = $this->getRequest();
39 | $session = $request->getSession();
40 | $filterForm = $this->createForm(new {{ entity }}FilterType());
41 | $em = $this->getDoctrine()->getManager();
42 | $queryBuilder = $em->getRepository('{{ bundle }}:{{ entity }}')->createQueryBuilder('e');
43 |
44 | // Reset filter
45 | if ($request->get('filter_action') == 'reset') {
46 | $session->remove('{{ entity }}ControllerFilter');
47 | }
48 |
49 | // Filter action
50 | if ($request->get('filter_action') == 'filter') {
51 | // Bind values from the request
52 | $filterForm->bind($request);
53 |
54 | if ($filterForm->isValid()) {
55 | // Build the query from the given form object
56 | $this->get('lexik_form_filter.query_builder_updater')->addFilterConditions($filterForm, $queryBuilder);
57 | // Save filter to session
58 | $filterData = $filterForm->getData();
59 | $session->set('{{ entity }}ControllerFilter', $filterData);
60 | }
61 | } else {
62 | // Get filter from session
63 | if ($session->has('{{ entity }}ControllerFilter')) {
64 | $filterData = $session->get('{{ entity }}ControllerFilter');
65 | $filterForm = $this->createForm(new {{ entity }}FilterType(), $filterData);
66 | $this->get('lexik_form_filter.query_builder_updater')->addFilterConditions($filterForm, $queryBuilder);
67 | }
68 | }
69 |
70 | return array($filterForm, $queryBuilder);
71 | }
72 |
73 | /**
74 | * Get results from paginator and get paginator view.
75 | *
76 | */
77 | protected function paginator($queryBuilder)
78 | {
79 | // Paginator
80 | $adapter = new DoctrineORMAdapter($queryBuilder);
81 | $pagerfanta = new Pagerfanta($adapter);
82 | $currentPage = $this->getRequest()->get('page', 1);
83 | $pagerfanta->setCurrentPage($currentPage);
84 | $entities = $pagerfanta->getCurrentPageResults();
85 |
86 | // Paginator - route generator
87 | $me = $this;
88 | $routeGenerator = function($page) use ($me)
89 | {
90 | return $me->generateUrl('{{ route_name_prefix }}', array('page' => $page));
91 | };
92 |
93 | // Paginator - view
94 | $translator = $this->get('translator');
95 | $view = new TwitterBootstrapView();
96 | $pagerHtml = $view->render($pagerfanta, $routeGenerator, array(
97 | 'proximity' => 3,
98 | 'prev_message' => $translator->trans('views.index.pagprev', array(), 'JordiLlonchCrudGeneratorBundle'),
99 | 'next_message' => $translator->trans('views.index.pagnext', array(), 'JordiLlonchCrudGeneratorBundle'),
100 | ));
101 |
102 | return array($entities, $pagerHtml);
103 | }
104 |
--------------------------------------------------------------------------------
/Resources/skeleton/crud/actions/new.php.twig:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Displays a form to create a new {{ entity }} entity.
4 | *
5 | {% if 'annotation' == format %}
6 | * @Route("/new", name="{{ route_name_prefix }}_new")
7 | * @Method("GET")
8 | * @Template()
9 | {% endif %}
10 | */
11 | public function newAction()
12 | {
13 | $entity = new {{ entity_class }}();
14 | $form = $this->createForm(new {{ entity_class }}Type(), $entity);
15 |
16 | {% if 'annotation' == format %}
17 | return array(
18 | 'entity' => $entity,
19 | 'form' => $form->createView(),
20 | );
21 | {% else %}
22 | return $this->render('{{ bundle }}:{{ entity|replace({'\\': '/'}) }}:new.html.twig', array(
23 | 'entity' => $entity,
24 | 'form' => $form->createView(),
25 | ));
26 | {% endif %}
27 | }
28 |
--------------------------------------------------------------------------------
/Resources/skeleton/crud/actions/show.php.twig:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Finds and displays a {{ entity }} entity.
4 | *
5 | {% if 'annotation' == format %}
6 | * @Route("/{id}", name="{{ route_name_prefix }}_show")
7 | * @Method("GET")
8 | * @Template()
9 | {% endif %}
10 | */
11 | public function showAction($id)
12 | {
13 | $em = $this->getDoctrine()->getManager();
14 |
15 | $entity = $em->getRepository('{{ bundle }}:{{ entity }}')->find($id);
16 |
17 | if (!$entity) {
18 | throw $this->createNotFoundException('Unable to find {{ entity }} entity.');
19 | }
20 | {% if 'delete' in actions %}
21 |
22 | $deleteForm = $this->createDeleteForm($id);
23 | {% endif %}
24 |
25 | {% if 'annotation' == format %}
26 | return array(
27 | 'entity' => $entity,
28 | {% if 'delete' in actions %}
29 | 'delete_form' => $deleteForm->createView(),
30 | {% endif %}
31 | );
32 | {% else %}
33 | return $this->render('{{ bundle }}:{{ entity|replace({'\\': '/'}) }}:show.html.twig', array(
34 | 'entity' => $entity,
35 | {% if 'delete' in actions %}
36 | 'delete_form' => $deleteForm->createView(),
37 | {%- endif %}
38 | ));
39 | {% endif %}
40 | }
41 |
--------------------------------------------------------------------------------
/Resources/skeleton/crud/actions/update.php.twig:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Edits an existing {{ entity }} entity.
4 | *
5 | {% if 'annotation' == format %}
6 | * @Route("/{id}", name="{{ route_name_prefix }}_update")
7 | * @Method("PUT")
8 | * @Template("{{ bundle }}:{{ entity }}:edit.html.twig")
9 | {% endif %}
10 | */
11 | public function updateAction(Request $request, $id)
12 | {
13 | $em = $this->getDoctrine()->getManager();
14 |
15 | $entity = $em->getRepository('{{ bundle }}:{{ entity }}')->find($id);
16 |
17 | if (!$entity) {
18 | throw $this->createNotFoundException('Unable to find {{ entity }} entity.');
19 | }
20 |
21 | $deleteForm = $this->createDeleteForm($id);
22 | $editForm = $this->createForm(new {{ entity_class }}Type(), $entity);
23 | $editForm->bind($request);
24 |
25 | if ($editForm->isValid()) {
26 | $em->persist($entity);
27 | $em->flush();
28 | $this->get('session')->getFlashBag()->add('success', 'flash.update.success');
29 |
30 | return $this->redirect($this->generateUrl('{{ route_name_prefix }}_edit', array('id' => $id)));
31 | } else {
32 | $this->get('session')->getFlashBag()->add('error', 'flash.update.error');
33 | }
34 |
35 | {% if 'annotation' == format %}
36 | return array(
37 | 'entity' => $entity,
38 | 'edit_form' => $editForm->createView(),
39 | 'delete_form' => $deleteForm->createView(),
40 | );
41 | {% else %}
42 | return $this->render('{{ bundle }}:{{ entity|replace({'\\': '/'}) }}:edit.html.twig', array(
43 | 'entity' => $entity,
44 | 'edit_form' => $editForm->createView(),
45 | 'delete_form' => $deleteForm->createView(),
46 | ));
47 | {% endif %}
48 | }
49 |
--------------------------------------------------------------------------------
/Resources/skeleton/crud/config/routing.php.twig:
--------------------------------------------------------------------------------
1 | add('{{ route_name_prefix }}', new Route('/', array(
10 | '_controller' => '{{ bundle }}:{{ entity }}:index',
11 | )));
12 | {% endif %}
13 |
14 | {% if 'show' in actions %}
15 | $collection->add('{{ route_name_prefix }}_show', new Route('/{id}/show', array(
16 | '_controller' => '{{ bundle }}:{{ entity }}:show',
17 | )));
18 | {% endif %}
19 |
20 | {% if 'new' in actions %}
21 | $collection->add('{{ route_name_prefix }}_new', new Route('/new', array(
22 | '_controller' => '{{ bundle }}:{{ entity }}:new',
23 | )));
24 |
25 | $collection->add('{{ route_name_prefix }}_create', new Route(
26 | '/create',
27 | array('_controller' => '{{ bundle }}:{{ entity }}:create'),
28 | array('_method' => 'post')
29 | ));
30 | {% endif %}
31 |
32 | {% if 'edit' in actions %}
33 | $collection->add('{{ route_name_prefix }}_edit', new Route('/{id}/edit', array(
34 | '_controller' => '{{ bundle }}:{{ entity }}:edit',
35 | )));
36 |
37 | $collection->add('{{ route_name_prefix }}_update', new Route(
38 | '/{id}/update',
39 | array('_controller' => '{{ bundle }}:{{ entity }}:update'),
40 | array('_method' => 'post|put')
41 | ));
42 | {% endif %}
43 |
44 | {% if 'delete' in actions %}
45 | $collection->add('{{ route_name_prefix }}_delete', new Route(
46 | '/{id}/delete',
47 | array('_controller' => '{{ bundle }}:{{ entity }}:delete'),
48 | array('_method' => 'post|delete')
49 | ));
50 | {% endif %}
51 |
52 | return $collection;
53 |
--------------------------------------------------------------------------------
/Resources/skeleton/crud/config/routing.xml.twig:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 |
8 | {{ bundle }}:{{ entity }}:index
9 |
10 |
11 |
12 | {{ bundle }}:{{ entity }}:show
13 |
14 |
15 | {% if 'new' in actions %}
16 |
17 | {{ bundle }}:{{ entity }}:new
18 |
19 |
20 |
21 | {{ bundle }}:{{ entity }}:create
22 | post
23 |
24 | {% endif %}
25 |
26 | {% if 'edit' in actions %}
27 |
28 | {{ bundle }}:{{ entity }}:edit
29 |
30 |
31 |
32 | {{ bundle }}:{{ entity }}:update
33 | post|put
34 |
35 | {% endif %}
36 |
37 | {% if 'delete' in actions %}
38 |
39 | {{ bundle }}:{{ entity }}:delete
40 | post|delete
41 |
42 | {% endif %}
43 |
44 |
45 |
--------------------------------------------------------------------------------
/Resources/skeleton/crud/config/routing.yml.twig:
--------------------------------------------------------------------------------
1 | {% if 'index' in actions %}
2 | {{ route_name_prefix }}:
3 | pattern: /
4 | defaults: { _controller: "{{ bundle }}:{{ entity }}:index" }
5 | {% endif %}
6 |
7 | {% if 'show' in actions %}
8 | {{ route_name_prefix }}_show:
9 | pattern: /{id}/show
10 | defaults: { _controller: "{{ bundle }}:{{ entity }}:show" }
11 | {% endif %}
12 |
13 | {% if 'new' in actions %}
14 | {{ route_name_prefix }}_new:
15 | pattern: /new
16 | defaults: { _controller: "{{ bundle }}:{{ entity }}:new" }
17 |
18 | {{ route_name_prefix }}_create:
19 | pattern: /create
20 | defaults: { _controller: "{{ bundle }}:{{ entity }}:create" }
21 | requirements: { _method: post }
22 | {% endif %}
23 |
24 | {% if 'edit' in actions %}
25 | {{ route_name_prefix }}_edit:
26 | pattern: /{id}/edit
27 | defaults: { _controller: "{{ bundle }}:{{ entity }}:edit" }
28 |
29 | {{ route_name_prefix }}_update:
30 | pattern: /{id}/update
31 | defaults: { _controller: "{{ bundle }}:{{ entity }}:update" }
32 | requirements: { _method: post|put }
33 | {% endif %}
34 |
35 | {% if 'delete' in actions %}
36 | {{ route_name_prefix }}_delete:
37 | pattern: /{id}/delete
38 | defaults: { _controller: "{{ bundle }}:{{ entity }}:delete" }
39 | requirements: { _method: post|delete }
40 | {% endif %}
--------------------------------------------------------------------------------
/Resources/skeleton/crud/controller.php.twig:
--------------------------------------------------------------------------------
1 | request('GET', '/{{ route_prefix }}/');
9 | $this->assertTrue(200 === $client->getResponse()->getStatusCode());
10 | $crawler = $client->click($crawler->selectLink('Create a new entry')->link());
11 |
12 | // Fill in the form and submit it
13 | $form = $crawler->selectButton('Create')->form(array(
14 | '{{ form_type_name|lower }}[field_name]' => 'Test',
15 | // ... other fields to fill
16 | ));
17 |
18 | $client->submit($form);
19 | $crawler = $client->followRedirect();
20 |
21 | // Check data in the show view
22 | $this->assertTrue($crawler->filter('td:contains("Test")')->count() > 0);
23 |
24 | // Edit the entity
25 | $crawler = $client->click($crawler->selectLink('Edit')->link());
26 |
27 | $form = $crawler->selectButton('Edit')->form(array(
28 | '{{ form_type_name|lower }}[field_name]' => 'Foo',
29 | // ... other fields to fill
30 | ));
31 |
32 | $client->submit($form);
33 | $crawler = $client->followRedirect();
34 |
35 | // Check the element contains an attribute with value equals "Foo"
36 | $this->assertTrue($crawler->filter('[value="Foo"]')->count() > 0);
37 |
38 | // Delete the entity
39 | $client->submit($crawler->selectButton('Delete')->form());
40 | $crawler = $client->followRedirect();
41 |
42 | // Check the entity has been delete on the list
43 | $this->assertNotRegExp('/Foo/', $client->getResponse()->getContent());
44 | }
45 |
--------------------------------------------------------------------------------
/Resources/skeleton/crud/tests/others/short_scenario.php.twig:
--------------------------------------------------------------------------------
1 |
2 | public function testCompleteScenario()
3 | {
4 | // Create a new client to browse the application
5 | $client = static::createClient();
6 |
7 | // Go to the list view
8 | $crawler = $client->request('GET', '/{{ route_prefix }}/');
9 | $this->assertTrue(200 === $client->getResponse()->getStatusCode());
10 |
11 | // Go to the show view
12 | $crawler = $client->click($crawler->selectLink('show')->link());
13 | $this->assertTrue(200 === $client->getResponse()->getStatusCode());
14 | }
--------------------------------------------------------------------------------
/Resources/skeleton/crud/tests/test.php.twig:
--------------------------------------------------------------------------------
1 | {{ "{{ 'views.edit.edit'|trans({'%entity%': '" }}{{ entity }}{{ "'}, 'JordiLlonchCrudGeneratorBundle') }}" }}
10 |
11 |
18 |
19 | {% set hide_edit, hide_delete = true, false %}
20 | {% include 'crud/views/others/record_actions.html.twig.twig' %}
21 |
22 | {{ "{% endblock %}" }}
--------------------------------------------------------------------------------
/Resources/skeleton/crud/views/index.html.twig.twig:
--------------------------------------------------------------------------------
1 | {{ "{% extends 'JordiLlonchCrudGeneratorBundle::layout.html.twig' %}" }}
2 |
3 | {{ "{% block title %}" }}
4 | {{ "{{ parent() }} - {{ 'views.index.list'|trans({'%entity%': '" }}{{ entity }}{{ "'}, 'JordiLlonchCrudGeneratorBundle') }}" }}
5 | {{ "{% endblock %}" }}
6 |
7 | {{ "{% block page %}" }}
8 |
9 |
10 |
11 |
12 |
{{ "{{ 'views.index.list'|trans({'%entity%': '" }}{{ entity }}{{ "'}, 'JordiLlonchCrudGeneratorBundle') }}" }}
13 |
14 |
15 | {{ '{% if form_errors(filterForm) %}' }}
16 |
17 | {{ '{{ form_errors(filterForm) }}' }}
18 |
19 | {{ '{% endif %}' }}
20 |
21 |
22 |
30 |
31 |
51 |
52 |
53 |
54 |
55 |
56 |
57 | {%- for field, metadata in fields %}
58 |
59 | {{ field|capitalize }} |
60 |
61 | {%- endfor %}
62 |
63 | {{ "{{ 'views.index.actions'|trans({}, 'JordiLlonchCrudGeneratorBundle') }}" }} |
64 |
65 |
66 |
67 | {{ '{% for entity in entities %}' }}
68 |
69 |
70 | {%- for field, metadata in fields %}
71 | {%- if loop.first and ('show' in actions) %}
72 |
73 | {{ '{{ entity.'~ field|replace({'_': ''}) ~' }}' }} |
74 |
75 | {%- elseif metadata.type in ['date', 'datetime'] %}
76 |
77 | {{ '{% if entity.'~ field|replace({'_': ''}) ~' %}{{ entity.'~ field|replace({'_': ''}) ~'|date(\'Y-m-d H:i:s\') }}{% endif %}' }} |
78 |
79 | {%- else %}
80 |
81 | {{ '{{ entity.'~ field|replace({'_': ''}) ~' }}' }} |
82 |
83 | {%- endif %}
84 |
85 | {%- if loop.last %}
86 |
87 |
88 | {%- include "crud/views/others/actions.html.twig.twig" %}
89 | |
90 |
91 | {%- endif %}
92 | {%- endfor %}
93 |
94 |
95 | {{ '{% endfor %}' }}
96 |
97 |
98 |
99 |
100 |
101 | {{ '{{ pagerHtml|raw }}' }}
102 |
103 |
104 | {% if 'new' in actions %}
105 |
110 | {% endif %}
111 |
112 |
113 | {{ "{% endblock %}" }}
--------------------------------------------------------------------------------
/Resources/skeleton/crud/views/new.html.twig.twig:
--------------------------------------------------------------------------------
1 | {{ "{% extends 'JordiLlonchCrudGeneratorBundle::layout.html.twig' %}" }}
2 |
3 | {{ "{% block title %}" }}
4 | {{ "{{ parent() }} - {{ 'views.new.creation'|trans({'%entity%': '" }}{{ entity }}{{ "'}, 'JordiLlonchCrudGeneratorBundle') }}" }}
5 | {{ "{% endblock %}" }}
6 |
7 | {{ "{% block page %}" }}
8 |
9 | {{ "{{ 'views.new.creation'|trans({'%entity%': '" }}{{ entity }}{{ "'}, 'JordiLlonchCrudGeneratorBundle') }}" }}
10 |
11 |
17 |
18 | {% set hide_edit, hide_delete = true, true %}
19 | {% include 'crud/views/others/record_actions.html.twig.twig' %}
20 |
21 | {{ "{% endblock %}" }}
--------------------------------------------------------------------------------
/Resources/skeleton/crud/views/others/actions.html.twig.twig:
--------------------------------------------------------------------------------
1 |
2 | {%- for action in record_actions %}
3 |
4 |
5 | {{ "{{ 'views.actions."~action~"'|trans({}, 'JordiLlonchCrudGeneratorBundle') }}" }}
6 |
7 |
8 | {%- endfor %}
9 |
--------------------------------------------------------------------------------
/Resources/skeleton/crud/views/others/record_actions.html.twig.twig:
--------------------------------------------------------------------------------
1 |
2 |
7 | {% if ('edit' in actions) and (not hide_edit) %}
8 |
13 | {% endif %}
14 | {% if ('delete' in actions) and (not hide_delete) %}
15 |
16 |
21 |
22 | {% endif %}
23 |
--------------------------------------------------------------------------------
/Resources/skeleton/crud/views/show.html.twig.twig:
--------------------------------------------------------------------------------
1 | {{ "{% extends 'JordiLlonchCrudGeneratorBundle::layout.html.twig' %}" }}
2 |
3 | {{ "{% block title %}" }}
4 | {{ "{{ parent() }} - {{ 'views.show.show'|trans({'%entity%': '" }}{{ entity }}{{ "'}, 'JordiLlonchCrudGeneratorBundle') }}" }}
5 | {{ "{% endblock %}" }}
6 |
7 | {{ "{% block page %}" }}
8 |
9 | {{ entity }}
10 |
11 |
27 |
28 | {% set hide_edit, hide_delete = false, false %}
29 | {% include 'crud/views/others/record_actions.html.twig.twig' %}
30 |
31 | {{ "{% endblock %}" }}
--------------------------------------------------------------------------------
/Resources/skeleton/form/FormFilterType.php.twig:
--------------------------------------------------------------------------------
1 | add('{{ data.fieldName }}', '{{ data.filterWidget }}')
20 |
21 | {%- endfor %}
22 |
23 | ;
24 |
25 | $listener = function(FormEvent $event)
26 | {
27 | // Is data empty?
28 | foreach ($event->getData() as $data) {
29 | if(is_array($data)) {
30 | foreach ($data as $subData) {
31 | if(null !== $subData) return;
32 | }
33 | }
34 | else {
35 | if(null !== $data) return;
36 | }
37 | }
38 |
39 | $event->getForm()->addError(new FormError('Filter empty'));
40 | };
41 | $builder->addEventListener(FormEvents::POST_BIND, $listener);
42 | }
43 |
44 | public function getName()
45 | {
46 | return '{{ form_filter_type_name }}';
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/Resources/skeleton/form/FormType.php.twig:
--------------------------------------------------------------------------------
1 | add('{{ field }}')
17 |
18 | {%- endfor %}
19 |
20 | ;
21 | }
22 |
23 | public function setDefaultOptions(OptionsResolverInterface $resolver)
24 | {
25 | $resolver->setDefaults(array(
26 | 'data_class' => '{{ namespace }}\Entity{{ entity_namespace ? '\\' ~ entity_namespace : '' }}\{{ entity_class }}'
27 | ));
28 | }
29 |
30 | public function getName()
31 | {
32 | return '{{ form_type_name }}';
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/Resources/translations/JordiLlonchCrudGeneratorBundle.ca.yml:
--------------------------------------------------------------------------------
1 | views:
2 | layout:
3 | bannersadmin: Administrador
4 | index:
5 | filters: Filtres
6 | filter: Filtrar
7 | reset: Netejar
8 | list: %entity%: llista
9 | actions: Accions
10 | createnew: Crear
11 | pagprev: '← Anterior'
12 | pagnext: 'Següent →'
13 | actions:
14 | show: veure
15 | edit: editar
16 | recordactions:
17 | backtothelist: Tornar a la llista
18 | edit: Editar
19 | delete: Eliminar
20 | confirm: Eliminar l'element?
21 | new:
22 | creation: Crear %entity%
23 | create: Crear
24 | edit:
25 | edit: Editar %entity%
26 | editbutton: Editar
27 | show:
28 | show: Veure %entity%
29 | flash:
30 | create:
31 | success: Element creat satisfactòriament.
32 | error: Hi ha hagut un error durant la creació de l'element.
33 | update:
34 | success: Element actualitzat satisfactòriament.
35 | error: Hi ha hagut un error durant l'actualització de l'element.
36 | delete:
37 | success: Element eliminat satisfactòriament.
38 | error: Hi ha hagut un error durant l'eliminació de l'element.
--------------------------------------------------------------------------------
/Resources/translations/JordiLlonchCrudGeneratorBundle.en.yml:
--------------------------------------------------------------------------------
1 | views:
2 | layout:
3 | bannersadmin: Administrator
4 | index:
5 | filters: Filters
6 | filter: Filter
7 | reset: Reset
8 | list: %entity% list
9 | actions: Actions
10 | createnew: Create a new
11 | pagprev: '← Previous'
12 | pagnext: 'Next →'
13 | actions:
14 | show: show
15 | edit: edit
16 | recordactions:
17 | backtothelist: Back to the list
18 | edit: Edit
19 | delete: Delete
20 | confirm: Delete the item?
21 | new:
22 | creation: Create %entity%
23 | create: Create
24 | edit:
25 | edit: Edit %entity%
26 | editbutton: Edit
27 | show:
28 | show: Show %entity%
29 | flash:
30 | create:
31 | success: Item has been successfully created.
32 | error: An error has occurred during item creation.
33 | update:
34 | success: Item has been successfully updated.
35 | error: An error has occurred during item update.
36 | delete:
37 | success: Item has been deleted successfully.
38 | error: An Error has occurred during item deletion.
39 |
--------------------------------------------------------------------------------
/Resources/translations/JordiLlonchCrudGeneratorBundle.es.yml:
--------------------------------------------------------------------------------
1 | views:
2 | layout:
3 | bannersadmin: Administrador
4 | index:
5 | filters: Filtros
6 | filter: Filtrar
7 | reset: Limpiar
8 | list: %entity%: lista
9 | actions: Acciones
10 | createnew: Crear
11 | pagprev: '← Anterior'
12 | pagnext: 'Siguiente →'
13 | actions:
14 | show: ver
15 | edit: editar
16 | recordactions:
17 | backtothelist: Volver a la lista
18 | edit: Editar
19 | delete: Eliminar
20 | confirm: Eliminar el elemento?
21 | new:
22 | creation: Crear %entity%
23 | create: Crear
24 | edit:
25 | edit: Editar %entity%
26 | editbutton: Editar
27 | show:
28 | show: Ver %entity%
29 | flash:
30 | create:
31 | success: Elemento creado satisfactoriamente.
32 | error: Se ha producido un error durante la creación del elemento.
33 | update:
34 | success: Elemento actualizado satisfactoriamente.
35 | error: Se ha producido un error durante la actualización del elemento.
36 | delete:
37 | success: Elemento eliminado satisfactoriamente.
38 | error: Se ha producido un error durante la eliminación del elemento.
--------------------------------------------------------------------------------
/Resources/translations/JordiLlonchCrudGeneratorBundle.fr.yml:
--------------------------------------------------------------------------------
1 | views:
2 | layout:
3 | bannersadmin: Administrateur
4 | index:
5 | filters: Filtres
6 | filter: Filtrer
7 | reset: Réinitialiser
8 | list: Liste %entity%
9 | actions: Actions
10 | createnew: Créer un nouveau
11 | pagprev: '← Précédent'
12 | pagnext: 'Suivant →'
13 | actions:
14 | show: afficher
15 | edit: editer
16 | recordactions:
17 | backtothelist: Retour à la liste
18 | edit: Editer
19 | delete: Supprimer
20 | confirm: Supprimer l'élément ?
21 | new:
22 | creation: Créer %entity%
23 | create: Créer
24 | edit:
25 | edit: Editer %entity%
26 | editbutton: Editer
27 | show:
28 | show: Voir %entity%
29 | flash:
30 | create:
31 | success: L'élément a été créé.
32 | error: Une erreur est survenue lors de la création de l'élément.
33 | update:
34 | success: L'élément a été mis à jour.
35 | error: Une erreur est survenue lors de la mise à jour de l'élément.
36 | delete:
37 | success: L'élément a été supprimé.
38 | error: Une erreur est survenue lors de la suppression de l'élément.
39 |
--------------------------------------------------------------------------------
/Resources/translations/JordiLlonchCrudGeneratorBundle.pl.yml:
--------------------------------------------------------------------------------
1 | views:
2 | layout:
3 | bannersadmin: Administrator
4 | index:
5 | filters: Filtry
6 | filter: Filtr
7 | reset: Reset
8 | list: %entity% - lista
9 | actions: Akcje
10 | createnew: Utwórz
11 | pagprev: '← Poprzednia'
12 | pagnext: 'Następna →'
13 | actions:
14 | show: podgląd
15 | edit: edycja
16 | recordactions:
17 | backtothelist: Wróć do listy
18 | edit: Edycja
19 | delete: Usuń
20 | confirm: Usunąć element?
21 | new:
22 | creation: Utwórz %entity%
23 | create: Utwórz
24 | edit:
25 | edit: Edytuj %entity%
26 | editbutton: Edytuj
27 | show:
28 | show: Lista %entity%
29 | flash:
30 | create:
31 | success: Element utworzony prawidłowo.
32 | error: Tworzenie nowego elementu zakończone błędem.
33 | update:
34 | success: Aktualizacja powidoła się.
35 | error: Aktualizacja zakończona błędem.
36 | delete:
37 | success: Element został usunięty.
38 | error: Próba usunięcia zakończona błędem.
39 |
--------------------------------------------------------------------------------
/Resources/translations/JordiLlonchCrudGeneratorBundle.pt_BR.yml:
--------------------------------------------------------------------------------
1 | views:
2 | layout:
3 | bannersadmin: Administrador
4 | index:
5 | filters: Filtros
6 | filter: Filtro
7 | reset: Limpar
8 | list: %entity% listagem
9 | actions: Ações
10 | createnew: Criar novo
11 | pagprev: '← Anterior'
12 | pagnext: 'Próxima →'
13 | actions:
14 | show: show
15 | edit: edit
16 | recordactions:
17 | backtothelist: Voltar para listagem
18 | edit: Editar
19 | delete: Excluir
20 | confirm: Excluir o item?
21 | new:
22 | creation: Criar %entity%
23 | create: Criar
24 | edit:
25 | edit: Editar %entity%
26 | editbutton: Editar
27 | show:
28 | show: Visualizar %entity%
29 | flash:
30 | create:
31 | success: O item foi criado com sucesso.
32 | error: Um erro ocorreu durante a criação do item
33 | update:
34 | success: O item foi atualizado com sucesso.
35 | error: Um erro ocorreu durante a atualização do item
36 | delete:
37 | success: O item foi excluído com sucesso.
38 | error: Um erro ocorreu durante a exclusão do item.
39 |
--------------------------------------------------------------------------------
/Resources/views/layout.html.twig:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | {% block title %}{{ 'views.layout.bannersadmin'|trans({}, 'JordiLlonchCrudGeneratorBundle') }}{% endblock %}
6 |
7 |
8 |
9 |
10 |
11 |
12 |
17 |
18 |
19 |
20 |
21 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 | {% block menu %}{% endblock %}
33 |
34 | {% for type, flashMessages in app.session.flashbag.all() %}
35 | {% for flashMessage in flashMessages %}
36 |
37 | {{ flashMessage|trans({}, 'JordiLlonchCrudGeneratorBundle') }}
38 |
39 | {% endfor %}
40 | {% endfor %}
41 |
42 | {% block page %}{% endblock %}
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 | {% block javascript %}{% endblock %}
51 |
52 |
--------------------------------------------------------------------------------
/Tests/Command/JordiLlonchCrudCommandTest.php:
--------------------------------------------------------------------------------
1 |
9 | *
10 | * For the full copyright and license information, please view the LICENSE
11 | * file that was distributed with this source code.
12 | */
13 |
14 | namespace JordiLlonch\Bundle\CrudGeneratorBundle\Tests\Command;
15 |
16 | use Sensio\Bundle\GeneratorBundle\Tests\Command\GenerateDoctrineCrudCommandTest;
17 | use Sensio\Bundle\GeneratorBundle\Tests\Command\GenerateCommandTest;
18 | use Symfony\Component\Console\Tester\CommandTester;
19 |
20 | class JordiLlonchCrudCommandTest extends GenerateCommandTest
21 | {
22 | /**
23 | * @dataProvider getInteractiveCommandData
24 | */
25 | public function testInteractiveCommand($options, $input, $expected)
26 | {
27 | list($entity, $format, $prefix, $withWrite) = $expected;
28 |
29 | $generator = $this->getGenerator();
30 | $generator
31 | ->expects($this->once())
32 | ->method('generate')
33 | ->with($this->getBundle(), $entity, $this->getDoctrineMetadata(), $format, $prefix, $withWrite)
34 | ;
35 |
36 | $tester = new CommandTester($this->getCommand($generator, $input));
37 | $tester->execute($options);
38 | }
39 |
40 | public function getInteractiveCommandData()
41 | {
42 | return array(
43 | array(array(), "AcmeBlogBundle:Blog/Post\n", array('Blog\\Post', 'annotation', 'blog_post', false)),
44 | array(array('--entity' => 'AcmeBlogBundle:Blog/Post'), '', array('Blog\\Post', 'annotation', 'blog_post', false)),
45 | array(array(), "AcmeBlogBundle:Blog/Post\ny\nyml\nfoobar\n", array('Blog\\Post', 'yml', 'foobar', true)),
46 | array(array(), "AcmeBlogBundle:Blog/Post\ny\nyml\n/foobar\n", array('Blog\\Post', 'yml', 'foobar', true)),
47 | array(array('--entity' => 'AcmeBlogBundle:Blog/Post', '--format' => 'yml', '--route-prefix' => 'foo', '--with-write' => true), '', array('Blog\\Post', 'yml', 'foo', true)),
48 | );
49 | }
50 |
51 | /**
52 | * @dataProvider getNonInteractiveCommandData
53 | */
54 | public function testNonInteractiveCommand($options, $expected)
55 | {
56 | list($entity, $format, $prefix, $withWrite) = $expected;
57 |
58 | $generator = $this->getGenerator();
59 | $generator
60 | ->expects($this->once())
61 | ->method('generate')
62 | ->with($this->getBundle(), $entity, $this->getDoctrineMetadata(), $format, $prefix, $withWrite)
63 | ;
64 |
65 | $tester = new CommandTester($this->getCommand($generator, ''));
66 | $tester->execute($options, array('interactive' => false));
67 | }
68 |
69 | public function getNonInteractiveCommandData()
70 | {
71 | return array(
72 | array(array('--entity' => 'AcmeBlogBundle:Blog/Post'), array('Blog\\Post', 'annotation', 'blog_post', false)),
73 | array(array('--entity' => 'AcmeBlogBundle:Blog/Post', '--format' => 'yml', '--route-prefix' => 'foo', '--with-write' => true), array('Blog\\Post', 'yml', 'foo', true)),
74 | );
75 | }
76 |
77 | protected function getCommand($generator, $input)
78 | {
79 | $command = $this
80 | ->getMockBuilder('JordiLlonch\Bundle\CrudGeneratorBundle\Command\JordiLlonchCrudCommand')
81 | // ->getMockBuilder('Sensio\Bundle\GeneratorBundle\Command\GenerateDoctrineCrudCommand')
82 | ->setMethods(array('getEntityMetadata'))
83 | ->getMock()
84 | ;
85 |
86 | $command
87 | ->expects($this->any())
88 | ->method('getEntityMetadata')
89 | ->will($this->returnValue(array($this->getDoctrineMetadata())))
90 | ;
91 |
92 | $command->setContainer($this->getContainer());
93 | $command->setHelperSet($this->getHelperSet($input));
94 | $command->setGenerator($generator);
95 | $command->setFormGenerator($this->getFormGenerator());
96 | // $command->setFormFilterGenerator($this->getFormFilterGenerator());
97 |
98 | return $command;
99 | }
100 |
101 | protected function getDoctrineMetadata()
102 | {
103 | return $this
104 | ->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadataInfo')
105 | ->disableOriginalConstructor()
106 | ->getMock()
107 | ;
108 | }
109 |
110 | protected function getGenerator()
111 | {
112 | // get a noop generator
113 | return $this
114 | ->getMockBuilder('Sensio\Bundle\GeneratorBundle\Generator\DoctrineCrudGenerator')
115 | ->disableOriginalConstructor()
116 | ->setMethods(array('generate'))
117 | ->getMock()
118 | ;
119 | }
120 |
121 | protected function getFormGenerator()
122 | {
123 | return $this
124 | ->getMockBuilder('Sensio\Bundle\GeneratorBundle\Generator\DoctrineFormGenerator')
125 | ->disableOriginalConstructor()
126 | ->setMethods(array('generate'))
127 | ->getMock()
128 | ;
129 | }
130 |
131 | protected function getFormFilterGenerator()
132 | {
133 | return $this
134 | ->getMockBuilder('JordiLlonch\Bundle\CrudGeneratorBundle\Generator\DoctrineFormFilterGenerator')
135 | ->disableOriginalConstructor()
136 | ->setMethods(array('generate'))
137 | ->getMock()
138 | ;
139 | }
140 |
141 | protected function getContainer()
142 | {
143 | $container = parent::getContainer();
144 |
145 | $registry = $this->getMock('Symfony\Bridge\Doctrine\RegistryInterface');
146 | $registry
147 | ->expects($this->any())
148 | ->method('getEntityNamespace')
149 | ->will($this->returnValue('Foo\\FooBundle\\Entity'))
150 | ;
151 |
152 | $container->set('doctrine', $registry);
153 |
154 | return $container;
155 | }
156 | }
157 |
--------------------------------------------------------------------------------
/Tests/Generator/JordiLlonchCrudGeneratorTest.php:
--------------------------------------------------------------------------------
1 |
9 | *
10 | * For the full copyright and license information, please view the LICENSE
11 | * file that was distributed with this source code.
12 | */
13 |
14 | namespace JordiLlonch\Bundle\CrudGeneratorBundle\Tests\Generator;
15 |
16 | use Sensio\Bundle\GeneratorBundle\Tests\Generator\DoctrineCrudGeneratorTest;
17 | use JordiLlonch\Bundle\CrudGeneratorBundle\Generator\JordiLlonchCrudGenerator;
18 |
19 | class JordiLlonchCrudGeneratorTest extends DoctrineCrudGeneratorTest
20 | {
21 | protected function getGenerator()
22 | {
23 | $generator = new JordiLlonchCrudGenerator($this->filesystem);
24 | $generator->setSkeletonDirs(array(__DIR__.'/../../Resources/skeleton'));
25 |
26 | return $generator;
27 | }
28 |
29 | public function testGenerateYamlFull()
30 | {
31 | parent::testGenerateYamlFull();
32 |
33 | $this->assertFilterAndPaginator();
34 | }
35 |
36 | public function testGenerateXml()
37 | {
38 | parent::testGenerateXml();
39 |
40 | $this->assertFilterAndPaginator();
41 | }
42 |
43 | public function testGenerateAnnotationWrite()
44 | {
45 | parent::testGenerateAnnotationWrite();
46 |
47 | $this->assertFilterAndPaginator();
48 | }
49 |
50 | public function testGenerateAnnotation()
51 | {
52 | parent::testGenerateAnnotation();
53 |
54 | $this->assertFilterAndPaginator();
55 | }
56 |
57 | protected function assertFilterAndPaginator()
58 | {
59 | $content = file_get_contents($this->tmpDir . '/Controller/PostController.php');
60 | $strings = array(
61 | 'protected function filter',
62 | 'protected function paginator',
63 | );
64 | foreach ($strings as $string) {
65 | $this->assertContains($string, $content);
66 | }
67 |
68 |
69 | $this->assertTrue(file_exists($this->tmpDir.'/Form/PostFilterType.php'));
70 |
71 | $content = file_get_contents($this->tmpDir.'/Form/PostFilterType.php');
72 | $this->assertContains('->add(\'title\', \'filter_text\')', $content);
73 | $this->assertContains('class PostFilterType extends AbstractType', $content);
74 | $this->assertContains("'foo_barbundle_postfiltertype'", $content);
75 |
76 | }
77 | }
78 |
--------------------------------------------------------------------------------
/Tests/Generator/JordiLlonchFormGeneratorTest.php:
--------------------------------------------------------------------------------
1 |
9 | *
10 | * For the full copyright and license information, please view the LICENSE
11 | * file that was distributed with this source code.
12 | */
13 |
14 | namespace JordiLlonch\Bundle\CrudGeneratorBundle\Tests\Generator;
15 |
16 | use Sensio\Bundle\GeneratorBundle\Tests\Generator\GeneratorTest;
17 | use Sensio\Bundle\GeneratorBundle\Generator\DoctrineFormGenerator;
18 |
19 | class JordiLlonchFormGeneratorTest extends GeneratorTest
20 | {
21 | public function testGenerate()
22 | {
23 | $generator = new DoctrineFormGenerator($this->filesystem);
24 | $generator->setSkeletonDirs(array(__DIR__.'/../../Resources/skeleton'));
25 |
26 | $bundle = $this->getMock('Symfony\Component\HttpKernel\Bundle\BundleInterface');
27 | $bundle->expects($this->any())->method('getPath')->will($this->returnValue($this->tmpDir));
28 | $bundle->expects($this->any())->method('getNamespace')->will($this->returnValue('Foo\BarBundle'));
29 |
30 | $metadata = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadataInfo')->disableOriginalConstructor()->getMock();
31 | $metadata->identifier = array('id');
32 | $metadata->associationMappings = array('title' => array('type' => 'string'));
33 |
34 | $generator->generate($bundle, 'Post', $metadata);
35 |
36 | $this->assertTrue(file_exists($this->tmpDir.'/Form/PostType.php'));
37 |
38 | $content = file_get_contents($this->tmpDir.'/Form/PostType.php');
39 | $this->assertContains('->add(\'title\')', $content);
40 | $this->assertContains('class PostType extends AbstractType', $content);
41 | $this->assertContains("'data_class' => 'Foo\BarBundle\Entity\Post'", $content);
42 | $this->assertContains("'foo_barbundle_post'", $content);
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/Tests/bootstrap.php:
--------------------------------------------------------------------------------
1 | 2.2.0",
16 | "sensio/generator-bundle": ">2.2.0",
17 | "pagerfanta/pagerfanta": "1.0.*@dev",
18 | "lexik/form-filter-bundle": "~3.0",
19 | "doctrine/orm": ">=2.2.3"
20 | },
21 | "require-dev": {
22 | "phpunit/phpunit": "4.1.*"
23 | },
24 | "minimum-stability": "dev",
25 | "autoload": {
26 | "psr-0": { "JordiLlonch\\Bundle\\CrudGeneratorBundle": "" }
27 | },
28 | "target-dir": "JordiLlonch/Bundle/CrudGeneratorBundle",
29 | "extra": {
30 | "branch-alias": {
31 | "dev-master": "2.3.x-dev"
32 | }
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/phpunit.xml.dist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
14 |
15 |
16 | ./Tests/
17 |
18 |
19 |
20 |
21 |
22 | ./
23 |
24 | ./Resources
25 | ./Tests
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jordillonch/CrudGeneratorBundle/4454128d38ed014da90ef8caaa636bd644a76bb8/screenshot.png
--------------------------------------------------------------------------------