Reworked form bases and added integer text field

This commit is contained in:
PMKuipers 2023-10-24 21:55:53 +02:00
parent 2622b102bf
commit b44e7f2a9f
10 changed files with 154 additions and 61 deletions

View file

@ -1,3 +1,3 @@
define("local_treestudyplan/util/formfields",["exports","./debugger"],(function(_exports,_debugger){var obj;Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.text_integer=function(id){var element=document.getElementById(id);debug.warn("Initializing form element text_integer on ",id,element)};var debug=new(_debugger=(obj=_debugger)&&obj.__esModule?obj:{default:obj}).default("formfields")})); define("local_treestudyplan/util/formfields",["exports"],(function(_exports){Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.text_integer=function(id){var unsigned=arguments.length>1&&void 0!==arguments[1]&&arguments[1],element=document.getElementById(id);element&&element.addEventListener("input",(function(){var val=element.value;if(""!=val)return!(isNaN(val)&&(unsigned||"-"!=val)||unsigned&&val<0)||(element.value=unsigned?val.replace(/[^0-9]/g,""):val.replace(/[^0-9-]/g,"").replace(/(.{1})(-)/g,"$1"),!1)}))}}));
//# sourceMappingURL=formfields.min.js.map //# sourceMappingURL=formfields.min.js.map

View file

@ -1 +1 @@
{"version":3,"file":"formfields.min.js","sources":["../../src/util/formfields.js"],"sourcesContent":["import Debugger from './debugger';\nconst debug = new Debugger(\"formfields\");\n/**\n * convert a text field into an integer only text field\n * @param {Date|string} id The Id of the form field\n */\nexport function text_integer(id){\n const element = document.getElementById(id);\n debug.warn(\"Initializing form element text_integer on \",id,element);\n}"],"names":["id","element","document","getElementById","debug","warn"],"mappings":"mMAM6BA,QACnBC,QAAUC,SAASC,eAAeH,IACxCI,MAAMC,KAAK,6CAA6CL,GAAGC,cAPzDG,MAAQ,yEAAa"} {"version":3,"file":"formfields.min.js","sources":["../../src/util/formfields.js"],"sourcesContent":["/**\n * convert a text field into an integer only text field\n * @param {string} id The Id of the form field\n * @param {bool} unsigned Allow only unsigned values\n */\nexport function text_integer(id,unsigned=false){\n const element = document.getElementById(id);\n\n if (element) {\n element.addEventListener(\"input\",() => {\n var val = element.value;\n if (val != '') {\n if ((isNaN(val) && !(!unsigned && val == '-')) || (unsigned && val < 0)) {\n // Set input value empty\n if (unsigned) {\n element.value = val.replace(/[^0-9]/g,'');\n } else {\n element.value = val.replace(/[^0-9-]/g,'').replace(/(.{1})(-)/g,'$1');\n }\n return false;\n } else {\n return true;\n }\n }\n });\n }\n}"],"names":["id","unsigned","element","document","getElementById","addEventListener","val","value","isNaN","replace"],"mappings":"oKAK6BA,QAAGC,iEACtBC,QAAUC,SAASC,eAAeJ,IAEpCE,SACAA,QAAQG,iBAAiB,SAAQ,eACzBC,IAAMJ,QAAQK,SACP,IAAPD,YACKE,MAAMF,OAAWL,UAAmB,KAAPK,MAAiBL,UAAYK,IAAM,KAG7DJ,QAAQK,MADRN,SACgBK,IAAIG,QAAQ,UAAU,IAEtBH,IAAIG,QAAQ,WAAW,IAAIA,QAAQ,aAAa,OAE7D"}

View file

@ -1,10 +1,27 @@
import Debugger from './debugger';
const debug = new Debugger("formfields");
/** /**
* convert a text field into an integer only text field * convert a text field into an integer only text field
* @param {Date|string} id The Id of the form field * @param {string} id The Id of the form field
* @param {bool} unsigned Allow only unsigned values
*/ */
export function text_integer(id){ export function text_integer(id,unsigned=false){
const element = document.getElementById(id); const element = document.getElementById(id);
debug.warn("Initializing form element text_integer on ",id,element);
if (element) {
element.addEventListener("input",() => {
var val = element.value;
if (val != '') {
if ((isNaN(val) && !(!unsigned && val == '-')) || (unsigned && val < 0)) {
// Set input value empty
if (unsigned) {
element.value = val.replace(/[^0-9]/g,'');
} else {
element.value = val.replace(/[^0-9-]/g,'').replace(/(.{1})(-)/g,'$1');
}
return false;
} else {
return true;
}
}
});
}
} }

View file

@ -1,6 +1,6 @@
<?php <?php
namespace local_treestudyplan\local\forms; namespace local_treestudyplan\form;
require_once($CFG->dirroot."/lib/formslib.php"); require_once($CFG->dirroot."/lib/formslib.php");
abstract class formbase extends \moodleform { abstract class formbase extends \moodleform {

View file

@ -1,11 +1,11 @@
<?php <?php
namespace local_treestudyplan\local\forms; namespace local_treestudyplan\form;
use local_treestudyplan\aggregator; use local_treestudyplan\aggregator;
use local_treestudyplan\studyplan; use local_treestudyplan\studyplan;
use local_treestudyplan\courseservice; use local_treestudyplan\courseservice;
use local_treestudyplan\local\form_elements\text_integer; use local_treestudyplan\form\text_integer;
use local_treestudyplan\local\helpers\webservicehelper; use local_treestudyplan\local\helpers\webservicehelper;
use moodle_exception; use moodle_exception;
use stdClass; use stdClass;
@ -204,7 +204,7 @@ class studyplan_editform extends formbase {
$field = 'periods'; $field = 'periods';
$mform->addElement('text_integer',$field, $mform->addElement('text_integer',$field,
get_string('studyplan_slots','local_treestudyplan'), get_string('studyplan_slots','local_treestudyplan'),
[]); ["unsigned" => true]);
$mform->setType($field, PARAM_INT); $mform->setType($field, PARAM_INT);
$mform->addRule($field, null, 'required', null, 'client'); $mform->addRule($field, null, 'required', null, 'client');
@ -223,7 +223,7 @@ class studyplan_editform extends formbase {
$field = 'bistate_thresh_excellent'; $field = 'bistate_thresh_excellent';
$mform->addElement('text_integer',$field, $mform->addElement('text_integer',$field,
get_string('setting_bistate_thresh_excellent','local_treestudyplan'), get_string('setting_bistate_thresh_excellent','local_treestudyplan'),
[], ["unsigned" => false],
); );
$mform->setType($field, PARAM_INT); $mform->setType($field, PARAM_INT);
$mform->hideIf($field, "aggregation", "neq", "bistate"); $mform->hideIf($field, "aggregation", "neq", "bistate");
@ -231,7 +231,7 @@ class studyplan_editform extends formbase {
$field = 'bistate_thresh_good'; $field = 'bistate_thresh_good';
$mform->addElement('text_integer',$field, $mform->addElement('text_integer',$field,
get_string('setting_bistate_thresh_good','local_treestudyplan'), get_string('setting_bistate_thresh_good','local_treestudyplan'),
[], ["unsigned" => true],
); );
$mform->setType($field, PARAM_INT); $mform->setType($field, PARAM_INT);
$mform->hideIf($field, "aggregation", "neq", "bistate"); $mform->hideIf($field, "aggregation", "neq", "bistate");
@ -239,7 +239,7 @@ class studyplan_editform extends formbase {
$field = 'bistate_thresh_completed'; $field = 'bistate_thresh_completed';
$mform->addElement('text_integer',$field, $mform->addElement('text_integer',$field,
get_string('setting_bistate_thresh_completed','local_treestudyplan'), get_string('setting_bistate_thresh_completed','local_treestudyplan'),
[], ["unsigned" => true],
); );
$mform->setType($field, PARAM_INT); $mform->setType($field, PARAM_INT);
$mform->hideIf($field, "aggregation", "neq", "bistate"); $mform->hideIf($field, "aggregation", "neq", "bistate");

View file

@ -0,0 +1,89 @@
<?php
namespace local_treestudyplan\form;
use MoodleQuickForm_text;
use MoodleQuickForm;
defined('MOODLE_INTERNAL') || die();
global $CFG;
require_once($CFG->libdir . "/form/text.php");
class text_integer extends MoodleQuickForm_text {
/**
* Accepts a renderer
*
* @param object $renderer An HTML_QuickForm_Renderer object
* @param bool $required Whether an element is required
* @param string $error An error message associated with an element
* @return void
*/
public function accept(&$renderer, $required = false, $error = null) {
global $OUTPUT;
$elementname = $this->getName();
// Make sure the element has an id.
$this->_generateId();
$advanced = isset($renderer->_advancedElements[$elementname]);
$elementcontext = $this->export_for_template($OUTPUT);
$helpbutton = '';
if (method_exists($this, 'getHelpButton')) {
$helpbutton = $this->getHelpButton();
}
$label = $this->getLabel();
/*
$text = '';
if (method_exists($this, 'getText')) {
// There currently exists code that adds a form element with an empty label.
// If this is the case then set the label to the description.
if (empty($label)) {
$label = $this->getText();
} else {
$text = $this->getText();
}
}*/
$unsigned = (isset($this->_attributes['unsigned']) && $this->_attributes['unsigned']);
$context = array(
'element' => $elementcontext,
'label' => $label,
'unsigned' => ($unsigned)?true:false ,
'required' => $required,
'advanced' => $advanced,
'helpbutton' => $helpbutton,
'error' => $error,
);
$html = $OUTPUT->render_from_template('local_treestudyplan/form/element_text_integer', $context);
if ($renderer->_inGroup) {
$this->_groupElementTemplate = $html;
}
if (($renderer->_inGroup) && !empty($renderer->_groupElementTemplate)) {
$renderer->_groupElementTemplate = $html;
} else if (!isset($renderer->_templates[$elementname])) {
$renderer->_templates[$elementname] = $html;
}
if (in_array($elementname, $renderer->_stopFieldsetElements) && $renderer->_fieldsetsOpen > 0) {
$renderer->_html .= $renderer->_closeFieldsetTemplate;
$renderer->_fieldsetsOpen--;
}
$renderer->_html .= $html;
}
public static function Register() {
global $CFG;
MoodleQuickForm::registerElementType(
// The custom element is named `course_competency_rule`.
// This is the element name used in the `addElement()` function.
'text_integer',
// This is where it's definition is defined.
// This does not currently support class auto-loading.
"$CFG->dirroot/local/treestudyplan/classes/form/text_integer.php",
// The class name of the element.
'local_treestudyplan\form\text_integer'
);
}
}

View file

@ -1,40 +0,0 @@
<?php
namespace local_treestudyplan\local\form_elements;
use MoodleQuickForm_text;
use MoodleQuickForm;
defined('MOODLE_INTERNAL') || die();
global $CFG;
require_once($CFG->libdir . "/form/text.php");
class text_integer extends MoodleQuickForm_text {
public function toHtml()
{
global $PAGE;
// Add number type attribute
$this->_attributes['type'] = 'number';
$html = parent::toHtml();
// Add javascript call to handle stuff
$PAGE->requires->js_call_amd('local_treestudyplan/util/formfields', 'text_integer', ['id' => $this->getAttribute('id')]);
return $html;
}
public static function Register() {
global $CFG;
MoodleQuickForm::registerElementType(
// The custom element is named `course_competency_rule`.
// This is the element name used in the `addElement()` function.
'text_integer',
// This is where it's definition is defined.
// This does not currently support class auto-loading.
"$CFG->dirroot/local/treestudyplan/classes/local/form_elements/text_integer.php",
// The class name of the element.
'local_treestudyplan\local\form_elements\text_integer'
);
}
}

View file

@ -52,15 +52,20 @@ class utilityservice extends \external_api {
but we do need to check it's existence to give a nice developer warning but we do need to check it's existence to give a nice developer warning
and protect against some forms of hacking and protect against some forms of hacking
*/ */
$modmoodleform = "$CFG->dirroot/local/treestudyplan/classes/local/forms/{$formname}.php"; $modmoodleform = "$CFG->dirroot/local/treestudyplan/classes/form/{$formname}.php";
if (!file_exists($modmoodleform)) { if (!file_exists($modmoodleform)) {
throw new \moodle_exception('noformdesc', 'local_treestudyplan');; throw new \moodle_exception('noformfile', 'local_treestudyplan');
} }
$mformclassname = "\\local_treestudyplan\\local\\forms\\{$formname}"; $mformclassname = "\\local_treestudyplan\\form\\{$formname}";
// Check if the form is a subclass of formbase.
if ( is_a($mformclassname,"\\local_treestudyplan\\form\\formbase",true)) {
$jsonparams = json_decode($params); $jsonparams = json_decode($params);
$mform = new $mformclassname( $jsonparams, $ajaxformdata); $mform = new $mformclassname( $jsonparams, $ajaxformdata);
return $mform; return $mform;
} else {
throw new \moodle_exception('notformbase', 'local_treestudyplan');
}
} }
/** /**

View file

@ -0,0 +1,22 @@
{{< core_form/element-template }}
{{$element}}
<input type="text"
class="form-control {{#error}}is-invalid{{/error}}"
name="{{element.name}}"
{{#element.frozen}}
readonly {{#element.hardfrozen}}disabled{{/element.hardfrozen}}
{{/element.frozen}}
id="{{element.id}}"
value="{{element.value}}"
{{#element.size}}size="{{element.size}}"{{/element.size}}
{{#error}}
autofocus aria-describedby="{{element.iderror}}"
{{/error}}
{{{element.attributes}}} >
{{/element}}
{{/ core_form/element-template }}
{{#js}}
require(['local_treestudyplan/util/formfields'], function(formfields) {
formfields.text_integer({{#quote}}{{element.id}}{{/quote}},{{unsigned}});
});
{{/js}}

View file

@ -22,7 +22,7 @@
defined('MOODLE_INTERNAL') || die(); defined('MOODLE_INTERNAL') || die();
$plugin->component = 'local_treestudyplan'; // Recommended since 2.0.2 (MDL-26035). Required since 3.0 (MDL-48494). $plugin->component = 'local_treestudyplan'; // Recommended since 2.0.2 (MDL-26035). Required since 3.0 (MDL-48494).
$plugin->version = 2023102300; // YYYYMMDDHH (year, month, day, iteration). $plugin->version = 2023102401; // YYYYMMDDHH (year, month, day, iteration).
$plugin->requires = 2021051700; // YYYYMMDDHH (This is the release version for Moodle 3.11). $plugin->requires = 2021051700; // YYYYMMDDHH (This is the release version for Moodle 3.11).
$plugin->release = "1.1.0-b"; $plugin->release = "1.1.0-b";