]> _ Git - cubist_cms-back.git/commitdiff
#2843
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Wed, 26 Jun 2019 16:41:11 +0000 (18:41 +0200)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Wed, 26 Jun 2019 16:41:11 +0000 (18:41 +0200)
src/app/Magic/Fields/BunchOfFieldsMultiple.php
src/app/Magic/Fields/Field.php
src/public/bunchmultiple/bunchmultiple.css
src/public/bunchmultiple/bunchmultiple.css.map
src/public/bunchmultiple/bunchmultiple.js
src/public/bunchmultiple/bunchmultiple.less
src/resources/views/fields/bunch_multiple.blade.php
src/resources/views/fields/dropzone_media.blade.php

index fd0c1886f53136f88def8fd2b9a54b670139f62a..c81fbe3e852533a715d22ab280db596ee3a90f28 100644 (file)
@@ -15,13 +15,20 @@ class BunchOfFieldsMultiple extends BunchOfFields
 
     public function getDefaultAttributes()
     {
-        return array_merge(parent::getDefaultAttributes(), ['bunch' => []]);
+        return array_merge(parent::getDefaultAttributes(), ['bunch' => [], "add_label" => 'Ajouter un élément']);
     }
 
     public function _postSetAttributes()
     {
         parent::_postSetAttributes();
         $this->_setBunchOfFields();
+
+        foreach ($this->_fields as $field) {
+            $first = $field->getAttribute('name');
+            break;
+        }
+
+        $this->setAttribute('edit_label', 'Éditer « %' . $first . ' »');
     }
 
     protected function _setBunchOfFields()
@@ -46,12 +53,15 @@ class BunchOfFieldsMultiple extends BunchOfFields
             }
         }
 
+        $rand = 'bunchmultiple_' . rand(1, 10000000);
+        $this->setAttribute('rand', $rand);
+
         $crudfields = [];
         foreach ($this->_fields as $field) {
             $name = $field->getAttribute('name');
             $e = explode('[', $name);
             $main = array_shift($e);
-            $name = $this->getAttribute('name') . '___' . $main;
+            $name = $rand . '___' . $main;
             foreach ($e as $item) {
                 $name .= '___' . $item;
             }
@@ -60,4 +70,5 @@ class BunchOfFieldsMultiple extends BunchOfFields
         }
         $this->setAttribute('bunchfields', $crudfields);
     }
+
 }
index dde0ce4fea2e3223202e9fa344aba14dd1134280..40dfbc43fa03b33fd4109f6c57111f929e45731b 100644 (file)
@@ -141,6 +141,7 @@ class Field implements \ArrayAccess
         return !!$this->getAttribute('column');
     }
 
+
     public function getColumnData()
     {
         $this->_postSetAttributes();
index e22265152951af8dbfc932fd80ce459e34d93ef9..9e26622c479ba655a9f0d8aeb9f6e71691db4fe5 100644 (file)
   font-size: 1.2em;
   margin-bottom: 24px;
 }
-.bunchmultiple .bunchmultiple__wrapper .sample {
+.bunchmultiple .bunchmultiple__wrapper .item {
+  margin-bottom: 10px;
+}
+.bunchmultiple .bunchmultiple__wrapper .item.ghost .legend {
+  background-color: #333;
+  color: #fff;
+}
+.bunchmultiple .bunchmultiple__wrapper .item.ghost .legend a.action {
+  color: #fff;
+}
+.bunchmultiple .bunchmultiple__wrapper .item.ghost .subform {
+  color: #fff;
+  background-color: #333;
+}
+.bunchmultiple .bunchmultiple__wrapper .item .legend {
+  background-color: #eaeaea;
+  padding: 8px 18px;
+  font-weight: 700;
+  position: relative;
+}
+.bunchmultiple .bunchmultiple__wrapper .item .legend a.action {
+  color: #333;
+  font-size: 1.2em;
+}
+.bunchmultiple .bunchmultiple__wrapper .item .legend a.action.sort-handle {
+  padding: 0 20px 0 0;
+}
+.bunchmultiple .bunchmultiple__wrapper .item .legend a.action.remove {
+  position: absolute;
+  right: 20px;
+}
+.bunchmultiple .bunchmultiple__wrapper .item .subform {
+  overflow: hidden;
+  transition: height 250ms, padding-top 250ms, padding-bottom 250ms;
+  background-color: #f3f3f3;
+  padding: 10px 0;
+}
+.bunchmultiple .bunchmultiple__wrapper .item.sample {
   display: none;
 }
+.bunchmultiple .bunchmultiple__wrapper .item.collapsed > .subform {
+  height: 0 !important;
+  padding: 0;
+}
 /*# sourceMappingURL=bunchmultiple.css.map */
\ No newline at end of file
index 32c5f7f48335274031bade21e95d2768773a9565..8eed2b1fc9ba8121cd785d9b9894b2d0aac36fdb 100644 (file)
@@ -1 +1 @@
-{"version":3,"sources":["bunchmultiple.less"],"names":[],"mappings":"AAAA,cACI;EACI,aAAA;EACA,sBAAA;EACA,mBAAA;EACA,mBAAA;;AALR,cACI,wBAMI;EACI,UAAA;;AARZ,cACI,wBAMI,cAGI;EACI,gBAAA;EACA,mBAAA;;AAZhB,cACI,wBAeI;EACI,aAAA","file":"bunchmultiple.css"}
\ No newline at end of file
+{"version":3,"sources":["bunchmultiple.less"],"names":[],"mappings":"AAAA,cACI;EACI,aAAA;EACA,sBAAA;EACA,mBAAA;EACA,mBAAA;;AALR,cACI,wBAMI;EACI,UAAA;;AARZ,cACI,wBAMI,cAGI;EACI,gBAAA;EACA,mBAAA;;AAZhB,cACI,wBAeI;EACI,mBAAA;;AAEA,cAlBR,wBAeI,MAGK,MACG;EACI,sBAAA;EACA,WAAA;;AAHR,cAlBR,wBAeI,MAGK,MACG,QAGI,EAAC;EACG,WAAA;;AALZ,cAlBR,wBAeI,MAGK,MASG;EACI,WAAA;EACA,sBAAA;;AA9BpB,cACI,wBAeI,MAkBI;EACI,yBAAA;EACA,iBAAA;EACA,gBAAA;EACA,kBAAA;;AAtChB,cACI,wBAeI,MAkBI,QAMI,EAAC;EACG,WAAA;EACA,gBAAA;;AAEA,cA3ChB,wBAeI,MAkBI,QAMI,EAAC,OAII;EACG,mBAAA;;AAEJ,cA9ChB,wBAeI,MAkBI,QAMI,EAAC,OAOI;EACG,kBAAA;EACA,WAAA;;AAjDxB,cACI,wBAeI,MAsCI;EACI,gBAAA;EACA,iEAAA;EACA,yBAAA;EACA,eAAA;;AAGJ,cA5DR,wBAeI,MA6CK;EACG,aAAA;;AAGJ,cAhER,wBAeI,MAiDK,UACG;EACI,oBAAA;EACA,UAAA","file":"bunchmultiple.css"}
\ No newline at end of file
index d255e1aa60134c9ed5a1e4b2d10c628826ee49be..311ebc2482cf48bd148bedb913078a816a80de43 100644 (file)
     JQbunchmultiple.prototype = {
         init: function () {
             var $this = this;
-            var initValues = this.data('values');
+
+            var initValues = this.element.data('values');
             $.each(initValues, function (k, v) {
                 $this.initItem(v);
             });
+
             if (initValues.length === 0) {
-                this.initItem({});
+                this.initItem();
+            }
+
+            this.element.on('click', '.additem', function () {
+                $this.initItem();
+                return false;
+            });
+
+            this.element.on('click', '.legend', function () {
+                var item = $(this).closest('.item');
+                var subform = item.find('.subform');
+                if (!item.hasClass('collapsed')) {
+                    subform.css('height', subform.outerHeight());
+                    setTimeout(function () {
+                        item.addClass('collapsed');
+                    }, 10);
+                } else {
+                    item.removeClass('collapsed');
+                }
+                return false;
+            });
+
+            this.initSort();
+
+            this.element.on('change', 'input,select,textarea', function () {
+                $this.update();
+                return true;
+            });
+
+            this.element.on('keyup', 'input,select,textarea', function () {
+                $this.updateLegends();
+                return true;
+            });
+        },
+
+        update: function () {
+            this.serialize();
+            this.updateLegends();
+        },
+
+        serialize: function () {
+            var val = [];
+            var $this = this;
+            var id = this.element.attr('id');
+            $.each(this.element.find('.item:not(.sample) .subform'), function () {
+                var data = $(this).find(':input').serializeArray();
+                var filteredData = {};
+                $.each(data, function (k, v) {
+                    var name = v.name.replace(id + '___', '');
+                    filteredData[name] = v.value;
+                });
+
+                val.push(filteredData);
+            });
+
+            this.element.find('.hiddenfield').val(JSON.stringify(val));
+        },
+
+        updateLegends: function () {
+            $('[data-legend]').each(function () {
+                var item = $(this).closest('.item');
+                var form = item.find('.subform');
+                var txt = $(this).data('legend').replace(/\%([a-zA-Z0-9_]+)/gm, function (match, varname) {
+                    return form.find('[name="' + varname + '"]').val();
+                });
+                $(this).text(txt);
+            });
+        },
+
+        onSort: function (e) {
+            this.update();
+        },
+
+        initSort: function () {
+            var $this = this;
+            if (window.Sortable === undefined) {
+                $.cachedScript("https://cdnjs.cloudflare.com/ajax/libs/Sortable/1.9.0/Sortable.js").done(function () {
+                    $this.initSort();
+                });
+                return;
             }
+
+            new Sortable(this.element.find('.bunchmultiple__items').get(0), {
+                handle: '.sort-handle',
+                ghostClass: 'ghost',
+                onSort: function (evt) {
+                    $this.onSort(evt);
+                },
+            });
         },
 
         initItem: function (values) {
-            var item = this.element.find('.sample').clone();
+            var collapsed = true;
+            if (values === undefined) {
+                values = [];
+                collapsed = false;
+            }
+            var item = this.element.find('.sample').clone(true);
+            $(item).removeClass('sample');
+            if (collapsed) {
+                $(item).addClass('collapsed');
+            }
             $(".bunchmultiple__items").append($(item));
+            this.setValues(item, values);
+        },
+
+        setValues(item, values) {
+            var id = this.element.attr('id');
+            $.each(values, function (k, v) {
+                $(item).find('[name="' + id + '___' + k + '"]').val(v);
+            });
+            this.updateLegends();
         },
     };
 
 jQuery(document).ready(function ($) {
     $(".bunchmultiple").bunchmultiple();
 });
+
+jQuery.cachedScript = function (url, options) {
+
+    // Allow user to set any option except for dataType, cache, and url
+    options = $.extend(options || {}, {
+        dataType: "script",
+        cache: true,
+        url: url
+    });
+
+    // Use $.ajax() since it is more flexible than $.getScript
+    // Return the jqXHR object so we can chain callbacks
+    return jQuery.ajax(options);
+};
index 05fb41f2faa6bde15b69cb75960ce1f0268ec538..f67feec8ed2c27fc98f89acfe4a762629b754a1f 100644 (file)
             }
         }
 
-        .sample {
-            display: none;
+        .item {
+            margin-bottom: 10px;
+
+            &.ghost{
+                .legend{
+                    background-color: #333;
+                    color:#fff;
+                    a.action{
+                        color:#fff;
+                    }
+                }
+
+                .subform{
+                    color:#fff;
+                    background-color: #333;
+                }
+            }
+
+            .legend {
+                background-color: #eaeaea;
+                padding: 8px 18px;
+                font-weight: 700;
+                position: relative;
+
+                a.action {
+                    color: #333;
+                    font-size: 1.2em;
+
+                    &.sort-handle {
+                        padding:0 20px 0 0;
+                    }
+                    &.remove{
+                        position: absolute;
+                        right: 20px;
+                    }
+                }
+            }
+
+            .subform {
+                overflow: hidden;
+                transition: height 250ms,padding-top 250ms, padding-bottom 250ms;
+                background-color: #f3f3f3;
+                padding:10px 0;
+            }
+
+            &.sample {
+                display: none;
+            }
+
+            &.collapsed {
+                > .subform {
+                    height: 0 !important;
+                    padding: 0;
+                }
+            }
         }
+
     }
 }
 
index 58bbc60d2a5c0f673fd0399060258b8993e4521e..d3033f3bad2b3a785ef414bdf39b9d15079247ff 100644 (file)
@@ -11,10 +11,10 @@ if (!is_string($value)) {
     $value = json_encode($value);
 }
 
-$unique = 'bunchmultiple_' . rand(1, 100000);
 
 ?>
-<div class="bunchmultiple col-xs-12" id="{!! $unique !!}" data-values="{!! $value !!}">
+<div class="bunchmultiple col-xs-12" id="{!! $field['rand'] !!}" data-values="{{ $value }}">
+    <input type="hidden" class="hiddenfield" name="{{$field['name']}}" value=""/>
     <div class="bunchmultiple__wrapper col-xs-12">
         <div @include('crud::inc.field_wrapper_attributes') >
             <label>{!! $field['label'] !!}</label>
@@ -23,11 +23,24 @@ $unique = 'bunchmultiple_' . rand(1, 100000);
 
             <div class="bunchmultiple__items">
                 <div class="item sample">
-                    <div class="legend">move Editer +-</div>
-                    @include('cubist_back::inc.show_bunch_fields', array('bunchfields'=>$field['bunchfields']))
+                    <div class="legend">
+                        <a href="#" class="action sort-handle"><i class="fa fa-sort" role="presentation"
+                                                                  aria-hidden="true"></i></a>
+                        <span data-legend="{{$field['edit_label']}}"></span>
+                        <a href="#" class="action remove"><i class="fa fa-trash" role="presentation"
+                                                             aria-hidden="true"></i></a>
+                    </div>
+                    <div class="subform">
+                        @include('cubist_back::inc.show_bunch_fields', array('bunchfields'=>$field['bunchfields']))
+                    </div>
                 </div>
             </div>
 
+            <div class="btn-group m-t-10">
+                <button class="btn btn-sm btn-default additem" type="button"><i
+                        class="fa fa-plus"></i> {{$field['add_label']}}</button>
+            </div>
+
             <div class="clearfix"></div>
 
             {{-- HINT --}}
@@ -46,12 +59,14 @@ $unique = 'bunchmultiple_' . rand(1, 100000);
 
     {{-- FIELD CSS - will be loaded in the after_styles section --}}
     @push('crud_fields_styles')
-        <link rel="stylesheet" type="text/css" href="{{ vendor_asset('vendor/cubist/cms-back/bunchmultiple/bunchmultiple.css') }}">
+        <link rel="stylesheet" type="text/css"
+              href="{{ vendor_asset('vendor/cubist/cms-back/bunchmultiple/bunchmultiple.css') }}">
     @endpush
 
     {{-- FIELD JS - will be loaded in the after_scripts section --}}
     @push('crud_fields_scripts')
-        <script type="text/javascript" src="{{ vendor_asset('vendor/cubist/cms-back/bunchmultiple/bunchmultiple.js') }}"></script>
+        <script type="text/javascript"
+                src="{{ vendor_asset('vendor/cubist/cms-back/bunchmultiple/bunchmultiple.js') }}"></script>
     @endpush
 
 @endif
index 64f0c42b0841f4e96438e10829cf6a82f3b8972e..a5bbfe14110cc422955135516018f407bcf1d83d 100644 (file)
@@ -74,7 +74,7 @@
         <script
             src="{{ asset('vendor/gaspertrix/laravel-backpack-dropzone-field/dropzone/dropzone.min.js') }}"></script>
         <script
-            src="{{ asset('vendor/gaspertrix/laravel-backpack-dropzone-field/sortable/Sortable.min.js') }}"></script>
+            src="https://cdnjs.cloudflare.com/ajax/libs/Sortable/1.9.0/Sortable.js"></script>
     @endpush
 
 @endif