diff --git a/README.md b/README.md
index 9d0b3bd06..86f0fde77 100644
--- a/README.md
+++ b/README.md
@@ -146,11 +146,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*: 28th July, 2019
++ *Last Build*: 29th July, 2019
+ *Version*: 2.9.35
+ *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*: **242164**
++ *Line count*: **242165**
+ *Field count*: **1302**
+ *File count*: **1562**
+ *Folder count*: **237**
diff --git a/admin/README.txt b/admin/README.txt
index 9d0b3bd06..86f0fde77 100644
--- a/admin/README.txt
+++ b/admin/README.txt
@@ -146,11 +146,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*: 28th July, 2019
++ *Last Build*: 29th July, 2019
+ *Version*: 2.9.35
+ *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*: **242164**
++ *Line count*: **242165**
+ *Field count*: **1302**
+ *File count*: **1562**
+ *Folder count*: **237**
diff --git a/admin/helpers/compiler/c_Fields.php b/admin/helpers/compiler/c_Fields.php
index e5d63852f..d3a3eb53c 100644
--- a/admin/helpers/compiler/c_Fields.php
+++ b/admin/helpers/compiler/c_Fields.php
@@ -1226,7 +1226,102 @@ class Fields extends Structure
elseif ($property === 'option')
{
$optionSet = '';
- if (strpos($value, ',') !== false)
+ if (strtolower($typeName) === 'groupedlist' && strpos($value, ',') !== false && strpos($value, '@@') !== false)
+ {
+ // reset the group temp arrays
+ $groups_ = array();
+ $grouped_ = array('group' => array(), 'option' => array());
+ $order_ = array();
+ // mulitpal options
+ $options = explode(',', $value);
+ foreach ($options as $option)
+ {
+ if (strpos($option, '@@') !== false)
+ {
+ // set the group label
+ $valueKeyArray = explode('@@', $option);
+ if (count((array) $valueKeyArray) == 2)
+ {
+ $langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName($valueKeyArray[0], true);
+ // add to lang array
+ $this->setLangContent($this->lang, $langValue, $valueKeyArray[0]);
+ // now add group label
+ $groups_[$valueKeyArray[1]] = PHP_EOL . $this->_t(1) . $taber . $this->_t(2) . '';
+ // set order
+ $order_['group' . $valueKeyArray[1]] = $valueKeyArray[1];
+ }
+ }
+ elseif (strpos($option, '|') !== false)
+ {
+ // has other value then text
+ $valueKeyArray = explode('|', $option);
+ if (count((array) $valueKeyArray) == 3)
+ {
+ $langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName($valueKeyArray[1], true);
+ // add to lang array
+ $this->setLangContent($this->lang, $langValue, $valueKeyArray[1]);
+ // now add to option set
+ $grouped_['group'][$valueKeyArray[2]][] = PHP_EOL . $this->_t(1) . $taber . $this->_t(3) . '';
+ $optionArray[$valueKeyArray[0]] = $langValue;
+ // set order
+ $order_['group' . $valueKeyArray[2]] = $valueKeyArray[2];
+ }
+ else
+ {
+ $langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName($valueKeyArray[1], true);
+ // add to lang array
+ $this->setLangContent($this->lang, $langValue, $valueKeyArray[1]);
+ // now add to option set
+ $grouped_['option'][$valueKeyArray[0]] = PHP_EOL . $this->_t(1) . $taber . $this->_t(2) . '';
+ $optionArray[$valueKeyArray[0]] = $langValue;
+ // set order
+ $order_['option' . $valueKeyArray[0]] = $valueKeyArray[0];
+ }
+ }
+ else
+ {
+ // text is also the value
+ $langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName($option, true);
+ // add to lang array
+ $this->setLangContent($this->lang, $langValue, $option);
+ // now add to option set
+ $grouped_['option'][$option] = PHP_EOL . $this->_t(1) . $taber . $this->_t(2) . '';
+ $optionArray[$option] = $langValue;
+ // set order
+ $order_['option' . $option] = $option;
+ }
+ }
+ // now build the groups
+ foreach ($order_ as $pointer_ => $_id)
+ {
+ // load the default key
+ $key_ = 'group';
+ if (strpos($pointer_, 'option') !== false)
+ {
+ // load the option field
+ $key_ = 'option';
+ }
+ // check if this is a group loader
+ if ('group' === $key_ && isset($groups_[$_id]) && isset($grouped_[$key_][$_id]) && ComponentbuilderHelper::checkArray($grouped_[$key_][$_id]))
+ {
+ // set group label
+ $optionSet .= $groups_[$_id];
+ foreach ($grouped_[$key_][$_id] as $option_)
+ {
+ $optionSet .= $option_;
+ }
+ unset($groups_[$_id]);
+ unset($grouped_[$key_][$_id]);
+ // close the group
+ $optionSet .= PHP_EOL . $this->_t(1) . $taber . $this->_t(2) . '';
+ }
+ elseif (isset($grouped_[$key_][$_id]) && ComponentbuilderHelper::checkString($grouped_[$key_][$_id]))
+ {
+ $optionSet .= $grouped_[$key_][$_id];
+ }
+ }
+ }
+ elseif (strpos($value, ',') !== false)
{
// mulitpal options
$options = explode(',', $value);
@@ -1239,7 +1334,7 @@ class Fields extends Structure
$langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName($t, true);
// add to lang array
$this->setLangContent($this->lang, $langValue, $t);
- // no add to option set
+ // now add to option set
$optionSet .= PHP_EOL . $this->_t(1) . $taber . $this->_t(2) . '';
$optionArray[$v] = $langValue;
}
@@ -1249,7 +1344,7 @@ class Fields extends Structure
$langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName($option, true);
// add to lang array
$this->setLangContent($this->lang, $langValue, $option);
- // no add to option set
+ // now add to option set
$optionSet .= PHP_EOL . $this->_t(2) . $taber . $this->_t(1) . '';
$optionArray[$option] = $langValue;
}
@@ -1265,7 +1360,7 @@ class Fields extends Structure
$langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName($t, true);
// add to lang array
$this->setLangContent($this->lang, $langValue, $t);
- // no add to option set
+ // now add to option set
$optionSet .= PHP_EOL . $this->_t(2) . $taber . $this->_t(1) . '';
$optionArray[$v] = $langValue;
}
@@ -1275,7 +1370,7 @@ class Fields extends Structure
$langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName($value, true);
// add to lang array
$this->setLangContent($this->lang, $langValue, $value);
- // no add to option set
+ // now add to option set
$optionSet .= PHP_EOL . $this->_t(2) . $taber . $this->_t(1) . '';
$optionArray[$value] = $langValue;
}
@@ -1613,7 +1708,106 @@ class Fields extends Structure
elseif ($property === 'option')
{
ComponentbuilderHelper::xmlComment($field->fieldXML, $this->setLine(__LINE__) . " Option Set.");
- if (strpos($value, ',') !== false)
+ if (strtolower($typeName) === 'groupedlist' && strpos($value, ',') !== false && strpos($value, '@@') !== false)
+ {
+ // reset the group temp arrays
+ $groups_ = array();
+ $grouped_ = array('group' => array(), 'option' => array());
+ $order_ = array();
+ // mulitpal options
+ $options = explode(',', $value);
+ foreach ($options as $option)
+ {
+ if (strpos($option, '@@') !== false)
+ {
+ // set the group label
+ $valueKeyArray = explode('@@', $option);
+ if (count((array) $valueKeyArray) == 2)
+ {
+ $langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName($valueKeyArray[0], true);
+ // add to lang array
+ $this->setLangContent($this->lang, $langValue, $valueKeyArray[0]);
+ // now add group label
+ $groups_[$valueKeyArray[1]] = $langValue;
+ // set order
+ $order_['group' . $valueKeyArray[1]] = $valueKeyArray[1];
+ }
+ }
+ elseif (strpos($option, '|') !== false)
+ {
+ // has other value then text
+ $valueKeyArray = explode('|', $option);
+ if (count((array) $valueKeyArray) == 3)
+ {
+ $langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName($valueKeyArray[1], true);
+ // add to lang array
+ $this->setLangContent($this->lang, $langValue, $valueKeyArray[1]);
+ // now add to option set
+ $grouped_['group'][$valueKeyArray[2]][] = array('value' => $valueKeyArray[0], 'text' => $langValue);
+ $optionArray[$valueKeyArray[0]] = $langValue;
+ // set order
+ $order_['group' . $valueKeyArray[2]] = $valueKeyArray[2];
+ }
+ else
+ {
+ $langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName($valueKeyArray[1], true);
+ // add to lang array
+ $this->setLangContent($this->lang, $langValue, $valueKeyArray[1]);
+ // now add to option set
+ $grouped_['option'][$valueKeyArray[0]] = array('value' => $valueKeyArray[0], 'text' => $langValue);
+ $optionArray[$valueKeyArray[0]] = $langValue;
+ // set order
+ $order_['option' . $valueKeyArray[0]] = $valueKeyArray[0];
+ }
+ }
+ else
+ {
+ // text is also the value
+ $langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName($option, true);
+ // add to lang array
+ $this->setLangContent($this->lang, $langValue, $option);
+ // now add to option set
+ $grouped_['option'][$option] = array('value' => $valueKeyArray[0], 'text' => $langValue);
+ $optionArray[$option] = $langValue;
+ // set order
+ $order_['option' . $option] = $option;
+ }
+ }
+ // now build the groups
+ foreach ($order_ as $pointer_ => $_id)
+ {
+ // load the default key
+ $key_ = 'group';
+ if (strpos($pointer_, 'option') !== false)
+ {
+ // load the option field
+ $key_ = 'option';
+ }
+ // check if this is a group loader
+ if ('group' === $key_ && isset($groups_[$_id]) && isset($grouped_[$key_][$_id]) && ComponentbuilderHelper::checkArray($grouped_[$key_][$_id]))
+ {
+ // set group label
+ $groupXML = $field->fieldXML->addChild('group');
+ $groupXML->addAttribute('label', $groups_[$_id]);
+
+ foreach ($grouped_[$key_][$_id] as $option_)
+ {
+ $groupOptionXML = $groupXML->fieldXML->addChild('option');
+ $groupOptionXML->addAttribute('value', $option_['value']);
+ $groupOptionXML[] = $option_['text'];
+ }
+ unset($groups_[$_id]);
+ unset($grouped_[$key_][$_id]);
+ }
+ elseif (isset($grouped_[$key_][$_id]) && ComponentbuilderHelper::checkString($grouped_[$key_][$_id]))
+ {
+ $optionXML = $field->fieldXML->addChild('option');
+ $optionXML->addAttribute('value', $grouped_[$key_][$_id]['value']);
+ $optionXML[] = $grouped_[$key_][$_id]['text'];
+ }
+ }
+ }
+ elseif (strpos($value, ',') !== false)
{
// mulitpal options
$options = explode(',', $value);
@@ -1627,7 +1821,7 @@ class Fields extends Structure
$langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName($t, true);
// add to lang array
$this->setLangContent($this->lang, $langValue, $t);
- // no add to option set
+ // now add to option set
$optionXML->addAttribute('value', $v);
$optionArray[$v] = $langValue;
}
@@ -1637,7 +1831,7 @@ class Fields extends Structure
$langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName($option, true);
// add to lang array
$this->setLangContent($this->lang, $langValue, $option);
- // no add to option set
+ // now add to option set
$optionXML->addAttribute('value', $option);
$optionArray[$option] = $langValue;
}
@@ -1655,7 +1849,7 @@ class Fields extends Structure
$langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName($t, true);
// add to lang array
$this->setLangContent($this->lang, $langValue, $t);
- // no add to option set
+ // now add to option set
$optionXML->addAttribute('value', $v);
$optionArray[$v] = $langValue;
}
@@ -1665,7 +1859,7 @@ class Fields extends Structure
$langValue = $langView . '_' . ComponentbuilderHelper::safeFieldName($value, true);
// add to lang array
$this->setLangContent($this->lang, $langValue, $value);
- // no add to option set
+ // now add to option set
$optionXML->addAttribute('value', $value);
$optionArray[$value] = $langValue;
}
diff --git a/admin/helpers/componentbuilder.php b/admin/helpers/componentbuilder.php
index 4361b6e63..d7463fbfa 100644
--- a/admin/helpers/componentbuilder.php
+++ b/admin/helpers/componentbuilder.php
@@ -3250,13 +3250,13 @@ abstract class ComponentbuilderHelper
),
'option' => array(
'accesslevel', 'category', 'checkboxes', 'combo', 'contentlanguage', 'databaseconnection', // 'components', (TODO) must be added but still in use as a custom field in JCB
- 'filelist', 'folderlist', 'imagelist', 'list', 'plugins', 'predefinedlist', 'radio', 'sessionhandler', 'sql'
+ 'filelist', 'folderlist', 'imagelist', 'list', 'plugins', 'predefinedlist', 'radio', 'sessionhandler', 'sql', 'groupedlist'
),
'text' => array(
'calendar', 'color', 'editor', 'email', 'number', 'password', 'range', 'tel', 'text', 'textarea', 'url'
),
'list' => array(
- 'checkbox', 'checkboxes', 'list', 'radio'
+ 'checkbox', 'checkboxes', 'list', 'radio', 'groupedlist'
),
'dynamic' => array(
'category', 'file', 'filelist', 'folderlist', 'headertag', 'imagelist', 'integer', 'media', 'meter', 'rules', 'tag', 'timezone', 'user'
@@ -3265,7 +3265,7 @@ abstract class ComponentbuilderHelper
'note', 'spacer'
),
'special' => array(
- 'contentlanguage', 'groupedlist', 'moduleposition', 'plugin', 'repeatable', 'subform', 'templatestyle'
+ 'contentlanguage', 'moduleposition', 'plugin', 'repeatable', 'subform', 'templatestyle'
)
);
diff --git a/admin/sql/install.mysql.utf8.sql b/admin/sql/install.mysql.utf8.sql
index 01f79d133..e142cbe14 100644
--- a/admin/sql/install.mysql.utf8.sql
+++ b/admin/sql/install.mysql.utf8.sql
@@ -1948,7 +1948,8 @@ INSERT INTO `#__componentbuilder_fieldtype` (`id`, `catid`, `description`, `name
(35, '', 'Provides a form with rows of fields that you specify. As many options can be added as desired. Note this form field has a jQuery based javascript file as a dependency.', 'Subform', '{\"properties0\":{\"name\":\"type\",\"example\":\"subform\",\"description\":\"(mandatory) must be subform.\"},\"properties1\":{\"name\":\"name\",\"example\":\"options\",\"adjustable\":\"1\",\"description\":\"(mandatory) is the unique name of the parameter\"},\"properties2\":{\"name\":\"label\",\"example\":\"The Option List\",\"adjustable\":\"1\",\"translatable\":\"1\",\"description\":\"(mandatory) (translatable) is the descriptive title of the field.\"},\"properties3\":{\"name\":\"layout\",\"example\":\"joomla.form.field.subform.repeatable-table\",\"adjustable\":\"1\",\"description\":\"(mandatory) The layout for the repeatable table.\"},\"properties4\":{\"name\":\"component\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) To change the component where it should search for layout\"},\"properties5\":{\"name\":\"client\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) Function to initialise the application client Frontend: site<\\/code> or 0<\\/code> Backend: admin<\\/code> or 1<\\/code>\"},\"properties6\":{\"name\":\"multiple\",\"example\":\"true\",\"adjustable\":\"1\",\"mandatory\":\"1\",\"description\":\"(mandatory) The rows to be multiple.\"},\"properties7\":{\"name\":\"buttons\",\"example\":\"add,remove,move\",\"adjustable\":\"1\",\"description\":\"(optional) Which buttons to show if multiple mode is true. Options: add,remove,move<\\/code>\"},\"properties8\":{\"name\":\"fields\",\"example\":\"1,2,3\",\"adjustable\":\"1\",\"description\":\"(mandatory) The fields to add to the modal. All fields must first be created in component builder as a field before you can add them here, since you must use the id of the field. Separate the field ids with commas. Do not add custom fields that are not also used in this component.\"},\"properties9\":{\"name\":\"formsource\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) you can add a path to a xml file containing the fields.\"},\"properties10\":{\"name\":\"description\",\"example\":\"\",\"adjustable\":\"1\",\"translatable\":\"1\",\"description\":\"(optional) (translatable) description text for the form field. Displays at the top of the modal with the name as well as in the usual position in the form\"},\"properties11\":{\"name\":\"default\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) The default value for the form field if the field is left empty. Note this has to be a json string compatible with the contents of the form field.\"},\"properties12\":{\"name\":\"icon\",\"example\":\"list\",\"adjustable\":\"1\",\"description\":\"(optional) The icon to show on the select button (is prefixed with \\\"icon-\\\").\"},\"properties13\":{\"name\":\"max\",\"example\":\"50\",\"adjustable\":\"1\",\"description\":\"(optional) The maximum number of rows of fields allowed (by default 999 to be effectively infinite)\"},\"properties14\":{\"name\":\"min\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) The minimum number of rows of fields required\"},\"properties15\":{\"name\":\"filter\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) Use only if you would like to save raw data, since the default is best.\"},\"properties16\":{\"name\":\"showon\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) show this field on the bases of the value in another field.\"}}', 'Allows form fields which can have as many options as the user desires.', '', 1, 13, '', 6),
(36, '', 'Provides an input field for an email address.', 'Email', '{\"properties0\":{\"name\":\"type\",\"example\":\"email\",\"mandatory\":\"1\",\"description\":\"(mandatory) must be email.\"},\"properties1\":{\"name\":\"name\",\"example\":\"email\",\"adjustable\":\"1\",\"mandatory\":\"1\",\"description\":\"(mandatory) is the unique name of the field.\"},\"properties2\":{\"name\":\"label\",\"example\":\"Email Address\",\"adjustable\":\"1\",\"mandatory\":\"1\",\"translatable\":\"1\",\"description\":\"(mandatory) (translatable) is the descriptive title of the field.\"},\"properties3\":{\"name\":\"size\",\"example\":\"10\",\"adjustable\":\"1\",\"description\":\"(optional) is the width of the text box in characters. If omitted the width is determined by the browser. The value of size does not limit the number of characters that may be entered.\"},\"properties4\":{\"name\":\"maxlength\",\"example\":\"50\",\"adjustable\":\"1\",\"description\":\"(optional) limits the number of characters that may be entered.\"},\"properties5\":{\"name\":\"default\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) (not translatable) is the default value.\"},\"properties6\":{\"name\":\"description\",\"example\":\"Enter some description\",\"adjustable\":\"1\",\"translatable\":\"1\",\"description\":\"(optional) (translatable) is text that will be shown as a tooltip when the user moves the mouse over the drop-down box.\"},\"properties7\":{\"name\":\"class\",\"example\":\"inputbox\",\"adjustable\":\"1\",\"description\":\"(optional) is a CSS class name for the HTML form field. If omitted this will default to \'text_area\'.\"},\"properties8\":{\"name\":\"readonly\",\"example\":\"false\",\"adjustable\":\"1\",\"description\":\"(optional) The field cannot be changed and will automatically inherit the default value\"},\"properties9\":{\"name\":\"disabled\",\"example\":\"false\",\"adjustable\":\"1\",\"description\":\"(optional) The field cannot be changed and will automatically inherit the default value - it will also not submit\"},\"properties10\":{\"name\":\"required\",\"example\":\"false\",\"adjustable\":\"1\",\"description\":\"(optional) The field must be filled before submitting the form.\"},\"properties11\":{\"name\":\"filter\",\"example\":\"STRING\",\"adjustable\":\"1\",\"description\":\"(optional) allow the system to save certain html tags or raw data.\"},\"properties12\":{\"name\":\"validate\",\"example\":\"email\",\"adjustable\":\"1\",\"description\":\"(optional) The validation method for the form field. This value will determine which method is used to validate the value for a field.\"},\"properties13\":{\"name\":\"unique\",\"example\":\"false\",\"adjustable\":\"1\",\"description\":\"(optional) Used in validation, to check if we should test for uniqueness, to insure that this email does not already belong to another user. Check line 99 in \\/libraries\\/src\\/Form\\/Rule\\/EmailRule.php\"},\"properties14\":{\"name\":\"field\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) used in validation of \\\"equals\\\" to link the field to match.\"},\"properties15\":{\"name\":\"message\",\"example\":\"Error! Please add some text here.\",\"adjustable\":\"1\",\"translatable\":\"1\",\"description\":\"(optional) The error message that will be displayed instead of the default message.\"},\"properties16\":{\"name\":\"hint\",\"example\":\"your@email.com\",\"adjustable\":\"1\",\"translatable\":\"1\",\"description\":\"(optional) The placeholder to display inside the text box.\"},\"properties17\":{\"name\":\"autocomplete\",\"example\":\"on\",\"adjustable\":\"1\",\"description\":\"(optional) The autocomplete state for the form field. If \'off\' element will not be automatically completed by browser.\"},\"properties18\":{\"name\":\"showon\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) Allows you to hide the field based on the value(s) of another field; for Joomla 3.2.4+\"},\"properties19\":{\"name\":\"onchange\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) HTML equivalent attribute (javascript use)\"}}', 'Email form field type', '', 1, 6, '', 7),
(37, '', 'Provides a dropdown list of plugin options from the folder.', 'Plugins', '{\"properties0\":{\"name\":\"type\",\"example\":\"plugins\",\"mandatory\":\"1\",\"description\":\"(mandatory) must be editors.\"},\"properties1\":{\"name\":\"name\",\"example\":\"editor\",\"adjustable\":\"1\",\"mandatory\":\"1\",\"description\":\"(mandatory) is the unique name of the parameter.\"},\"properties2\":{\"name\":\"label\",\"example\":\"Select an editor\",\"adjustable\":\"1\",\"mandatory\":\"1\",\"translatable\":\"1\",\"description\":\"(mandatory) (translatable) is the descriptive title of the field.\"},\"properties3\":{\"name\":\"default\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) (not translatable) is the default value.\"},\"properties4\":{\"name\":\"description\",\"example\":\"\",\"adjustable\":\"1\",\"translatable\":\"1\",\"description\":\"(optional) (translatable) is text that will be shown as a tooltip when the user moves the mouse over the label.\"},\"properties8\":{\"name\":\"multiple\",\"example\":\"false\",\"adjustable\":\"1\",\"description\":\"(optional) is whether multiple items can be selected at the same time (true or false).\"},\"properties5\":{\"name\":\"folder\",\"example\":\"editors\",\"adjustable\":\"1\",\"mandatory\":\"1\",\"description\":\"(mandatory) editors or captcha.\"},\"properties6\":{\"name\":\"filter\",\"example\":\"cmd\",\"adjustable\":\"1\",\"description\":\"(optional) allow the system to save certain html tags or raw data.\"},\"properties7\":{\"name\":\"showon\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) show this field on the bases of the value in another field.\"}}', 'Provides a dropdown list of plugin options from the folder.', '', 1, 7, '', 8),
-(38, '', 'Provides the use of a captcha plugin.', 'Captcha', '{\"properties0\":{\"name\":\"type\",\"example\":\"captcha\",\"mandatory\":\"1\",\"description\":\"(mandatory) must be captcha.\"},\"properties3\":{\"name\":\"name\",\"example\":\"captcha\",\"adjustable\":\"1\",\"mandatory\":\"1\",\"description\":\"(mandatory) is the unique name of the field.\"},\"properties2\":{\"name\":\"validate\",\"example\":\"captcha\",\"mandatory\":\"1\",\"description\":\"(mandatory) must be captcha.\"},\"properties1\":{\"name\":\"label\",\"example\":\"Captcha\",\"mandatory\":\"1\",\"translatable\":\"1\",\"description\":\"(mandatory) (translatable) is the descriptive title of the field.\"},\"properties4\":{\"name\":\"description\",\"example\":\"We do not like spam, please show us you are human\",\"translatable\":\"1\",\"description\":\"(optional) (translatable) is text that will be shown as a tooltip when the user moves the mouse over the drop-down box.\"},\"properties5\":{\"name\":\"namespace\",\"example\":\"componentbuilder\",\"description\":\"(optional) the component name seems to work\"}}', 'Captcha robot check.', '', 1, 2, '', 9);
+(38, '', 'Provides the use of a captcha plugin.', 'Captcha', '{\"properties0\":{\"name\":\"type\",\"example\":\"captcha\",\"mandatory\":\"1\",\"description\":\"(mandatory) must be captcha.\"},\"properties3\":{\"name\":\"name\",\"example\":\"captcha\",\"adjustable\":\"1\",\"mandatory\":\"1\",\"description\":\"(mandatory) is the unique name of the field.\"},\"properties2\":{\"name\":\"validate\",\"example\":\"captcha\",\"mandatory\":\"1\",\"description\":\"(mandatory) must be captcha.\"},\"properties1\":{\"name\":\"label\",\"example\":\"Captcha\",\"mandatory\":\"1\",\"translatable\":\"1\",\"description\":\"(mandatory) (translatable) is the descriptive title of the field.\"},\"properties4\":{\"name\":\"description\",\"example\":\"We do not like spam, please show us you are human\",\"translatable\":\"1\",\"description\":\"(optional) (translatable) is text that will be shown as a tooltip when the user moves the mouse over the drop-down box.\"},\"properties5\":{\"name\":\"namespace\",\"example\":\"componentbuilder\",\"description\":\"(optional) the component name seems to work\"}}', 'Captcha robot check.', '', 1, 2, '', 9),
+(39, '', 'The list form field type provides a drop down list or a list box of custom-defined entries. If the field has a saved value this is selected when the page is first loaded. If not, the default value (if any) is selected.', 'Groupedlist', '{\"properties0\":{\"name\":\"type\",\"example\":\"groupedlist\",\"mandatory\":\"1\",\"description\":\"(mandatory) must be groupedlist.\"},\"properties1\":{\"name\":\"name\",\"example\":\"mygrouplist\",\"adjustable\":\"1\",\"mandatory\":\"1\",\"description\":\"(mandatory) is the unique name of the field.\"},\"properties2\":{\"name\":\"label\",\"example\":\"Select an option\",\"adjustable\":\"1\",\"mandatory\":\"1\",\"translatable\":\"1\",\"description\":\"(mandatory) (translatable) is the descriptive title of the field.\"},\"properties3\":{\"name\":\"description\",\"example\":\"\",\"adjustable\":\"1\",\"translatable\":\"1\",\"description\":\"(optional) (translatable) is text that will be shown as a tooltip when the user moves the mouse over the drop-down box.\"},\"properties4\":{\"name\":\"message\",\"example\":\"\",\"adjustable\":\"1\",\"translatable\":\"1\",\"description\":\"(optional) (translatable) is text that will be shown as error on validation.\"},\"properties5\":{\"name\":\"class\",\"example\":\"list_class\",\"adjustable\":\"1\",\"description\":\"(optional) is a CSS class name for the HTML form field. If omitted this will default to \'inputbox\'.\"},\"properties6\":{\"name\":\"multiple\",\"example\":\"false\",\"adjustable\":\"1\",\"description\":\"(optional) is whether multiple items can be selected at the same time (true or false).\"},\"properties7\":{\"name\":\"filter\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) filter options\"},\"properties8\":{\"name\":\"required\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) The field must be filled before submitting the form.\"},\"properties9\":{\"name\":\"validate\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) The validation method for the form field. This value will determine which method is used to validate the value for a field.\"},\"properties10\":{\"name\":\"option\",\"example\":\"Group Name@@1,1|Option 1|1,2|Option 2|1,Group Name 2@@2,3|Option 3|2\",\"adjustable\":\"1\",\"description\":\"(mandatory) set the options of this radio. Separate options with commas and use the pipe symbol to separate value from text.\"},\"properties11\":{\"name\":\"useglobal\",\"example\":\"false\",\"adjustable\":\"1\",\"description\":\"(optional) if set to true, it will show the value that is set in the global configuration if found in the database.\"},\"properties12\":{\"name\":\"default\",\"example\":\"0\",\"adjustable\":\"1\",\"description\":\"(optional) is the default list item value.\"},\"properties13\":{\"name\":\"showon\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) Allows you to hide the field based on the value(s) of another field; for Joomla 3.2.4+\"},\"properties14\":{\"name\":\"onchange\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) HTML equivalent attribute (javascript use)\"}}', 'provides a drop down list of custom-defined entries.', '', 1, 1, '', 10);
--
-- Dumping data for table `#__componentbuilder_language`
diff --git a/componentbuilder.xml b/componentbuilder.xml
index 74b8439ca..4906838a1 100644
--- a/componentbuilder.xml
+++ b/componentbuilder.xml
@@ -1,7 +1,7 @@
COM_COMPONENTBUILDER
- 28th July, 2019
+ 29th July, 2019Llewellyn van der Merwellewellyn@joomlacomponentbuilder.comhttp://www.joomlacomponentbuilder.com
diff --git a/site/helpers/componentbuilder.php b/site/helpers/componentbuilder.php
index 3bec97e04..a1e5e28b5 100644
--- a/site/helpers/componentbuilder.php
+++ b/site/helpers/componentbuilder.php
@@ -3250,13 +3250,13 @@ abstract class ComponentbuilderHelper
),
'option' => array(
'accesslevel', 'category', 'checkboxes', 'combo', 'contentlanguage', 'databaseconnection', // 'components', (TODO) must be added but still in use as a custom field in JCB
- 'filelist', 'folderlist', 'imagelist', 'list', 'plugins', 'predefinedlist', 'radio', 'sessionhandler', 'sql'
+ 'filelist', 'folderlist', 'imagelist', 'list', 'plugins', 'predefinedlist', 'radio', 'sessionhandler', 'sql', 'groupedlist'
),
'text' => array(
'calendar', 'color', 'editor', 'email', 'number', 'password', 'range', 'tel', 'text', 'textarea', 'url'
),
'list' => array(
- 'checkbox', 'checkboxes', 'list', 'radio'
+ 'checkbox', 'checkboxes', 'list', 'radio', 'groupedlist'
),
'dynamic' => array(
'category', 'file', 'filelist', 'folderlist', 'headertag', 'imagelist', 'integer', 'media', 'meter', 'rules', 'tag', 'timezone', 'user'
@@ -3265,7 +3265,7 @@ abstract class ComponentbuilderHelper
'note', 'spacer'
),
'special' => array(
- 'contentlanguage', 'groupedlist', 'moduleposition', 'plugin', 'repeatable', 'subform', 'templatestyle'
+ 'contentlanguage', 'moduleposition', 'plugin', 'repeatable', 'subform', 'templatestyle'
)
);