$label = is_null($customlabel) ? get_string('moduleintro') : $customlabel;
$mform->addElement('editor', 'introeditor', $label, array('rows' => 10), array('maxfiles' => EDITOR_UNLIMITED_FILES,
- 'noclean' => true, 'context' => $this->context, 'collapsed' => true));
+ 'noclean' => true, 'context' => $this->context));
$mform->setType('introeditor', PARAM_RAW); // no XSS prevention here, users must be trusted
if ($required) {
$mform->addRule('introeditor', get_string('required'), 'required', null, 'client');
$string['err_required'] = 'You must supply a value here.';
$string['general'] = 'General';
$string['hideadvanced'] = 'Hide advanced';
-$string['hideeditortoolbar'] = 'Hide editing tools';
$string['hour'] = 'Hour';
$string['minute'] = 'Minute';
$string['miscellaneoussettings'] = 'Miscellaneous settings';
$string['showadvanced'] = 'Show advanced';
$string['showless'] = 'Show less...';
$string['showmore'] = 'Show more...';
-$string['showeditortoolbar'] = 'Show editing tools';
$string['somefieldsrequired'] = 'There are required fields in this form marked {$a}.';
$string['time'] = 'Time';
$string['timeunit'] = 'Time unit';
if ($fpoptions) {
$PAGE->requires->js_init_call('M.editor_tinymce.init_filepicker', array($elementid, $fpoptions), true);
}
- $this->initialise_collapse_js();
}
protected function get_init_params($elementid, array $options=null) {
return new moodle_url("$CFG->httpswwwroot/lib/editor/tinymce/tiny_mce/$this->version/");
}
- /**
- * Initialise javascript form elements
- * @return void
- */
- public function initialise_collapse_js() {
- global $PAGE;
- // This method is called for every editor instance. Ensure it's only run once.
- // Static is a clunky solution but the best we could find to keep everything simple and encapsulated.
- static $isinitialised;
- if ($isinitialised) {
- return;
- }
-
- // Initialise language strings.
- $PAGE->requires->strings_for_js(array('hideeditortoolbar', 'showeditortoolbar'), 'form');
- $PAGE->requires->yui_module('moodle-editor_tinymce-collapse', 'M.editor_collapse.init');
- $isinitialised = true;
- }
}
2/ bump up version.php
3/ update lib/thirdpartylibs.xml
4/ reimplement patch in MDL-23646
-5/ add in "DOM.setStyle(ifr, 'width',DOM.getSize(ifrcon).w); // Resize iframe" (without quotes)
+5/ reimplement patch in MDL-40668
+6/ add in "DOM.setStyle(ifr, 'width',DOM.getSize(ifrcon).w); // Resize iframe" (without quotes)
after "DOM.setStyle(ifr, 'height',DOM.getSize(ifr).h + dy); // Resize iframe"
-5/ reminify the js manually (I used uglifyjs)
_resizeIframe : function(ed, tb_id, dy) {\r
var ifr = ed.getContentAreaContainer().firstChild;\r
var ifrcon = ed.getContentAreaContainer();\r
- \r
- DOM.setStyle(ifr, 'height',DOM.getSize(ifr).h + dy); // Resize iframe\r
- DOM.setStyle(ifr, 'width',DOM.getSize(ifrcon).w); // Resize iframe\r
- ed.theme.deltaHeight += dy; // For resize cookie\r
+ var textarea = DOM.get(ed.id);\r
+ var rows = textarea ? textarea.getAttribute('rows') : 3;\r
+\r
+ // For very small text areas - allow the editable region to be smaller than the size of the toolbars.\r
+ if (rows >= 3) {\r
+ DOM.setStyle(ifr, 'height',DOM.getSize(ifr).h + dy); // Resize iframe\r
+ DOM.setStyle(ifr, 'width',DOM.getSize(ifrcon).w); // Resize iframe\r
+ ed.theme.deltaHeight += dy; // For resize cookie\r
+ }\r
},\r
\r
/**\r
-.mform .felement.feditor .toggle_editor_toolbar {
- background: #EEEEEE;
- border-color: #BBBBBB;
- border-radius: 4px 4px 0 0;
- border-style: solid solid none;
- border-width: 1px 1px 0;
- display: inline-block;
- font-size: 0.7em;
- padding: 3px 6px;
-}
-.mform .felement.feditor .toggle_editor_toolbar:hover {
- text-decoration: underline;
- color: red;
- cursor: pointer;
-}
-
@media (max-width: 480px) {
.mceToolbar td {
float: left;
+++ /dev/null
-{
- "name": "moodle-editor_tinymce-collapse",
- "builds": {
- "moodle-editor_tinymce-collapse": {
- "jsfiles": [
- "collapse.js"
- ]
- }
- }
-}
+++ /dev/null
-var COLLAPSE = function() {
- COLLAPSE.superclass.constructor.apply(this, arguments);
-};
-
-Y.extend(COLLAPSE, Y.Base, {
- // A location to store the node toggling template so that we do not have to create it each time.
- toggleNodeTemplate : null,
-
- /**
- * Set up basic values for static access.
- */
- init : function() {
- this.initialise_toggles(10);
- },
-
- /**
- * Has TinyMCE been loaded and the editors been initialised?
- * Designed mainly for IE
- * @return bool
- */
- editors_initialised : function() {
- return typeof tinyMCE !== 'undefined';
- },
-
- initialise_toggles : function(refreshes) {
- var editors_initialised = this.editors_initialised(), self = this, editor;
- if (!editors_initialised && refreshes) {
- setTimeout(function() {
- self.initialise_toggles(refreshes - 1);
- }, 100);
- return;
- }
-
- // Create the toggle template for use later
- this.toggleNodeTemplate = Y.Node.create('<a class="toggle_editor_toolbar" />');
- this.toggleNodeTemplate.setContent(M.util.get_string('showeditortoolbar', 'form'));
-
- // Delegate clicks of the toggle_editor_toolbar
- Y.one('body').delegate('click', this.toggle_collapse_from_event, 'a.toggle_editor_toolbar', this);
-
- // Set up editors which have already been created
- for (editor in tinyMCE.editors) {
- this.setup_collapse(tinyMCE.editors[editor]);
- }
-
- // Set up for future editors.
- // I haven't yet found a way of directly delegating the editor.onInit event. Instead we have to listen for the
- // tinyMCE.onAddEditor event, and then add a further event listener to the editor's onInit event.
- // onAddEditor is triggered before the editor has been created.
- // We use Y.Bind to ensure that context is maintained.
- tinyMCE.onAddEditor.add(Y.bind(this.add_setup_collapse_listener, this));
-
- },
-
- /**
- * Setup a listener for a new editor which will actually set the editor up
- * @param {Manager} mgr
- * @param {Editor} ed
- */
- add_setup_collapse_listener : function (mgr, ed) {
- // Bind the editor.onInit function to set this editor up. This ensures we maintain our context (this)
- ed.onInit.add(Y.bind(this.setup_collapse, this));
- },
-
- /**
- * Setup the toggle system for the provided editor
- *
- * @param {Editor} ed The TinyMCE editor instance
- */
- setup_collapse : function(ed) {
- var textarea = Y.Node(ed.getElement()),
- editortable = Y.Node(ed.getContainer()).one('> table'),
- thisToggleNode;
-
- // Does this text area support collapsing at all?
- if (!textarea.hasClass('collapsible')) {
- return;
- }
-
- // Did we find an appropriate table to work with
- if (!editortable) {
- return;
- }
-
- // Add toggle button.
- thisToggleNode = this.toggleNodeTemplate.cloneNode(true);
- editortable.get('parentNode').insert(thisToggleNode, editortable);
-
- // Toggle the toolbars initially.
- if (Y.Node(ed.getElement()).hasClass('collapsed')) {
- this.toggle_collapse(thisToggleNode, editortable, 0);
- } else {
- this.toggle_collapse(thisToggleNode, editortable, 1);
- }
-
- // When TinyMCE initialises itself, it adds a height to the table.
- // Unfortuately, the height it sets is too big for when the editor is collpsed.
- // Fortunately, the hight is not necessary, so we can just remove it.
- // (If you re-size the editor then it will remove this style attribute itself.)
- editortable.setStyle('height', '');
- editortable.setStyle('width', '');
- },
-
- /**
- * Toggle the specified editor toolbars.
- *
- * @param {Node} button The toggle button which we have to change the text for
- * @param {Node} editortable The table which the tinyMCE editor is in
- * @param {Boolean} newstate The intended toggle state
- */
- toggle_collapse : function(button, editortable, newstate) {
- var toolbar = editortable.one('td.mceToolbar').ancestor('tr'),
- statusbar = editortable.one('.mceStatusbar').ancestor('tr');
-
- // Check whether we have a state already.
- if (typeof newstate === 'undefined') {
- if (toolbar.getStyle('display') === 'none') {
- newstate = 1;
- } else {
- newstate = 0;
- }
- }
-
- // Toggle the various states and update the button text to suit
- if (newstate === 0) {
- toolbar.hide();
- statusbar.hide();
- button.setContent(M.util.get_string('showeditortoolbar', 'form'));
- } else {
- toolbar.show();
- statusbar.show();
- button.setContent(M.util.get_string('hideeditortoolbar', 'form'));
- }
- },
-
- toggle_collapse_from_event : function(thisevent) {
- var button = thisevent.target.ancestor('a', true),
- editortable = thisevent.target.ancestor('span', true).one('table.mceLayout');
- this.toggle_collapse(button, editortable);
- }
-});
-
-M.editor_collapse = M.editor_collapse || {};
-M.editor_collapse.init = function(params) {
- return new COLLAPSE(params);
-};
+++ /dev/null
-{
- "moodle-editor_tinymce-collapse": {
- "requires": [
- "base",
- "node",
- "dom"
- ]
- }
-}
/** @var array options provided to initalize filepicker */
protected $_options = array('subdirs' => 0, 'maxbytes' => 0, 'maxfiles' => 0, 'changeformat' => 0,
'areamaxbytes' => FILE_AREA_MAX_BYTES_UNLIMITED, 'context' => null, 'noclean' => 0, 'trusttext' => 0,
- 'return_types' => 7, 'collapsible' => 0, 'collapsed' => 0);
+ 'return_types' => 7);
// $_options['return_types'] = FILE_INTERNAL | FILE_EXTERNAL | FILE_REFERENCE
/** @var array values for editor */
if (!is_null($this->getAttribute('onblur')) && !is_null($this->getAttribute('onchange'))) {
$editorrules = ' onblur="'.htmlspecialchars($this->getAttribute('onblur')).'" onchange="'.htmlspecialchars($this->getAttribute('onchange')).'"';
}
- $str .= '<div><textarea id="'.$id.'" name="'.$elname.'[text]" rows="'.$rows.'" cols="'.$cols.'" spellcheck="true"';
- $classes = array();
- if (isset($this->_options['collapsed']) && $this->_options['collapsed']) {
- $this->_options['collapsible'] = 1;
- $classes[] = 'collapsed';
- }
- if (isset($this->_options['collapsible']) && $this->_options['collapsible']) {
- $classes[] = 'collapsible';
- }
- $str .= ' class="' . implode(' ', $classes) . '"';
- $str .= $editorrules.'>';
+ $str .= '<div><textarea id="'.$id.'" name="'.$elname.'[text]" rows="'.$rows.'" cols="'.$cols.'" spellcheck="true"'.$editorrules.'>';
$str .= s($text);
$str .= '</textarea></div>';
$repeatedoptions = array();
$repeatarray[] = $mform->createElement('editor', 'feedbacktext',
get_string('feedback', 'quiz'), array('rows' => 3), array('maxfiles' => EDITOR_UNLIMITED_FILES,
- 'noclean' => true, 'context' => $this->context, 'collapsed' => 1));
+ 'noclean' => true, 'context' => $this->context));
$repeatarray[] = $mform->createElement('text', 'feedbackboundaries',
get_string('gradeboundary', 'quiz'), array('size' => 10));
$repeatedoptions['feedbacktext']['type'] = PARAM_RAW;
$mform->insertElementBefore($mform->createElement('editor',
"feedbacktext[$nextel]", get_string('feedback', 'quiz'), array('rows' => 3),
array('maxfiles' => EDITOR_UNLIMITED_FILES, 'noclean' => true,
- 'context' => $this->context, 'collapsed' => 1)),
+ 'context' => $this->context)),
'boundary_add_fields');
$mform->insertElementBefore($mform->createElement('static',
'gradeboundarystatic2', get_string('gradeboundary', 'quiz'), '0%'),
$this->context = context::instance_by_id($record->contextid);
$this->editoroptions = array('subdirs' => 1, 'maxfiles' => EDITOR_UNLIMITED_FILES,
- 'context' => $this->context, 'collapsed' => 1);
+ 'context' => $this->context);
$this->fileoptions = array('subdirs' => 1, 'maxfiles' => -1, 'maxbytes' => -1);
$this->category = $category;
$mform->addRule('name', null, 'required', null, 'client');
$mform->addElement('editor', 'questiontext', get_string('questiontext', 'question'),
- array('rows' => 15), $this->get_non_collabsible_editor_options());
+ array('rows' => 15), $this->editoroptions);
$mform->setType('questiontext', PARAM_RAW);
$mform->addElement('text', 'defaultmark', get_string('defaultmark', 'question'),
$mform->addRule('defaultmark', null, 'required', null, 'client');
$mform->addElement('editor', 'generalfeedback', get_string('generalfeedback', 'question'),
- array('rows' => 10), $this->get_non_collabsible_editor_options());
+ array('rows' => 10), $this->editoroptions);
$mform->setType('generalfeedback', PARAM_RAW);
$mform->addHelpButton('generalfeedback', 'generalfeedback', 'question');
/**
* Returns an array of editor options with collapsed options turned off.
+ * @deprecated since 2.6
* @return array
*/
protected function get_non_collabsible_editor_options() {
- return array_merge($this->editoroptions, array('collapsed' => 0));
+ debugging('get_non_collabsible_editor_options() is deprecated, use $this->editoroptions instead.', DEBUG_DEVELOPER);
+ return $this->editoroptions;
}
+
}
This files describes API changes for question type plugins.
+=== 2.6 ===
+ + The changes in MDL-32750 were reverted in favour of the new pdw toggle toolbars
+ plugin for TinyMCE. The get_non_collapsible_editor_options method has been deprecated.
+
=== 2.5 ===
* There have been some tweaks to the helper class that is used to write