para 0.6.9 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/images/para/admin/tangram-mosaic.png +0 -0
- data/app/assets/images/para/admin/template-section.svg +23 -0
- data/app/assets/javascripts/para/admin.coffee +20 -0
- data/app/assets/javascripts/para/admin/tabs.coffee +22 -5
- data/app/assets/javascripts/para/admin/theme_actions.coffee +3 -3
- data/app/assets/javascripts/para/inputs/material-input.coffee +4 -0
- data/app/assets/javascripts/para/inputs/multi-select-input.coffee +173 -0
- data/app/assets/javascripts/para/inputs/nested_many.coffee +9 -9
- data/app/assets/stylesheets/para/admin.sass +5 -5
- data/app/assets/stylesheets/para/admin/main.sass +32 -0
- data/app/assets/stylesheets/para/admin/src/_alert.sass +17 -0
- data/app/assets/stylesheets/para/admin/src/_base.sass +51 -0
- data/app/assets/stylesheets/para/admin/src/_bootstrap-variables.scss +874 -0
- data/app/assets/stylesheets/para/admin/src/_breadcrumb.sass +22 -0
- data/app/assets/stylesheets/para/admin/src/_buttons.sass +107 -0
- data/app/assets/stylesheets/para/admin/src/_checkable.sass +94 -0
- data/app/assets/stylesheets/para/admin/src/_common.sass +203 -0
- data/app/assets/stylesheets/para/admin/src/_dropdown.sass +40 -0
- data/app/assets/stylesheets/para/admin/src/_form.sass +271 -0
- data/app/assets/stylesheets/para/admin/src/_list.sass +61 -0
- data/app/assets/stylesheets/para/admin/src/_mixins.sass +113 -0
- data/app/assets/stylesheets/para/admin/src/_multi-select.sass +91 -0
- data/app/assets/stylesheets/para/admin/src/_navigation.sass +150 -0
- data/app/assets/stylesheets/para/admin/src/_navtabs.sass +41 -0
- data/app/assets/stylesheets/para/admin/src/_nested-many.sass +69 -0
- data/app/assets/stylesheets/para/admin/src/_nested_one.sass +13 -0
- data/app/assets/stylesheets/para/admin/src/_orderable.sass +44 -0
- data/app/assets/stylesheets/para/admin/src/_page-loading.sass +39 -0
- data/app/assets/stylesheets/para/admin/src/_pagination.sass +34 -0
- data/app/assets/stylesheets/para/admin/src/_panel.sass +55 -0
- data/app/assets/stylesheets/para/admin/src/_responsive.sass +100 -0
- data/app/assets/stylesheets/para/admin/{theme → src}/_sorting.sass +11 -3
- data/app/assets/stylesheets/para/admin/src/_statcard.sass +41 -0
- data/app/assets/stylesheets/para/admin/src/_table.sass +33 -0
- data/app/assets/stylesheets/para/admin/src/_tree.sass +52 -0
- data/app/assets/stylesheets/para/admin/src/_variables.sass +37 -0
- data/app/assets/stylesheets/para/admin/src/_well.sass +12 -0
- data/app/assets/stylesheets/para/{admin/src → lib}/datetimepicker.sass +1 -3
- data/app/assets/stylesheets/para/{admin/src → lib}/fuelux.sass +3 -5
- data/app/assets/stylesheets/para/lib/jasny-bootstrap.sass +97 -0
- data/app/assets/stylesheets/para/{admin/src → lib}/redactor.sass +2 -5
- data/app/assets/stylesheets/para/lib/selectize.sass +112 -0
- data/app/assets/stylesheets/para/lib/slider.sass +12 -0
- data/app/controllers/concerns/para/admin/resource_controller_concerns.rb +14 -2
- data/app/controllers/para/admin/base_controller.rb +7 -0
- data/app/controllers/para/admin/crud_resources_controller.rb +13 -6
- data/app/controllers/para/admin/form_resources_controller.rb +5 -3
- data/app/controllers/para/admin/resources_controller.rb +9 -3
- data/app/controllers/para/admin/search_controller.rb +15 -0
- data/app/controllers/para/application_controller.rb +10 -2
- data/app/helpers/para/admin/page_helper.rb +9 -9
- data/app/helpers/para/application_helper.rb +1 -10
- data/app/helpers/para/form_helper.rb +5 -6
- data/app/helpers/para/model_helper.rb +13 -3
- data/app/helpers/para/ordering_helper.rb +1 -1
- data/app/helpers/para/search_results_helper.rb +16 -0
- data/app/helpers/para/tree_helper.rb +10 -6
- data/app/models/para/page.rb +5 -0
- data/app/models/para/page/section.rb +42 -0
- data/app/models/para/page/section_resource.rb +12 -0
- data/app/views/layouts/para/admin.html.haml +5 -8
- data/app/views/para/admin/dashboard.html.haml +21 -8
- data/app/views/para/admin/form_resources/show.html.haml +1 -1
- data/app/views/para/admin/imports/new.html.haml +2 -2
- data/app/views/para/admin/resources/_actions.html.haml +3 -3
- data/app/views/para/admin/resources/_add_button.html.haml +1 -1
- data/app/views/para/admin/resources/_exports_menu.html.haml +6 -6
- data/app/views/para/admin/resources/_filters.html.haml +7 -8
- data/app/views/para/admin/resources/_imports_menu.html.haml +6 -6
- data/app/views/para/admin/resources/_list.html.haml +14 -15
- data/app/views/para/admin/resources/_per_page_select.html.haml +4 -3
- data/app/views/para/admin/resources/_subclassable_add_button.html.haml +3 -3
- data/app/views/para/admin/resources/_tree.html.haml +7 -9
- data/app/views/para/admin/resources/_tree_item.html.haml +5 -6
- data/app/views/para/admin/resources/edit.html.haml +1 -1
- data/app/views/para/admin/resources/new.html.haml +1 -1
- data/app/views/para/admin/search/_result.html.haml +7 -0
- data/app/views/para/admin/search/index.html.haml +1 -0
- data/app/views/para/admin/settings_component/show.html.haml +1 -1
- data/app/views/para/admin/shared/_breadcrumbs.html.haml +2 -3
- data/app/views/para/admin/shared/_header.html.haml +16 -27
- data/app/views/para/admin/shared/_navigation.html.haml +20 -19
- data/app/views/para/form/_tabs.html.haml +6 -7
- data/app/views/para/inputs/_multi_select.html.haml +40 -0
- data/app/views/para/inputs/_nested_many.html.haml +4 -4
- data/app/views/para/inputs/multi_select/_no_items.html.haml +6 -0
- data/app/views/para/inputs/nested_many/_add.html.haml +1 -2
- data/app/views/para/inputs/nested_many/_add_with_subclasses.html.haml +4 -5
- data/app/views/para/inputs/nested_many/_container.html.haml +7 -8
- data/app/views/shared/_breadcrumbs.html.haml +4 -0
- data/config/locales/fr.yml +29 -4
- data/db/migrate/20170324125547_create_para_page_section_resources.rb +15 -0
- data/lib/generators/para/filters/templates/_filters.html.haml +3 -5
- data/lib/generators/para/install/templates/initializer.rb +12 -0
- data/lib/generators/para/page/section/section_generator.rb +13 -2
- data/lib/generators/para/page/section/templates/section.html.haml.erb +3 -0
- data/lib/generators/para/resource/resource_generator.rb +1 -1
- data/lib/para.rb +25 -21
- data/lib/para/attribute_field.rb +2 -0
- data/lib/para/attribute_field/base.rb +1 -1
- data/lib/para/attribute_field/belongs_to.rb +1 -1
- data/lib/para/attribute_field/boolean.rb +1 -1
- data/lib/para/attribute_field/friendly_id.rb +19 -0
- data/lib/para/attribute_field/has_many.rb +43 -4
- data/lib/para/attribute_field/nested_field.rb +46 -0
- data/lib/para/attribute_field/nested_many.rb +30 -9
- data/lib/para/attribute_field/nested_one.rb +28 -9
- data/lib/para/attribute_field/password.rb +1 -1
- data/lib/para/attribute_field/relation.rb +19 -1
- data/lib/para/attribute_field_mappings.rb +9 -3
- data/lib/para/breadcrumbs/breadcrumb.rb +57 -10
- data/lib/para/breadcrumbs/controller.rb +19 -6
- data/lib/para/breadcrumbs/manager.rb +9 -1
- data/lib/para/config.rb +3 -0
- data/lib/para/controller_resource.rb +34 -0
- data/lib/para/engine.rb +33 -14
- data/lib/para/exporter/base.rb +1 -1
- data/lib/para/ext.rb +1 -1
- data/lib/para/ext/active_record_nested_attributes.rb +51 -0
- data/lib/para/ext/paperclip.rb +2 -6
- data/lib/para/form_builder.rb +3 -0
- data/lib/para/form_builder/attributes_mappings_tracker.rb +45 -0
- data/lib/para/form_builder/containers.rb +13 -17
- data/lib/para/form_builder/nested_form.rb +2 -3
- data/lib/para/helpers.rb +8 -0
- data/lib/para/helpers/attributes_mappings.rb +13 -0
- data/lib/para/helpers/resource_name.rb +14 -0
- data/lib/para/inputs.rb +1 -0
- data/lib/para/inputs/multi_select_input.rb +90 -0
- data/lib/para/inputs/nested_many_input.rb +6 -1
- data/lib/para/markup/resources_table.rb +15 -11
- data/lib/para/model_field_parsers.rb +3 -2
- data/lib/para/model_field_parsers/base.rb +7 -2
- data/lib/para/model_field_parsers/friendly_id.rb +19 -0
- data/lib/para/model_field_parsers/relations.rb +20 -1
- data/lib/para/page/model.rb +3 -1
- data/lib/para/routes.rb +1 -0
- data/lib/para/simple_form_config.rb +85 -0
- data/lib/para/version.rb +1 -1
- data/lib/rails/routing_mapper.rb +5 -8
- data/vendor/assets/javascripts/jasny-bootstrap.js +577 -0
- data/vendor/assets/stylesheets/animate.css +3340 -0
- data/vendor/assets/stylesheets/hint.css +649 -0
- data/vendor/assets/stylesheets/jasny-bootstrap.css +287 -0
- metadata +114 -67
- data/app/assets/images/para/admin/bg.png +0 -0
- data/app/assets/javascripts/para/admin.js +0 -20
- data/app/assets/stylesheets/admin/theme.sass +0 -0
- data/app/assets/stylesheets/para/admin/src/jasny.bootstrap.sass +0 -40
- data/app/assets/stylesheets/para/admin/src/nested_many.sass +0 -5
- data/app/assets/stylesheets/para/admin/src/page-loading.sass +0 -24
- data/app/assets/stylesheets/para/admin/src/page-top-bar.sass +0 -9
- data/app/assets/stylesheets/para/admin/src/selectize.sass +0 -46
- data/app/assets/stylesheets/para/admin/src/slider.sass +0 -12
- data/app/assets/stylesheets/para/admin/theme.sass +0 -22
- data/app/assets/stylesheets/para/admin/theme/_base.sass +0 -176
- data/app/assets/stylesheets/para/admin/theme/_breadcrumb.sass +0 -75
- data/app/assets/stylesheets/para/admin/theme/_buttons.sass +0 -27
- data/app/assets/stylesheets/para/admin/theme/_checkable.sass +0 -108
- data/app/assets/stylesheets/para/admin/theme/_commonds.sass +0 -210
- data/app/assets/stylesheets/para/admin/theme/_dropdown.sass +0 -52
- data/app/assets/stylesheets/para/admin/theme/_form.sass +0 -150
- data/app/assets/stylesheets/para/admin/theme/_list.sass +0 -139
- data/app/assets/stylesheets/para/admin/theme/_navigation.sass +0 -229
- data/app/assets/stylesheets/para/admin/theme/_navtabs.sass +0 -151
- data/app/assets/stylesheets/para/admin/theme/_orderable.sass +0 -45
- data/app/assets/stylesheets/para/admin/theme/_panel.sass +0 -264
- data/app/assets/stylesheets/para/admin/theme/_responsive.sass +0 -123
- data/app/assets/stylesheets/para/admin/theme/_table.sass +0 -28
- data/app/assets/stylesheets/para/admin/theme/_tree.sass +0 -74
- data/app/assets/stylesheets/para/admin/theme/_variables.sass +0 -31
- data/app/assets/stylesheets/para/application.css +0 -15
- data/app/assets/stylesheets/para/lib/_variables.scss +0 -646
- data/app/assets/stylesheets/para/overrides/responsive.sass +0 -62
- data/app/assets/stylesheets/para/overrides/theme.sass +0 -172
- data/lib/para/ext/cancan.rb +0 -26
- data/vendor/assets/javascripts/jasny.bootstrap.min.js +0 -7
- data/vendor/assets/stylesheets/animate.min.css +0 -6
- data/vendor/assets/stylesheets/jasny.bootstrap.min.css +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f89735619264be8599e3ccccfccdb64d07aa219c
|
4
|
+
data.tar.gz: 7aea1f82a1e545b142dc4abcca505de107a3d94d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cc137eb9e0185c8a7fac27b9ddb830981bcfa0e7b1951153beed16f4cc289efd3c5b6f467ee793cf9920aa02e9ed407f677b494fffa04fb60cff7ea85d69cfe6
|
7
|
+
data.tar.gz: 7d2b0d6a005b9a2770bf28a459fe34c8ca4cddd8276cb58f3df99923131a96f24e99903850d8867de76778b3a771ced22ed49b6bc95f4c4062768d360880a55b
|
Binary file
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
2
|
+
<svg width="248px" height="152px" viewBox="0 0 248 152" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
3
|
+
<!-- Generator: Sketch 43 (38999) - http://www.bohemiancoding.com/sketch -->
|
4
|
+
<title>Circle with Text Centered</title>
|
5
|
+
<desc>Created with Sketch.</desc>
|
6
|
+
<defs></defs>
|
7
|
+
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" opacity="0.0799999982">
|
8
|
+
<g id="Section" transform="translate(-23.000000, -8.000000)">
|
9
|
+
<g id="Circle-with-Text-Centered">
|
10
|
+
<g transform="translate(23.000000, 8.000000)">
|
11
|
+
<g id="Circle-Image" transform="translate(97.000000, 0.000000)">
|
12
|
+
<path d="M54.1791045,27.0906486 C54.1791045,42.0513524 42.0513524,54.1791045 27.0906486,54.1791045 C12.1277521,54.1791045 0,42.0513524 0,27.0906486 C0,12.1299448 12.1277521,0 27.0906486,0 C42.0513524,0 54.1791045,12.1299448 54.1791045,27.0906486" id="Fill-1195" fill="#6C7A8C"></path>
|
13
|
+
<path d="M43.9738349,32.7029625 L33.369052,19.4754572 C32.730731,18.6805036 31.5254945,18.6826756 30.8915012,19.4798012 L25.5772088,26.1456819 C25.034095,26.8276912 24.0452385,26.9449795 23.359314,26.4063224 L21.208497,24.7208472 C20.5853226,24.2321463 19.6960009,24.2777584 19.1269215,24.8316194 L11.1598105,32.5574382 C10.1320056,33.5522161 10.8352406,35.2985075 12.2633485,35.2985075 L42.7361414,35.2985075 C44.0712059,35.2985075 44.8112255,33.7476965 43.9738349,32.7029625" id="Fill-1196" fill="#B3C0C5"></path>
|
14
|
+
<path d="M12.3134328,18.8794297 C12.3134328,20.6933958 13.6003682,22.1641791 15.1875885,22.1641791 C16.7727661,22.1641791 18.0597015,20.6933958 18.0597015,18.8794297 C18.0597015,17.0654637 16.7727661,15.5970149 15.1875885,15.5970149 C13.6003682,15.5970149 12.3134328,17.0654637 12.3134328,18.8794297" id="Fill-1197" fill="#B3C0C5"></path>
|
15
|
+
</g>
|
16
|
+
<path d="M245.247179,136 L2.75282063,136 C1.54052422,136 0.828262225,135.402475 0.828262225,135 L0.828262225,126 C0.828262225,125.595003 1.5375189,125 2.75282063,125 L245.247179,125 C246.459476,125 247.171738,125.597525 247.171738,126 L247.171738,135 C247.171738,135.402475 246.459476,136 245.247179,136" id="Fill-1198" fill="#B3C0C5"></path>
|
17
|
+
<path d="M226.963875,152 L18.1492878,152 C16.9361399,152 16.2247294,151.402612 16.2247294,151 L16.2247294,142 C16.2247294,141.594867 16.9331382,141 18.1492878,141 L226.963875,141 C228.177022,141 228.888433,141.597388 228.888433,142 L228.888433,151 C228.888433,151.402612 228.177022,152 226.963875,152" id="Fill-1199" fill="#B3C0C5"></path>
|
18
|
+
<path d="M223.114758,120 L21.9984047,120 C20.8850909,120 20.0738463,119.308911 20.0738463,118 L20.0738463,106 C20.0738463,104.68853 20.8820863,104 21.9984047,104 L223.114758,104 C224.228071,104 225.039316,104.691089 225.039316,106 L225.039316,118 C225.039316,119.308911 224.228071,120 223.114758,120" id="Fill-1200" fill="#6C7A8C"></path>
|
19
|
+
</g>
|
20
|
+
</g>
|
21
|
+
</g>
|
22
|
+
</g>
|
23
|
+
</svg>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
#= require jquery
|
2
|
+
#= require jquery_ujs
|
3
|
+
#= require turbolinks
|
4
|
+
#= require bootstrap
|
5
|
+
#= require vertebra
|
6
|
+
#= require jasny-bootstrap
|
7
|
+
#= require simple_form_extension
|
8
|
+
#= require jquery.scrollto
|
9
|
+
#= require html5-sortable
|
10
|
+
#= require cocoon
|
11
|
+
#= require jquery.remote-modal-form
|
12
|
+
#= require_self
|
13
|
+
#= require_tree ./lib
|
14
|
+
#= require_tree ./inputs
|
15
|
+
#= require_tree ./admin
|
16
|
+
#= require ./plugins-includes
|
17
|
+
#= require admin/app
|
18
|
+
|
19
|
+
# Initialize scope
|
20
|
+
window.Para = {}
|
@@ -4,23 +4,40 @@
|
|
4
4
|
class Para.Tabs extends Vertebra.View
|
5
5
|
events:
|
6
6
|
'shown.bs.tab a[data-toggle="tab"]': 'onTabShown'
|
7
|
+
'change .tab-pane': 'onFormInputUpdate'
|
7
8
|
|
8
9
|
initialize: (options = {}) ->
|
9
10
|
@$anchorInput = options.$anchorInput
|
10
11
|
@showActiveTab()
|
12
|
+
@refreshTabsErrors()
|
11
13
|
|
12
14
|
showActiveTab: ->
|
13
|
-
if (hash = location.hash or @$anchorInput?.val())
|
14
|
-
|
15
|
+
if (hash = (location.hash or @$anchorInput?.val()))
|
16
|
+
@findTab(hash).tab('show')
|
15
17
|
|
16
18
|
onTabShown: (e) =>
|
17
|
-
tabHash = $(e.target).attr('href')
|
18
|
-
history.pushState(null, null,
|
19
|
-
@updateAnchorInput(
|
19
|
+
tabHash = $(e.target).attr('href')
|
20
|
+
history.pushState(null, null, tabHash)
|
21
|
+
@updateAnchorInput()
|
20
22
|
|
21
23
|
updateAnchorInput: ->
|
22
24
|
@$anchorInput.val(location.hash) if @$anchorInput.length
|
23
25
|
|
26
|
+
refreshTabsErrors: ->
|
27
|
+
@$('[data-toggle="tab"]').each (i, tab) =>
|
28
|
+
@refreshTabErrors($(tab))
|
29
|
+
|
30
|
+
refreshTabErrors: ($tab) ->
|
31
|
+
$panel = @$($tab.attr('href'))
|
32
|
+
$tab.addClass('has-error') if $panel.find('.has-error').length
|
33
|
+
|
34
|
+
onFormInputUpdate: (e) ->
|
35
|
+
$tab = @findTab($(e.currentTarget).attr('id'))
|
36
|
+
@refreshTabErrors($tab)
|
37
|
+
|
38
|
+
findTab: (id) ->
|
39
|
+
id = id.replace(/^\#/, '')
|
40
|
+
@$('a[href="' + id + '"]')
|
24
41
|
|
25
42
|
$(document).on 'page:change turbolinks:load', ->
|
26
43
|
$('[data-form-tabs]').each (i, el) ->
|
@@ -1,7 +1,7 @@
|
|
1
1
|
scrollToComponentSection = ($component, duration = 0) ->
|
2
|
-
sectionOffset = $component.closest('.component-section-item').offset().top + $('.
|
3
|
-
headerHeight = $('.
|
4
|
-
$('.
|
2
|
+
sectionOffset = $component.closest('.component-section-item').offset().top + $('.navmenu').scrollTop()
|
3
|
+
headerHeight = $('.navmenu .navmenu-brand').outerHeight()
|
4
|
+
$('.navmenu-nav').scrollTo(sectionOffset - headerHeight, duration: duration)
|
5
5
|
|
6
6
|
responsive_sidebar_navigation = ->
|
7
7
|
# Scroll to active element's section on page change
|
@@ -0,0 +1,173 @@
|
|
1
|
+
class Para.MultiSelectInput extends Vertebra.View
|
2
|
+
events:
|
3
|
+
'keyup [data-search-field]': 'onSearchKeyUp'
|
4
|
+
'click [data-add-all]': 'onAllItemsAdded'
|
5
|
+
'click [data-remove-all]': 'onAllItemsRemoved'
|
6
|
+
|
7
|
+
initialize: ->
|
8
|
+
@$searchField = @$('[data-search-field]')
|
9
|
+
@$selectedItems = @$('[data-selected-items] tbody')
|
10
|
+
@$availableItems = @$('[data-available-items]')
|
11
|
+
@$input = @$('[data-multi-select-input-field]')
|
12
|
+
|
13
|
+
@searchURL = @$el.data('search-url')
|
14
|
+
@orderable = @$el.is('[data-orderable]')
|
15
|
+
|
16
|
+
@noSelectedItemsTemplate = @$('[data-no-selected-items]').data('no-selected-items')
|
17
|
+
@noAvailableItemsTemplate = @$('[data-no-available-items]').data('no-available-items')
|
18
|
+
|
19
|
+
@throttledTriggerSearch = throttle(@triggerSearch, 300, trailing: true)
|
20
|
+
|
21
|
+
@availableItems = []
|
22
|
+
@selectedItems = (@buildSelectedItem(el) for el in @$selectedItems.find('[data-selected-item-id]'))
|
23
|
+
@refreshSelectedItems()
|
24
|
+
@refreshAvailableItems()
|
25
|
+
|
26
|
+
onSearchKeyUp: ->
|
27
|
+
@throttledTriggerSearch()
|
28
|
+
|
29
|
+
triggerSearch: =>
|
30
|
+
@searchFor(@$searchField.val())
|
31
|
+
|
32
|
+
searchFor: (terms) ->
|
33
|
+
terms = trim(terms)
|
34
|
+
return if terms is @terms
|
35
|
+
@terms = terms
|
36
|
+
@setLoading(true)
|
37
|
+
@_currentSearchXHR?.abort()
|
38
|
+
@_currentSearchXHR = $.get(@searchURL, search: terms).done(@onSearchReturn)
|
39
|
+
|
40
|
+
onSearchReturn: (results, b, c) =>
|
41
|
+
@_currentSearchXHR = null
|
42
|
+
@setLoading(false)
|
43
|
+
@$('[data-available-items] tbody').html(results)
|
44
|
+
@refreshAvailableItems()
|
45
|
+
|
46
|
+
refreshAvailableItems: ->
|
47
|
+
item.destroy() for item in @availableItems
|
48
|
+
@availableItems = (@buildAvailableItem(el) for el in @$('[data-available-items] tr'))
|
49
|
+
@showEmptyListHint(@noAvailableItemsTemplate, @$availableItems) unless @availableItems.length
|
50
|
+
|
51
|
+
buildAvailableItem: (el) ->
|
52
|
+
availableItem = new Para.MultiSelectAvailableItem(el: el)
|
53
|
+
availableItem.setSelected(true) for selectedItem in @selectedItems when selectedItem.id is availableItem.id
|
54
|
+
@listenTo(availableItem, 'add', @onItemAdded)
|
55
|
+
availableItem
|
56
|
+
|
57
|
+
onItemAdded: (item) =>
|
58
|
+
@selectItem(item)
|
59
|
+
|
60
|
+
buildSelectedItem: (el) ->
|
61
|
+
selectedItem = new Para.MultiSelectSelectedItem(el: el)
|
62
|
+
@listenTo(selectedItem, 'remove', @onItemRemoved)
|
63
|
+
selectedItem
|
64
|
+
|
65
|
+
selectItem: (item) ->
|
66
|
+
return if @alreadySelected(item)
|
67
|
+
|
68
|
+
item.setSelected(true)
|
69
|
+
selectedItem = @buildSelectedItem(item.$el.attr('data-selected-item-template'))
|
70
|
+
@selectedItems.push(selectedItem)
|
71
|
+
@refreshSelectedItems()
|
72
|
+
|
73
|
+
alreadySelected: (item) ->
|
74
|
+
return true for selectedItem in @selectedItems when selectedItem.id is item.id
|
75
|
+
false
|
76
|
+
|
77
|
+
refreshSelectedItems: ->
|
78
|
+
@$selectedItems.empty()
|
79
|
+
selectedItem.renderTo(@$selectedItems) for selectedItem in @selectedItems
|
80
|
+
|
81
|
+
selectedItemIds = (selectedItem.id for selectedItem in @selectedItems).join(', ')
|
82
|
+
@$input.val(selectedItemIds)
|
83
|
+
|
84
|
+
if @selectedItems.length
|
85
|
+
@initializeOrderable()
|
86
|
+
else
|
87
|
+
@showEmptyListHint(@noSelectedItemsTemplate, @$selectedItems)
|
88
|
+
|
89
|
+
showEmptyListHint: (template, $container) ->
|
90
|
+
$(template).appendTo($container)
|
91
|
+
|
92
|
+
onItemRemoved: (selectedItem) =>
|
93
|
+
itemIndex = index for item, index in @selectedItems when item.id is selectedItem.id
|
94
|
+
@selectedItems.splice(itemIndex, 1)
|
95
|
+
selectedItem.destroy()
|
96
|
+
@refreshSelectedItems()
|
97
|
+
|
98
|
+
availableItem = item for item in @availableItems when item.id is selectedItem.id
|
99
|
+
availableItem.setSelected(false) if availableItem
|
100
|
+
|
101
|
+
onAllItemsAdded: ->
|
102
|
+
return unless @availableItems.length
|
103
|
+
|
104
|
+
@selectItem(availableItem) for availableItem in @availableItems
|
105
|
+
|
106
|
+
onAllItemsRemoved: ->
|
107
|
+
return unless @selectedItems.length
|
108
|
+
|
109
|
+
@selectedItems = []
|
110
|
+
@refreshSelectedItems()
|
111
|
+
|
112
|
+
item.setSelected(false) for item in @availableItems
|
113
|
+
|
114
|
+
initializeOrderable: ->
|
115
|
+
return unless @orderable
|
116
|
+
|
117
|
+
columnsCount = @$selectedItems.find('> tr > td').length
|
118
|
+
|
119
|
+
@$selectedItems.sortable('destroy')
|
120
|
+
|
121
|
+
@$selectedItems.sortable
|
122
|
+
handle: '.order-anchor'
|
123
|
+
forcePlaceholderSize: true
|
124
|
+
placeholder: "<tr><td colspan='#{ columnsCount }'></td></tr>"
|
125
|
+
|
126
|
+
@$selectedItems.on('sortupdate', @selectedItemsSorted)
|
127
|
+
|
128
|
+
selectedItemsSorted: =>
|
129
|
+
indices = {}
|
130
|
+
indices[$(el).data('selected-item-id')] = index for el, index in @$selectedItems.find('[data-selected-item-id]')
|
131
|
+
|
132
|
+
@selectedItems.sort (a, b) =>
|
133
|
+
aIndex = indices[a.id]
|
134
|
+
bIndex = indices[b.id]
|
135
|
+
if aIndex > bIndex then 1 else -1
|
136
|
+
|
137
|
+
@refreshSelectedItems()
|
138
|
+
|
139
|
+
setLoading: (state) ->
|
140
|
+
@$el.toggleClass('loading', state)
|
141
|
+
@$('.fa-search').toggleClass('fa-spin', state)
|
142
|
+
|
143
|
+
class Para.MultiSelectAvailableItem extends Vertebra.View
|
144
|
+
events:
|
145
|
+
'click [data-add-item]': 'addItem'
|
146
|
+
|
147
|
+
initialize: ->
|
148
|
+
@id = @$el.data('available-item-id')
|
149
|
+
|
150
|
+
addItem: ->
|
151
|
+
@trigger('add', this)
|
152
|
+
|
153
|
+
setSelected: (@selected) ->
|
154
|
+
@$el.toggleClass('selected', @selected)
|
155
|
+
|
156
|
+
|
157
|
+
class Para.MultiSelectSelectedItem extends Vertebra.View
|
158
|
+
initialize: ->
|
159
|
+
@id = @$el.data('selected-item-id')
|
160
|
+
|
161
|
+
bindEvents: ->
|
162
|
+
@$('[data-remove-item]').on 'click', @removeItem
|
163
|
+
|
164
|
+
renderTo: ($container) ->
|
165
|
+
@$el.appendTo($container)
|
166
|
+
@bindEvents()
|
167
|
+
|
168
|
+
removeItem: (e) =>
|
169
|
+
@trigger('remove', this)
|
170
|
+
|
171
|
+
|
172
|
+
$.simpleForm.onDomReady ($document) ->
|
173
|
+
$document.find('[data-multi-select-input]').each (i, el) -> new Para.MultiSelectInput(el: el)
|
@@ -23,6 +23,7 @@ class Para.NestedManyField
|
|
23
23
|
|
24
24
|
initializeCocoon: ->
|
25
25
|
@$fieldsList.on 'cocoon:after-insert', $.proxy(@afterInsertField, this)
|
26
|
+
@$fieldsList.on 'cocoon:before-remove', $.proxy(@beforeRemoveField, this)
|
26
27
|
|
27
28
|
afterInsertField: (e, $element) ->
|
28
29
|
if ($collapsible = $element.find('[data-open-on-insert="true"]')).length
|
@@ -33,14 +34,13 @@ class Para.NestedManyField
|
|
33
34
|
@initializeOrderable()
|
34
35
|
@sortUpdate()
|
35
36
|
|
36
|
-
|
37
|
-
$redactor.simpleFormRedactor()
|
37
|
+
$element.simpleForm()
|
38
38
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
39
|
+
beforeRemoveField: (e, $element) ->
|
40
|
+
$nextEl = $element.next()
|
41
|
+
# Remove attributes mappings field for new records since it will try to
|
42
|
+
# create an empty nested resource otherwise
|
43
|
+
$nextEl.remove() if $nextEl.is('[data-attributes-mappings]') and not $element.is('[data-persisted]')
|
44
44
|
|
45
45
|
openInsertedField: ($field) ->
|
46
46
|
$target = $($field.attr('href'))
|
@@ -54,5 +54,5 @@ class Para.NestedManyField
|
|
54
54
|
$target.find('input, textarea, select').eq('0').focus()
|
55
55
|
|
56
56
|
|
57
|
-
$
|
58
|
-
$('.nested-many-field').each (i, el) -> new Para.NestedManyField($(el))
|
57
|
+
$.simpleForm.onDomReady ($document) ->
|
58
|
+
$document.find('.nested-many-field').each (i, el) -> new Para.NestedManyField($(el))
|
@@ -1,12 +1,12 @@
|
|
1
1
|
//= require_self
|
2
|
-
//= require animate
|
2
|
+
//= require animate
|
3
|
+
//= require hint
|
3
4
|
//= require font-awesome
|
4
|
-
//= require jasny
|
5
|
+
//= require jasny-bootstrap
|
5
6
|
//= require simple_form_extension
|
6
7
|
//= require selectize
|
7
8
|
//= require selectize.bootstrap3
|
8
|
-
//=
|
9
|
-
//=
|
10
|
-
//= require_tree ./admin/src
|
9
|
+
//= require_tree ./lib
|
10
|
+
//= require ./admin/main
|
11
11
|
//= require ./plugins-includes
|
12
12
|
//= require admin/app
|
@@ -0,0 +1,32 @@
|
|
1
|
+
@charset "UTF-8"
|
2
|
+
//** Import google font
|
3
|
+
@import url('//fonts.googleapis.com/css?family=Roboto:300,400,500,700,900')
|
4
|
+
|
5
|
+
@import "src/variables"
|
6
|
+
@import "bootstrap"
|
7
|
+
|
8
|
+
@import "src/mixins"
|
9
|
+
@import "src/common"
|
10
|
+
@import "src/base"
|
11
|
+
@import "src/buttons"
|
12
|
+
@import "src/form"
|
13
|
+
@import "src/nested_one"
|
14
|
+
@import "src/table"
|
15
|
+
@import "src/list"
|
16
|
+
@import "src/panel"
|
17
|
+
@import "src/alert"
|
18
|
+
@import "src/dropdown"
|
19
|
+
@import "src/multi-select"
|
20
|
+
@import "src/nested-many"
|
21
|
+
@import "src/checkable"
|
22
|
+
@import "src/sorting"
|
23
|
+
@import "src/orderable"
|
24
|
+
@import "src/pagination"
|
25
|
+
@import "src/tree"
|
26
|
+
@import "src/navigation"
|
27
|
+
@import "src/breadcrumb"
|
28
|
+
@import "src/navtabs"
|
29
|
+
@import "src/statcard"
|
30
|
+
@import "src/page-loading"
|
31
|
+
@import "src/responsive"
|
32
|
+
@import "src/well"
|
@@ -0,0 +1,17 @@
|
|
1
|
+
//
|
2
|
+
// Alert
|
3
|
+
// --------------------------------------------------
|
4
|
+
|
5
|
+
//== Main style
|
6
|
+
//
|
7
|
+
//##
|
8
|
+
|
9
|
+
.page-content
|
10
|
+
.alert
|
11
|
+
+first-child()
|
12
|
+
margin-right: -15px
|
13
|
+
margin-left: -15px
|
14
|
+
margin-bottom: 0
|
15
|
+
+border-radius(0)
|
16
|
+
&.no-results
|
17
|
+
margin: 15px 0 0 0
|
@@ -0,0 +1,51 @@
|
|
1
|
+
//
|
2
|
+
// Base
|
3
|
+
// --------------------------------------------------
|
4
|
+
|
5
|
+
//== Layout
|
6
|
+
//
|
7
|
+
//##
|
8
|
+
|
9
|
+
html *
|
10
|
+
outline: 0!important
|
11
|
+
|
12
|
+
body, html
|
13
|
+
min-height: 100%
|
14
|
+
position: relative
|
15
|
+
-webkit-font-smoothing: antialiased
|
16
|
+
-moz-osx-font-smoothing: grayscale
|
17
|
+
|
18
|
+
.body-full-height
|
19
|
+
height: 100%
|
20
|
+
body
|
21
|
+
height: 100%
|
22
|
+
|
23
|
+
body
|
24
|
+
padding: $navbar-height 0 0 0
|
25
|
+
background: image_url('para/admin/tangram-mosaic.png') repeat top left $gray-light
|
26
|
+
background-size: 128px 128px
|
27
|
+
|
28
|
+
//== Page content
|
29
|
+
//
|
30
|
+
//##
|
31
|
+
|
32
|
+
.page-title
|
33
|
+
background-color: #fff
|
34
|
+
padding: 15px 25px 15px 25px
|
35
|
+
z-index: $zindex-navbar-fixed + 1
|
36
|
+
+material-box-shadow-soft(2)
|
37
|
+
h1
|
38
|
+
margin: 0
|
39
|
+
font-weight: 300
|
40
|
+
float: left
|
41
|
+
line-height: 34px
|
42
|
+
|
43
|
+
.page-content-wrap
|
44
|
+
background-color: #fff
|
45
|
+
margin: 25px 10px 25px 10px
|
46
|
+
+border-radius($border-radius-small)
|
47
|
+
+material-box-shadow-soft
|
48
|
+
padding: 25px
|
49
|
+
|
50
|
+
b, strong
|
51
|
+
font-weight: 500
|