diff --git a/lang/en/tag.php b/lang/en/tag.php index 6c52a63e48d..ccc683637c7 100644 --- a/lang/en/tag.php +++ b/lang/en/tag.php @@ -44,7 +44,9 @@ $string['deleted'] = 'Tag(s) deleted'; $string['deletedcoursetags'] = 'Deleted - Course tags'; $string['description'] = 'Description'; $string['editisstandard'] = 'Change standard tag usage'; +$string['editcollname'] = 'Edit tag collection name'; $string['editname'] = 'Edit tag name'; +$string['editsearchable'] = 'Change searchable'; $string['edittag'] = 'Edit this tag'; $string['edittagcollection'] = 'Change tag collection'; $string['entertags'] = 'Enter tags...'; @@ -78,6 +80,7 @@ $string['managetagcolls'] = 'Manage tag collections'; $string['moretags'] = 'more...'; $string['name'] = 'Tag name'; $string['namesalreadybeeingused'] = 'Tag names already being used'; +$string['newcollnamefor'] = 'New name for tag collection {$a}'; $string['newnamefor'] = 'New name for tag {$a}'; $string['nextpage'] = 'More'; $string['notagsfound'] = 'No tags matching "{$a}" found'; diff --git a/lib/amd/build/tag.min.js b/lib/amd/build/tag.min.js index f2950005b15..d5fa9fb66a4 100644 --- a/lib/amd/build/tag.min.js +++ b/lib/amd/build/tag.min.js @@ -1 +1 @@ -define(["jquery","core/ajax","core/templates","core/notification","core/str"],function(a,b,c,d,e){return{initTagindexPage:function(){a("body").delegate(".tagarea[data-ta] a[data-quickload=1]","click",function(d){d.preventDefault();var e=a(this),f=e.context.search.replace(/^\?/,""),g=e.closest(".tagarea[data-ta]"),h=f.split("&").reduce(function(a,b){var c=b.split("=");return a[c[0]]=decodeURIComponent(c[1]),a},{}),i=b.call([{methodname:"core_tag_get_tagindex",args:{tagindex:h}}],!0);a.when.apply(a,i).done(function(a){c.render("core_tag/index",a).done(function(a){g.replaceWith(a)})})})},initManagePage:function(){var f=function(b){var c=b.closest("tr").get(0);if(c){var d=a(c).find("td.col-timemodified").get(0);e.get_string("now").done(function(b){a(d).html(b)})}};a(".tag-management-table").delegate(".tagisstandard","click",function(d){d.preventDefault();var e=a(this),g=e.attr("data-id"),h=e.attr("data-value"),i="1"===h?0:1,j=b.call([{methodname:"core_tag_update_tags",args:{tags:[{id:g,isstandard:i}]}},{methodname:"core_tag_get_tags",args:{tags:[{id:g}]}}],!0);a.when.apply(a,j).done(function(a,b){void 0===a.warnings[0]&&void 0!==b.tags[0]&&c.render("core_tag/tagisstandard",b.tags[0]).done(function(a){f(e);var b=e.parent();e.replaceWith(a),b.find(".tagisstandard").get(0).focus()})})}),a(".tag-management-table").delegate(".tagflag","click",function(d){d.preventDefault();var e=a(this),g=e.attr("data-id"),h=e.attr("data-value"),i="0"===h?1:0,j=b.call([{methodname:"core_tag_update_tags",args:{tags:[{id:g,flag:i}]}},{methodname:"core_tag_get_tags",args:{tags:[{id:g}]}}],!0);a.when.apply(a,j).done(function(b,d){if(void 0===b.warnings[0]&&void 0!==d.tags[0]){var g=e.closest("tr").get(0);g&&(d.tags[0].flag?a(g).addClass("flagged-tag"):a(g).removeClass("flagged-tag")),c.render("core_tag/tagflag",d.tags[0]).done(function(a){f(e);var b=e.parent();e.replaceWith(a),b.find(".tagflag").get(0).focus()})}})}),a(".tag-management-table").delegate("a.tagdelete","click",function(b){b.preventDefault();var c=a(this).attr("href");e.get_strings([{key:"delete"},{key:"confirmdeletetag",component:"tag"},{key:"yes"},{key:"no"}]).done(function(a){d.confirm(a[0],a[1],a[2],a[3],function(){window.location.href=c})})}),a("#tag-management-delete").click(function(b){var c=a(this).closest("form").get(0),f=a(c).find("input[type=checkbox]:checked").length;return f?(b.preventDefault(),void e.get_strings([{key:"delete"},{key:"confirmdeletetags",component:"tag"},{key:"yes"},{key:"no"}]).done(function(a){d.confirm(a[0],a[1],a[2],a[3],function(){c.submit()})})):!1})},initManageCollectionsPage:function(){a("body").on("updated","[data-inplaceeditable]",function(b){var c=b.ajaxreturn;b.oldvalue;if("core_tag"===c.component&&"tagareaenable"===c.itemtype){var d=a(this).attr("data-itemid");a(".tag-collections-table ul[data-collectionid] li[data-areaid="+d+"]").addClass("hidden");var e=c.value;if("1"===e){a(this).closest("tr").removeClass("dimmed_text");var f=a(this).closest("tr").find('[data-itemtype="tagareacollection"]').attr("data-value");a(".tag-collections-table ul[data-collectionid="+f+"] li[data-areaid="+d+"]").removeClass("hidden")}else a(this).closest("tr").addClass("dimmed_text")}if("core_tag"===c.component&&"tagareacollection"===c.itemtype){var d=a(this).attr("data-itemid");a(".tag-collections-table ul[data-collectionid] li[data-areaid="+d+"]").addClass("hidden");var f=a(this).attr("data-value"),e=a(this).closest("tr").find('[data-itemtype="tagareaenable"]').attr("data-value");"1"===e&&a(".tag-collections-table ul[data-collectionid="+f+"] li[data-areaid="+d+"]").removeClass("hidden")}})}}}); \ No newline at end of file +define(["jquery","core/ajax","core/templates","core/notification","core/str"],function(a,b,c,d,e){return{initTagindexPage:function(){a("body").delegate(".tagarea[data-ta] a[data-quickload=1]","click",function(d){d.preventDefault();var e=a(this),f=e.context.search.replace(/^\?/,""),g=e.closest(".tagarea[data-ta]"),h=f.split("&").reduce(function(a,b){var c=b.split("=");return a[c[0]]=decodeURIComponent(c[1]),a},{}),i=b.call([{methodname:"core_tag_get_tagindex",args:{tagindex:h}}],!0);a.when.apply(a,i).done(function(a){c.render("core_tag/index",a).done(function(a){g.replaceWith(a)})})})},initManagePage:function(){var f=function(b){var c=b.closest("tr").get(0);if(c){var d=a(c).find("td.col-timemodified").get(0);e.get_string("now").done(function(b){a(d).html(b)})}};a(".tag-management-table").delegate(".tagisstandard","click",function(d){d.preventDefault();var e=a(this),g=e.attr("data-id"),h=e.attr("data-value"),i="1"===h?0:1,j=b.call([{methodname:"core_tag_update_tags",args:{tags:[{id:g,isstandard:i}]}},{methodname:"core_tag_get_tags",args:{tags:[{id:g}]}}],!0);a.when.apply(a,j).done(function(a,b){void 0===a.warnings[0]&&void 0!==b.tags[0]&&c.render("core_tag/tagisstandard",b.tags[0]).done(function(a){f(e);var b=e.parent();e.replaceWith(a),b.find(".tagisstandard").get(0).focus()})})}),a(".tag-management-table").delegate(".tagflag","click",function(d){d.preventDefault();var e=a(this),g=e.attr("data-id"),h=e.attr("data-value"),i="0"===h?1:0,j=b.call([{methodname:"core_tag_update_tags",args:{tags:[{id:g,flag:i}]}},{methodname:"core_tag_get_tags",args:{tags:[{id:g}]}}],!0);a.when.apply(a,j).done(function(b,d){if(void 0===b.warnings[0]&&void 0!==d.tags[0]){var g=e.closest("tr").get(0);g&&(d.tags[0].flag?a(g).addClass("flagged-tag"):a(g).removeClass("flagged-tag")),c.render("core_tag/tagflag",d.tags[0]).done(function(a){f(e);var b=e.parent();e.replaceWith(a),b.find(".tagflag").get(0).focus()})}})}),a(".tag-management-table").delegate("a.tagdelete","click",function(b){b.preventDefault();var c=a(this).attr("href");e.get_strings([{key:"delete"},{key:"confirmdeletetag",component:"tag"},{key:"yes"},{key:"no"}]).done(function(a){d.confirm(a[0],a[1],a[2],a[3],function(){window.location.href=c})})}),a("#tag-management-delete").click(function(b){var c=a(this).closest("form").get(0),f=a(c).find("input[type=checkbox]:checked").length;return f?(b.preventDefault(),void e.get_strings([{key:"delete"},{key:"confirmdeletetags",component:"tag"},{key:"yes"},{key:"no"}]).done(function(a){d.confirm(a[0],a[1],a[2],a[3],function(){c.submit()})})):!1})},initManageCollectionsPage:function(){a("body").on("updated","[data-inplaceeditable]",function(b){var c,d,e,f=b.ajaxreturn;b.oldvalue;"core_tag"===f.component&&"tagareaenable"===f.itemtype&&(c=a(this).attr("data-itemid"),a(".tag-collections-table ul[data-collectionid] li[data-areaid="+c+"]").addClass("hidden"),e=f.value,"1"===e?(a(this).closest("tr").removeClass("dimmed_text"),d=a(this).closest("tr").find('[data-itemtype="tagareacollection"]').attr("data-value"),a(".tag-collections-table ul[data-collectionid="+d+"] li[data-areaid="+c+"]").removeClass("hidden")):a(this).closest("tr").addClass("dimmed_text")),"core_tag"===f.component&&"tagareacollection"===f.itemtype&&(c=a(this).attr("data-itemid"),a(".tag-collections-table ul[data-collectionid] li[data-areaid="+c+"]").addClass("hidden"),d=a(this).attr("data-value"),e=a(this).closest("tr").find('[data-itemtype="tagareaenable"]').attr("data-value"),"1"===e&&a(".tag-collections-table ul[data-collectionid="+d+"] li[data-areaid="+c+"]").removeClass("hidden"))}),a("body").on("click",".addtagcoll > a",function(b){b.preventDefault();var c=a(this).attr("data-url")+"&sesskey="+M.cfg.sesskey;e.get_strings([{key:"addtagcoll",component:"tag"},{key:"name"},{key:"searchable",component:"tag"},{key:"create"},{key:"cancel"}]).done(function(b){var d=a('
');d.find('label[for="addtagcoll_name"]').html(b[1]),d.find('label[for="addtagcoll_searchable"]').html(b[2]),d.find("#addtagcoll_submit").attr("value",b[3]),d.find("#addtagcoll_cancel").attr("value",b[4]);var e=new M.core.dialogue({draggable:!0,modal:!0,closeButton:!0,headerContent:b[0],bodyContent:d.html()});e.show(),a("#addtagcoll_form #addtagcoll_name").focus(),a("#addtagcoll_form #addtagcoll_cancel").on("click",function(){e.destroy()}),a("#addtagcoll_form").on("submit",function(){var b=a("#addtagcoll_form #addtagcoll_name").val(),d=a("#addtagcoll_form #addtagcoll_searchable").prop("checked")?1:0;return String(b).length>0&&(window.location.href=c+"&name="+encodeURIComponent(b)+"&searchable="+d),!1})})}),a("body").on("click",".tag-collections-table .action_delete",function(b){b.preventDefault();var c=a(this).attr("data-url")+"&sesskey="+M.cfg.sesskey;e.get_strings([{key:"delete"},{key:"suredeletecoll",component:"tag",param:a(this).attr("data-collname")},{key:"yes"},{key:"no"}]).done(function(a){d.confirm(a[0],a[1],a[2],a[3],function(){window.location.href=c})})})}}}); \ No newline at end of file diff --git a/lib/amd/src/tag.js b/lib/amd/src/tag.js index 15154e8b336..08ff1a405f7 100644 --- a/lib/amd/src/tag.js +++ b/lib/amd/src/tag.js @@ -183,30 +183,94 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/notification', 'core/str' */ initManageCollectionsPage: function() { $('body').on('updated', '[data-inplaceeditable]', function(e) { - var ajaxreturn = e.ajaxreturn; - var oldvalue = e.oldvalue; + var ajaxreturn = e.ajaxreturn, + oldvalue = e.oldvalue, + areaid, collid, isenabled; if (ajaxreturn.component === 'core_tag' && ajaxreturn.itemtype === 'tagareaenable') { - var areaid = $(this).attr('data-itemid'); + areaid = $(this).attr('data-itemid'); $(".tag-collections-table ul[data-collectionid] li[data-areaid="+areaid+"]").addClass('hidden'); - var isenabled = ajaxreturn.value; + isenabled = ajaxreturn.value; if (isenabled === '1') { $(this).closest('tr').removeClass('dimmed_text'); - var collid = $(this).closest('tr').find('[data-itemtype="tagareacollection"]').attr("data-value"); + collid = $(this).closest('tr').find('[data-itemtype="tagareacollection"]').attr("data-value"); $(".tag-collections-table ul[data-collectionid="+collid+"] li[data-areaid="+areaid+"]").removeClass('hidden'); } else { $(this).closest('tr').addClass('dimmed_text'); } } if (ajaxreturn.component === 'core_tag' && ajaxreturn.itemtype === 'tagareacollection') { - var areaid = $(this).attr('data-itemid'); + areaid = $(this).attr('data-itemid'); $(".tag-collections-table ul[data-collectionid] li[data-areaid="+areaid+"]").addClass('hidden'); - var collid = $(this).attr('data-value'); - var isenabled = $(this).closest('tr').find('[data-itemtype="tagareaenable"]').attr("data-value"); + collid = $(this).attr('data-value'); + isenabled = $(this).closest('tr').find('[data-itemtype="tagareaenable"]').attr("data-value"); if (isenabled === "1") { $(".tag-collections-table ul[data-collectionid="+collid+"] li[data-areaid="+areaid+"]").removeClass('hidden'); } } - }); + }); + + $('body').on('click', '.addtagcoll > a', function(e) { + e.preventDefault(); + var href = $(this).attr('data-url') + '&sesskey=' + M.cfg.sesskey; + str.get_strings([ + {key : 'addtagcoll', component : 'tag'}, + {key : 'name'}, + {key : 'searchable', component : 'tag'}, + {key : 'create'}, + {key : 'cancel'}, + ]).done(function(s) { + var el = $(''); + el.find('label[for="addtagcoll_name"]').html(s[1]); + el.find('label[for="addtagcoll_searchable"]').html(s[2]); + el.find('#addtagcoll_submit').attr('value', s[3]); + el.find('#addtagcoll_cancel').attr('value', s[4]); + var panel = new M.core.dialogue ({ + draggable: true, + modal: true, + closeButton: true, + headerContent: s[0], + bodyContent: el.html() + }); + panel.show(); + $('#addtagcoll_form #addtagcoll_name').focus(); + $('#addtagcoll_form #addtagcoll_cancel').on('click', function() { + panel.destroy(); + }); + $('#addtagcoll_form').on('submit', function() { + var name = $('#addtagcoll_form #addtagcoll_name').val(); + var searchable = $('#addtagcoll_form #addtagcoll_searchable').prop('checked') ? 1 : 0; + if (String(name).length > 0) { + window.location.href = href + "&name=" + encodeURIComponent(name) + "&searchable=" + searchable; + } + return false; + }); + } + ); + + }); + + $('body').on('click', '.tag-collections-table .action_delete', function(e) { + e.preventDefault(); + var href = $(this).attr('data-url') + '&sesskey=' + M.cfg.sesskey; + str.get_strings([ + {key : 'delete'}, + {key : 'suredeletecoll', component : 'tag', param : $(this).attr('data-collname') }, + {key : 'yes'}, + {key : 'no'}, + ]).done(function(s) { + notification.confirm(s[0], s[1], s[2], s[3], function() { + window.location.href = href; + }); + } + ); + }); } }; }); \ No newline at end of file diff --git a/lib/classes/output/inplace_editable.php b/lib/classes/output/inplace_editable.php index b32ed158189..4e0d6d553c2 100644 --- a/lib/classes/output/inplace_editable.php +++ b/lib/classes/output/inplace_editable.php @@ -226,4 +226,14 @@ class inplace_editable implements templatable, renderable { 'linkeverything' => $this->get_linkeverything() ? 1 : 0, ); } + + /** + * Renders this element + * + * @param renderer_base $output typically, the renderer that's calling this function + * @return string + */ + public function render(\renderer_base $output) { + return $output->render_from_template('core/inplace_editable', $this->export_for_template($output)); + } } diff --git a/tag/classes/collection.php b/tag/classes/collection.php index 902a1a71086..2dd55d27f63 100644 --- a/tag/classes/collection.php +++ b/tag/classes/collection.php @@ -143,7 +143,7 @@ class core_tag_collection { return get_string($identifier, $component); } if (!empty($record->name)) { - return format_string($record->name, true, $syscontext); + return format_string($record->name, true, array('context' => $syscontext)); } else if ($record->isdefault) { return get_string('defautltagcoll', 'tag'); } else { @@ -216,7 +216,7 @@ class core_tag_collection { * Updates the tag collection information * * @param stdClass $tagcoll existing record in DB table tag_coll - * @param stdClass $data data from form core_tag_collection_form + * @param stdClass $data data to update * @return bool wether the record was updated */ public static function update($tagcoll, $data) { diff --git a/tag/classes/collection_form.php b/tag/classes/collection_form.php deleted file mode 100644 index 04a95b75aeb..00000000000 --- a/tag/classes/collection_form.php +++ /dev/null @@ -1,79 +0,0 @@ -. - -/** - * Contains class core_tag_collection_form - * - * @package core - * @copyright 2015 Marina Glancy - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - -defined('MOODLE_INTERNAL') || die(); - -require_once($CFG->libdir . '/formslib.php'); - -/** - * Form for editing tag collection - * - * @package core - * @copyright 2015 Marina Glancy - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ -class core_tag_collection_form extends moodleform { - - /** - * Form definition - */ - public function definition() { - $data = fullclone($this->_customdata); - if (isset($data->id)) { - $data->tc = $data->id; - $data->action = 'colledit'; - } else { - $data = new stdClass(); - $data->action = 'colladd'; - $data->isdefault = false; - } - - $mform = $this->_form; - $mform->addElement('hidden', 'tc'); - $mform->setType('tc', PARAM_INT); - $mform->addElement('hidden', 'action'); - $mform->setType('action', PARAM_ALPHA); - - $mform->addElement('text', 'name', get_string('name')); - $mform->setType('name', PARAM_NOTAGS); - $mform->addRule('name', get_string('maximumchars', '', 255), 'maxlength', 255, 'client'); - if (empty($data->isdefault)) { - $mform->addRule('name', get_string('required'), 'required', null, 'client'); - } else { - $mform->addElement('static', 'collnameexplained', '', get_string('collnameexplained', 'tag', - get_string('defautltagcoll', 'tag'))); - } - - $mform->addElement('advcheckbox', 'searchable', get_string('searchable', 'tag')); - $mform->addHelpButton('searchable', 'searchable', 'tag'); - $mform->setDefault('searchable', 1); - if (!empty($data->isdefault)) { - $mform->freeze('searchable'); - } - - $this->add_action_buttons(); - - $this->set_data($data); - } -} diff --git a/tag/classes/collections_table.php b/tag/classes/collections_table.php index 79e08690071..78cdaca9d56 100644 --- a/tag/classes/collections_table.php +++ b/tag/classes/collections_table.php @@ -35,6 +35,7 @@ class core_tag_collections_table extends html_table { /** * Constructor + * @global \core_renderer $OUTPUT * @param string|moodle_url $pageurl */ public function __construct($pageurl) { @@ -63,25 +64,23 @@ class core_tag_collections_table extends html_table { // Move up. if ($idx > 1) { $url->param('action', 'collmoveup'); - $actions .= $OUTPUT->action_icon($url, new pix_icon('t/up', get_string('moveup'))); + $actions .= $OUTPUT->action_icon($url, new pix_icon('t/up', get_string('moveup')), null, + array('class' => 'action-icon action_moveup')); } // Move down. if ($idx < count($tagcolls) - 1) { $url->param('action', 'collmovedown'); - $actions .= $OUTPUT->action_icon($url, new pix_icon('t/down', get_string('movedown'))); + $actions .= $OUTPUT->action_icon($url, new pix_icon('t/down', get_string('movedown')), null, + array('class' => 'action-icon action_movedown')); } } - if (empty($tagcoll->component)) { - // Edit. - $url->param('action', 'colledit'); - $actions .= $OUTPUT->action_icon($url, new pix_icon('t/edit', get_string('edittagcoll', 'tag', $name))); - } if (!$tagcoll->isdefault && empty($tagcoll->component)) { // Delete. $url->param('action', 'colldelete'); - $actions .= $OUTPUT->action_icon($url, new pix_icon('t/delete', get_string('delete'))); + $actions .= $OUTPUT->action_icon('#', new pix_icon('t/delete', get_string('delete')), null, + array('data-url' => $url, 'data-collname' => $name, + 'class' => 'action-icon action_delete')); } - $manageurl = new moodle_url('/tag/manage.php', array('tc' => $tagcoll->id)); $component = ''; if ($tagcoll->component) { $component = ($tagcoll->component === 'core' || preg_match('/^core_/', $tagcoll->component)) ? @@ -94,11 +93,13 @@ class core_tag_collections_table extends html_table { (array_key_exists($key, $validareas) ? "" : "class=\"hidden\"") . ">{$allareas[$key]}"; }, array_keys($allareas)); + $displayname = new \core_tag\output\tagcollname($tagcoll); + $searchable = new \core_tag\output\tagcollsearchable($tagcoll); $this->data[] = array( - html_writer::link($manageurl, $name), + $displayname->render($OUTPUT), $component, "