Skip to content

Conversation

@artisticlight
Copy link
Member

Summary

This adds a delete project name option to the HyP3 project rename feature

i18n

  • No hardcoded user-facing strings
  • New or modified translation keys are documented below

i18n keys changed/added

Key English Spanish
RENAME_JOB_TO Rename job to: Renombrar trabajo a:
RENAME_JOBS_TO Rename {{count}} jobs to: Renombrar {{count}} trabajos a:
REMOVE_PROJECT_NAME Remove project name Eliminar nombre del proyecto
REMOVE_PROJECT_NAMES Remove {{count}} project names Eliminar {{count}} nombres de proyecto

williamh890 and others added 30 commits November 19, 2025 14:17
…scovery-SearchUI into will/update-job-project-name
…lters.component.scss

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Added checks for empty project name entry or only spaces. Also validate that the jobs were successfully renamed and provided error handling. Will provide error notification with toast.
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
I think this is an unreported bug resulting from the recent Angular upgrade.
artisticlight and others added 13 commits December 19, 2025 12:30
Made the Project Rename table sorted by Project Name by default and eliminated the use of ::ng-deep in the Project Rename scss files.
* Removed stale SCSS styles: Cleaned up .sortable, .sort-indicator, .projects-table-body-container, and custom table styling that was no longer needed after switching to Material table

* Made dialog injects private: Changed dialogRef and data from public to private to match codebase pattern

* Added readonly to displayedColumns: Added readonly modifier since the array never changes

* Fixed track function: Changed track name to track $index to handle potential duplicate project names in the failed list
Made the Project Rename table sorted by Project Name by default and eliminated the use of ::ng-deep in the Project Rename scss files.
It was 1000+ before but Tools wants to see it always.
I added a @HostListener for the window:beforeunload event that triggers only when the dialog is in the processing phase.

This will:

- Show the browser's native "Leave site?" confirmation dialog when the user tries to close the tab/window or navigate away
- Only trigger during the processing phase - users can freely close during input, complete, or error phases
- Let the browser handle the UI (modern browsers don't allow custom messages for security reasons)
- Replace mat-button-toggle-group with mat-radio-group for cleaner UX
- Input field now visually nested under "Rename" radio option
- Add singular/plural translation keys for radio labels (en, es, de)
- Add accessible aria-label to radio group
- Update styles for radio group layout and disabled state
- Add docs/ to .gitignore
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR enhances the HyP3 project rename feature by adding the ability to remove project names entirely, providing users with a toggle between renaming and removing project names.

Key Changes:

  • Added a radio button toggle in the project name dialog to switch between "rename" and "remove" modes
  • Introduced new i18n keys for the remove functionality and updated confirmation messages
  • Modified component logic to handle null project names when in remove mode

Reviewed changes

Copilot reviewed 6 out of 7 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
src/assets/i18n/en.json Added English translations for rename/remove actions and confirmation messages
src/assets/i18n/es.json Added Spanish translations with placeholder TODOs for confirmation messages
src/assets/i18n/de.json Added German translations for rename/remove actions (missing confirmation messages)
src/app/components/shared/project-name-dialog/project-name-dialog.component.ts Added projectEditType signal, computed properties for edit/remove modes, and logic to handle null project names
src/app/components/shared/project-name-dialog/project-name-dialog.component.html Implemented radio button UI with conditional labels and confirmation messages based on mode
src/app/components/shared/project-name-dialog/project-name-dialog.component.scss Added styling for radio group layout, disabled form field state, and label sizing
.gitignore Added docs/ directory to ignore list

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Copy link

Copilot AI commented Jan 6, 2026

@artisticlight I've opened a new pull request, #2379, to work on those changes. Once the pull request is ready, I'll request review from you.

…log.component.scss

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
A single job rename didn't reflect the count of '1' in the dialog for renaming a job. It now does.
@artisticlight artisticlight merged commit f3ab183 into test Jan 6, 2026
6 checks passed
artisticlight added a commit that referenced this pull request Jan 12, 2026
* DS-6299 Displacement Search should not allow polar map views (#2365)

* DS-6299 Only Equatorial view is valid for Displacement Searches

* DS-D299

Added fix to switch to equatorial view if a polar view is currently active, when a user switches to a Displacement view

* Updated translations from Phrase (#2337)

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state
phrase: update src/assets/i18n/de.json to latest state

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state
phrase: update src/assets/i18n/de.json to latest state

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state
phrase: update src/assets/i18n/de.json to latest state

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state
phrase: update src/assets/i18n/de.json to latest state

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state
phrase: update src/assets/i18n/de.json to latest state

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state
phrase: update src/assets/i18n/de.json to latest state

---------

Co-authored-by: Andrew Anderson <raanderson9@alaska.edu>
Co-authored-by: yoreley777 <yvillafanez@unicon-intl.com>

* Updated translations from Phrase (#2367)

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state
phrase: update src/assets/i18n/de.json to latest state

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state
phrase: update src/assets/i18n/de.json to latest state

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state
phrase: update src/assets/i18n/de.json to latest state

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state
phrase: update src/assets/i18n/de.json to latest state

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state
phrase: update src/assets/i18n/de.json to latest state

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state
phrase: update src/assets/i18n/de.json to latest state

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state
phrase: update src/assets/i18n/de.json to latest state

---------

Co-authored-by: Andrew Anderson <raanderson9@alaska.edu>
Co-authored-by: yoreley777 <yvillafanez@unicon-intl.com>

* feat: add displacement disclaimer button and modal to header breadcrumb

* feat: add Open FAQ button to displacement disclaimer text

* fix: add punctuation to end of disp disclaimer text

* fix: add OPEN_FAQ translation key

* DS-6335 (#2368)

Identifying GCOV (Geocoded Polarimetric Covariance) as the recommended product in the NISAR Science Filters

* Andy/ds 6336 (#2366)

* Make Help more easily seen on Filter's panel.

* DS-6336 Text modified to be translatable.

* Lint space

* Update src/app/components/filters-dropdown/dataset-filters/dataset-filters.component.scss

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* feat: Update control flow syntax (#2370)

* chore: control flow migration tool

* fix: duplicate template names

* fix: ngSwitch case

* chore: rerun migration tool with errors fixed

* fix: flow regression

* Updated translations from Phrase (#2373)

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state
phrase: update src/assets/i18n/de.json to latest state

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state
phrase: update src/assets/i18n/de.json to latest state

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state
phrase: update src/assets/i18n/de.json to latest state

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state
phrase: update src/assets/i18n/de.json to latest state

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state
phrase: update src/assets/i18n/de.json to latest state

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state
phrase: update src/assets/i18n/de.json to latest state

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state
phrase: update src/assets/i18n/de.json to latest state

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state
phrase: update src/assets/i18n/de.json to latest state

---------

Co-authored-by: Andrew Anderson <raanderson9@alaska.edu>
Co-authored-by: yoreley777 <yvillafanez@unicon-intl.com>

* feat: standalone migration

* feat: initial migration tool pass

* feat: remove modules, and move providers into components

* chore: remove shared module

* fix: merged component not standalone

* chore: update automated imports to use ts aliasing

* chore: remove ngIf, ngFor module imports

* chore: remove unused filter pipe

* fix: ng-template leftovers

* Andy/6335 (#2374)

* DS-6335

Identifying GCOV (Geocoded Polarimetric Covariance) as the recommended product in the NISAR Science Filters

* DS-6335 Sci-Prod Recommended Made text more readable in Dark Mode

* npm run lint -- --fix

* Revamped William's Pull Request for Changing On Demand Job Names (#2375)

* Add ability to update a jobs project name

* fix: formatting

* Add ability to nuke all loaded jobs

* Make Help more easily seen on Filter's panel.

* DS-6336 Text modified to be translatable.

* Lint space

* feat: Update to use jobs patch endpoint

* Update src/app/components/filters-dropdown/dataset-filters/dataset-filters.component.scss

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Round 1 of revamping the UI

* Fix console error related to translation.

* Bulk rename uses new dialog

* npm run lint -- --fix

* On Demand search reloads after bulk rename

* npm run lint -- --fix

* Resolving issues from merging with test

* Snackbar message for renaming jobs

* Adding multi-lingual support to rename dialog

And a few other UI tweaks.

* Edit Validation

Added checks for empty project name entry or only spaces. Also validate that the jobs were successfully renamed and provided error handling. Will provide error notification with toast.

* Update src/app/services/hyp3/hyp3-api.service.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update src/app/store/scenes/scenes.action.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Fix for flight direction graphics not appearing in Displacement

I think this is an unreported bug resulting from the recent Angular upgrade.

* Show projects that are going to be renamed with the bulk operation.

* Update uniqueProjectNames filtering

* Fix: update job count in dialog

* Fix single job rename

* Many Changes

* Added list of projects and associated job counts in a sortable table
* Limited project name input to 100 characters
* Prevent user from changing names of projects for other users

* Progress Bar

I've implemented a two-phase dialog that handles the rename operation internally with a determinate progress bar.

* Deterministic Progress Bar

The Project Rename dialog box now is augmented with a couple more screens indicating renaming progress and completion.

* UI Improvements

* Auto-focus the input field
* Show the new name in the confirmation message

* Show specific project names if failed

I've implemented the feature to show which specific project names failed to rename in the completion phase.

* Show Time Estimate for Bulk Rename Completion

I've implemented the estimated time remaining feature for large batch rename operations. Here's what was added:

How it works:
The estimated time is calculated based on the elapsed time and number of completed batches
It only displays for operations with 1000+ jobs (to avoid showing for small, quick operations)
The time is displayed in a user-friendly format (e.g., "< 1 min", "~1 min", "~5 min")

* Project Rename Title Updated

Updated the table to William's suggestions.

* npm run lint -- --fix

* Update src/app/store/scenes/scenes.action.ts

Co-authored-by: William Horn <wbhorn@alaska.edu>

* Update src/app/services/hyp3/hyp3-api.service.ts

Co-authored-by: William Horn <wbhorn@alaska.edu>

* Created three named interfaces at the top of hyp3-api.service.ts

* RenameProgressInfo - Progress info with percent and estimated time remaining
* RenameResult - Final result with success/failed counts and failed project names
*RenameWithProgressResult - The composite return type containing both observables

I also changed a 'sneaky' 3 into a constant

* Update src/app/components/shared/project-name-dialog/project-name-dialog.component.ts

Co-authored-by: William Horn <wbhorn@alaska.edu>

* Tyler Suggestions

Fixed - Red toast regression
Fixed - Missing unnamed projects

* Tyler Suggestions #2

Fixed - Empty string validation feedback
Fixed - Checkbox disclaimer with empty string

* Tyler Suggestions #3

Fixed - Remove dialog service abstraction
Fixed - Convert getter to signal/computed

* Tyler Suggestions #4

Fixed - Use SubSink pattern consistently
Fixed - Moved constructor logic to ngOnInit

* Tyler Suggestions #5

Fixed - Material Table with Sorting in-place

Reviewing the idea of using the Material Stepper consideration, I don't think it is a good fit. The phases are not user-navigated steps, they're system-driven and there is no option for backward navigation.

* npm run lint -- --fix

* Conformity & Best Practices

#2 - Removed stale SCSS styles: Cleaned up .sortable, .sort-indicator, .projects-table-body-container, and custom table styling that was no longer needed after switching to Material table

* Made dialog injects private: Changed dialogRef and data from public to private to match codebase pattern

* Added readonly to displayedColumns: Added readonly modifier since the array never changes

* Fixed track function: Changed track name to track $index to handle potential duplicate project names in the failed list

* Made "(unnamed)" multilingual

* Tweaks

Made the Project Rename table sorted by Project Name by default and eliminated the use of ::ng-deep in the Project Rename scss files.

* Conformity & Best Practices

* Removed stale SCSS styles: Cleaned up .sortable, .sort-indicator, .projects-table-body-container, and custom table styling that was no longer needed after switching to Material table

* Made dialog injects private: Changed dialogRef and data from public to private to match codebase pattern

* Added readonly to displayedColumns: Added readonly modifier since the array never changes

* Fixed track function: Changed track name to track $index to handle potential duplicate project names in the failed list

* Made "(unnamed)" multilingual

* Tweaks

Made the Project Rename table sorted by Project Name by default and eliminated the use of ::ng-deep in the Project Rename scss files.

* npm run lint -- --fix

* Made the table header 'sticky'

* Fixed Table Header for Dark-Theme

* Show estimated time for 5+ jobs

It was 1000+ before but Tools wants to see it always.

* Warn about Abort

I added a @HostListener for the window:beforeunload event that triggers only when the dialog is in the processing phase.

This will:

- Show the browser's native "Leave site?" confirmation dialog when the user tries to close the tab/window or navigate away
- Only trigger during the processing phase - users can freely close during input, complete, or error phases
- Let the browser handle the UI (modern browsers don't allow custom messages for security reasons)

---------

Co-authored-by: William Horn <wbhorn@alaska.edu>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Andy/radio button toggle (#2378)

* Add ability to update a jobs project name

* fix: formatting

* Add ability to nuke all loaded jobs

* Make Help more easily seen on Filter's panel.

* DS-6336 Text modified to be translatable.

* Lint space

* feat: Update to use jobs patch endpoint

* Update src/app/components/filters-dropdown/dataset-filters/dataset-filters.component.scss

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Round 1 of revamping the UI

* Fix console error related to translation.

* Bulk rename uses new dialog

* npm run lint -- --fix

* On Demand search reloads after bulk rename

* npm run lint -- --fix

* Resolving issues from merging with test

* Snackbar message for renaming jobs

* Adding multi-lingual support to rename dialog

And a few other UI tweaks.

* Edit Validation

Added checks for empty project name entry or only spaces. Also validate that the jobs were successfully renamed and provided error handling. Will provide error notification with toast.

* Update src/app/services/hyp3/hyp3-api.service.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update src/app/store/scenes/scenes.action.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Fix for flight direction graphics not appearing in Displacement

I think this is an unreported bug resulting from the recent Angular upgrade.

* Show projects that are going to be renamed with the bulk operation.

* Update uniqueProjectNames filtering

* Fix: update job count in dialog

* Fix single job rename

* Many Changes

* Added list of projects and associated job counts in a sortable table
* Limited project name input to 100 characters
* Prevent user from changing names of projects for other users

* Progress Bar

I've implemented a two-phase dialog that handles the rename operation internally with a determinate progress bar.

* Deterministic Progress Bar

The Project Rename dialog box now is augmented with a couple more screens indicating renaming progress and completion.

* UI Improvements

* Auto-focus the input field
* Show the new name in the confirmation message

* Show specific project names if failed

I've implemented the feature to show which specific project names failed to rename in the completion phase.

* Show Time Estimate for Bulk Rename Completion

I've implemented the estimated time remaining feature for large batch rename operations. Here's what was added:

How it works:
The estimated time is calculated based on the elapsed time and number of completed batches
It only displays for operations with 1000+ jobs (to avoid showing for small, quick operations)
The time is displayed in a user-friendly format (e.g., "< 1 min", "~1 min", "~5 min")

* Project Rename Title Updated

Updated the table to William's suggestions.

* npm run lint -- --fix

* Update src/app/store/scenes/scenes.action.ts

Co-authored-by: William Horn <wbhorn@alaska.edu>

* Update src/app/services/hyp3/hyp3-api.service.ts

Co-authored-by: William Horn <wbhorn@alaska.edu>

* Created three named interfaces at the top of hyp3-api.service.ts

* RenameProgressInfo - Progress info with percent and estimated time remaining
* RenameResult - Final result with success/failed counts and failed project names
*RenameWithProgressResult - The composite return type containing both observables

I also changed a 'sneaky' 3 into a constant

* Update src/app/components/shared/project-name-dialog/project-name-dialog.component.ts

Co-authored-by: William Horn <wbhorn@alaska.edu>

* Tyler Suggestions

Fixed - Red toast regression
Fixed - Missing unnamed projects

* Tyler Suggestions #2

Fixed - Empty string validation feedback
Fixed - Checkbox disclaimer with empty string

* Tyler Suggestions #3

Fixed - Remove dialog service abstraction
Fixed - Convert getter to signal/computed

* Tyler Suggestions #4

Fixed - Use SubSink pattern consistently
Fixed - Moved constructor logic to ngOnInit

* Tyler Suggestions #5

Fixed - Material Table with Sorting in-place

Reviewing the idea of using the Material Stepper consideration, I don't think it is a good fit. The phases are not user-navigated steps, they're system-driven and there is no option for backward navigation.

* npm run lint -- --fix

* Conformity & Best Practices

#2 - Removed stale SCSS styles: Cleaned up .sortable, .sort-indicator, .projects-table-body-container, and custom table styling that was no longer needed after switching to Material table

* Made dialog injects private: Changed dialogRef and data from public to private to match codebase pattern

* Added readonly to displayedColumns: Added readonly modifier since the array never changes

* Fixed track function: Changed track name to track $index to handle potential duplicate project names in the failed list

* Made "(unnamed)" multilingual

* Tweaks

Made the Project Rename table sorted by Project Name by default and eliminated the use of ::ng-deep in the Project Rename scss files.

* Conformity & Best Practices

* Removed stale SCSS styles: Cleaned up .sortable, .sort-indicator, .projects-table-body-container, and custom table styling that was no longer needed after switching to Material table

* Made dialog injects private: Changed dialogRef and data from public to private to match codebase pattern

* Added readonly to displayedColumns: Added readonly modifier since the array never changes

* Fixed track function: Changed track name to track $index to handle potential duplicate project names in the failed list

* Made "(unnamed)" multilingual

* Tweaks

Made the Project Rename table sorted by Project Name by default and eliminated the use of ::ng-deep in the Project Rename scss files.

* npm run lint -- --fix

* Made the table header 'sticky'

* Fixed Table Header for Dark-Theme

* Show estimated time for 5+ jobs

It was 1000+ before but Tools wants to see it always.

* Warn about Abort

I added a @HostListener for the window:beforeunload event that triggers only when the dialog is in the processing phase.

This will:

- Show the browser's native "Leave site?" confirmation dialog when the user tries to close the tab/window or navigate away
- Only trigger during the processing phase - users can freely close during input, complete, or error phases
- Let the browser handle the UI (modern browsers don't allow custom messages for security reasons)

* Add toggle for removing project names in update dialog

* feat(project-name-dialog): replace button toggle with radio buttons

- Replace mat-button-toggle-group with mat-radio-group for cleaner UX
- Input field now visually nested under "Rename" radio option
- Add singular/plural translation keys for radio labels (en, es, de)
- Add accessible aria-label to radio group
- Update styles for radio group layout and disabled state
- Add docs/ to .gitignore

* Update src/assets/i18n/es.json

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update src/app/components/shared/project-name-dialog/project-name-dialog.component.scss

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Bug Fix

A single job rename didn't reflect the count of '1' in the dialog for renaming a job. It now does.

---------

Co-authored-by: William Horn <wbhorn@alaska.edu>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Andy/radio button toggle (#2380)

* Add ability to update a jobs project name

* fix: formatting

* Add ability to nuke all loaded jobs

* Make Help more easily seen on Filter's panel.

* DS-6336 Text modified to be translatable.

* Lint space

* feat: Update to use jobs patch endpoint

* Update src/app/components/filters-dropdown/dataset-filters/dataset-filters.component.scss

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Round 1 of revamping the UI

* Fix console error related to translation.

* Bulk rename uses new dialog

* npm run lint -- --fix

* On Demand search reloads after bulk rename

* npm run lint -- --fix

* Resolving issues from merging with test

* Snackbar message for renaming jobs

* Adding multi-lingual support to rename dialog

And a few other UI tweaks.

* Edit Validation

Added checks for empty project name entry or only spaces. Also validate that the jobs were successfully renamed and provided error handling. Will provide error notification with toast.

* Update src/app/services/hyp3/hyp3-api.service.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update src/app/store/scenes/scenes.action.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Fix for flight direction graphics not appearing in Displacement

I think this is an unreported bug resulting from the recent Angular upgrade.

* Show projects that are going to be renamed with the bulk operation.

* Update uniqueProjectNames filtering

* Fix: update job count in dialog

* Fix single job rename

* Many Changes

* Added list of projects and associated job counts in a sortable table
* Limited project name input to 100 characters
* Prevent user from changing names of projects for other users

* Progress Bar

I've implemented a two-phase dialog that handles the rename operation internally with a determinate progress bar.

* Deterministic Progress Bar

The Project Rename dialog box now is augmented with a couple more screens indicating renaming progress and completion.

* UI Improvements

* Auto-focus the input field
* Show the new name in the confirmation message

* Show specific project names if failed

I've implemented the feature to show which specific project names failed to rename in the completion phase.

* Show Time Estimate for Bulk Rename Completion

I've implemented the estimated time remaining feature for large batch rename operations. Here's what was added:

How it works:
The estimated time is calculated based on the elapsed time and number of completed batches
It only displays for operations with 1000+ jobs (to avoid showing for small, quick operations)
The time is displayed in a user-friendly format (e.g., "< 1 min", "~1 min", "~5 min")

* Project Rename Title Updated

Updated the table to William's suggestions.

* npm run lint -- --fix

* Update src/app/store/scenes/scenes.action.ts

Co-authored-by: William Horn <wbhorn@alaska.edu>

* Update src/app/services/hyp3/hyp3-api.service.ts

Co-authored-by: William Horn <wbhorn@alaska.edu>

* Created three named interfaces at the top of hyp3-api.service.ts

* RenameProgressInfo - Progress info with percent and estimated time remaining
* RenameResult - Final result with success/failed counts and failed project names
*RenameWithProgressResult - The composite return type containing both observables

I also changed a 'sneaky' 3 into a constant

* Update src/app/components/shared/project-name-dialog/project-name-dialog.component.ts

Co-authored-by: William Horn <wbhorn@alaska.edu>

* Tyler Suggestions

Fixed - Red toast regression
Fixed - Missing unnamed projects

* Tyler Suggestions #2

Fixed - Empty string validation feedback
Fixed - Checkbox disclaimer with empty string

* Tyler Suggestions #3

Fixed - Remove dialog service abstraction
Fixed - Convert getter to signal/computed

* Tyler Suggestions #4

Fixed - Use SubSink pattern consistently
Fixed - Moved constructor logic to ngOnInit

* Tyler Suggestions #5

Fixed - Material Table with Sorting in-place

Reviewing the idea of using the Material Stepper consideration, I don't think it is a good fit. The phases are not user-navigated steps, they're system-driven and there is no option for backward navigation.

* npm run lint -- --fix

* Conformity & Best Practices

#2 - Removed stale SCSS styles: Cleaned up .sortable, .sort-indicator, .projects-table-body-container, and custom table styling that was no longer needed after switching to Material table

* Made dialog injects private: Changed dialogRef and data from public to private to match codebase pattern

* Added readonly to displayedColumns: Added readonly modifier since the array never changes

* Fixed track function: Changed track name to track $index to handle potential duplicate project names in the failed list

* Made "(unnamed)" multilingual

* Tweaks

Made the Project Rename table sorted by Project Name by default and eliminated the use of ::ng-deep in the Project Rename scss files.

* Conformity & Best Practices

* Removed stale SCSS styles: Cleaned up .sortable, .sort-indicator, .projects-table-body-container, and custom table styling that was no longer needed after switching to Material table

* Made dialog injects private: Changed dialogRef and data from public to private to match codebase pattern

* Added readonly to displayedColumns: Added readonly modifier since the array never changes

* Fixed track function: Changed track name to track $index to handle potential duplicate project names in the failed list

* Made "(unnamed)" multilingual

* Tweaks

Made the Project Rename table sorted by Project Name by default and eliminated the use of ::ng-deep in the Project Rename scss files.

* npm run lint -- --fix

* Made the table header 'sticky'

* Fixed Table Header for Dark-Theme

* Show estimated time for 5+ jobs

It was 1000+ before but Tools wants to see it always.

* Warn about Abort

I added a @HostListener for the window:beforeunload event that triggers only when the dialog is in the processing phase.

This will:

- Show the browser's native "Leave site?" confirmation dialog when the user tries to close the tab/window or navigate away
- Only trigger during the processing phase - users can freely close during input, complete, or error phases
- Let the browser handle the UI (modern browsers don't allow custom messages for security reasons)

* Add toggle for removing project names in update dialog

* feat(project-name-dialog): replace button toggle with radio buttons

- Replace mat-button-toggle-group with mat-radio-group for cleaner UX
- Input field now visually nested under "Rename" radio option
- Add singular/plural translation keys for radio labels (en, es, de)
- Add accessible aria-label to radio group
- Update styles for radio group layout and disabled state
- Add docs/ to .gitignore

* Update src/assets/i18n/es.json

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update src/app/components/shared/project-name-dialog/project-name-dialog.component.scss

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Bug Fix

A single job rename didn't reflect the count of '1' in the dialog for renaming a job. It now does.

* Project Name Extras

Logic was added to show the Project Name in the right metadata column to jobs without Project names and to give the user the ability to add a name.

Several other lint and code cleanup tasks were done as well.

---------

Co-authored-by: William Horn <wbhorn@alaska.edu>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state

* Yoreley/dec 27 (#2384)

* NEW KEYS - 2026

* Remove "New" tag from Displacement Search type

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state

* Yoreley/dec 27 (#2386)

* NEW KEYS - 2026

* Remove "New" tag from Displacement Search type

* Translate No processing options for KEY

* Hyp3 - keys

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state

* Updated translations from Phrase (#2391)

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state

Co-authored-by: yoreley777 <yvillafanez@unicon-intl.com>

* Yoreley/dec 27 (#2392)

* NEW KEYS - 2026

* Remove "New" tag from Displacement Search type

* Translate No processing options for KEY

* Hyp3 - keys

* HyP3

* Fix CONFIRM_RENAME_MULTIPLE and CONFIRM_REMOVE_SINGLE

* Andy/ds 6227 displacemen story map (#2390)

* feat(services): add DisplacementDisclaimerService for shared dialog access

* feat(map): add OPERA disclaimer logo to map template

* style(map): add OPERA logo positioning and hover effects

* feat(map): wire up OPERA logo click to open disclaimer dialog

* refactor(info-bar): remove displacement disclaimer text link

* refactor(info-bar): remove unused disclaimer dialog code
Remove the onOpenDispDataDisclaimer method and related imports (MatDialog,
DispDataDisclaimerComponent, MatIcon) since the disclaimer functionality
has been moved to the OPERA logo in the map component.

* style: fix prettier formatting in map template

* feat(search-type-selector): add disclaimer link for Displacement search
Add subtle italic "Disclaimer" text below the Search Type selector
that opens the OPERA data disclaimer dialog. Only visible when
Displacement search type is active.

* fix(search-type-selector): adjust disclaimer link size and fix click
- Reduce font-size from 14px to 12px to match header text
- Use grey color to match "Radar Look Direction" styling
- Add pointer-events: auto to ensure click handler works

* fix(search-type-selector): update disclaimer styling and fix click
- Add margin-left: 10px
- Change text to "*Disclaimer" with initial caps
- Add display: inline-block, position: relative, z-index: 10
- Use span instead of anchor tag
- Add stopPropagation to prevent event bubbling

* style(search-type-selector): move disclaimer down 2px

* refactor(search-type-selector): use translation key for disclaimer
Use 'DISCLAIMER' translation key with asterisk outside the translation.

* feat(timeseries-results-menu): add disclaimer link to data credits
Add "Disclaimer" link between "OPERA" and "License" in the data
credits section that triggers the disclaimer modal.

* npm run lint -- --fix

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state

* Updated translations from Phrase

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state

* Updated translations from Phrase (#2396)

phrase: update src/assets/i18n/en.json to latest state
phrase: update src/assets/i18n/es.json to latest state

Co-authored-by: Andrew Anderson <raanderson9@alaska.edu>

* Yoreley/dec 27 (#2397)

* NEW KEYS - 2026

* Remove "New" tag from Displacement Search type

* Translate No processing options for KEY

* Hyp3 - keys

* HyP3

* Fix CONFIRM_RENAME_MULTIPLE and CONFIRM_REMOVE_SINGLE

* Link ARIA S1 GUNW

---------

Co-authored-by: Andrew Anderson <raanderson9@alaska.edu>

* Andy/ds 6227 displacemen story map (#2395)

* feat(services): add DisplacementDisclaimerService for shared dialog access

* feat(map): add OPERA disclaimer logo to map template

* style(map): add OPERA logo positioning and hover effects

* feat(map): wire up OPERA logo click to open disclaimer dialog

* refactor(info-bar): remove displacement disclaimer text link

* refactor(info-bar): remove unused disclaimer dialog code
Remove the onOpenDispDataDisclaimer method and related imports (MatDialog,
DispDataDisclaimerComponent, MatIcon) since the disclaimer functionality
has been moved to the OPERA logo in the map component.

* style: fix prettier formatting in map template

* feat(search-type-selector): add disclaimer link for Displacement search
Add subtle italic "Disclaimer" text below the Search Type selector
that opens the OPERA data disclaimer dialog. Only visible when
Displacement search type is active.

* fix(search-type-selector): adjust disclaimer link size and fix click
- Reduce font-size from 14px to 12px to match header text
- Use grey color to match "Radar Look Direction" styling
- Add pointer-events: auto to ensure click handler works

* fix(search-type-selector): update disclaimer styling and fix click
- Add margin-left: 10px
- Change text to "*Disclaimer" with initial caps
- Add display: inline-block, position: relative, z-index: 10
- Use span instead of anchor tag
- Add stopPropagation to prevent event bubbling

* style(search-type-selector): move disclaimer down 2px

* refactor(search-type-selector): use translation key for disclaimer
Use 'DISCLAIMER' translation key with asterisk outside the translation.

* feat(timeseries-results-menu): add disclaimer link to data credits
Add "Disclaimer" link between "OPERA" and "License" in the data
credits section that triggers the disclaimer modal.

* npm run lint -- --fix

* Added icon/link to StoryMaps for Displacement

* Andy/ds 6227 displacemen story map (#2399)

* feat(services): add DisplacementDisclaimerService for shared dialog access

* feat(map): add OPERA disclaimer logo to map template

* style(map): add OPERA logo positioning and hover effects

* feat(map): wire up OPERA logo click to open disclaimer dialog

* refactor(info-bar): remove displacement disclaimer text link

* refactor(info-bar): remove unused disclaimer dialog code
Remove the onOpenDispDataDisclaimer method and related imports (MatDialog,
DispDataDisclaimerComponent, MatIcon) since the disclaimer functionality
has been moved to the OPERA logo in the map component.

* style: fix prettier formatting in map template

* feat(search-type-selector): add disclaimer link for Displacement search
Add subtle italic "Disclaimer" text below the Search Type selector
that opens the OPERA data disclaimer dialog. Only visible when
Displacement search type is active.

* fix(search-type-selector): adjust disclaimer link size and fix click
- Reduce font-size from 14px to 12px to match header text
- Use grey color to match "Radar Look Direction" styling
- Add pointer-events: auto to ensure click handler works

* fix(search-type-selector): update disclaimer styling and fix click
- Add margin-left: 10px
- Change text to "*Disclaimer" with initial caps
- Add display: inline-block, position: relative, z-index: 10
- Use span instead of anchor tag
- Add stopPropagation to prevent event bubbling

* style(search-type-selector): move disclaimer down 2px

* refactor(search-type-selector): use translation key for disclaimer
Use 'DISCLAIMER' translation key with asterisk outside the translation.

* feat(timeseries-results-menu): add disclaimer link to data credits
Add "Disclaimer" link between "OPERA" and "License" in the data
credits section that triggers the disclaimer modal.

* npm run lint -- --fix

* Added icon/link to StoryMaps for Displacement

* Removed link and tooltip for OPERA logo on map

* npm run lint -- --fix

---------

Co-authored-by: Andrew Anderson <raanderson9@alaska.edu>
Co-authored-by: ASF Discovery Machine User <60239462+ASF-Discovery@users.noreply.github.com>
Co-authored-by: yoreley777 <yvillafanez@unicon-intl.com>
Co-authored-by: SpicyGarlicAlbacoreRoll <ktfairbanks@alaska.edu>
Co-authored-by: Kim <33294735+SpicyGarlicAlbacoreRoll@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: William Horn <wbhorn@alaska.edu>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants