para 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +65 -0
- data/Rakefile +21 -0
- data/app/assets/images/para/admin/bg.png +0 -0
- data/app/assets/javascripts/admin/app.coffee +1 -0
- data/app/assets/javascripts/para/admin/table.coffee +46 -0
- data/app/assets/javascripts/para/admin/theme_actions.coffee +26 -0
- data/app/assets/javascripts/para/admin/tree.coffee +53 -0
- data/app/assets/javascripts/para/admin.coffee +18 -0
- data/app/assets/javascripts/para/application.js +13 -0
- data/app/assets/javascripts/para/inputs/nested_many.coffee +57 -0
- data/app/assets/javascripts/para/lib/ajax.coffee +11 -0
- data/app/assets/stylesheets/admin/app.sass +0 -0
- data/app/assets/stylesheets/admin/theme.sass +0 -0
- data/app/assets/stylesheets/para/admin/theme/_base.sass +170 -0
- data/app/assets/stylesheets/para/admin/theme/_breadcrumb.sass +29 -0
- data/app/assets/stylesheets/para/admin/theme/_buttons.sass +24 -0
- data/app/assets/stylesheets/para/admin/theme/_checkable.sass +107 -0
- data/app/assets/stylesheets/para/admin/theme/_commonds.sass +213 -0
- data/app/assets/stylesheets/para/admin/theme/_dropdown.sass +53 -0
- data/app/assets/stylesheets/para/admin/theme/_form.sass +141 -0
- data/app/assets/stylesheets/para/admin/theme/_list.sass +138 -0
- data/app/assets/stylesheets/para/admin/theme/_navigation.sass +287 -0
- data/app/assets/stylesheets/para/admin/theme/_navtabs.sass +127 -0
- data/app/assets/stylesheets/para/admin/theme/_orderable.sass +44 -0
- data/app/assets/stylesheets/para/admin/theme/_panel.sass +288 -0
- data/app/assets/stylesheets/para/admin/theme/_responsive.sass +123 -0
- data/app/assets/stylesheets/para/admin/theme/_sorting.sass +30 -0
- data/app/assets/stylesheets/para/admin/theme/_table.sass +24 -0
- data/app/assets/stylesheets/para/admin/theme/_tree.sass +74 -0
- data/app/assets/stylesheets/para/admin/theme/_variables.sass +31 -0
- data/app/assets/stylesheets/para/admin/theme.sass +22 -0
- data/app/assets/stylesheets/para/admin.sass +10 -0
- data/app/assets/stylesheets/para/application.css +15 -0
- data/app/assets/stylesheets/para/lib/_variables.scss +646 -0
- data/app/assets/stylesheets/para/overrides/datetimepicker.sass +17 -0
- data/app/assets/stylesheets/para/overrides/fuelux.sass +43 -0
- data/app/assets/stylesheets/para/overrides/jasny.bootstrap.sass +41 -0
- data/app/assets/stylesheets/para/overrides/redactor.sass +88 -0
- data/app/assets/stylesheets/para/overrides/responsive.sass +63 -0
- data/app/assets/stylesheets/para/overrides/selectize.sass +45 -0
- data/app/assets/stylesheets/para/overrides/slider.sass +13 -0
- data/app/assets/stylesheets/para/overrides/theme.sass +172 -0
- data/app/controllers/concerns/para/admin/resource_controller_concerns.rb +17 -0
- data/app/controllers/para/admin/base_controller.rb +46 -0
- data/app/controllers/para/admin/component_controller.rb +9 -0
- data/app/controllers/para/admin/crud_component_controller.rb +17 -0
- data/app/controllers/para/admin/crud_resources_controller.rb +71 -0
- data/app/controllers/para/admin/main_controller.rb +8 -0
- data/app/controllers/para/admin/resources_controller.rb +163 -0
- data/app/controllers/para/admin/settings_component_controller.rb +11 -0
- data/app/controllers/para/admin/settings_form_controller.rb +21 -0
- data/app/controllers/para/admin/singleton_resource_component_controller.rb +14 -0
- data/app/controllers/para/admin/singleton_resources_controller.rb +30 -0
- data/app/controllers/para/application_controller.rb +7 -0
- data/app/decorators/para/component/base_decorator.rb +48 -0
- data/app/decorators/para/component/crud_decorator.rb +32 -0
- data/app/decorators/para/component/settings_decorator.rb +11 -0
- data/app/decorators/para/component/singleton_resource_decorator.rb +11 -0
- data/app/decorators/para/component_section_decorator.rb +4 -0
- data/app/helpers/para/admin/base_helper.rb +57 -0
- data/app/helpers/para/admin/component_groups_helper.rb +4 -0
- data/app/helpers/para/admin/components_helper.rb +4 -0
- data/app/helpers/para/admin/resources_helper.rb +27 -0
- data/app/helpers/para/application_helper.rb +14 -0
- data/app/helpers/para/exports_helper.rb +11 -0
- data/app/helpers/para/flash_helper.rb +48 -0
- data/app/helpers/para/form_helper.rb +28 -0
- data/app/helpers/para/markup_helper.rb +15 -0
- data/app/helpers/para/model_helper.rb +38 -0
- data/app/helpers/para/navigation_helper.rb +8 -0
- data/app/helpers/para/ordering_helper.rb +20 -0
- data/app/helpers/para/search_helper.rb +22 -0
- data/app/helpers/para/tag_helper.rb +50 -0
- data/app/helpers/para/tree_helper.rb +41 -0
- data/app/models/para/component/base.rb +70 -0
- data/app/models/para/component/crud.rb +45 -0
- data/app/models/para/component/resource.rb +33 -0
- data/app/models/para/component/settings.rb +17 -0
- data/app/models/para/component/singleton_resource.rb +25 -0
- data/app/models/para/component_resource.rb +6 -0
- data/app/models/para/component_section.rb +18 -0
- data/app/views/layouts/para/admin.html.haml +32 -0
- data/app/views/layouts/para/application.html.erb +14 -0
- data/app/views/para/admin/component_sections/_form.html.haml +10 -0
- data/app/views/para/admin/component_sections/edit.html.haml +5 -0
- data/app/views/para/admin/component_sections/new.html.haml +5 -0
- data/app/views/para/admin/components/_form.html.haml +15 -0
- data/app/views/para/admin/components/new.html.haml +4 -0
- data/app/views/para/admin/crud_component/show.html.haml +4 -0
- data/app/views/para/admin/dashboard.html.haml +10 -0
- data/app/views/para/admin/main/index.html.haml +1 -0
- data/app/views/para/admin/resources/_exports_menu.html.haml +12 -0
- data/app/views/para/admin/resources/_fields.html.haml +5 -0
- data/app/views/para/admin/resources/_filters.html.haml +9 -0
- data/app/views/para/admin/resources/_form.html.haml +6 -0
- data/app/views/para/admin/resources/_list.html.haml +22 -0
- data/app/views/para/admin/resources/_table.html.haml +8 -0
- data/app/views/para/admin/resources/_tree.html.haml +15 -0
- data/app/views/para/admin/resources/_tree_item.html.haml +16 -0
- data/app/views/para/admin/resources/edit.html.haml +6 -0
- data/app/views/para/admin/resources/new.html.haml +6 -0
- data/app/views/para/admin/settings_component/show.html.haml +12 -0
- data/app/views/para/admin/shared/_breadcrumb.html.haml +3 -0
- data/app/views/para/admin/shared/_header.html.haml +27 -0
- data/app/views/para/admin/shared/_navigation.html.haml +21 -0
- data/app/views/para/admin/singleton_resource_component/show.html.haml +5 -0
- data/app/views/para/inputs/_nested_many.html.haml +10 -0
- data/app/views/para/inputs/_nested_many_container.html.haml +19 -0
- data/app/views/para/inputs/_nested_one.html.haml +3 -0
- data/config/locales/en.yml +86 -0
- data/config/locales/fr.yml +101 -0
- data/db/migrate/20140911091225_create_para_components.rb +19 -0
- data/db/migrate/20140911112150_add_slug_to_para_components.rb +6 -0
- data/db/migrate/20140929125733_create_para_component_sections.rb +8 -0
- data/db/migrate/20140929131111_add_identifier_to_para_component_sections.rb +5 -0
- data/db/migrate/20140930121822_add_position_to_para_component_section.rb +5 -0
- data/db/migrate/20150129170710_create_para_component_resources.rb +13 -0
- data/db/migrate/20150203173219_add_identifier_to_para_components.rb +5 -0
- data/lib/generators/para/admin_user/admin_user_generator.rb +16 -0
- data/lib/generators/para/component/component_generator.rb +59 -0
- data/lib/generators/para/component/templates/component.rb +3 -0
- data/lib/generators/para/component/templates/component_controller.rb +7 -0
- data/lib/generators/para/component/templates/show.html.haml +2 -0
- data/lib/generators/para/exporter/exporter_generator.rb +42 -0
- data/lib/generators/para/exporter/templates/base_exporter.rb +15 -0
- data/lib/generators/para/exporter/templates/csv_exporter.rb +13 -0
- data/lib/generators/para/form/form_generator.rb +15 -0
- data/lib/generators/para/form/templates/_form.html.haml +7 -0
- data/lib/generators/para/install/install_generator.rb +112 -0
- data/lib/generators/para/install/templates/components.rb +13 -0
- data/lib/generators/para/install/templates/initializer.rb +23 -0
- data/lib/generators/para/nested_fields/nested_fields_generator.rb +15 -0
- data/lib/generators/para/nested_fields/templates/_nested_fields.html.haml +3 -0
- data/lib/generators/para/orderable/orderable_generator.rb +53 -0
- data/lib/generators/para/orderable/templates/orderable_migration.rb +6 -0
- data/lib/generators/para/resource/resource_generator.rb +71 -0
- data/lib/generators/para/resource/templates/resource_controller.rb +5 -0
- data/lib/generators/para/table/table_generator.rb +34 -0
- data/lib/generators/para/table/templates/_table.html.haml +10 -0
- data/lib/para/attribute_field/base.rb +77 -0
- data/lib/para/attribute_field/belongs_to.rb +29 -0
- data/lib/para/attribute_field/boolean.rb +15 -0
- data/lib/para/attribute_field/datetime.rb +9 -0
- data/lib/para/attribute_field/file.rb +20 -0
- data/lib/para/attribute_field/has_many.rb +31 -0
- data/lib/para/attribute_field/image.rb +25 -0
- data/lib/para/attribute_field/nested_many.rb +26 -0
- data/lib/para/attribute_field/nested_one.rb +27 -0
- data/lib/para/attribute_field/password.rb +18 -0
- data/lib/para/attribute_field/redactor.rb +20 -0
- data/lib/para/attribute_field/relation.rb +52 -0
- data/lib/para/attribute_field/translation.rb +9 -0
- data/lib/para/attribute_field_mappings.rb +82 -0
- data/lib/para/cloneable.rb +20 -0
- data/lib/para/component/exportable.rb +25 -0
- data/lib/para/component.rb +27 -0
- data/lib/para/components_configuration.rb +156 -0
- data/lib/para/config.rb +21 -0
- data/lib/para/engine.rb +59 -0
- data/lib/para/errors.rb +15 -0
- data/lib/para/exporter/base.rb +27 -0
- data/lib/para/exporter/csv.rb +49 -0
- data/lib/para/exporter.rb +57 -0
- data/lib/para/ext/cancan.rb +26 -0
- data/lib/para/ext/paperclip.rb +67 -0
- data/lib/para/ext.rb +13 -0
- data/lib/para/form_builder/containers.rb +70 -0
- data/lib/para/form_builder/field_mappings.rb +9 -0
- data/lib/para/form_builder/nested_form.rb +80 -0
- data/lib/para/form_builder/ordering.rb +15 -0
- data/lib/para/form_builder/settings.rb +24 -0
- data/lib/para/form_builder.rb +22 -0
- data/lib/para/generators/field_helpers.rb +32 -0
- data/lib/para/generators/name_helpers.rb +9 -0
- data/lib/para/generators/named_base.rb +7 -0
- data/lib/para/generators.rb +11 -0
- data/lib/para/inputs/nested_many_input.rb +40 -0
- data/lib/para/inputs/nested_one_input.rb +24 -0
- data/lib/para/inputs.rb +11 -0
- data/lib/para/markup/alert.rb +37 -0
- data/lib/para/markup/component.rb +20 -0
- data/lib/para/markup/modal.rb +52 -0
- data/lib/para/markup/panel.rb +41 -0
- data/lib/para/markup/resources_table.rb +178 -0
- data/lib/para/markup.rb +10 -0
- data/lib/para/model_field_parsers/base.rb +20 -0
- data/lib/para/model_field_parsers/devise.rb +37 -0
- data/lib/para/model_field_parsers/globalize.rb +23 -0
- data/lib/para/model_field_parsers/orderable.rb +15 -0
- data/lib/para/model_field_parsers/paperclip.rb +51 -0
- data/lib/para/model_field_parsers/redactor.rb +19 -0
- data/lib/para/model_field_parsers/relations.rb +67 -0
- data/lib/para/model_field_parsers.rb +22 -0
- data/lib/para/orderable.rb +44 -0
- data/lib/para/routes.rb +49 -0
- data/lib/para/version.rb +3 -0
- data/lib/para.rb +65 -0
- data/lib/rails/relation_length_validator.rb +45 -0
- data/lib/rails/routing_mapper.rb +27 -0
- data/lib/tasks/para_tasks.rake +22 -0
- metadata +595 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: bf91ced8ed0c3b19a7c6969a2b528ccc35ae1a3e
|
4
|
+
data.tar.gz: 0368b7ddfaeff31415371ebe2cc9c7f23cbeef63
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1d0717d4cc7da391e4fadba4fbda2720d6f7ccedaf208fd65f307275bc5f08897af5be6e10694200158de3e4daf58b2ad0739c31530015f4fe1909a2e7439c97
|
7
|
+
data.tar.gz: b7c643c8c1d81d08f8c8eeb3129396eda89e39591363a9a8eddb6a8737abee4c06401557a94167c47f5a849328f703d9f7fc008a6a1c54e5514a7ee34fade9a7
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2014 YOURNAME
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
# Para Ain't Rails Admin
|
2
|
+
|
3
|
+
Admin / CMS Framework for rails. WIP
|
4
|
+
|
5
|
+
Detailed documentation (in progress too) can be found at [in the Wiki](https://github.com/para-cms/para/wiki) section.
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
First, add the following line to the Gemfile
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'para', github: 'para-cms/para'
|
13
|
+
```
|
14
|
+
|
15
|
+
Then :
|
16
|
+
|
17
|
+
```bash
|
18
|
+
bundle install
|
19
|
+
```
|
20
|
+
|
21
|
+
And run the install generator :
|
22
|
+
|
23
|
+
```bash
|
24
|
+
rails g para:install
|
25
|
+
```
|
26
|
+
|
27
|
+
For detailed instructions, please refer to the wiki
|
28
|
+
[Installation](https://github.com/para-cms/para/wiki/Installation) section.
|
29
|
+
|
30
|
+
## Usage
|
31
|
+
|
32
|
+
The Para documentation can be found in the [Wiki]()
|
33
|
+
|
34
|
+
Here's a summary of what you can find :
|
35
|
+
|
36
|
+
### Getting started
|
37
|
+
|
38
|
+
* [Installation](https://github.com/para-cms/para/wiki/Installation)
|
39
|
+
* [Getting Started](https://github.com/para-cms/para/wiki/Getting-started)
|
40
|
+
|
41
|
+
### Components
|
42
|
+
|
43
|
+
* [Creating components](https://github.com/para-cms/para/wiki/Creating-components)
|
44
|
+
* [Components configuration](https://github.com/para-cms/para/wiki/Components-configuration)
|
45
|
+
* [Accessing components](https://github.com/para-cms/para/wiki/Accessing-components-in-the-frontend)
|
46
|
+
|
47
|
+
### Customization
|
48
|
+
|
49
|
+
* [Customizing tables](https://github.com/para-cms/para/wiki/Customizing-tables)
|
50
|
+
* [Customizing forms](https://github.com/para-cms/para/wiki/Customizing-Forms)
|
51
|
+
* [Nested forms](https://github.com/para-cms/para/wiki/Nested-forms)
|
52
|
+
* [Adding custom Javascript](https://github.com/para-cms/para/wiki/Adding-JS)
|
53
|
+
|
54
|
+
### Misc features
|
55
|
+
|
56
|
+
* [Ordering models](https://github.com/para-cms/para/wiki/Ordering-models)
|
57
|
+
* [Use models with `acts_as_tree`](https://github.com/para-cms/para/wiki/Use-models-with-%60acts_as_tree%60)
|
58
|
+
* [Global app settings](https://github.com/para-cms/para/wiki/Global-app-settings)
|
59
|
+
* [Adding exports](https://github.com/para-cms/para/wiki/Exporting-data-from-your-models)
|
60
|
+
* [Admin customization](https://github.com/para-cms/para/wiki/Admin-customization)
|
61
|
+
|
62
|
+
|
63
|
+
## Licence
|
64
|
+
|
65
|
+
Para is released under the MIT-Licence.
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
8
|
+
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'Para'
|
12
|
+
rdoc.options << '--line-numbers'
|
13
|
+
rdoc.rdoc_files.include('README.rdoc')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
end
|
16
|
+
|
17
|
+
APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
|
18
|
+
load 'rails/tasks/engine.rake'
|
19
|
+
|
20
|
+
Bundler::GemHelper.install_tasks
|
21
|
+
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
# Override in app
|
@@ -0,0 +1,46 @@
|
|
1
|
+
class Para.ResourceTable
|
2
|
+
constructor: (@$table) ->
|
3
|
+
@$tbody = @$table.find('tbody')
|
4
|
+
@initializeOrderable()
|
5
|
+
|
6
|
+
initializeOrderable: ->
|
7
|
+
@orderable = @$table.hasClass('orderable')
|
8
|
+
|
9
|
+
return unless @orderable
|
10
|
+
|
11
|
+
@orderUrl = @$table.data('order-url')
|
12
|
+
|
13
|
+
@$tbody.sortable
|
14
|
+
handle: '.order-anchor'
|
15
|
+
forcePlaceholderSize: true
|
16
|
+
items: 'tr'
|
17
|
+
placeholder: "<tr><td colspan=\"100%\" class=\"sortable-placeholder\"></td></tr>"
|
18
|
+
|
19
|
+
@$tbody.on('sortupdate', $.proxy(@sortUpdate, this))
|
20
|
+
|
21
|
+
sortUpdate: ->
|
22
|
+
@$tbody.find('tr').each (i, el) ->
|
23
|
+
$(el).find('.resource-position-field').val(i)
|
24
|
+
|
25
|
+
@updateOrder()
|
26
|
+
|
27
|
+
updateOrder: ->
|
28
|
+
Para.ajax(
|
29
|
+
url: @orderUrl
|
30
|
+
method: 'patch'
|
31
|
+
data:
|
32
|
+
resources: @buildOrderedData()
|
33
|
+
success: $.proxy(@orderUpdated, this)
|
34
|
+
)
|
35
|
+
|
36
|
+
buildOrderedData: ->
|
37
|
+
for i, field of @$tbody.find('.resource-position-field').get()
|
38
|
+
$field = $(field)
|
39
|
+
{ id: $field.closest('.order-anchor').data('id'), position: $field.val() }
|
40
|
+
|
41
|
+
orderUpdated: ->
|
42
|
+
# TODO: Add flash message to display ordering success
|
43
|
+
|
44
|
+
$(document).on 'page:change', ->
|
45
|
+
$('.para-component-relation-table').each (i, el) ->
|
46
|
+
new Para.ResourceTable($(el))
|
@@ -0,0 +1,26 @@
|
|
1
|
+
scrollToComponentSection = ($component, duration = 0) ->
|
2
|
+
sectionOffset = $component.closest('.component-section-item').offset().top + $('.page-sidebar').scrollTop()
|
3
|
+
headerHeight = $('.page-sidebar .brand-logo').outerHeight()
|
4
|
+
$('.page-sidebar').scrollTo(sectionOffset - headerHeight, duration: duration)
|
5
|
+
|
6
|
+
responsive_sidebar_navigation = ->
|
7
|
+
# Scroll to active element's section on page change
|
8
|
+
if ($activeItem = $('.component-item.active')).length
|
9
|
+
scrollToComponentSection($activeItem)
|
10
|
+
|
11
|
+
$('.component-item').on 'click', 'a', (e) ->
|
12
|
+
console.log 'scroll to ', $(e.currentTarget).closest('.component-item')
|
13
|
+
scrollToComponentSection($(e.currentTarget), 150)
|
14
|
+
|
15
|
+
$(document).on 'page:change', ->
|
16
|
+
responsive_sidebar_navigation()
|
17
|
+
|
18
|
+
$(".selectize-tags").selectize
|
19
|
+
delimiter: ","
|
20
|
+
persist: false
|
21
|
+
create: (input) ->
|
22
|
+
value: input
|
23
|
+
text: input
|
24
|
+
|
25
|
+
$(window).resize ->
|
26
|
+
responsive_sidebar_navigation()
|
@@ -0,0 +1,53 @@
|
|
1
|
+
class Para.ResourceTree
|
2
|
+
constructor: (@$el) ->
|
3
|
+
@initializeTree()
|
4
|
+
|
5
|
+
initializeTree: ->
|
6
|
+
@orderUrl = @$el.data('url')
|
7
|
+
@maxDepth = parseInt @$el.data('max-depth')
|
8
|
+
|
9
|
+
$(".tree")
|
10
|
+
.sortable
|
11
|
+
handle: ".handle"
|
12
|
+
items: ".node"
|
13
|
+
connectWith: ".tree"
|
14
|
+
.on('sortupdate', $.proxy(@sortUpdate, this))
|
15
|
+
|
16
|
+
sortUpdate: (e, data) ->
|
17
|
+
@handlePlaceholder($el) for $el in [data.endparent, data.startparent, data.item.find('.tree')]
|
18
|
+
@updateOrder()
|
19
|
+
|
20
|
+
handlePlaceholder: ($el) ->
|
21
|
+
$placeholder = $el.find("> .placeholder")
|
22
|
+
if $el.parents('.tree').length - 1 >= @maxDepth or $el.find('> .node').length
|
23
|
+
$placeholder.hide()
|
24
|
+
$el.children("> .tree").each (index, el) => @handlePlaceholder $(el)
|
25
|
+
else
|
26
|
+
$placeholder.show()
|
27
|
+
|
28
|
+
updateOrder: ->
|
29
|
+
Para.ajax(
|
30
|
+
url: @orderUrl
|
31
|
+
method: 'patch'
|
32
|
+
data:
|
33
|
+
resources: @buildOrderedData()
|
34
|
+
success: $.proxy(@orderUpdated, this)
|
35
|
+
)
|
36
|
+
|
37
|
+
buildOrderedData: ->
|
38
|
+
data = {}
|
39
|
+
$(".node").each (index) ->
|
40
|
+
$this = $(this)
|
41
|
+
data[index] = {
|
42
|
+
id: $this.data("id"),
|
43
|
+
position: index,
|
44
|
+
parent_id: $this.parent().parent().data("id")
|
45
|
+
}
|
46
|
+
data
|
47
|
+
|
48
|
+
orderUpdated: ->
|
49
|
+
# TODO: Add flash message to display ordering success
|
50
|
+
|
51
|
+
$(document).on 'page:change', ->
|
52
|
+
$('.root-tree').each (i, el) ->
|
53
|
+
new Para.ResourceTree($(el))
|
@@ -0,0 +1,18 @@
|
|
1
|
+
#= require jquery
|
2
|
+
#= require jquery_ujs
|
3
|
+
#= require turbolinks
|
4
|
+
#= require bootstrap
|
5
|
+
#= require selectize
|
6
|
+
#= require jasny.bootstrap.min
|
7
|
+
#= require simple_form_extension
|
8
|
+
#= require jquery.scrollto
|
9
|
+
#= require html5-sortable
|
10
|
+
#= require cocoon
|
11
|
+
#= require_self
|
12
|
+
#= require_tree ./lib
|
13
|
+
#= require_tree ./inputs
|
14
|
+
#= require_tree ./admin
|
15
|
+
#= require admin/app
|
16
|
+
|
17
|
+
# Initialize scope
|
18
|
+
window.Para = {}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
2
|
+
// listed below.
|
3
|
+
//
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
5
|
+
// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
|
6
|
+
//
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
8
|
+
// compiled file.
|
9
|
+
//
|
10
|
+
// Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
|
11
|
+
// about supported directives.
|
12
|
+
//
|
13
|
+
//= require_tree .
|
@@ -0,0 +1,57 @@
|
|
1
|
+
class Para.NestedManyField
|
2
|
+
constructor: (@$field) ->
|
3
|
+
@$fieldsList = @$field.find('.fields-list')
|
4
|
+
|
5
|
+
@initializeOrderable()
|
6
|
+
@initializeCocoon()
|
7
|
+
|
8
|
+
@$field.on 'shown.bs.collapse', $.proxy(@collapseShown, this)
|
9
|
+
|
10
|
+
initializeOrderable: ->
|
11
|
+
@orderable = @$field.hasClass('orderable')
|
12
|
+
return unless @orderable
|
13
|
+
|
14
|
+
@$fieldsList.sortable
|
15
|
+
handle: '.order-anchor'
|
16
|
+
forcePlaceholderSize: true
|
17
|
+
|
18
|
+
@$fieldsList.on('sortupdate', $.proxy(@sortUpdate, this))
|
19
|
+
|
20
|
+
sortUpdate: (e, ui) ->
|
21
|
+
@$fieldsList.find('.form-fields').each (i, el) ->
|
22
|
+
$(el).find('.resource-position-field').val(i)
|
23
|
+
|
24
|
+
initializeCocoon: ->
|
25
|
+
@$fieldsList.on 'cocoon:after-insert', $.proxy(@afterInsertField, this)
|
26
|
+
|
27
|
+
afterInsertField: (e, $element) ->
|
28
|
+
if ($collapsible = $element.find('[data-open-on-insert="true"]')).length
|
29
|
+
@openInsertedField($collapsible)
|
30
|
+
|
31
|
+
if @orderable
|
32
|
+
@$fieldsList.sortable('destroy')
|
33
|
+
@initializeOrderable()
|
34
|
+
|
35
|
+
if ($redactor = $element.find('[data-redactor]')).length
|
36
|
+
$redactor.simpleFormRedactor()
|
37
|
+
|
38
|
+
if ($selectize = $element.find('[data-selectize]'))
|
39
|
+
$selectize.simpleFormSelectize()
|
40
|
+
|
41
|
+
if ($slider = $element.find('[data-slider]'))
|
42
|
+
$slider.simpleFormSlider()
|
43
|
+
|
44
|
+
openInsertedField: ($field) ->
|
45
|
+
$target = $($field.attr('href'))
|
46
|
+
$target.collapse('show')
|
47
|
+
|
48
|
+
collapseShown: (e) ->
|
49
|
+
$target = $(e.target)
|
50
|
+
$field = @$field.find("[data-toggle='collapse'][href='##{ $target.attr('id') }']")
|
51
|
+
scrollOffset = -($('[data-header]').outerHeight() + 20)
|
52
|
+
$.scrollTo($field, 200, offset: scrollOffset)
|
53
|
+
$target.find('input, textarea, select').eq('0').focus()
|
54
|
+
|
55
|
+
|
56
|
+
$(document).on 'page:change', ->
|
57
|
+
$('.nested-many-field').each (i, el) -> new Para.NestedManyField($(el))
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Para.ajax = (options = {}) ->
|
2
|
+
csrfParam = $('meta[name="csrf-param"]').attr('content')
|
3
|
+
csrfToken = $('meta[name="csrf-token"]').attr('content')
|
4
|
+
|
5
|
+
csrfOptions = {}
|
6
|
+
csrfOptions[csrfParam] = csrfToken if csrfParam and csrfToken
|
7
|
+
|
8
|
+
unless options.method and options.method.match(/get/i)
|
9
|
+
options = $.extend(csrfOptions, options)
|
10
|
+
|
11
|
+
$.ajax(options)
|
File without changes
|
File without changes
|
@@ -0,0 +1,170 @@
|
|
1
|
+
|
2
|
+
@import url('//fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,400,300,500,600,700&subset=latin,cyrillic-ext')
|
3
|
+
|
4
|
+
@import "variables"
|
5
|
+
@import "compass/css3/transition"
|
6
|
+
@import "compass/css3/box-shadow"
|
7
|
+
|
8
|
+
html *
|
9
|
+
outline: 0!important
|
10
|
+
|
11
|
+
body, html
|
12
|
+
min-height: 100%
|
13
|
+
position: relative
|
14
|
+
overflow-x: hidden
|
15
|
+
-webkit-font-smoothing: antialiased
|
16
|
+
-moz-osx-font-smoothing: grayscale
|
17
|
+
|
18
|
+
.body-full-height
|
19
|
+
body
|
20
|
+
height: 100%
|
21
|
+
|
22
|
+
.row
|
23
|
+
margin-left: 0
|
24
|
+
margin-right: 0
|
25
|
+
[class^=col-lg-], [class^=col-md-], [class^=col-sm-], [class^=col-xs-]
|
26
|
+
min-height: 1px
|
27
|
+
&.stacked
|
28
|
+
[class^=col-lg-], [class^=col-md-], [class^=col-sm-], [class^=col-xs-]
|
29
|
+
padding-left: 0
|
30
|
+
padding-right: 0
|
31
|
+
|
32
|
+
[class^=col-lg-], [class^=col-md-], [class^=col-sm-], [class^=col-xs-]
|
33
|
+
padding-left: 10px
|
34
|
+
padding-right: 10px
|
35
|
+
|
36
|
+
// Main container
|
37
|
+
// -------------------------
|
38
|
+
|
39
|
+
.page-container
|
40
|
+
width: 100%
|
41
|
+
float: left
|
42
|
+
min-height: 100%
|
43
|
+
position: relative
|
44
|
+
background: $navbar-default-bg
|
45
|
+
|
46
|
+
// Right side Content
|
47
|
+
.page-content
|
48
|
+
min-height: 100%
|
49
|
+
margin-left: $left-menu-width-open
|
50
|
+
background-color: $body-bg
|
51
|
+
position: relative
|
52
|
+
zoom: 1
|
53
|
+
&:after, &:before
|
54
|
+
content: ""
|
55
|
+
display: table
|
56
|
+
&:after
|
57
|
+
clear: both
|
58
|
+
|
59
|
+
// Frame system (no border, with right or left sidebar)
|
60
|
+
.content-frame
|
61
|
+
float: left
|
62
|
+
width: 100%
|
63
|
+
position: relative
|
64
|
+
background-color: $body-bg
|
65
|
+
|
66
|
+
.content-frame-top
|
67
|
+
float: left
|
68
|
+
width: 100%
|
69
|
+
line-height: 30px
|
70
|
+
padding: 13px 15px 15px
|
71
|
+
background: rgba(0, 0, 0, 0.02)
|
72
|
+
border-bottom: 1px solid $panel-default-border
|
73
|
+
border-top: 1px solid $panel-default-border
|
74
|
+
.page-title
|
75
|
+
padding: 0
|
76
|
+
width: auto
|
77
|
+
h2
|
78
|
+
margin-bottom: 0
|
79
|
+
font-size: 22px
|
80
|
+
|
81
|
+
.content-frame-left
|
82
|
+
float: left
|
83
|
+
width: $content-frame-with
|
84
|
+
padding: 10px
|
85
|
+
min-height: 100%
|
86
|
+
background: rgba(0, 0, 0, 0.02)
|
87
|
+
border-right: 1px solid $panel-default-border
|
88
|
+
&.padding-0
|
89
|
+
padding: 0
|
90
|
+
.block
|
91
|
+
padding: 0
|
92
|
+
margin-bottom: 20px
|
93
|
+
h4
|
94
|
+
margin-top: 10px
|
95
|
+
> .form-group
|
96
|
+
margin-bottom: 20px
|
97
|
+
|
98
|
+
.content-frame-right
|
99
|
+
float: right
|
100
|
+
width: $content-frame-with
|
101
|
+
padding: 10px
|
102
|
+
min-height: 100%
|
103
|
+
background: rgba(0, 0, 0, 0.02)
|
104
|
+
border-left: 1px solid $panel-default-border
|
105
|
+
&.padding-0
|
106
|
+
padding: 0
|
107
|
+
.block
|
108
|
+
padding: 10px
|
109
|
+
h4
|
110
|
+
margin-top: 10px
|
111
|
+
.block
|
112
|
+
padding: 0
|
113
|
+
margin-bottom: 20px
|
114
|
+
> .form-group
|
115
|
+
margin-bottom: 20px
|
116
|
+
|
117
|
+
.content-frame-body
|
118
|
+
padding: 70px 10px 10px
|
119
|
+
margin-left: $content-frame-with
|
120
|
+
&.content-frame-body-left
|
121
|
+
margin-left: 0
|
122
|
+
margin-right: $content-frame-with
|
123
|
+
|
124
|
+
// Basic content frame
|
125
|
+
.page-content-wrap
|
126
|
+
float: left
|
127
|
+
width: 100%
|
128
|
+
padding: 0 25px
|
129
|
+
|
130
|
+
// Top navigation fixed
|
131
|
+
&.page-navigation-top-fixed
|
132
|
+
.navigation-horizontal
|
133
|
+
position: fixed
|
134
|
+
top: 0
|
135
|
+
right: 0
|
136
|
+
left: 0
|
137
|
+
.page-content
|
138
|
+
padding-top: $navbar-height
|
139
|
+
|
140
|
+
/* Animations */
|
141
|
+
@-webkit-keyframes pulsate
|
142
|
+
0%
|
143
|
+
opacity: 0.0
|
144
|
+
|
145
|
+
50%
|
146
|
+
opacity: 1.0
|
147
|
+
|
148
|
+
100%
|
149
|
+
opacity: 0.0
|
150
|
+
|
151
|
+
@-moz-keyframes pulsate
|
152
|
+
0%
|
153
|
+
opacity: 0.0
|
154
|
+
|
155
|
+
50%
|
156
|
+
opacity: 1.0
|
157
|
+
|
158
|
+
100%
|
159
|
+
opacity: 0.0
|
160
|
+
|
161
|
+
@keyframes pulsate
|
162
|
+
0%
|
163
|
+
opacity: 0.0
|
164
|
+
|
165
|
+
50%
|
166
|
+
opacity: 1.0
|
167
|
+
|
168
|
+
100%
|
169
|
+
opacity: 0.0
|
170
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
@import 'variables'
|
2
|
+
@import "compass/css3/border-radius"
|
3
|
+
|
4
|
+
.breadcrumb
|
5
|
+
width: 100%
|
6
|
+
background: $breadcrumb-bg
|
7
|
+
margin-bottom: 0px
|
8
|
+
padding: 6px 15px 7px
|
9
|
+
+border-radius(0)
|
10
|
+
li
|
11
|
+
font-size: 11px
|
12
|
+
line-height: 12px
|
13
|
+
color: $breadcrumb-color
|
14
|
+
text-decoration: none
|
15
|
+
a
|
16
|
+
font-size: 11px
|
17
|
+
line-height: 12px
|
18
|
+
color: $breadcrumb-color
|
19
|
+
text-decoration: none
|
20
|
+
&:hover
|
21
|
+
color: $breadcrumb-active-color
|
22
|
+
&:hover, &:last-child
|
23
|
+
color: $breadcrumb-active-color
|
24
|
+
> li + li:before
|
25
|
+
font-family: FontAwesome
|
26
|
+
content: "\f105"
|
27
|
+
color: $breadcrumb-color
|
28
|
+
padding: 0 8px
|
29
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
@import 'variables'
|
2
|
+
@import "compass/css3/border-radius"
|
3
|
+
|
4
|
+
.btn
|
5
|
+
.fa, .glyphicon
|
6
|
+
font-size: 14px
|
7
|
+
margin-right: 3px
|
8
|
+
|
9
|
+
// Social network color
|
10
|
+
&.btn-twitter
|
11
|
+
background: #1AB2E8
|
12
|
+
border-color: #1AB2E8
|
13
|
+
&.active, &:active, &:focus, &:hover
|
14
|
+
background: #15a1d3
|
15
|
+
&.btn-facebook
|
16
|
+
background: #3C599B
|
17
|
+
border-color: #3C599B
|
18
|
+
&.active, &:active, &:focus, &:hover
|
19
|
+
background: #354e89
|
20
|
+
&.btn-google
|
21
|
+
background: #E04A39
|
22
|
+
border-color: #E04A39
|
23
|
+
&.active, &:active, &:focus, &:hover
|
24
|
+
background: #dd3623
|
@@ -0,0 +1,107 @@
|
|
1
|
+
@import 'variables'
|
2
|
+
@import "compass/css3/inline-block"
|
3
|
+
|
4
|
+
@mixin fontAwesome
|
5
|
+
font-family: FontAwesome
|
6
|
+
font-weight: normal
|
7
|
+
font-style: normal
|
8
|
+
text-decoration: inherit
|
9
|
+
-webkit-font-smoothing: antialiased
|
10
|
+
/* sprites.less reset */
|
11
|
+
+inline-block
|
12
|
+
width: auto
|
13
|
+
height: auto
|
14
|
+
line-height: normal
|
15
|
+
vertical-align: baseline
|
16
|
+
background-image: none
|
17
|
+
background-position: 0% 0%
|
18
|
+
background-repeat: repeat
|
19
|
+
margin-top: 0
|
20
|
+
|
21
|
+
// ------------------------ Radio & Checkbox ------------------------- //
|
22
|
+
.radio label,
|
23
|
+
.checkbox label
|
24
|
+
padding-left: 0
|
25
|
+
font-weight: 600
|
26
|
+
i
|
27
|
+
font-size: 20px
|
28
|
+
margin-left: 20px
|
29
|
+
float: right
|
30
|
+
line-height: 1
|
31
|
+
|
32
|
+
.form-group.boolean
|
33
|
+
[class^="col-"] label
|
34
|
+
margin-bottom: 0
|
35
|
+
padding-top: 2px
|
36
|
+
i
|
37
|
+
font-size: 20px
|
38
|
+
line-height: 1
|
39
|
+
|
40
|
+
.form-group.boolean input[type=checkbox],
|
41
|
+
.form-group.boolean input[type=radio],
|
42
|
+
.checkbox input[type=checkbox],
|
43
|
+
.radio input[type=radio]
|
44
|
+
position: absolute
|
45
|
+
overflow: hidden
|
46
|
+
clip: rect(0 0 0 0)
|
47
|
+
height: 1px
|
48
|
+
width: 1px
|
49
|
+
margin: -1px
|
50
|
+
padding: 0
|
51
|
+
border: 0
|
52
|
+
|
53
|
+
input[type=checkbox]:checked + label.check_boxes:before,
|
54
|
+
input[type=checkbox]:checked + .checkbox-icon:before
|
55
|
+
content: "\f046"
|
56
|
+
|
57
|
+
input[type=checkbox]:focus + label.check_boxes:before,
|
58
|
+
input[type=checkbox]:focus + .checkbox-icon:before
|
59
|
+
color: $input-border-focus
|
60
|
+
|
61
|
+
.boolean .checkbox-icon,
|
62
|
+
.checkbox .checkbox-icon
|
63
|
+
&:hover
|
64
|
+
&:before
|
65
|
+
color: $input-border-focus
|
66
|
+
&:before
|
67
|
+
+fontAwesome
|
68
|
+
content: "\f096"
|
69
|
+
color: $input-border
|
70
|
+
|
71
|
+
input[type=radio]:checked + label.radio_buttons:before,
|
72
|
+
input[type=radio]:checked + .radio-icon:before
|
73
|
+
content: "\f192"
|
74
|
+
|
75
|
+
input[type=radio]:focus + label.radio_buttons:before,
|
76
|
+
input[type=radio]:focus + .radio-icon:before
|
77
|
+
color: $input-border-focus
|
78
|
+
|
79
|
+
.boolean .radio-icon,
|
80
|
+
.radio .radio-icon
|
81
|
+
&:hover
|
82
|
+
&:before
|
83
|
+
color: $input-border-focus
|
84
|
+
&:before
|
85
|
+
+fontAwesome
|
86
|
+
content: "\f10c"
|
87
|
+
color: $input-border
|
88
|
+
|
89
|
+
// INLINE OVERRIDE //
|
90
|
+
.radio-inline,
|
91
|
+
.checkbox-inline
|
92
|
+
padding-left: 0
|
93
|
+
label.form-control
|
94
|
+
height: auto
|
95
|
+
margin-bottom: 5px
|
96
|
+
padding: 0
|
97
|
+
color: black
|
98
|
+
font-weight: normal
|
99
|
+
border: none
|
100
|
+
background-color: transparent
|
101
|
+
background: none
|
102
|
+
+inline-block
|
103
|
+
&:hover
|
104
|
+
cursor: pointer
|
105
|
+
&:before
|
106
|
+
display: inline-block
|
107
|
+
width: 20px
|