Fixed more linting errors (#9452)

* Fixed more linting errors

* Update the selector of the focus directive to opFocus

* Update the selector and BEM class of the focus-within directive

* More linting fixes

* Remove unused directives, merge focus and autofocus directive, remove now empty a11y module

* Some small fixes

* Fix ReorderDeltaBuilder

* Fix failing specs, linting

* Fix a couple of linting errors

* Reenable linting rules for unsafe any

* Reset broken code, update some html coding style
pull/9485/head
Benjamin Bädorf 3 years ago committed by GitHub
parent 76a6cf3208
commit 87cd178270
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      app/cells/views/projects/table/show.erb
  2. 2
      app/cells/views/table/show.erb
  3. 6
      app/views/attribute_help_texts/_tab.html.erb
  4. 8
      app/views/auth_sources/index.html.erb
  5. 6
      app/views/custom_fields/_custom_options.html.erb
  6. 12
      app/views/custom_fields/_tab.html.erb
  7. 10
      app/views/forums/index.html.erb
  8. 10
      app/views/forums/show.html.erb
  9. 4
      app/views/groups/_memberships.html.erb
  10. 2
      app/views/groups/_users_table.html.erb
  11. 4
      app/views/groups/index.html.erb
  12. 4
      app/views/individual_principals/_memberships.html.erb
  13. 8
      app/views/my/access_token.html.erb
  14. 4
      app/views/project_settings/categories.html.erb
  15. 6
      app/views/projects/form/_custom_fields.html.erb
  16. 10
      app/views/projects/form/_types.html.erb
  17. 12
      app/views/repositories/_dir_list.html.erb
  18. 8
      app/views/repositories/_revisions.html.erb
  19. 4
      app/views/repositories/committers.html.erb
  20. 6
      app/views/roles/index.html.erb
  21. 12
      app/views/roles/report.html.erb
  22. 12
      app/views/types/index.html.erb
  23. 2
      app/views/users/_global_roles.html.erb
  24. 8
      app/views/wiki/history.html.erb
  25. 2
      app/views/work_packages/reports/_report.html.erb
  26. 10
      app/views/workflows/show.html.erb
  27. 16
      frontend/.eslintrc.js
  28. 2
      frontend/package.json
  29. 2
      frontend/src/app/app.module.ts
  30. 4
      frontend/src/app/core/global_search/input/global-search-input.component.ts
  31. 2
      frontend/src/app/features/admin/openproject-admin.module.ts
  32. 2
      frontend/src/app/features/admin/types/group-edit-in-place.html
  33. 4
      frontend/src/app/features/boards/add-list-modal/add-list-modal.component.ts
  34. 4
      frontend/src/app/features/boards/board/add-list-modal/add-list-modal.component.ts
  35. 4
      frontend/src/app/features/boards/boards-sidebar/boards-menu.component.ts
  36. 8
      frontend/src/app/features/boards/index-page/boards-index-page.component.html
  37. 6
      frontend/src/app/features/enterprise/enterprise-modal/enterprise-trial-form/ee-trial-form.component.ts
  38. 6
      frontend/src/app/features/hal/resources/hal-resource.ts
  39. 2
      frontend/src/app/features/hal/resources/project-resource.ts
  40. 2
      frontend/src/app/features/hal/resources/work-package-resource.ts
  41. 23
      frontend/src/app/features/work-packages/components/filters/filter-container/filter-container.directive.html
  42. 2
      frontend/src/app/features/work-packages/components/filters/filter-date-time-value/filter-date-time-value.component.html
  43. 2
      frontend/src/app/features/work-packages/components/filters/filter-date-times-value/filter-date-times-value.component.html
  44. 2
      frontend/src/app/features/work-packages/components/filters/filter-date-value/filter-date-value.component.html
  45. 2
      frontend/src/app/features/work-packages/components/filters/filter-dates-value/filter-dates-value.component.html
  46. 2
      frontend/src/app/features/work-packages/components/filters/filter-integer-value/filter-integer-value.component.html
  47. 4
      frontend/src/app/features/work-packages/components/filters/filter-searchable-multiselect-value/filter-searchable-multiselect-value.component.ts
  48. 2
      frontend/src/app/features/work-packages/components/filters/filter-string-value/filter-string-value.component.html
  49. 4
      frontend/src/app/features/work-packages/components/filters/filter-toggled-multiselect-value/filter-toggled-multiselect-value.component.ts
  50. 6
      frontend/src/app/features/work-packages/components/filters/query-filter/query-filter.component.ts
  51. 4
      frontend/src/app/features/work-packages/components/filters/query-filters/query-filters.component.ts
  52. 2
      frontend/src/app/features/work-packages/components/wp-activity/user/user-activity.component.html
  53. 6
      frontend/src/app/features/work-packages/components/wp-card-view/services/wp-card-drag-and-drop.service.ts
  54. 4
      frontend/src/app/features/work-packages/components/wp-card-view/wp-card-view.component.ts
  55. 3
      frontend/src/app/features/work-packages/components/wp-edit-form/work-package-filter-values.ts
  56. 4
      frontend/src/app/features/work-packages/components/wp-fast-table/handlers/state/drag-and-drop-transformer.ts
  57. 2
      frontend/src/app/features/work-packages/components/wp-inline-create/wp-inline-create.component.html
  58. 2
      frontend/src/app/features/work-packages/components/wp-query-select/wp-query-select-dropdown.component.ts
  59. 13
      frontend/src/app/features/work-packages/components/wp-relations/wp-relation-row/wp-relation-row.template.html
  60. 4
      frontend/src/app/features/work-packages/components/wp-relations/wp-relations-create/wp-relation-create.template.html
  61. 4
      frontend/src/app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-on-overview.component.ts
  62. 4
      frontend/src/app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-tab.component.ts
  63. 4
      frontend/src/app/features/work-packages/components/wp-single-view-tabs/watchers-tab/watchers-tab.component.ts
  64. 2
      frontend/src/app/features/work-packages/components/wp-single-view-tabs/watchers-tab/wp-watcher-entry.html
  65. 4
      frontend/src/app/features/work-packages/components/wp-single-view/wp-single-view.html
  66. 4
      frontend/src/app/features/work-packages/components/wp-table/wp-table.component.ts
  67. 4
      frontend/src/app/features/work-packages/components/wp-table/wp-table.directive.html
  68. 2
      frontend/src/app/features/work-packages/components/wp-tabs/wp-tabs.module.ts
  69. 2
      frontend/src/app/features/work-packages/routing/wp-full-view/wp-full-view.html
  70. 2
      frontend/src/app/features/work-packages/routing/wp-split-view/wp-split-view.html
  71. 2
      frontend/src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service.ts
  72. 7
      frontend/src/app/shared/components/attachments/attachment-list/attachment-list-item.html
  73. 4
      frontend/src/app/shared/components/attachments/attachment-list/attachment-list.component.ts
  74. 2
      frontend/src/app/shared/components/attachments/openproject-attachments.module.ts
  75. 2
      frontend/src/app/shared/components/attribute-help-texts/attribute-help-text.module.ts
  76. 4
      frontend/src/app/shared/components/autocompleter/create-autocompleter/create-autocompleter.component.ts
  77. 6
      frontend/src/app/shared/components/autocompleter/draggable-autocomplete/draggable-autocomplete.component.ts
  78. 17
      frontend/src/app/shared/components/autocompleter/op-autocompleter/op-autocompleter.component.ts
  79. 3
      frontend/src/app/shared/components/dynamic-forms/components/dynamic-form/dynamic-form.component.ts
  80. 6
      frontend/src/app/shared/components/dynamic-forms/components/dynamic-inputs/formattable-textarea-input/components/formattable-control/formattable-control.component.ts
  81. 4
      frontend/src/app/shared/components/editable-toolbar-title/editable-toolbar-title.component.ts
  82. 2
      frontend/src/app/shared/components/editable-toolbar-title/editable-toolbar-title.html
  83. 6
      frontend/src/app/shared/components/editor/components/ckeditor-augmented-textarea/ckeditor-augmented-textarea.component.ts
  84. 14
      frontend/src/app/shared/components/editor/components/ckeditor/ckeditor-setup.service.ts
  85. 6
      frontend/src/app/shared/components/editor/components/ckeditor/ckeditor.types.ts
  86. 10
      frontend/src/app/shared/components/editor/components/ckeditor/op-ckeditor.component.ts
  87. 5
      frontend/src/app/shared/components/fields/edit/field-types/formattable-edit-field/formattable-edit-field.component.ts
  88. 2
      frontend/src/app/shared/components/fields/edit/field-types/text-edit-field.component.html
  89. 2
      frontend/src/app/shared/components/fields/openproject-fields.module.ts
  90. 2
      frontend/src/app/shared/components/grids/widgets/custom-text/custom-text-edit-field.service.ts
  91. 2
      frontend/src/app/shared/components/grids/widgets/time-entries/current-user/configuration-modal/configuration.modal.ts
  92. 8
      frontend/src/app/shared/components/grids/widgets/time-entries/list/time-entries-list.component.html
  93. 4
      frontend/src/app/shared/components/grids/widgets/wp-graph/wp-graph.component.html
  94. 4
      frontend/src/app/shared/components/hide-section/add-section-dropdown/add-section-dropdown.component.ts
  95. 6
      frontend/src/app/shared/components/resizer/resizer.component.ts
  96. 4
      frontend/src/app/shared/components/tabs/scrollable-tabs/scrollable-tabs.component.ts
  97. 2
      frontend/src/app/shared/components/user-link/user-link.component.ts
  98. 2
      frontend/src/app/shared/components/work-package-graphs/configuration-modal/tabs/filters-tab-inner.component.ts
  99. 2
      frontend/src/app/shared/components/work-package-graphs/configuration-modal/tabs/filters-tab.component.html
  100. 2
      frontend/src/app/shared/components/work-package-graphs/configuration-modal/tabs/settings-tab-inner.component.ts
  101. Some files were not shown because too many files have changed in this diff Show More

@ -33,7 +33,7 @@ See docs/COPYRIGHT.rdoc for more details.
<table class="generic-table" <%= table_id ? "id=\"#{table_id}\"" : '' %>>
<colgroup>
<% headers.each do |_name, _options| %>
<col highlight-col>
<col opHighlightCol>
<% end %>
<col>
</colgroup>

@ -32,7 +32,7 @@ See docs/COPYRIGHT.rdoc for more details.
<table class="generic-table">
<colgroup>
<% headers.each do |_name, _options| %>
<col highlight-col>
<col opHighlightCol>
<% end %>
<col>
</colgroup>

@ -4,9 +4,9 @@
<div class="generic-table--results-container">
<table class="generic-table">
<colgroup>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
<col>
</colgroup>
<thead>

@ -45,10 +45,10 @@ See docs/COPYRIGHT.rdoc for more details.
<div class="generic-table--results-container">
<table class="generic-table">
<colgroup>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
<col>
</colgroup>
<thead>

@ -34,9 +34,9 @@ See docs/COPYRIGHT.rdoc for more details.
<div class="generic-table--results-container">
<table class="generic-table" id="custom-options-table">
<colgroup>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
<col>
</colgroup>
<thead>

@ -39,14 +39,14 @@ See docs/COPYRIGHT.rdoc for more details.
<% end %>
<table class="generic-table">
<colgroup>
<col highlight-col>
<col highlight-col>
<col opHighlightCol>
<col opHighlightCol>
<% if tab[:name] == 'WorkPackageCustomField' %>
<col highlight-col>
<col highlight-col>
<col opHighlightCol>
<col opHighlightCol>
<% end %>
<col highlight-col>
<col highlight-col>
<col opHighlightCol>
<col opHighlightCol>
<col>
</colgroup>
<thead>

@ -48,12 +48,12 @@ See docs/COPYRIGHT.rdoc for more details.
<div class="generic-table--results-container">
<table class="generic-table boards">
<colgroup>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
<% if User.current.allowed_to?(:manage_forums, @project) %>
<col highlight-col>
<col opHighlightCol>
<col>
<% end %>
</colgroup>

@ -71,11 +71,11 @@ See docs/COPYRIGHT.rdoc for more details.
<div class="generic-table--results-container">
<table class="generic-table">
<colgroup>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
</colgroup>
<thead>
<tr>

@ -36,8 +36,8 @@ See docs/COPYRIGHT.rdoc for more details.
<div class="generic-table--results-container">
<table class="generic-table memberships">
<colgroup>
<col highlight-col>
<col highlight-col>
<col opHighlightCol>
<col opHighlightCol>
<col>
</colgroup>
<thead>

@ -29,7 +29,7 @@ See docs/COPYRIGHT.rdoc for more details.
<table class="generic-table users">
<colgroup>
<col highlight-col>
<col opHighlightCol>
<col>
</colgroup>
<thead>

@ -44,8 +44,8 @@ See docs/COPYRIGHT.rdoc for more details.
<div class="generic-table--results-container">
<table class="generic-table">
<colgroup>
<col highlight-col>
<col highlight-col>
<col opHighlightCol>
<col opHighlightCol>
<col>
</colgroup>
<thead>

@ -40,8 +40,8 @@ See docs/COPYRIGHT.rdoc for more details.
<div class="generic-table--results-container">
<table class="generic-table memberships">
<colgroup>
<col highlight-col>
<col highlight-col>
<col opHighlightCol>
<col opHighlightCol>
<%= call_individual_principals_memberships_hook(@individual_principal, 'colgroup') %>
<col>
</colgroup>

@ -39,10 +39,10 @@ See docs/COPYRIGHT.rdoc for more details.
<div class="generic-table--results-container" style="max-height: 340px;">
<table id="access-token-table" class="generic-table">
<colgroup>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
</colgroup>
<thead>
<tr>

@ -46,8 +46,8 @@ See docs/COPYRIGHT.rdoc for more details.
<div class="generic-table--results-container">
<table class="generic-table">
<colgroup>
<col highlight-col>
<col highlight-col>
<col opHighlightCol>
<col opHighlightCol>
<col>
</colgroup>
<thead>

@ -31,9 +31,9 @@ See docs/COPYRIGHT.rdoc for more details.
<div class="generic-table--results-container">
<table class="generic-table">
<colgroup>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
</colgroup>
<thead>
<tr>

@ -31,11 +31,11 @@ See docs/COPYRIGHT.rdoc for more details.
<div class="generic-table--results-container">
<table class="generic-table types">
<colgroup>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
</colgroup>
<thead>
<tr>

@ -30,13 +30,13 @@ See docs/COPYRIGHT.rdoc for more details.
<div class="generic-table--results-container">
<table class="generic-table" id="browser">
<colgroup>
<col highlight-col>
<col opHighlightCol>
<col>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
</colgroup>
<thead>
<tr id="root">

@ -32,12 +32,12 @@ See docs/COPYRIGHT.rdoc for more details.
<div class="generic-table--results-container">
<table class="generic-table changesets">
<colgroup>
<col highlight-col>
<col opHighlightCol>
<col>
<col>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
</colgroup>
<caption class="hidden-for-sighted">
<span>

@ -36,8 +36,8 @@ See docs/COPYRIGHT.rdoc for more details.
<div class="generic-table--results-container">
<table class="generic-table">
<colgroup>
<col highlight-col>
<col highlight-col>
<col opHighlightCol>
<col opHighlightCol>
</colgroup>
<thead>
<tr>

@ -43,9 +43,9 @@ See docs/COPYRIGHT.rdoc for more details.
<div class="generic-table--results-container">
<table class="generic-table">
<colgroup>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
<col>
</colgroup>
<thead>

@ -54,12 +54,12 @@ See docs/COPYRIGHT.rdoc for more details.
<div class="generic-table--results-container">
<table class="generic-table">
<colgroup>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
</colgroup>
<thead>
<tr>

@ -47,13 +47,13 @@ See docs/COPYRIGHT.rdoc for more details.
<div class="generic-table--results-container">
<table class="generic-table">
<colgroup>
<col highlight-col>
<col opHighlightCol>
<col>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
<col>
</colgroup>
<thead>

@ -40,7 +40,7 @@ See docs/COPYRIGHT.rdoc for more details.
<div class="generic-table--results-container">
<table class="generic-table principal_roles" id="table_principal_roles">
<colgroup>
<col highlight-col>
<col opHighlightCol>
<col>
</colgroup>
<thead>

@ -35,12 +35,12 @@ See docs/COPYRIGHT.rdoc for more details.
<div class="generic-table--results-container">
<table class="generic-table wiki-page-versions">
<colgroup>
<col highlight-col>
<col opHighlightCol>
<col>
<col>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
<col>
</colgroup>
<caption class="hidden-for-sighted">

@ -39,7 +39,7 @@ See docs/COPYRIGHT.rdoc for more details.
<table class="generic-table">
<colgroup>
<% column_names.each do |name| %>
<col highlight-col>
<col opHighlightCol>
<% end %>
</colgroup>
<thead>

@ -37,11 +37,11 @@ See docs/COPYRIGHT.rdoc for more details.
<table class="generic-table">
<colgroup>
<col>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
<col>
</colgroup>
<thead>

@ -67,6 +67,13 @@ module.exports = {
// Disable webpack loader definitions
"import/no-webpack-loader-syntax": "off",
// It'd be good if we could error this for switch cases but allow it for for loops
"no-continue": "off",
// No void at all collides with `@typescript-eslint/no-floating-promises` which wants us to handle each promise.
// Until we do that, `void` is a good way to explicitly mark unhandled promises.
"no-void": ["error", { allowAsStatement: true }],
/*
// Disable use before define, as irrelevant for TS interfaces
"no-use-before-define": "off",
@ -104,15 +111,6 @@ module.exports = {
// It's common in Angular to wrap even pure functions in classes for injection purposes
// TODO: Should probably be turned off and pure unit tests should be used at some point
"class-methods-use-this": "warn",
// There's too much interop with legacy code that is `any`-typed for this to be an error in any practical sense
// TODO: Actually type everything
"@typescript-eslint/no-unsafe-member-access": "warn",
"@typescript-eslint/no-unsafe-assignment": "warn",
"@typescript-eslint/no-unsafe-call": "warn",
// This is probably the first rule that should be fixed. It had 309 errors last time we checked
"@typescript-eslint/no-unsafe-return": "warn",
}
},
{

@ -138,7 +138,7 @@
"pretest": "./scripts/link_plugin_placeholder.js",
"test": "ng test --watch=false",
"test:watch": "ng test --watch=true",
"lint": "eslint -c .eslintrc.js --ext .ts src/app/",
"lint": "esprint check",
"lint:fix": "esprint check --fix",
"generate-typings": "tsc -d -p src/tsconfig.app.json"
}

@ -51,7 +51,7 @@ import { PreviewTriggerService } from 'core-app/core/setup/globals/global-listen
import { OpenprojectOverviewModule } from 'core-app/features/overview/openproject-overview.module';
import { OpenprojectMyPageModule } from 'core-app/features/my-page/openproject-my-page.module';
import { OpenprojectProjectsModule } from 'core-app/features/projects/openproject-projects.module';
import { KeyboardShortcutService } from 'core-app/shared/directives/a11y/keyboard-shortcut-service';
import { KeyboardShortcutService } from 'core-app/shared/directives/a11y/keyboard-shortcut.service';
import { OpenprojectMembersModule } from 'core-app/shared/components/autocompleter/members-autocompleter/members.module';
import { OpenprojectAugmentingModule } from 'core-app/core/augmenting/openproject-augmenting.module';
import { OpenprojectInviteUserModalModule } from 'core-app/features/invite-user-modal/invite-user-modal.module';

@ -44,7 +44,7 @@ import { GlobalSearchService } from 'core-app/core/global_search/services/global
import { isClickedWithModifier } from 'core-app/shared/helpers/link-handling/link-handling';
import { Highlighting } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting.functions';
import { DeviceService } from 'core-app/core/browser/device.service';
import { ContainHelpers } from 'core-app/shared/directives/focus/contain-helpers';
import { insideOrSelf } from 'core-app/shared/directives/focus/contain-helpers';
import { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';
import { I18nService } from 'core-app/core/i18n/i18n.service';
import { CurrentProjectService } from 'core-app/core/current-project/current-project.service';
@ -156,7 +156,7 @@ export class GlobalSearchInputComponent implements AfterViewInit, OnDestroy {
event.preventDefault();
// handle click on search button
if (ContainHelpers.insideOrSelf(this.btn.nativeElement, event.target)) {
if (insideOrSelf(this.btn.nativeElement, event.target)) {
if (this.deviceService.isMobile) {
this.toggleMobileSearch();
// open ng-select menu on default

@ -33,14 +33,12 @@ import { TypeFormAttributeGroupComponent } from 'core-app/features/admin/types/a
import { TypeFormConfigurationComponent } from 'core-app/features/admin/types/type-form-configuration.component';
import { TypeFormQueryGroupComponent } from 'core-app/features/admin/types/query-group.component';
import { GroupEditInPlaceComponent } from 'core-app/features/admin/types/group-edit-in-place.component';
import { OpenprojectAccessibilityModule } from 'core-app/shared/directives/a11y/openproject-a11y.module';
import { EditableQueryPropsComponent } from 'core-app/features/admin/editable-query-props/editable-query-props.component';
@NgModule({
imports: [
DragulaModule.forRoot(),
OPSharedModule,
OpenprojectAccessibilityModule,
],
providers: [
],

@ -8,7 +8,7 @@
*ngIf="editing"
class="group-edit-in-place--input"
type="text"
autoFocus
opAutofocus
[(ngModel)]="editedName"
[attr.placeholder]="placeholder"
(blur)="saveEdition($event)"

@ -41,7 +41,7 @@ import { BoardService } from 'core-app/features/boards/board/board.service';
import { I18nService } from 'core-app/core/i18n/i18n.service';
import { BoardActionsRegistryService } from 'core-app/features/boards/board/board-actions/board-actions-registry.service';
import { BoardActionService } from 'core-app/features/boards/board/board-actions/board-action.service';
import { AngularTrackingHelpers } from 'core-app/shared/helpers/angular/tracking-functions';
import { trackByHref } from 'core-app/shared/helpers/angular/tracking-functions';
import { CreateAutocompleterComponent } from 'core-app/shared/components/autocompleter/create-autocompleter/create-autocompleter.component';
import { ValueOption } from 'core-app/shared/components/fields/edit/field-types/select-edit-field/select-edit-field.component';
import { OpModalLocalsToken } from 'core-app/shared/components/modal/modal.service';
@ -78,7 +78,7 @@ export class AddListModalComponent extends OpModalComponent implements OnInit {
/** avoid double click */
public inFlight = false;
public trackByHref = AngularTrackingHelpers.trackByHref;
public trackByHref = trackByHref;
/* Do not close on outside click (because the select option are appended to the body */
public closeOnOutsideClick = false;

@ -38,7 +38,7 @@ import { StateService } from '@uirouter/core';
import { BoardService } from 'core-app/features/boards/board/board.service';
import { BoardActionsRegistryService } from 'core-app/features/boards/board/board-actions/board-actions-registry.service';
import { BoardActionService } from 'core-app/features/boards/board/board-actions/board-action.service';
import { AngularTrackingHelpers } from 'core-app/shared/helpers/angular/tracking-functions';
import { trackByHref } from 'core-app/shared/helpers/angular/tracking-functions';
import { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';
import { tap } from 'rxjs/operators';
import { APIV3Service } from 'core-app/core/apiv3/api-v3.service';
@ -84,7 +84,7 @@ export class AddListModalComponent extends OpModalComponent implements OnInit {
/** avoid double click */
public inFlight = false;
public trackByHref = AngularTrackingHelpers.trackByHref;
public trackByHref = trackByHref;
/* Do not close on outside click (because the select option are appended to the body */
public closeOnOutsideClick = false;

@ -2,7 +2,7 @@ import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs';
import { BoardService } from 'core-app/features/boards/board/board.service';
import { Board } from 'core-app/features/boards/board/board';
import { AngularTrackingHelpers } from 'core-app/shared/helpers/angular/tracking-functions';
import { compareByAttribute } from 'core-app/shared/helpers/angular/tracking-functions';
import { map } from 'rxjs/operators';
import { CurrentProjectService } from 'core-app/core/current-project/current-project.service';
import { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';
@ -17,7 +17,7 @@ export const boardsMenuSelector = 'boards-menu';
})
export class BoardsMenuComponent extends UntilDestroyedMixin implements OnInit {
trackById = AngularTrackingHelpers.compareByAttribute('id');
trackById = compareByAttribute('id');
currentProjectIdentifier = this.currentProject.identifier;

@ -27,10 +27,10 @@
<div class="generic-table--results-container">
<table class="generic-table">
<colgroup>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
<col>
</colgroup>
<thead>

@ -31,7 +31,7 @@ import { FormBuilder, Validators } from '@angular/forms';
import { I18nService } from 'core-app/core/i18n/i18n.service';
import { EnterpriseTrialData, EnterpriseTrialService } from 'core-app/features/enterprise/enterprise-trial.service';
import { CurrentUserService } from 'core-app/core/current-user/current-user.service';
import { I18nHelpers } from 'core-app/shared/helpers/i18n/localized-link';
import { localizeLink } from 'core-app/shared/helpers/i18n/localized-link';
const newsletterURL = 'https://www.openproject.com/newsletter/';
@ -57,11 +57,11 @@ export class EETrialFormComponent {
public text = {
general_consent: this.I18n.t('js.admin.enterprise.trial.form.general_consent', {
link_terms: I18nHelpers.localizeLink({
link_terms: localizeLink({
en: 'https://www.openproject.com/terms-of-service/',
de: 'https://www.openproject.org/de/nutzungsbedingungen/',
}),
link_privacy: I18nHelpers.localizeLink({
link_privacy: localizeLink({
en: 'https://www.openproject.org/data-privacy-and-security/',
de: 'https://www.openproject.org/de/datenschutz/',
}),

@ -30,9 +30,9 @@ import { InputState } from 'reactivestates';
import { Injector } from '@angular/core';
import { States } from 'core-app/core/states/states.service';
import { I18nService } from 'core-app/core/i18n/i18n.service';
import { InjectField } from "core-app/shared/helpers/angular/inject-field.decorator";
import { HalLinkInterface } from "core-app/features/hal/hal-link/hal-link";
import { ICKEditorContext } from "core-app/shared/components/editor/components/ckeditor/ckeditor.types";
import { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';
import { HalLinkInterface } from 'core-app/features/hal/hal-link/hal-link';
import { ICKEditorContext } from 'core-app/shared/components/editor/components/ckeditor/ckeditor.types';
export interface HalResourceClass<T extends HalResource = HalResource> {
new(injector:Injector,

@ -27,7 +27,7 @@
//++
import { HalResource } from 'core-app/features/hal/resources/hal-resource';
import { ICKEditorContext } from "core-app/shared/components/editor/components/ckeditor/ckeditor.types";
import { ICKEditorContext } from 'core-app/shared/components/editor/components/ckeditor/ckeditor.types';
export class ProjectResource extends HalResource {
public get state() {

@ -43,7 +43,7 @@ import { TypeResource } from 'core-app/features/hal/resources/type-resource';
import { RelationResource } from 'core-app/features/hal/resources/relation-resource';
import { FormResource } from 'core-app/features/hal/resources/form-resource';
import { Attachable } from 'core-app/features/hal/resources/mixins/attachable-mixin';
import { ICKEditorContext } from "core-app/shared/components/editor/components/ckeditor/ckeditor.types";
import { ICKEditorContext } from 'core-app/shared/components/editor/components/ckeditor/ckeditor.types';
export interface WorkPackageResourceEmbedded {
activities:CollectionResource;

@ -1,17 +1,26 @@
<button class="button -small advanced-filters--toggle"
<button
class="button -small advanced-filters--toggle"
(click)="wpFiltersService.toggleVisibility()"
[class.-active]="visible$ | async"
*ngIf="showFilterButton">
*ngIf="showFilterButton"
>
<i class="button--icon icon-filter"></i>
<span class="button--text" [textContent]="filterButtonText"></span>
</button>
<div class="work-packages--filters-optional-container"
[ngClass]="{ '-loaded': loaded }">
<div id="query_form_content" class="hide-when-print" *ngIf="visible$ | async">
<query-filters *ngIf="!!filters"
<div
class="work-packages--filters-optional-container"
[ngClass]="{ '-loaded': loaded }"
>
<div
id="query_form_content"
class="hide-when-print" *ngIf="visible$ | async"
>
<query-filters
*ngIf="!!filters"
[filters]="filters"
[showCloseFilter]="true"
(filtersChanged)="replaceIfComplete($event)"></query-filters>
(filtersChanged)="replaceIfComplete($event)"
></query-filters>
</div>
</div>

@ -1,7 +1,7 @@
<div class="inline-label" id="div-values-{{filter.id}}">
<op-date-picker (onChange)="value = isoDateParser($event)"
[initialDate]="isoDateFormatter(value)"
[focus]="shouldFocus"
[opAutofocus]="shouldFocus"
required="true"
[id]="'values-' + filter.id"
[name]="'v[' + filter.id + ']'"

@ -1,7 +1,7 @@
<div id="div-values-{{filter.id}}" class="inline-label">
<op-date-picker (onChange)="begin = isoDateParser($event)"
[initialDate]="isoDateFormatter(begin)"
[focus]="shouldFocus"
[opAutofocus]="shouldFocus"
required="true"
[id]="'values-' + filter.id + '-begin'"
[name]="'v[' + filter.id + ']-begin'"

@ -1,7 +1,7 @@
<div id="div-values-{{filter.id}}">
<op-date-picker (onChange)="value = parser($event)"
[initialDate]="formatter(value)"
[focus]="shouldFocus"
[opAutofocus]="shouldFocus"
required="true"
[id]="'values-' + filter.id"
[name]="'v[' + filter.id + ']'"

@ -2,7 +2,7 @@
class="inline-label">
<op-date-picker (onChange)="begin = parser($event)"
[initialDate]="formatter(begin)"
[focus]="shouldFocus"
[opAutofocus]="shouldFocus"
required="true"
[id]="'values-' + filter.id + '-begin'"
[name]="'v[' + filter.id + ']-begin'"

@ -1,6 +1,6 @@
<div id="div-values-{{filter.id}}" class="inline-label">
<input [(ngModel)]="value"
[focus]="shouldFocus"
[opAutofocus]="shouldFocus"
required
class="advanced-filters--number-field"
id="values-{{filter.id}}"

@ -17,7 +17,7 @@ import {
ChangeDetectorRef,
Component, EventEmitter, Input, NgZone, OnInit, Output, ViewChild,
} from '@angular/core';
import { AngularTrackingHelpers } from 'core-app/shared/helpers/angular/tracking-functions';
import { compareByHrefOrString } from 'core-app/shared/helpers/angular/tracking-functions';
import { HalResource } from 'core-app/features/hal/resources/hal-resource';
import { I18nService } from 'core-app/core/i18n/i18n.service';
@ -37,7 +37,7 @@ export class FilterSearchableMultiselectValueComponent extends UntilDestroyedMix
public _availableOptions:HalResource[] = [];
public compareByHrefOrString = AngularTrackingHelpers.compareByHrefOrString;
public compareByHrefOrString = compareByHrefOrString;
public active:Set<string>;

@ -1,6 +1,6 @@
<div id="div-values-{{filter.name}}">
<input [(ngModel)]="value"
[focus]="shouldFocus"
[opAutofocus]="shouldFocus"
requried="true"
class="advanced-filters--text-field"
id="values-{{filter.name}}"

@ -40,7 +40,7 @@ import {
ViewChild,
} from '@angular/core';
import { I18nService } from 'core-app/core/i18n/i18n.service';
import { AngularTrackingHelpers } from 'core-app/shared/helpers/angular/tracking-functions';
import { compareByHrefOrString } from 'core-app/shared/helpers/angular/tracking-functions';
import { HalResourceSortingService } from 'core-app/features/hal/services/hal-resource-sorting.service';
import { PathHelperService } from 'core-app/core/path-helper/path-helper.service';
import { NgSelectComponent } from '@ng-select/ng-select';
@ -67,7 +67,7 @@ export class FilterToggledMultiselectValueComponent implements OnInit, AfterView
public _availableOptions:HalResource[] = [];
public compareByHrefOrString = AngularTrackingHelpers.compareByHrefOrString;
public compareByHrefOrString = compareByHrefOrString;
private _isEmpty:boolean;

@ -30,7 +30,7 @@ import {
Component, EventEmitter, Input, OnInit, Output,
} from '@angular/core';
import { I18nService } from 'core-app/core/i18n/i18n.service';
import { AngularTrackingHelpers } from 'core-app/shared/helpers/angular/tracking-functions';
import { halHref, compareByHref } from 'core-app/shared/helpers/angular/tracking-functions';
import { BannersService } from 'core-app/core/enterprise/banners.service';
import { WorkPackageViewFiltersService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service';
import { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';
@ -57,9 +57,9 @@ export class QueryFilterComponent implements OnInit {
public eeShowBanners = false;
public trackByHref = AngularTrackingHelpers.halHref;
public trackByHref = halHref;
public compareByHref = AngularTrackingHelpers.compareByHref;
public compareByHref = compareByHref;
public text = {
open_filter: this.I18n.t('js.filter.description.text_open_filter'),

@ -31,7 +31,7 @@ import {
} from '@angular/core';
import { I18nService } from 'core-app/core/i18n/i18n.service';
import { DebouncedEventEmitter } from 'core-app/shared/helpers/rxjs/debounced-event-emitter';
import { AngularTrackingHelpers } from 'core-app/shared/helpers/angular/tracking-functions';
import { trackByName } from 'core-app/shared/helpers/angular/tracking-functions';
import { BannersService } from 'core-app/core/enterprise/banners.service';
import { NgSelectComponent } from '@ng-select/ng-select';
import { WorkPackageViewFiltersService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service';
@ -63,7 +63,7 @@ export class QueryFiltersComponent extends UntilDestroyedMixin implements OnInit
public focusElementIndex = 0;
public trackByName = AngularTrackingHelpers.trackByName;
public trackByName = trackByName;
public text = {
open_filter: this.I18n.t('js.filter.description.text_open_filter'),

@ -12,7 +12,7 @@
></op-principal>
<div>
<user-link class="op-user-activity--user-name" [user]="user"></user-link>
<op-user-link class="op-user-activity--user-name" [user]="user"></op-user-link>
<span class="op-user-activity--date">
{{ isInitial ? text.label_created_on : text.label_updated_on }}
<op-date-time [dateTimeValue]="activity.createdAt"></op-date-time>

@ -5,7 +5,7 @@ import { States } from 'core-app/core/states/states.service';
import { WorkPackageCreateService } from 'core-app/features/work-packages/components/wp-new/wp-create.service';
import { WorkPackageInlineCreateService } from 'core-app/features/work-packages/components/wp-inline-create/wp-inline-create.service';
import { DragAndDropService } from 'core-app/shared/helpers/drag-and-drop/drag-and-drop.service';
import { DragAndDropHelpers } from 'core-app/shared/helpers/drag-and-drop/drag-and-drop.helpers';
import { findIndex } from 'core-app/shared/helpers/drag-and-drop/drag-and-drop.helpers';
import { WorkPackageCardViewComponent } from 'core-app/features/work-packages/components/wp-card-view/wp-card-view.component';
import { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';
import { APIV3Service } from 'core-app/core/apiv3/api-v3.service';
@ -63,7 +63,7 @@ export class WorkPackageCardDragAndDropService {
accepts: () => this.cardView.dragInto,
onMoved: async (card:HTMLElement) => {
const wpId:string = card.dataset.workPackageId!;
const toIndex = DragAndDropHelpers.findIndex(card);
const toIndex = findIndex(card);
const newOrder = await this.reorderService.move(this.currentOrder, wpId, toIndex);
this.updateOrder(newOrder);
@ -78,7 +78,7 @@ export class WorkPackageCardDragAndDropService {
},
onAdded: async (card:HTMLElement) => {
const wpId:string = card.dataset.workPackageId!;
const toIndex = DragAndDropHelpers.findIndex(card);
const toIndex = findIndex(card);
const workPackage = await this
.apiV3Service

@ -15,7 +15,7 @@ import { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/q
import { I18nService } from 'core-app/core/i18n/i18n.service';
import { WorkPackageInlineCreateService } from 'core-app/features/work-packages/components/wp-inline-create/wp-inline-create.service';
import { WorkPackageCreateService } from 'core-app/features/work-packages/components/wp-new/wp-create.service';
import { AngularTrackingHelpers } from 'core-app/shared/helpers/angular/tracking-functions';
import { trackByHrefAndProperty } from 'core-app/shared/helpers/angular/tracking-functions';
import { CardHighlightingMode } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting-mode.const';
import { AuthorisationService } from 'core-app/core/model-auth/model-auth.service';
import { StateService } from '@uirouter/core';
@ -84,7 +84,7 @@ export class WorkPackageCardViewComponent extends UntilDestroyedMixin implements
@Output() stateLinkClicked = new EventEmitter<{ workPackageId:string, requestedState:string }>();
public trackByHref = AngularTrackingHelpers.trackByHrefAndProperty('lockVersion');
public trackByHref = trackByHrefAndProperty('lockVersion');
public query:QueryResource;

@ -2,12 +2,11 @@ import { HalResource } from 'core-app/features/hal/resources/hal-resource';
import { CurrentUserService } from 'core-app/core/current-user/current-user.service';
import { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';
import { Injector } from '@angular/core';
import { AngularTrackingHelpers } from 'core-app/shared/helpers/angular/tracking-functions';
import { compareByHrefOrString } from 'core-app/shared/helpers/angular/tracking-functions';
import { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';
import { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';
import { FilterOperator } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';
import { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';
import compareByHrefOrString = AngularTrackingHelpers.compareByHrefOrString;
export class WorkPackageFilterValues {
@InjectField() currentUser:CurrentUserService;

@ -9,7 +9,7 @@ import { TableDragActionService } from 'core-app/features/work-packages/componen
import { States } from 'core-app/core/states/states.service';
import { tableRowClassName } from 'core-app/features/work-packages/components/wp-fast-table/builders/rows/single-row-builder';
import { DragAndDropService } from 'core-app/shared/helpers/drag-and-drop/drag-and-drop.service';
import { DragAndDropHelpers } from 'core-app/shared/helpers/drag-and-drop/drag-and-drop.helpers';
import { reinsert } from 'core-app/shared/helpers/drag-and-drop/drag-and-drop.helpers';
import { WorkPackageViewOrderService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-order.service';
import { BrowserDetector } from 'core-app/core/browser/browser-detector.service';
import { WorkPackagesListService } from 'core-app/features/work-packages/components/wp-list/wp-list.service';
@ -110,7 +110,7 @@ export class DragAndDropTransformer {
// Restore original element's styles
this.actionService.changeShadowElement(el, true);
// Restore element in from container
DragAndDropHelpers.reinsert(el, el.dataset.sourceIndex || -1, source);
reinsert(el, el.dataset.sourceIndex || -1, source);
}
},
onRemoved: (el:HTMLElement) => {

@ -9,7 +9,7 @@
type="button"
class="wp-inline-create--add-link"
[class.wp-inline-create--split-link]="hasReferenceClass"
[focus]="focus"
[opAutofocus]="focus"
(click)="handleAddRowClick()"
[attr.aria-label]="text.create"
aria-haspopup="true"

@ -301,7 +301,7 @@ export class WorkPackageQuerySelectDropdownComponent extends UntilDestroyedMixin
'ui-autocomplete': 'collapsible-menu--search-ul -inplace',
'ui-menu-divider': 'collapsible-menu--category-icon',
},
autoFocus: false, // Don't automatically select first entry since we 'open' the autocomplete on page load
opAutofocus: false, // Don't automatically select first entry since we 'open' the autocomplete on page load
minLength: 0,
});
}

@ -1,15 +1,16 @@
<div *ngIf="workPackage && relatedWorkPackage"
<div
*ngIf="workPackage && relatedWorkPackage"
class="relation-row relation-row-{{ relatedWorkPackage.id }}"
focus-within="'.wp-relations-controls-section button'">
opFocusWithin=".wp-relations-controls-section button"
>
<div class="grid-block hierarchy-item">
<div class="grid-content medium-2 collapse">
<button
type="button"
class="relation-row--type"
(click)="activateRelationTypeEdit()"
*ngIf="!userInputs.showRelationTypesForm">
*ngIf="!userInputs.showRelationTypesForm"
>
<span *ngIf="groupByWorkPackageType"
[textContent]="normalizedRelationType"></span>
<span *ngIf="!groupByWorkPackageType"
@ -22,7 +23,7 @@
[(ngModel)]="selectedRelationType"
(change)="saveRelationType()"
role="listbox"
focus
opAutofocus
(keydown.escape)="cancelRelationTypeEditOnEscape($event)">
<option *ngFor="let relationType of availableRelationTypes"
[textContent]="relationType.label"

@ -6,7 +6,7 @@
<button
type="button"
class="op-link wp-inline-create--add-link relation-create"
autoFocus
opAutofocus
(click)="toggleRelationsCreateForm()"
id="relation--add-relation"
>
@ -28,7 +28,7 @@
id="relation-type--select"
role="listbox"
[(ngModel)]="selectedRelationType"
focus>
opAutoFocus>
<option *ngFor="let type of relationTypes"
[textContent]="type.label"
[value]="type.name"></option>

@ -31,7 +31,7 @@ import { ActivityPanelBaseController } from 'core-app/features/work-packages/com
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
import { HalResource } from 'core-app/features/hal/resources/hal-resource';
import { ActivityEntryInfo } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-entry-info';
import { AngularTrackingHelpers } from 'core-app/shared/helpers/angular/tracking-functions';
import { trackByProperty } from 'core-app/shared/helpers/angular/tracking-functions';
@Component({
selector: 'newest-activity-on-overview',
@ -43,7 +43,7 @@ export class NewestActivityOnOverviewComponent extends ActivityPanelBaseControll
public latestActivityInfo:ActivityEntryInfo[] = [];
public trackByHref = AngularTrackingHelpers.trackByProperty('identifier');
public trackByHref = trackByProperty('identifier');
ngOnInit() {
this.workPackageId = this.workPackage.id!;

@ -28,7 +28,7 @@
import { Component } from '@angular/core';
import { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';
import { AngularTrackingHelpers } from 'core-app/shared/helpers/angular/tracking-functions';
import { trackByHrefAndProperty } from 'core-app/shared/helpers/angular/tracking-functions';
import { ActivityPanelBaseController } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-base.controller';
@Component({
@ -40,7 +40,7 @@ export class WorkPackageActivityTabComponent extends ActivityPanelBaseController
public tabName = this.I18n.t('js.work_packages.tabs.activity');
public trackByHref = AngularTrackingHelpers.trackByHrefAndProperty('version');
public trackByHref = trackByHrefAndProperty('version');
ngOnInit() {
this.workPackageId = this.$transition.params('to').workPackageId;

@ -36,7 +36,7 @@ import { LoadingIndicatorService } from 'core-app/core/loading-indicator/loading
import { I18nService } from 'core-app/core/i18n/i18n.service';
import { WorkPackageWatchersService } from 'core-app/features/work-packages/components/wp-single-view-tabs/watchers-tab/wp-watchers.service';
import { PathHelperService } from 'core-app/core/path-helper/path-helper.service';
import { AngularTrackingHelpers } from 'core-app/shared/helpers/angular/tracking-functions';
import { trackByHref } from 'core-app/shared/helpers/angular/tracking-functions';
import { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';
import { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';
import { APIV3Service } from 'core-app/core/apiv3/api-v3.service';
@ -51,7 +51,7 @@ export class WorkPackageWatchersTabComponent extends UntilDestroyedMixin impleme
public workPackage:WorkPackageResource;
public trackByHref = AngularTrackingHelpers.trackByHref;
public trackByHref = trackByHref;
public error = false;

@ -1,4 +1,4 @@
<div class="form--selected-value--container" focus-within="button">
<div class="form--selected-value--container" opFocusWithin="button">
<span class="form--selected-value">
<span [ngClass]="{'deleting': deleting }">
<a [attr.href]="watcher.showUser.href">

@ -23,8 +23,8 @@
<!-- The space has to be in an extra span
because otherwise the browser would add a second space after it -->
<span>&nbsp;</span>
<user-link class="user-link"
[user]="workPackage.author"></user-link>.
<op-user-link class="user-link"
[user]="workPackage.author"></op-user-link>.
<span [textContent]="text.infoRow.lastUpdatedOn"></span>
<span>&nbsp;</span>
<op-date-time [dateTimeValue]="workPackage.updatedAt"></op-date-time>.

@ -44,7 +44,7 @@ import { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/q
import { combineLatest } from 'rxjs';
import { QueryColumn } from 'core-app/features/work-packages/components/wp-query/query-column';
import { WorkPackageViewSortByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sort-by.service';
import { AngularTrackingHelpers } from 'core-app/shared/helpers/angular/tracking-functions';
import { trackByHref } from 'core-app/shared/helpers/angular/tracking-functions';
import { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';
import { WorkPackageViewGroupByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-group-by.service';
import { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';
@ -87,7 +87,7 @@ export class WorkPackagesTableComponent extends UntilDestroyedMixin implements O
@Output() stateLinkClicked = new EventEmitter<{ workPackageId:string, requestedState:string }>();
public trackByHref = AngularTrackingHelpers.trackByHref;
public trackByHref = trackByHref;
public configuration:WorkPackageTableConfiguration;

@ -4,8 +4,8 @@
<colgroup>
<col *ngIf="configuration.dragAndDropEnabled">
<!-- Generate col elements dynamically(!) for each requested column plus one for the action menu's column. -->
<col highlight-col *ngFor="let column of [].constructor(columns.length)">
<col highlight-col *ngIf="configuration.columnMenuEnabled">
<col opHighlightCol *ngFor="let column of [].constructor(columns.length)">
<col opHighlightCol *ngIf="configuration.columnMenuEnabled">
<col *ngIf="!configuration.columnMenuEnabled">
</colgroup>
<caption class="hidden-for-sighted">

@ -3,7 +3,6 @@ import { CommonModule } from '@angular/common';
import { UIRouterModule } from '@uirouter/angular';
import { WpTabWrapperComponent } from 'core-app/features/work-packages/components/wp-tabs/components/wp-tab-wrapper/wp-tab-wrapper.component';
import { DynamicModule } from 'ng-dynamic-component';
import { OpenprojectAccessibilityModule } from 'core-app/shared/directives/a11y/openproject-a11y.module';
import { OpenprojectTabsModule } from 'core-app/shared/components/tabs/openproject-tabs.module';
import { IconModule } from 'core-app/shared/components/icon/icon.module';
import { WpTabsComponent } from './components/wp-tabs/wp-tabs.component';
@ -17,7 +16,6 @@ import { WpTabsComponent } from './components/wp-tabs/wp-tabs.component';
CommonModule,
UIRouterModule,
DynamicModule,
OpenprojectAccessibilityModule,
OpenprojectTabsModule,
IconModule,
],

@ -51,7 +51,7 @@
</div>
<div class="work-packages-full-view--split-right work-packages-tab-view--overflow">
<div class="work-packages--panel-inner">
<span class="hidden-for-sighted" tabindex="-1" focus [textContent]="focusAnchorLabel"></span>
<span class="hidden-for-sighted" tabindex="-1" opAutofocus [textContent]="focusAnchorLabel"></span>
<op-wp-tabs [workPackage]="workPackage" view="full"></op-wp-tabs>
<div class="tabcontent" ui-view>
</div>

@ -3,7 +3,7 @@
*ngIf="workPackage">
<op-wp-tabs [workPackage]="workPackage" view="split"></op-wp-tabs>
<div class="work-packages--details-content work-packages-tab-view--overflow" *ngIf="workPackage">
<span class="hidden-for-sighted" tabindex="-1" focus="shouldFocus" [textContent]="focusAnchorLabel">
<span class="hidden-for-sighted" tabindex="-1" [opAutofocus]="shouldFocus" [textContent]="focusAnchorLabel">
</span>
<wp-breadcrumb [workPackage]="workPackage"></wp-breadcrumb>

@ -61,7 +61,7 @@ export class WorkPackageViewFiltersService extends WorkPackageQueryStateService<
'subjectOrId',
'subjectOr',
'manualSort',
'typeahead'
'typeahead',
];
/** Flag state to determine whether the filters are incomplete */

@ -1,9 +1,10 @@
<li class="form--selected-value--container work-package--attachments--draggable-item"
focus-within
<li
class="form--selected-value--container work-package--attachments--draggable-item"
opFocusWithin=".inplace-editing--trigger-icon"
draggable="true"
(dragstart)="setDragData($event)"
[title]="text.dragHint"
focusWithinSelector=".inplace-editing--trigger-icon">
>
<span class="form--selected-value">
<op-icon icon-classes="icon-context icon-attachment"></op-icon>
<a

@ -33,7 +33,7 @@ import { HalResource } from 'core-app/features/hal/resources/hal-resource';
import { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';
import { filter } from 'rxjs/operators';
import { States } from 'core-app/core/states/states.service';
import { AngularTrackingHelpers } from 'core-app/shared/helpers/angular/tracking-functions';
import { trackByHref } from 'core-app/shared/helpers/angular/tracking-functions';
import { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';
@Component({
@ -45,7 +45,7 @@ export class AttachmentListComponent extends UntilDestroyedMixin implements OnIn
@Input() public destroyImmediately = true;
trackByHref = AngularTrackingHelpers.trackByHref;
trackByHref = trackByHref;
attachments:HalResource[] = [];

@ -30,7 +30,6 @@ import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { IconModule } from 'core-app/shared/components/icon/icon.module';
import { OpenprojectAccessibilityModule } from 'core-app/shared/directives/a11y/openproject-a11y.module';
import { AttachmentsComponent } from './attachments.component';
import { AttachmentListComponent } from './attachment-list/attachment-list.component';
@ -42,7 +41,6 @@ import { AuthoringComponent } from './authoring/authoring.component';
imports: [
CommonModule,
IconModule,
OpenprojectAccessibilityModule,
],
declarations: [
AttachmentsComponent,

@ -2,7 +2,6 @@ import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { OpenprojectModalModule } from 'core-app/shared/components/modal/modal.module';
import { OpenprojectAttachmentsModule } from 'core-app/shared/components/attachments/openproject-attachments.module';
import { OpenprojectAccessibilityModule } from 'core-app/shared/directives/a11y/openproject-a11y.module';
import { IconModule } from 'core-app/shared/components/icon/icon.module';
import { AttributeHelpTextComponent } from './attribute-help-text.component';
@ -13,7 +12,6 @@ import { AttributeHelpTextModalComponent } from './attribute-help-text.modal';
CommonModule,
OpenprojectModalModule,
OpenprojectAttachmentsModule,
OpenprojectAccessibilityModule,
IconModule,
],
declarations: [

@ -47,7 +47,7 @@ import { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destr
import { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';
import { Subject } from 'rxjs';
import { PrincipalHelper } from 'core-app/shared/components/principal/principal-helper';
import { AngularTrackingHelpers } from 'core-app/shared/helpers/angular/tracking-functions';
import { compareByHref } from 'core-app/shared/helpers/angular/tracking-functions';
import { filter } from 'rxjs/operators';
export interface CreateAutocompleterValueOption {
@ -109,7 +109,7 @@ export class CreateAutocompleterComponent extends UntilDestroyedMixin implements
@InjectField() readonly pathHelper:PathHelperService;
public compareByHref = AngularTrackingHelpers.compareByHref;
public compareByHref = compareByHref;
public text:{ [key:string]:string } = {};

@ -14,7 +14,7 @@ import { DragulaService, Group } from 'ng2-dragula';
import { DomAutoscrollService } from 'core-app/shared/helpers/drag-and-drop/dom-autoscroll.service';
import { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';
import { merge } from 'rxjs';
import { DomHelpers } from 'core-app/shared/helpers/dom/set-window-cursor.helper';
import { setBodyCursor } from 'core-app/shared/helpers/dom/set-window-cursor.helper';
export interface DraggableOption {
name:string;
@ -67,7 +67,7 @@ export class DraggableAutocompleteComponent extends UntilDestroyedMixin implemen
// Set cursor when dragging
this.dragula.drag('columns')
.pipe(this.untilDestroyed())
.subscribe(() => DomHelpers.setBodyCursor('move', 'important'));
.subscribe(() => setBodyCursor('move', 'important'));
// Reset cursor when cancel or dropped
merge(
@ -75,7 +75,7 @@ export class DraggableAutocompleteComponent extends UntilDestroyedMixin implemen
this.dragula.cancel('columns'),
)
.pipe(this.untilDestroyed())
.subscribe(() => DomHelpers.setBodyCursor('auto'));
.subscribe(() => setBodyCursor('auto'));
// Setup autoscroll
const that = this;

@ -14,7 +14,13 @@ import {
SimpleChanges,
} from '@angular/core';
import { DropdownPosition, NgSelectComponent } from '@ng-select/ng-select';
import { Observable, NEVER, of, Subject, combineLatest, merge } from 'rxjs';
import {
Observable,
NEVER,
of,
Subject,
merge,
} from 'rxjs';
import { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators';
import { GroupValueFn } from '@ng-select/ng-select/lib/ng-select.component';
@ -22,7 +28,7 @@ import { HalResource } from 'core-app/features/hal/resources/hal-resource';
import { Highlighting } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting.functions';
import { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';
import { I18nService } from 'core-app/core/i18n/i18n.service';
import { AngularTrackingHelpers } from 'core-app/shared/helpers/angular/tracking-functions';
import { compareByHrefOrString } from 'core-app/shared/helpers/angular/tracking-functions';
import { OpAutocompleterFooterTemplateDirective } from 'core-app/shared/components/autocompleter/autocompleter-footer-template/op-autocompleter-footer-template.directive';
import { OpAutocompleterService } from './services/op-autocompleter.service';
@ -73,6 +79,7 @@ export class OpAutocompleterComponent extends UntilDestroyedMixin implements Aft
@Input() public id?:string;
@Input() public items?:IOPAutocompleterOption[]|HalResource[];
private items$ = new Subject();
@Input() public clearSearchOnAdd?:boolean = true;
@ -182,7 +189,7 @@ export class OpAutocompleterComponent extends UntilDestroyedMixin implements Aft
@Output() public scrollToEnd = new EventEmitter();
public compareByHrefOrString = AngularTrackingHelpers.compareByHrefOrString;
public compareByHrefOrString = compareByHrefOrString;
public active:Set<string>;
@ -267,7 +274,7 @@ export class OpAutocompleterComponent extends UntilDestroyedMixin implements Aft
}
}
public opened(val: any) {
public opened(_:unknown) { // eslint-disable-line no-unused-vars
if (this.openDirectly) {
this.results$ = this.defaultData
? (this.opAutocompleterService.loadData('', this.resource, this.filters, this.searchKey))
@ -297,7 +304,7 @@ export class OpAutocompleterComponent extends UntilDestroyedMixin implements Aft
});
}
public closed(val:any) {
public closed(_:unknown) { // eslint-disable-line no-unused-vars
this.close.emit();
}

@ -18,9 +18,9 @@ import { DynamicFieldsService } from 'core-app/shared/components/dynamic-forms/s
import { FormGroup } from '@angular/forms';
import { HttpErrorResponse } from '@angular/common/http';
import { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';
import { ConfirmDialogService } from 'core-app/shared/components/modals/confirm-dialog/confirm-dialog.service';
import { IDynamicFieldGroupConfig, IOPDynamicFormSettings, IOPFormlyFieldSettings } from '../../typings';
import { DynamicFormService } from '../../services/dynamic-form/dynamic-form.service';
import { ConfirmDialogService } from "core-app/shared/components/modals/confirm-dialog/confirm-dialog.service";
/**
* SETTINGS:
@ -288,7 +288,6 @@ export class DynamicFormComponent extends UntilDestroyedMixin implements OnChang
return this._dynamicFormService.validateForm$(this.form, this.formEndpoint);
}
handleCancel() {
if (this.form.dirty) {
this._confirmDialogService.confirm({

@ -4,11 +4,11 @@ import {
import { I18nService } from 'core-app/core/i18n/i18n.service';
import { FormlyTemplateOptions } from '@ngx-formly/core';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
import { OpCkeditorComponent } from "core-app/shared/components/editor/components/ckeditor/op-ckeditor.component";
import { OpCkeditorComponent } from 'core-app/shared/components/editor/components/ckeditor/op-ckeditor.component';
import {
ICKEditorContext,
ICKEditorInstance
} from "core-app/shared/components/editor/components/ckeditor/ckeditor.types";
ICKEditorInstance,
} from 'core-app/shared/components/editor/components/ckeditor/ckeditor.types';
@Component({
selector: 'op-formattable-control',

@ -38,7 +38,7 @@ import {
ViewChild,
} from '@angular/core';
import { I18nService } from 'core-app/core/i18n/i18n.service';
import { ContainHelpers } from 'core-app/shared/directives/focus/contain-helpers';
import { whenOutside } from 'core-app/shared/directives/focus/contain-helpers';
import { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';
export const triggerEditingEvent = 'op:selectableTitle:trigger';
@ -138,7 +138,7 @@ export class EditableToolbarTitleComponent implements OnInit, OnChanges {
}
public saveWhenFocusOutside($event:FocusEvent) {
ContainHelpers.whenOutside(this.elementRef.nativeElement, () => this.save($event));
whenOutside(this.elementRef.nativeElement, () => this.save($event));
}
public reset() {

@ -14,7 +14,7 @@
type="text"
aria-required="true"
[attr.name]="selectableTitleIdentifier"
[focus]="this.initialFocus || undefined"
[opAutofocus]="this.initialFocus || undefined"
(focus)="onFocus($event)"
(blur)="onBlur()"
(keydown.escape)="reset($event)"

@ -42,10 +42,10 @@ import {
} from 'core-app/shared/components/editor/components/ckeditor/ckeditor-setup.service';
import { OpCkeditorComponent } from 'core-app/shared/components/editor/components/ckeditor/op-ckeditor.component';
import { componentDestroyed } from '@w11k/ngx-componentdestroyed';
import { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';import {
import { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin'; import {
ICKEditorContext,
ICKEditorInstance
} from "core-app/shared/components/editor/components/ckeditor/ckeditor.types";
ICKEditorInstance,
} from 'core-app/shared/components/editor/components/ckeditor/ckeditor.types';
export const ckeditorAugmentedTextareaSelector = 'ckeditor-augmented-textarea';

@ -1,11 +1,11 @@
import { PathHelperService } from "core-app/core/path-helper/path-helper.service";
import { Injectable } from "@angular/core";
import { PathHelperService } from 'core-app/core/path-helper/path-helper.service';
import { Injectable } from '@angular/core';
import {
ICKEditorContext,
ICKEditorStatic,
ICKEditorWatchdog
} from "core-app/shared/components/editor/components/ckeditor/ckeditor.types";
import { Constructor } from "@angular/cdk/schematics";
ICKEditorWatchdog,
} from 'core-app/shared/components/editor/components/ckeditor/ckeditor.types';
import { Constructor } from '@angular/cdk/schematics';
export type ICKEditorType = 'full'|'constrained';
export type ICKEditorMacroType = 'none'|'resource'|'full'|boolean|string[];
@ -36,7 +36,7 @@ export class CKEditorSetupService {
*/
public async create(
wrapper:HTMLElement, context:ICKEditorContext,
initialData:string|null = null
initialData:string|null = null,
):Promise<ICKEditorWatchdog> {
// Load the bundle
await CKEditorSetupService.load();
@ -60,7 +60,7 @@ export class CKEditorSetupService {
return this
.createWatchdog(editorClass, contentWrapper, config)
.then((watchdog:ICKEditorWatchdog) => {
const editor = watchdog.editor;
const { editor } = watchdog;
toolbarWrapper.appendChild(editor.ui.view.toolbar.element);
// Allow custom events on wrapper to set/get data for debugging

@ -1,8 +1,8 @@
import { HalResource } from "core-app/features/hal/resources/hal-resource";
import { HalResource } from 'core-app/features/hal/resources/hal-resource';
import {
ICKEditorMacroType,
ICKEditorType
} from "core-app/shared/components/editor/components/ckeditor/ckeditor-setup.service";
ICKEditorType,
} from 'core-app/shared/components/editor/components/ckeditor/ckeditor-setup.service';
export interface ICKEditorInstance {
getData(options:{ trim:boolean }):string;

@ -34,10 +34,9 @@ import { I18nService } from 'core-app/core/i18n/i18n.service';
import { ConfigurationService } from 'core-app/core/config/configuration.service';
import {
ICKEditorContext,
ICKEditorInstance, ICKEditorWatchdog
} from "core-app/shared/components/editor/components/ckeditor/ckeditor.types";
import { CKEditorSetupService } from "core-app/shared/components/editor/components/ckeditor/ckeditor-setup.service";
ICKEditorInstance, ICKEditorWatchdog,
} from 'core-app/shared/components/editor/components/ckeditor/ckeditor.types';
import { CKEditorSetupService } from 'core-app/shared/components/editor/components/ckeditor/ckeditor-setup.service';
declare module 'codemirror';
@ -76,6 +75,7 @@ export class OpCkeditorComponent implements OnInit, OnDestroy {
// CKEditor instance once initialized
public watchdog:ICKEditorWatchdog;
public ckEditorInstance:ICKEditorInstance;
public error:string|null = null;
@ -182,7 +182,7 @@ export class OpCkeditorComponent implements OnInit, OnDestroy {
try {
this.watchdog?.destroy();
} catch (e) {
console.error(`Failed to destroy CKEditor instance: ${e}`)
console.error('Failed to destroy CKEditor instance:', e);
}
}

@ -32,9 +32,8 @@ import { EditFieldComponent } from 'core-app/shared/components/fields/edit/edit-
import { OpCkeditorComponent } from 'core-app/shared/components/editor/components/ckeditor/op-ckeditor.component';
import {
ICKEditorContext,
ICKEditorInstance
} from "core-app/shared/components/editor/components/ckeditor/ckeditor.types";
ICKEditorInstance,
} from 'core-app/shared/components/editor/components/ckeditor/ckeditor.types';
@Component({
templateUrl: './formattable-edit-field.component.html',

@ -1,6 +1,6 @@
<input type="text"
class="inline-edit--field op-input"
[focus]="shouldFocus"
[opAutofocus]="shouldFocus"
[attr.aria-required]="required"
[attr.required]="required"
[disabled]="inFlight"

@ -28,7 +28,6 @@
import { APP_INITIALIZER, NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { OpenprojectAccessibilityModule } from 'core-app/shared/directives/a11y/openproject-a11y.module';
import { OpenprojectModalModule } from 'core-app/shared/components/modal/modal.module';
import { OpenprojectEditorModule } from 'core-app/shared/components/editor/openproject-editor.module';
import { OpenprojectAttachmentsModule } from 'core-app/shared/components/attachments/openproject-attachments.module';
@ -67,7 +66,6 @@ import { EditFieldControlsModule } from 'core-app/shared/components/fields/edit/
CommonModule,
OPSharedModule,
OpenprojectAttachmentsModule,
OpenprojectAccessibilityModule,
OpenprojectEditorModule,
OpenprojectModalModule,
OpenprojectAutocompleterModule,

@ -8,7 +8,7 @@ import { HalResourceService } from 'core-app/features/hal/services/hal-resource.
import { ResourceChangeset } from 'core-app/shared/components/fields/changeset/resource-changeset';
import { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';
import { UploadFile } from 'core-app/core/file-upload/op-file-upload.service';
import { ICKEditorContext } from "core-app/shared/components/editor/components/ckeditor/ckeditor.types";
import { ICKEditorContext } from 'core-app/shared/components/editor/components/ckeditor/ckeditor.types';
@Injectable()
export class CustomTextEditFieldService extends EditFieldHandler {

@ -53,7 +53,7 @@ export class TimeEntriesCurrentUserConfigurationModalComponent extends OpModalCo
}
ngOnInit() {
let localDayOptions = this.locals.options.days
const localDayOptions = this.locals.options.days;
this.daysOriginalCheckedValues = localDayOptions.length > 0 ? localDayOptions : Array.from({ length: 7 }, () => true);
this.days = this.timeEntriesCurrentUserConfigurationModalService.getOrderedDaysData(this.daysOriginalCheckedValues);
}

@ -20,10 +20,10 @@
<div class="generic-table--results-container" *ngIf="anyEntries">
<table class="generic-table time-entries">
<colgroup>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col highlight-col>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
<col opHighlightCol>
<col>
</colgroup>
<thead class="-sticky">

@ -9,7 +9,7 @@
</widget-wp-graph-menu>
</widget-header>
<wp-embedded-graph class='grid--widget-content -no-overflow'
<op-wp-embedded-graph class='grid--widget-content -no-overflow'
[datasets]="datasets"
[chartType]="chartType">
</wp-embedded-graph>
</op-wp-embedded-graph>

@ -34,7 +34,7 @@ import {
HideSectionDefinition,
HideSectionService,
} from 'core-app/shared/components/hide-section/hide-section.service';
import { AngularTrackingHelpers } from 'core-app/shared/helpers/angular/tracking-functions';
import { trackByProperty } from 'core-app/shared/helpers/angular/tracking-functions';
import { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';
export const addSectionDropdownSelector = 'add-section-dropdown';
@ -46,7 +46,7 @@ export const addSectionDropdownSelector = 'add-section-dropdown';
export class AddSectionDropdownComponent extends UntilDestroyedMixin implements OnInit {
@ViewChild('fallbackOption', { static: true }) private option:ElementRef;
trackByKey = AngularTrackingHelpers.trackByProperty('key');
trackByKey = trackByProperty('key');
selectable:HideSectionDefinition[] = [];

@ -1,7 +1,7 @@
import {
Component, EventEmitter, HostListener, Input, OnDestroy, Output,
} from '@angular/core';
import { DomHelpers } from 'core-app/shared/helpers/dom/set-window-cursor.helper';
import { setBodyCursor } from 'core-app/shared/helpers/dom/set-window-cursor.helper';
export interface ResizeDelta {
origin:any;
@ -121,11 +121,11 @@ export class ResizerComponent implements OnDestroy {
}
private setResizeCursor() {
DomHelpers.setBodyCursor(this.cursorClass, 'important');
setBodyCursor(this.cursorClass, 'important');
}
private setAutoCursor() {
DomHelpers.setBodyCursor('auto');
setBodyCursor('auto');
}
private buildDelta(event:any):ResizeDelta {

@ -12,7 +12,7 @@ import {
ViewChild,
} from '@angular/core';
import { TabDefinition } from 'core-app/shared/components/tabs/tab.interface';
import { AngularTrackingHelpers } from 'core-app/shared/helpers/angular/tracking-functions';
import { trackByProperty } from 'core-app/shared/helpers/angular/tracking-functions';
@Component({
templateUrl: 'scrollable-tabs.component.html',
@ -41,7 +41,7 @@ export class ScrollableTabsComponent implements AfterViewInit, OnChanges {
@Output() public tabSelected = new EventEmitter<TabDefinition>();
trackById = AngularTrackingHelpers.trackByProperty('id');
trackById = trackByProperty('id');
private container:Element;

@ -31,7 +31,7 @@ import { UserResource } from 'core-app/features/hal/resources/user-resource';
import { I18nService } from 'core-app/core/i18n/i18n.service';
@Component({
selector: 'user-link',
selector: 'op-user-link',
template: `
<a *ngIf="href"
[attr.href]="href"

@ -9,7 +9,7 @@ import { QuerySpacedTabComponent } from 'core-app/shared/components/work-package
import { WorkPackageFiltersService } from 'core-app/features/work-packages/components/filters/wp-filters/wp-filters.service';
@Component({
selector: 'filters-tab-inner',
selector: 'op-filters-tab-inner',
templateUrl: './filters-tab-inner.component.html',
})
export class WpGraphConfigurationFiltersTabInnerComponent extends QuerySpacedTabComponent implements TabComponent {

@ -1,3 +1,3 @@
<ng-container wp-isolated-query-space>
<filters-tab-inner #tabInner></filters-tab-inner>
<op-filters-tab-inner #tabInner></op-filters-tab-inner>
</ng-container>

@ -14,7 +14,7 @@ interface OpChartType {
}
@Component({
selector: 'settings-tab-inner',
selector: 'op-settings-tab-inner',
templateUrl: './settings-tab-inner.component.html',
})
export class WpGraphConfigurationSettingsTabInnerComponent extends QuerySpacedTabComponent implements TabComponent {

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save