feat: add move up/down functionality for alternate greetings (#4676) * feat: add move up/down functionality for alternate greetings * Remove disabled cursor style
Signed| @@ -7216,11 +7216,18 @@ | ||
| 7216 | 7216 | <div class="alternate_greeting"> |
| 7217 | 7217 | <details open> |
| 7218 | 7218 | <summary> |
| 7219 | 7219 | <div class="title_restorable gap5px"> |
| 7220 | 7220 | <div class="flex-container alignItemsCenter"> |
| 7221 | 7221 | <strong><span data-i18n="Alternate Greeting #">Alternate Greeting #</span><span class="greeting_index"></span></strong> |
| 7222 | 7222 | <i class="editor_maximize fa-solid fa-maximize right_menu_button" title="Expand the editor" data-i18n="[title]Expand the editor"></i> |
| 7223 | 7223 | </div> |
| 7224 | + <span class="expander"></span> | |
| 7225 | + <div class="menu_button menu_button_icon move_up_alternate_greeting" title="Move up" data-i18n="[title]Move up"> | |
| 7226 | + <i class="fa-solid fa-chevron-up"></i> | |
| 7227 | + </div> | |
| 7228 | + <div class="menu_button menu_button_icon move_down_alternate_greeting" title="Move down" data-i18n="[title]Move down"> | |
| 7229 | + <i class="fa-solid fa-chevron-down"></i> | |
| 7230 | + </div> | |
| 7224 | 7231 | <div class="menu_button menu_button_icon delete_alternate_greeting"> |
| 7225 | 7232 | <i class="fa-solid fa-trash-alt"></i> |
| 7226 | 7233 | <span data-i18n="Delete">Delete</span> |
| @@ -8450,6 +8450,8 @@ function openAlternateGreetings() { | ||
| 8450 | 8450 | array.push(''); |
| 8451 | 8451 | addAlternateGreeting(template, '', index, getArray, popup); |
| 8452 | 8452 | updateAlternateGreetingsHintVisibility(template); |
| 8453 | + const list = template.find('.alternate_greetings_list'); | |
| 8454 | + list.scrollTop(list.prop('scrollHeight')); | |
| 8453 | 8455 | }); |
| 8454 | 8456 | |
| 8455 | 8457 | popup.show(); |
| @@ -8466,6 +8468,7 @@ function openAlternateGreetings() { | ||
| 8466 | 8468 | */ |
| 8467 | 8469 | function addAlternateGreeting(template, greeting, index, getArray, popup) { |
| 8468 | 8470 | const greetingBlock = $('#alternate_greeting_form_template .alternate_greeting').clone(); |
| 8471 | + greetingBlock.attr('data-index', index); | |
| 8469 | 8472 | greetingBlock.find('.alternate_greeting_text') |
| 8470 | 8473 | .attr('id', `alternate_greeting_${index}`) |
| 8471 | 8474 | .on('input', async function () { |
| @@ -8479,15 +8482,57 @@ function addAlternateGreeting(template, greeting, index, getArray, popup) { | ||
| 8479 | 8482 | event.preventDefault(); |
| 8480 | 8483 | event.stopPropagation(); |
| 8481 | 8484 | |
| 8482 | 8485 | ifconst (confirm = await callGenericPopup(t`Are you sure you want to delete this alternate greeting?`)), {POPUP_TYPE.CONFIRM); |
| 8486 | + if (!confirm) { | |
| 8487 | + return; | |
| 8488 | + } | |
| 8489 | + | |
| 8483 | 8490 | const array = getArray(); |
| 8484 | 8491 | array.splice(index, 1); |
| 8485 | 8492 | |
| 8486 | 8493 | // We need to reopen the popup to update the index numbers |
| 8487 | 8494 | await popup.complete(POPUP_RESULT.AFFIRMATIVE); |
| 8488 | 8495 | openAlternateGreetings(); |
| 8489 | - } | |
| 8490 | 8496 | }); |
| 8497 | + greetingBlock.find('.move_up_alternate_greeting').on('click', function (event) { | |
| 8498 | + handleMoveAlternateGreeting(event, -1); | |
| 8499 | + }); | |
| 8500 | + greetingBlock.find('.move_down_alternate_greeting').on('click', function (event) { | |
| 8501 | + handleMoveAlternateGreeting(event, 1); | |
| 8502 | + }); | |
| 8503 | + | |
| 8504 | + /** | |
| 8505 | + * Handles moving an alternate greeting up or down in the list. | |
| 8506 | + * @param {JQuery.ClickEvent} event - The click event | |
| 8507 | + * @param {number} direction - Direction to move: -1 for up, 1 for down | |
| 8508 | + */ | |
| 8509 | + function handleMoveAlternateGreeting(event, direction) { | |
| 8510 | + event.preventDefault(); | |
| 8511 | + event.stopPropagation(); | |
| 8512 | + | |
| 8513 | + const array = getArray(); | |
| 8514 | + const index = Number(greetingBlock.attr('data-index')); | |
| 8515 | + const newIndex = index + direction; | |
| 8516 | + | |
| 8517 | + // Check bounds | |
| 8518 | + if (direction === -1 && index <= 0) { | |
| 8519 | + return; | |
| 8520 | + } | |
| 8521 | + if (direction === 1 && index >= array.length - 1) { | |
| 8522 | + return; | |
| 8523 | + } | |
| 8524 | + | |
| 8525 | + // Swap the greetings | |
| 8526 | + [array[index], array[newIndex]] = [array[newIndex], array[index]]; | |
| 8527 | + | |
| 8528 | + // Update current greeting | |
| 8529 | + greetingBlock.find('.alternate_greeting_text').val(array[index]); | |
| 8530 | + | |
| 8531 | + // Update adjacent greeting | |
| 8532 | + const adjacentGreetingBlock = template.find(`.alternate_greeting[data-index="${newIndex}"]`); | |
| 8533 | + adjacentGreetingBlock.find('.alternate_greeting_text').val(array[newIndex]); | |
| 8534 | + } | |
| 8535 | + | |
| 8491 | 8536 | template.find('.alternate_greetings_list').append(greetingBlock); |
| 8492 | 8537 | } |
| 8493 | 8538 | |
| @@ -3464,10 +3464,17 @@ grammarly-extension { | ||
| 3464 | 3464 | padding: 2px; |
| 3465 | 3465 | } |
| 3466 | 3466 | |
| 3467 | +.alternate_greeting:first-of-type .move_up_alternate_greeting, | |
| 3468 | +.alternate_greeting:last-of-type .move_down_alternate_greeting { | |
| 3469 | + filter: brightness(75%) grayscale(1); | |
| 3470 | + opacity: 0.5; | |
| 3471 | + pointer-events: none; | |
| 3472 | +} | |
| 3473 | + | |
| 3467 | 3474 | .alternate_greeting summary { |
| 3468 | 3475 | list-style-position: outside; |
| 3469 | 3476 | margin-left: 1em; |
| 3470 | 3477 | padding-left: 1em5px; |
| 3471 | 3478 | } |
| 3472 | 3479 | |
| 3473 | 3480 | .alternate_greeting textarea { |