From 97575f2b66ab695399ab55bac8257ec6f4b2b23a Mon Sep 17 00:00:00 2001 From: Kim Nguyen Date: Tue, 22 Sep 2026 16:04:57 -0400 Subject: [PATCH 01/12] Fix undo remove tag icon. (#1130) --- admin/themes/default/css/sass/pages/_tags.scss | 2 +- admin/themes/default/css/style.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/admin/themes/default/css/sass/pages/_tags.scss b/admin/themes/default/css/sass/pages/_tags.scss index dcee7269e..4ba705504 100644 --- a/admin/themes/default/css/sass/pages/_tags.scss +++ b/admin/themes/default/css/sass/pages/_tags.scss @@ -122,7 +122,7 @@ color: darken($green, 15%); } .undo-remove-tag a:after { - content: "\f112" / ""; + content: "\f0e2" / ""; color: #BB8282; font-size: 9px; text-indent: 3px; diff --git a/admin/themes/default/css/style.css b/admin/themes/default/css/style.css index 8f14b4a5d..0977629c8 100644 --- a/admin/themes/default/css/style.css +++ b/admin/themes/default/css/style.css @@ -3437,7 +3437,7 @@ form.form-inline.editableform { } .undo-remove-tag a:after { - content: "\f112"/""; + content: "\f0e2"/""; color: #BB8282; font-size: 9px; text-indent: 3px; From 457bc5ba0d91145777b62a6877ddd7b01028e84c Mon Sep 17 00:00:00 2001 From: Kim Nguyen Date: Wed, 23 Sep 2026 11:10:24 -0400 Subject: [PATCH 02/12] Convert tag action anchors into buttons. Additionally fixes "undo" glyph on record form. (#1127, #1130) --- .../themes/default/css/sass/pages/_items.scss | 12 ++-- .../themes/default/css/sass/pages/_tags.scss | 56 ++++++++--------- admin/themes/default/css/style.css | 62 +++++++++---------- admin/themes/default/items/tag-form.php | 5 +- admin/themes/default/javascripts/globals.js | 2 + admin/themes/default/javascripts/items.js | 10 ++- admin/themes/default/tags/browse.php | 2 +- 7 files changed, 71 insertions(+), 78 deletions(-) diff --git a/admin/themes/default/css/sass/pages/_items.scss b/admin/themes/default/css/sass/pages/_items.scss index 9094226b7..12b60c96a 100644 --- a/admin/themes/default/css/sass/pages/_items.scss +++ b/admin/themes/default/css/sass/pages/_items.scss @@ -306,23 +306,19 @@ outline: none; } - .undo-remove-tag a:after { + .undo-remove-tag .icon:after { background-color: #B00D00; color: white; } } -.undo-remove-tag { - display: none; - text-indent: -9999px; -} - +.tag-list li .undo-remove-tag, .tag-list li.tag-removed .remove-tag { display: none; } -.tag-removed .undo-remove-tag { - display: inline; +.tag-list li.tag-removed .undo-remove-tag { + display: inline-block; } .controls { diff --git a/admin/themes/default/css/sass/pages/_tags.scss b/admin/themes/default/css/sass/pages/_tags.scss index 4ba705504..ea2a5e9f5 100644 --- a/admin/themes/default/css/sass/pages/_tags.scss +++ b/admin/themes/default/css/sass/pages/_tags.scss @@ -83,50 +83,48 @@ form.form-inline.editableform { right: 0; } -.tag-list li .tag, .tag-list li a, .tag-list li .count { +.tag-list li .tag, .tag-list li button, .tag-list li .count { display: inline-block; -color: darken($green, 15%); + color: darken($green, 15%); } -.tag-list li .delete-tag a, .tag-list li .remove-tag a, .tag-list li .undo-remove-tag a { - text-indent: -9999px; - width: 16px; - height: 16px; - margin-left: 8px; - position: relative; - top: 3px; +.tag-list li { + display: inline-flex; + align-items: center; + gap: $spacing-m; } -.tag-list li .delete-tag a:after, .tag-list li .remove-tag a:after, .undo-remove-tag a:after { - content: "\f067" / ""; - -webkit-transform: rotate(45deg); - -moz-transform: rotate(45deg); - transform: rotate(45deg); +.tag-list li button { + margin: 0; + padding: 0; + border: 0; + width: 24px; + height: 24px; + min-height: 0; + background: transparent; + text-align: center; +} + +.tag-list li .delete-tag .icon:after, +.tag-list li .remove-tag .icon:after, +.undo-remove-tag .icon:after { + content: "\f00d" / ""; font-family: "Font Awesome 5 Free"; font-weight: 900; - height: 100%; - width: 100%; background-color: rgba($green, 1); - -webkit-border-radius: 20px; - -moz-border-radius: 20px; - border-radius: 20px; color:$lightgreen; - display: block; - position: relative; font-size: $spacing-m; - top: 0; - float: left; - text-indent: 4px; - line-height: 17px; text-shadow: none; + width: 16px; + height: 16px; + line-height: 16px; + border-radius: 16px; + display: inline-block; } -.undo-remove-tag a:after { +.undo-remove-tag .icon:after { content: "\f0e2" / ""; color: #BB8282; - font-size: 9px; - text-indent: 3px; - line-height: 18px; } #tags-nav { diff --git a/admin/themes/default/css/style.css b/admin/themes/default/css/style.css index 0977629c8..7d6669cea 100644 --- a/admin/themes/default/css/style.css +++ b/admin/themes/default/css/style.css @@ -2862,22 +2862,18 @@ ul.details li:last-child { background: rgb(243.9, 212.45, 210.6); outline: none; } -.tag-list li.tag-removed .undo-remove-tag a:after { +.tag-list li.tag-removed .undo-remove-tag .icon:after { background-color: #B00D00; color: white; } -.undo-remove-tag { - display: none; - text-indent: -9999px; -} - +.tag-list li .undo-remove-tag, .tag-list li.tag-removed .remove-tag { display: none; } -.tag-removed .undo-remove-tag { - display: inline; +.tag-list li.tag-removed .undo-remove-tag { + display: inline-block; } .controls { @@ -3402,46 +3398,48 @@ form.form-inline.editableform { right: 0; } -.tag-list li .tag, .tag-list li a, .tag-list li .count { +.tag-list li .tag, .tag-list li button, .tag-list li .count { display: inline-block; color: rgb(23.8170731707, 46.5, 0); } -.tag-list li .delete-tag a, .tag-list li .remove-tag a, .tag-list li .undo-remove-tag a { - text-indent: -9999px; - width: 16px; - height: 16px; - margin-left: 8px; - position: relative; - top: 3px; +.tag-list li { + display: inline-flex; + align-items: center; + gap: 10px; } -.tag-list li .delete-tag a:after, .tag-list li .remove-tag a:after, .undo-remove-tag a:after { - content: "\f067"/""; - transform: rotate(45deg); +.tag-list li button { + margin: 0; + padding: 0; + border: 0; + width: 24px; + height: 24px; + min-height: 0; + background: transparent; + text-align: center; +} + +.tag-list li .delete-tag .icon:after, +.tag-list li .remove-tag .icon:after, +.undo-remove-tag .icon:after { + content: "\f00d"/""; font-family: "Font Awesome 5 Free"; font-weight: 900; - height: 100%; - width: 100%; background-color: #3f7b00; - border-radius: 20px; color: #eaf2e1; - display: block; - position: relative; font-size: 10px; - top: 0; - float: left; - text-indent: 4px; - line-height: 17px; text-shadow: none; + width: 16px; + height: 16px; + line-height: 16px; + border-radius: 16px; + display: inline-block; } -.undo-remove-tag a:after { +.undo-remove-tag .icon:after { content: "\f0e2"/""; color: #BB8282; - font-size: 9px; - text-indent: 3px; - line-height: 18px; } #tags-nav { diff --git a/admin/themes/default/items/tag-form.php b/admin/themes/default/items/tag-form.php index 7cbe90172..dff8d22e5 100644 --- a/admin/themes/default/items/tag-form.php +++ b/admin/themes/default/items/tag-form.php @@ -19,8 +19,9 @@
  • ' . html_escape($tag->name) . ''; - echo '' . __('Undo') . ''; - echo '' . __('Remove') . ''; ?> + echo ''; + echo ''; + ?>
  • diff --git a/admin/themes/default/javascripts/globals.js b/admin/themes/default/javascripts/globals.js index 167f989e0..fc0dd6bdf 100644 --- a/admin/themes/default/javascripts/globals.js +++ b/admin/themes/default/javascripts/globals.js @@ -45,6 +45,8 @@ if (!Omeka) { url = $(this).parents('form').attr('action'); } else if ($(this).is('a')) { url = $(this).attr('href'); + } else if ($(this).is('button')) { + url = $(this).data('action-url'); } else { return; } diff --git a/admin/themes/default/javascripts/items.js b/admin/themes/default/javascripts/items.js index 751c5270a..accbbd6f4 100644 --- a/admin/themes/default/javascripts/items.js +++ b/admin/themes/default/javascripts/items.js @@ -101,8 +101,8 @@ Omeka.Items = {}; tagLi.after(" "); $('', {'class': 'tag', 'text': tag}).appendTo(tagLi); - var undoButton = $('Undo').appendTo(tagLi); - var deleteButton = $('Remove').appendTo(tagLi); + var undoButton = $('').appendTo(tagLi); if($('#all-tags-list').length != 0) { $('#all-tags-list').append(tagLi); @@ -180,13 +180,11 @@ Omeka.Items = {}; Omeka.Items.addTags($('#tags').val()); }); - $(document).on('click', 'span.remove-tag', function (event) { - event.preventDefault(); + $(document).on('click', '.remove-tag', function () { Omeka.Items.toggleTag(this); }); - $(document).on('click', 'span.undo-remove-tag', function (event) { - event.preventDefault(); + $(document).on('click', '.undo-remove-tag', function () { Omeka.Items.toggleTag(this); }); diff --git a/admin/themes/default/tags/browse.php b/admin/themes/default/tags/browse.php index aa4b1adf3..dcb48f41a 100644 --- a/admin/themes/default/tags/browse.php +++ b/admin/themes/default/tags/browse.php @@ -95,7 +95,7 @@ name); ?> - 'delete-confirm']); ?> + From 307b9be8e3de95afaf6ff8787594d354fac62a70 Mon Sep 17 00:00:00 2001 From: Kim Nguyen Date: Wed, 23 Sep 2026 11:42:38 -0400 Subject: [PATCH 03/12] Direct focus after performing actions on tags. * Focuses undo remove tag button after removing tag and vice versa. * Activating delete button directs focus to confirmation dialog close button. * Groups tag elements for clearer relationships. (#1127) --- .../themes/default/css/sass/pages/_items.scss | 12 +++---- .../themes/default/css/sass/pages/_tags.scss | 17 +++++---- admin/themes/default/css/style.css | 35 +++++++++---------- admin/themes/default/items/tag-form.php | 9 ++--- admin/themes/default/javascripts/globals.js | 1 + admin/themes/default/javascripts/items.js | 7 ++-- admin/themes/default/tags/browse.php | 29 ++++++++------- 7 files changed, 58 insertions(+), 52 deletions(-) diff --git a/admin/themes/default/css/sass/pages/_items.scss b/admin/themes/default/css/sass/pages/_items.scss index 12b60c96a..ccee6216a 100644 --- a/admin/themes/default/css/sass/pages/_items.scss +++ b/admin/themes/default/css/sass/pages/_items.scss @@ -290,11 +290,7 @@ /* Edit Item ================================================== */ -#all-tags-list { - padding: 0; -} - -.tag-list li.tag-removed { +.tag-list .tag-group.tag-removed { color: #B00D00; background: #F9E8E7; border: 1px solid rgba(#B00D00, 0.25); @@ -312,12 +308,12 @@ } } -.tag-list li .undo-remove-tag, -.tag-list li.tag-removed .remove-tag { +.tag-list .tag-group .undo-remove-tag, +.tag-list .tag-group.tag-removed .remove-tag { display: none; } -.tag-list li.tag-removed .undo-remove-tag { +.tag-list .tag-removed .undo-remove-tag { display: inline-block; } diff --git a/admin/themes/default/css/sass/pages/_tags.scss b/admin/themes/default/css/sass/pages/_tags.scss index ea2a5e9f5..9911ca698 100644 --- a/admin/themes/default/css/sass/pages/_tags.scss +++ b/admin/themes/default/css/sass/pages/_tags.scss @@ -43,9 +43,12 @@ form.form-inline.editableform { .tag-list { padding: 0; + list-style: none; + display: flex; + flex-wrap: wrap; } -.tag-list li { +.tag-list .tag-group { height: 22px; color: $green; background: $lightgreen; @@ -73,7 +76,7 @@ form.form-inline.editableform { position: relative; } -.tag-list li .count:after { +.tag-list .tag-group .count:after { content: ""; width: 1px; position: absolute; @@ -83,18 +86,18 @@ form.form-inline.editableform { right: 0; } -.tag-list li .tag, .tag-list li button, .tag-list li .count { +.tag-list .tag-group .tag, .tag-list .tag-group button, .tag-list .tag-group .count { display: inline-block; color: darken($green, 15%); } -.tag-list li { +.tag-list .tag-group { display: inline-flex; align-items: center; gap: $spacing-m; } -.tag-list li button { +.tag-list .tag-group button { margin: 0; padding: 0; border: 0; @@ -105,8 +108,8 @@ form.form-inline.editableform { text-align: center; } -.tag-list li .delete-tag .icon:after, -.tag-list li .remove-tag .icon:after, +.tag-list .tag-group .delete-tag .icon:after, +.tag-list .tag-group .remove-tag .icon:after, .undo-remove-tag .icon:after { content: "\f00d" / ""; font-family: "Font Awesome 5 Free"; diff --git a/admin/themes/default/css/style.css b/admin/themes/default/css/style.css index 7d6669cea..5e05d4e67 100644 --- a/admin/themes/default/css/style.css +++ b/admin/themes/default/css/style.css @@ -2848,31 +2848,27 @@ ul.details li:last-child { /* Edit Item ================================================== */ -#all-tags-list { - padding: 0; -} - -.tag-list li.tag-removed { +.tag-list .tag-group.tag-removed { color: #B00D00; background: #F9E8E7; border: 1px solid rgba(176, 13, 0, 0.25); } -.tag-list li.tag-removed:hover, .tag-list li.tag-removed:focus { +.tag-list .tag-group.tag-removed:hover, .tag-list .tag-group.tag-removed:focus { border-color: rgba(176, 13, 0, 0.65); background: rgb(243.9, 212.45, 210.6); outline: none; } -.tag-list li.tag-removed .undo-remove-tag .icon:after { +.tag-list .tag-group.tag-removed .undo-remove-tag .icon:after { background-color: #B00D00; color: white; } -.tag-list li .undo-remove-tag, -.tag-list li.tag-removed .remove-tag { +.tag-list .tag-group .undo-remove-tag, +.tag-list .tag-group.tag-removed .remove-tag { display: none; } -.tag-list li.tag-removed .undo-remove-tag { +.tag-list .tag-removed .undo-remove-tag { display: inline-block; } @@ -3364,9 +3360,12 @@ form.form-inline.editableform { .tag-list { padding: 0; + list-style: none; + display: flex; + flex-wrap: wrap; } -.tag-list li { +.tag-list .tag-group { height: 22px; color: #3f7b00; background: #eaf2e1; @@ -3376,7 +3375,7 @@ form.form-inline.editableform { margin: 0 10px 10px 0; padding: 5px 10px; } -.tag-list li:hover, .tag-list li:focus { +.tag-list .tag-group:hover, .tag-list .tag-group:focus { border-color: rgba(63, 123, 0, 0.65); background: rgb(221.5465116279, 234.2906976744, 207.2093023256); outline: none; @@ -3388,7 +3387,7 @@ form.form-inline.editableform { position: relative; } -.tag-list li .count:after { +.tag-list .tag-group .count:after { content: ""; width: 1px; position: absolute; @@ -3398,18 +3397,18 @@ form.form-inline.editableform { right: 0; } -.tag-list li .tag, .tag-list li button, .tag-list li .count { +.tag-list .tag-group .tag, .tag-list .tag-group button, .tag-list .tag-group .count { display: inline-block; color: rgb(23.8170731707, 46.5, 0); } -.tag-list li { +.tag-list .tag-group { display: inline-flex; align-items: center; gap: 10px; } -.tag-list li button { +.tag-list .tag-group button { margin: 0; padding: 0; border: 0; @@ -3420,8 +3419,8 @@ form.form-inline.editableform { text-align: center; } -.tag-list li .delete-tag .icon:after, -.tag-list li .remove-tag .icon:after, +.tag-list .tag-group .delete-tag .icon:after, +.tag-list .tag-group .remove-tag .icon:after, .undo-remove-tag .icon:after { content: "\f00d"/""; font-family: "Font Awesome 5 Free"; diff --git a/admin/themes/default/items/tag-form.php b/admin/themes/default/items/tag-form.php index dff8d22e5..68ddd6cd2 100644 --- a/admin/themes/default/items/tag-form.php +++ b/admin/themes/default/items/tag-form.php @@ -14,18 +14,19 @@

    -
    -
      +
        + id; ?>
      • - ' . html_escape($tag->name) . ''; +
        + ' . html_escape($tag->name) . ''; echo ''; echo ''; ?> +
      -
    diff --git a/admin/themes/default/javascripts/globals.js b/admin/themes/default/javascripts/globals.js index fc0dd6bdf..adcc87077 100644 --- a/admin/themes/default/javascripts/globals.js +++ b/admin/themes/default/javascripts/globals.js @@ -53,6 +53,7 @@ if (!Omeka) { $.post(url, function (response){ $(response).dialog({modal:true}); + $('.ui-dialog .ui-dialog-titlebar-close').focus(); }); }); }; diff --git a/admin/themes/default/javascripts/items.js b/admin/themes/default/javascripts/items.js index accbbd6f4..7227356ec 100644 --- a/admin/themes/default/javascripts/items.js +++ b/admin/themes/default/javascripts/items.js @@ -145,7 +145,10 @@ Omeka.Items = {}; * @param {Element} button Clicked button. */ Omeka.Items.toggleTag = function (button) { - $(button).parent().toggleClass('tag-removed'); + var tagGroup = $(button).parent(); + tagGroup.toggleClass('tag-removed'); + tagGroup.find(':focusable').focus(); + Omeka.Items.updateTagsField(); }; @@ -156,7 +159,7 @@ Omeka.Items = {}; var tagsToAdd = []; var tagsToDelete = []; - $('.tag-list li').each(function () { + $('.tag-list .tag-group').each(function () { var tagSpan = $(this).find('.tag'); var tag = $.trim(tagSpan.text()); if ($(this).hasClass('tag-removed')) { diff --git a/admin/themes/default/tags/browse.php b/admin/themes/default/tags/browse.php index dcb48f41a..361bde374 100644 --- a/admin/themes/default/tags/browse.php +++ b/admin/themes/default/tags/browse.php @@ -83,20 +83,23 @@
      + id; ?>
    • - - - - - - - name); ?> - - name); ?> - - - - +
      + + + + + + + name); ?> + + name); ?> + + + + +
    From 1626cfb0d78cad667e8eae31366618524763d158 Mon Sep 17 00:00:00 2001 From: Kim Nguyen Date: Fri, 25 Sep 2026 13:38:44 -0400 Subject: [PATCH 04/12] Fix addTagElement(). (#1128) --- admin/themes/default/javascripts/items.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/admin/themes/default/javascripts/items.js b/admin/themes/default/javascripts/items.js index 7227356ec..8a54d4afe 100644 --- a/admin/themes/default/javascripts/items.js +++ b/admin/themes/default/javascripts/items.js @@ -97,12 +97,13 @@ Omeka.Items = {}; * @param {string} tag Tag to add buttons for. */ Omeka.Items.addTagElement = function (tag) { - var tagLi = $('
  • '); - tagLi.after(" "); + var tagLi = $("
  • "); + var tagDiv = $('
    '); - $('', {'class': 'tag', 'text': tag}).appendTo(tagLi); - var undoButton = $('').appendTo(tagLi); + $('', {'class': 'tag', 'text': tag}).appendTo(tagDiv); + var undoButton = $('').appendTo(tagDiv); + tagDiv.appendTo(tagLi); if($('#all-tags-list').length != 0) { $('#all-tags-list').append(tagLi); From dfa9a6326d05cb5c7ddd6e3feda9d87aa7a1a12a Mon Sep 17 00:00:00 2001 From: Kim Nguyen Date: Tue, 29 Sep 2026 14:11:36 -0400 Subject: [PATCH 05/12] Convert editinplace spans into buttons. Tags now use buttons to activate editinplace. This makes them keyboard navigable. They have been labeled, and focus is directed back to the button after editing. (#1127) --- admin/themes/default/css/sass/pages/_tags.scss | 11 ++++++++++- admin/themes/default/css/style.css | 11 ++++++++++- admin/themes/default/items/tag-form.php | 4 ++-- admin/themes/default/javascripts/tags.js | 11 +++++++++-- admin/themes/default/tags/browse.php | 9 ++++++--- 5 files changed, 37 insertions(+), 9 deletions(-) diff --git a/admin/themes/default/css/sass/pages/_tags.scss b/admin/themes/default/css/sass/pages/_tags.scss index 9911ca698..3ddf0f5ee 100644 --- a/admin/themes/default/css/sass/pages/_tags.scss +++ b/admin/themes/default/css/sass/pages/_tags.scss @@ -97,7 +97,7 @@ form.form-inline.editableform { gap: $spacing-m; } -.tag-list .tag-group button { +.tag-list .tag-group .button { margin: 0; padding: 0; border: 0; @@ -108,6 +108,15 @@ form.form-inline.editableform { text-align: center; } +.tag-list .tag-group button.editable { + margin: 0; + padding: 0; + border: 0; + min-height: 0; + background: transparent; + font-weight: normal; +} + .tag-list .tag-group .delete-tag .icon:after, .tag-list .tag-group .remove-tag .icon:after, .undo-remove-tag .icon:after { diff --git a/admin/themes/default/css/style.css b/admin/themes/default/css/style.css index 5e05d4e67..c15685f21 100644 --- a/admin/themes/default/css/style.css +++ b/admin/themes/default/css/style.css @@ -3408,7 +3408,7 @@ form.form-inline.editableform { gap: 10px; } -.tag-list .tag-group button { +.tag-list .tag-group .button { margin: 0; padding: 0; border: 0; @@ -3419,6 +3419,15 @@ form.form-inline.editableform { text-align: center; } +.tag-list .tag-group button.editable { + margin: 0; + padding: 0; + border: 0; + min-height: 0; + background: transparent; + font-weight: normal; +} + .tag-list .tag-group .delete-tag .icon:after, .tag-list .tag-group .remove-tag .icon:after, .undo-remove-tag .icon:after { diff --git a/admin/themes/default/items/tag-form.php b/admin/themes/default/items/tag-form.php index 68ddd6cd2..1eff04c08 100644 --- a/admin/themes/default/items/tag-form.php +++ b/admin/themes/default/items/tag-form.php @@ -20,8 +20,8 @@
  • ' . html_escape($tag->name) . ''; - echo ''; - echo ''; + echo ''; + echo ''; ?>
  • diff --git a/admin/themes/default/javascripts/tags.js b/admin/themes/default/javascripts/tags.js index c024408e6..1975d72be 100644 --- a/admin/themes/default/javascripts/tags.js +++ b/admin/themes/default/javascripts/tags.js @@ -21,8 +21,15 @@ Omeka.Tags = {}; return params; }, success: function (value, settings) { - $(this).parents('li').find('a.count').first().attr("href", tagURLBase + value); - }, + $(this).parents('li').find('.count').first().attr("href", tagURLBase + value); + } + }).on('hidden', function(e, reason) { + if (reason === 'onblur') { + return; + } + var tagGroup = $(this).parents('.tag-group'); + var editButton = tagGroup.find('.edit-tag'); + editButton.focus(); }); }; })(jQuery); diff --git a/admin/themes/default/tags/browse.php b/admin/themes/default/tags/browse.php index 361bde374..20b025bfc 100644 --- a/admin/themes/default/tags/browse.php +++ b/admin/themes/default/tags/browse.php @@ -81,6 +81,9 @@ } ?>
    + + +