diff options
| -rw-r--r-- | ext/bg/js/settings-profiles.js | 39 | ||||
| -rw-r--r-- | ext/bg/settings.html | 19 | 
2 files changed, 55 insertions, 3 deletions
| diff --git a/ext/bg/js/settings-profiles.js b/ext/bg/js/settings-profiles.js index dca452d2..fa06203e 100644 --- a/ext/bg/js/settings-profiles.js +++ b/ext/bg/js/settings-profiles.js @@ -39,6 +39,8 @@ function profileOptionsSetupEventListeners() {      $('#profile-add').click(utilAsync(onProfileAdd));      $('#profile-remove').click(utilAsync(onProfileRemove));      $('#profile-remove-confirm').click(utilAsync(onProfileRemoveConfirm)); +    $('#profile-copy').click(utilAsync(onProfileCopy)); +    $('#profile-copy-confirm').click(utilAsync(onProfileCopyConfirm));      $('.profile-form').find('input, select, textarea').not('.profile-form-manual').change(utilAsync(onProfileOptionsChanged));  } @@ -69,17 +71,22 @@ async function profileFormRead(optionsFull) {  async function profileFormWrite(optionsFull) {      const profile = optionsFull.profiles[currentProfileIndex]; -    profileOptionsPopulateSelect($('#profile-active'), optionsFull.profiles, optionsFull.profileCurrent); -    profileOptionsPopulateSelect($('#profile-target'), optionsFull.profiles, currentProfileIndex); +    profileOptionsPopulateSelect($('#profile-active'), optionsFull.profiles, optionsFull.profileCurrent, null); +    profileOptionsPopulateSelect($('#profile-target'), optionsFull.profiles, currentProfileIndex, null);      $('#profile-remove').prop('disabled', optionsFull.profiles.length <= 1); +    $('#profile-copy').prop('disabled', optionsFull.profiles.length <= 1);      $('#profile-name').val(profile.name);  } -function profileOptionsPopulateSelect(select, profiles, currentValue) { +function profileOptionsPopulateSelect(select, profiles, currentValue, ignoreIndices) {      select.empty(); +      for (let i = 0; i < profiles.length; ++i) { +        if (ignoreIndices !== null && ignoreIndices.indexOf(i) >= 0) { +            continue; +        }          const profile = profiles[i];          select.append($(`<option value="${i}">${profile.name}</option>`));      } @@ -199,3 +206,29 @@ async function onProfileRemoveConfirm() {  function onProfileNameChanged() {      $('#profile-active, #profile-target').find(`[value="${currentProfileIndex}"]`).text(this.value);  } + +async function onProfileCopy() { +    const optionsFull = await apiOptionsGetFull(); +    if (optionsFull.profiles.length <= 1) { +        return; +    } + +    profileOptionsPopulateSelect($('#profile-copy-source'), optionsFull.profiles, currentProfileIndex === 0 ? 1 : 0, [currentProfileIndex]); +    $('#profile-copy-modal').modal('show'); +} + +async function onProfileCopyConfirm() { +    $('#profile-copy-modal').modal('hide'); + +    const optionsFull = await apiOptionsGetFull(); +    const index = tryGetIntegerValue('#profile-copy-source', 0, optionsFull.profiles.length); +    if (index === null || index === currentProfileIndex) { +        return; +    } + +    const profile = utilIsolate(optionsFull.profiles[index].options); +    optionsFull.profiles[currentProfileIndex].options = profile; + +    await profileOptionsUpdateTarget(optionsFull); +    await settingsSaveOptions(); +} diff --git a/ext/bg/settings.html b/ext/bg/settings.html index 1a1bc2ed..c0489894 100644 --- a/ext/bg/settings.html +++ b/ext/bg/settings.html @@ -100,6 +100,25 @@                      <input type="text" id="profile-name" class="form-control">                  </div> +                <div class="modal fade" tabindex="-1" role="dialog" id="profile-copy-modal"> +                    <div class="modal-dialog modal-dialog-centered"> +                        <div class="modal-content"> +                            <div class="modal-header"> +                                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> +                                <h4 class="modal-title">Copy Profile</h4> +                            </div> +                            <div class="modal-body"> +                                <p>Select which profile to copy options from:</p> +                                <select class="form-control" id="profile-copy-source"></select> +                            </div> +                            <div class="modal-footer"> +                                <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> +                                <button type="button" class="btn btn-primary" id="profile-copy-confirm">Copy Profile</button> +                            </div> +                        </div> +                    </div> +                </div> +                  <div class="modal fade" tabindex="-1" role="dialog" id="profile-remove-modal">                      <div class="modal-dialog modal-dialog-centered">                          <div class="modal-content"> |