├── .github └── contributing.md ├── .gitignore ├── assets ├── js │ ├── add.js │ ├── clone.js │ ├── count.js │ ├── delete.js │ ├── id.js │ ├── outline.js │ ├── render.js │ ├── script.js │ ├── sort.js │ ├── toggleActive.js │ ├── toggleDropdown.js │ └── trigger.js └── scss │ ├── action-items.scss │ ├── delete-message.scss │ ├── dropdown.scss │ ├── empty.scss │ ├── grid.scss │ ├── has-fieldsets.scss │ ├── outline.scss │ ├── output.scss │ ├── plugins.scss │ ├── row-actions.scss │ ├── skeleton.scss │ ├── sort.scss │ ├── style.scss │ └── table.scss ├── docs ├── advanced-for-plugin-developers.md ├── blueprint.md ├── changelog.md ├── compare.md ├── examples.md ├── fields.md ├── fieldsets.png ├── hero.png ├── install.md ├── license.md ├── nesting.png ├── options.md ├── presentation.png ├── screenshot.png ├── screenshots.md ├── sorting.png ├── templates-snippets.md ├── troubleshooting.md └── usage.md ├── field-engineer.php ├── fields └── engineer │ ├── assets │ ├── css │ │ ├── style.css │ │ ├── style.css.map │ │ ├── style.css.min.map │ │ └── style.min.css │ └── js │ │ ├── script.js │ │ └── script.min.js │ └── engineer.php ├── gulpfile.js ├── lib ├── field.php ├── form.php ├── outline.php ├── presentation-array.php ├── presentation.php └── tpl.php ├── package.json ├── readme.md ├── snippets ├── actions.php ├── delete.php ├── dropdown.php ├── outline.php ├── presentation.php ├── row-actions.php ├── row-empty.php ├── row-meta.php └── template.php └── tests └── blueprints ├── fieldsets.yml ├── grid.yml ├── nesting.yml ├── options.yml ├── panel-fields.yml ├── supported-fields.yml ├── table.yml └── working-fields.yml /.github/contributing.md: -------------------------------------------------------------------------------- 1 | # How to contribute 2 | 3 | Issue reports and pull requests are very valuable to improve this project. 4 | 5 | ## Issue reporting 6 | 7 | If you find something that does not work, add a new issue. Explain the problem as well as you can. Make sure the issue does not already exists. Provide the blueprint code if needed. 8 | 9 | ## Pull requests 10 | 11 | Pull requests are allowed and we are very thankful for them! 12 | 13 | Be aware that this project is on a commercial license. The code you send will then also be a part of this commercial project. -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /assets/js/add.js: -------------------------------------------------------------------------------- 1 | var EgrAdd = (function () { 2 | var fn = {}; 3 | 4 | fn.add = function(obj, this_obj) { 5 | var fieldset_name = fn.name(this_obj); 6 | var row = fn.row(this_obj); 7 | var fieldsets = fn.fieldsets(row); 8 | 9 | fieldsets.append(fn.matchFieldset(row, fieldset_name, obj).clone()); 10 | EgrId.replace(fieldsets.children('.egr-fieldset').last()); 11 | 12 | EgrSort.sort(this_obj); 13 | EgrCount.trigger(obj, this_obj); 14 | EgrTrigger.trigger(row); 15 | EgrRender.render(obj); 16 | }; 17 | 18 | fn.name = function(this_obj) { 19 | return this_obj.attr('data-add'); 20 | }; 21 | 22 | fn.row = function(this_obj) { 23 | return this_obj.closest('.egr-row'); 24 | }; 25 | 26 | fn.id = function(row) { 27 | return row.attr('data-id'); 28 | }; 29 | 30 | fn.fieldsets = function(row) { 31 | return row.children('.egr-fieldsets'); 32 | }; 33 | 34 | fn.matchRow = function(row, obj) { 35 | var id = fn.id(row); 36 | return $('.egr-outline[data-id="' + obj.attr('data-name') + '"] .egr-row[data-id="' + id + '"]'); 37 | }; 38 | 39 | fn.matchFieldsets = function(row, obj) { 40 | var match_row = fn.matchRow(row, obj); 41 | return match_row.children('.egr-fieldsets'); 42 | }; 43 | 44 | fn.matchFieldset = function(row, fieldset_name, obj) { 45 | var match_fieldsets = fn.matchFieldsets(row, obj); 46 | return match_fieldsets.children('[data-fieldset-name="' + fieldset_name + '"]'); 47 | }; 48 | 49 | return fn; 50 | })(); -------------------------------------------------------------------------------- /assets/js/clone.js: -------------------------------------------------------------------------------- 1 | var EgrClone = (function () { 2 | var fn = {}; 3 | 4 | fn.clone = function(obj, this_obj) { 5 | var fieldset = this_obj.closest('.egr-fieldset'); 6 | var cloned = fn.duplicate(fieldset); 7 | 8 | fn.setSelects(cloned, fn.getSelects(fieldset)); 9 | EgrId.replace(cloned); 10 | EgrCount.trigger(obj, this_obj); 11 | EgrTrigger.trigger(this_obj.closest('.egr-row')); 12 | EgrRender.render(obj); 13 | }; 14 | 15 | fn.duplicate = function(fieldset) { 16 | var cloned = fieldset.clone(true); 17 | fieldset.after(cloned); 18 | return fieldset.next(); 19 | }; 20 | 21 | fn.getSelects = function(fieldset) { 22 | var array = []; 23 | var i = 0; 24 | fieldset.find('select').each(function(index) { 25 | $(this).val(); 26 | array[i] = $(this).val(); 27 | i++; 28 | }); 29 | return array; 30 | }; 31 | 32 | fn.setSelects = function(next, select_values) { 33 | var i = 0; 34 | next.find('select').each(function(index) { 35 | $(this).val(select_values[i]); 36 | i++; 37 | }); 38 | }; 39 | 40 | return fn; 41 | })(); -------------------------------------------------------------------------------- /assets/js/count.js: -------------------------------------------------------------------------------- 1 | var EgrCount = (function () { 2 | var fn = {}; 3 | 4 | fn.trigger = function(obj, this_obj) { 5 | var row = this_obj.closest('.egr-row'); 6 | var fieldsets = row.children('.egr-fieldsets'); 7 | var fieldset = fieldsets.children('.egr-fieldset'); 8 | var count = fieldset.length; 9 | row.attr('data-count', count); 10 | }; 11 | 12 | return fn; 13 | })(); -------------------------------------------------------------------------------- /assets/js/delete.js: -------------------------------------------------------------------------------- 1 | var EgrDelete = (function () { 2 | var fn = {}; 3 | 4 | fn.deleteMessage = function(obj, this_obj) { 5 | var delete_message = $(document).find('.egr-outline .egr-element-delete').first(); 6 | fn.deleteCancel(obj, this_obj); 7 | obj.find('.egr-actions').hide(); 8 | this_obj.closest('.egr-fieldset').addClass('egr-delete-active'); 9 | this_obj.closest('.egr-fieldset').append(delete_message.clone()); 10 | }; 11 | 12 | fn.deleteAction = function(obj, this_obj) { 13 | var fieldsets = this_obj.closest('.egr-fieldsets'); 14 | this_obj.closest('.egr-fieldset').remove(); 15 | EgrSort.sort(obj); 16 | EgrCount.trigger(obj, fieldsets); 17 | EgrRender.render(obj); 18 | }; 19 | 20 | fn.deleteCancel = function(obj, this_obj) { 21 | obj.find('.egr-element-delete').remove(); 22 | obj.find('.egr-delete-active').removeClass('egr-delete-active'); 23 | }; 24 | 25 | return fn; 26 | })(); -------------------------------------------------------------------------------- /assets/js/id.js: -------------------------------------------------------------------------------- 1 | var EgrId = (function () { 2 | var fn = {}; 3 | 4 | fn.replace = function(fieldset) { 5 | var time = new Date().getTime(); 6 | 7 | fn.replaceIds(fieldset, time); 8 | fn.replaceFors(fieldset, time); 9 | fn.replaceClasses(fieldset, time); 10 | fn.replaceNames(fieldset, time); 11 | fn.replacePrefixes(fieldset, time); 12 | 13 | fn.addFieldsetCount(fieldset); 14 | }; 15 | 16 | fn.replaceIds = function(fieldset, time) { 17 | var matches = fieldset.find('[id^="form-field-"]'); 18 | matches.each(function(index) { 19 | var element = $(this).attr('id').replace(/_egr__/g, '_' + time + '_egr__'); 20 | $(this).attr('id', element); 21 | }); 22 | }; 23 | 24 | fn.replaceFors = function(fieldset, time) { 25 | var matches = fieldset.find('[for^="form-field-"]'); 26 | matches.each(function(index) { 27 | var element = $(this).attr('for').replace(/_egr__/g, '_' + time + '_egr__'); 28 | $(this).attr('for', element); 29 | }); 30 | }; 31 | 32 | fn.replaceClasses = function(fieldset, time) { 33 | var matches = fieldset.find('[data-field-name][class^="field "]'); 34 | matches.each(function(index) { 35 | var element = $(this).attr('class').replace(/_egr__/g, '_' + time + '_egr__'); 36 | $(this).attr('class', element); 37 | }); 38 | }; 39 | 40 | fn.replaceNames = function(fieldset, time) { 41 | var matches = fieldset.find('[name]'); 42 | matches.each(function(index) { 43 | var element = $(this).attr('name').replace(/_egr__/g, '_' + time + '_egr__'); 44 | $(this).attr('name', element); 45 | }); 46 | }; 47 | 48 | fn.replacePrefixes = function(fieldset, time) { 49 | var matches = fieldset.find('[data-prefix]'); 50 | matches.each(function(index) { 51 | var element = $(this).attr('data-prefix').replace(/_egr__/g, '_' + time + '_egr__'); 52 | $(this).attr('data-prefix', element); 53 | }); 54 | }; 55 | 56 | fn.addFieldsetCount = function(fieldset) { 57 | var row = fieldset.closest('.egr-row'); 58 | var fieldset_count = row.children('.egr-row-actions').find('.egr-add-select').length; 59 | fieldset_count = (fieldset_count == 0) ? 1 : fieldset_count; 60 | row.attr('data-fieldset-count', fieldset_count); 61 | }; 62 | 63 | return fn; 64 | })(); -------------------------------------------------------------------------------- /assets/js/outline.js: -------------------------------------------------------------------------------- 1 | var EgrOutline = (function () { 2 | var fn = {}; 3 | 4 | fn.set = function(obj) { 5 | var outline = obj.find('.egr-outline'); 6 | var name = obj.attr('data-name'); 7 | 8 | $('.mainbar').children('.section').prepend('
' + outline.html() + "
"); 9 | outline.remove(); 10 | }; 11 | 12 | return fn; 13 | })(); -------------------------------------------------------------------------------- /assets/js/render.js: -------------------------------------------------------------------------------- 1 | EgrRender = (function () { 2 | var fn = {}; 3 | var level = 1; 4 | 5 | fn.render = function(obj) { 6 | var output = ''; 7 | var fields = obj.find('.egr-presentation').children(); 8 | var out = ''; 9 | var textarea = obj.find('.egr-output').find('textarea'); 10 | out = fn.renderLoop(fields, out, level, true); 11 | textarea.val(out); 12 | textarea.blur(); 13 | }; 14 | 15 | fn.renderLoop = function(fields, out, root_field) { 16 | fields.each(function(field_index) { 17 | var field = $(this); 18 | var field_name = field.attr('data-field-name'); 19 | var depth = field.parents('.egr-row').length; 20 | var tab = ' '.repeat(depth); 21 | 22 | if(field.hasClass('egr-row')) { 23 | if(!root_field) { 24 | out += tab + field_name + ":\n"; 25 | } 26 | var fieldsets = $(this).children('.egr-fieldsets').children(); 27 | if(depth > 0) tab += ' '; 28 | fieldsets.each(function(fieldset_index) { 29 | var fieldset = $(this); 30 | var subfields = fieldset.children('.egr-fields').children(); 31 | 32 | if(fieldset.attr('data-fieldset-name') != undefined) { 33 | out += tab + "-\n"; 34 | out += fn.setFieldsetName(tab, field, fieldset); 35 | } 36 | out = fn.renderLoop(subfields, out, false); 37 | }); 38 | } else { 39 | var fieldset = field.parent().parent(); 40 | var selector = fn.getSelector(field_name, field); 41 | var element = fn.findFormElement(selector, field); 42 | var content = fn.getElement(element, field_name, tab); 43 | 44 | if(content) { 45 | out += tab + content; 46 | } 47 | } 48 | }); 49 | return out; 50 | }; 51 | 52 | fn.getSelector = function(field_name, field) { 53 | var selector = field_name + field.attr('data-prefix'); 54 | return selector; 55 | }; 56 | 57 | fn.findFormElement = function(selector, field) { 58 | var single = '[name="' + selector + '"]:not(label)'; 59 | var multiple = '[name^="' + selector + '["]:not(label)'; 60 | var element = field.find(single + ',' + multiple); 61 | return element; 62 | }; 63 | 64 | fn.getElement = function(element, field_name, tab) { 65 | var elementType = element.prop('nodeName'); 66 | var is_single = (element.length < 2) ? true : false; 67 | var output = ''; 68 | 69 | switch(elementType) { 70 | case 'TEXTAREA': 71 | output += fn.textarea(element, field_name, tab); 72 | break; 73 | case 'INPUT': 74 | switch(element.attr('type')) { 75 | case 'radio': 76 | output += fn.radio(element, field_name, tab); 77 | break; 78 | case 'checkbox': 79 | if(is_single) { 80 | output += fn.checkbox(element, field_name, tab); 81 | } else { 82 | output += fn.checkboxes(element, field_name, tab); 83 | } 84 | break; 85 | default: 86 | if(element.hasClass('images')) { 87 | output += fn.textarea(element, field_name, tab); 88 | } else { 89 | if(is_single) { 90 | output += fn.input(element, field_name, is_single, tab); 91 | } else { 92 | if(field_name == 'datetime') { 93 | output += fn.input(element, field_name); 94 | } else { 95 | output += fn.inputs(element, field_name, tab); 96 | } 97 | } 98 | } 99 | } 100 | break; 101 | case 'SELECT': 102 | output += fn.select(element, field_name, tab); 103 | break; 104 | } 105 | return output; 106 | }; 107 | 108 | fn.setFieldsetName = function(tab, field, fieldset) { 109 | var fieldset_name = fieldset.attr('data-fieldset-name'); 110 | var fieldset_count = field.attr('data-fieldset-count'); 111 | if(fieldset_count == 1 && fieldset_name == 'default') { 112 | return ''; 113 | } 114 | return tab + " _fieldset: " + fieldset_name + "\n"; 115 | }; 116 | 117 | fn.inputs = function(element, field_name, tab) { 118 | var value = ''; 119 | var indent = tab + ' '; 120 | 121 | element.each(function( index ) { 122 | var val = $(this).val(); 123 | val = val.replace(/"/g, '\\"'); 124 | value += indent + '- "' + val + '"' + "\n"; 125 | 126 | }); 127 | 128 | value = value.slice(0, -1); 129 | return field_name + ": \n" + value + "\n"; 130 | }; 131 | 132 | /* Input */ 133 | fn.input = function(element, field_name) { 134 | var value = ''; 135 | 136 | element.each(function( index ) { 137 | value += $(this).val() + ' '; 138 | }); 139 | value = value.slice(0, -1); 140 | value = value.replace(/"/g, '\\"'); 141 | return field_name + ': "' + value + '"' + "\n"; 142 | }; 143 | 144 | /* Textarea */ 145 | fn.textarea = function(element, field_name, tab) { 146 | var value = element.val(); 147 | var match = value.indexOf("\n"); 148 | var indent = tab + ' '; 149 | 150 | if(match > -1) { 151 | value = value.replace(/(?:\r\n|\r|\n)/g, "\n" + indent); 152 | if(value != '') { 153 | return field_name + ": |\n" + indent + value + "\n"; 154 | } else { 155 | return ''; 156 | } 157 | } 158 | return fn.input(element, field_name); 159 | }; 160 | 161 | /* Select */ 162 | fn.select = function(element, field_name) { 163 | var value = element.val(); 164 | value = value.replace(/"/g, '\\"'); 165 | return field_name + ': "' + value + '"' + "\n"; 166 | }; 167 | 168 | /* Radio */ 169 | fn.radio = function(element, field_name) { 170 | out = ''; 171 | element.each(function(index) { 172 | if($(this).is(':checked')) { 173 | var value = $(this).val(); 174 | if(value == 'true' || value == 'false') { 175 | value = "'" + value + "'"; 176 | } 177 | out += field_name + ": " + value + "\n"; 178 | } 179 | }); 180 | return out; 181 | }; 182 | 183 | /* Checkbox */ 184 | fn.checkbox = function(element, field_name) { 185 | out = ''; 186 | element.each(function(index) { 187 | if($(this).is(':checked')) { 188 | var value = $(this).val(); 189 | if(value == 'on') { 190 | value = 'true'; 191 | } 192 | out += field_name + ': ' + value + "\n"; 193 | } else { 194 | out += field_name + ": false\n"; 195 | } 196 | }); 197 | return out; 198 | }; 199 | 200 | /* Checkboxes */ 201 | fn.checkboxes = function(element, field_name, tab) { 202 | out = ''; 203 | element.each(function(index) { 204 | if($(this).is(':checked')) { 205 | out += tab + ' - ' + $(this).val() + "\n"; 206 | } 207 | }); 208 | if(out != '') { 209 | out = field_name + ":\n" + out; 210 | } 211 | return out; 212 | } 213 | 214 | return fn; 215 | })(); -------------------------------------------------------------------------------- /assets/js/script.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | $.fn.engineer = function() { 3 | return this.each(function() { 4 | var field = $(this); 5 | var fieldname = 'engineer'; 6 | 7 | if(field.data( fieldname )) { 8 | return true; 9 | } else { 10 | field.data( fieldname, true ); 11 | } 12 | 13 | EgrOutline.set(field); 14 | 15 | field.on('click', '.egr [data-add]', function() { 16 | EgrAdd.add(field, $(this)); 17 | }); 18 | 19 | field.on('click', '.egr-delete-apply', function() { 20 | EgrDelete.deleteAction(field, $(this)); 21 | }); 22 | 23 | field.on('click', '.egr-delete-cancel', function() { 24 | EgrDelete.deleteCancel(field, $(this)); 25 | }); 26 | 27 | field.on('click', '.egr-clone', function() { 28 | EgrClone.clone(field, $(this)); 29 | }); 30 | 31 | field.on('click', '.egr-fieldset', function(e) { 32 | if(!$(e.target).closest('.egr-fieldset').not(this).length){ 33 | EgrToggleActive.toggle(field, $(this)); 34 | } 35 | }); 36 | 37 | field.on('click', '.egr-delete', function() { 38 | EgrDelete.deleteMessage(field, $(this)); 39 | }); 40 | 41 | $(document).on('click', function(e) { 42 | if(!$(e.target).closest('.egr-add-button').not(this).length) { 43 | $(document).find('.egr-dropdown-active').removeClass('egr-dropdown-active'); 44 | } 45 | if(!$(e.target).closest('.egr-fieldset').not(this).length) { 46 | EgrToggleActive.remove(field, $(this)); 47 | } 48 | }); 49 | 50 | field.on('click', '.egr-sort-up', function(e) { 51 | EgrSort.sortUp(field, $(this)); 52 | }); 53 | 54 | field.on('click', '.egr-sort-down', function(e) { 55 | EgrSort.sortDown(field, $(this)); 56 | }); 57 | 58 | field.on('click', '.egr-add-button', function(e) { 59 | if(!$(e.target).closest('.egr-add-button').not(this).length){ 60 | EgrToggleDropdown.toggle(field, $(this)); 61 | } 62 | }); 63 | 64 | EgrSort.sort(field); 65 | 66 | field.find('.egr-presentation').on('input click change', 'input, select, textarea', function() { 67 | EgrRender.render(field, $(this)); 68 | }); 69 | }); 70 | }; 71 | })(jQuery); -------------------------------------------------------------------------------- /assets/js/sort.js: -------------------------------------------------------------------------------- 1 | var EgrSort = (function () { 2 | var fn = {}; 3 | 4 | fn.sort = function(obj) { 5 | var items = obj.find('.egr'); 6 | var firstSort = true; 7 | items.sortable({ 8 | items: '.egr-sorted-fieldset', 9 | handle: '.egr-sort', 10 | start: function(e, ui) { 11 | if(firstSort) { 12 | items.sortable('refreshPositions'); 13 | firstSort = false; 14 | } 15 | }, 16 | update: function( event, ui ) { 17 | EgrRender.render(obj); 18 | } 19 | }); 20 | }; 21 | 22 | fn.removeClasses = function(obj, this_obj) { 23 | obj.find('.egr-sorted-row').removeClass('egr-sorted-row'); 24 | obj.find('.egr-sorted-fieldsets').removeClass('egr-sorted-fieldsets'); 25 | obj.find('.egr-sorted-fieldset').removeClass('egr-sorted-fieldset'); 26 | }; 27 | 28 | fn.toggle = function(obj, this_obj) { 29 | var row = this_obj.closest('.egr-row'); 30 | var fieldsets = row.children('.egr-fieldsets'); 31 | var fieldset = fieldsets.children('.egr-fieldset'); 32 | fn.removeClasses(obj, this_obj); 33 | row.addClass('egr-sorted-row'); 34 | fieldsets.addClass('egr-sorted-fieldsets'); 35 | fieldset.addClass('egr-sorted-fieldset'); 36 | EgrSort.sort(obj); 37 | }; 38 | 39 | fn.sortUp = function(obj, this_obj) { 40 | var current = this_obj.closest('.egr-fieldset'); 41 | var prev = current.prev(); 42 | var cloned = prev.clone(true); 43 | current.after(cloned); 44 | prev.remove(); 45 | EgrRender.render(obj); 46 | }; 47 | 48 | fn.sortDown = function(obj, this_obj) { 49 | var current = this_obj.closest('.egr-fieldset'); 50 | var next = current.next(); 51 | var cloned = next.clone(true); 52 | current.before(cloned); 53 | next.remove(); 54 | EgrRender.render(obj); 55 | }; 56 | 57 | return fn; 58 | })(); -------------------------------------------------------------------------------- /assets/js/toggleActive.js: -------------------------------------------------------------------------------- 1 | var EgrToggleActive = (function () { 2 | var fn = {}; 3 | 4 | fn.toggle = function(obj, this_obj) { 5 | if(this_obj.hasClass('egr-delete-active')) return; 6 | 7 | obj.find('.egr-actions').hide(); 8 | this_obj.children('.egr-actions').css('display', 'flex'); 9 | EgrSort.toggle(obj, this_obj); 10 | }; 11 | 12 | fn.remove = function(obj, this_obj) { 13 | obj.find('.egr-actions').hide(); 14 | }; 15 | 16 | return fn; 17 | })(); -------------------------------------------------------------------------------- /assets/js/toggleDropdown.js: -------------------------------------------------------------------------------- 1 | var EgrToggleDropdown = (function () { 2 | var fn = {}; 3 | 4 | fn.toggle = function(obj, this_obj) { 5 | if(fn.count(this_obj) > 1) { 6 | if(this_obj.parent().hasClass('egr-dropdown-active')) { 7 | this_obj.parent().removeClass('egr-dropdown-active'); 8 | } else { 9 | obj.find('.egr-dropdown-active').removeClass('egr-dropdown-active'); 10 | this_obj.parent().addClass('egr-dropdown-active'); 11 | } 12 | } 13 | }; 14 | 15 | fn.count = function(this_obj) { 16 | return this_obj.find('.egr-add-select').length; 17 | }; 18 | 19 | return fn; 20 | })(); -------------------------------------------------------------------------------- /assets/js/trigger.js: -------------------------------------------------------------------------------- 1 | var EgrTrigger = (function () { 2 | var fn = {}; 3 | 4 | fn.trigger = function(row) { 5 | fn.triggerFields(row); 6 | fn.triggerPlugins(row); 7 | 8 | fn.checkDuplicates(row); 9 | }; 10 | 11 | fn.triggerFields = function(row) { 12 | row.find('[data-field="urlfield"]').removeData('urlfield').off('click').urlfield(); 13 | row.find('[data-field="date"]').removeData('date').off('change').date(); 14 | row.find('[data-field="imagefield"]').removeData('imagefield').imagefield(); 15 | row.find('[data-field="autocomplete"]').removeData('autocomplete').off('keydown keyup').autocomplete(); 16 | row.find('[data-field="editor"]').removeData('editor').off('keydown click').editor(); 17 | row.find('[data-field="counter"]').removeData('counter').counter(); 18 | }; 19 | 20 | fn.triggerPlugins = function(row) { 21 | if ( row.find('[data-field="images"]').length ) { 22 | row.find('[data-field="images"]').removeData('images').images(); 23 | } 24 | if ( row.find('[data-field="hero"]').length ) { 25 | row.find('[data-field="hero"]').removeData('hero').hero(); 26 | } 27 | if ( row.find('[data-field="quickselect"]').length ) { 28 | row.find('[data-field="quickselect"]').removeData('quickselect').quickselect(); 29 | } 30 | if ( row.find('[data-field="list"]').length ) { 31 | row.find('[data-field="list"]').removeData('list').list(); 32 | } 33 | }; 34 | 35 | fn.checkDuplicates = function(row) { 36 | var i = 0; 37 | var values = []; 38 | row.closest('.egr').find('.field').each(function( index ) { 39 | var classes = $(this).attr('class').split(" "); 40 | 41 | $.each(classes, function( index, value ) { 42 | if(value.endsWith("_egr__")) { 43 | values[i] = value; 44 | i++; 45 | } 46 | }); 47 | }); 48 | if(fn.hasDuplicates(values)) { 49 | console.log('Error: There are duplicates!'); 50 | } 51 | }; 52 | 53 | fn.hasDuplicates = function(array) { 54 | return (new Set(array)).size !== array.length; 55 | } 56 | 57 | return fn; 58 | })(); -------------------------------------------------------------------------------- /assets/scss/action-items.scss: -------------------------------------------------------------------------------- 1 | .egr-actions { 2 | width: calc(100% + 1.5em); 3 | display: none; 4 | justify-content: center; 5 | border-top: 1px solid #ddd; 6 | 7 | > * { 8 | height: 2.5em; 9 | line-height: 2.5em; 10 | cursor: pointer; 11 | padding-right: 1.5em; 12 | padding-left: 1.5em; 13 | user-select: none; 14 | border-right: 1px solid #ddd; 15 | 16 | &:last-child { 17 | border-right: none; 18 | } 19 | } 20 | } 21 | 22 | .egr-even .egr-actions { 23 | border-top: 1px solid #ccc; 24 | 25 | > * { 26 | border-right: 1px solid #ccc; 27 | 28 | &:last-child { 29 | border-right: none; 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /assets/scss/delete-message.scss: -------------------------------------------------------------------------------- 1 | .egr-element-delete { 2 | width: calc(100% + 1.5em); 3 | z-index: 100; 4 | background: #fff; 5 | display: flex; 6 | 7 | .egr-delete-message { 8 | padding: 1.5em; 9 | position: relative; 10 | background: #fff; 11 | margin: 0 auto; 12 | } 13 | } 14 | 15 | .egr-delete-buttons { 16 | max-width: 20em; 17 | justify-content: space-between; 18 | display: flex; 19 | margin-top: .5em; 20 | 21 | >* { 22 | cursor: pointer; 23 | line-height: 2em; 24 | } 25 | } 26 | 27 | .egr-delete-cancel { 28 | padding: 0 .5em; 29 | color: #777; 30 | border: 2px solid transparent; 31 | 32 | span { 33 | border-bottom: 2px solid #eee; 34 | } 35 | 36 | &:hover { 37 | color: #000; 38 | 39 | span { 40 | border-bottom: 2px solid #ccc; 41 | } 42 | } 43 | } 44 | 45 | .egr-delete-apply { 46 | border-radius: .3em; 47 | padding: 0 1em; 48 | color: #b3000a; 49 | border: 2px solid #b3000a; 50 | font-weight: bold; 51 | 52 | &:hover { 53 | color: #fff; 54 | background: #b3000a; 55 | } 56 | } 57 | 58 | .egr-delete-active { 59 | position: relative; 60 | } 61 | 62 | .egr-delete-active .egr-fields:before{ 63 | content: ''; 64 | display: block; 65 | position: absolute; 66 | top: 0; 67 | left: 0; 68 | background: #b3000a; 69 | width: 100%; 70 | height: 100%; 71 | z-index: 1; 72 | opacity: .2; 73 | } -------------------------------------------------------------------------------- /assets/scss/dropdown.scss: -------------------------------------------------------------------------------- 1 | .egr-dropdown { 2 | position: absolute; 3 | background: #000; 4 | border-radius: 4px; 5 | right: 0; 6 | z-index: 10000; 7 | display: none; 8 | margin-top: .4em; 9 | 10 | &:before { 11 | content: ''; 12 | border-left: .4em solid transparent; 13 | border-right: .4em solid transparent; 14 | border-bottom: .4em solid #000; 15 | position: absolute; 16 | left: 50%; 17 | top: 0; 18 | margin-top: -.3em; 19 | } 20 | } 21 | 22 | .egr-empty .egr-dropdown:before { 23 | left: 2em; 24 | } 25 | .egr-row-actions .egr-dropdown:before { 26 | left: calc(100% - 2.4em); 27 | } 28 | 29 | .egr-dropdown-active .egr-dropdown { 30 | display: block; 31 | } 32 | .egr-dropdown-active .egr-add-button .icon { 33 | transform: rotateX(180deg); 34 | } -------------------------------------------------------------------------------- /assets/scss/empty.scss: -------------------------------------------------------------------------------- 1 | .egr-empty { 2 | padding: 1.5em; 3 | background: #ddd; 4 | display: none; 5 | 6 | .egr-add-button { 7 | border-bottom: 2px solid #aaa; 8 | cursor: pointer; 9 | position: relative; 10 | display: inline-block; 11 | 12 | .egr-dropdown { 13 | right: auto; 14 | margin-top: .7em; 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /assets/scss/grid.scss: -------------------------------------------------------------------------------- 1 | .egr-grid-item { 2 | display: flex; 3 | flex-wrap: wrap; 4 | } 5 | 6 | .egr-fieldset { 7 | width: 100%; 8 | display: flex; 9 | flex-direction: column; 10 | justify-content: space-between; 11 | } 12 | 13 | @media screen and (min-width: 60em) { 14 | .egr-grid-item { 15 | width: calc(100% + 1.5em); 16 | } 17 | 18 | .egr-fieldset { 19 | margin-right: 1.5em; 20 | margin-bottom: 1.5em; 21 | } 22 | 23 | .egr-grid-item-1-2 > .egr-fieldset { 24 | width: calc(100% / 2 - 1.5em); 25 | } 26 | .egr-grid-item-1-3 > .egr-fieldset { 27 | width: calc(100% / 3 - 1.5em); 28 | } 29 | .egr-grid-item-1-4 > .egr-fieldset { 30 | width: calc(100% / 4 - 1.5em); 31 | } 32 | .egr-grid-item-1-5 > .egr-fieldset { 33 | width: calc(100% / 5 - 1.5em); 34 | } 35 | } -------------------------------------------------------------------------------- /assets/scss/has-fieldsets.scss: -------------------------------------------------------------------------------- 1 | .egr-row[data-count="0"] > .egr-empty { 2 | display: block; 3 | } 4 | .egr-row[data-count="0"] > .egr-row-actions { 5 | display: none; 6 | } 7 | 8 | .egr-dropdown-active .egr-add-button:before { 9 | display: block; 10 | } -------------------------------------------------------------------------------- /assets/scss/outline.scss: -------------------------------------------------------------------------------- 1 | .egr-outline { 2 | opacity: .5; 3 | } -------------------------------------------------------------------------------- /assets/scss/output.scss: -------------------------------------------------------------------------------- 1 | .egr-output { 2 | margin-left: 1.5em; 3 | width: calc(100% - 1.5em); 4 | padding-bottom: 1.5em; 5 | display: none; 6 | 7 | textarea { 8 | width: 100%; 9 | height: 300px; 10 | border: 2px solid #ddd; 11 | padding: .5em; 12 | font-size: .9em; 13 | outline: none; 14 | } 15 | } -------------------------------------------------------------------------------- /assets/scss/plugins.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirby-deprecated-plugins/field-engineer/26b9602176d4a043f92778c0fdba2fa52ae0ea71/assets/scss/plugins.scss -------------------------------------------------------------------------------- /assets/scss/row-actions.scss: -------------------------------------------------------------------------------- 1 | .egr-row-actions { 2 | margin-top: .5em; 3 | 4 | &:after { 5 | clear: both; 6 | content: ''; 7 | display: table; 8 | } 9 | } 10 | 11 | .egr-add-button { 12 | cursor: pointer; 13 | display: inline-block; 14 | position: relative; 15 | user-select: none; 16 | 17 | span { 18 | color: #777; 19 | } 20 | 21 | &:hover span { 22 | color: #000; 23 | } 24 | } 25 | 26 | .egr-add { 27 | float: right; 28 | } 29 | 30 | .egr-add-select { 31 | padding: .75em 1.5em .75em 1.5em; 32 | color: #fff; 33 | border-bottom: 1px solid #222; 34 | white-space: nowrap; 35 | cursor: pointer; 36 | user-select: none; 37 | 38 | &:hover { 39 | color: #999; 40 | } 41 | 42 | &:last-child { 43 | border-bottom: 0; 44 | } 45 | } 46 | 47 | .egr-dropdown-active .egr-add-button:before { 48 | display: block; 49 | } -------------------------------------------------------------------------------- /assets/scss/skeleton.scss: -------------------------------------------------------------------------------- 1 | .egr { 2 | margin-left: -1.5em; 3 | margin-bottom: -1.5em; 4 | } 5 | 6 | .egr-row { 7 | margin-left: 1.5em; 8 | width: calc(100% - 1.5em); 9 | padding-bottom: 1.5em; 10 | } 11 | 12 | .egr-fieldsets { 13 | position: relative; 14 | } 15 | 16 | .egr-fieldset { 17 | padding-top: 1.5em; 18 | padding-right: 1.5em; 19 | border: 2px solid #ddd; 20 | background: #fff; 21 | position: relative; 22 | } 23 | 24 | .egr-even > .egr-fieldsets > .egr-fieldset { 25 | background: #eee; 26 | } 27 | 28 | .egr-outline { 29 | display: none; 30 | } 31 | 32 | .egr-fields { 33 | flex: 1; 34 | } -------------------------------------------------------------------------------- /assets/scss/sort.scss: -------------------------------------------------------------------------------- 1 | .egr .ui-sortable-helper { 2 | border-bottom: 2px solid #ddd; 3 | } 4 | 5 | .egr-presentation .egr-fieldset:first-child > .egr-actions > .egr-sort-up { 6 | display: none; 7 | } 8 | .egr-presentation .egr-fieldset:last-child > .egr-actions > .egr-sort-down { 9 | display: none; 10 | } 11 | 12 | .egr-presentation .egr-fieldset:only-child > .egr-actions > .egr-sort-up, 13 | .egr-presentation .egr-fieldset:only-child > .egr-actions > .egr-sort-down, 14 | .egr-presentation .egr-fieldset:only-child > .egr-actions > .egr-sorting { 15 | display: none; 16 | } -------------------------------------------------------------------------------- /assets/scss/style.scss: -------------------------------------------------------------------------------- 1 | @import 'skeleton'; 2 | @import 'action-items'; 3 | @import 'has-fieldsets'; 4 | @import 'dropdown'; 5 | @import 'empty'; 6 | @import 'output'; 7 | @import 'outline'; 8 | @import 'sort'; 9 | @import 'row-actions'; 10 | @import 'plugins'; 11 | @import 'grid'; 12 | @import 'delete-message'; 13 | @import 'table'; -------------------------------------------------------------------------------- /assets/scss/table.scss: -------------------------------------------------------------------------------- 1 | $lp: 1em; 2 | 3 | .egr-style-table { 4 | > .egr-fieldsets { 5 | border: 2px solid #ddd; 6 | > .egr-fieldset { 7 | border: none; 8 | margin-bottom: 0; 9 | padding-top: .5em; 10 | padding-right: .5em; 11 | 12 | &:last-child { 13 | border-bottom: 0; 14 | 15 | > .egr-actions { 16 | border-bottom: 0; 17 | } 18 | } 19 | 20 | > .egr-fields { 21 | > .field { 22 | padding-left: .5em; 23 | margin-bottom: .5em; 24 | } 25 | } 26 | > .egr-actions { 27 | width: calc(100% + .5em); 28 | } 29 | } 30 | } 31 | 32 | &.egr-odd { 33 | > .egr-fieldsets { 34 | > .egr-labels { 35 | background: #fff; 36 | } 37 | > .egr-fieldset > .egr-actions { 38 | border-bottom: 1px solid #ddd; 39 | } 40 | } 41 | } 42 | &.egr-even { 43 | > .egr-fieldsets { 44 | > .egr-labels { 45 | background: #eee; 46 | } 47 | > .egr-fieldset > .egr-actions { 48 | border-bottom: 1px solid #ccc; 49 | } 50 | } 51 | } 52 | } 53 | 54 | .egr-labels { 55 | padding-top: $lp; 56 | padding-right: $lp; 57 | border-bottom: 1px solid #ddd; 58 | 59 | > .field { 60 | margin-bottom: $lp / 2; 61 | padding-left: $lp !important; 62 | } 63 | } -------------------------------------------------------------------------------- /docs/advanced-for-plugin-developers.md: -------------------------------------------------------------------------------- 1 | # Advanced - For plugin developers 2 | 3 | #### Field controllers and field routes 4 | 5 | Fields using a field controller or a field route might get into trouble because the subfields of Engineer does not have a field controller or a field route of their own. It's more like a virtual field. 6 | 7 | #### Add and field javascript DOM 8 | 9 | Fields sometimes uses javascript to show a preview when the field changes. When a new field is added in engineer, it's done with javascript. Therefor the field not yet aware of that the DOM has been updated. In order to make it work well you need to save it first. Then it will load everything again with PHP and the field will be aware of the DOM again. 10 | 11 | For the built in fields, Engineer will solve it by forcing the fields to update themselves when adding a new item. The same thing can be done for plugins as well, but at the moment it needs to be triggered from inside Engineer. 12 | 13 | ### The results class 14 | 15 | If you use the results class to manipulate the data before it's saved, it can cause troubles with Engineer because it uses pure javascript to get the data. -------------------------------------------------------------------------------- /docs/blueprint.md: -------------------------------------------------------------------------------- 1 | # Blueprint 2 | 3 | Most of the engineer options are the same as the [structure field](https://getkirby.com/docs/cheatsheet/panel-fields/structure). 4 | 5 | ## Engineer field 6 | 7 | ### Basic example 8 | 9 | A basic example with two fields, one text field and one image field. 10 | 11 | **Blueprint** 12 | 13 | ```text 14 | fields: 15 | my_engineer: 16 | type: engineer 17 | fields: 18 | first: 19 | label: Text 20 | type: text 21 | second: 22 | label: Image 23 | type: image 24 | ``` 25 | 26 | **Content** 27 | 28 | ```text 29 | My_engineer: 30 | 31 | - 32 | first: "My first text" 33 | second: "flowers.jpg" 34 | - 35 | first: "Another text" 36 | second: "nature.jpg" 37 | ``` 38 | 39 | ### Advanced example 40 | 41 | A more advanced example where multiple fieldsets are used. Also it uses nested engineer fields. 42 | 43 | **Blueprint** 44 | 45 | ```text 46 | fields: 47 | my_engineer: 48 | type: engineer 49 | fieldsets: 50 | set1: 51 | fields: 52 | first: 53 | label: Engineer 54 | type: engineer 55 | fields: 56 | my_text: 57 | type: text 58 | my_image: 59 | type: image 60 | second: 61 | label: Image 62 | type: image 63 | set2: 64 | fields: 65 | first: 66 | type: text 67 | second: 68 | type: toggle 69 | ``` 70 | 71 | **Content** 72 | 73 | ```text 74 | My_engineer: 75 | 76 | - 77 | _fieldset: set1 78 | second: "flowers.jpg" 79 | first: 80 | - 81 | my_text: "First row inside" 82 | my_image: "nature.jpg" 83 | - 84 | my_text: "Second row inside" 85 | my_image: "nature.jpg" 86 | - 87 | _fieldset: set2 88 | first: "A set with a toggle field" 89 | second: 'false' 90 | ``` 91 | 92 | ### Engineer field options 93 | 94 | **label** 95 | 96 | It's optional but you can give the Engineer field a label if you like. 97 | 98 | **type** 99 | 100 | The `type` option needs to be set to `engineer`. 101 | 102 | **style** 103 | 104 | Set `style: table` to use a tabular layout. It does not work exactly as the structure field. With this field it's required to set a `width` of every sub field. Look at the built in `table.yml` blueprint to get inspiration. 105 | 106 | For a normal layout, just skip this option. 107 | 108 | **width** 109 | 110 | *Changed behavior from v0.6 to v0.7* 111 | 112 | The width of the engineer container. 113 | 114 | **rowWidth** 115 | 116 | The `rowWidth` works similar to field `width`. This option set the width of the fields or fieldset rows. 117 | 118 | In the example below, the field container will take `1/2` of the total width. Each added row take `1/3` of the container width. 119 | 120 | ```text 121 | my_engineer: 122 | type: engineer 123 | width: 1/2 124 | rowWidth: 1/3 125 | fields: 126 | text: 127 | type: text 128 | image: 129 | type: image 130 | ``` 131 | 132 | **fields** 133 | 134 | It works very similar to the [structure field](https://getkirby.com/docs/cheatsheet/panel-fields/structure). The best way to understand it is to look at the basic example. 135 | 136 | **fieldsets** 137 | 138 | Instead of fields you can use fieldsets. Then you can choose which set to use. To learn it, see the advanced example. 139 | 140 | **style** 141 | 142 | This option is similar to the structure field, but with Engineer the only style that can be set is `style: table`, or non at all. 143 | 144 | Keep these things in mind: 145 | 146 | - The sub field option `width` is required, leaving you in control. 147 | - Only use 1 `fieldset` or use `fields`. Else you will get the wrong table headings. 148 | - It's generates a table, so let the sub fields be on the same row. 149 | 150 | **buttons** 151 | 152 | If you don't use this option it will fallback to the following buttons: 153 | 154 | ```text 155 | buttons: 156 | - delete 157 | - clone 158 | - sort-up 159 | - sort-down 160 | - sort 161 | ``` 162 | 163 | --- 164 | 165 | [Read about supported fields](fields.md) -------------------------------------------------------------------------------- /docs/changelog.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | **v0.9** 4 | 5 | - **Feature** - `style: table` reimplemented. 6 | - **Enhancement** - Removed some html classes that was not needed for table labels. 7 | - **Bug fix** - Fixed error if table fieldset could not be found. 8 | - **Bug fix** - Engineer blueprints are now only registered if `engineer.debug` is on. 9 | - **Bug fix** - `style: table` label issue fixed. Thanks [Dreytac](https://github.com/Dreytac). 10 | 11 | **v0.8** 12 | 13 | - **Test** - Blueprint `panel-fields.yml` that tests all supported native fields built into the Panel. 14 | - **Test** - Blueprint `supported-fields.yml` that tests custom made fields that are supported by Engineer. 15 | - **Test** - Blueprint `working-fields.yml` that tests custom made fields that should work out of the box. 16 | - **Test** - Blueprint `grid.yml` that tests `width`, `rowWidth` and `buttons` on multiple levels. 17 | - **Test** - Blueprint `nesting.yml` that tests nesting on multiple levels. 18 | - **Test** - Blueprint `fieldsets.yml` that tests `fields`, `fieldsets` and empty sets on multiple levels. 19 | - **Test** - Blueprint `options.yml` that tests field options `default`, `icon`, `readonly`, `help`, `placeholder` and `required`. 20 | - **Enhancement** - It's now possible to click outside a field to hide the action bar. 21 | 22 | **v0.7** 23 | 24 | - **Feature** - Delete warning message. 25 | - **Feature** - Delete area preview. 26 | - **Feature** - Tests added. Blueprints are registered if `engineer.debug` is set to `true`. 27 | - **Breaking change** - The `width` option for rows is renamed `rowWidth` instead. It will make it more future proof and prevent collisions with `width` on the root of the engineer field. 28 | - **Breaking change** - The option `engineer.label.fallback` is removed. No good reason for a label fallback. 29 | - **Bug fixes** - Minor issues. 30 | - **Docs** - Because of some recent Panel bugs I pushed the requirement to Kirby 2.5.2. 31 | - ~~**Field** - [Kirby list field](https://github.com/TimOetting/kirby-list-field) is now supported.~~ (a dom bug remains) 32 | 33 | **v0.6** 34 | 35 | - Feature - Blueprint option to choose which buttons to use. 36 | - Feature - Blueprint option `width` can now be set to engineer fields. 37 | - Improved the dropdown arrow position. 38 | - Improved the trash icon to look like the Panel trash icon. 39 | - Improved the action button bar ui. 40 | - Improved "Add the first entry" with icons to show if it's containing fields or fieldsets. 41 | - Removed labels from the action buttons to save space for small fields. 42 | - Removed border for [Kirby Images](https://github.com/medienbaecker/kirby-images). The css is now handled by Kirby Images instead. 43 | - Field [Kirby date field](https://github.com/iksi/KirbyDateField) works with Engineer. 44 | - Field [Kirby time field](https://github.com/iksi/KirbyTimeField) works with Engineer. 45 | - Field [Kirby country field](https://github.com/iksi/KirbyCountryField) works with Engineer. 46 | - Field [Kirby decimal field](https://github.com/iksi/KirbyDecimalField) works with Engineer. 47 | - Docs - Separated [field plugins](fields.md#plugin-fields) that works "out of the box" from the "supported" ones. 48 | - Docs - [Troubleshooting](troubleshooting.md) steps added. 49 | 50 | **v0.5** 51 | 52 | - Added requirement: PHP7+ 53 | - Support for multi language setup 54 | - Support for Kirby 2.5.1 55 | - Support for [Controlled list](https://github.com/rasteiner/controlledlist) 56 | - Support for [Kirby Images](https://github.com/medienbaecker/kirby-images) 57 | - Support for [Kirby Hero Field](https://github.com/jenstornell/kirby-hero-field) 58 | - Support for [Kirby Logic Field](https://github.com/jenstornell/kirby-logic-field) 59 | - Support for [Kirby Quickselect](https://github.com/medienbaecker/kirby-quickselect) 60 | - Support for [Select a structure](https://github.com/CalebGrove/select-a-structure) 61 | - Support for [Switch field](https://github.com/distantnative/field-switch) 62 | 63 | **rc-0.4** 64 | 65 | - Complete rewrite 66 | - Feature - Nesting with unlimted levels 67 | - Feature - Sorting arrows 68 | - Feature - Fieldsets 69 | - Feature - Clone 70 | - Feature - Debug option `c::set('engineer.debug')` 71 | - Feature - Label fallback option `c::set('engineer.label.fallback')` 72 | - Fix - Default value 73 | - Fix - Counter for min/max 74 | - Fix - Headline 75 | - On hold - `style: table` does not work in this version 76 | 77 | **beta v0.3** 78 | 79 | - Fixed bug with th position 80 | - Fixed bug with table sort jumping 81 | - Fixed bug with checkboxes `option: children` 82 | - Fixed bug with textarea autosize after adding new item 83 | - Fixed bug frontend crasch. Only run plugin in the panel. 84 | 85 | **beta v0.2** 86 | 87 | - Lots of big changes 88 | 89 | **beta v0.1** 90 | 91 | - Initial release -------------------------------------------------------------------------------- /docs/compare.md: -------------------------------------------------------------------------------- 1 | # Comparation 2 | 3 | To know what field you should use you can use this comparation table. 4 | 5 | | Feature | Engineer | [Builder](https://github.com/TimOetting/kirby-builder) | [Structure](https://getkirby.com/docs/cheatsheet/panel-fields/structure) 6 | | -------------------------------------------------------- | ---------- | -------- | --------- 7 | | Inline editing (no modal) | Yes | - | - 8 | | Nesting without limit | Yes | - | - 9 | | Fieldsets | Yes | Yes | - 10 | | Show images in the output | Yes | Yes | - 11 | | Built in field support | Partly | - | Yes 12 | | Plugin field support | Partly | - | Yes 13 | | Custom validators | - | Yes | Yes 14 | | Row limit | - | - | Yes 15 | | **Price** | **50 EUR** | **Free** | **Free** 16 | 17 | *If the information above is no longer accurate, just add an issue about it* 18 | 19 | ## Custom validators 20 | 21 | *Not supported - Here is the reason behind it:* 22 | 23 | [Custom validators](https://getkirby.com/docs/developer-guide/objects/validators) does not work with Engineer. The are a few reasons why it's not supported. Speed and usability are two of the reasons. 24 | 25 | Engineer uses an inline approach with pure javascript. It has no delay when adding new fields, so you can add many fields very quickly. 26 | 27 | Even if Engineer does not support custom validators, it does support html5 form validation. For example, a number field will warn you if it's not a number. Engineer also escapes the data when needed before saving it. 28 | 29 | ## Built in field support 30 | 31 | Engineer has some limitations but it supports almost every built in field. Read more about the [field support](docs/fields.md). 32 | 33 | ## Plugin field support 34 | 35 | Most plugins will probably work out of the box, but there are some limitations. You need to try it out and see if it works. In the future I will probably add a list with supported plugin fields as well. 36 | 37 | ## Row limit 38 | 39 | It's a planned feature but is not implemented in the current version. 40 | 41 | ## License needed 42 | 43 | If you already bought a Kirby license, then the Structure field is free to use, because it's built in. 44 | 45 | Engineer field have been taken some time to develop so I made the decision to take a license fee for it. That way I can continue to maintain it. -------------------------------------------------------------------------------- /docs/examples.md: -------------------------------------------------------------------------------- 1 | # Example from `readme.md` 2 | 3 | If you want to recreate the example from the `readme.md`, here you go... 4 | 5 | **Screenshot** 6 | 7 | ![Screenshot](https://raw.githubusercontent.com/jenstornell/field-engineer/development/docs/hero.png) 8 | 9 | **Blueprint** 10 | 11 | ```text 12 | fields: 13 | my_engineer: 14 | type: engineer 15 | fields: 16 | my_image: 17 | label: Image 18 | type: image 19 | my_engineer: 20 | label: Engineer 21 | type: engineer 22 | fieldsets: 23 | set1: 24 | label: Set 1 25 | fields: 26 | my_image: 27 | type: image 28 | width: 1/2 29 | my_text: 30 | type: text 31 | width: 1/2 32 | set2: 33 | label: Set 2 34 | fields: 35 | my_toggle: 36 | label: Toggle 37 | type: toggle 38 | width: 1/2 39 | my_date: 40 | label: Date 41 | type: date 42 | width: 1/2 43 | ``` -------------------------------------------------------------------------------- /docs/fields.md: -------------------------------------------------------------------------------- 1 | # Fields 2 | 3 | ## Table of contents 4 | 5 | 1. [Subfields](#subfields) 6 | 1. [Subfield options](#subfields) 7 | 1. [Plugin fields](#plugin-fields) 8 | 9 | ### Subfields 10 | 11 | Most of the built in Kirby fields will work as subfields to Engineer. 12 | 13 | | Type | Supported | Comment 14 | | ---------------------------------------------------------------------------- | --------- | ------- 15 | | [`checkbox`](https://getkirby.com/docs/cheatsheet/panel-fields/checkbox) | Yes |  16 | | [`checkboxes`](https://getkirby.com/docs/cheatsheet/panel-fields/checkboxes) | Yes |  17 | | [`date`](https://getkirby.com/docs/cheatsheet/panel-fields/date) | Yes |  18 | | [`datetime`](https://getkirby.com/docs/cheatsheet/panel-fields/datetime) | Yes |  19 | | [`email`](https://getkirby.com/docs/cheatsheet/panel-fields/email) | Yes |  20 | | [`headline`](https://getkirby.com/docs/cheatsheet/panel-fields/headline) | Yes |  21 | | [`hidden`](https://getkirby.com/docs/cheatsheet/panel-fields/hidden) | - |  22 | | [`image`](https://getkirby.com/docs/cheatsheet/panel-fields/image) | Yes |  23 | | [`info`](https://getkirby.com/docs/cheatsheet/panel-fields/info) | Yes |  24 | | [`line`](https://getkirby.com/docs/cheatsheet/panel-fields/line) | Yes |  25 | | [`number`](https://getkirby.com/docs/cheatsheet/panel-fields/number) | Yes |  26 | | [`page`](https://getkirby.com/docs/cheatsheet/panel-fields/page) | Yes |  27 | | [`radio`](https://getkirby.com/docs/cheatsheet/panel-fields/radiobuttons) | Yes |  28 | | [`select`](https://getkirby.com/docs/cheatsheet/panel-fields/select) | Yes |  29 | | [`structure`](https://getkirby.com/docs/cheatsheet/panel-fields/structure) | - |  30 | | [`tags`](https://getkirby.com/docs/cheatsheet/panel-fields/tags) | - | DOM issues 31 | | [`tel`](https://getkirby.com/docs/cheatsheet/panel-fields/tel) | Yes |  32 | | [`text`](https://getkirby.com/docs/cheatsheet/panel-fields/text) | Yes |  33 | | [`textarea`](https://getkirby.com/docs/cheatsheet/panel-fields/textarea) | Yes | Without help buttons 34 | | [`time`](https://getkirby.com/docs/cheatsheet/panel-fields/time) | Yes |  35 | | [`toggle`](https://getkirby.com/docs/cheatsheet/panel-fields/toggle) | Yes |  36 | | [`url`](https://getkirby.com/docs/cheatsheet/panel-fields/url) | Yes |  37 | | [`user`](https://getkirby.com/docs/cheatsheet/panel-fields/user) | Yes |  38 | 39 | ### Subfield options 40 | 41 | Most of the Kirby field options will work. Be aware that these are the options of an Engineer subfield, not of the Engineer itself. 42 | 43 | | Option | Supported | Comment 44 | | ------------------------------------------------------------------------------------------------------------------- | --------- | -------- 45 | | [`default`](https://getkirby.com/docs/panel/blueprints/form-fields#default-values) | Yes |  46 | | [`help`](https://getkirby.com/docs/panel/blueprints/form-fields#field-instructions) | Yes |  47 | | [`icon`](https://getkirby.com/docs/panel/blueprints/form-fields#custom-icons) | Yes |  48 | | [`label`](https://getkirby.com/docs/panel/blueprints/form-fields) | Yes |  49 | | [`placeholder`](https://getkirby.com/docs/panel/blueprints/form-fields#placeholders) | Yes |  50 | | [`readonly`](https://getkirby.com/docs/panel/blueprints/form-fields#readonly-fields) | Yes |  51 | | [`required`](https://getkirby.com/docs/panel/blueprints/form-fields#required-fields) | Yes |  52 | | [`translate`](https://getkirby.com/docs/panel/blueprints/form-fields#prevent-field-values-in-non-default-languages) | - |  53 | | [`translations`](https://getkirby.com/docs/panel/blueprints/form-fields#translating-form-fields) | - |  54 | | [`type`](https://getkirby.com/docs/panel/blueprints/form-fields) | Yes |  55 | | [`validate`](https://getkirby.com/docs/panel/blueprints/form-fields#validation) | - | Only min / max with js 56 | | [`width`](https://getkirby.com/docs/panel/blueprints/form-fields#creating-grids) | Yes |   57 | 58 | ## Plugin fields 59 | 60 | Many fields will work out of the box with Engineer. Here are a few of the most popular relevant fields that works. 61 | 62 | ### Works out of the box 63 | 64 | | Plugin field | Tested | Has blueprint test 65 | | ----------------------------------------------------------------------- | --------------------------- 66 | | [Controlled list](https://github.com/rasteiner/controlledlist) | Yes | Yes 67 | | [Kirby date field](https://github.com/iksi/KirbyDateField) | Yes | - 68 | | [Kirby country field](https://github.com/iksi/KirbyCountryField) | Yes | Tes 69 | | [Kirby decimal field](https://github.com/iksi/KirbyDecimalField) | Yes | Yes 70 | | [Kirby Logic Field](https://github.com/jenstornell/kirby-logic-field) | Yes | Yes 71 | | [Kirby time field](https://github.com/iksi/KirbyTimeField) | Yes | - 72 | | [Select a structure](https://github.com/CalebGrove/select-a-structure) | Yes | Yes 73 | | [Switch field](https://github.com/distantnative/field-switch) | Yes | Yes 74 | 75 | ### Supported by Engineer 76 | 77 | | Plugin field | Supported | Has blueprint test 78 | | ----------------------------------------------------------------------- | ------------------------------ 79 | | [Kirby Hero Field](https://github.com/jenstornell/kirby-hero-field) | Yes | Yes 80 | | [Kirby Images](https://github.com/medienbaecker/kirby-images) | Yes | Yes 81 | | [Kirby Quickselect](https://github.com/medienbaecker/kirby-quickselect) | Yes | Yes -------------------------------------------------------------------------------- /docs/fieldsets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirby-deprecated-plugins/field-engineer/26b9602176d4a043f92778c0fdba2fa52ae0ea71/docs/fieldsets.png -------------------------------------------------------------------------------- /docs/hero.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirby-deprecated-plugins/field-engineer/26b9602176d4a043f92778c0fdba2fa52ae0ea71/docs/hero.png -------------------------------------------------------------------------------- /docs/install.md: -------------------------------------------------------------------------------- 1 | # Installation 2 | 3 | Use **one** of the alternatives below. 4 | 5 | ## Kirby CLI 6 | 7 | If you are using the [Kirby CLI](https://github.com/getkirby/cli) you can install this plugin by running the following commands in your shell: 8 | 9 | ```text 10 | $ cd path/to/kirby 11 | $ kirby plugin:install jenstornell/field-engineer 12 | ``` 13 | 14 | ## Clone or download 15 | 16 | 1. [Clone](https://github.com/jenstornell/field-engineer.git) or [download](https://github.com/jenstornell/field-engineer/archive/master.zip) this repository. 17 | 2. Unzip the archive if needed and rename the folder to `field-engineer`. 18 | 19 | **Make sure that the plugin folder structure looks like this:** 20 | 21 | ```text 22 | site/plugins/field-engineer/ 23 | ``` 24 | 25 | ## Git Submodule 26 | 27 | If you know your way around Git, you can download this plugin as a submodule: 28 | 29 | ```text 30 | $ cd path/to/kirby 31 | $ git submodule add https://github.com/jenstornell/field-engineer site/plugins/field-engineer 32 | ``` -------------------------------------------------------------------------------- /docs/license.md: -------------------------------------------------------------------------------- 1 | # License 2 | 3 | ## Disclaimer 4 | 5 | This plugin is provided "as is" with no guarantee. Use it at your own risk and always test it yourself before using it in a production environment. If you find any issues, please [create a new issue](https://github.com/jenstornell/field-engineer/issues/new). 6 | 7 | ## Try it out first 8 | 9 | Try it out on a development environment before you buy. You don't need to pay before you are happy with the plugin. 10 | 11 | ## When you need a license 12 | 13 | When you are using it for a live project, you need to pay a license for it. You need one license for each domain. 14 | 15 | ## When you don't need a license 16 | 17 | - Test environments for trying the plugin 18 | - Development and staging enviroments, which are not ment for public use 19 | - Backups 20 | 21 | ## Support 22 | 23 | No support are included in the license. However, I try to always be helpful. You can [create a new issue](https://github.com/jenstornell/field-engineer/issues/new) if you get into some kind of trouble. 24 | 25 | ## Refunds 26 | 27 | Refunds are not supported. 28 | 29 | ## License code 30 | 31 | You will not get a license code for this plugin, at least not with this version. 32 | 33 | ## Purchase 34 | 35 | Buying licenses is a good way to support this project. 36 | 37 | ***The purchase button is temporary disabled*** 38 | 39 | **Price:** 50 EUR (on each project/domain) -------------------------------------------------------------------------------- /docs/nesting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirby-deprecated-plugins/field-engineer/26b9602176d4a043f92778c0fdba2fa52ae0ea71/docs/nesting.png -------------------------------------------------------------------------------- /docs/options.md: -------------------------------------------------------------------------------- 1 | # Options 2 | 3 | ```php 4 | c::set('engineer.debug', false); 5 | ``` 6 | 7 | ### engineer.debug 8 | 9 | If this option is set to `true`, it's possible to see the pre-generated outline, as well as an output textarea. It can be useful for debugging. -------------------------------------------------------------------------------- /docs/presentation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirby-deprecated-plugins/field-engineer/26b9602176d4a043f92778c0fdba2fa52ae0ea71/docs/presentation.png -------------------------------------------------------------------------------- /docs/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirby-deprecated-plugins/field-engineer/26b9602176d4a043f92778c0fdba2fa52ae0ea71/docs/screenshot.png -------------------------------------------------------------------------------- /docs/screenshots.md: -------------------------------------------------------------------------------- 1 | # Screenshots 2 | 3 | Here are some different examples of what you can do. 4 | 5 | **Field rows** 6 | 7 | Add an unlimted number of rows with fields. 8 | 9 | [![Field rows](presentation.png)](docs/presentation.png) 10 | 11 | **Fieldsets** 12 | 13 | If needed, you can use a set of fields to output different kind of field rows. 14 | 15 | [![Fieldsets](fieldsets.png)](docs/fieldsets.png) 16 | 17 | **Nesting** 18 | 19 | It's possible nest Engineer fields in the blueprint. There is no depth limit. 20 | 21 | [![Nesting](nesting.png)](docs/nesting.png) 22 | 23 | **Sorting** 24 | 25 | Sort the rows by drag and drop or by the sort arrows. 26 | 27 | [![Sorting](sorting.png)](docs/sorting.png) -------------------------------------------------------------------------------- /docs/sorting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kirby-deprecated-plugins/field-engineer/26b9602176d4a043f92778c0fdba2fa52ae0ea71/docs/sorting.png -------------------------------------------------------------------------------- /docs/templates-snippets.md: -------------------------------------------------------------------------------- 1 | # Templates and snippets 2 | 3 | Engineer saved the data similar to the [structure](https://getkirby.com/docs/cheatsheet/panel-fields/structure) field. 4 | 5 | ### toStructure 6 | 7 | If you only use one level in depth and don't use multiple fieldsets you should be fine using [toStructure](https://getkirby.com/docs/cheatsheet/field-methods/toStructure). 8 | 9 | ### yaml 10 | 11 | If you use a more complex structure you can use [yaml as a custom field method](https://getkirby.com/docs/cheatsheet/field-methods/yaml) or the [yaml method](https://getkirby.com/docs/toolkit/api/helpers/yaml). -------------------------------------------------------------------------------- /docs/troubleshooting.md: -------------------------------------------------------------------------------- 1 | # Troubleshooting 2 | 3 | ## Why an error can appear 4 | 5 | ### Blueprint has changed 6 | 7 | The most common reason for an error is by my experience when you have saved data in the Engineer field and then change the blueprint. Maybe a field type is changed or something structural. That can make Engineer confused on how to read the data and in some cases throw an error. 8 | 9 | ## Prevent errors 10 | 11 | First of all, in most cases you can change things in the blueprint without breaking Engineer, even when you have data saved. 12 | 13 | - The provent errors from happening, set up the blueprint structure first and add things to it after that. 14 | - If you need to change something, it's often safer to add something new than to edit the field type when the field already has content. 15 | 16 | ## On error 17 | 18 | If you are experience an error, there are some things you can do. 19 | 20 | ### Logout 21 | 22 | In some cases the data is stored in the session. You can try to logout and then login again. That way the session is cleaned up. 23 | 24 | ### Reset content 25 | 26 | If the logout solution does not work, the problem might be that the content does no longer match the blueprint. Try to manually delete the rows in the content text file that has to do with the Engineer field. 27 | 28 | ### Turn debug on 29 | 30 | To see more of what the Engineer field does, turn debug mode on by adding this line to your `config.php`: 31 | 32 | ```php 33 | c::set('engineer.debug', true); 34 | ``` 35 | 36 | ### Ask the forum 37 | 38 | If it's a support question, you can ask it on https://forum.getkirby.com. You can tag me with @jenstornell to make me aware of the question. 39 | 40 | ### Add an issue 41 | 42 | Maybe it's not your fault at all, but you have actually found a bug. In that case [create a new issue](https://github.com/jenstornell/field-engineer/issues/new) and I will look into it. -------------------------------------------------------------------------------- /docs/usage.md: -------------------------------------------------------------------------------- 1 | # Usage 2 | 3 | ## Edit an item 4 | 5 | As you can see on the screenshot below there is only one row containing the buttons delete, clone etc. That's because you first need to click on the item you want to edit. 6 | 7 | In this case I've clicked on the "nature" item. You could for example instead have clicked on the "toggle" item, or the whole white block which is an item as well. 8 | 9 | ![Screenshot](hero.png) 10 | 11 | ## Buttons explained 12 | 13 | ### Delete 14 | 15 | Deletes the current item. Be aware! This can NOT be undone! 16 | 17 | ### Clone 18 | 19 | It will make a clone/copy of the current item including it's sub items and will place it directly after the original. 20 | 21 | ### Sorting 22 | 23 | **Sort down** 24 | 25 | In the screenshot, there is an arrow down. Clicking on it will make the item move one step down in the current level. On this item there is no arrow up because we are already on the first item. 26 | 27 | **Sort up** 28 | 29 | The arrow up will do the same thing but up one step and it will be shown on items that have at least one item above. 30 | 31 | **Drag & Drop** 32 | 33 | With the arrow move cross you can drag and drop an item to sort it. It's only possible to sort an item to other items within the same level. 34 | 35 | ### Add - With an arrow down icon 36 | 37 | The arrow down icon next to the "Add" button indicates that there are more than one fieldset. Clicking it will bring a dropdown list for you to select the fieldset you want. 38 | 39 | ### Add - With a plus icon 40 | 41 | The plus icon next to the "Add" button indicates that there is only one fieldset. Clicking it will add a new set with fields. -------------------------------------------------------------------------------- /field-engineer.php: -------------------------------------------------------------------------------- 1 | user()) { 3 | require_once __DIR__ . DS . 'lib' . DS . 'form.php'; 4 | require_once __DIR__ . DS . 'lib' . DS . 'field.php'; 5 | require_once __DIR__ . DS . 'lib' . DS . 'tpl.php'; 6 | require_once __DIR__ . DS . 'lib' . DS . 'presentation.php'; 7 | require_once __DIR__ . DS . 'lib' . DS . 'presentation-array.php'; 8 | require_once __DIR__ . DS . 'lib' . DS . 'outline.php'; 9 | 10 | if(c::get('engineer.debug', false)) { 11 | c::set('plugin.logic.field', function($field, $page) { 12 | return '

Field name: ' . $field->name() . '
Panel page: ' . $page->title() . '

'; 13 | }); 14 | 15 | foreach(glob(__DIR__ . DS . 'tests' . DS . 'blueprints' . DS . '*') as $filename) { 16 | $parts = pathinfo($filename); 17 | $kirby->set('blueprint', $parts['filename'], $filename); 18 | } 19 | 20 | class MyPlugin { 21 | static function userlist($field) { 22 | $kirby = kirby(); 23 | $site = $kirby->site(); 24 | $users = $site->users(); 25 | 26 | $result = array(); 27 | 28 | foreach ($users as $user) { 29 | $result[$user->username] = $user->firstName() . ' ' . $user->lastName(); 30 | } 31 | 32 | return $result; 33 | } 34 | } 35 | } 36 | 37 | $kirby->set('field', 'engineer', __DIR__ . DS . 'fields' . DS . 'engineer'); 38 | } -------------------------------------------------------------------------------- /fields/engineer/assets/css/style.css: -------------------------------------------------------------------------------- 1 | .egr { 2 | margin-left: -1.5em; 3 | margin-bottom: -1.5em; } 4 | 5 | .egr-row { 6 | margin-left: 1.5em; 7 | width: calc(100% - 1.5em); 8 | padding-bottom: 1.5em; } 9 | 10 | .egr-fieldsets { 11 | position: relative; } 12 | 13 | .egr-fieldset { 14 | padding-top: 1.5em; 15 | padding-right: 1.5em; 16 | border: 2px solid #ddd; 17 | background: #fff; 18 | position: relative; } 19 | 20 | .egr-even > .egr-fieldsets > .egr-fieldset { 21 | background: #eee; } 22 | 23 | .egr-outline { 24 | display: none; } 25 | 26 | .egr-fields { 27 | flex: 1; } 28 | 29 | .egr-actions { 30 | width: calc(100% + 1.5em); 31 | display: none; 32 | justify-content: center; 33 | border-top: 1px solid #ddd; } 34 | .egr-actions > * { 35 | height: 2.5em; 36 | line-height: 2.5em; 37 | cursor: pointer; 38 | padding-right: 1.5em; 39 | padding-left: 1.5em; 40 | user-select: none; 41 | border-right: 1px solid #ddd; } 42 | .egr-actions > *:last-child { 43 | border-right: none; } 44 | 45 | .egr-even .egr-actions { 46 | border-top: 1px solid #ccc; } 47 | .egr-even .egr-actions > * { 48 | border-right: 1px solid #ccc; } 49 | .egr-even .egr-actions > *:last-child { 50 | border-right: none; } 51 | 52 | .egr-row[data-count="0"] > .egr-empty { 53 | display: block; } 54 | 55 | .egr-row[data-count="0"] > .egr-row-actions { 56 | display: none; } 57 | 58 | .egr-dropdown-active .egr-add-button:before { 59 | display: block; } 60 | 61 | .egr-dropdown { 62 | position: absolute; 63 | background: #000; 64 | border-radius: 4px; 65 | right: 0; 66 | z-index: 10000; 67 | display: none; 68 | margin-top: .4em; } 69 | .egr-dropdown:before { 70 | content: ''; 71 | border-left: .4em solid transparent; 72 | border-right: .4em solid transparent; 73 | border-bottom: .4em solid #000; 74 | position: absolute; 75 | left: 50%; 76 | top: 0; 77 | margin-top: -.3em; } 78 | 79 | .egr-empty .egr-dropdown:before { 80 | left: 2em; } 81 | 82 | .egr-row-actions .egr-dropdown:before { 83 | left: calc(100% - 2.4em); } 84 | 85 | .egr-dropdown-active .egr-dropdown { 86 | display: block; } 87 | 88 | .egr-dropdown-active .egr-add-button .icon { 89 | transform: rotateX(180deg); } 90 | 91 | .egr-empty { 92 | padding: 1.5em; 93 | background: #ddd; 94 | display: none; } 95 | .egr-empty .egr-add-button { 96 | border-bottom: 2px solid #aaa; 97 | cursor: pointer; 98 | position: relative; 99 | display: inline-block; } 100 | .egr-empty .egr-add-button .egr-dropdown { 101 | right: auto; 102 | margin-top: .7em; } 103 | 104 | .egr-output { 105 | margin-left: 1.5em; 106 | width: calc(100% - 1.5em); 107 | padding-bottom: 1.5em; 108 | display: none; } 109 | .egr-output textarea { 110 | width: 100%; 111 | height: 300px; 112 | border: 2px solid #ddd; 113 | padding: .5em; 114 | font-size: .9em; 115 | outline: none; } 116 | 117 | .egr-outline { 118 | opacity: .5; } 119 | 120 | .egr .ui-sortable-helper { 121 | border-bottom: 2px solid #ddd; } 122 | 123 | .egr-presentation .egr-fieldset:first-child > .egr-actions > .egr-sort-up { 124 | display: none; } 125 | 126 | .egr-presentation .egr-fieldset:last-child > .egr-actions > .egr-sort-down { 127 | display: none; } 128 | 129 | .egr-presentation .egr-fieldset:only-child > .egr-actions > .egr-sort-up, 130 | .egr-presentation .egr-fieldset:only-child > .egr-actions > .egr-sort-down, 131 | .egr-presentation .egr-fieldset:only-child > .egr-actions > .egr-sorting { 132 | display: none; } 133 | 134 | .egr-row-actions { 135 | margin-top: .5em; } 136 | .egr-row-actions:after { 137 | clear: both; 138 | content: ''; 139 | display: table; } 140 | 141 | .egr-add-button { 142 | cursor: pointer; 143 | display: inline-block; 144 | position: relative; 145 | user-select: none; } 146 | .egr-add-button span { 147 | color: #777; } 148 | .egr-add-button:hover span { 149 | color: #000; } 150 | 151 | .egr-add { 152 | float: right; } 153 | 154 | .egr-add-select { 155 | padding: .75em 1.5em .75em 1.5em; 156 | color: #fff; 157 | border-bottom: 1px solid #222; 158 | white-space: nowrap; 159 | cursor: pointer; 160 | user-select: none; } 161 | .egr-add-select:hover { 162 | color: #999; } 163 | .egr-add-select:last-child { 164 | border-bottom: 0; } 165 | 166 | .egr-dropdown-active .egr-add-button:before { 167 | display: block; } 168 | 169 | .egr-grid-item { 170 | display: flex; 171 | flex-wrap: wrap; } 172 | 173 | .egr-fieldset { 174 | width: 100%; 175 | display: flex; 176 | flex-direction: column; 177 | justify-content: space-between; } 178 | 179 | @media screen and (min-width: 60em) { 180 | .egr-grid-item { 181 | width: calc(100% + 1.5em); } 182 | .egr-fieldset { 183 | margin-right: 1.5em; 184 | margin-bottom: 1.5em; } 185 | .egr-grid-item-1-2 > .egr-fieldset { 186 | width: calc(100% / 2 - 1.5em); } 187 | .egr-grid-item-1-3 > .egr-fieldset { 188 | width: calc(100% / 3 - 1.5em); } 189 | .egr-grid-item-1-4 > .egr-fieldset { 190 | width: calc(100% / 4 - 1.5em); } 191 | .egr-grid-item-1-5 > .egr-fieldset { 192 | width: calc(100% / 5 - 1.5em); } } 193 | 194 | .egr-element-delete { 195 | width: calc(100% + 1.5em); 196 | z-index: 100; 197 | background: #fff; 198 | display: flex; } 199 | .egr-element-delete .egr-delete-message { 200 | padding: 1.5em; 201 | position: relative; 202 | background: #fff; 203 | margin: 0 auto; } 204 | 205 | .egr-delete-buttons { 206 | max-width: 20em; 207 | justify-content: space-between; 208 | display: flex; 209 | margin-top: .5em; } 210 | .egr-delete-buttons > * { 211 | cursor: pointer; 212 | line-height: 2em; } 213 | 214 | .egr-delete-cancel { 215 | padding: 0 .5em; 216 | color: #777; 217 | border: 2px solid transparent; } 218 | .egr-delete-cancel span { 219 | border-bottom: 2px solid #eee; } 220 | .egr-delete-cancel:hover { 221 | color: #000; } 222 | .egr-delete-cancel:hover span { 223 | border-bottom: 2px solid #ccc; } 224 | 225 | .egr-delete-apply { 226 | border-radius: .3em; 227 | padding: 0 1em; 228 | color: #b3000a; 229 | border: 2px solid #b3000a; 230 | font-weight: bold; } 231 | .egr-delete-apply:hover { 232 | color: #fff; 233 | background: #b3000a; } 234 | 235 | .egr-delete-active { 236 | position: relative; } 237 | 238 | .egr-delete-active .egr-fields:before { 239 | content: ''; 240 | display: block; 241 | position: absolute; 242 | top: 0; 243 | left: 0; 244 | background: #b3000a; 245 | width: 100%; 246 | height: 100%; 247 | z-index: 1; 248 | opacity: .2; } 249 | 250 | .egr-style-table > .egr-fieldsets { 251 | border: 2px solid #ddd; } 252 | .egr-style-table > .egr-fieldsets > .egr-fieldset { 253 | border: none; 254 | margin-bottom: 0; 255 | padding-top: .5em; 256 | padding-right: .5em; } 257 | .egr-style-table > .egr-fieldsets > .egr-fieldset:last-child { 258 | border-bottom: 0; } 259 | .egr-style-table > .egr-fieldsets > .egr-fieldset:last-child > .egr-actions { 260 | border-bottom: 0; } 261 | .egr-style-table > .egr-fieldsets > .egr-fieldset > .egr-fields > .field { 262 | padding-left: .5em; 263 | margin-bottom: .5em; } 264 | .egr-style-table > .egr-fieldsets > .egr-fieldset > .egr-actions { 265 | width: calc(100% + .5em); } 266 | 267 | .egr-style-table.egr-odd > .egr-fieldsets > .egr-labels { 268 | background: #fff; } 269 | 270 | .egr-style-table.egr-odd > .egr-fieldsets > .egr-fieldset > .egr-actions { 271 | border-bottom: 1px solid #ddd; } 272 | 273 | .egr-style-table.egr-even > .egr-fieldsets > .egr-labels { 274 | background: #eee; } 275 | 276 | .egr-style-table.egr-even > .egr-fieldsets > .egr-fieldset > .egr-actions { 277 | border-bottom: 1px solid #ccc; } 278 | 279 | .egr-labels { 280 | padding-top: 1em; 281 | padding-right: 1em; 282 | border-bottom: 1px solid #ddd; } 283 | .egr-labels > .field { 284 | margin-bottom: 0.5em; 285 | padding-left: 1em !important; } 286 | 287 | /*# sourceMappingURL=style.css.map */ 288 | -------------------------------------------------------------------------------- /fields/engineer/assets/css/style.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"style.css","sources":["style.scss","skeleton.scss","action-items.scss","has-fieldsets.scss","dropdown.scss","empty.scss","output.scss","outline.scss","sort.scss","row-actions.scss","plugins.scss","grid.scss","delete-message.scss","table.scss"],"sourcesContent":["@import 'skeleton';\r\n@import 'action-items';\r\n@import 'has-fieldsets';\r\n@import 'dropdown';\r\n@import 'empty';\r\n@import 'output';\r\n@import 'outline';\r\n@import 'sort';\r\n@import 'row-actions';\r\n@import 'plugins';\r\n@import 'grid';\r\n@import 'delete-message';\r\n@import 'table';",".egr {\r\n\tmargin-left: -1.5em;\r\n\tmargin-bottom: -1.5em;\r\n}\r\n\r\n.egr-row {\r\n\tmargin-left: 1.5em;\r\n\twidth: calc(100% - 1.5em);\r\n\tpadding-bottom: 1.5em;\r\n}\r\n\r\n.egr-fieldsets {\r\n\tposition: relative;\r\n}\r\n\r\n.egr-fieldset {\r\n\tpadding-top: 1.5em;\r\n\tpadding-right: 1.5em;\r\n\tborder: 2px solid #ddd;\r\n\tbackground: #fff;\r\n\tposition: relative;\r\n}\r\n\r\n.egr-even > .egr-fieldsets > .egr-fieldset {\r\n\tbackground: #eee;\r\n}\r\n\r\n.egr-outline {\r\n\tdisplay: none;\r\n}\r\n\r\n.egr-fields {\r\n\tflex: 1;\r\n}",".egr-actions {\r\n\twidth: calc(100% + 1.5em);\r\n\tdisplay: none;\r\n\tjustify-content: center;\r\n\tborder-top: 1px solid #ddd;\r\n\r\n\t> * {\r\n\t\theight: 2.5em;\r\n\t\tline-height: 2.5em;\r\n\t\tcursor: pointer;\r\n\t\tpadding-right: 1.5em;\r\n\t\tpadding-left: 1.5em;\r\n\t\tuser-select: none;\r\n\t\tborder-right: 1px solid #ddd;\r\n\r\n\t\t&:last-child {\r\n\t\t\tborder-right: none;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n.egr-even .egr-actions {\r\n\tborder-top: 1px solid #ccc;\r\n\r\n\t> * {\r\n\t\tborder-right: 1px solid #ccc;\r\n\r\n\t\t&:last-child {\r\n\t\t\tborder-right: none;\r\n\t\t}\r\n\t}\r\n}",".egr-row[data-count=\"0\"] > .egr-empty {\r\n\tdisplay: block;\r\n}\r\n.egr-row[data-count=\"0\"] > .egr-row-actions {\r\n\tdisplay: none;\r\n}\r\n\r\n.egr-dropdown-active .egr-add-button:before {\r\n\tdisplay: block;\r\n}",".egr-dropdown {\r\n\tposition: absolute;\r\n\tbackground: #000;\r\n\tborder-radius: 4px;\r\n\tright: 0;\r\n\tz-index: 10000;\r\n\tdisplay: none;\r\n\tmargin-top: .4em;\r\n\r\n\t&:before {\r\n\t\tcontent: '';\r\n\t\tborder-left: .4em solid transparent;\r\n\t\tborder-right: .4em solid transparent;\r\n\t\tborder-bottom: .4em solid #000;\r\n\t\tposition: absolute;\r\n\t\tleft: 50%;\r\n\t\ttop: 0;\r\n\t\tmargin-top: -.3em;\r\n\t}\r\n}\r\n\r\n.egr-empty .egr-dropdown:before {\r\n\tleft: 2em;\r\n}\r\n.egr-row-actions .egr-dropdown:before {\r\n\tleft: calc(100% - 2.4em);\r\n}\r\n\r\n.egr-dropdown-active .egr-dropdown {\r\n\tdisplay: block;\r\n}\r\n.egr-dropdown-active .egr-add-button .icon {\r\n\ttransform: rotateX(180deg);\r\n}",".egr-empty {\r\n\tpadding: 1.5em;\r\n\tbackground: #ddd;\r\n\tdisplay: none;\r\n\r\n\t.egr-add-button {\r\n\t\tborder-bottom: 2px solid #aaa;\r\n\t\tcursor: pointer;\r\n\t\tposition: relative;\r\n\t\tdisplay: inline-block;\r\n\r\n\t\t.egr-dropdown {\r\n\t\t\tright: auto;\r\n\t\t\tmargin-top: .7em;\r\n\t\t}\r\n\t}\r\n}",".egr-output {\r\n\tmargin-left: 1.5em;\r\n\twidth: calc(100% - 1.5em);\r\n\tpadding-bottom: 1.5em;\r\n\tdisplay: none;\r\n\r\n\ttextarea {\r\n\t\twidth: 100%;\r\n\t\theight: 300px;\r\n\t\tborder: 2px solid #ddd;\r\n\t\tpadding: .5em;\r\n\t\tfont-size: .9em;\r\n\t\toutline: none;\r\n\t}\r\n}",".egr-outline {\r\n\topacity: .5;\r\n}",".egr .ui-sortable-helper {\r\n\tborder-bottom: 2px solid #ddd;\r\n}\r\n\r\n.egr-presentation .egr-fieldset:first-child > .egr-actions > .egr-sort-up {\r\n\tdisplay: none;\r\n}\r\n.egr-presentation .egr-fieldset:last-child > .egr-actions > .egr-sort-down {\r\n\tdisplay: none;\r\n}\r\n\r\n.egr-presentation .egr-fieldset:only-child > .egr-actions > .egr-sort-up,\r\n.egr-presentation .egr-fieldset:only-child > .egr-actions > .egr-sort-down,\r\n.egr-presentation .egr-fieldset:only-child > .egr-actions > .egr-sorting {\r\n\tdisplay: none;\r\n}",".egr-row-actions {\r\n\tmargin-top: .5em;\r\n\r\n\t&:after {\r\n\t\tclear: both;\r\n\t\tcontent: '';\r\n\t\tdisplay: table;\r\n\t}\r\n}\r\n\r\n.egr-add-button {\r\n\tcursor: pointer;\r\n\tdisplay: inline-block;\r\n\tposition: relative;\r\n\tuser-select: none;\r\n\r\n\tspan {\r\n\t\tcolor: #777;\r\n\t}\r\n\r\n\t&:hover span {\r\n\t\tcolor: #000;\r\n\t}\r\n}\r\n\r\n.egr-add {\r\n\tfloat: right;\r\n}\r\n\r\n.egr-add-select {\r\n\tpadding: .75em 1.5em .75em 1.5em;\r\n\tcolor: #fff;\r\n\tborder-bottom: 1px solid #222;\r\n\twhite-space: nowrap;\r\n\tcursor: pointer;\r\n\tuser-select: none;\r\n\r\n\t&:hover {\r\n\t\tcolor: #999;\r\n\t}\r\n\r\n\t&:last-child {\r\n\t\tborder-bottom: 0;\r\n\t}\r\n}\r\n\r\n.egr-dropdown-active .egr-add-button:before {\r\n\tdisplay: block;\r\n}","",".egr-grid-item {\r\n\tdisplay: flex;\r\n\tflex-wrap: wrap;\r\n}\r\n\r\n.egr-fieldset {\r\n\twidth: 100%;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tjustify-content: space-between;\r\n}\r\n\r\n@media screen and (min-width: 60em) {\r\n\t.egr-grid-item {\r\n\t\twidth: calc(100% + 1.5em);\r\n\t}\r\n\r\n\t.egr-fieldset {\r\n\t\tmargin-right: 1.5em;\r\n\t\tmargin-bottom: 1.5em;\r\n\t}\r\n\r\n\t.egr-grid-item-1-2 > .egr-fieldset {\r\n\t\twidth: calc(100% / 2 - 1.5em);\r\n\t}\r\n\t.egr-grid-item-1-3 > .egr-fieldset {\r\n\t\twidth: calc(100% / 3 - 1.5em);\r\n\t}\r\n\t.egr-grid-item-1-4 > .egr-fieldset {\r\n\t\twidth: calc(100% / 4 - 1.5em);\r\n\t}\r\n\t.egr-grid-item-1-5 > .egr-fieldset {\r\n\t\twidth: calc(100% / 5 - 1.5em);\r\n\t}\r\n}",".egr-element-delete {\r\n\twidth: calc(100% + 1.5em);\r\n\tz-index: 100;\r\n\tbackground: #fff;\r\n\tdisplay: flex;\r\n\r\n\t.egr-delete-message {\r\n\t\tpadding: 1.5em;\r\n\t\tposition: relative;\r\n\t\tbackground: #fff;\r\n\t\tmargin: 0 auto;\r\n\t}\r\n}\r\n\r\n.egr-delete-buttons {\r\n\tmax-width: 20em;\r\n\tjustify-content: space-between;\r\n\tdisplay: flex;\r\n\tmargin-top: .5em;\r\n\r\n\t>* {\r\n\t\tcursor: pointer;\r\n\t\tline-height: 2em;\r\n\t}\r\n}\r\n\r\n.egr-delete-cancel {\r\n\tpadding: 0 .5em;\r\n\tcolor: #777;\r\n\tborder: 2px solid transparent;\r\n\r\n\tspan {\r\n\t\tborder-bottom: 2px solid #eee;\r\n\t}\r\n\r\n\t&:hover {\r\n\t\tcolor: #000;\r\n\r\n\t\tspan {\r\n\t\t\tborder-bottom: 2px solid #ccc;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n.egr-delete-apply {\r\n\tborder-radius: .3em;\r\n\tpadding: 0 1em;\r\n\tcolor: #b3000a;\r\n\tborder: 2px solid #b3000a;\r\n\tfont-weight: bold;\r\n\r\n\t&:hover {\r\n\t\tcolor: #fff;\r\n\t\tbackground: #b3000a;\r\n\t}\r\n}\r\n\r\n.egr-delete-active {\r\n\tposition: relative;\r\n}\r\n\r\n.egr-delete-active .egr-fields:before{\r\n\tcontent: '';\r\n\tdisplay: block;\r\n\tposition: absolute;\r\n\ttop: 0;\r\n\tleft: 0;\r\n\tbackground: #b3000a;\r\n\twidth: 100%;\r\n\theight: 100%;\r\n\tz-index: 1;\r\n\topacity: .2;\r\n}","$lp: 1em;\r\n\r\n.egr-style-table {\r\n\t> .egr-fieldsets {\r\n\t\tborder: 2px solid #ddd;\r\n\t\t> .egr-fieldset {\r\n\t\t\tborder: none;\r\n\t\t\tmargin-bottom: 0;\r\n\t\t\tpadding-top: .5em;\r\n\t\t\tpadding-right: .5em;\r\n\r\n\t\t\t&:last-child {\r\n\t\t\t\tborder-bottom: 0;\r\n\r\n\t\t\t\t> .egr-actions {\r\n\t\t\t\t\tborder-bottom: 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t> .egr-fields {\r\n\t\t\t\t> .field {\r\n\t\t\t\t\tpadding-left: .5em;\r\n\t\t\t\t\tmargin-bottom: .5em;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t> .egr-actions {\r\n\t\t\t\twidth: calc(100% + .5em);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t&.egr-odd {\r\n\t\t> .egr-fieldsets {\r\n\t\t\t> .egr-labels {\r\n\t\t\t\tbackground: #fff;\r\n\t\t\t}\r\n\t\t\t> .egr-fieldset > .egr-actions {\r\n\t\t\t\tborder-bottom: 1px solid #ddd;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t&.egr-even {\r\n\t\t> .egr-fieldsets {\r\n\t\t\t> .egr-labels {\r\n\t\t\t\tbackground: #eee;\r\n\t\t\t}\r\n\t\t\t> .egr-fieldset > .egr-actions {\r\n\t\t\t\tborder-bottom: 1px solid #ccc;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n.egr-labels {\r\n\tpadding-top: $lp;\r\n\tpadding-right: $lp;\r\n\tborder-bottom: 1px solid #ddd;\r\n\r\n\t> .field {\r\n\t\tmargin-bottom: $lp / 2;\r\n\t\tpadding-left: $lp !important;\r\n\t}\r\n}"],"names":[],"mappings":"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"} -------------------------------------------------------------------------------- /fields/engineer/assets/css/style.css.min.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"style.css","sources":["style.scss","skeleton.scss","action-items.scss","has-fieldsets.scss","dropdown.scss","empty.scss","output.scss","outline.scss","sort.scss","row-actions.scss","plugins.scss","grid.scss","delete-message.scss","table.scss"],"sourcesContent":["@import 'skeleton';\r\n@import 'action-items';\r\n@import 'has-fieldsets';\r\n@import 'dropdown';\r\n@import 'empty';\r\n@import 'output';\r\n@import 'outline';\r\n@import 'sort';\r\n@import 'row-actions';\r\n@import 'plugins';\r\n@import 'grid';\r\n@import 'delete-message';\r\n@import 'table';",".egr {\r\n\tmargin-left: -1.5em;\r\n\tmargin-bottom: -1.5em;\r\n}\r\n\r\n.egr-row {\r\n\tmargin-left: 1.5em;\r\n\twidth: calc(100% - 1.5em);\r\n\tpadding-bottom: 1.5em;\r\n}\r\n\r\n.egr-fieldsets {\r\n\tposition: relative;\r\n}\r\n\r\n.egr-fieldset {\r\n\tpadding-top: 1.5em;\r\n\tpadding-right: 1.5em;\r\n\tborder: 2px solid #ddd;\r\n\tbackground: #fff;\r\n\tposition: relative;\r\n}\r\n\r\n.egr-even > .egr-fieldsets > .egr-fieldset {\r\n\tbackground: #eee;\r\n}\r\n\r\n.egr-outline {\r\n\tdisplay: none;\r\n}\r\n\r\n.egr-fields {\r\n\tflex: 1;\r\n}",".egr-actions {\r\n\twidth: calc(100% + 1.5em);\r\n\tdisplay: none;\r\n\tjustify-content: center;\r\n\tborder-top: 1px solid #ddd;\r\n\r\n\t> * {\r\n\t\theight: 2.5em;\r\n\t\tline-height: 2.5em;\r\n\t\tcursor: pointer;\r\n\t\tpadding-right: 1.5em;\r\n\t\tpadding-left: 1.5em;\r\n\t\tuser-select: none;\r\n\t\tborder-right: 1px solid #ddd;\r\n\r\n\t\t&:last-child {\r\n\t\t\tborder-right: none;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n.egr-even .egr-actions {\r\n\tborder-top: 1px solid #ccc;\r\n\r\n\t> * {\r\n\t\tborder-right: 1px solid #ccc;\r\n\r\n\t\t&:last-child {\r\n\t\t\tborder-right: none;\r\n\t\t}\r\n\t}\r\n}",".egr-row[data-count=\"0\"] > .egr-empty {\r\n\tdisplay: block;\r\n}\r\n.egr-row[data-count=\"0\"] > .egr-row-actions {\r\n\tdisplay: none;\r\n}\r\n\r\n.egr-dropdown-active .egr-add-button:before {\r\n\tdisplay: block;\r\n}",".egr-dropdown {\r\n\tposition: absolute;\r\n\tbackground: #000;\r\n\tborder-radius: 4px;\r\n\tright: 0;\r\n\tz-index: 10000;\r\n\tdisplay: none;\r\n\tmargin-top: .4em;\r\n\r\n\t&:before {\r\n\t\tcontent: '';\r\n\t\tborder-left: .4em solid transparent;\r\n\t\tborder-right: .4em solid transparent;\r\n\t\tborder-bottom: .4em solid #000;\r\n\t\tposition: absolute;\r\n\t\tleft: 50%;\r\n\t\ttop: 0;\r\n\t\tmargin-top: -.3em;\r\n\t}\r\n}\r\n\r\n.egr-empty .egr-dropdown:before {\r\n\tleft: 2em;\r\n}\r\n.egr-row-actions .egr-dropdown:before {\r\n\tleft: calc(100% - 2.4em);\r\n}\r\n\r\n.egr-dropdown-active .egr-dropdown {\r\n\tdisplay: block;\r\n}\r\n.egr-dropdown-active .egr-add-button .icon {\r\n\ttransform: rotateX(180deg);\r\n}",".egr-empty {\r\n\tpadding: 1.5em;\r\n\tbackground: #ddd;\r\n\tdisplay: none;\r\n\r\n\t.egr-add-button {\r\n\t\tborder-bottom: 2px solid #aaa;\r\n\t\tcursor: pointer;\r\n\t\tposition: relative;\r\n\t\tdisplay: inline-block;\r\n\r\n\t\t.egr-dropdown {\r\n\t\t\tright: auto;\r\n\t\t\tmargin-top: .7em;\r\n\t\t}\r\n\t}\r\n}",".egr-output {\r\n\tmargin-left: 1.5em;\r\n\twidth: calc(100% - 1.5em);\r\n\tpadding-bottom: 1.5em;\r\n\tdisplay: none;\r\n\r\n\ttextarea {\r\n\t\twidth: 100%;\r\n\t\theight: 300px;\r\n\t\tborder: 2px solid #ddd;\r\n\t\tpadding: .5em;\r\n\t\tfont-size: .9em;\r\n\t\toutline: none;\r\n\t}\r\n}",".egr-outline {\r\n\topacity: .5;\r\n}",".egr .ui-sortable-helper {\r\n\tborder-bottom: 2px solid #ddd;\r\n}\r\n\r\n.egr-presentation .egr-fieldset:first-child > .egr-actions > .egr-sort-up {\r\n\tdisplay: none;\r\n}\r\n.egr-presentation .egr-fieldset:last-child > .egr-actions > .egr-sort-down {\r\n\tdisplay: none;\r\n}\r\n\r\n.egr-presentation .egr-fieldset:only-child > .egr-actions > .egr-sort-up,\r\n.egr-presentation .egr-fieldset:only-child > .egr-actions > .egr-sort-down,\r\n.egr-presentation .egr-fieldset:only-child > .egr-actions > .egr-sorting {\r\n\tdisplay: none;\r\n}",".egr-row-actions {\r\n\tmargin-top: .5em;\r\n\r\n\t&:after {\r\n\t\tclear: both;\r\n\t\tcontent: '';\r\n\t\tdisplay: table;\r\n\t}\r\n}\r\n\r\n.egr-add-button {\r\n\tcursor: pointer;\r\n\tdisplay: inline-block;\r\n\tposition: relative;\r\n\tuser-select: none;\r\n\r\n\tspan {\r\n\t\tcolor: #777;\r\n\t}\r\n\r\n\t&:hover span {\r\n\t\tcolor: #000;\r\n\t}\r\n}\r\n\r\n.egr-add {\r\n\tfloat: right;\r\n}\r\n\r\n.egr-add-select {\r\n\tpadding: .75em 1.5em .75em 1.5em;\r\n\tcolor: #fff;\r\n\tborder-bottom: 1px solid #222;\r\n\twhite-space: nowrap;\r\n\tcursor: pointer;\r\n\tuser-select: none;\r\n\r\n\t&:hover {\r\n\t\tcolor: #999;\r\n\t}\r\n\r\n\t&:last-child {\r\n\t\tborder-bottom: 0;\r\n\t}\r\n}\r\n\r\n.egr-dropdown-active .egr-add-button:before {\r\n\tdisplay: block;\r\n}","",".egr-grid-item {\r\n\tdisplay: flex;\r\n\tflex-wrap: wrap;\r\n}\r\n\r\n.egr-fieldset {\r\n\twidth: 100%;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tjustify-content: space-between;\r\n}\r\n\r\n@media screen and (min-width: 60em) {\r\n\t.egr-grid-item {\r\n\t\twidth: calc(100% + 1.5em);\r\n\t}\r\n\r\n\t.egr-fieldset {\r\n\t\tmargin-right: 1.5em;\r\n\t\tmargin-bottom: 1.5em;\r\n\t}\r\n\r\n\t.egr-grid-item-1-2 > .egr-fieldset {\r\n\t\twidth: calc(100% / 2 - 1.5em);\r\n\t}\r\n\t.egr-grid-item-1-3 > .egr-fieldset {\r\n\t\twidth: calc(100% / 3 - 1.5em);\r\n\t}\r\n\t.egr-grid-item-1-4 > .egr-fieldset {\r\n\t\twidth: calc(100% / 4 - 1.5em);\r\n\t}\r\n\t.egr-grid-item-1-5 > .egr-fieldset {\r\n\t\twidth: calc(100% / 5 - 1.5em);\r\n\t}\r\n}",".egr-element-delete {\r\n\twidth: calc(100% + 1.5em);\r\n\tz-index: 100;\r\n\tbackground: #fff;\r\n\tdisplay: flex;\r\n\r\n\t.egr-delete-message {\r\n\t\tpadding: 1.5em;\r\n\t\tposition: relative;\r\n\t\tbackground: #fff;\r\n\t\tmargin: 0 auto;\r\n\t}\r\n}\r\n\r\n.egr-delete-buttons {\r\n\tmax-width: 20em;\r\n\tjustify-content: space-between;\r\n\tdisplay: flex;\r\n\tmargin-top: .5em;\r\n\r\n\t>* {\r\n\t\tcursor: pointer;\r\n\t\tline-height: 2em;\r\n\t}\r\n}\r\n\r\n.egr-delete-cancel {\r\n\tpadding: 0 .5em;\r\n\tcolor: #777;\r\n\tborder: 2px solid transparent;\r\n\r\n\tspan {\r\n\t\tborder-bottom: 2px solid #eee;\r\n\t}\r\n\r\n\t&:hover {\r\n\t\tcolor: #000;\r\n\r\n\t\tspan {\r\n\t\t\tborder-bottom: 2px solid #ccc;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n.egr-delete-apply {\r\n\tborder-radius: .3em;\r\n\tpadding: 0 1em;\r\n\tcolor: #b3000a;\r\n\tborder: 2px solid #b3000a;\r\n\tfont-weight: bold;\r\n\r\n\t&:hover {\r\n\t\tcolor: #fff;\r\n\t\tbackground: #b3000a;\r\n\t}\r\n}\r\n\r\n.egr-delete-active {\r\n\tposition: relative;\r\n}\r\n\r\n.egr-delete-active .egr-fields:before{\r\n\tcontent: '';\r\n\tdisplay: block;\r\n\tposition: absolute;\r\n\ttop: 0;\r\n\tleft: 0;\r\n\tbackground: #b3000a;\r\n\twidth: 100%;\r\n\theight: 100%;\r\n\tz-index: 1;\r\n\topacity: .2;\r\n}","$lp: 1em;\r\n\r\n.egr-style-table {\r\n\t> .egr-fieldsets {\r\n\t\tborder: 2px solid #ddd;\r\n\t\t> .egr-fieldset {\r\n\t\t\tborder: none;\r\n\t\t\tmargin-bottom: 0;\r\n\t\t\tpadding-top: .5em;\r\n\t\t\tpadding-right: .5em;\r\n\r\n\t\t\t&:last-child {\r\n\t\t\t\tborder-bottom: 0;\r\n\r\n\t\t\t\t> .egr-actions {\r\n\t\t\t\t\tborder-bottom: 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t> .egr-fields {\r\n\t\t\t\t> .field {\r\n\t\t\t\t\tpadding-left: .5em;\r\n\t\t\t\t\tmargin-bottom: .5em;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t> .egr-actions {\r\n\t\t\t\twidth: calc(100% + .5em);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t&.egr-odd {\r\n\t\t> .egr-fieldsets {\r\n\t\t\t> .egr-labels {\r\n\t\t\t\tbackground: #fff;\r\n\t\t\t}\r\n\t\t\t> .egr-fieldset > .egr-actions {\r\n\t\t\t\tborder-bottom: 1px solid #ddd;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t&.egr-even {\r\n\t\t> .egr-fieldsets {\r\n\t\t\t> .egr-labels {\r\n\t\t\t\tbackground: #eee;\r\n\t\t\t}\r\n\t\t\t> .egr-fieldset > .egr-actions {\r\n\t\t\t\tborder-bottom: 1px solid #ccc;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n.egr-labels {\r\n\tpadding-top: $lp;\r\n\tpadding-right: $lp;\r\n\tborder-bottom: 1px solid #ddd;\r\n\r\n\t> .field {\r\n\t\tmargin-bottom: $lp / 2;\r\n\t\tpadding-left: $lp !important;\r\n\t}\r\n}"],"names":[],"mappings":"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"} -------------------------------------------------------------------------------- /fields/engineer/assets/css/style.min.css: -------------------------------------------------------------------------------- 1 | .egr-fieldset,.egr-fieldsets{position:relative}.egr-actions>*,.egr-add-button,.egr-add-select{user-select:none;cursor:pointer}.egr-delete-active .egr-fields:before,.egr-dropdown:before,.egr-row-actions:after{content:''}.egr{margin-left:-1.5em;margin-bottom:-1.5em}.egr-output,.egr-row{margin-left:1.5em;padding-bottom:1.5em}.egr-row{width:calc(100% - 1.5em)}.egr-fieldset{padding-top:1.5em;padding-right:1.5em;border:2px solid #ddd;background:#fff}.egr-even>.egr-fieldsets>.egr-fieldset{background:#eee}.egr-outline{display:none;opacity:.5}.egr-fields{flex:1}.egr-actions{width:calc(100% + 1.5em);display:none;justify-content:center;border-top:1px solid #ddd}.egr-actions>*{height:2.5em;line-height:2.5em;padding-right:1.5em;padding-left:1.5em;border-right:1px solid #ddd}.egr-actions>:last-child{border-right:none}.egr-even .egr-actions{border-top:1px solid #ccc}.egr-even .egr-actions>*{border-right:1px solid #ccc}.egr-even .egr-actions>:last-child{border-right:none}.egr-row[data-count="0"]>.egr-empty{display:block}.egr-row[data-count="0"]>.egr-row-actions{display:none}.egr-dropdown{position:absolute;background:#000;border-radius:4px;right:0;z-index:10000;display:none;margin-top:.4em}.egr-dropdown:before{border-left:.4em solid transparent;border-right:.4em solid transparent;border-bottom:.4em solid #000;position:absolute;left:50%;top:0;margin-top:-.3em}.egr-empty .egr-dropdown:before{left:2em}.egr-row-actions .egr-dropdown:before{left:calc(100% - 2.4em)}.egr-dropdown-active .egr-dropdown{display:block}.egr-dropdown-active .egr-add-button .icon{transform:rotateX(180deg)}.egr-empty{padding:1.5em;background:#ddd;display:none}.egr-empty .egr-add-button{border-bottom:2px solid #aaa;cursor:pointer;position:relative;display:inline-block}.egr-output,.egr-presentation .egr-fieldset:first-child>.egr-actions>.egr-sort-up,.egr-presentation .egr-fieldset:last-child>.egr-actions>.egr-sort-down,.egr-presentation .egr-fieldset:only-child>.egr-actions>.egr-sort-down,.egr-presentation .egr-fieldset:only-child>.egr-actions>.egr-sort-up,.egr-presentation .egr-fieldset:only-child>.egr-actions>.egr-sorting{display:none}.egr-empty .egr-add-button .egr-dropdown{right:auto;margin-top:.7em}.egr-output{width:calc(100% - 1.5em)}.egr-output textarea{width:100%;height:300px;border:2px solid #ddd;padding:.5em;font-size:.9em;outline:0}.egr .ui-sortable-helper{border-bottom:2px solid #ddd}.egr-row-actions{margin-top:.5em}.egr-row-actions:after{clear:both;display:table}.egr-add-button{display:inline-block;position:relative}.egr-add-button span{color:#777}.egr-add-button:hover span{color:#000}.egr-add{float:right}.egr-add-select{padding:.75em 1.5em;color:#fff;border-bottom:1px solid #222;white-space:nowrap}.egr-add-select:hover{color:#999}.egr-add-select:last-child{border-bottom:0}.egr-dropdown-active .egr-add-button:before{display:block}.egr-grid-item{display:flex;flex-wrap:wrap}.egr-fieldset{width:100%;display:flex;flex-direction:column;justify-content:space-between}@media screen and (min-width:60em){.egr-grid-item{width:calc(100% + 1.5em)}.egr-fieldset{margin-right:1.5em;margin-bottom:1.5em}.egr-grid-item-1-2>.egr-fieldset{width:calc(100% / 2 - 1.5em)}.egr-grid-item-1-3>.egr-fieldset{width:calc(100% / 3 - 1.5em)}.egr-grid-item-1-4>.egr-fieldset{width:calc(100% / 4 - 1.5em)}.egr-grid-item-1-5>.egr-fieldset{width:calc(100% / 5 - 1.5em)}}.egr-element-delete{width:calc(100% + 1.5em);z-index:100;background:#fff;display:flex}.egr-element-delete .egr-delete-message{padding:1.5em;position:relative;background:#fff;margin:0 auto}.egr-delete-buttons{max-width:20em;justify-content:space-between;display:flex;margin-top:.5em}.egr-delete-buttons>*{cursor:pointer;line-height:2em}.egr-delete-cancel{padding:0 .5em;color:#777;border:2px solid transparent}.egr-delete-cancel span{border-bottom:2px solid #eee}.egr-delete-cancel:hover{color:#000}.egr-delete-cancel:hover span{border-bottom:2px solid #ccc}.egr-delete-apply{border-radius:.3em;padding:0 1em;color:#b3000a;border:2px solid #b3000a;font-weight:700}.egr-delete-apply:hover{color:#fff;background:#b3000a}.egr-delete-active{position:relative}.egr-delete-active .egr-fields:before{display:block;position:absolute;top:0;left:0;background:#b3000a;width:100%;height:100%;z-index:1;opacity:.2}.egr-style-table>.egr-fieldsets{border:2px solid #ddd}.egr-style-table>.egr-fieldsets>.egr-fieldset{border:none;margin-bottom:0;padding-top:.5em;padding-right:.5em}.egr-style-table>.egr-fieldsets>.egr-fieldset:last-child,.egr-style-table>.egr-fieldsets>.egr-fieldset:last-child>.egr-actions{border-bottom:0}.egr-style-table>.egr-fieldsets>.egr-fieldset>.egr-fields>.field{padding-left:.5em;margin-bottom:.5em}.egr-style-table>.egr-fieldsets>.egr-fieldset>.egr-actions{width:calc(100% + .5em)}.egr-style-table.egr-odd>.egr-fieldsets>.egr-labels{background:#fff}.egr-style-table.egr-odd>.egr-fieldsets>.egr-fieldset>.egr-actions{border-bottom:1px solid #ddd}.egr-style-table.egr-even>.egr-fieldsets>.egr-labels{background:#eee}.egr-style-table.egr-even>.egr-fieldsets>.egr-fieldset>.egr-actions{border-bottom:1px solid #ccc}.egr-labels{padding-top:1em;padding-right:1em;border-bottom:1px solid #ddd}.egr-labels>.field{margin-bottom:.5em;padding-left:1em!important} -------------------------------------------------------------------------------- /fields/engineer/assets/js/script.js: -------------------------------------------------------------------------------- 1 | var EgrAdd = (function () { 2 | var fn = {}; 3 | 4 | fn.add = function(obj, this_obj) { 5 | var fieldset_name = fn.name(this_obj); 6 | var row = fn.row(this_obj); 7 | var fieldsets = fn.fieldsets(row); 8 | 9 | fieldsets.append(fn.matchFieldset(row, fieldset_name, obj).clone()); 10 | EgrId.replace(fieldsets.children('.egr-fieldset').last()); 11 | 12 | EgrSort.sort(this_obj); 13 | EgrCount.trigger(obj, this_obj); 14 | EgrTrigger.trigger(row); 15 | EgrRender.render(obj); 16 | }; 17 | 18 | fn.name = function(this_obj) { 19 | return this_obj.attr('data-add'); 20 | }; 21 | 22 | fn.row = function(this_obj) { 23 | return this_obj.closest('.egr-row'); 24 | }; 25 | 26 | fn.id = function(row) { 27 | return row.attr('data-id'); 28 | }; 29 | 30 | fn.fieldsets = function(row) { 31 | return row.children('.egr-fieldsets'); 32 | }; 33 | 34 | fn.matchRow = function(row, obj) { 35 | var id = fn.id(row); 36 | return $('.egr-outline[data-id="' + obj.attr('data-name') + '"] .egr-row[data-id="' + id + '"]'); 37 | }; 38 | 39 | fn.matchFieldsets = function(row, obj) { 40 | var match_row = fn.matchRow(row, obj); 41 | return match_row.children('.egr-fieldsets'); 42 | }; 43 | 44 | fn.matchFieldset = function(row, fieldset_name, obj) { 45 | var match_fieldsets = fn.matchFieldsets(row, obj); 46 | return match_fieldsets.children('[data-fieldset-name="' + fieldset_name + '"]'); 47 | }; 48 | 49 | return fn; 50 | })(); 51 | var EgrClone = (function () { 52 | var fn = {}; 53 | 54 | fn.clone = function(obj, this_obj) { 55 | var fieldset = this_obj.closest('.egr-fieldset'); 56 | var cloned = fn.duplicate(fieldset); 57 | 58 | fn.setSelects(cloned, fn.getSelects(fieldset)); 59 | EgrId.replace(cloned); 60 | EgrCount.trigger(obj, this_obj); 61 | EgrTrigger.trigger(this_obj.closest('.egr-row')); 62 | EgrRender.render(obj); 63 | }; 64 | 65 | fn.duplicate = function(fieldset) { 66 | var cloned = fieldset.clone(true); 67 | fieldset.after(cloned); 68 | return fieldset.next(); 69 | }; 70 | 71 | fn.getSelects = function(fieldset) { 72 | var array = []; 73 | var i = 0; 74 | fieldset.find('select').each(function(index) { 75 | $(this).val(); 76 | array[i] = $(this).val(); 77 | i++; 78 | }); 79 | return array; 80 | }; 81 | 82 | fn.setSelects = function(next, select_values) { 83 | var i = 0; 84 | next.find('select').each(function(index) { 85 | $(this).val(select_values[i]); 86 | i++; 87 | }); 88 | }; 89 | 90 | return fn; 91 | })(); 92 | var EgrCount = (function () { 93 | var fn = {}; 94 | 95 | fn.trigger = function(obj, this_obj) { 96 | var row = this_obj.closest('.egr-row'); 97 | var fieldsets = row.children('.egr-fieldsets'); 98 | var fieldset = fieldsets.children('.egr-fieldset'); 99 | var count = fieldset.length; 100 | row.attr('data-count', count); 101 | }; 102 | 103 | return fn; 104 | })(); 105 | var EgrDelete = (function () { 106 | var fn = {}; 107 | 108 | fn.deleteMessage = function(obj, this_obj) { 109 | var delete_message = $(document).find('.egr-outline .egr-element-delete').first(); 110 | fn.deleteCancel(obj, this_obj); 111 | obj.find('.egr-actions').hide(); 112 | this_obj.closest('.egr-fieldset').addClass('egr-delete-active'); 113 | this_obj.closest('.egr-fieldset').append(delete_message.clone()); 114 | }; 115 | 116 | fn.deleteAction = function(obj, this_obj) { 117 | var fieldsets = this_obj.closest('.egr-fieldsets'); 118 | this_obj.closest('.egr-fieldset').remove(); 119 | EgrSort.sort(obj); 120 | EgrCount.trigger(obj, fieldsets); 121 | EgrRender.render(obj); 122 | }; 123 | 124 | fn.deleteCancel = function(obj, this_obj) { 125 | obj.find('.egr-element-delete').remove(); 126 | obj.find('.egr-delete-active').removeClass('egr-delete-active'); 127 | }; 128 | 129 | return fn; 130 | })(); 131 | var EgrId = (function () { 132 | var fn = {}; 133 | 134 | fn.replace = function(fieldset) { 135 | var time = new Date().getTime(); 136 | 137 | fn.replaceIds(fieldset, time); 138 | fn.replaceFors(fieldset, time); 139 | fn.replaceClasses(fieldset, time); 140 | fn.replaceNames(fieldset, time); 141 | fn.replacePrefixes(fieldset, time); 142 | 143 | fn.addFieldsetCount(fieldset); 144 | }; 145 | 146 | fn.replaceIds = function(fieldset, time) { 147 | var matches = fieldset.find('[id^="form-field-"]'); 148 | matches.each(function(index) { 149 | var element = $(this).attr('id').replace(/_egr__/g, '_' + time + '_egr__'); 150 | $(this).attr('id', element); 151 | }); 152 | }; 153 | 154 | fn.replaceFors = function(fieldset, time) { 155 | var matches = fieldset.find('[for^="form-field-"]'); 156 | matches.each(function(index) { 157 | var element = $(this).attr('for').replace(/_egr__/g, '_' + time + '_egr__'); 158 | $(this).attr('for', element); 159 | }); 160 | }; 161 | 162 | fn.replaceClasses = function(fieldset, time) { 163 | var matches = fieldset.find('[data-field-name][class^="field "]'); 164 | matches.each(function(index) { 165 | var element = $(this).attr('class').replace(/_egr__/g, '_' + time + '_egr__'); 166 | $(this).attr('class', element); 167 | }); 168 | }; 169 | 170 | fn.replaceNames = function(fieldset, time) { 171 | var matches = fieldset.find('[name]'); 172 | matches.each(function(index) { 173 | var element = $(this).attr('name').replace(/_egr__/g, '_' + time + '_egr__'); 174 | $(this).attr('name', element); 175 | }); 176 | }; 177 | 178 | fn.replacePrefixes = function(fieldset, time) { 179 | var matches = fieldset.find('[data-prefix]'); 180 | matches.each(function(index) { 181 | var element = $(this).attr('data-prefix').replace(/_egr__/g, '_' + time + '_egr__'); 182 | $(this).attr('data-prefix', element); 183 | }); 184 | }; 185 | 186 | fn.addFieldsetCount = function(fieldset) { 187 | var row = fieldset.closest('.egr-row'); 188 | var fieldset_count = row.children('.egr-row-actions').find('.egr-add-select').length; 189 | fieldset_count = (fieldset_count == 0) ? 1 : fieldset_count; 190 | row.attr('data-fieldset-count', fieldset_count); 191 | }; 192 | 193 | return fn; 194 | })(); 195 | var EgrOutline = (function () { 196 | var fn = {}; 197 | 198 | fn.set = function(obj) { 199 | var outline = obj.find('.egr-outline'); 200 | var name = obj.attr('data-name'); 201 | 202 | $('.mainbar').children('.section').prepend('
' + outline.html() + "
"); 203 | outline.remove(); 204 | }; 205 | 206 | return fn; 207 | })(); 208 | EgrRender = (function () { 209 | var fn = {}; 210 | var level = 1; 211 | 212 | fn.render = function(obj) { 213 | var output = ''; 214 | var fields = obj.find('.egr-presentation').children(); 215 | var out = ''; 216 | var textarea = obj.find('.egr-output').find('textarea'); 217 | out = fn.renderLoop(fields, out, level, true); 218 | textarea.val(out); 219 | textarea.blur(); 220 | }; 221 | 222 | fn.renderLoop = function(fields, out, root_field) { 223 | fields.each(function(field_index) { 224 | var field = $(this); 225 | var field_name = field.attr('data-field-name'); 226 | var depth = field.parents('.egr-row').length; 227 | var tab = ' '.repeat(depth); 228 | 229 | if(field.hasClass('egr-row')) { 230 | if(!root_field) { 231 | out += tab + field_name + ":\n"; 232 | } 233 | var fieldsets = $(this).children('.egr-fieldsets').children(); 234 | if(depth > 0) tab += ' '; 235 | fieldsets.each(function(fieldset_index) { 236 | var fieldset = $(this); 237 | var subfields = fieldset.children('.egr-fields').children(); 238 | 239 | if(fieldset.attr('data-fieldset-name') != undefined) { 240 | out += tab + "-\n"; 241 | out += fn.setFieldsetName(tab, field, fieldset); 242 | } 243 | out = fn.renderLoop(subfields, out, false); 244 | }); 245 | } else { 246 | var fieldset = field.parent().parent(); 247 | var selector = fn.getSelector(field_name, field); 248 | var element = fn.findFormElement(selector, field); 249 | var content = fn.getElement(element, field_name, tab); 250 | 251 | if(content) { 252 | out += tab + content; 253 | } 254 | } 255 | }); 256 | return out; 257 | }; 258 | 259 | fn.getSelector = function(field_name, field) { 260 | var selector = field_name + field.attr('data-prefix'); 261 | return selector; 262 | }; 263 | 264 | fn.findFormElement = function(selector, field) { 265 | var single = '[name="' + selector + '"]:not(label)'; 266 | var multiple = '[name^="' + selector + '["]:not(label)'; 267 | var element = field.find(single + ',' + multiple); 268 | return element; 269 | }; 270 | 271 | fn.getElement = function(element, field_name, tab) { 272 | var elementType = element.prop('nodeName'); 273 | var is_single = (element.length < 2) ? true : false; 274 | var output = ''; 275 | 276 | switch(elementType) { 277 | case 'TEXTAREA': 278 | output += fn.textarea(element, field_name, tab); 279 | break; 280 | case 'INPUT': 281 | switch(element.attr('type')) { 282 | case 'radio': 283 | output += fn.radio(element, field_name, tab); 284 | break; 285 | case 'checkbox': 286 | if(is_single) { 287 | output += fn.checkbox(element, field_name, tab); 288 | } else { 289 | output += fn.checkboxes(element, field_name, tab); 290 | } 291 | break; 292 | default: 293 | if(element.hasClass('images')) { 294 | output += fn.textarea(element, field_name, tab); 295 | } else { 296 | if(is_single) { 297 | output += fn.input(element, field_name, is_single, tab); 298 | } else { 299 | if(field_name == 'datetime') { 300 | output += fn.input(element, field_name); 301 | } else { 302 | output += fn.inputs(element, field_name, tab); 303 | } 304 | } 305 | } 306 | } 307 | break; 308 | case 'SELECT': 309 | output += fn.select(element, field_name, tab); 310 | break; 311 | } 312 | return output; 313 | }; 314 | 315 | fn.setFieldsetName = function(tab, field, fieldset) { 316 | var fieldset_name = fieldset.attr('data-fieldset-name'); 317 | var fieldset_count = field.attr('data-fieldset-count'); 318 | if(fieldset_count == 1 && fieldset_name == 'default') { 319 | return ''; 320 | } 321 | return tab + " _fieldset: " + fieldset_name + "\n"; 322 | }; 323 | 324 | fn.inputs = function(element, field_name, tab) { 325 | var value = ''; 326 | var indent = tab + ' '; 327 | 328 | element.each(function( index ) { 329 | var val = $(this).val(); 330 | val = val.replace(/"/g, '\\"'); 331 | value += indent + '- "' + val + '"' + "\n"; 332 | 333 | }); 334 | 335 | value = value.slice(0, -1); 336 | return field_name + ": \n" + value + "\n"; 337 | }; 338 | 339 | /* Input */ 340 | fn.input = function(element, field_name) { 341 | var value = ''; 342 | 343 | element.each(function( index ) { 344 | value += $(this).val() + ' '; 345 | }); 346 | value = value.slice(0, -1); 347 | value = value.replace(/"/g, '\\"'); 348 | return field_name + ': "' + value + '"' + "\n"; 349 | }; 350 | 351 | /* Textarea */ 352 | fn.textarea = function(element, field_name, tab) { 353 | var value = element.val(); 354 | var match = value.indexOf("\n"); 355 | var indent = tab + ' '; 356 | 357 | if(match > -1) { 358 | value = value.replace(/(?:\r\n|\r|\n)/g, "\n" + indent); 359 | if(value != '') { 360 | return field_name + ": |\n" + indent + value + "\n"; 361 | } else { 362 | return ''; 363 | } 364 | } 365 | return fn.input(element, field_name); 366 | }; 367 | 368 | /* Select */ 369 | fn.select = function(element, field_name) { 370 | var value = element.val(); 371 | value = value.replace(/"/g, '\\"'); 372 | return field_name + ': "' + value + '"' + "\n"; 373 | }; 374 | 375 | /* Radio */ 376 | fn.radio = function(element, field_name) { 377 | out = ''; 378 | element.each(function(index) { 379 | if($(this).is(':checked')) { 380 | var value = $(this).val(); 381 | if(value == 'true' || value == 'false') { 382 | value = "'" + value + "'"; 383 | } 384 | out += field_name + ": " + value + "\n"; 385 | } 386 | }); 387 | return out; 388 | }; 389 | 390 | /* Checkbox */ 391 | fn.checkbox = function(element, field_name) { 392 | out = ''; 393 | element.each(function(index) { 394 | if($(this).is(':checked')) { 395 | var value = $(this).val(); 396 | if(value == 'on') { 397 | value = 'true'; 398 | } 399 | out += field_name + ': ' + value + "\n"; 400 | } else { 401 | out += field_name + ": false\n"; 402 | } 403 | }); 404 | return out; 405 | }; 406 | 407 | /* Checkboxes */ 408 | fn.checkboxes = function(element, field_name, tab) { 409 | out = ''; 410 | element.each(function(index) { 411 | if($(this).is(':checked')) { 412 | out += tab + ' - ' + $(this).val() + "\n"; 413 | } 414 | }); 415 | if(out != '') { 416 | out = field_name + ":\n" + out; 417 | } 418 | return out; 419 | } 420 | 421 | return fn; 422 | })(); 423 | (function($) { 424 | $.fn.engineer = function() { 425 | return this.each(function() { 426 | var field = $(this); 427 | var fieldname = 'engineer'; 428 | 429 | if(field.data( fieldname )) { 430 | return true; 431 | } else { 432 | field.data( fieldname, true ); 433 | } 434 | 435 | EgrOutline.set(field); 436 | 437 | field.on('click', '.egr [data-add]', function() { 438 | EgrAdd.add(field, $(this)); 439 | }); 440 | 441 | field.on('click', '.egr-delete-apply', function() { 442 | EgrDelete.deleteAction(field, $(this)); 443 | }); 444 | 445 | field.on('click', '.egr-delete-cancel', function() { 446 | EgrDelete.deleteCancel(field, $(this)); 447 | }); 448 | 449 | field.on('click', '.egr-clone', function() { 450 | EgrClone.clone(field, $(this)); 451 | }); 452 | 453 | field.on('click', '.egr-fieldset', function(e) { 454 | if(!$(e.target).closest('.egr-fieldset').not(this).length){ 455 | EgrToggleActive.toggle(field, $(this)); 456 | } 457 | }); 458 | 459 | field.on('click', '.egr-delete', function() { 460 | EgrDelete.deleteMessage(field, $(this)); 461 | }); 462 | 463 | $(document).on('click', function(e) { 464 | if(!$(e.target).closest('.egr-add-button').not(this).length) { 465 | $(document).find('.egr-dropdown-active').removeClass('egr-dropdown-active'); 466 | } 467 | if(!$(e.target).closest('.egr-fieldset').not(this).length) { 468 | EgrToggleActive.remove(field, $(this)); 469 | } 470 | }); 471 | 472 | field.on('click', '.egr-sort-up', function(e) { 473 | EgrSort.sortUp(field, $(this)); 474 | }); 475 | 476 | field.on('click', '.egr-sort-down', function(e) { 477 | EgrSort.sortDown(field, $(this)); 478 | }); 479 | 480 | field.on('click', '.egr-add-button', function(e) { 481 | if(!$(e.target).closest('.egr-add-button').not(this).length){ 482 | EgrToggleDropdown.toggle(field, $(this)); 483 | } 484 | }); 485 | 486 | EgrSort.sort(field); 487 | 488 | field.find('.egr-presentation').on('input click change', 'input, select, textarea', function() { 489 | EgrRender.render(field, $(this)); 490 | }); 491 | }); 492 | }; 493 | })(jQuery); 494 | var EgrSort = (function () { 495 | var fn = {}; 496 | 497 | fn.sort = function(obj) { 498 | var items = obj.find('.egr'); 499 | var firstSort = true; 500 | items.sortable({ 501 | items: '.egr-sorted-fieldset', 502 | handle: '.egr-sort', 503 | start: function(e, ui) { 504 | if(firstSort) { 505 | items.sortable('refreshPositions'); 506 | firstSort = false; 507 | } 508 | }, 509 | update: function( event, ui ) { 510 | EgrRender.render(obj); 511 | } 512 | }); 513 | }; 514 | 515 | fn.removeClasses = function(obj, this_obj) { 516 | obj.find('.egr-sorted-row').removeClass('egr-sorted-row'); 517 | obj.find('.egr-sorted-fieldsets').removeClass('egr-sorted-fieldsets'); 518 | obj.find('.egr-sorted-fieldset').removeClass('egr-sorted-fieldset'); 519 | }; 520 | 521 | fn.toggle = function(obj, this_obj) { 522 | var row = this_obj.closest('.egr-row'); 523 | var fieldsets = row.children('.egr-fieldsets'); 524 | var fieldset = fieldsets.children('.egr-fieldset'); 525 | fn.removeClasses(obj, this_obj); 526 | row.addClass('egr-sorted-row'); 527 | fieldsets.addClass('egr-sorted-fieldsets'); 528 | fieldset.addClass('egr-sorted-fieldset'); 529 | EgrSort.sort(obj); 530 | }; 531 | 532 | fn.sortUp = function(obj, this_obj) { 533 | var current = this_obj.closest('.egr-fieldset'); 534 | var prev = current.prev(); 535 | var cloned = prev.clone(true); 536 | current.after(cloned); 537 | prev.remove(); 538 | EgrRender.render(obj); 539 | }; 540 | 541 | fn.sortDown = function(obj, this_obj) { 542 | var current = this_obj.closest('.egr-fieldset'); 543 | var next = current.next(); 544 | var cloned = next.clone(true); 545 | current.before(cloned); 546 | next.remove(); 547 | EgrRender.render(obj); 548 | }; 549 | 550 | return fn; 551 | })(); 552 | var EgrToggleActive = (function () { 553 | var fn = {}; 554 | 555 | fn.toggle = function(obj, this_obj) { 556 | if(this_obj.hasClass('egr-delete-active')) return; 557 | 558 | obj.find('.egr-actions').hide(); 559 | this_obj.children('.egr-actions').css('display', 'flex'); 560 | EgrSort.toggle(obj, this_obj); 561 | }; 562 | 563 | fn.remove = function(obj, this_obj) { 564 | obj.find('.egr-actions').hide(); 565 | }; 566 | 567 | return fn; 568 | })(); 569 | var EgrToggleDropdown = (function () { 570 | var fn = {}; 571 | 572 | fn.toggle = function(obj, this_obj) { 573 | if(fn.count(this_obj) > 1) { 574 | if(this_obj.parent().hasClass('egr-dropdown-active')) { 575 | this_obj.parent().removeClass('egr-dropdown-active'); 576 | } else { 577 | obj.find('.egr-dropdown-active').removeClass('egr-dropdown-active'); 578 | this_obj.parent().addClass('egr-dropdown-active'); 579 | } 580 | } 581 | }; 582 | 583 | fn.count = function(this_obj) { 584 | return this_obj.find('.egr-add-select').length; 585 | }; 586 | 587 | return fn; 588 | })(); 589 | var EgrTrigger = (function () { 590 | var fn = {}; 591 | 592 | fn.trigger = function(row) { 593 | fn.triggerFields(row); 594 | fn.triggerPlugins(row); 595 | 596 | fn.checkDuplicates(row); 597 | }; 598 | 599 | fn.triggerFields = function(row) { 600 | row.find('[data-field="urlfield"]').removeData('urlfield').off('click').urlfield(); 601 | row.find('[data-field="date"]').removeData('date').off('change').date(); 602 | row.find('[data-field="imagefield"]').removeData('imagefield').imagefield(); 603 | row.find('[data-field="autocomplete"]').removeData('autocomplete').off('keydown keyup').autocomplete(); 604 | row.find('[data-field="editor"]').removeData('editor').off('keydown click').editor(); 605 | row.find('[data-field="counter"]').removeData('counter').counter(); 606 | }; 607 | 608 | fn.triggerPlugins = function(row) { 609 | if ( row.find('[data-field="images"]').length ) { 610 | row.find('[data-field="images"]').removeData('images').images(); 611 | } 612 | if ( row.find('[data-field="hero"]').length ) { 613 | row.find('[data-field="hero"]').removeData('hero').hero(); 614 | } 615 | if ( row.find('[data-field="quickselect"]').length ) { 616 | row.find('[data-field="quickselect"]').removeData('quickselect').quickselect(); 617 | } 618 | if ( row.find('[data-field="list"]').length ) { 619 | row.find('[data-field="list"]').removeData('list').list(); 620 | } 621 | }; 622 | 623 | fn.checkDuplicates = function(row) { 624 | var i = 0; 625 | var values = []; 626 | row.closest('.egr').find('.field').each(function( index ) { 627 | var classes = $(this).attr('class').split(" "); 628 | 629 | $.each(classes, function( index, value ) { 630 | if(value.endsWith("_egr__")) { 631 | values[i] = value; 632 | i++; 633 | } 634 | }); 635 | }); 636 | if(fn.hasDuplicates(values)) { 637 | console.log('Error: There are duplicates!'); 638 | } 639 | }; 640 | 641 | fn.hasDuplicates = function(array) { 642 | return (new Set(array)).size !== array.length; 643 | } 644 | 645 | return fn; 646 | })(); -------------------------------------------------------------------------------- /fields/engineer/assets/js/script.min.js: -------------------------------------------------------------------------------- 1 | var EgrAdd=function(){var e={};return e.add=function(t,r){var n=e.name(r),i=e.row(r),a=e.fieldsets(i);a.append(e.matchFieldset(i,n,t).clone()),EgrId.replace(a.children(".egr-fieldset").last()),EgrSort.sort(r),EgrCount.trigger(t,r),EgrTrigger.trigger(i),EgrRender.render(t)},e.name=function(e){return e.attr("data-add")},e.row=function(e){return e.closest(".egr-row")},e.id=function(e){return e.attr("data-id")},e.fieldsets=function(e){return e.children(".egr-fieldsets")},e.matchRow=function(t,r){var n=e.id(t);return $('.egr-outline[data-id="'+r.attr("data-name")+'"] .egr-row[data-id="'+n+'"]')},e.matchFieldsets=function(t,r){return e.matchRow(t,r).children(".egr-fieldsets")},e.matchFieldset=function(t,r,n){return e.matchFieldsets(t,n).children('[data-fieldset-name="'+r+'"]')},e}(),EgrClone=function(){var e={};return e.clone=function(t,r){var n=r.closest(".egr-fieldset"),i=e.duplicate(n);e.setSelects(i,e.getSelects(n)),EgrId.replace(i),EgrCount.trigger(t,r),EgrTrigger.trigger(r.closest(".egr-row")),EgrRender.render(t)},e.duplicate=function(e){var t=e.clone(!0);return e.after(t),e.next()},e.getSelects=function(e){var t=[],r=0;return e.find("select").each(function(e){$(this).val(),t[r]=$(this).val(),r++}),t},e.setSelects=function(e,t){var r=0;e.find("select").each(function(e){$(this).val(t[r]),r++})},e}(),EgrCount=function(){var e={};return e.trigger=function(e,t){var r=t.closest(".egr-row"),n=r.children(".egr-fieldsets").children(".egr-fieldset").length;r.attr("data-count",n)},e}(),EgrDelete=function(){var e={};return e.deleteMessage=function(t,r){var n=$(document).find(".egr-outline .egr-element-delete").first();e.deleteCancel(t,r),t.find(".egr-actions").hide(),r.closest(".egr-fieldset").addClass("egr-delete-active"),r.closest(".egr-fieldset").append(n.clone())},e.deleteAction=function(e,t){var r=t.closest(".egr-fieldsets");t.closest(".egr-fieldset").remove(),EgrSort.sort(e),EgrCount.trigger(e,r),EgrRender.render(e)},e.deleteCancel=function(e,t){e.find(".egr-element-delete").remove(),e.find(".egr-delete-active").removeClass("egr-delete-active")},e}(),EgrId=function(){var e={};return e.replace=function(t){var r=(new Date).getTime();e.replaceIds(t,r),e.replaceFors(t,r),e.replaceClasses(t,r),e.replaceNames(t,r),e.replacePrefixes(t,r),e.addFieldsetCount(t)},e.replaceIds=function(e,t){e.find('[id^="form-field-"]').each(function(e){var r=$(this).attr("id").replace(/_egr__/g,"_"+t+"_egr__");$(this).attr("id",r)})},e.replaceFors=function(e,t){e.find('[for^="form-field-"]').each(function(e){var r=$(this).attr("for").replace(/_egr__/g,"_"+t+"_egr__");$(this).attr("for",r)})},e.replaceClasses=function(e,t){e.find('[data-field-name][class^="field "]').each(function(e){var r=$(this).attr("class").replace(/_egr__/g,"_"+t+"_egr__");$(this).attr("class",r)})},e.replaceNames=function(e,t){e.find("[name]").each(function(e){var r=$(this).attr("name").replace(/_egr__/g,"_"+t+"_egr__");$(this).attr("name",r)})},e.replacePrefixes=function(e,t){e.find("[data-prefix]").each(function(e){var r=$(this).attr("data-prefix").replace(/_egr__/g,"_"+t+"_egr__");$(this).attr("data-prefix",r)})},e.addFieldsetCount=function(e){var t=e.closest(".egr-row"),r=t.children(".egr-row-actions").find(".egr-add-select").length;r=0==r?1:r,t.attr("data-fieldset-count",r)},e}(),EgrOutline=function(){var e={};return e.set=function(e){var t=e.find(".egr-outline"),r=e.attr("data-name");$(".mainbar").children(".section").prepend('
'+t.html()+"
"),t.remove()},e}();EgrRender=function(){var e={};return e.render=function(t){var r=t.find(".egr-presentation").children(),n="",i=t.find(".egr-output").find("textarea");n=e.renderLoop(r,n,1,!0),i.val(n),i.blur()},e.renderLoop=function(t,r,n){return t.each(function(t){var i=$(this),a=i.attr("data-field-name"),o=i.parents(".egr-row").length,d=" ".repeat(o);if(i.hasClass("egr-row")){n||(r+=d+a+":\n");var c=$(this).children(".egr-fieldsets").children();o>0&&(d+=" "),c.each(function(t){var n=$(this),a=n.children(".egr-fields").children();void 0!=n.attr("data-fieldset-name")&&(r+=d+"-\n",r+=e.setFieldsetName(d,i,n)),r=e.renderLoop(a,r,!1)})}else{i.parent().parent();var s=e.getSelector(a,i),l=e.findFormElement(s,i),f=e.getElement(l,a,d);f&&(r+=d+f)}}),r},e.getSelector=function(e,t){return e+t.attr("data-prefix")},e.findFormElement=function(e,t){var r='[name="'+e+'"]:not(label)',n='[name^="'+e+'["]:not(label)';return t.find(r+","+n)},e.getElement=function(t,r,n){var i=t.prop("nodeName"),a=t.length<2,o="";switch(i){case"TEXTAREA":o+=e.textarea(t,r,n);break;case"INPUT":switch(t.attr("type")){case"radio":o+=e.radio(t,r,n);break;case"checkbox":o+=a?e.checkbox(t,r,n):e.checkboxes(t,r,n);break;default:t.hasClass("images")?o+=e.textarea(t,r,n):o+=a?e.input(t,r,a,n):"datetime"==r?e.input(t,r):e.inputs(t,r,n)}break;case"SELECT":o+=e.select(t,r,n)}return o},e.setFieldsetName=function(e,t,r){var n=r.attr("data-fieldset-name");return 1==t.attr("data-fieldset-count")&&"default"==n?"":e+" _fieldset: "+n+"\n"},e.inputs=function(e,t,r){var n="",i=r+" ";return e.each(function(e){var t=$(this).val();t=t.replace(/"/g,'\\"'),n+=i+'- "'+t+'"\n'}),n=n.slice(0,-1),t+": \n"+n+"\n"},e.input=function(e,t){var r="";return e.each(function(e){r+=$(this).val()+" "}),r=r.slice(0,-1),r=r.replace(/"/g,'\\"'),t+': "'+r+'"\n'},e.textarea=function(t,r,n){var i=t.val(),a=n+" ";return i.indexOf("\n")>-1?""!=(i=i.replace(/(?:\r\n|\r|\n)/g,"\n"+a))?r+": |\n"+a+i+"\n":"":e.input(t,r)},e.select=function(e,t){var r=e.val();return r=r.replace(/"/g,'\\"'),t+': "'+r+'"\n'},e.radio=function(e,t){return out="",e.each(function(e){if($(this).is(":checked")){var r=$(this).val();"true"!=r&&"false"!=r||(r="'"+r+"'"),out+=t+": "+r+"\n"}}),out},e.checkbox=function(e,t){return out="",e.each(function(e){if($(this).is(":checked")){var r=$(this).val();"on"==r&&(r="true"),out+=t+": "+r+"\n"}else out+=t+": false\n"}),out},e.checkboxes=function(e,t,r){return out="",e.each(function(e){$(this).is(":checked")&&(out+=r+" - "+$(this).val()+"\n")}),""!=out&&(out=t+":\n"+out),out},e}(),function(e){e.fn.engineer=function(){return this.each(function(){var t=e(this);if(t.data("engineer"))return!0;t.data("engineer",!0),EgrOutline.set(t),t.on("click",".egr [data-add]",function(){EgrAdd.add(t,e(this))}),t.on("click",".egr-delete-apply",function(){EgrDelete.deleteAction(t,e(this))}),t.on("click",".egr-delete-cancel",function(){EgrDelete.deleteCancel(t,e(this))}),t.on("click",".egr-clone",function(){EgrClone.clone(t,e(this))}),t.on("click",".egr-fieldset",function(r){e(r.target).closest(".egr-fieldset").not(this).length||EgrToggleActive.toggle(t,e(this))}),t.on("click",".egr-delete",function(){EgrDelete.deleteMessage(t,e(this))}),e(document).on("click",function(r){e(r.target).closest(".egr-add-button").not(this).length||e(document).find(".egr-dropdown-active").removeClass("egr-dropdown-active"),e(r.target).closest(".egr-fieldset").not(this).length||EgrToggleActive.remove(t,e(this))}),t.on("click",".egr-sort-up",function(r){EgrSort.sortUp(t,e(this))}),t.on("click",".egr-sort-down",function(r){EgrSort.sortDown(t,e(this))}),t.on("click",".egr-add-button",function(r){e(r.target).closest(".egr-add-button").not(this).length||EgrToggleDropdown.toggle(t,e(this))}),EgrSort.sort(t),t.find(".egr-presentation").on("input click change","input, select, textarea",function(){EgrRender.render(t,e(this))})})}}(jQuery);var EgrSort=function(){var e={};return e.sort=function(e){var t=e.find(".egr"),r=!0;t.sortable({items:".egr-sorted-fieldset",handle:".egr-sort",start:function(e,n){r&&(t.sortable("refreshPositions"),r=!1)},update:function(t,r){EgrRender.render(e)}})},e.removeClasses=function(e,t){e.find(".egr-sorted-row").removeClass("egr-sorted-row"),e.find(".egr-sorted-fieldsets").removeClass("egr-sorted-fieldsets"),e.find(".egr-sorted-fieldset").removeClass("egr-sorted-fieldset")},e.toggle=function(t,r){var n=r.closest(".egr-row"),i=n.children(".egr-fieldsets"),a=i.children(".egr-fieldset");e.removeClasses(t,r),n.addClass("egr-sorted-row"),i.addClass("egr-sorted-fieldsets"),a.addClass("egr-sorted-fieldset"),EgrSort.sort(t)},e.sortUp=function(e,t){var r=t.closest(".egr-fieldset"),n=r.prev(),i=n.clone(!0);r.after(i),n.remove(),EgrRender.render(e)},e.sortDown=function(e,t){var r=t.closest(".egr-fieldset"),n=r.next(),i=n.clone(!0);r.before(i),n.remove(),EgrRender.render(e)},e}(),EgrToggleActive=function(){var e={};return e.toggle=function(e,t){t.hasClass("egr-delete-active")||(e.find(".egr-actions").hide(),t.children(".egr-actions").css("display","flex"),EgrSort.toggle(e,t))},e.remove=function(e,t){e.find(".egr-actions").hide()},e}(),EgrToggleDropdown=function(){var e={};return e.toggle=function(t,r){e.count(r)>1&&(r.parent().hasClass("egr-dropdown-active")?r.parent().removeClass("egr-dropdown-active"):(t.find(".egr-dropdown-active").removeClass("egr-dropdown-active"),r.parent().addClass("egr-dropdown-active")))},e.count=function(e){return e.find(".egr-add-select").length},e}(),EgrTrigger=function(){var e={};return e.trigger=function(t){e.triggerFields(t),e.triggerPlugins(t),e.checkDuplicates(t)},e.triggerFields=function(e){e.find('[data-field="urlfield"]').removeData("urlfield").off("click").urlfield(),e.find('[data-field="date"]').removeData("date").off("change").date(),e.find('[data-field="imagefield"]').removeData("imagefield").imagefield(),e.find('[data-field="autocomplete"]').removeData("autocomplete").off("keydown keyup").autocomplete(),e.find('[data-field="editor"]').removeData("editor").off("keydown click").editor(),e.find('[data-field="counter"]').removeData("counter").counter()},e.triggerPlugins=function(e){e.find('[data-field="images"]').length&&e.find('[data-field="images"]').removeData("images").images(),e.find('[data-field="hero"]').length&&e.find('[data-field="hero"]').removeData("hero").hero(),e.find('[data-field="quickselect"]').length&&e.find('[data-field="quickselect"]').removeData("quickselect").quickselect(),e.find('[data-field="list"]').length&&e.find('[data-field="list"]').removeData("list").list()},e.checkDuplicates=function(t){var r=0,n=[];t.closest(".egr").find(".field").each(function(e){var t=$(this).attr("class").split(" ");$.each(t,function(e,t){t.endsWith("_egr__")&&(n[r]=t,r++)})}),e.hasDuplicates(n)&&console.log("Error: There are duplicates!")},e.hasDuplicates=function(e){return new Set(e).size!==e.length},e}(); -------------------------------------------------------------------------------- /fields/engineer/engineer.php: -------------------------------------------------------------------------------- 1 | Presentation = new \Engineer\Presentation(); 7 | $this->PresentationArray = new \Engineer\PresentationArray(); 8 | $this->Outline = new \Engineer\Outline(); 9 | $this->Field = new \Engineer\Field(); 10 | } 11 | 12 | public function presentation() { 13 | return $this->Presentation; 14 | } 15 | 16 | public function presentationArray() { 17 | return $this->PresentationArray; 18 | } 19 | 20 | public function outline() { 21 | return $this->Outline; 22 | } 23 | 24 | public function setField() { 25 | return $this->Field(); 26 | } 27 | 28 | public function input() { 29 | $blueprint = $this->page->blueprint()->yaml['fields'][$this->name]; 30 | 31 | $outline = $this->outline()->set($blueprint, $this->name); 32 | $presentation_array = $this->presentationArray()->prepare($blueprint); 33 | 34 | $presentation = $this->presentation()->set($presentation_array, yaml($this->value)); 35 | unset($presentation['label']); 36 | 37 | kirby()->set('option', 'egr.count', 0); 38 | 39 | $args['args'] = array( 40 | 'instance' => $this, 41 | 'outline' => array( 42 | 'instance' => $this, 43 | 'outline' => $outline 44 | ), 45 | 'presentation' => array( 46 | 'instance' => $this, 47 | 'presentation' => $presentation, 48 | 'field_name' => $this->name, 49 | 'id' => $this->name 50 | ), 51 | ); 52 | 53 | $template = egr::snippet('template', $args); 54 | return $template; 55 | } 56 | 57 | public function element() { 58 | $element = parent::element(); 59 | $element->data('field', 'engineer'); 60 | $element->data('name', $this->name); 61 | return $element; 62 | } 63 | } 64 | 65 | if(c::get('engineer.debug', false)) { 66 | EngineerField::$assets = array( 67 | 'css' => array('style.css'), 68 | 'js' => array('script.js'), 69 | ); 70 | } else { 71 | EngineerField::$assets = array( 72 | 'css' => array('style.min.css'), 73 | 'js' => array('script.min.js'), 74 | ); 75 | } -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | var gulp = require('gulp'); 2 | 3 | var autoprefixer = require('gulp-autoprefixer'); 4 | var cssmin = require('gulp-cssmin'); 5 | var notify = require('gulp-notify'); 6 | var sass = require('gulp-sass'); 7 | var rename = require('gulp-rename'); 8 | var uglify = require('gulp-uglify'); 9 | var concat = require('gulp-concat'); 10 | var gutil = require('gulp-util'); 11 | //var sourcemaps = require('gulp-sourcemaps'); 12 | 13 | // css 14 | gulp.task('css', function() { 15 | gulp.src('assets/scss/style.scss') 16 | .pipe(sourcemaps.init()) 17 | .pipe(sass().on('error', sass.logError)) 18 | //.pipe(sourcemaps.write('')) 19 | .pipe(gulp.dest('fields/engineer/assets/css')) 20 | .pipe(cssmin()) 21 | .pipe(rename({suffix: '.min'})) 22 | .pipe(gulp.dest('fields/engineer/assets/css')) 23 | .pipe(notify("CSS generated!")) 24 | ; 25 | }); 26 | 27 | // JS 28 | gulp.task('js', function() { 29 | gulp.src('assets/js/*.js') 30 | .pipe(concat('script.js')) 31 | .pipe(gulp.dest('fields/engineer/assets/js')) 32 | .pipe(uglify()).on('error', function (err) { gutil.log(gutil.colors.red('[Error]'), err.toString()); }) 33 | .pipe(rename({suffix: '.min'})) 34 | .pipe(gulp.dest('fields/engineer/assets/js')) 35 | .pipe(notify("JS generated!")) 36 | ; 37 | }); 38 | 39 | // Default 40 | gulp.task('default',function() { 41 | gulp.watch('assets/scss/*.scss',['css']); 42 | gulp.watch('assets/js/*.js',['js']); 43 | }); -------------------------------------------------------------------------------- /lib/field.php: -------------------------------------------------------------------------------- 1 | set('option', 'egr.count', kirby()->get('option', 'egr.count', 0) + 1); 11 | } 12 | 13 | $value = (isset($subfield['value'])) ? $subfield['value'] : null; 14 | 15 | if(is_array($value)) { 16 | $value = implode("\n" , $value); 17 | } 18 | 19 | $suffix = $count . '_egr__'; 20 | $name = $key . $suffix; 21 | $subfield = $this->fixSubfield($subfield); 22 | $form = new \EngineerForm( 23 | array($name => $subfield), 24 | array($name => $value), 25 | $page 26 | ); 27 | $form = $this->fixLabel($form); 28 | $form = $this->manipulate($form, $key, $suffix); 29 | return $form; 30 | } 31 | 32 | function fixLabel($form) { 33 | return str_replace('