Added the modal sub subform for the view builder in the Assistant.
This commit is contained in:
parent
185dad4273
commit
f67dbfdd53
|
@ -144,11 +144,11 @@ TODO
|
|||
+ *Author*: [Llewellyn van der Merwe](mailto:llewellyn@joomlacomponentbuilder.com)
|
||||
+ *Name*: [Component Builder](https://github.com/vdm-io/Joomla-Component-Builder)
|
||||
+ *First Build*: 30th April, 2015
|
||||
+ *Last Build*: 3rd January, 2020
|
||||
+ *Last Build*: 5th January, 2020
|
||||
+ *Version*: 2.10.10
|
||||
+ *Copyright*: Copyright (C) 2015 - 2019 Vast Development Method. All rights reserved.
|
||||
+ *License*: GNU General Public License version 2 or later; see LICENSE.txt
|
||||
+ *Line count*: **280105**
|
||||
+ *Line count*: **280701**
|
||||
+ *Field count*: **1503**
|
||||
+ *File count*: **1769**
|
||||
+ *Folder count*: **280**
|
||||
|
|
|
@ -144,11 +144,11 @@ TODO
|
|||
+ *Author*: [Llewellyn van der Merwe](mailto:llewellyn@joomlacomponentbuilder.com)
|
||||
+ *Name*: [Component Builder](https://github.com/vdm-io/Joomla-Component-Builder)
|
||||
+ *First Build*: 30th April, 2015
|
||||
+ *Last Build*: 3rd January, 2020
|
||||
+ *Last Build*: 5th January, 2020
|
||||
+ *Version*: 2.10.10
|
||||
+ *Copyright*: Copyright (C) 2015 - 2019 Vast Development Method. All rights reserved.
|
||||
+ *License*: GNU General Public License version 2 or later; see LICENSE.txt
|
||||
+ *Line count*: **280105**
|
||||
+ *Line count*: **280701**
|
||||
+ *Field count*: **1503**
|
||||
+ *File count*: **1769**
|
||||
+ *Folder count*: **280**
|
||||
|
|
|
@ -591,3 +591,406 @@ function getKeyID(key) {
|
|||
// return the id build
|
||||
return keyID;
|
||||
}
|
||||
|
||||
jQuery.string_replace = function (search, replace, subject, countObj) {
|
||||
// discuss at: https://locutus.io/php/str_replace/
|
||||
// original by: Kevin van Zonneveld (https://kvz.io)
|
||||
// improved by: Gabriel Paderni
|
||||
// improved by: Philip Peterson
|
||||
// improved by: Simon Willison (https://simonwillison.net)
|
||||
// improved by: Kevin van Zonneveld (https://kvz.io)
|
||||
// improved by: Onno Marsman (https://twitter.com/onnomarsman)
|
||||
// improved by: Brett Zamir (https://brett-zamir.me)
|
||||
// revised by: Jonas Raoni Soares Silva (https://www.jsfromhell.com)
|
||||
// bugfixed by: Anton Ongson
|
||||
// bugfixed by: Kevin van Zonneveld (https://kvz.io)
|
||||
// bugfixed by: Oleg Eremeev
|
||||
// bugfixed by: Glen Arason (https://CanadianDomainRegistry.ca)
|
||||
// bugfixed by: Glen Arason (https://CanadianDomainRegistry.ca)
|
||||
// input by: Onno Marsman (https://twitter.com/onnomarsman)
|
||||
// input by: Brett Zamir (https://brett-zamir.me)
|
||||
// input by: Oleg Eremeev
|
||||
// note 1: The countObj parameter (optional) if used must be passed in as a
|
||||
// note 1: object. The count will then be written by reference into it's `value` property
|
||||
// example 1: str_replace(' ', '.', 'Kevin van Zonneveld')
|
||||
// returns 1: 'Kevin.van.Zonneveld'
|
||||
// example 2: str_replace(['{name}', 'l'], ['hello', 'm'], '{name}, lars')
|
||||
// returns 2: 'hemmo, mars'
|
||||
// example 3: str_replace(Array('S','F'),'x','ASDFASDF')
|
||||
// returns 3: 'AxDxAxDx'
|
||||
// example 4: var countObj = {}
|
||||
// example 4: str_replace(['A','D'], ['x','y'] , 'ASDFASDF' , countObj)
|
||||
// example 4: var $result = countObj.value
|
||||
// returns 4: 4
|
||||
var i = 0
|
||||
var j = 0
|
||||
var temp = ''
|
||||
var repl = ''
|
||||
var sl = 0
|
||||
var fl = 0
|
||||
var f = [].concat(search)
|
||||
var r = [].concat(replace)
|
||||
var s = subject
|
||||
var ra = Object.prototype.toString.call(r) === '[object Array]'
|
||||
var sa = Object.prototype.toString.call(s) === '[object Array]'
|
||||
s = [].concat(s)
|
||||
|
||||
var $global = (typeof window !== 'undefined' ? window : global)
|
||||
$global.$locutus = $global.$locutus || {}
|
||||
var $locutus = $global.$locutus
|
||||
$locutus.php = $locutus.php || {}
|
||||
|
||||
if (typeof (search) === 'object' && typeof (replace) === 'string') {
|
||||
temp = replace
|
||||
replace = []
|
||||
for (i = 0; i < search.length; i += 1) {
|
||||
replace[i] = temp
|
||||
}
|
||||
temp = ''
|
||||
r = [].concat(replace)
|
||||
ra = Object.prototype.toString.call(r) === '[object Array]'
|
||||
}
|
||||
|
||||
if (typeof countObj !== 'undefined') {
|
||||
countObj.value = 0
|
||||
}
|
||||
|
||||
for (i = 0, sl = s.length; i < sl; i++) {
|
||||
if (s[i] === '') {
|
||||
continue
|
||||
}
|
||||
for (j = 0, fl = f.length; j < fl; j++) {
|
||||
temp = s[i] + ''
|
||||
repl = ra ? (r[j] !== undefined ? r[j] : '') : r[0]
|
||||
s[i] = (temp).split(f[j]).join(repl)
|
||||
if (typeof countObj !== 'undefined') {
|
||||
countObj.value += ((temp.split(f[j])).length - 1)
|
||||
}
|
||||
}
|
||||
}
|
||||
return sa ? s : s[0]
|
||||
}
|
||||
|
||||
/**
|
||||
* @copyright Copyright (C) 2005 - 2019 Open Source Matters, Inc. All rights reserved.
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
;(function($){
|
||||
"use strict";
|
||||
$.subformRepeatableVDM = function(container, options){
|
||||
this.$container = $(container);
|
||||
|
||||
// check if already exist
|
||||
if(this.$container.data("subformRepeatableVDM")){
|
||||
return self;
|
||||
}
|
||||
|
||||
// Add a reverse reference to the DOM object
|
||||
this.$container.data("subformRepeatableVDM", self);
|
||||
|
||||
// merge options
|
||||
this.options = $.extend({}, $.subformRepeatableVDM.defaults, options);
|
||||
|
||||
// template for the repeating group
|
||||
this.template = '';
|
||||
|
||||
// prepare a row template, and find available field names
|
||||
this.prepareTemplate();
|
||||
|
||||
// check rows container
|
||||
this.$containerRows = this.options.rowsContainer ? this.$container.find(this.options.rowsContainer) : this.$container;
|
||||
|
||||
// To avoid scope issues,
|
||||
var self = this;
|
||||
|
||||
// bind add button
|
||||
this.$container.on('click', this.options.btAdd, function (e) {
|
||||
e.preventDefault();
|
||||
var after = $(this).parents(self.options.repeatableElement);
|
||||
if(!after.length){
|
||||
after = null;
|
||||
}
|
||||
self.addRow(after);
|
||||
});
|
||||
|
||||
// bind remove button
|
||||
this.$container.on('click', this.options.btRemove, function (e) {
|
||||
e.preventDefault();
|
||||
var $row = $(this).parents(self.options.repeatableElement);
|
||||
self.removeRow($row);
|
||||
});
|
||||
|
||||
// bind move button
|
||||
if(this.options.btMove){
|
||||
this.$containerRows.sortable({
|
||||
items: this.options.repeatableElement,
|
||||
handle: this.options.btMove,
|
||||
tolerance: 'pointer'
|
||||
});
|
||||
}
|
||||
|
||||
// tell all that we a ready
|
||||
this.$container.trigger('subform-ready');
|
||||
};
|
||||
|
||||
// prepare a template that we will use repeating
|
||||
$.subformRepeatableVDM.prototype.prepareTemplate = function(){
|
||||
// create from template
|
||||
if (this.options.rowTemplateSelector) {
|
||||
// Find the template element and get its HTML content, this is our template.
|
||||
var $tmplElement = this.$container.find(this.options.rowTemplateSelector).last();
|
||||
|
||||
this.template = $.trim($tmplElement.html()) || '';
|
||||
|
||||
// This is IE fix for <template>
|
||||
$tmplElement.css('display', 'none'); // Make sure it not visible
|
||||
var map = {'SUBFORMLT': '<', 'SUBFORMGT': '>'};
|
||||
this.template = this.template.replace(/(SUBFORMLT)|(SUBFORMGT)/g, function(match){
|
||||
return map[match];
|
||||
});
|
||||
}
|
||||
// create from existing rows
|
||||
else {
|
||||
//find first available
|
||||
var row = this.$container.find(this.options.repeatableElement).get(0),
|
||||
$row = $(row).clone();
|
||||
|
||||
// clear scripts that can be attached to the fields
|
||||
try {
|
||||
this.clearScripts($row);
|
||||
} catch (e) {
|
||||
if(window.console){
|
||||
console.log(e);
|
||||
}
|
||||
}
|
||||
|
||||
this.template = $row.prop('outerHTML');
|
||||
}
|
||||
};
|
||||
|
||||
// add new row
|
||||
$.subformRepeatableVDM.prototype.addRow = function(after){
|
||||
// count how much we already have
|
||||
var count = this.$containerRows.find(this.options.repeatableElement).length;
|
||||
if(count >= this.options.maximum){
|
||||
return null;
|
||||
}
|
||||
|
||||
// make new from template
|
||||
var row = $.parseHTML(this.template);
|
||||
|
||||
// add to container
|
||||
if(after){
|
||||
$(after).after(row);
|
||||
} else {
|
||||
this.$containerRows.append(row);
|
||||
}
|
||||
|
||||
var $row = $(row);
|
||||
|
||||
//add marker that it is new
|
||||
$row.attr('data-new', 'true');
|
||||
// fix names and id`s, and reset values
|
||||
this.fixUniqueAttributes($row, count);
|
||||
|
||||
// fix VDM dynamic values (real pain, could they not have made this easier!!!)
|
||||
var _vdm_counter = $row.attr('data-group');
|
||||
_vdm_counter = _vdm_counter.replace ( /[^\d.]/g, '' );
|
||||
$row[0].innerHTML = $.string_replace("VDM-XX", _vdm_counter, $row[0].innerHTML);
|
||||
|
||||
// try find out with related scripts,
|
||||
// tricky thing, so be careful
|
||||
try {
|
||||
this.fixScripts($row);
|
||||
} catch (e) {
|
||||
if(window.console){
|
||||
console.log(e);
|
||||
}
|
||||
}
|
||||
|
||||
// tell everyone about the new row
|
||||
this.$container.trigger('subform-row-add', $row);
|
||||
return $row;
|
||||
};
|
||||
|
||||
// remove row
|
||||
$.subformRepeatableVDM.prototype.removeRow = function($row){
|
||||
// count how much we have
|
||||
var count = this.$containerRows.find(this.options.repeatableElement).length;
|
||||
if(count <= this.options.minimum){
|
||||
return;
|
||||
}
|
||||
|
||||
// tell everyoune about the row will be removed
|
||||
this.$container.trigger('subform-row-remove', $row);
|
||||
$row.remove();
|
||||
};
|
||||
|
||||
// fix names and id`s for fields in $row
|
||||
$.subformRepeatableVDM.prototype.fixUniqueAttributes = function(
|
||||
$row, // the jQuery object to do fixes in
|
||||
_count, // existing count of rows
|
||||
_group, // current group name, e.g. 'optionsX'
|
||||
_basename // group base name, without count, e.g. 'options'
|
||||
) {
|
||||
var group = (typeof _group === 'undefined' ? $row.attr('data-group') : _group),
|
||||
basename = (typeof _basename === 'undefined' ? $row.attr('data-base-name') : _basename),
|
||||
count = (typeof _count === 'undefined' ? 0 : _count),
|
||||
groupnew = basename + count;
|
||||
|
||||
$row.attr('data-group', groupnew);
|
||||
|
||||
// Fix inputs that have a "name" attribute
|
||||
var haveName = $row.find('[name]'),
|
||||
ids = {}; // Collect id for fix checkboxes and radio
|
||||
|
||||
for (var i = 0, l = haveName.length; i < l; i++) {
|
||||
var $el = $(haveName[i]),
|
||||
name = $el.attr('name'),
|
||||
id = name.replace(/(\[\]$)/g, '').replace(/(\]\[)/g, '__').replace(/\[/g, '_').replace(/\]/g, ''), // id from name
|
||||
nameNew = name.replace('[' + group + '][', '['+ groupnew +']['), // New name
|
||||
idNew = id.replace(group, groupnew).replace(/\W/g, '_'), // Count new id
|
||||
countMulti = 0, // count for multiple radio/checkboxes
|
||||
forOldAttr = id; // Fix "for" in the labels
|
||||
|
||||
if ($el.prop('type') === 'checkbox' && name.match(/\[\]$/)) { // <input type="checkbox" name="name[]"> fix
|
||||
// Recount id
|
||||
countMulti = ids[id] ? ids[id].length : 0;
|
||||
if (!countMulti) {
|
||||
// Set the id for fieldset and group label
|
||||
$el.closest('fieldset.checkboxes').attr('id', idNew);
|
||||
$row.find('label[for="' + id + '"]').attr('for', idNew).attr('id', idNew + '-lbl');
|
||||
}
|
||||
forOldAttr = forOldAttr + countMulti;
|
||||
idNew = idNew + countMulti;
|
||||
}
|
||||
else if ($el.prop('type') === 'radio') { // <input type="radio"> fix
|
||||
// Recount id
|
||||
countMulti = ids[id] ? ids[id].length : 0;
|
||||
if (!countMulti) {
|
||||
// Set the id for fieldset and group label
|
||||
$el.closest('fieldset.radio').attr('id', idNew);
|
||||
$row.find('label[for="' + id + '"]').attr('for', idNew).attr('id', idNew + '-lbl');
|
||||
}
|
||||
forOldAttr = forOldAttr + countMulti;
|
||||
idNew = idNew + countMulti;
|
||||
}
|
||||
|
||||
// Cache already used id
|
||||
if (ids[id]) {
|
||||
ids[id].push(true);
|
||||
} else {
|
||||
ids[id] = [true];
|
||||
}
|
||||
|
||||
// Replace the name to new one
|
||||
$el.attr('name', nameNew);
|
||||
// Set new id
|
||||
$el.attr('id', idNew);
|
||||
// Guess there a label for this input
|
||||
$row.find('label[for="' + forOldAttr + '"]').attr('for', idNew).attr('id', idNew + '-lbl');
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursively replace our basename + old group with basename + new group
|
||||
* inside of nested subform template elements. First we try to find such
|
||||
* template elements, then we iterate through them and do the same replacements
|
||||
* that we have made here inside of them.
|
||||
*/
|
||||
var nestedTemplates = $row.find(this.options.rowTemplateSelector);
|
||||
// If we found it, iterate over the found ones (might be more than one!)
|
||||
for (var j = 0; j < nestedTemplates.length; j++) {
|
||||
// Get the nested templates content (as DocumentFragment) and cast it
|
||||
// to a jQuery object
|
||||
var nestedTemplate = $($(nestedTemplates[j]).prop('content'));
|
||||
// Fix the attributes for this nested template.
|
||||
this.fixUniqueAttributes(nestedTemplate, count, group, basename);
|
||||
}
|
||||
};
|
||||
|
||||
// remove scripts attached to fields
|
||||
// @TODO: make thing better when something like that will be accepted https://github.com/joomla/joomla-cms/pull/6357
|
||||
$.subformRepeatableVDM.prototype.clearScripts = function($row){
|
||||
// destroy chosen if any
|
||||
if($.fn.chosen){
|
||||
$row.find('select.chzn-done').each(function(){
|
||||
var $el = $(this);
|
||||
$el.next('.chzn-container').remove();
|
||||
$el.show().addClass('fix-chosen');
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// method for hack the scripts that can be related
|
||||
// to the one of field that in given $row
|
||||
// @TODO Stop using this function. Elements within subforms should initialize themselves
|
||||
$.subformRepeatableVDM.prototype.fixScripts = function($row){
|
||||
// fix media field
|
||||
$row.find('a[onclick*="jInsertFieldValue"]').each(function(){
|
||||
var $el = $(this),
|
||||
inputId = $el.siblings('input[type="text"]').attr('id'),
|
||||
$select = $el.prev(),
|
||||
oldHref = $select.attr('href');
|
||||
// update the clear button
|
||||
$el.attr('onclick', "jInsertFieldValue('', '" + inputId + "');return false;")
|
||||
// update select button
|
||||
$select.attr('href', oldHref.replace(/&fieldid=(.+)&/, '&fieldid=' + inputId + '&'));
|
||||
});
|
||||
};
|
||||
|
||||
// defaults
|
||||
$.subformRepeatableVDM.defaults = {
|
||||
// button selector for "add" action, must be unique per nested subform!
|
||||
btAdd: ".group-add",
|
||||
// button selector for "remove" action, must be unique per nested subform!
|
||||
btRemove: ".group-remove",
|
||||
// button selector for "move" action, must be unique per nested subform!
|
||||
btMove: ".group-move",
|
||||
// minimum repeating
|
||||
minimum: 0,
|
||||
// maximum repeating
|
||||
maximum: 10,
|
||||
// selector for the repeatable element inside the main container,
|
||||
// must be unique per nested subform!
|
||||
repeatableElement: ".subform-repeatable-group",
|
||||
// selector for the row template element with URL-encoded template inside it,
|
||||
// must *NOT* be unique per nested subform!
|
||||
rowTemplateSelector: 'template.subform-repeatable-template-section',
|
||||
// container for rows, same as main container by default
|
||||
rowsContainer: null
|
||||
};
|
||||
|
||||
$.fn.subformRepeatableVDM = function(options){
|
||||
return this.each(function(){
|
||||
var options = options || {},
|
||||
data = $(this).data();
|
||||
|
||||
if(data.subformRepeatableVDM){
|
||||
// Alredy initialized, nothing to do here
|
||||
return;
|
||||
}
|
||||
|
||||
for (var p in data) {
|
||||
// check options in the element
|
||||
if (data.hasOwnProperty(p)) {
|
||||
options[p] = data[p];
|
||||
}
|
||||
}
|
||||
|
||||
var inst = new $.subformRepeatableVDM(this, options);
|
||||
$(this).data('subformRepeatableVDM', inst);
|
||||
});
|
||||
};
|
||||
|
||||
// initialise all available on load and again within any added row
|
||||
$(function ($) {
|
||||
initSubform();
|
||||
$(document).on('subform-row-add', initSubform);
|
||||
|
||||
function initSubform (event, container) {
|
||||
$(container || document).find('div.subform-repeatable-vdm').subformRepeatableVDM();
|
||||
}
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
|
|
|
@ -5025,6 +5025,7 @@ COM_COMPONENTBUILDER_FIELD_BASIC_ENCRYPTION_LOCALDBKEY="Basic Encryption (local-
|
|||
COM_COMPONENTBUILDER_FIELD_BIGINT="BIGINT"
|
||||
COM_COMPONENTBUILDER_FIELD_BLOB="BLOB"
|
||||
COM_COMPONENTBUILDER_FIELD_BSB_NOT_FOUND_IN_LOCAL_DATABASE_TABLE_S_SO_IMPORTED_OF_ITS_VALUES_FAILED_PLEASE_UPDATE_YOUR_JCB_INSTALL_AND_TRY_AGAIN="Field <b>%s</b> not found in local database table (%s) so imported of its values failed, please update your JCB install and try again."
|
||||
COM_COMPONENTBUILDER_FIELD_BUILDER="Field Builder"
|
||||
COM_COMPONENTBUILDER_FIELD_CATID_DESCRIPTION="select one of the following categories"
|
||||
COM_COMPONENTBUILDER_FIELD_CATID_LABEL="Category"
|
||||
COM_COMPONENTBUILDER_FIELD_CHAR="CHAR"
|
||||
|
@ -5114,7 +5115,7 @@ COM_COMPONENTBUILDER_FIELD_MODIFIED_BY_DESC="The last user that modified this Fi
|
|||
COM_COMPONENTBUILDER_FIELD_MODIFIED_BY_LABEL="Modified By"
|
||||
COM_COMPONENTBUILDER_FIELD_MODIFIED_DATE_DESC="The date this Field was modified."
|
||||
COM_COMPONENTBUILDER_FIELD_MODIFIED_DATE_LABEL="Modified Date"
|
||||
COM_COMPONENTBUILDER_FIELD_NAME="Name"
|
||||
COM_COMPONENTBUILDER_FIELD_NAME="Field Name"
|
||||
COM_COMPONENTBUILDER_FIELD_NAME_DESCRIPTION="Enter Name Here"
|
||||
COM_COMPONENTBUILDER_FIELD_NAME_HINT="Name Here"
|
||||
COM_COMPONENTBUILDER_FIELD_NAME_LABEL="Name"
|
||||
|
@ -5266,6 +5267,7 @@ COM_COMPONENTBUILDER_FIELD_TINYBLOB="TINYBLOB"
|
|||
COM_COMPONENTBUILDER_FIELD_TINYINT="TINYINT"
|
||||
COM_COMPONENTBUILDER_FIELD_TWO_HUNDRED_AND_FIFTY_FIVE="255"
|
||||
COM_COMPONENTBUILDER_FIELD_TWO_THOUSAND_AND_FORTY_EIGHT="2048"
|
||||
COM_COMPONENTBUILDER_FIELD_TYPE="Field Type"
|
||||
COM_COMPONENTBUILDER_FIELD_TYPE_INFO="Type Info"
|
||||
COM_COMPONENTBUILDER_FIELD_UNIQUE_KEY="UNIQUE KEY"
|
||||
COM_COMPONENTBUILDER_FIELD_VARCHAR="VARCHAR"
|
||||
|
@ -5517,6 +5519,7 @@ COM_COMPONENTBUILDER_ISOLATE="Isolate"
|
|||
COM_COMPONENTBUILDER_ISSUE="issue"
|
||||
COM_COMPONENTBUILDER_IS_NOT_ONLY_FOUR_LISTRADIOCHECKBOXES="Is Not (only 4 list/radio/checkboxes)"
|
||||
COM_COMPONENTBUILDER_IS_ONLY_FOUR_LISTRADIOCHECKBOXES="Is (only 4 list/radio/checkboxes)"
|
||||
COM_COMPONENTBUILDER_ITEM_DISPLAY="Item Display"
|
||||
COM_COMPONENTBUILDER_IWEBSITEI_BSB="<i>Website:</i> <b>%s</b>"
|
||||
COM_COMPONENTBUILDER_JCB_COMMUNITY="JCB Community"
|
||||
COM_COMPONENTBUILDER_JCB_COMMUNITY_PACKAGES="JCB Community Packages"
|
||||
|
@ -7952,6 +7955,7 @@ COM_COMPONENTBUILDER_REVERT_ALL_AHEAD_SNIPPETS="Revert All Ahead Snippets"
|
|||
COM_COMPONENTBUILDER_REVIEW_THIS_ISSUE_ON_GITHUB="Review this issue on Github"
|
||||
COM_COMPONENTBUILDER_RIGHT_IN_TAB="Right in Tab"
|
||||
COM_COMPONENTBUILDER_RIGHT_OF_TABS="Right of Tabs"
|
||||
COM_COMPONENTBUILDER_ROW_SELECTION="Row Selection"
|
||||
COM_COMPONENTBUILDER_RUN_EXPANSION="Run Expansion"
|
||||
COM_COMPONENTBUILDER_SAVE_SUCCESS="Great! Item successfully saved."
|
||||
COM_COMPONENTBUILDER_SAVE_WARNING="The value already existed so please select another."
|
||||
|
|
|
@ -29,24 +29,18 @@ defined('JPATH_BASE') or die('Restricted access');
|
|||
*/
|
||||
extract($displayData);
|
||||
|
||||
// Add script
|
||||
if ($multiple)
|
||||
{
|
||||
JHtml::_('jquery.ui', array('core', 'sortable'));
|
||||
JHtml::_('script', 'system/subform-repeatable.js', array('version' => 'auto', 'relative' => true));
|
||||
}
|
||||
|
||||
// the subform field layout
|
||||
$subform_fields = array(
|
||||
'left' => array('name'),
|
||||
'right' => array('list_name'),
|
||||
'bottom' => array('builder')
|
||||
'bottom' => array('builder'),
|
||||
'modal' => array('fields' => array('fields'), 'listview' => array('columns'), 'display' => array('display'))
|
||||
);
|
||||
|
||||
?>
|
||||
<div class="row-fluid">
|
||||
<div class="subform-repeatable-wrapper subform-layout">
|
||||
<div class="subform-repeatable"
|
||||
<div class="subform-repeatable-vdm"
|
||||
data-bt-add="a.group-add-<?php echo $unique_subform_id; ?>"
|
||||
data-bt-remove="a.group-remove-<?php echo $unique_subform_id; ?>"
|
||||
data-bt-move="a.group-move-<?php echo $unique_subform_id; ?>"
|
||||
|
@ -69,6 +63,7 @@ $subform_fields = array(
|
|||
'fields' => $subform_fields,
|
||||
'basegroup' => $fieldname,
|
||||
'group' => $fieldname . $k,
|
||||
'vdm' => $fieldname . $k,
|
||||
'buttons' => $buttons,
|
||||
'unique_subform_id' => $unique_subform_id,
|
||||
));
|
||||
|
@ -86,6 +81,7 @@ $subform_fields = array(
|
|||
'fields' => $subform_fields,
|
||||
'basegroup' => $fieldname,
|
||||
'group' => $fieldname . 'X',
|
||||
'vdm' => $fieldname . 'VDM-XX',
|
||||
'buttons' => $buttons,
|
||||
'unique_subform_id' => $unique_subform_id
|
||||
))
|
||||
|
|
|
@ -56,7 +56,7 @@ extract($displayData);
|
|||
<div class="uk-width-medium-1-1">
|
||||
<div class="uk-panel">
|
||||
<?php foreach($fields['top'] as $field): ?>
|
||||
<?php echo $form->renderField($field); ?>
|
||||
<?php echo str_replace('[[[VDM]]]', $vdm, $form->renderField($field)); ?>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -70,7 +70,7 @@ extract($displayData);
|
|||
<div class="uk-width-medium-1-2">
|
||||
<div class="uk-panel uk-panel-box">
|
||||
<?php foreach($_fields as $field): ?>
|
||||
<?php echo $form->renderField($field); ?>
|
||||
<?php echo str_replace('[[[VDM]]]', $vdm, $form->renderField($field)); ?>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -84,10 +84,29 @@ extract($displayData);
|
|||
<div class="uk-width-medium-1-1">
|
||||
<div class="uk-panel">
|
||||
<?php foreach($fields['bottom'] as $field): ?>
|
||||
<?php echo $form->renderField($field); ?>
|
||||
<?php echo str_replace('[[[VDM]]]', $vdm, $form->renderField($field)); ?>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (isset($fields['modal'])): ?>
|
||||
<?php foreach($fields['modal'] as $modal => $_fields): ?>
|
||||
<div id="modal-<?php echo $modal; ?>-<?php echo $vdm ?>" class="uk-modal">
|
||||
<div class="uk-modal-dialog uk-modal-dialog-large">
|
||||
<div class="uk-panel">
|
||||
<?php foreach($_fields as $field): ?>
|
||||
<?php echo str_replace('[[[VDM]]]', $vdm, $form->renderField($field)); ?>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<div class="uk-modal-footer">
|
||||
<div class="uk-clearfix">
|
||||
<button class="uk-float-right uk-button uk-button-success uk-modal-close"><?php echo JText::_('COM_COMPONENTBUILDER_UPDATE'); ?></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
|
|
@ -28,7 +28,7 @@ function buildSubform()
|
|||
'layout' => 'assistantsubformrepeatable',
|
||||
'multiple' => 'true',
|
||||
'icon' => 'list',
|
||||
'max' => 5,
|
||||
'max' => 20,
|
||||
'min' => 1
|
||||
);
|
||||
// load the subform attributes
|
||||
|
@ -88,9 +88,9 @@ function buildSubform()
|
|||
'label' => 'COM_COMPONENTBUILDER_BUILDER',
|
||||
'description' => '
|
||||
<div class="uk-button-group uk-width-1-1">
|
||||
<a class="uk-button uk-button-small uk-width-1-3" href="#jcbuilder" data-uk-modal="{center:true}" onclick="setJCBuilder(this, 1)">' . JText::_('COM_COMPONENTBUILDER_FIELDS') . '</a>
|
||||
<a class="uk-button uk-button-small uk-width-1-3" href="#jcbuilder" data-uk-modal="{center:true}" onclick="setJCBuilder(this, 2)">' . JText::_('COM_COMPONENTBUILDER_LIST_VIEW') . '</a>
|
||||
<a class="uk-button uk-button-small uk-width-1-3" href="#jcbuilder" data-uk-modal="{center:true}" onclick="setJCBuilder(this, 3)">' . JText::_('COM_COMPONENTBUILDER_DISPLAY_VIEW') . '</a>
|
||||
<a id="button-fields-[[[VDM]]]" class="uk-button uk-button-small uk-width-1-3" href="#modal-fields-[[[VDM]]]" data-uk-modal onclick="setJCBuilder(this, 1)">' . JText::_('COM_COMPONENTBUILDER_FIELDS') . '</a>
|
||||
<a id="button-listview-[[[VDM]]]" class="uk-button uk-button-small uk-width-1-3" href="#modal-listview-[[[VDM]]]" data-uk-modal onclick="setJCBuilder(this, 2)">' . JText::_('COM_COMPONENTBUILDER_LIST_VIEW') . '</a>
|
||||
<a id="button-display-[[[VDM]]]" class="uk-button uk-button-small uk-width-1-3" href="#modal-display-[[[VDM]]]" data-uk-modal onclick="setJCBuilder(this, 3)">' . JText::_('COM_COMPONENTBUILDER_DISPLAY_VIEW') . '</a>
|
||||
</div><div class="builder"></div><br />',
|
||||
'heading' => 'h5'
|
||||
);
|
||||
|
@ -99,6 +99,186 @@ function buildSubform()
|
|||
// now add the fields to the child form
|
||||
ComponentbuilderHelper::xmlAppend($childForm, $noteXML);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/// FIELDS SUBFORM START
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// start building the subform field XML
|
||||
$sub_subformXML = new SimpleXMLElement('<field/>');
|
||||
// subform attributes
|
||||
$sub_subformAttribute = array(
|
||||
'type' => 'subform',
|
||||
'name' => 'fields',
|
||||
'label' => 'COM_COMPONENTBUILDER_FIELD_BUILDER',
|
||||
'layout' => 'joomla.form.field.subform.repeatable-table',
|
||||
'multiple' => 'true',
|
||||
'icon' => 'list',
|
||||
'max' => 20,
|
||||
'min' => 1
|
||||
);
|
||||
// load the subform attributes
|
||||
ComponentbuilderHelper::xmlAddAttributes($sub_subformXML, $sub_subformAttribute);
|
||||
// now add the subform child form
|
||||
$sub_childform = $sub_subformXML->addChild('form');
|
||||
// child form attributes
|
||||
$sub_childformAttribute = array(
|
||||
'hidden' => 'true',
|
||||
'name' => 'list_properties',
|
||||
'repeat' => 'true');
|
||||
// load the child form attributes
|
||||
ComponentbuilderHelper::xmlAddAttributes($sub_childform, $sub_childformAttribute);
|
||||
|
||||
// view building the name field XML
|
||||
$nameXML = new SimpleXMLElement('<field/>');
|
||||
// subform attributes
|
||||
$nameAttribute = array(
|
||||
'type' => 'text',
|
||||
'name' => 'name',
|
||||
'label' => 'COM_COMPONENTBUILDER_FIELD_NAME',
|
||||
'size' => '40',
|
||||
'maxlength' => '150',
|
||||
'class' => 'text_area',
|
||||
'hint' => 'COM_COMPONENTBUILDER_FIELD_NAME',
|
||||
'filter' => 'STRING'
|
||||
);
|
||||
// load the subform attributes
|
||||
ComponentbuilderHelper::xmlAddAttributes($nameXML, $nameAttribute);
|
||||
// now add the fields to the child form
|
||||
ComponentbuilderHelper::xmlAppend($sub_childform, $nameXML);
|
||||
|
||||
// view building the field type XML
|
||||
$fieldtypeXML = new SimpleXMLElement('<field/>');
|
||||
// subform attributes
|
||||
$fieldtypeAttribute = array(
|
||||
'type' => 'fieldtypes',
|
||||
'name' => 'fieldtype',
|
||||
'label' => 'COM_COMPONENTBUILDER_FIELD_TYPE',
|
||||
'multiple' => false,
|
||||
'required' => true,
|
||||
'class' => 'btn-group',
|
||||
'addfieldpath' => '/administrator/components/com_componentbuilder/models/fields'
|
||||
);
|
||||
// load the subform attributes
|
||||
ComponentbuilderHelper::xmlAddAttributes($fieldtypeXML, $fieldtypeAttribute);
|
||||
// now add the fields to the child form
|
||||
ComponentbuilderHelper::xmlAppend($sub_childform, $fieldtypeXML);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/// FIELDPROPERTIES SUBFORM START
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// start building the subform field XML
|
||||
$sub_sub_subformXML = new SimpleXMLElement('<field/>');
|
||||
// subform attributes
|
||||
$sub_sub_subformAttribute = array(
|
||||
'type' => 'subform',
|
||||
'name' => 'properties',
|
||||
'label' => 'COM_COMPONENTBUILDER_PROPERTIES',
|
||||
'layout' => 'joomla.form.field.subform.repeatable',
|
||||
'multiple' => 'true',
|
||||
'icon' => 'list'
|
||||
);
|
||||
// load the subform attributes
|
||||
ComponentbuilderHelper::xmlAddAttributes($sub_sub_subformXML, $sub_sub_subformAttribute);
|
||||
// now add the subform child form
|
||||
$sub_sub_childform = $sub_sub_subformXML->addChild('form');
|
||||
// child form attributes
|
||||
$sub_sub_childformAttribute = array(
|
||||
'hidden' => 'true',
|
||||
'name' => 'list_properties',
|
||||
'repeat' => 'true');
|
||||
// load the child form attributes
|
||||
ComponentbuilderHelper::xmlAddAttributes($sub_sub_childform, $sub_sub_childformAttribute);
|
||||
|
||||
// view building the list name field XML
|
||||
$propertiesXML = new SimpleXMLElement('<field/>');
|
||||
// subform attributes
|
||||
$propertiesAttribute = array(
|
||||
'type' => 'text',
|
||||
'name' => 'property',
|
||||
'label' => 'COM_COMPONENTBUILDER_PROPERTY',
|
||||
'size' => '100',
|
||||
'maxlength' => '150',
|
||||
'class' => 'text_area',
|
||||
'hint' => 'COM_COMPONENTBUILDER_PROPERTY_NAME',
|
||||
'filter' => 'STRING'
|
||||
);
|
||||
// load the subform attributes
|
||||
ComponentbuilderHelper::xmlAddAttributes($propertiesXML, $propertiesAttribute);
|
||||
// now add the fields to the child form
|
||||
ComponentbuilderHelper::xmlAppend($sub_sub_childform, $propertiesXML);
|
||||
|
||||
// view building the value field XML
|
||||
$valueXML = new SimpleXMLElement('<field/>');
|
||||
// subform attributes
|
||||
$valueAttribute = array(
|
||||
'type' => 'text',
|
||||
'name' => 'value',
|
||||
'label' => 'COM_COMPONENTBUILDER_VALUE',
|
||||
'size' => '40',
|
||||
'maxlength' => '150',
|
||||
'class' => 'text_area',
|
||||
'hint' => 'COM_COMPONENTBUILDER_PROPERTY_VALUE',
|
||||
'filter' => 'STRING'
|
||||
);
|
||||
// load the subform attributes
|
||||
ComponentbuilderHelper::xmlAddAttributes($valueXML, $valueAttribute);
|
||||
// now add the fields to the child form
|
||||
ComponentbuilderHelper::xmlAppend($sub_sub_childform, $valueXML);
|
||||
|
||||
// no add to main sub from
|
||||
ComponentbuilderHelper::xmlAppend($sub_childform, $sub_sub_subformXML);
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/// FIELDPROPERTIES SUBFORM END
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// no add to main sub from
|
||||
ComponentbuilderHelper::xmlAppend($childForm, $sub_subformXML);
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/// FIELDS SUBFORM END
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/// LISTVIEW START
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// start building the listview area XML
|
||||
$listviewXML = new SimpleXMLElement('<field/>');
|
||||
// subform attributes
|
||||
$listviewAttribute = array(
|
||||
'type' => 'note',
|
||||
'name' => 'columns',
|
||||
'label' => 'COM_COMPONENTBUILDER_ROW_SELECTION',
|
||||
'description' => '
|
||||
<b>More details soon, to help you select the fields for the list display of rows.</b>',
|
||||
'heading' => 'h5'
|
||||
);
|
||||
// load the subform attributes
|
||||
ComponentbuilderHelper::xmlAddAttributes($listviewXML, $listviewAttribute);
|
||||
// now add the fields to the child form
|
||||
ComponentbuilderHelper::xmlAppend($childForm, $listviewXML);
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/// LISTVIEW END
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/// DISPLAY START
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// start building the display area XML
|
||||
$displayXML = new SimpleXMLElement('<field/>');
|
||||
// subform attributes
|
||||
$displayAttribute = array(
|
||||
'type' => 'note',
|
||||
'name' => 'display',
|
||||
'label' => 'COM_COMPONENTBUILDER_ITEM_DISPLAY',
|
||||
'description' => '
|
||||
<b>More details soon, to help build the site/front display of a single item.</b>',
|
||||
'heading' => 'h5'
|
||||
);
|
||||
// load the subform attributes
|
||||
ComponentbuilderHelper::xmlAddAttributes($displayXML, $displayAttribute);
|
||||
// now add the fields to the child form
|
||||
ComponentbuilderHelper::xmlAppend($childForm, $displayXML);
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/// DISPLAY END
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// setup subform with values
|
||||
$subform->setup($subformXML, null, 'jcbform');
|
||||
|
||||
|
@ -115,17 +295,9 @@ $subform = buildSubform();
|
|||
<div class="controls">
|
||||
<?php echo $subform->input; ?>
|
||||
</div>
|
||||
<div id="jcbuilder" class="uk-modal">
|
||||
<div class="uk-modal-dialog uk-modal-dialog-large">
|
||||
<button class="uk-modal-close uk-close" type="button"></button>
|
||||
<div class="loading">loading..<span class="loading-dots"></span></div>
|
||||
<div id="jcbbuilder-display" class="uk-panel">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
function setJCBuilder(area, target){
|
||||
console.log(area);
|
||||
console.log(jQuery(area).attr('id'));
|
||||
console.log(target);
|
||||
}
|
||||
</script>
|
||||
|
|
|
@ -38,7 +38,9 @@ class ComponentbuilderViewAssistant extends JViewLegacy
|
|||
$this->sidebar = JHtmlSidebar::render();
|
||||
}
|
||||
// get the forms
|
||||
$this->forms = $this->setForms();
|
||||
$this->forms = $this->setForms();
|
||||
//
|
||||
JHtml::_('jquery.ui', array('core', 'sortable'));
|
||||
|
||||
// We don't need toolbar in the modal window.
|
||||
if ($this->getLayout() !== 'modal')
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<extension type="component" version="3.2" method="upgrade">
|
||||
<name>COM_COMPONENTBUILDER</name>
|
||||
<creationDate>3rd January, 2020</creationDate>
|
||||
<creationDate>5th January, 2020</creationDate>
|
||||
<author>Llewellyn van der Merwe</author>
|
||||
<authorEmail>llewellyn@joomlacomponentbuilder.com</authorEmail>
|
||||
<authorUrl>http://www.joomlacomponentbuilder.com</authorUrl>
|
||||
|
|
Loading…
Reference in New Issue
Block a user