├── .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 | 
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 | [](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 | [](docs/fieldsets.png)
16 |
17 | **Nesting**
18 |
19 | It's possible nest Engineer fields in the blueprint. There is no depth limit.
20 |
21 | [](docs/nesting.png)
22 |
23 | **Sorting**
24 |
25 | Sort the rows by drag and drop or by the sort arrows.
26 |
27 | [](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 | 
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('