From 9e42fdc9f6a01705a153f138645f33847f5c7a6a Mon Sep 17 00:00:00 2001 From: Nazar Semets Date: Thu, 8 May 2025 15:46:23 +0300 Subject: [PATCH 1/4] chore(eslint): moved html file --- .../{my-projects => }/project/files/project-files.component.html | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/app/features/{my-projects => }/project/files/project-files.component.html (100%) diff --git a/src/app/features/my-projects/project/files/project-files.component.html b/src/app/features/project/files/project-files.component.html similarity index 100% rename from src/app/features/my-projects/project/files/project-files.component.html rename to src/app/features/project/files/project-files.component.html From 5f56527f80a948d82dccef2c2f9755b6d710500c Mon Sep 17 00:00:00 2001 From: Nazar Semets Date: Thu, 8 May 2025 17:57:07 +0300 Subject: [PATCH 2/4] chore(eslint): added new rules --- .vscode/settings.json | 13 +++++ eslint.config.js | 48 ++++++++++++++++- package.json | 3 ++ src/app/app.component.spec.ts | 1 + src/app/app.component.ts | 4 +- src/app/app.config.ts | 21 +++++--- src/app/app.module.ts | 6 ++- src/app/app.routes.ts | 6 ++- .../breadcrumb/breadcrumb.component.ts | 2 +- .../components/footer/footer.component.ts | 7 +-- .../components/header/header.component.ts | 14 +++-- .../components/nav-menu/nav-menu.component.ts | 17 +++--- .../components/root/root.component.spec.ts | 1 + .../core/components/root/root.component.ts | 14 ++--- .../components/sidenav/sidenav.component.ts | 3 +- .../components/topnav/topnav.component.ts | 4 +- src/app/core/constants/nav-items.constant.ts | 3 +- .../core/constants/ngxs-states.constant.ts | 6 +-- src/app/core/helpers/http.helper.ts | 1 + .../services/json-api/json-api.service.ts | 6 ++- .../services/mappers/users/users.mapper.ts | 2 +- .../service-worker/check-update.service.ts | 5 +- src/app/core/services/user/user.service.ts | 8 +-- src/app/core/store/auth/auth.selectors.ts | 3 +- src/app/core/store/auth/auth.state.ts | 6 ++- src/app/core/store/user/index.ts | 2 +- src/app/core/store/user/user.selectors.ts | 3 +- src/app/core/store/user/user.state.ts | 14 +++-- src/app/features/auth/auth.service.ts | 12 +++-- .../forgot-password.component.ts | 13 +++-- .../reset-password.component.ts | 14 +++-- .../auth/sign-up/sign-up.component.ts | 21 ++++---- src/app/features/home/home.component.ts | 44 +++++++++------- .../logged-out/home-logged-out.component.ts | 13 +++-- .../institutions/institutions.service.ts | 9 ++-- src/app/features/institutions/store/index.ts | 6 +-- .../store/institutions.selectors.ts | 1 + .../institutions/store/institutions.state.ts | 12 +++-- .../my-profile/my-profile.component.ts | 24 +++++---- .../my-projects/my-projects.component.ts | 52 ++++++++++--------- .../my-projects/my-projects.service.ts | 20 ++++--- src/app/features/my-projects/store/index.ts | 4 +- .../store/my-projects.selectors.ts | 4 +- .../my-projects/store/my-projects.state.ts | 22 ++++---- .../file-detail/file-detail.component.ts | 6 ++- .../project/files/project-files.component.ts | 18 ++++--- .../metadata/project-metadata.component.ts | 6 ++- .../overview/project-overview.component.ts | 6 ++- src/app/features/project/project.component.ts | 5 +- .../registration-card.component.ts | 11 ++-- .../registrations/registrations.component.ts | 16 +++--- .../features/search/mappers/search.mapper.ts | 2 +- .../features/search/models/resource.entity.ts | 2 +- src/app/features/search/search.component.ts | 32 +++++++----- src/app/features/search/search.service.ts | 7 ++- .../features/search/store/search.selectors.ts | 5 +- src/app/features/search/store/search.state.ts | 15 +++--- .../account-settings.component.ts | 16 +++--- .../add-email/add-email.component.ts | 7 +-- .../deactivate-account.component.ts | 3 +- .../addon-card-list.component.ts | 1 + .../addons/addon-card/addon-card.component.ts | 15 +++--- .../settings/addons/addons.component.ts | 33 ++++++------ .../settings/addons/addons.service.ts | 18 ++++--- .../connect-addon/connect-addon.component.ts | 40 +++++++------- .../settings/addons/store/addons.models.ts | 2 +- .../settings/addons/store/addons.selectors.ts | 4 +- .../settings/addons/store/addons.state.ts | 20 ++++--- .../features/settings/addons/store/index.ts | 2 +- .../developer-app-add-edit-form.component.ts | 21 ++++---- .../developer-app-details.component.ts | 32 +++++++----- .../developer-apps/developer-app.mapper.ts | 2 +- .../developer-apps-container.component.ts | 11 ++-- .../developer-apps-list.component.ts | 21 ++++---- .../developer-apps/developer-apps.route.ts | 1 + .../developer-apps/developer-apps.service.ts | 10 ++-- .../entities/developer-app-form.entities.ts | 1 + .../store/developer-apps.selectors.ts | 5 +- .../store/developer-apps.state.ts | 24 +++++---- .../settings/developer-apps/store/index.ts | 4 +- src/app/features/settings/index.ts | 3 +- .../notifications/notifications.component.ts | 8 +-- .../education/education.component.ts | 9 ++-- .../profile-settings.component.ts | 30 ++++++----- .../settings/settings-container.component.ts | 3 +- src/app/features/settings/settings.routes.ts | 3 +- .../features/settings/tokens/store/index.ts | 2 +- .../settings/tokens/store/tokens.selectors.ts | 4 +- .../settings/tokens/store/tokens.state.ts | 18 ++++--- .../token-add-edit-form.component.ts | 26 ++++++---- .../token-created-dialog.component.ts | 17 +++--- .../token-details/token-details.component.ts | 30 ++++++----- .../tokens-list/tokens-list.component.ts | 17 +++--- .../settings/tokens/tokens.component.ts | 18 ++++--- .../features/settings/tokens/tokens.route.ts | 1 + .../settings/tokens/tokens.service.ts | 16 +++--- .../add-project-form.component.ts | 33 ++++++------ .../my-projects-table.component.ts | 12 +++-- .../password-input-hint.component.ts | 1 + .../filter-chips/filter-chips.component.ts | 15 +++--- .../resource-card/resource-card.component.ts | 25 +++++---- .../resource-card/resource-card.service.ts | 9 ++-- .../creators/creators-filter.component.ts | 20 ++++--- .../date-created-filter.component.ts | 11 ++-- .../filters/funder/funder-filter.component.ts | 13 +++-- .../institution-filter.component.ts | 13 +++-- .../license-filter.component.ts | 11 ++-- .../part-of-collection-filter.component.ts | 13 +++-- .../provider-filter.component.ts | 13 +++-- .../resource-type-filter.component.ts | 13 +++-- .../store/resource-filters-options.model.ts | 8 +-- .../resource-filters-options.selectors.ts | 9 ++-- .../store/resource-filters-options.state.ts | 9 ++-- .../subject/subject-filter.component.ts | 11 ++-- .../mappers/creators/creators.mappers.ts | 2 +- .../dateCreated/date-created.mapper.ts | 2 +- .../mappers/funder/funder.mapper.ts | 2 +- .../mappers/institution/institution.mapper.ts | 4 +- .../mappers/license/license.mapper.ts | 4 +- .../part-of-collection.mapper.ts | 2 +- .../mappers/provider/provider.mapper.ts | 2 +- .../resource-type/resource-type.mapper.ts | 2 +- .../mappers/subject/subject.mapper.ts | 2 +- .../models/index-value-search.entity.ts | 2 +- .../institution-index-value-search.entity.ts | 2 +- .../license-index-value-search.entity.ts | 2 +- ...of-collection-index-value-search.entity.ts | 2 +- .../provider-index-value-search.entity.ts | 2 +- ...resource-type-index-value-search.entity.ts | 2 +- .../resource-filters.component.ts | 27 +++++----- .../resource-filters.service.ts | 50 ++++++++++-------- .../resources/resource-filters/store/index.ts | 2 +- .../store/resource-filters.selectors.ts | 3 +- .../store/resource-filters.state.ts | 5 +- .../resources-wrapper.component.ts | 25 +++++---- .../resources/resources.component.ts | 27 +++++----- .../search-input/search-input.component.ts | 3 +- .../sub-header/sub-header.component.ts | 8 +-- .../entities/create-project-form.interface.ts | 1 + src/app/shared/utils/breakpoints.tokens.ts | 6 ++- src/main.ts | 7 +-- 141 files changed, 942 insertions(+), 618 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..93a2be92f --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,13 @@ +{ + "editor.formatOnSave": false, + "eslint.format.enable": true, + "editor.codeActionsOnSave": { + "source.fixAll.stylelint": "explicit", + "source.fixAll.eslint": "explicit" + }, + "[html]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "scss.lint.unknownAtRules": "ignore", + "eslint.validate": ["json"], +} diff --git a/eslint.config.js b/eslint.config.js index 005199c8e..88c981f95 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -2,6 +2,9 @@ const eslint = require("@eslint/js"); const tseslint = require("typescript-eslint"); const angular = require("angular-eslint"); +const pluginImport = require("eslint-plugin-import"); +const pluginSimpleImportSort = require("eslint-plugin-simple-import-sort"); +const pluginUnusedImports = require("eslint-plugin-unused-imports"); module.exports = tseslint.config( { @@ -13,6 +16,11 @@ module.exports = tseslint.config( ...angular.configs.tsRecommended, ], processor: angular.processInlineTemplates, + plugins: { + import: pluginImport, + "simple-import-sort": pluginSimpleImportSort, + "unused-imports": pluginUnusedImports, + }, rules: { "@angular-eslint/directive-selector": [ "error", @@ -30,6 +38,44 @@ module.exports = tseslint.config( style: "kebab-case", }, ], + "import/first": "error", + "import/no-duplicates": "warn", + "import/newline-after-import": "warn", + "simple-import-sort/imports": [ + "warn", + { + groups: [ + // NGXS packages + ["^@ngxs"], + + // NGX packages (ngx-... or @ngx/...) + ["^ngx-", "^@ngx"], + + // Third-party packages (primeng) + ["^primeng"], + + // RxJS packages (rxjs or @rxjs/...) + ["^rxjs", "^rxjs/operators"], + + // Angular packages + ["^@angular"], + + // Internal aliases (customize as needed) + ["^@core/", "^@osf/", "^@shared/"], + + // Side effect imports + ["^\\u0000"], + + // Parent imports + ["^\\.\\.(?!/?$)", "^\\.\\./?$"], + + // Sibling and current directory imports + ["^\\./(?=.*/)(?!/?$)", "^\\.(?!/?$)", "^\\./?$"], + ], + }, + ], + "simple-import-sort/exports": "warn", + "unused-imports/no-unused-imports": "warn", }, }, { @@ -39,5 +85,5 @@ module.exports = tseslint.config( ...angular.configs.templateAccessibility, ], rules: {}, - } + }, ); diff --git a/package.json b/package.json index f753a31bd..e037e652c 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,9 @@ "@types/jasmine": "~5.1.0", "angular-eslint": "19.1.0", "eslint": "^9.20.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-simple-import-sort": "^12.1.1", + "eslint-plugin-unused-imports": "^4.1.4", "fantasticon": "^3.0.0", "husky": "^9.1.7", "jasmine-core": "~5.6.0", diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index 50b319f17..fd078209f 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -1,4 +1,5 @@ import { TestBed } from '@angular/core/testing'; + import { AppComponent } from './app.component'; describe('AppComponent', () => { diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 30594c352..2fe523e5b 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,3 +1,5 @@ +import { Store } from '@ngxs/store'; + import { ChangeDetectionStrategy, Component, @@ -5,7 +7,7 @@ import { OnInit, } from '@angular/core'; import { RouterOutlet } from '@angular/router'; -import { Store } from '@ngxs/store'; + import { GetCurrentUser } from '@core/store/user'; @Component({ diff --git a/src/app/app.config.ts b/src/app/app.config.ts index db007ae47..224090796 100644 --- a/src/app/app.config.ts +++ b/src/app/app.config.ts @@ -1,16 +1,21 @@ -import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; -import { provideRouter } from '@angular/router'; -import { routes } from './app.routes'; -import { provideStore } from '@ngxs/store'; import { withNgxsReduxDevtoolsPlugin } from '@ngxs/devtools-plugin'; +import { provideStore } from '@ngxs/store'; + +import { ConfirmationService } from 'primeng/api'; import { providePrimeNG } from 'primeng/config'; -import Aura from '@primeng/themes/aura'; -import { provideAnimations } from '@angular/platform-browser/animations'; + import { provideHttpClient } from '@angular/common/http'; -import { ConfirmationService } from 'primeng/api'; -import { STATES } from '@core/constants/ngxs-states.constant'; +import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; +import { provideAnimations } from '@angular/platform-browser/animations'; +import { provideRouter } from '@angular/router'; import { provideServiceWorker } from '@angular/service-worker'; +import { STATES } from '@core/constants/ngxs-states.constant'; + +import { routes } from './app.routes'; + +import Aura from '@primeng/themes/aura'; + export const appConfig: ApplicationConfig = { providers: [ provideZoneChangeDetection({ eventCoalescing: true }), diff --git a/src/app/app.module.ts b/src/app/app.module.ts index a954734fc..89d89cfc4 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -1,8 +1,10 @@ -import { NgModule } from '@angular/core'; import { NgxsModule } from '@ngxs/store'; + +import { NgModule } from '@angular/core'; + import { AuthState } from '@core/store/auth'; -import { AddonsState } from '@osf/features/settings/addons/store'; import { SearchState } from '@osf/features/search/store'; +import { AddonsState } from '@osf/features/settings/addons/store'; import { TokensState } from '@osf/features/settings/tokens/store'; @NgModule({ diff --git a/src/app/app.routes.ts b/src/app/app.routes.ts index 50b1f7c5e..fc1d6c8a1 100644 --- a/src/app/app.routes.ts +++ b/src/app/app.routes.ts @@ -1,7 +1,9 @@ -import { Routes } from '@angular/router'; import { provideStates } from '@ngxs/store'; -import { ResourceFiltersState } from '@shared/components/resources/resource-filters/store/resource-filters.state'; + +import { Routes } from '@angular/router'; + import { ResourceFiltersOptionsState } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.state'; +import { ResourceFiltersState } from '@shared/components/resources/resource-filters/store/resource-filters.state'; export const routes: Routes = [ { diff --git a/src/app/core/components/breadcrumb/breadcrumb.component.ts b/src/app/core/components/breadcrumb/breadcrumb.component.ts index af57bd073..98e01b387 100644 --- a/src/app/core/components/breadcrumb/breadcrumb.component.ts +++ b/src/app/core/components/breadcrumb/breadcrumb.component.ts @@ -1,6 +1,6 @@ import { Component, computed, DestroyRef, inject, signal } from '@angular/core'; -import { NavigationEnd, Router } from '@angular/router'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { NavigationEnd, Router } from '@angular/router'; @Component({ selector: 'osf-breadcrumb', diff --git a/src/app/core/components/footer/footer.component.ts b/src/app/core/components/footer/footer.component.ts index bc73670aa..ecf622486 100644 --- a/src/app/core/components/footer/footer.component.ts +++ b/src/app/core/components/footer/footer.component.ts @@ -1,9 +1,10 @@ +import { NgOptimizedImage } from '@angular/common'; import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; -import { SocialIcon } from '@osf/shared/entities/social-icon.interface'; +import { toSignal } from '@angular/core/rxjs-interop'; import { RouterLink } from '@angular/router'; + +import { SocialIcon } from '@osf/shared/entities/social-icon.interface'; import { IS_PORTRAIT, IS_XSMALL } from '@shared/utils/breakpoints.tokens'; -import { toSignal } from '@angular/core/rxjs-interop'; -import { NgOptimizedImage } from '@angular/common'; @Component({ standalone: true, diff --git a/src/app/core/components/header/header.component.ts b/src/app/core/components/header/header.component.ts index d4d5bd91d..96f03bfc9 100644 --- a/src/app/core/components/header/header.component.ts +++ b/src/app/core/components/header/header.component.ts @@ -1,16 +1,20 @@ +import { Store } from '@ngxs/store'; + +import { ButtonModule } from 'primeng/button'; +import { MenuModule } from 'primeng/menu'; + +import { map } from 'rxjs'; + import { ChangeDetectionStrategy, Component, computed, inject, } from '@angular/core'; -import { Router, RouterLink } from '@angular/router'; import { toSignal } from '@angular/core/rxjs-interop'; -import { map } from 'rxjs'; +import { Router, RouterLink } from '@angular/router'; + import { BreadcrumbComponent } from '@core/components/breadcrumb/breadcrumb.component'; -import { MenuModule } from 'primeng/menu'; -import { ButtonModule } from 'primeng/button'; -import { Store } from '@ngxs/store'; import { UserSelectors } from '@core/store/user/user.selectors'; @Component({ diff --git a/src/app/core/components/nav-menu/nav-menu.component.ts b/src/app/core/components/nav-menu/nav-menu.component.ts index 95dafa14d..576da1037 100644 --- a/src/app/core/components/nav-menu/nav-menu.component.ts +++ b/src/app/core/components/nav-menu/nav-menu.component.ts @@ -1,19 +1,22 @@ +import { MenuItem } from 'primeng/api'; +import { PanelMenuModule } from 'primeng/panelmenu'; + +import { filter, map } from 'rxjs'; + import { Component, computed, inject } from '@angular/core'; +import { toSignal } from '@angular/core/rxjs-interop'; import { + ActivatedRoute, + NavigationEnd, + Router, RouterLink, RouterLinkActive, - Router, - NavigationEnd, - ActivatedRoute, } from '@angular/router'; + import { NAV_ITEMS, PROJECT_MENU_ITEMS, } from '@core/constants/nav-items.constant'; -import { PanelMenuModule } from 'primeng/panelmenu'; -import { MenuItem } from 'primeng/api'; -import { toSignal } from '@angular/core/rxjs-interop'; -import { filter, map } from 'rxjs'; import { NavItem } from '@shared/entities/nav-item.interface'; @Component({ diff --git a/src/app/core/components/root/root.component.spec.ts b/src/app/core/components/root/root.component.spec.ts index d625e1b0f..ab6a02c68 100644 --- a/src/app/core/components/root/root.component.spec.ts +++ b/src/app/core/components/root/root.component.spec.ts @@ -1,4 +1,5 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; + import { RootComponent } from './root.component'; describe('RootComponent', () => { diff --git a/src/app/core/components/root/root.component.ts b/src/app/core/components/root/root.component.ts index eb4e806d1..c5b79fb67 100644 --- a/src/app/core/components/root/root.component.ts +++ b/src/app/core/components/root/root.component.ts @@ -1,14 +1,16 @@ -import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; +import { ConfirmDialog } from 'primeng/confirmdialog'; + import { CommonModule } from '@angular/common'; -import { SidenavComponent } from '@core/components/sidenav/sidenav.component'; +import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; +import { toSignal } from '@angular/core/rxjs-interop'; + +import { BreadcrumbComponent } from '@core/components/breadcrumb/breadcrumb.component'; +import { FooterComponent } from '@core/components/footer/footer.component'; import { HeaderComponent } from '@core/components/header/header.component'; import { MainContentComponent } from '@core/components/main-content/main-content.component'; -import { FooterComponent } from '@core/components/footer/footer.component'; +import { SidenavComponent } from '@core/components/sidenav/sidenav.component'; import { TopnavComponent } from '@core/components/topnav/topnav.component'; import { IS_WEB, IS_XSMALL } from '@shared/utils/breakpoints.tokens'; -import { toSignal } from '@angular/core/rxjs-interop'; -import { ConfirmDialog } from 'primeng/confirmdialog'; -import { BreadcrumbComponent } from '@core/components/breadcrumb/breadcrumb.component'; @Component({ selector: 'osf-root', diff --git a/src/app/core/components/sidenav/sidenav.component.ts b/src/app/core/components/sidenav/sidenav.component.ts index 971f08f0b..c1270012c 100644 --- a/src/app/core/components/sidenav/sidenav.component.ts +++ b/src/app/core/components/sidenav/sidenav.component.ts @@ -1,5 +1,6 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core'; import { NgOptimizedImage } from '@angular/common'; +import { ChangeDetectionStrategy, Component } from '@angular/core'; + import { NavMenuComponent } from '@core/components/nav-menu/nav-menu.component'; @Component({ diff --git a/src/app/core/components/topnav/topnav.component.ts b/src/app/core/components/topnav/topnav.component.ts index 2d1fa7aff..ef31bf07e 100644 --- a/src/app/core/components/topnav/topnav.component.ts +++ b/src/app/core/components/topnav/topnav.component.ts @@ -1,7 +1,9 @@ -import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; import { Button } from 'primeng/button'; import { Drawer } from 'primeng/drawer'; + import { NgOptimizedImage } from '@angular/common'; +import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; + import { NavMenuComponent } from '@core/components/nav-menu/nav-menu.component'; @Component({ diff --git a/src/app/core/constants/nav-items.constant.ts b/src/app/core/constants/nav-items.constant.ts index d507c73c0..1d83294dd 100644 --- a/src/app/core/constants/nav-items.constant.ts +++ b/src/app/core/constants/nav-items.constant.ts @@ -1,6 +1,7 @@ -import { NavItem } from '@shared/entities/nav-item.interface'; import { MenuItem } from 'primeng/api'; +import { NavItem } from '@shared/entities/nav-item.interface'; + export const NAV_ITEMS: NavItem[] = [ { path: '/home', label: 'Home', icon: 'home', useExactMatch: true }, { path: '/search', label: 'Search OSF', icon: 'search', useExactMatch: true }, diff --git a/src/app/core/constants/ngxs-states.constant.ts b/src/app/core/constants/ngxs-states.constant.ts index 9637ec02f..7c9dd87b6 100644 --- a/src/app/core/constants/ngxs-states.constant.ts +++ b/src/app/core/constants/ngxs-states.constant.ts @@ -1,11 +1,11 @@ import { AuthState } from '@core/store/auth'; -import { TokensState } from '@osf/features/settings/tokens/store'; -import { AddonsState } from '@osf/features/settings/addons/store'; import { UserState } from '@core/store/user'; +import { InstitutionsState } from '@osf/features/institutions/store'; import { MyProjectsState } from '@osf/features/my-projects/store'; import { SearchState } from '@osf/features/search/store'; -import { InstitutionsState } from '@osf/features/institutions/store'; +import { AddonsState } from '@osf/features/settings/addons/store'; import { DeveloperAppsState } from '@osf/features/settings/developer-apps/store'; +import { TokensState } from '@osf/features/settings/tokens/store'; export const STATES = [ AuthState, diff --git a/src/app/core/helpers/http.helper.ts b/src/app/core/helpers/http.helper.ts index fbd689092..cc672cfff 100644 --- a/src/app/core/helpers/http.helper.ts +++ b/src/app/core/helpers/http.helper.ts @@ -1,4 +1,5 @@ import { Params } from '@angular/router'; + import { SortOrder } from '@shared/utils/sort-order.enum'; export const parseQueryFilterParams = ( diff --git a/src/app/core/services/json-api/json-api.service.ts b/src/app/core/services/json-api/json-api.service.ts index 7ca568658..caea0aeaa 100644 --- a/src/app/core/services/json-api/json-api.service.ts +++ b/src/app/core/services/json-api/json-api.service.ts @@ -1,6 +1,8 @@ -import { inject, Injectable } from '@angular/core'; -import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; import { map, Observable } from 'rxjs'; + +import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; +import { inject, Injectable } from '@angular/core'; + import { JsonApiResponse } from '@core/services/json-api/json-api.entity'; @Injectable({ diff --git a/src/app/core/services/mappers/users/users.mapper.ts b/src/app/core/services/mappers/users/users.mapper.ts index 7f5a08e8f..677d4bce7 100644 --- a/src/app/core/services/mappers/users/users.mapper.ts +++ b/src/app/core/services/mappers/users/users.mapper.ts @@ -1,5 +1,5 @@ -import { User } from '@core/services/user/user.entity'; import { UserUS } from '@core/services/json-api/underscore-entites/user/user-us.entity'; +import { User } from '@core/services/user/user.entity'; export function mapUserUStoUser(user: UserUS): User { return { diff --git a/src/app/core/services/service-worker/check-update.service.ts b/src/app/core/services/service-worker/check-update.service.ts index 0b83a4bd9..160b79964 100644 --- a/src/app/core/services/service-worker/check-update.service.ts +++ b/src/app/core/services/service-worker/check-update.service.ts @@ -1,7 +1,8 @@ +import { BehaviorSubject, concat, first, interval } from 'rxjs'; + import { ApplicationRef, inject, Injectable } from '@angular/core'; -import { SwUpdate, VersionEvent } from '@angular/service-worker'; -import { interval, BehaviorSubject, first, concat } from 'rxjs'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { SwUpdate, VersionEvent } from '@angular/service-worker'; @Injectable({ providedIn: 'root' }) export class NewVersionCheckerService { diff --git a/src/app/core/services/user/user.service.ts b/src/app/core/services/user/user.service.ts index 44bfda377..e8c1ff1a9 100644 --- a/src/app/core/services/user/user.service.ts +++ b/src/app/core/services/user/user.service.ts @@ -1,10 +1,12 @@ -import { inject, Injectable } from '@angular/core'; import { map, Observable } from 'rxjs'; + +import { inject, Injectable } from '@angular/core'; + +import { JsonApiResponse } from '@core/services/json-api/json-api.entity'; import { JsonApiService } from '@core/services/json-api/json-api.service'; -import { User } from '@core/services/user/user.entity'; import { UserUS } from '@core/services/json-api/underscore-entites/user/user-us.entity'; import { mapUserUStoUser } from '@core/services/mappers/users/users.mapper'; -import { JsonApiResponse } from '@core/services/json-api/json-api.entity'; +import { User } from '@core/services/user/user.entity'; @Injectable({ providedIn: 'root', diff --git a/src/app/core/store/auth/auth.selectors.ts b/src/app/core/store/auth/auth.selectors.ts index f50c3b525..51698a086 100644 --- a/src/app/core/store/auth/auth.selectors.ts +++ b/src/app/core/store/auth/auth.selectors.ts @@ -1,6 +1,7 @@ import { Selector } from '@ngxs/store'; -import { AuthState } from './auth.state'; + import { AuthStateModel } from './auth.model'; +import { AuthState } from './auth.state'; export class AuthSelectors { @Selector([AuthState]) diff --git a/src/app/core/store/auth/auth.state.ts b/src/app/core/store/auth/auth.state.ts index 9d14b0b4b..3dc968c7b 100644 --- a/src/app/core/store/auth/auth.state.ts +++ b/src/app/core/store/auth/auth.state.ts @@ -1,7 +1,9 @@ +import { Action, State, StateContext } from '@ngxs/store'; + import { Injectable } from '@angular/core'; -import { State, Action, StateContext } from '@ngxs/store'; + +import { ClearAuth, SetAuthToken } from './auth.actions'; import { AuthStateModel } from './auth.model'; -import { SetAuthToken, ClearAuth } from './auth.actions'; @State({ name: 'auth', diff --git a/src/app/core/store/user/index.ts b/src/app/core/store/user/index.ts index e8c90712a..ee67c0c04 100644 --- a/src/app/core/store/user/index.ts +++ b/src/app/core/store/user/index.ts @@ -1,3 +1,3 @@ -export * from './user.models'; export * from './user.actions'; +export * from './user.models'; export * from './user.state'; diff --git a/src/app/core/store/user/user.selectors.ts b/src/app/core/store/user/user.selectors.ts index 783a8df22..181149edc 100644 --- a/src/app/core/store/user/user.selectors.ts +++ b/src/app/core/store/user/user.selectors.ts @@ -1,6 +1,7 @@ import { Selector } from '@ngxs/store'; -import { UserStateModel } from '@core/store/user/user.models'; + import { User } from '@core/services/user/user.entity'; +import { UserStateModel } from '@core/store/user/user.models'; import { UserState } from '@core/store/user/user.state'; export class UserSelectors { diff --git a/src/app/core/store/user/user.state.ts b/src/app/core/store/user/user.state.ts index 96092266c..f6581d0f6 100644 --- a/src/app/core/store/user/user.state.ts +++ b/src/app/core/store/user/user.state.ts @@ -1,10 +1,14 @@ -import { Injectable, inject } from '@angular/core'; -import { State, Action, StateContext } from '@ngxs/store'; -import { UserStateModel } from './user.models'; -import { GetCurrentUser, SetCurrentUser } from './user.actions'; -import { UserService } from '@core/services/user/user.service'; +import { Action, State, StateContext } from '@ngxs/store'; + import { tap } from 'rxjs'; +import { inject, Injectable } from '@angular/core'; + +import { UserService } from '@core/services/user/user.service'; + +import { GetCurrentUser, SetCurrentUser } from './user.actions'; +import { UserStateModel } from './user.models'; + @State({ name: 'user', defaults: { diff --git a/src/app/features/auth/auth.service.ts b/src/app/features/auth/auth.service.ts index a730effa5..b4cd6e127 100644 --- a/src/app/features/auth/auth.service.ts +++ b/src/app/features/auth/auth.service.ts @@ -1,9 +1,13 @@ -import { Injectable, inject } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; import { Store } from '@ngxs/store'; + import { firstValueFrom } from 'rxjs'; -import { LoginCredentials, AuthResponse } from './auth.entity'; -import { SetAuthToken, ClearAuth } from '@core/store/auth'; + +import { HttpClient } from '@angular/common/http'; +import { inject, Injectable } from '@angular/core'; + +import { ClearAuth, SetAuthToken } from '@core/store/auth'; + +import { AuthResponse, LoginCredentials } from './auth.entity'; @Injectable({ providedIn: 'root', diff --git a/src/app/features/auth/forgot-password/forgot-password.component.ts b/src/app/features/auth/forgot-password/forgot-password.component.ts index 897144f09..3410584aa 100644 --- a/src/app/features/auth/forgot-password/forgot-password.component.ts +++ b/src/app/features/auth/forgot-password/forgot-password.component.ts @@ -1,12 +1,15 @@ -import { Component, inject, signal } from '@angular/core'; -import { InputText } from 'primeng/inputtext'; -import { ReactiveFormsModule, FormBuilder, Validators } from '@angular/forms'; import { Button } from 'primeng/button'; -import { MessageInfo } from './message-info.model'; +import { InputText } from 'primeng/inputtext'; import { Message } from 'primeng/message'; + +import { Component, inject, signal } from '@angular/core'; +import { toSignal } from '@angular/core/rxjs-interop'; +import { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms'; + import { ForgotPasswordFormGroupType } from '@osf/features/auth/forgot-password/forgot-password-form-group.type'; import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; -import { toSignal } from '@angular/core/rxjs-interop'; + +import { MessageInfo } from './message-info.model'; @Component({ selector: 'osf-forgot-password', diff --git a/src/app/features/auth/reset-password/reset-password.component.ts b/src/app/features/auth/reset-password/reset-password.component.ts index c62c53e2f..b18c925e8 100644 --- a/src/app/features/auth/reset-password/reset-password.component.ts +++ b/src/app/features/auth/reset-password/reset-password.component.ts @@ -1,16 +1,20 @@ -import { Component, inject, signal } from '@angular/core'; import { Button } from 'primeng/button'; -import { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms'; import { Password } from 'primeng/password'; + +import { Component, inject, signal } from '@angular/core'; +import { toSignal } from '@angular/core/rxjs-interop'; +import { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms'; import { RouterLink } from '@angular/router'; + +import { PasswordInputHintComponent } from '@shared/components/password-input-hint/password-input-hint.component'; +import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; + import { PASSWORD_REGEX, passwordMatchValidator, } from '../sign-up/sign-up.helper'; -import { PasswordInputHintComponent } from '@shared/components/password-input-hint/password-input-hint.component'; + import { ResetPasswordFormGroupType } from './reset-password-form-group.type'; -import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; -import { toSignal } from '@angular/core/rxjs-interop'; @Component({ selector: 'osf-reset-password', diff --git a/src/app/features/auth/sign-up/sign-up.component.ts b/src/app/features/auth/sign-up/sign-up.component.ts index f7cdc2cf0..3312e7bd3 100644 --- a/src/app/features/auth/sign-up/sign-up.component.ts +++ b/src/app/features/auth/sign-up/sign-up.component.ts @@ -1,21 +1,24 @@ +import { ButtonModule } from 'primeng/button'; +import { CheckboxModule } from 'primeng/checkbox'; +import { DividerModule } from 'primeng/divider'; +import { InputTextModule } from 'primeng/inputtext'; +import { PasswordModule } from 'primeng/password'; + +import { CommonModule, NgOptimizedImage } from '@angular/common'; import { Component, inject, OnInit, signal } from '@angular/core'; +import { toSignal } from '@angular/core/rxjs-interop'; import { FormBuilder, FormGroup, - Validators, ReactiveFormsModule, + Validators, } from '@angular/forms'; -import { ButtonModule } from 'primeng/button'; -import { InputTextModule } from 'primeng/inputtext'; -import { PasswordModule } from 'primeng/password'; -import { CheckboxModule } from 'primeng/checkbox'; -import { DividerModule } from 'primeng/divider'; -import { CommonModule, NgOptimizedImage } from '@angular/common'; -import { PASSWORD_REGEX, passwordMatchValidator } from './sign-up.helper'; import { Router, RouterLink } from '@angular/router'; + import { PasswordInputHintComponent } from '@shared/components/password-input-hint/password-input-hint.component'; import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; -import { toSignal } from '@angular/core/rxjs-interop'; + +import { PASSWORD_REGEX, passwordMatchValidator } from './sign-up.helper'; @Component({ selector: 'osf-sign-up', diff --git a/src/app/features/home/home.component.ts b/src/app/features/home/home.component.ts index f3f8e517b..ff3193f1a 100644 --- a/src/app/features/home/home.component.ts +++ b/src/app/features/home/home.component.ts @@ -1,35 +1,39 @@ +import { Store } from '@ngxs/store'; + +import { SortEvent } from 'primeng/api'; +import { Button } from 'primeng/button'; +import { DialogService } from 'primeng/dynamicdialog'; +import { TablePageEvent } from 'primeng/table'; + +import { debounceTime, distinctUntilChanged, Subject } from 'rxjs'; + import { Component, + computed, DestroyRef, + effect, inject, OnInit, signal, - computed, - effect, } from '@angular/core'; -import { RouterLink, ActivatedRoute, Router } from '@angular/router'; -import { Button } from 'primeng/button'; -import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; -import { IS_MEDIUM, IS_XSMALL } from '@shared/utils/breakpoints.tokens'; -import { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { Store } from '@ngxs/store'; -import { MyProjectsTableComponent } from '@shared/components/my-projects-table/my-projects-table.component'; -import { TableParameters } from '@shared/entities/table-parameters.interface'; +import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop'; +import { ActivatedRoute, Router, RouterLink } from '@angular/router'; + import { MY_PROJECTS_TABLE_PARAMS } from '@core/constants/my-projects-table.constants'; -import { SortOrder } from '@shared/utils/sort-order.enum'; -import { TablePageEvent } from 'primeng/table'; -import { SortEvent } from 'primeng/api'; +import { GetUserInstitutions } from '@osf/features/institutions/store'; +import { MyProjectsItem } from '@osf/features/my-projects/entities/my-projects.entities'; +import { MyProjectsSearchFilters } from '@osf/features/my-projects/entities/my-projects-search-filters.models'; import { - MyProjectsSelectors, - GetMyProjects, ClearMyProjects, + GetMyProjects, + MyProjectsSelectors, } from '@osf/features/my-projects/store'; -import { debounceTime, distinctUntilChanged, Subject } from 'rxjs'; -import { MyProjectsSearchFilters } from '@osf/features/my-projects/entities/my-projects-search-filters.models'; -import { MyProjectsItem } from '@osf/features/my-projects/entities/my-projects.entities'; -import { GetUserInstitutions } from '@osf/features/institutions/store'; -import { DialogService } from 'primeng/dynamicdialog'; import { AddProjectFormComponent } from '@shared/components/add-project-form/add-project-form.component'; +import { MyProjectsTableComponent } from '@shared/components/my-projects-table/my-projects-table.component'; +import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; +import { TableParameters } from '@shared/entities/table-parameters.interface'; +import { IS_MEDIUM, IS_XSMALL } from '@shared/utils/breakpoints.tokens'; +import { SortOrder } from '@shared/utils/sort-order.enum'; @Component({ selector: 'osf-home', diff --git a/src/app/features/home/logged-out/home-logged-out.component.ts b/src/app/features/home/logged-out/home-logged-out.component.ts index 9e5ac3f83..1acd08c24 100644 --- a/src/app/features/home/logged-out/home-logged-out.component.ts +++ b/src/app/features/home/logged-out/home-logged-out.component.ts @@ -1,17 +1,20 @@ -import { Component, inject, signal } from '@angular/core'; -import { CarouselModule } from 'primeng/carousel'; -import { FormsModule } from '@angular/forms'; import { Button } from 'primeng/button'; +import { CarouselModule } from 'primeng/carousel'; import { InputText } from 'primeng/inputtext'; + import { NgOptimizedImage } from '@angular/common'; -import { slides, integrationIcons } from './data'; +import { Component, inject, signal } from '@angular/core'; +import { toSignal } from '@angular/core/rxjs-interop'; +import { FormsModule } from '@angular/forms'; + import { IS_MEDIUM, IS_SMALL, IS_WEB, IS_XSMALL, } from '@shared/utils/breakpoints.tokens'; -import { toSignal } from '@angular/core/rxjs-interop'; + +import { integrationIcons, slides } from './data'; @Component({ selector: 'osf-home-logged-out', diff --git a/src/app/features/institutions/institutions.service.ts b/src/app/features/institutions/institutions.service.ts index 634612290..f80cd0482 100644 --- a/src/app/features/institutions/institutions.service.ts +++ b/src/app/features/institutions/institutions.service.ts @@ -1,12 +1,15 @@ +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + import { inject, Injectable } from '@angular/core'; + +import { JsonApiResponse } from '@core/services/json-api/json-api.entity'; import { JsonApiService } from '@core/services/json-api/json-api.service'; -import { Observable } from 'rxjs'; + import { Institution, UserInstitutionGetResponse, } from './entities/institutions.models'; -import { JsonApiResponse } from '@core/services/json-api/json-api.entity'; -import { map } from 'rxjs/operators'; import { InstitutionsMapper } from './mappers/institutions.mapper'; @Injectable({ diff --git a/src/app/features/institutions/store/index.ts b/src/app/features/institutions/store/index.ts index 63e4169a1..d568dc999 100644 --- a/src/app/features/institutions/store/index.ts +++ b/src/app/features/institutions/store/index.ts @@ -1,4 +1,4 @@ -export * from './institutions.state'; -export * from './institutions.selectors'; -export * from './institutions.model'; export * from './institutions.actions'; +export * from './institutions.model'; +export * from './institutions.selectors'; +export * from './institutions.state'; diff --git a/src/app/features/institutions/store/institutions.selectors.ts b/src/app/features/institutions/store/institutions.selectors.ts index cb6ab2b0b..278497136 100644 --- a/src/app/features/institutions/store/institutions.selectors.ts +++ b/src/app/features/institutions/store/institutions.selectors.ts @@ -1,4 +1,5 @@ import { Selector } from '@ngxs/store'; + import { InstitutionsStateModel } from './institutions.model'; import { InstitutionsState } from './institutions.state'; diff --git a/src/app/features/institutions/store/institutions.state.ts b/src/app/features/institutions/store/institutions.state.ts index 0ef67fe23..8bcc6d84a 100644 --- a/src/app/features/institutions/store/institutions.state.ts +++ b/src/app/features/institutions/store/institutions.state.ts @@ -1,9 +1,13 @@ +import { Action, State, StateContext } from '@ngxs/store'; + +import { tap } from 'rxjs'; + import { inject, Injectable } from '@angular/core'; -import { State, Action, StateContext } from '@ngxs/store'; -import { InstitutionsStateModel } from './institutions.model'; -import { GetUserInstitutions } from './institutions.actions'; + import { InstitutionsService } from '@osf/features/institutions/institutions.service'; -import { tap } from 'rxjs'; + +import { GetUserInstitutions } from './institutions.actions'; +import { InstitutionsStateModel } from './institutions.model'; @State({ name: 'institutions', diff --git a/src/app/features/my-profile/my-profile.component.ts b/src/app/features/my-profile/my-profile.component.ts index fc0205fd2..ef99ac73f 100644 --- a/src/app/features/my-profile/my-profile.component.ts +++ b/src/app/features/my-profile/my-profile.component.ts @@ -1,3 +1,9 @@ +import { Store } from '@ngxs/store'; + +import { AccordionModule } from 'primeng/accordion'; +import { Button } from 'primeng/button'; + +import { DatePipe, NgOptimizedImage } from '@angular/common'; import { ChangeDetectionStrategy, Component, @@ -6,22 +12,20 @@ import { OnDestroy, signal, } from '@angular/core'; -import { Store } from '@ngxs/store'; -import { UserSelectors } from '@osf/core/store/user/user.selectors'; -import { Button } from 'primeng/button'; -import { DatePipe, NgOptimizedImage } from '@angular/common'; -import { AccordionModule } from 'primeng/accordion'; import { toSignal } from '@angular/core/rxjs-interop'; -import { IS_XSMALL } from '@osf/shared/utils/breakpoints.tokens'; -import { Router } from '@angular/router'; -import { ResourceTab } from '../search/models/resource-tab.enum'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { SearchComponent } from '../search/search.component'; +import { Router } from '@angular/router'; + +import { UserSelectors } from '@osf/core/store/user/user.selectors'; +import { ResetSearchState, SetIsMyProfile } from '@osf/features/search/store'; import { ResetFiltersState, SetCreator, } from '@osf/shared/components/resources/resource-filters/store/resource-filters.actions'; -import { ResetSearchState, SetIsMyProfile } from '@osf/features/search/store'; +import { IS_XSMALL } from '@osf/shared/utils/breakpoints.tokens'; + +import { ResourceTab } from '../search/models/resource-tab.enum'; +import { SearchComponent } from '../search/search.component'; @Component({ selector: 'osf-my-profile', diff --git a/src/app/features/my-projects/my-projects.component.ts b/src/app/features/my-projects/my-projects.component.ts index 9ad42a89d..2d410abbb 100644 --- a/src/app/features/my-projects/my-projects.component.ts +++ b/src/app/features/my-projects/my-projects.component.ts @@ -1,3 +1,14 @@ +import { Store } from '@ngxs/store'; + +import type { SortEvent } from 'primeng/api'; +import { DropdownModule } from 'primeng/dropdown'; +import { DialogService } from 'primeng/dynamicdialog'; +import { Select } from 'primeng/select'; +import { TablePageEvent } from 'primeng/table'; +import { Tab, TabList, TabPanel, TabPanels, Tabs } from 'primeng/tabs'; + +import { debounceTime, distinctUntilChanged, Subject } from 'rxjs'; + import { ChangeDetectionStrategy, Component, @@ -8,39 +19,32 @@ import { signal, untracked, } from '@angular/core'; -import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; -import { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { IS_MEDIUM, IS_WEB, IS_XSMALL } from '@shared/utils/breakpoints.tokens'; -import { DropdownModule } from 'primeng/dropdown'; +import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop'; import { FormsModule } from '@angular/forms'; -import { Select } from 'primeng/select'; -import { Tab, TabList, TabPanel, TabPanels, Tabs } from 'primeng/tabs'; -import { TabOption } from '@shared/entities/tab-option.interface'; -import { TablePageEvent } from 'primeng/table'; -import type { SortEvent } from 'primeng/api'; -import { DialogService } from 'primeng/dynamicdialog'; -import { AddProjectFormComponent } from '@shared/components/add-project-form/add-project-form.component'; -import { Store } from '@ngxs/store'; import { ActivatedRoute, Router } from '@angular/router'; + +import { MY_PROJECTS_TABLE_PARAMS } from '@core/constants/my-projects-table.constants'; +import { parseQueryFilterParams } from '@core/helpers/http.helper'; +import { GetUserInstitutions } from '@osf/features/institutions/store'; +import { MyProjectsItem } from '@osf/features/my-projects/entities/my-projects.entities'; +import { MyProjectsSearchFilters } from '@osf/features/my-projects/entities/my-projects-search-filters.models'; import { - GetMyProjects, - MyProjectsSelectors, ClearMyProjects, - GetMyRegistrations, - GetMyPreprints, GetBookmarksCollectionId, GetMyBookmarks, + GetMyPreprints, + GetMyProjects, + GetMyRegistrations, + MyProjectsSelectors, } from '@osf/features/my-projects/store'; -import { debounceTime, distinctUntilChanged, Subject } from 'rxjs'; -import { MyProjectsSearchFilters } from '@osf/features/my-projects/entities/my-projects-search-filters.models'; -import { TableParameters } from '@shared/entities/table-parameters.interface'; -import { MY_PROJECTS_TABLE_PARAMS } from '@core/constants/my-projects-table.constants'; -import { parseQueryFilterParams } from '@core/helpers/http.helper'; -import { SortOrder } from '@shared/utils/sort-order.enum'; -import { MyProjectsItem } from '@osf/features/my-projects/entities/my-projects.entities'; import { QueryParams } from '@osf/shared/entities/query-params.interface'; +import { AddProjectFormComponent } from '@shared/components/add-project-form/add-project-form.component'; import { MyProjectsTableComponent } from '@shared/components/my-projects-table/my-projects-table.component'; -import { GetUserInstitutions } from '@osf/features/institutions/store'; +import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; +import { TabOption } from '@shared/entities/tab-option.interface'; +import { TableParameters } from '@shared/entities/table-parameters.interface'; +import { IS_MEDIUM, IS_WEB, IS_XSMALL } from '@shared/utils/breakpoints.tokens'; +import { SortOrder } from '@shared/utils/sort-order.enum'; @Component({ selector: 'osf-my-projects', diff --git a/src/app/features/my-projects/my-projects.service.ts b/src/app/features/my-projects/my-projects.service.ts index 04844b8c5..94e9de06b 100644 --- a/src/app/features/my-projects/my-projects.service.ts +++ b/src/app/features/my-projects/my-projects.service.ts @@ -1,21 +1,25 @@ +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + import { inject, Injectable } from '@angular/core'; + import { JsonApiService } from '@core/services/json-api/json-api.service'; -import { Observable } from 'rxjs'; -import { MyProjectsSearchFilters } from '@osf/features/my-projects/entities/my-projects-search-filters.models'; -import { MyProjectsMapper } from '@osf/features/my-projects/mappers/my-projects.mapper'; import { - MyProjectsItemResponse, + MyProjectsItem, MyProjectsItemGetResponse, + MyProjectsItemResponse, MyProjectsJsonApiResponse, SparseCollectionsResponse, - MyProjectsItem, } from '@osf/features/my-projects/entities/my-projects.entities'; -import { map } from 'rxjs/operators'; -import { SortOrder } from '@shared/utils/sort-order.enum'; import { EndpointType } from '@osf/features/my-projects/entities/my-projects.types'; -import { CreateProjectPayload } from './entities/create-project.entities'; +import { MyProjectsSearchFilters } from '@osf/features/my-projects/entities/my-projects-search-filters.models'; +import { MyProjectsMapper } from '@osf/features/my-projects/mappers/my-projects.mapper'; +import { SortOrder } from '@shared/utils/sort-order.enum'; + import { environment } from '../../../environments/environment'; +import { CreateProjectPayload } from './entities/create-project.entities'; + @Injectable({ providedIn: 'root', }) diff --git a/src/app/features/my-projects/store/index.ts b/src/app/features/my-projects/store/index.ts index 48506c4af..26c7035b3 100644 --- a/src/app/features/my-projects/store/index.ts +++ b/src/app/features/my-projects/store/index.ts @@ -1,4 +1,4 @@ -export * from './my-projects.state'; export * from './my-projects.actions'; -export * from './my-projects.selectors'; export * from './my-projects.model'; +export * from './my-projects.selectors'; +export * from './my-projects.state'; diff --git a/src/app/features/my-projects/store/my-projects.selectors.ts b/src/app/features/my-projects/store/my-projects.selectors.ts index 97100f182..3c46dfd2d 100644 --- a/src/app/features/my-projects/store/my-projects.selectors.ts +++ b/src/app/features/my-projects/store/my-projects.selectors.ts @@ -1,7 +1,9 @@ import { Selector } from '@ngxs/store'; -import { MyProjectsStateModel } from './my-projects.model'; + import { MyProjectsState } from '@osf/features/my-projects/store/my-projects.state'; +import { MyProjectsStateModel } from './my-projects.model'; + export class MyProjectsSelectors { @Selector([MyProjectsState]) static getProjects(state: MyProjectsStateModel) { diff --git a/src/app/features/my-projects/store/my-projects.state.ts b/src/app/features/my-projects/store/my-projects.state.ts index afdca89b8..dc218e3a5 100644 --- a/src/app/features/my-projects/store/my-projects.state.ts +++ b/src/app/features/my-projects/store/my-projects.state.ts @@ -1,17 +1,21 @@ +import { Action, State, StateContext } from '@ngxs/store'; + +import { tap } from 'rxjs'; + import { inject, Injectable } from '@angular/core'; -import { State, Action, StateContext } from '@ngxs/store'; -import { MyProjectsStateModel } from './my-projects.model'; + +import { MyProjectsService } from '@osf/features/my-projects/my-projects.service'; + import { - GetMyProjects, - GetMyRegistrations, - GetMyPreprints, - GetMyBookmarks, - GetBookmarksCollectionId, ClearMyProjects, CreateProject, + GetBookmarksCollectionId, + GetMyBookmarks, + GetMyPreprints, + GetMyProjects, + GetMyRegistrations, } from './my-projects.actions'; -import { MyProjectsService } from '@osf/features/my-projects/my-projects.service'; -import { tap } from 'rxjs'; +import { MyProjectsStateModel } from './my-projects.model'; @State({ name: 'myProjects', diff --git a/src/app/features/project/files/file-detail/file-detail.component.ts b/src/app/features/project/files/file-detail/file-detail.component.ts index 9f167c124..f8fe6c7c3 100644 --- a/src/app/features/project/files/file-detail/file-detail.component.ts +++ b/src/app/features/project/files/file-detail/file-detail.component.ts @@ -1,7 +1,9 @@ +import { Button } from 'primeng/button'; + import { ChangeDetectionStrategy, Component, HostBinding } from '@angular/core'; -import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; import { RouterLink } from '@angular/router'; -import { Button } from 'primeng/button'; + +import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; @Component({ selector: 'osf-file-detail', diff --git a/src/app/features/project/files/project-files.component.ts b/src/app/features/project/files/project-files.component.ts index 947dd6897..859af024d 100644 --- a/src/app/features/project/files/project-files.component.ts +++ b/src/app/features/project/files/project-files.component.ts @@ -1,3 +1,10 @@ +import { Button } from 'primeng/button'; +import { DropdownModule } from 'primeng/dropdown'; +import { FloatLabel } from 'primeng/floatlabel'; +import { Select } from 'primeng/select'; +import { TableModule } from 'primeng/table'; + +import { DatePipe } from '@angular/common'; import { ChangeDetectionStrategy, Component, @@ -5,19 +12,14 @@ import { inject, signal, } from '@angular/core'; -import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; -import { TableModule } from 'primeng/table'; +import { Router } from '@angular/router'; + import { FileItem, FILES, } from '@osf/features/project/files/project-files.entities'; -import { Router } from '@angular/router'; -import { Select } from 'primeng/select'; -import { FloatLabel } from 'primeng/floatlabel'; import { SearchInputComponent } from '@shared/components/search-input/search-input.component'; -import { DropdownModule } from 'primeng/dropdown'; -import { Button } from 'primeng/button'; -import { DatePipe } from '@angular/common'; +import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; @Component({ selector: 'osf-project-files', diff --git a/src/app/features/project/metadata/project-metadata.component.ts b/src/app/features/project/metadata/project-metadata.component.ts index 2ef219f59..d553d5459 100644 --- a/src/app/features/project/metadata/project-metadata.component.ts +++ b/src/app/features/project/metadata/project-metadata.component.ts @@ -1,7 +1,9 @@ +import { Button } from 'primeng/button'; + import { ChangeDetectionStrategy, Component, HostBinding } from '@angular/core'; -import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; + import { metadataTemplates } from '@osf/features/project/metadata/metadata'; -import { Button } from 'primeng/button'; +import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; @Component({ selector: 'osf-project-metadata', diff --git a/src/app/features/project/overview/project-overview.component.ts b/src/app/features/project/overview/project-overview.component.ts index 5725fdaf5..bf562e2e5 100644 --- a/src/app/features/project/overview/project-overview.component.ts +++ b/src/app/features/project/overview/project-overview.component.ts @@ -1,7 +1,9 @@ -import { ChangeDetectionStrategy, Component, HostBinding } from '@angular/core'; -import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; import { Button } from 'primeng/button'; + import { NgOptimizedImage } from '@angular/common'; +import { ChangeDetectionStrategy, Component, HostBinding } from '@angular/core'; + +import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; @Component({ selector: 'osf-project-overview', diff --git a/src/app/features/project/project.component.ts b/src/app/features/project/project.component.ts index db9762c65..371f7a85a 100644 --- a/src/app/features/project/project.component.ts +++ b/src/app/features/project/project.component.ts @@ -1,12 +1,13 @@ +import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, Component, HostBinding, inject, } from '@angular/core'; -import { RouterOutlet } from '@angular/router'; -import { CommonModule } from '@angular/common'; import { toSignal } from '@angular/core/rxjs-interop'; +import { RouterOutlet } from '@angular/router'; + import { IS_WEB } from '@shared/utils/breakpoints.tokens'; @Component({ diff --git a/src/app/features/project/registrations/registration-card/registration-card.component.ts b/src/app/features/project/registrations/registration-card/registration-card.component.ts index 512080b9f..9cdc97def 100644 --- a/src/app/features/project/registrations/registration-card/registration-card.component.ts +++ b/src/app/features/project/registrations/registration-card/registration-card.component.ts @@ -1,16 +1,19 @@ +import { Button } from 'primeng/button'; +import { Card } from 'primeng/card'; +import { Tag } from 'primeng/tag'; + import { ChangeDetectionStrategy, Component, inject, input, } from '@angular/core'; -import { Card } from 'primeng/card'; -import { RegistrationCard } from './registration-card.interface'; -import { Button } from 'primeng/button'; -import { Tag } from 'primeng/tag'; import { toSignal } from '@angular/core/rxjs-interop'; + import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; +import { RegistrationCard } from './registration-card.interface'; + @Component({ selector: 'osf-registration-card', imports: [Card, Button, Tag], diff --git a/src/app/features/project/registrations/registrations.component.ts b/src/app/features/project/registrations/registrations.component.ts index 3b93be9a4..db7f05216 100644 --- a/src/app/features/project/registrations/registrations.component.ts +++ b/src/app/features/project/registrations/registrations.component.ts @@ -1,19 +1,21 @@ +import { DialogService } from 'primeng/dynamicdialog'; +import { Select } from 'primeng/select'; +import { Tab, TabList, TabPanel, TabPanels, Tabs } from 'primeng/tabs'; + import { ChangeDetectionStrategy, Component, inject, signal, } from '@angular/core'; -import { DialogService } from 'primeng/dynamicdialog'; import { toSignal } from '@angular/core/rxjs-interop'; -import { IS_MEDIUM, IS_WEB, IS_XSMALL } from '@shared/utils/breakpoints.tokens'; -import { TabOption } from '@shared/entities/tab-option.interface'; -import { RegistrationCardComponent } from '@osf/features/project/registrations/registration-card/registration-card.component'; -import { Select } from 'primeng/select'; -import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; -import { Tab, TabList, TabPanel, TabPanels, Tabs } from 'primeng/tabs'; import { FormsModule } from '@angular/forms'; + +import { RegistrationCardComponent } from '@osf/features/project/registrations/registration-card/registration-card.component'; import { RegistrationCard } from '@osf/features/project/registrations/registration-card/registration-card.interface'; +import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; +import { TabOption } from '@shared/entities/tab-option.interface'; +import { IS_MEDIUM, IS_WEB, IS_XSMALL } from '@shared/utils/breakpoints.tokens'; @Component({ selector: 'osf-registrations', diff --git a/src/app/features/search/mappers/search.mapper.ts b/src/app/features/search/mappers/search.mapper.ts index 7af9bb17b..32bdbe033 100644 --- a/src/app/features/search/mappers/search.mapper.ts +++ b/src/app/features/search/mappers/search.mapper.ts @@ -1,7 +1,7 @@ +import { LinkItem } from '@osf/features/search/models/link-item.entity'; import { ResourceItem } from '@osf/features/search/models/raw-models/resource-response.model'; import { Resource } from '@osf/features/search/models/resource.entity'; import { ResourceType } from '@osf/features/search/models/resource-type.enum'; -import { LinkItem } from '@osf/features/search/models/link-item.entity'; export function MapResources(rawItem: ResourceItem): Resource { return { diff --git a/src/app/features/search/models/resource.entity.ts b/src/app/features/search/models/resource.entity.ts index b193d3c1e..7329bd52d 100644 --- a/src/app/features/search/models/resource.entity.ts +++ b/src/app/features/search/models/resource.entity.ts @@ -1,5 +1,5 @@ -import { ResourceType } from '@osf/features/search/models/resource-type.enum'; import { LinkItem } from '@osf/features/search/models/link-item.entity'; +import { ResourceType } from '@osf/features/search/models/resource-type.enum'; export interface Resource { id: string; diff --git a/src/app/features/search/search.component.ts b/src/app/features/search/search.component.ts index 8f5b3cd9b..92f541fb2 100644 --- a/src/app/features/search/search.component.ts +++ b/src/app/features/search/search.component.ts @@ -1,3 +1,16 @@ +import { Store } from '@ngxs/store'; + +import { AccordionModule } from 'primeng/accordion'; +import { AutoCompleteModule } from 'primeng/autocomplete'; +import { Button } from 'primeng/button'; +import { DataViewModule } from 'primeng/dataview'; +import { DropdownModule } from 'primeng/dropdown'; +import { TableModule } from 'primeng/table'; +import { Tab, TabList, TabPanel, TabPanels, Tabs } from 'primeng/tabs'; + +import { debounceTime } from 'rxjs'; + +import { NgOptimizedImage } from '@angular/common'; import { ChangeDetectionStrategy, Component, @@ -7,19 +20,10 @@ import { signal, untracked, } from '@angular/core'; -import { SearchInputComponent } from '@shared/components/search-input/search-input.component'; -import { DropdownModule } from 'primeng/dropdown'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { Tab, TabList, TabPanel, TabPanels, Tabs } from 'primeng/tabs'; -import { NgOptimizedImage } from '@angular/common'; import { toObservable, toSignal } from '@angular/core/rxjs-interop'; -import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; -import { AutoCompleteModule } from 'primeng/autocomplete'; -import { AccordionModule } from 'primeng/accordion'; -import { TableModule } from 'primeng/table'; -import { DataViewModule } from 'primeng/dataview'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; + import { ResourceTab } from '@osf/features/search/models/resource-tab.enum'; -import { Store } from '@ngxs/store'; import { GetResources, ResetSearchState, @@ -27,14 +31,14 @@ import { SetResourceTab, SetSearchText, } from '@osf/features/search/store'; +import { GetAllOptions } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.actions'; import { ResetFiltersState, ResourceFiltersSelectors, } from '@shared/components/resources/resource-filters/store'; -import { debounceTime } from 'rxjs'; -import { GetAllOptions } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.actions'; -import { Button } from 'primeng/button'; import { ResourcesWrapperComponent } from '@shared/components/resources/resources-wrapper/resources-wrapper.component'; +import { SearchInputComponent } from '@shared/components/search-input/search-input.component'; +import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; @Component({ selector: 'osf-search', diff --git a/src/app/features/search/search.service.ts b/src/app/features/search/search.service.ts index c7e8bb462..2104ff424 100644 --- a/src/app/features/search/search.service.ts +++ b/src/app/features/search/search.service.ts @@ -1,11 +1,14 @@ +import { map, Observable } from 'rxjs'; + import { inject, Injectable } from '@angular/core'; + import { JsonApiService } from '@core/services/json-api/json-api.service'; -import { map, Observable } from 'rxjs'; -import { environment } from '../../../environments/environment'; import { MapResources } from '@osf/features/search/mappers/search.mapper'; import { IndexCardSearch } from '@osf/features/search/models/raw-models/index-card-search.model'; import { ResourcesData } from '@osf/features/search/models/resources-data.entity'; +import { environment } from '../../../environments/environment'; + @Injectable({ providedIn: 'root', }) diff --git a/src/app/features/search/store/search.selectors.ts b/src/app/features/search/store/search.selectors.ts index 8d7f9390f..f87cfa12f 100644 --- a/src/app/features/search/store/search.selectors.ts +++ b/src/app/features/search/store/search.selectors.ts @@ -1,8 +1,9 @@ -import { SearchState } from '@osf/features/search/store/search.state'; import { Selector } from '@ngxs/store'; -import { SearchStateModel } from '@osf/features/search/store/search.model'; + import { Resource } from '@osf/features/search/models/resource.entity'; import { ResourceTab } from '@osf/features/search/models/resource-tab.enum'; +import { SearchStateModel } from '@osf/features/search/store/search.model'; +import { SearchState } from '@osf/features/search/store/search.state'; export class SearchSelectors { @Selector([SearchState]) diff --git a/src/app/features/search/store/search.state.ts b/src/app/features/search/store/search.state.ts index 690fd5358..08086f79a 100644 --- a/src/app/features/search/store/search.state.ts +++ b/src/app/features/search/store/search.state.ts @@ -1,7 +1,10 @@ +import { Action, State, StateContext, Store } from '@ngxs/store'; + +import { tap } from 'rxjs'; + import { inject, Injectable } from '@angular/core'; + import { SearchService } from '@osf/features/search/search.service'; -import { SearchStateModel } from '@osf/features/search/store/search.model'; -import { Action, State, StateContext, Store } from '@ngxs/store'; import { GetResources, GetResourcesByLink, @@ -11,12 +14,12 @@ import { SetSearchText, SetSortBy, } from '@osf/features/search/store/search.actions'; -import { tap } from 'rxjs'; -import { ResourceFiltersSelectors } from '@shared/components/resources/resource-filters/store'; -import { addFiltersParams } from '@shared/components/resources/resource-filters/utils/add-filters-params.helper'; +import { SearchStateModel } from '@osf/features/search/store/search.model'; import { SearchSelectors } from '@osf/features/search/store/search.selectors'; -import { getResourceTypes } from '@osf/features/search/utils/helpers/get-resource-types.helper'; import { searchStateDefaults } from '@osf/features/search/utils/data'; +import { getResourceTypes } from '@osf/features/search/utils/helpers/get-resource-types.helper'; +import { ResourceFiltersSelectors } from '@shared/components/resources/resource-filters/store'; +import { addFiltersParams } from '@shared/components/resources/resource-filters/utils/add-filters-params.helper'; @Injectable() @State({ diff --git a/src/app/features/settings/account-settings/account-settings.component.ts b/src/app/features/settings/account-settings/account-settings.component.ts index 292161146..5b53a2b00 100644 --- a/src/app/features/settings/account-settings/account-settings.component.ts +++ b/src/app/features/settings/account-settings/account-settings.component.ts @@ -1,20 +1,22 @@ -import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; import { Button } from 'primeng/button'; -import { Select } from 'primeng/select'; -import { MOCK_COUNTRIES } from '@osf/features/settings/account-settings/account-settings.const'; +import { DialogService, DynamicDialogRef } from 'primeng/dynamicdialog'; +import { InputText } from 'primeng/inputtext'; +import { Message } from 'primeng/message'; import { RadioButton } from 'primeng/radiobutton'; +import { Select } from 'primeng/select'; + +import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; +import { toSignal } from '@angular/core/rxjs-interop'; import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; + import { AccountSettingsPasswordForm, AccountSettingsPasswordFormControls, } from '@osf/features/settings/account-settings/account.settings.entities'; -import { InputText } from 'primeng/inputtext'; -import { Message } from 'primeng/message'; -import { DialogService, DynamicDialogRef } from 'primeng/dynamicdialog'; +import { MOCK_COUNTRIES } from '@osf/features/settings/account-settings/account-settings.const'; import { AddEmailComponent } from '@osf/features/settings/account-settings/add-email/add-email.component'; import { DeactivateAccountComponent } from '@osf/features/settings/account-settings/deactivate-account/deactivate-account/deactivate-account.component'; import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; -import { toSignal } from '@angular/core/rxjs-interop'; import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; @Component({ diff --git a/src/app/features/settings/account-settings/add-email/add-email.component.ts b/src/app/features/settings/account-settings/add-email/add-email.component.ts index 1ad25252e..061492f3f 100644 --- a/src/app/features/settings/account-settings/add-email/add-email.component.ts +++ b/src/app/features/settings/account-settings/add-email/add-email.component.ts @@ -1,8 +1,9 @@ -import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; +import { Button } from 'primeng/button'; import { DynamicDialogRef } from 'primeng/dynamicdialog'; -import { FormControl, ReactiveFormsModule, Validators } from '@angular/forms'; import { InputText } from 'primeng/inputtext'; -import { Button } from 'primeng/button'; + +import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; +import { FormControl, ReactiveFormsModule, Validators } from '@angular/forms'; @Component({ selector: 'osf-add-email', diff --git a/src/app/features/settings/account-settings/deactivate-account/deactivate-account/deactivate-account.component.ts b/src/app/features/settings/account-settings/deactivate-account/deactivate-account/deactivate-account.component.ts index 63461a312..84880cbc1 100644 --- a/src/app/features/settings/account-settings/deactivate-account/deactivate-account/deactivate-account.component.ts +++ b/src/app/features/settings/account-settings/deactivate-account/deactivate-account/deactivate-account.component.ts @@ -1,6 +1,7 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core'; import { Button } from 'primeng/button'; +import { ChangeDetectionStrategy, Component } from '@angular/core'; + @Component({ selector: 'osf-deactivate-account', imports: [Button], diff --git a/src/app/features/settings/addons/addon-card-list/addon-card-list.component.ts b/src/app/features/settings/addons/addon-card-list/addon-card-list.component.ts index 802504dfd..710cd8786 100644 --- a/src/app/features/settings/addons/addon-card-list/addon-card-list.component.ts +++ b/src/app/features/settings/addons/addon-card-list/addon-card-list.component.ts @@ -1,4 +1,5 @@ import { Component, input } from '@angular/core'; + import { AddonCardComponent } from '@osf/features/settings/addons/addon-card/addon-card.component'; import { Addon, diff --git a/src/app/features/settings/addons/addon-card/addon-card.component.ts b/src/app/features/settings/addons/addon-card/addon-card.component.ts index 70c721575..db682677c 100644 --- a/src/app/features/settings/addons/addon-card/addon-card.component.ts +++ b/src/app/features/settings/addons/addon-card/addon-card.component.ts @@ -1,16 +1,19 @@ -import { Component, computed, inject, input, signal } from '@angular/core'; +import { Store } from '@ngxs/store'; + import { Button } from 'primeng/button'; -import { Router } from '@angular/router'; +import { DialogModule } from 'primeng/dialog'; + +import { NgClass } from '@angular/common'; +import { Component, computed, inject, input, signal } from '@angular/core'; import { toSignal } from '@angular/core/rxjs-interop'; -import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; +import { Router } from '@angular/router'; + import { Addon, AuthorizedAddon, } from '@osf/features/settings/addons/entities/addons.entities'; -import { NgClass } from '@angular/common'; -import { Store } from '@ngxs/store'; import { DeleteAuthorizedAddon } from '@osf/features/settings/addons/store'; -import { DialogModule } from 'primeng/dialog'; +import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; @Component({ selector: 'osf-addon-card', diff --git a/src/app/features/settings/addons/addons.component.ts b/src/app/features/settings/addons/addons.component.ts index e830e9d45..b7861bc89 100644 --- a/src/app/features/settings/addons/addons.component.ts +++ b/src/app/features/settings/addons/addons.component.ts @@ -1,31 +1,34 @@ +import { Store } from '@ngxs/store'; + +import { AutoCompleteModule } from 'primeng/autocomplete'; +import { SelectModule } from 'primeng/select'; +import { Tab, TabList, TabPanel, TabPanels, Tabs } from 'primeng/tabs'; + import { ChangeDetectionStrategy, Component, computed, - signal, - inject, effect, + inject, + signal, } from '@angular/core'; -import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; -import { Tab, TabList, TabPanel, TabPanels, Tabs } from 'primeng/tabs'; -import { SearchInputComponent } from '@shared/components/search-input/search-input.component'; -import { AutoCompleteModule } from 'primeng/autocomplete'; -import { AddonCardListComponent } from '@osf/features/settings/addons/addon-card-list/addon-card-list.component'; import { toSignal } from '@angular/core/rxjs-interop'; -import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; -import { SelectModule } from 'primeng/select'; import { FormsModule } from '@angular/forms'; -import { Store } from '@ngxs/store'; + +import { UserSelectors } from '@core/store/user/user.selectors'; +import { AddonCardListComponent } from '@osf/features/settings/addons/addon-card-list/addon-card-list.component'; import { - GetStorageAddons, - GetCitationAddons, AddonsSelectors, - GetAuthorizedStorageAddons, - GetAuthorizedCitationAddons, GetAddonsUserReference, + GetAuthorizedCitationAddons, + GetAuthorizedStorageAddons, + GetCitationAddons, + GetStorageAddons, } from '@osf/features/settings/addons/store'; +import { SearchInputComponent } from '@shared/components/search-input/search-input.component'; +import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; import { SelectOption } from '@shared/entities/select-option.interface'; -import { UserSelectors } from '@core/store/user/user.selectors'; +import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; @Component({ selector: 'osf-addons', diff --git a/src/app/features/settings/addons/addons.service.ts b/src/app/features/settings/addons/addons.service.ts index fd27a95de..ffc6b895b 100644 --- a/src/app/features/settings/addons/addons.service.ts +++ b/src/app/features/settings/addons/addons.service.ts @@ -1,20 +1,24 @@ +import { Store } from '@ngxs/store'; + +import { map, Observable } from 'rxjs'; + import { inject, Injectable } from '@angular/core'; + +import { JsonApiResponse } from '@core/services/json-api/json-api.entity'; import { JsonApiService } from '@core/services/json-api/json-api.service'; -import { map, Observable } from 'rxjs'; +import { UserSelectors } from '@core/store/user/user.selectors'; +import { AddonMapper } from '@osf/features/settings/addons/addon.mapper'; import { Addon, AddonGetResponse, + AddonRequest, + AddonResponse, AuthorizedAddon, AuthorizedAddonGetResponse, IncludedAddonData, - AddonRequest, UserReference, - AddonResponse, } from '@osf/features/settings/addons/entities/addons.entities'; -import { AddonMapper } from '@osf/features/settings/addons/addon.mapper'; -import { Store } from '@ngxs/store'; -import { JsonApiResponse } from '@core/services/json-api/json-api.entity'; -import { UserSelectors } from '@core/store/user/user.selectors'; + import { environment } from '../../../../environments/environment'; @Injectable({ diff --git a/src/app/features/settings/addons/connect-addon/connect-addon.component.ts b/src/app/features/settings/addons/connect-addon/connect-addon.component.ts index 993b1370c..056c9f976 100644 --- a/src/app/features/settings/addons/connect-addon/connect-addon.component.ts +++ b/src/app/features/settings/addons/connect-addon/connect-addon.component.ts @@ -1,3 +1,13 @@ +import { Store } from '@ngxs/store'; + +import { Button } from 'primeng/button'; +import { Card } from 'primeng/card'; +import { InputText } from 'primeng/inputtext'; +import { Password } from 'primeng/password'; +import { StepPanel, StepPanels, Stepper } from 'primeng/stepper'; +import { TableModule } from 'primeng/table'; + +import { NgClass } from '@angular/common'; import { Component, computed, @@ -6,40 +16,34 @@ import { signal, viewChild, } from '@angular/core'; -import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; -import { StepPanel, StepPanels, Stepper } from 'primeng/stepper'; -import { Button } from 'primeng/button'; -import { TableModule } from 'primeng/table'; -import { RouterLink, Router } from '@angular/router'; -import { NgClass } from '@angular/common'; -import { Card } from 'primeng/card'; import { - FormsModule, FormBuilder, FormGroup, + FormsModule, ReactiveFormsModule, Validators, } from '@angular/forms'; -import { ADDON_TERMS as addonTerms } from '../utils/addon-terms.const'; +import { Router, RouterLink } from '@angular/router'; + +import { + AddonForm, + AddonFormControls, +} from '@osf/features/settings/addons/entities/addon-form.entities'; +import { AddonTerm } from '@osf/features/settings/addons/entities/addon-terms.interface'; import { Addon, - AuthorizedAddon, AddonRequest, + AuthorizedAddon, } from '@osf/features/settings/addons/entities/addons.entities'; import { CredentialsFormat } from '@osf/features/settings/addons/entities/credentials-format.enum'; -import { InputText } from 'primeng/inputtext'; -import { Password } from 'primeng/password'; -import { Store } from '@ngxs/store'; import { AddonsSelectors, CreateAuthorizedAddon, UpdateAuthorizedAddon, } from '@osf/features/settings/addons/store'; -import { - AddonForm, - AddonFormControls, -} from '@osf/features/settings/addons/entities/addon-form.entities'; -import { AddonTerm } from '@osf/features/settings/addons/entities/addon-terms.interface'; +import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; + +import { ADDON_TERMS as addonTerms } from '../utils/addon-terms.const'; @Component({ selector: 'osf-connect-addon', diff --git a/src/app/features/settings/addons/store/addons.models.ts b/src/app/features/settings/addons/store/addons.models.ts index e2095fdb3..8e4815657 100644 --- a/src/app/features/settings/addons/store/addons.models.ts +++ b/src/app/features/settings/addons/store/addons.models.ts @@ -1,7 +1,7 @@ import { Addon, - AuthorizedAddon, AddonResponse, + AuthorizedAddon, UserReference, } from '@osf/features/settings/addons/entities/addons.entities'; diff --git a/src/app/features/settings/addons/store/addons.selectors.ts b/src/app/features/settings/addons/store/addons.selectors.ts index 644832588..27bca5595 100644 --- a/src/app/features/settings/addons/store/addons.selectors.ts +++ b/src/app/features/settings/addons/store/addons.selectors.ts @@ -1,8 +1,10 @@ import { Selector } from '@ngxs/store'; -import { AddonsStateModel } from './addons.models'; + import { Addon } from '@osf/features/settings/addons/entities/addons.entities'; import { AddonsState } from '@osf/features/settings/addons/store/addons.state'; +import { AddonsStateModel } from './addons.models'; + export class AddonsSelectors { @Selector([AddonsState]) static getStorageAddons(state: AddonsStateModel): Addon[] { diff --git a/src/app/features/settings/addons/store/addons.state.ts b/src/app/features/settings/addons/store/addons.state.ts index 3eaba4860..4424ba867 100644 --- a/src/app/features/settings/addons/store/addons.state.ts +++ b/src/app/features/settings/addons/store/addons.state.ts @@ -1,19 +1,23 @@ +import { Action, State, StateContext } from '@ngxs/store'; + +import { Observable, switchMap, tap } from 'rxjs'; + import { inject, Injectable } from '@angular/core'; -import { State, Action, StateContext } from '@ngxs/store'; + import { AddonsService } from '@osf/features/settings/addons/addons.service'; +import { AddonResponse } from '@osf/features/settings/addons/entities/addons.entities'; + import { + CreateAuthorizedAddon, + DeleteAuthorizedAddon, + GetAddonsUserReference, + GetAuthorizedCitationAddons, + GetAuthorizedStorageAddons, GetCitationAddons, GetStorageAddons, - GetAuthorizedStorageAddons, - GetAuthorizedCitationAddons, - GetAddonsUserReference, - DeleteAuthorizedAddon, - CreateAuthorizedAddon, UpdateAuthorizedAddon, } from './addons.actions'; -import { Observable, switchMap, tap } from 'rxjs'; import { AddonsStateModel } from './addons.models'; -import { AddonResponse } from '@osf/features/settings/addons/entities/addons.entities'; @State({ name: 'addons', diff --git a/src/app/features/settings/addons/store/index.ts b/src/app/features/settings/addons/store/index.ts index 056a13928..513110f05 100644 --- a/src/app/features/settings/addons/store/index.ts +++ b/src/app/features/settings/addons/store/index.ts @@ -1,4 +1,4 @@ -export * from './addons.state'; export * from './addons.actions'; export * from './addons.models'; export * from './addons.selectors'; +export * from './addons.state'; diff --git a/src/app/features/settings/developer-apps/developer-app-add-edit-form/developer-app-add-edit-form.component.ts b/src/app/features/settings/developer-apps/developer-app-add-edit-form/developer-app-add-edit-form.component.ts index 85fb5054b..9eb5d0a39 100644 --- a/src/app/features/settings/developer-apps/developer-app-add-edit-form/developer-app-add-edit-form.component.ts +++ b/src/app/features/settings/developer-apps/developer-app-add-edit-form/developer-app-add-edit-form.component.ts @@ -1,3 +1,10 @@ +import { Store } from '@ngxs/store'; + +import { Button } from 'primeng/button'; +import { DynamicDialogRef } from 'primeng/dynamicdialog'; +import { InputText } from 'primeng/inputtext'; + +import { NgClass } from '@angular/common'; import { ChangeDetectionStrategy, Component, @@ -5,33 +12,29 @@ import { input, OnInit, } from '@angular/core'; -import { DynamicDialogRef } from 'primeng/dynamicdialog'; -import { Button } from 'primeng/button'; -import { InputText } from 'primeng/inputtext'; +import { toSignal } from '@angular/core/rxjs-interop'; import { FormControl, FormGroup, ReactiveFormsModule, Validators, } from '@angular/forms'; +import { Router } from '@angular/router'; + +import { linkValidator } from '@core/helpers/link-validator.helper'; import { DeveloperAppForm, DeveloperAppFormFormControls, } from '@osf/features/settings/developer-apps/entities/developer-app-form.entities'; -import { linkValidator } from '@core/helpers/link-validator.helper'; -import { Store } from '@ngxs/store'; -import { Router } from '@angular/router'; import { DeveloperApp, DeveloperAppCreateUpdate, } from '@osf/features/settings/developer-apps/entities/developer-apps.models'; -import { toSignal } from '@angular/core/rxjs-interop'; -import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; -import { NgClass } from '@angular/common'; import { CreateDeveloperApp, UpdateDeveloperApp, } from '@osf/features/settings/developer-apps/store'; +import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; @Component({ selector: 'osf-developer-app-add-edit-form', diff --git a/src/app/features/settings/developer-apps/developer-app-details/developer-app-details.component.ts b/src/app/features/settings/developer-apps/developer-app-details/developer-app-details.component.ts index e5c385235..416992fc8 100644 --- a/src/app/features/settings/developer-apps/developer-app-details/developer-app-details.component.ts +++ b/src/app/features/settings/developer-apps/developer-app-details/developer-app-details.component.ts @@ -1,3 +1,16 @@ +import { Store } from '@ngxs/store'; + +import { ConfirmationService } from 'primeng/api'; +import { Button } from 'primeng/button'; +import { Card } from 'primeng/card'; +import { DialogService, DynamicDialogRef } from 'primeng/dynamicdialog'; +import { IconField } from 'primeng/iconfield'; +import { InputIcon } from 'primeng/inputicon'; +import { InputText } from 'primeng/inputtext'; + +import { map, of, switchMap, timer } from 'rxjs'; + +import { CdkCopyToClipboard } from '@angular/cdk/clipboard'; import { ChangeDetectionStrategy, Component, @@ -6,28 +19,19 @@ import { inject, signal, } from '@angular/core'; -import { Button } from 'primeng/button'; -import { Card } from 'primeng/card'; -import { ActivatedRoute, Router, RouterLink } from '@angular/router'; -import { InputText } from 'primeng/inputtext'; -import { IconField } from 'primeng/iconfield'; -import { InputIcon } from 'primeng/inputicon'; -import { CdkCopyToClipboard } from '@angular/cdk/clipboard'; -import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { ConfirmationService } from 'primeng/api'; -import { defaultConfirmationConfig } from '@shared/helpers/default-confirmation-config.helper'; -import { map, of, switchMap, timer } from 'rxjs'; -import { Store } from '@ngxs/store'; +import { ActivatedRoute, Router, RouterLink } from '@angular/router'; + +import { DeveloperAppAddEditFormComponent } from '@osf/features/settings/developer-apps/developer-app-add-edit-form/developer-app-add-edit-form.component'; import { DeleteDeveloperApp, DeveloperAppsSelectors, GetDeveloperAppDetails, ResetClientSecret, } from '@osf/features/settings/developer-apps/store'; -import { DeveloperAppAddEditFormComponent } from '@osf/features/settings/developer-apps/developer-app-add-edit-form/developer-app-add-edit-form.component'; -import { DialogService, DynamicDialogRef } from 'primeng/dynamicdialog'; +import { defaultConfirmationConfig } from '@shared/helpers/default-confirmation-config.helper'; +import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; @Component({ selector: 'osf-developer-application-details', diff --git a/src/app/features/settings/developer-apps/developer-app.mapper.ts b/src/app/features/settings/developer-apps/developer-app.mapper.ts index f1f546730..bdd607772 100644 --- a/src/app/features/settings/developer-apps/developer-app.mapper.ts +++ b/src/app/features/settings/developer-apps/developer-app.mapper.ts @@ -1,8 +1,8 @@ import { DeveloperApp, DeveloperAppCreateRequest, - DeveloperAppGetResponse, DeveloperAppCreateUpdate, + DeveloperAppGetResponse, DeveloperAppUpdateRequest, } from '@osf/features/settings/developer-apps/entities/developer-apps.models'; diff --git a/src/app/features/settings/developer-apps/developer-apps-container.component.ts b/src/app/features/settings/developer-apps/developer-apps-container.component.ts index 862a717f9..d2283cd87 100644 --- a/src/app/features/settings/developer-apps/developer-apps-container.component.ts +++ b/src/app/features/settings/developer-apps/developer-apps-container.component.ts @@ -1,11 +1,14 @@ +import { DialogService } from 'primeng/dynamicdialog'; + +import { map } from 'rxjs'; + import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; +import { toSignal } from '@angular/core/rxjs-interop'; import { Router, RouterOutlet } from '@angular/router'; + +import { DeveloperAppAddEditFormComponent } from '@osf/features/settings/developer-apps/developer-app-add-edit-form/developer-app-add-edit-form.component'; import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; -import { DialogService } from 'primeng/dynamicdialog'; import { IS_MEDIUM, IS_XSMALL } from '@shared/utils/breakpoints.tokens'; -import { toSignal } from '@angular/core/rxjs-interop'; -import { map } from 'rxjs'; -import { DeveloperAppAddEditFormComponent } from '@osf/features/settings/developer-apps/developer-app-add-edit-form/developer-app-add-edit-form.component'; @Component({ selector: 'osf-developer-apps', diff --git a/src/app/features/settings/developer-apps/developer-apps-list/developer-apps-list.component.ts b/src/app/features/settings/developer-apps/developer-apps-list/developer-apps-list.component.ts index 21b8bbc12..7ee83f7c5 100644 --- a/src/app/features/settings/developer-apps/developer-apps-list/developer-apps-list.component.ts +++ b/src/app/features/settings/developer-apps/developer-apps-list/developer-apps-list.component.ts @@ -1,3 +1,10 @@ +import { Store } from '@ngxs/store'; + +import { ConfirmationService } from 'primeng/api'; +import { Button } from 'primeng/button'; +import { Card } from 'primeng/card'; +import { Skeleton } from 'primeng/skeleton'; + import { ChangeDetectionStrategy, Component, @@ -5,21 +12,17 @@ import { OnInit, signal, } from '@angular/core'; -import { Button } from 'primeng/button'; -import { Card } from 'primeng/card'; -import { RouterLink } from '@angular/router'; -import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; import { toSignal } from '@angular/core/rxjs-interop'; -import { defaultConfirmationConfig } from '@shared/helpers/default-confirmation-config.helper'; -import { ConfirmationService } from 'primeng/api'; -import { Store } from '@ngxs/store'; +import { RouterLink } from '@angular/router'; + +import { DeveloperApp } from '@osf/features/settings/developer-apps/entities/developer-apps.models'; import { DeleteDeveloperApp, DeveloperAppsSelectors, GetDeveloperApps, } from '@osf/features/settings/developer-apps/store'; -import { DeveloperApp } from '@osf/features/settings/developer-apps/entities/developer-apps.models'; -import { Skeleton } from 'primeng/skeleton'; +import { defaultConfirmationConfig } from '@shared/helpers/default-confirmation-config.helper'; +import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; @Component({ selector: 'osf-developer-applications-list', diff --git a/src/app/features/settings/developer-apps/developer-apps.route.ts b/src/app/features/settings/developer-apps/developer-apps.route.ts index 0e3c87d52..b3e8f176f 100644 --- a/src/app/features/settings/developer-apps/developer-apps.route.ts +++ b/src/app/features/settings/developer-apps/developer-apps.route.ts @@ -1,4 +1,5 @@ import { Route } from '@angular/router'; + import { DeveloperAppsContainerComponent } from '@osf/features/settings/developer-apps/developer-apps-container.component'; export const developerAppsRoute: Route = { diff --git a/src/app/features/settings/developer-apps/developer-apps.service.ts b/src/app/features/settings/developer-apps/developer-apps.service.ts index 8097b61f9..fc51c4589 100644 --- a/src/app/features/settings/developer-apps/developer-apps.service.ts +++ b/src/app/features/settings/developer-apps/developer-apps.service.ts @@ -1,13 +1,15 @@ -import { inject, Injectable } from '@angular/core'; -import { JsonApiService } from '@core/services/json-api/json-api.service'; import { map, Observable } from 'rxjs'; + +import { inject, Injectable } from '@angular/core'; + import { JsonApiResponse } from '@core/services/json-api/json-api.entity'; +import { JsonApiService } from '@core/services/json-api/json-api.service'; +import { DeveloperAppMapper } from '@osf/features/settings/developer-apps/developer-app.mapper'; import { DeveloperApp, - DeveloperAppGetResponse, DeveloperAppCreateUpdate, + DeveloperAppGetResponse, } from '@osf/features/settings/developer-apps/entities/developer-apps.models'; -import { DeveloperAppMapper } from '@osf/features/settings/developer-apps/developer-app.mapper'; @Injectable({ providedIn: 'root', diff --git a/src/app/features/settings/developer-apps/entities/developer-app-form.entities.ts b/src/app/features/settings/developer-apps/entities/developer-app-form.entities.ts index 967725a85..f0d2f2d22 100644 --- a/src/app/features/settings/developer-apps/entities/developer-app-form.entities.ts +++ b/src/app/features/settings/developer-apps/entities/developer-app-form.entities.ts @@ -1,4 +1,5 @@ import { FormControl, FormGroup } from '@angular/forms'; + import { StringOrNull } from '@core/helpers/types.helper'; export enum DeveloperAppFormFormControls { diff --git a/src/app/features/settings/developer-apps/store/developer-apps.selectors.ts b/src/app/features/settings/developer-apps/store/developer-apps.selectors.ts index d06b5fe17..e458a4bba 100644 --- a/src/app/features/settings/developer-apps/store/developer-apps.selectors.ts +++ b/src/app/features/settings/developer-apps/store/developer-apps.selectors.ts @@ -1,7 +1,8 @@ import { Selector } from '@ngxs/store'; -import { DeveloperAppsStateModel } from '@osf/features/settings/developer-apps/store/developer-apps.state-model'; -import { DeveloperAppsState } from '@osf/features/settings/developer-apps/store/developer-apps.state'; + import { DeveloperApp } from '@osf/features/settings/developer-apps/entities/developer-apps.models'; +import { DeveloperAppsState } from '@osf/features/settings/developer-apps/store/developer-apps.state'; +import { DeveloperAppsStateModel } from '@osf/features/settings/developer-apps/store/developer-apps.state-model'; export class DeveloperAppsSelectors { @Selector([DeveloperAppsState]) diff --git a/src/app/features/settings/developer-apps/store/developer-apps.state.ts b/src/app/features/settings/developer-apps/store/developer-apps.state.ts index 7c226ab43..33c8b6763 100644 --- a/src/app/features/settings/developer-apps/store/developer-apps.state.ts +++ b/src/app/features/settings/developer-apps/store/developer-apps.state.ts @@ -1,7 +1,19 @@ +import { Action, State, StateContext } from '@ngxs/store'; +import { + insertItem, + patch, + removeItem, + updateItem, +} from '@ngxs/store/operators'; + +import { of, tap } from 'rxjs'; + import { inject, Injectable } from '@angular/core'; -import { State, Action, StateContext } from '@ngxs/store'; -import { tap, of } from 'rxjs'; + +import { DeveloperApplicationsService } from '@osf/features/settings/developer-apps/developer-apps.service'; +import { DeveloperApp } from '@osf/features/settings/developer-apps/entities/developer-apps.models'; import { DeveloperAppsStateModel } from '@osf/features/settings/developer-apps/store/developer-apps.state-model'; + import { CreateDeveloperApp, DeleteDeveloperApp, @@ -10,14 +22,6 @@ import { ResetClientSecret, UpdateDeveloperApp, } from './developer-apps.actions'; -import { DeveloperApplicationsService } from '@osf/features/settings/developer-apps/developer-apps.service'; -import { DeveloperApp } from '@osf/features/settings/developer-apps/entities/developer-apps.models'; -import { - insertItem, - patch, - removeItem, - updateItem, -} from '@ngxs/store/operators'; @State({ name: 'developerApps', diff --git a/src/app/features/settings/developer-apps/store/index.ts b/src/app/features/settings/developer-apps/store/index.ts index 291fcbfa9..786ddb23f 100644 --- a/src/app/features/settings/developer-apps/store/index.ts +++ b/src/app/features/settings/developer-apps/store/index.ts @@ -1,4 +1,4 @@ -export * from './developer-apps.state'; export * from './developer-apps.actions'; -export * from './developer-apps.state-model'; export * from './developer-apps.selectors'; +export * from './developer-apps.state'; +export * from './developer-apps.state-model'; diff --git a/src/app/features/settings/index.ts b/src/app/features/settings/index.ts index 76665df0c..3cd1783d9 100644 --- a/src/app/features/settings/index.ts +++ b/src/app/features/settings/index.ts @@ -1,4 +1,3 @@ -export * from './account-settings/account-settings.route'; export * from './account-settings/account-settings.component'; - +export * from './account-settings/account-settings.route'; export * from './profile-settings/profile-settings.component'; diff --git a/src/app/features/settings/notifications/notifications.component.ts b/src/app/features/settings/notifications/notifications.component.ts index 675471cc4..37fcd27ae 100644 --- a/src/app/features/settings/notifications/notifications.component.ts +++ b/src/app/features/settings/notifications/notifications.component.ts @@ -1,9 +1,11 @@ -import { ChangeDetectionStrategy, Component, HostBinding } from '@angular/core'; -import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; -import { Checkbox } from 'primeng/checkbox'; import { Button } from 'primeng/button'; +import { Checkbox } from 'primeng/checkbox'; import { DropdownModule } from 'primeng/dropdown'; +import { ChangeDetectionStrategy, Component, HostBinding } from '@angular/core'; + +import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; + @Component({ selector: 'osf-notifications', imports: [SubHeaderComponent, Checkbox, Button, DropdownModule], diff --git a/src/app/features/settings/profile-settings/education/education.component.ts b/src/app/features/settings/profile-settings/education/education.component.ts index 1b9e8d0f2..968e0d7de 100644 --- a/src/app/features/settings/profile-settings/education/education.component.ts +++ b/src/app/features/settings/profile-settings/education/education.component.ts @@ -1,3 +1,8 @@ +import { Button } from 'primeng/button'; +import { Checkbox } from 'primeng/checkbox'; +import { DatePicker } from 'primeng/datepicker'; +import { InputText } from 'primeng/inputtext'; + import { ChangeDetectionStrategy, Component, @@ -10,10 +15,6 @@ import { FormControl, ReactiveFormsModule, } from '@angular/forms'; -import { Button } from 'primeng/button'; -import { InputText } from 'primeng/inputtext'; -import { DatePicker } from 'primeng/datepicker'; -import { Checkbox } from 'primeng/checkbox'; enum EducationFormControls { Institution = 'institution', diff --git a/src/app/features/settings/profile-settings/profile-settings.component.ts b/src/app/features/settings/profile-settings/profile-settings.component.ts index 85dff1adf..17689e1ee 100644 --- a/src/app/features/settings/profile-settings/profile-settings.component.ts +++ b/src/app/features/settings/profile-settings/profile-settings.component.ts @@ -1,15 +1,20 @@ +import { Button } from 'primeng/button'; +import { Checkbox } from 'primeng/checkbox'; +import { DatePicker } from 'primeng/datepicker'; +import { DropdownModule } from 'primeng/dropdown'; +import { InputGroup } from 'primeng/inputgroup'; +import { InputGroupAddon } from 'primeng/inputgroupaddon'; +import { InputText } from 'primeng/inputtext'; +import { Select } from 'primeng/select'; +import { Tab, TabList, TabPanel, TabPanels, Tabs } from 'primeng/tabs'; + import { ChangeDetectionStrategy, Component, inject, OnInit, } from '@angular/core'; -import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; -import { Tab, TabList, TabPanel, TabPanels, Tabs } from 'primeng/tabs'; -import { Button } from 'primeng/button'; -import { DropdownModule } from 'primeng/dropdown'; -import { InputText } from 'primeng/inputtext'; -import { UserSocialLink } from '@osf/features/settings/profile-settings/entities/user-social-link.entity'; +import { toSignal } from '@angular/core/rxjs-interop'; import { FormArray, FormBuilder, @@ -17,17 +22,14 @@ import { ReactiveFormsModule, Validators, } from '@angular/forms'; -import { InputGroup } from 'primeng/inputgroup'; -import { InputGroupAddon } from 'primeng/inputgroupaddon'; + import { socials } from '@osf/features/settings/profile-settings/data'; -import { Checkbox } from 'primeng/checkbox'; -import { DatePicker } from 'primeng/datepicker'; +import { EducationComponent } from '@osf/features/settings/profile-settings/education/education.component'; import { UserPosition } from '@osf/features/settings/profile-settings/entities/user-position.entity'; -import { toSignal } from '@angular/core/rxjs-interop'; -import { IS_XSMALL } from '@osf/shared/utils/breakpoints.tokens'; +import { UserSocialLink } from '@osf/features/settings/profile-settings/entities/user-social-link.entity'; import { TabOption } from '@osf/shared/entities/tab-option.interface'; -import { Select } from 'primeng/select'; -import { EducationComponent } from '@osf/features/settings/profile-settings/education/education.component'; +import { IS_XSMALL } from '@osf/shared/utils/breakpoints.tokens'; +import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; @Component({ selector: 'osf-profile-settings', diff --git a/src/app/features/settings/settings-container.component.ts b/src/app/features/settings/settings-container.component.ts index e5245d081..3a0af000d 100644 --- a/src/app/features/settings/settings-container.component.ts +++ b/src/app/features/settings/settings-container.component.ts @@ -1,6 +1,7 @@ import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; -import { RouterOutlet } from '@angular/router'; import { toSignal } from '@angular/core/rxjs-interop'; +import { RouterOutlet } from '@angular/router'; + import { IS_WEB } from '@shared/utils/breakpoints.tokens'; @Component({ diff --git a/src/app/features/settings/settings.routes.ts b/src/app/features/settings/settings.routes.ts index e0dc92474..cc01e4ac0 100644 --- a/src/app/features/settings/settings.routes.ts +++ b/src/app/features/settings/settings.routes.ts @@ -1,6 +1,7 @@ import { Routes } from '@angular/router'; -import { SettingsContainerComponent } from '@osf/features/settings/settings-container.component'; + import { developerAppsRoute } from '@osf/features/settings/developer-apps/developer-apps.route'; +import { SettingsContainerComponent } from '@osf/features/settings/settings-container.component'; import { tokensAppsRoute } from '@osf/features/settings/tokens/tokens.route'; export const settingsRoutes: Routes = [ diff --git a/src/app/features/settings/tokens/store/index.ts b/src/app/features/settings/tokens/store/index.ts index cecb04f7b..e32cc64ff 100644 --- a/src/app/features/settings/tokens/store/index.ts +++ b/src/app/features/settings/tokens/store/index.ts @@ -1,4 +1,4 @@ -export * from './tokens.state'; export * from './tokens.actions'; export * from './tokens.models'; export * from './tokens.selectors'; +export * from './tokens.state'; diff --git a/src/app/features/settings/tokens/store/tokens.selectors.ts b/src/app/features/settings/tokens/store/tokens.selectors.ts index d7e490e1e..1f4c08167 100644 --- a/src/app/features/settings/tokens/store/tokens.selectors.ts +++ b/src/app/features/settings/tokens/store/tokens.selectors.ts @@ -1,9 +1,11 @@ import { Selector } from '@ngxs/store'; -import { TokensStateModel } from './tokens.models'; + import { Scope } from '@osf/features/settings/tokens/entities/scope.interface'; import { Token } from '@osf/features/settings/tokens/entities/tokens.models'; import { TokensState } from '@osf/features/settings/tokens/store/tokens.state'; +import { TokensStateModel } from './tokens.models'; + export class TokensSelectors { @Selector([TokensState]) static getScopes(state: TokensStateModel): Scope[] { diff --git a/src/app/features/settings/tokens/store/tokens.state.ts b/src/app/features/settings/tokens/store/tokens.state.ts index 4c873a320..140ce00ac 100644 --- a/src/app/features/settings/tokens/store/tokens.state.ts +++ b/src/app/features/settings/tokens/store/tokens.state.ts @@ -1,17 +1,21 @@ +import { Action, State, StateContext, Store } from '@ngxs/store'; + +import { of, tap } from 'rxjs'; + import { inject, Injectable } from '@angular/core'; -import { State, Action, StateContext, Store } from '@ngxs/store'; -import { TokensStateModel } from './tokens.models'; + +import { Token } from '@osf/features/settings/tokens/entities/tokens.models'; import { TokensService } from '@osf/features/settings/tokens/tokens.service'; + import { + CreateToken, + DeleteToken, GetScopes, - GetTokens, GetTokenById, + GetTokens, UpdateToken, - DeleteToken, - CreateToken, } from './tokens.actions'; -import { tap, of } from 'rxjs'; -import { Token } from '@osf/features/settings/tokens/entities/tokens.models'; +import { TokensStateModel } from './tokens.models'; @State({ name: 'tokens', diff --git a/src/app/features/settings/tokens/token-add-edit-form/token-add-edit-form.component.ts b/src/app/features/settings/tokens/token-add-edit-form/token-add-edit-form.component.ts index ce72b235d..951b42079 100644 --- a/src/app/features/settings/tokens/token-add-edit-form/token-add-edit-form.component.ts +++ b/src/app/features/settings/tokens/token-add-edit-form/token-add-edit-form.component.ts @@ -1,3 +1,13 @@ +import { Store } from '@ngxs/store'; + +import { Button } from 'primeng/button'; +import { Checkbox } from 'primeng/checkbox'; +import { DialogService, DynamicDialogRef } from 'primeng/dynamicdialog'; +import { InputText } from 'primeng/inputtext'; + +import { map } from 'rxjs'; + +import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, Component, @@ -5,34 +15,28 @@ import { input, OnInit, } from '@angular/core'; -import { DialogService, DynamicDialogRef } from 'primeng/dynamicdialog'; -import { Button } from 'primeng/button'; -import { InputText } from 'primeng/inputtext'; -import { Checkbox } from 'primeng/checkbox'; +import { toSignal } from '@angular/core/rxjs-interop'; import { FormControl, FormGroup, ReactiveFormsModule, Validators, } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; + import { TokenForm, TokenFormControls, } from '@osf/features/settings/tokens/entities/token-form.entities'; -import { CommonModule } from '@angular/common'; -import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; -import { toSignal } from '@angular/core/rxjs-interop'; -import { Store } from '@ngxs/store'; import { Token } from '@osf/features/settings/tokens/entities/tokens.models'; -import { map } from 'rxjs'; -import { ActivatedRoute, Router } from '@angular/router'; -import { TokenCreatedDialogComponent } from '@osf/features/settings/tokens/token-created-dialog/token-created-dialog.component'; import { CreateToken, GetTokens, TokensSelectors, UpdateToken, } from '@osf/features/settings/tokens/store'; +import { TokenCreatedDialogComponent } from '@osf/features/settings/tokens/token-created-dialog/token-created-dialog.component'; +import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; @Component({ selector: 'osf-token-add-edit-form', diff --git a/src/app/features/settings/tokens/token-created-dialog/token-created-dialog.component.ts b/src/app/features/settings/tokens/token-created-dialog/token-created-dialog.component.ts index 7f9e28de7..18dff129a 100644 --- a/src/app/features/settings/tokens/token-created-dialog/token-created-dialog.component.ts +++ b/src/app/features/settings/tokens/token-created-dialog/token-created-dialog.component.ts @@ -1,19 +1,20 @@ +import { Button } from 'primeng/button'; +import { DynamicDialogConfig, DynamicDialogRef } from 'primeng/dynamicdialog'; +import { IconField } from 'primeng/iconfield'; +import { InputIcon } from 'primeng/inputicon'; +import { InputText } from 'primeng/inputtext'; + +import { ClipboardModule } from '@angular/cdk/clipboard'; import { + afterNextRender, ChangeDetectionStrategy, Component, + ElementRef, inject, input, signal, viewChild, - afterNextRender, - ElementRef, } from '@angular/core'; -import { Button } from 'primeng/button'; -import { DynamicDialogRef, DynamicDialogConfig } from 'primeng/dynamicdialog'; -import { InputText } from 'primeng/inputtext'; -import { IconField } from 'primeng/iconfield'; -import { InputIcon } from 'primeng/inputicon'; -import { ClipboardModule } from '@angular/cdk/clipboard'; @Component({ selector: 'osf-token-created-dialog', diff --git a/src/app/features/settings/tokens/token-details/token-details.component.ts b/src/app/features/settings/tokens/token-details/token-details.component.ts index 9da905733..6c5f56d4a 100644 --- a/src/app/features/settings/tokens/token-details/token-details.component.ts +++ b/src/app/features/settings/tokens/token-details/token-details.component.ts @@ -1,26 +1,30 @@ +import { Store } from '@ngxs/store'; + +import { ConfirmationService } from 'primeng/api'; +import { Button } from 'primeng/button'; +import { Card } from 'primeng/card'; +import { DialogService, DynamicDialogRef } from 'primeng/dynamicdialog'; + +import { map, of, switchMap } from 'rxjs'; + import { ChangeDetectionStrategy, Component, - inject, computed, + inject, } from '@angular/core'; -import { Button } from 'primeng/button'; -import { Card } from 'primeng/card'; -import { FormsModule } from '@angular/forms'; -import { RouterLink, ActivatedRoute, Router } from '@angular/router'; -import { ConfirmationService } from 'primeng/api'; -import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; import { toSignal } from '@angular/core/rxjs-interop'; -import { defaultConfirmationConfig } from '@shared/helpers/default-confirmation-config.helper'; -import { TokenAddEditFormComponent } from '@osf/features/settings/tokens/token-add-edit-form/token-add-edit-form.component'; -import { DialogService, DynamicDialogRef } from 'primeng/dynamicdialog'; -import { map, switchMap, of } from 'rxjs'; -import { Store } from '@ngxs/store'; -import { TokensSelectors } from '@osf/features/settings/tokens/store/tokens.selectors'; +import { FormsModule } from '@angular/forms'; +import { ActivatedRoute, Router, RouterLink } from '@angular/router'; + import { DeleteToken, GetTokenById, } from '@osf/features/settings/tokens/store/tokens.actions'; +import { TokensSelectors } from '@osf/features/settings/tokens/store/tokens.selectors'; +import { TokenAddEditFormComponent } from '@osf/features/settings/tokens/token-add-edit-form/token-add-edit-form.component'; +import { defaultConfirmationConfig } from '@shared/helpers/default-confirmation-config.helper'; +import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; @Component({ selector: 'osf-token-details', diff --git a/src/app/features/settings/tokens/tokens-list/tokens-list.component.ts b/src/app/features/settings/tokens/tokens-list/tokens-list.component.ts index dead9740f..9ff9b3e0e 100644 --- a/src/app/features/settings/tokens/tokens-list/tokens-list.component.ts +++ b/src/app/features/settings/tokens/tokens-list/tokens-list.component.ts @@ -1,3 +1,10 @@ +import { Store } from '@ngxs/store'; + +import { ConfirmationService } from 'primeng/api'; +import { Button } from 'primeng/button'; +import { Card } from 'primeng/card'; +import { Skeleton } from 'primeng/skeleton'; + import { ChangeDetectionStrategy, Component, @@ -5,21 +12,17 @@ import { OnInit, signal, } from '@angular/core'; -import { ConfirmationService } from 'primeng/api'; -import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; import { toSignal } from '@angular/core/rxjs-interop'; -import { Button } from 'primeng/button'; -import { Card } from 'primeng/card'; import { RouterLink } from '@angular/router'; + import { Token } from '@osf/features/settings/tokens/entities/tokens.models'; -import { defaultConfirmationConfig } from '@shared/helpers/default-confirmation-config.helper'; -import { Store } from '@ngxs/store'; import { DeleteToken, GetTokens, TokensSelectors, } from '@osf/features/settings/tokens/store'; -import { Skeleton } from 'primeng/skeleton'; +import { defaultConfirmationConfig } from '@shared/helpers/default-confirmation-config.helper'; +import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; @Component({ selector: 'osf-tokens-list', diff --git a/src/app/features/settings/tokens/tokens.component.ts b/src/app/features/settings/tokens/tokens.component.ts index ea3117cb0..984e64489 100644 --- a/src/app/features/settings/tokens/tokens.component.ts +++ b/src/app/features/settings/tokens/tokens.component.ts @@ -1,18 +1,22 @@ +import { Store } from '@ngxs/store'; + +import { DialogService } from 'primeng/dynamicdialog'; + +import { map } from 'rxjs'; + import { ChangeDetectionStrategy, Component, inject, OnInit, } from '@angular/core'; -import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; -import { DialogService } from 'primeng/dynamicdialog'; -import { IS_MEDIUM, IS_XSMALL } from '@shared/utils/breakpoints.tokens'; import { toSignal } from '@angular/core/rxjs-interop'; -import { TokenAddEditFormComponent } from '@osf/features/settings/tokens/token-add-edit-form/token-add-edit-form.component'; -import { RouterOutlet, Router } from '@angular/router'; -import { Store } from '@ngxs/store'; +import { Router, RouterOutlet } from '@angular/router'; + import { GetScopes } from '@osf/features/settings/tokens/store'; -import { map } from 'rxjs'; +import { TokenAddEditFormComponent } from '@osf/features/settings/tokens/token-add-edit-form/token-add-edit-form.component'; +import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; +import { IS_MEDIUM, IS_XSMALL } from '@shared/utils/breakpoints.tokens'; @Component({ selector: 'osf-tokens', diff --git a/src/app/features/settings/tokens/tokens.route.ts b/src/app/features/settings/tokens/tokens.route.ts index 76b317cb9..b029cb642 100644 --- a/src/app/features/settings/tokens/tokens.route.ts +++ b/src/app/features/settings/tokens/tokens.route.ts @@ -1,4 +1,5 @@ import { Route } from '@angular/router'; + import { TokensComponent } from '@osf/features/settings/tokens/tokens.component'; export const tokensAppsRoute: Route = { diff --git a/src/app/features/settings/tokens/tokens.service.ts b/src/app/features/settings/tokens/tokens.service.ts index 9f659a74b..5f5d1ef80 100644 --- a/src/app/features/settings/tokens/tokens.service.ts +++ b/src/app/features/settings/tokens/tokens.service.ts @@ -1,16 +1,20 @@ +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + import { inject, Injectable } from '@angular/core'; + +import { JsonApiResponse } from '@core/services/json-api/json-api.entity'; import { JsonApiService } from '@core/services/json-api/json-api.service'; -import { Observable } from 'rxjs'; +import { Scope } from '@osf/features/settings/tokens/entities/scope.interface'; +import { TokenMapper } from '@osf/features/settings/tokens/token.mapper'; + +import { environment } from '../../../../environments/environment'; + import { Token, TokenCreateResponse, TokenGetResponse, } from './entities/tokens.models'; -import { map } from 'rxjs/operators'; -import { TokenMapper } from '@osf/features/settings/tokens/token.mapper'; -import { Scope } from '@osf/features/settings/tokens/entities/scope.interface'; -import { JsonApiResponse } from '@core/services/json-api/json-api.entity'; -import { environment } from '../../../../environments/environment'; @Injectable({ providedIn: 'root', diff --git a/src/app/shared/components/add-project-form/add-project-form.component.ts b/src/app/shared/components/add-project-form/add-project-form.component.ts index 1a5759256..a3b342887 100644 --- a/src/app/shared/components/add-project-form/add-project-form.component.ts +++ b/src/app/shared/components/add-project-form/add-project-form.component.ts @@ -1,38 +1,41 @@ +import { Store } from '@ngxs/store'; + +import { ButtonModule } from 'primeng/button'; +import { CheckboxModule } from 'primeng/checkbox'; +import { DropdownModule } from 'primeng/dropdown'; +import { DynamicDialogRef } from 'primeng/dynamicdialog'; +import { InputTextModule } from 'primeng/inputtext'; +import { Select } from 'primeng/select'; +import { Textarea } from 'primeng/textarea'; + +import { CommonModule, NgOptimizedImage } from '@angular/common'; import { ChangeDetectionStrategy, Component, computed, inject, - signal, OnInit, + signal, } from '@angular/core'; -import { CommonModule, NgOptimizedImage } from '@angular/common'; +import { toSignal } from '@angular/core/rxjs-interop'; import { FormControl, FormGroup, ReactiveFormsModule, Validators, } from '@angular/forms'; -import { ButtonModule } from 'primeng/button'; -import { InputTextModule } from 'primeng/inputtext'; -import { DropdownModule } from 'primeng/dropdown'; -import { CheckboxModule } from 'primeng/checkbox'; -import { Select } from 'primeng/select'; -import { Textarea } from 'primeng/textarea'; -import { toSignal } from '@angular/core/rxjs-interop'; -import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; -import { DynamicDialogRef } from 'primeng/dynamicdialog'; -import { Store } from '@ngxs/store'; + +import { MY_PROJECTS_TABLE_PARAMS } from '@core/constants/my-projects-table.constants'; import { STORAGE_LOCATIONS } from '@core/constants/storage-locations.constant'; +import { InstitutionsSelectors } from '@osf/features/institutions/store'; import { CreateProject, GetMyProjects, MyProjectsSelectors, } from '@osf/features/my-projects/store'; -import { InstitutionsSelectors } from '@osf/features/institutions/store'; -import { MY_PROJECTS_TABLE_PARAMS } from '@core/constants/my-projects-table.constants'; -import { ProjectForm } from '@shared/entities/create-project-form.interface'; import { ProjectFormControls } from '@osf/shared/entities/create-project-form-controls.enum'; +import { ProjectForm } from '@shared/entities/create-project-form.interface'; +import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; @Component({ selector: 'osf-add-project-form', diff --git a/src/app/shared/components/my-projects-table/my-projects-table.component.ts b/src/app/shared/components/my-projects-table/my-projects-table.component.ts index 06198fae9..89b8fa407 100644 --- a/src/app/shared/components/my-projects-table/my-projects-table.component.ts +++ b/src/app/shared/components/my-projects-table/my-projects-table.component.ts @@ -1,17 +1,19 @@ +import { SortEvent } from 'primeng/api'; +import { Skeleton } from 'primeng/skeleton'; +import { TableModule, TablePageEvent } from 'primeng/table'; + +import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, Component, input, output, } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { TableModule, TablePageEvent } from 'primeng/table'; -import { SortEvent } from 'primeng/api'; -import { SearchInputComponent } from '@shared/components/search-input/search-input.component'; + import { MyProjectsItem } from '@osf/features/my-projects/entities/my-projects.entities'; +import { SearchInputComponent } from '@shared/components/search-input/search-input.component'; import { TableParameters } from '@shared/entities/table-parameters.interface'; import { SortOrder } from '@shared/utils/sort-order.enum'; -import { Skeleton } from 'primeng/skeleton'; @Component({ selector: 'osf-my-projects-table', diff --git a/src/app/shared/components/password-input-hint/password-input-hint.component.ts b/src/app/shared/components/password-input-hint/password-input-hint.component.ts index f35ea5d16..d1a1e409b 100644 --- a/src/app/shared/components/password-input-hint/password-input-hint.component.ts +++ b/src/app/shared/components/password-input-hint/password-input-hint.component.ts @@ -1,4 +1,5 @@ import { ChangeDetectionStrategy, Component, input } from '@angular/core'; + import { BooleanOrNullOrUndefined } from '@core/helpers/types.helper'; @Component({ diff --git a/src/app/shared/components/resources/filter-chips/filter-chips.component.ts b/src/app/shared/components/resources/filter-chips/filter-chips.component.ts index 68573b549..167eff92c 100644 --- a/src/app/shared/components/resources/filter-chips/filter-chips.component.ts +++ b/src/app/shared/components/resources/filter-chips/filter-chips.component.ts @@ -1,5 +1,13 @@ -import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; import { Store } from '@ngxs/store'; + +import { PrimeTemplate } from 'primeng/api'; +import { Chip } from 'primeng/chip'; + +import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; + +import { SearchSelectors } from '@osf/features/search/store'; +import { GetAllOptions } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.actions'; +import { FilterType } from '@shared/components/resources/resource-filters/models/filter-type.enum'; import { ResourceFiltersSelectors, SetCreator, @@ -12,11 +20,6 @@ import { SetResourceType, SetSubject, } from '@shared/components/resources/resource-filters/store'; -import { Chip } from 'primeng/chip'; -import { PrimeTemplate } from 'primeng/api'; -import { GetAllOptions } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.actions'; -import { FilterType } from '@shared/components/resources/resource-filters/models/filter-type.enum'; -import { SearchSelectors } from '@osf/features/search/store'; @Component({ selector: 'osf-filter-chips', diff --git a/src/app/shared/components/resources/resource-card/resource-card.component.ts b/src/app/shared/components/resources/resource-card/resource-card.component.ts index e021e6275..04a63b20a 100644 --- a/src/app/shared/components/resources/resource-card/resource-card.component.ts +++ b/src/app/shared/components/resources/resource-card/resource-card.component.ts @@ -1,23 +1,26 @@ -import { - ChangeDetectionStrategy, - Component, - inject, - model, -} from '@angular/core'; import { Accordion, AccordionContent, AccordionHeader, AccordionPanel, } from 'primeng/accordion'; -import { DatePipe, NgOptimizedImage } from '@angular/common'; -import { ResourceType } from '@osf/features/search/models/resource-type.enum'; -import { Resource } from '@osf/features/search/models/resource.entity'; -import { ResourceCardService } from '@shared/components/resources/resource-card/resource-card.service'; -import { finalize } from 'rxjs'; import { Skeleton } from 'primeng/skeleton'; + +import { finalize } from 'rxjs'; + +import { DatePipe, NgOptimizedImage } from '@angular/common'; +import { + ChangeDetectionStrategy, + Component, + inject, + model, +} from '@angular/core'; import { toSignal } from '@angular/core/rxjs-interop'; + +import { Resource } from '@osf/features/search/models/resource.entity'; +import { ResourceType } from '@osf/features/search/models/resource-type.enum'; import { IS_XSMALL } from '@osf/shared/utils/breakpoints.tokens'; +import { ResourceCardService } from '@shared/components/resources/resource-card/resource-card.service'; @Component({ selector: 'osf-resource-card', diff --git a/src/app/shared/components/resources/resource-card/resource-card.service.ts b/src/app/shared/components/resources/resource-card/resource-card.service.ts index cf6a74583..02c5ca5d0 100644 --- a/src/app/shared/components/resources/resource-card/resource-card.service.ts +++ b/src/app/shared/components/resources/resource-card/resource-card.service.ts @@ -1,11 +1,14 @@ +import { map, Observable } from 'rxjs'; + import { inject, Injectable } from '@angular/core'; + import { JsonApiService } from '@core/services/json-api/json-api.service'; -import { map, Observable } from 'rxjs'; -import { environment } from '../../../../../environments/environment'; -import { UserCountsResponse } from '@shared/components/resources/resource-card/models/user-counts-response.entity'; import { MapUserCounts } from '@shared/components/resources/resource-card/mappers/user-counts.mapper'; +import { UserCountsResponse } from '@shared/components/resources/resource-card/models/user-counts-response.entity'; import { UserRelatedDataCounts } from '@shared/components/resources/resource-card/models/user-related-data-counts.entity'; +import { environment } from '../../../../../environments/environment'; + @Injectable({ providedIn: 'root', }) diff --git a/src/app/shared/components/resources/resource-filters/filters/creators/creators-filter.component.ts b/src/app/shared/components/resources/resource-filters/filters/creators/creators-filter.component.ts index 98279b7bc..427411116 100644 --- a/src/app/shared/components/resources/resource-filters/filters/creators/creators-filter.component.ts +++ b/src/app/shared/components/resources/resource-filters/filters/creators/creators-filter.component.ts @@ -1,3 +1,9 @@ +import { Store } from '@ngxs/store'; + +import { Select, SelectChangeEvent } from 'primeng/select'; + +import { debounceTime, distinctUntilChanged, Subject, takeUntil } from 'rxjs'; + import { ChangeDetectionStrategy, Component, @@ -8,20 +14,18 @@ import { signal, untracked, } from '@angular/core'; -import { Select, SelectChangeEvent } from 'primeng/select'; -import { debounceTime, distinctUntilChanged, Subject, takeUntil } from 'rxjs'; +import { toObservable } from '@angular/core/rxjs-interop'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { Store } from '@ngxs/store'; -import { - ResourceFiltersSelectors, - SetCreator, -} from '@shared/components/resources/resource-filters/store'; + import { GetAllOptions, GetCreatorsOptions, } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.actions'; import { ResourceFiltersOptionsSelectors } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.selectors'; -import { toObservable } from '@angular/core/rxjs-interop'; +import { + ResourceFiltersSelectors, + SetCreator, +} from '@shared/components/resources/resource-filters/store'; @Component({ selector: 'osf-creators-filter', diff --git a/src/app/shared/components/resources/resource-filters/filters/date-created/date-created-filter.component.ts b/src/app/shared/components/resources/resource-filters/filters/date-created/date-created-filter.component.ts index 01f933441..5bd2ee659 100644 --- a/src/app/shared/components/resources/resource-filters/filters/date-created/date-created-filter.component.ts +++ b/src/app/shared/components/resources/resource-filters/filters/date-created/date-created-filter.component.ts @@ -1,3 +1,7 @@ +import { Store } from '@ngxs/store'; + +import { Select, SelectChangeEvent } from 'primeng/select'; + import { ChangeDetectionStrategy, Component, @@ -8,14 +12,13 @@ import { untracked, } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { Select, SelectChangeEvent } from 'primeng/select'; -import { Store } from '@ngxs/store'; + +import { GetAllOptions } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.actions'; +import { ResourceFiltersOptionsSelectors } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.selectors'; import { ResourceFiltersSelectors, SetDateCreated, } from '@shared/components/resources/resource-filters/store'; -import { GetAllOptions } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.actions'; -import { ResourceFiltersOptionsSelectors } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.selectors'; @Component({ selector: 'osf-date-created-filter', diff --git a/src/app/shared/components/resources/resource-filters/filters/funder/funder-filter.component.ts b/src/app/shared/components/resources/resource-filters/filters/funder/funder-filter.component.ts index 4c8e077c1..237f0e651 100644 --- a/src/app/shared/components/resources/resource-filters/filters/funder/funder-filter.component.ts +++ b/src/app/shared/components/resources/resource-filters/filters/funder/funder-filter.component.ts @@ -1,3 +1,7 @@ +import { Store } from '@ngxs/store'; + +import { Select, SelectChangeEvent } from 'primeng/select'; + import { ChangeDetectionStrategy, Component, @@ -7,15 +11,14 @@ import { signal, untracked, } from '@angular/core'; -import { Select, SelectChangeEvent } from 'primeng/select'; -import { Store } from '@ngxs/store'; +import { FormsModule } from '@angular/forms'; + +import { GetAllOptions } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.actions'; +import { ResourceFiltersOptionsSelectors } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.selectors'; import { ResourceFiltersSelectors, SetFunder, } from '@shared/components/resources/resource-filters/store'; -import { FormsModule } from '@angular/forms'; -import { GetAllOptions } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.actions'; -import { ResourceFiltersOptionsSelectors } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.selectors'; @Component({ selector: 'osf-funder-filter', diff --git a/src/app/shared/components/resources/resource-filters/filters/institution-filter/institution-filter.component.ts b/src/app/shared/components/resources/resource-filters/filters/institution-filter/institution-filter.component.ts index fdd5fe7e4..7127e752b 100644 --- a/src/app/shared/components/resources/resource-filters/filters/institution-filter/institution-filter.component.ts +++ b/src/app/shared/components/resources/resource-filters/filters/institution-filter/institution-filter.component.ts @@ -1,3 +1,7 @@ +import { Store } from '@ngxs/store'; + +import { Select, SelectChangeEvent } from 'primeng/select'; + import { ChangeDetectionStrategy, Component, @@ -7,15 +11,14 @@ import { signal, untracked, } from '@angular/core'; -import { Select, SelectChangeEvent } from 'primeng/select'; -import { Store } from '@ngxs/store'; +import { FormsModule } from '@angular/forms'; + +import { GetAllOptions } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.actions'; +import { ResourceFiltersOptionsSelectors } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.selectors'; import { ResourceFiltersSelectors, SetInstitution, } from '@shared/components/resources/resource-filters/store'; -import { FormsModule } from '@angular/forms'; -import { GetAllOptions } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.actions'; -import { ResourceFiltersOptionsSelectors } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.selectors'; @Component({ selector: 'osf-institution-filter', diff --git a/src/app/shared/components/resources/resource-filters/filters/license-filter/license-filter.component.ts b/src/app/shared/components/resources/resource-filters/filters/license-filter/license-filter.component.ts index 7f191ecea..cd1f0a00f 100644 --- a/src/app/shared/components/resources/resource-filters/filters/license-filter/license-filter.component.ts +++ b/src/app/shared/components/resources/resource-filters/filters/license-filter/license-filter.component.ts @@ -1,3 +1,7 @@ +import { Store } from '@ngxs/store'; + +import { Select, SelectChangeEvent } from 'primeng/select'; + import { ChangeDetectionStrategy, Component, @@ -7,15 +11,14 @@ import { signal, untracked, } from '@angular/core'; -import { Select, SelectChangeEvent } from 'primeng/select'; import { FormsModule } from '@angular/forms'; -import { Store } from '@ngxs/store'; + +import { GetAllOptions } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.actions'; +import { ResourceFiltersOptionsSelectors } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.selectors'; import { ResourceFiltersSelectors, SetLicense, } from '@shared/components/resources/resource-filters/store'; -import { GetAllOptions } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.actions'; -import { ResourceFiltersOptionsSelectors } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.selectors'; @Component({ selector: 'osf-license-filter', diff --git a/src/app/shared/components/resources/resource-filters/filters/part-of-collection-filter/part-of-collection-filter.component.ts b/src/app/shared/components/resources/resource-filters/filters/part-of-collection-filter/part-of-collection-filter.component.ts index b969ca804..4d164befc 100644 --- a/src/app/shared/components/resources/resource-filters/filters/part-of-collection-filter/part-of-collection-filter.component.ts +++ b/src/app/shared/components/resources/resource-filters/filters/part-of-collection-filter/part-of-collection-filter.component.ts @@ -1,3 +1,7 @@ +import { Store } from '@ngxs/store'; + +import { Select, SelectChangeEvent } from 'primeng/select'; + import { ChangeDetectionStrategy, Component, @@ -7,15 +11,14 @@ import { signal, untracked, } from '@angular/core'; -import { Select, SelectChangeEvent } from 'primeng/select'; -import { Store } from '@ngxs/store'; +import { FormsModule } from '@angular/forms'; + +import { GetAllOptions } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.actions'; +import { ResourceFiltersOptionsSelectors } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.selectors'; import { ResourceFiltersSelectors, SetPartOfCollection, } from '@shared/components/resources/resource-filters/store'; -import { FormsModule } from '@angular/forms'; -import { GetAllOptions } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.actions'; -import { ResourceFiltersOptionsSelectors } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.selectors'; @Component({ selector: 'osf-part-of-collection-filter', diff --git a/src/app/shared/components/resources/resource-filters/filters/provider-filter/provider-filter.component.ts b/src/app/shared/components/resources/resource-filters/filters/provider-filter/provider-filter.component.ts index 80cc220a9..9c2f1cba1 100644 --- a/src/app/shared/components/resources/resource-filters/filters/provider-filter/provider-filter.component.ts +++ b/src/app/shared/components/resources/resource-filters/filters/provider-filter/provider-filter.component.ts @@ -1,3 +1,7 @@ +import { Store } from '@ngxs/store'; + +import { Select, SelectChangeEvent } from 'primeng/select'; + import { ChangeDetectionStrategy, Component, @@ -7,15 +11,14 @@ import { signal, untracked, } from '@angular/core'; -import { Select, SelectChangeEvent } from 'primeng/select'; -import { Store } from '@ngxs/store'; +import { FormsModule } from '@angular/forms'; + +import { GetAllOptions } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.actions'; +import { ResourceFiltersOptionsSelectors } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.selectors'; import { ResourceFiltersSelectors, SetProvider, } from '@shared/components/resources/resource-filters/store'; -import { FormsModule } from '@angular/forms'; -import { GetAllOptions } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.actions'; -import { ResourceFiltersOptionsSelectors } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.selectors'; @Component({ selector: 'osf-provider-filter', diff --git a/src/app/shared/components/resources/resource-filters/filters/resource-type-filter/resource-type-filter.component.ts b/src/app/shared/components/resources/resource-filters/filters/resource-type-filter/resource-type-filter.component.ts index be0039266..b2b0a4ddf 100644 --- a/src/app/shared/components/resources/resource-filters/filters/resource-type-filter/resource-type-filter.component.ts +++ b/src/app/shared/components/resources/resource-filters/filters/resource-type-filter/resource-type-filter.component.ts @@ -1,3 +1,7 @@ +import { Store } from '@ngxs/store'; + +import { Select, SelectChangeEvent } from 'primeng/select'; + import { ChangeDetectionStrategy, Component, @@ -7,15 +11,14 @@ import { signal, untracked, } from '@angular/core'; -import { Select, SelectChangeEvent } from 'primeng/select'; -import { Store } from '@ngxs/store'; +import { FormsModule } from '@angular/forms'; + +import { GetAllOptions } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.actions'; +import { ResourceFiltersOptionsSelectors } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.selectors'; import { ResourceFiltersSelectors, SetResourceType, } from '@shared/components/resources/resource-filters/store'; -import { FormsModule } from '@angular/forms'; -import { GetAllOptions } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.actions'; -import { ResourceFiltersOptionsSelectors } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.selectors'; @Component({ selector: 'osf-resource-type-filter', diff --git a/src/app/shared/components/resources/resource-filters/filters/store/resource-filters-options.model.ts b/src/app/shared/components/resources/resource-filters/filters/store/resource-filters-options.model.ts index 10fdea660..428e66b94 100644 --- a/src/app/shared/components/resources/resource-filters/filters/store/resource-filters-options.model.ts +++ b/src/app/shared/components/resources/resource-filters/filters/store/resource-filters-options.model.ts @@ -1,12 +1,12 @@ import { Creator } from '@shared/components/resources/resource-filters/models/creator/creator.entity'; import { DateCreated } from '@shared/components/resources/resource-filters/models/dateCreated/date-created.entity'; import { FunderFilter } from '@shared/components/resources/resource-filters/models/funder/funder-filter.entity'; -import { SubjectFilter } from '@shared/components/resources/resource-filters/models/subject/subject-filter.entity'; +import { InstitutionFilter } from '@shared/components/resources/resource-filters/models/institution/institution-filter.entity'; import { LicenseFilter } from '@shared/components/resources/resource-filters/models/license/license-filter.entity'; -import { ResourceTypeFilter } from '@shared/components/resources/resource-filters/models/resource-type/resource-type.entity'; -import { ProviderFilter } from '@shared/components/resources/resource-filters/models/provider/provider-filter.entity'; import { PartOfCollectionFilter } from '@shared/components/resources/resource-filters/models/part-of-collection/part-of-collection-filter.entity'; -import { InstitutionFilter } from '@shared/components/resources/resource-filters/models/institution/institution-filter.entity'; +import { ProviderFilter } from '@shared/components/resources/resource-filters/models/provider/provider-filter.entity'; +import { ResourceTypeFilter } from '@shared/components/resources/resource-filters/models/resource-type/resource-type.entity'; +import { SubjectFilter } from '@shared/components/resources/resource-filters/models/subject/subject-filter.entity'; export interface ResourceFiltersOptionsStateModel { creators: Creator[]; diff --git a/src/app/shared/components/resources/resource-filters/filters/store/resource-filters-options.selectors.ts b/src/app/shared/components/resources/resource-filters/filters/store/resource-filters-options.selectors.ts index 73fe93363..4b7a834d9 100644 --- a/src/app/shared/components/resources/resource-filters/filters/store/resource-filters-options.selectors.ts +++ b/src/app/shared/components/resources/resource-filters/filters/store/resource-filters-options.selectors.ts @@ -1,15 +1,16 @@ import { Selector } from '@ngxs/store'; + import { ResourceFiltersOptionsStateModel } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.model'; import { ResourceFiltersOptionsState } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.state'; import { Creator } from '@shared/components/resources/resource-filters/models/creator/creator.entity'; import { DateCreated } from '@shared/components/resources/resource-filters/models/dateCreated/date-created.entity'; import { FunderFilter } from '@shared/components/resources/resource-filters/models/funder/funder-filter.entity'; -import { SubjectFilter } from '@shared/components/resources/resource-filters/models/subject/subject-filter.entity'; +import { InstitutionFilter } from '@shared/components/resources/resource-filters/models/institution/institution-filter.entity'; import { LicenseFilter } from '@shared/components/resources/resource-filters/models/license/license-filter.entity'; -import { ResourceTypeFilter } from '@shared/components/resources/resource-filters/models/resource-type/resource-type.entity'; -import { ProviderFilter } from '@shared/components/resources/resource-filters/models/provider/provider-filter.entity'; import { PartOfCollectionFilter } from '@shared/components/resources/resource-filters/models/part-of-collection/part-of-collection-filter.entity'; -import { InstitutionFilter } from '@shared/components/resources/resource-filters/models/institution/institution-filter.entity'; +import { ProviderFilter } from '@shared/components/resources/resource-filters/models/provider/provider-filter.entity'; +import { ResourceTypeFilter } from '@shared/components/resources/resource-filters/models/resource-type/resource-type.entity'; +import { SubjectFilter } from '@shared/components/resources/resource-filters/models/subject/subject-filter.entity'; export class ResourceFiltersOptionsSelectors { @Selector([ResourceFiltersOptionsState]) diff --git a/src/app/shared/components/resources/resource-filters/filters/store/resource-filters-options.state.ts b/src/app/shared/components/resources/resource-filters/filters/store/resource-filters-options.state.ts index 47ab85921..bae422cfb 100644 --- a/src/app/shared/components/resources/resource-filters/filters/store/resource-filters-options.state.ts +++ b/src/app/shared/components/resources/resource-filters/filters/store/resource-filters-options.state.ts @@ -1,8 +1,9 @@ import { Action, State, StateContext, Store } from '@ngxs/store'; -import { inject, Injectable } from '@angular/core'; + import { tap } from 'rxjs'; -import { ResourceFiltersOptionsStateModel } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.model'; -import { ResourceFiltersService } from '@shared/components/resources/resource-filters/resource-filters.service'; + +import { inject, Injectable } from '@angular/core'; + import { GetAllOptions, GetCreatorsOptions, @@ -15,6 +16,8 @@ import { GetResourceTypesOptions, GetSubjectsOptions, } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.actions'; +import { ResourceFiltersOptionsStateModel } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.model'; +import { ResourceFiltersService } from '@shared/components/resources/resource-filters/resource-filters.service'; @State({ name: 'resourceFiltersOptions', diff --git a/src/app/shared/components/resources/resource-filters/filters/subject/subject-filter.component.ts b/src/app/shared/components/resources/resource-filters/filters/subject/subject-filter.component.ts index 388825cd0..d693dd03a 100644 --- a/src/app/shared/components/resources/resource-filters/filters/subject/subject-filter.component.ts +++ b/src/app/shared/components/resources/resource-filters/filters/subject/subject-filter.component.ts @@ -1,3 +1,7 @@ +import { Store } from '@ngxs/store'; + +import { Select, SelectChangeEvent } from 'primeng/select'; + import { ChangeDetectionStrategy, Component, @@ -8,14 +12,13 @@ import { untracked, } from '@angular/core'; import { FormsModule } from '@angular/forms'; -import { Select, SelectChangeEvent } from 'primeng/select'; -import { Store } from '@ngxs/store'; + +import { GetAllOptions } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.actions'; +import { ResourceFiltersOptionsSelectors } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.selectors'; import { ResourceFiltersSelectors, SetSubject, } from '@shared/components/resources/resource-filters/store'; -import { GetAllOptions } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.actions'; -import { ResourceFiltersOptionsSelectors } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.selectors'; @Component({ selector: 'osf-subject-filter', diff --git a/src/app/shared/components/resources/resource-filters/mappers/creators/creators.mappers.ts b/src/app/shared/components/resources/resource-filters/mappers/creators/creators.mappers.ts index c8bed480d..2615cc553 100644 --- a/src/app/shared/components/resources/resource-filters/mappers/creators/creators.mappers.ts +++ b/src/app/shared/components/resources/resource-filters/mappers/creators/creators.mappers.ts @@ -1,5 +1,5 @@ -import { CreatorItem } from '@shared/components/resources/resource-filters/models/creator/creator-item.entity'; import { Creator } from '@shared/components/resources/resource-filters/models/creator/creator.entity'; +import { CreatorItem } from '@shared/components/resources/resource-filters/models/creator/creator-item.entity'; export function MapCreators(rawItem: CreatorItem): Creator { return { diff --git a/src/app/shared/components/resources/resource-filters/mappers/dateCreated/date-created.mapper.ts b/src/app/shared/components/resources/resource-filters/mappers/dateCreated/date-created.mapper.ts index 426ca8270..8c390d008 100644 --- a/src/app/shared/components/resources/resource-filters/mappers/dateCreated/date-created.mapper.ts +++ b/src/app/shared/components/resources/resource-filters/mappers/dateCreated/date-created.mapper.ts @@ -1,6 +1,6 @@ import { DateCreated } from '@shared/components/resources/resource-filters/models/dateCreated/date-created.entity'; -import { IndexValueSearch } from '@shared/components/resources/resource-filters/models/index-value-search.entity'; import { IndexCardFilter } from '@shared/components/resources/resource-filters/models/index-card-filter.entity'; +import { IndexValueSearch } from '@shared/components/resources/resource-filters/models/index-value-search.entity'; export function MapDateCreated(items: IndexValueSearch[]): DateCreated[] { const datesCreated: DateCreated[] = []; diff --git a/src/app/shared/components/resources/resource-filters/mappers/funder/funder.mapper.ts b/src/app/shared/components/resources/resource-filters/mappers/funder/funder.mapper.ts index ffb277305..518ffe7ae 100644 --- a/src/app/shared/components/resources/resource-filters/mappers/funder/funder.mapper.ts +++ b/src/app/shared/components/resources/resource-filters/mappers/funder/funder.mapper.ts @@ -1,6 +1,6 @@ -import { FunderIndexValueSearch } from '@shared/components/resources/resource-filters/models/funder/funder-index-value-search.entity'; import { FunderFilter } from '@shared/components/resources/resource-filters/models/funder/funder-filter.entity'; import { FunderIndexCardFilter } from '@shared/components/resources/resource-filters/models/funder/funder-index-card-filter.entity'; +import { FunderIndexValueSearch } from '@shared/components/resources/resource-filters/models/funder/funder-index-value-search.entity'; export function MapFunders(items: FunderIndexValueSearch[]): FunderFilter[] { const funders: FunderFilter[] = []; diff --git a/src/app/shared/components/resources/resource-filters/mappers/institution/institution.mapper.ts b/src/app/shared/components/resources/resource-filters/mappers/institution/institution.mapper.ts index cfa6dd739..36bf95c5d 100644 --- a/src/app/shared/components/resources/resource-filters/mappers/institution/institution.mapper.ts +++ b/src/app/shared/components/resources/resource-filters/mappers/institution/institution.mapper.ts @@ -1,6 +1,6 @@ -import { InstitutionIndexValueSearch } from '@shared/components/resources/resource-filters/models/institution/institution-index-value-search.entity'; -import { InstitutionIndexCardFilter } from '@shared/components/resources/resource-filters/models/institution/institution-index-card-filter.entity'; import { InstitutionFilter } from '@shared/components/resources/resource-filters/models/institution/institution-filter.entity'; +import { InstitutionIndexCardFilter } from '@shared/components/resources/resource-filters/models/institution/institution-index-card-filter.entity'; +import { InstitutionIndexValueSearch } from '@shared/components/resources/resource-filters/models/institution/institution-index-value-search.entity'; export function MapInstitutions( items: InstitutionIndexValueSearch[], diff --git a/src/app/shared/components/resources/resource-filters/mappers/license/license.mapper.ts b/src/app/shared/components/resources/resource-filters/mappers/license/license.mapper.ts index e5f8b1ec6..998fc85a6 100644 --- a/src/app/shared/components/resources/resource-filters/mappers/license/license.mapper.ts +++ b/src/app/shared/components/resources/resource-filters/mappers/license/license.mapper.ts @@ -1,6 +1,6 @@ -import { LicenseIndexValueSearch } from '@shared/components/resources/resource-filters/models/license/license-index-value-search.entity'; -import { LicenseIndexCardFilter } from '@shared/components/resources/resource-filters/models/license/license-index-card-filter.entity'; import { LicenseFilter } from '@shared/components/resources/resource-filters/models/license/license-filter.entity'; +import { LicenseIndexCardFilter } from '@shared/components/resources/resource-filters/models/license/license-index-card-filter.entity'; +import { LicenseIndexValueSearch } from '@shared/components/resources/resource-filters/models/license/license-index-value-search.entity'; export function MapLicenses(items: LicenseIndexValueSearch[]): LicenseFilter[] { const licenses: LicenseFilter[] = []; diff --git a/src/app/shared/components/resources/resource-filters/mappers/part-of-collection/part-of-collection.mapper.ts b/src/app/shared/components/resources/resource-filters/mappers/part-of-collection/part-of-collection.mapper.ts index e3d967844..8db0e5301 100644 --- a/src/app/shared/components/resources/resource-filters/mappers/part-of-collection/part-of-collection.mapper.ts +++ b/src/app/shared/components/resources/resource-filters/mappers/part-of-collection/part-of-collection.mapper.ts @@ -1,6 +1,6 @@ -import { PartOfCollectionIndexValueSearch } from '@shared/components/resources/resource-filters/models/part-of-collection/part-of-collection-index-value-search.entity'; import { PartOfCollectionFilter } from '@shared/components/resources/resource-filters/models/part-of-collection/part-of-collection-filter.entity'; import { PartOfCollectionIndexCardFilter } from '@shared/components/resources/resource-filters/models/part-of-collection/part-of-collection-index-card-filter.entity'; +import { PartOfCollectionIndexValueSearch } from '@shared/components/resources/resource-filters/models/part-of-collection/part-of-collection-index-value-search.entity'; export function MapPartOfCollections( items: PartOfCollectionIndexValueSearch[], diff --git a/src/app/shared/components/resources/resource-filters/mappers/provider/provider.mapper.ts b/src/app/shared/components/resources/resource-filters/mappers/provider/provider.mapper.ts index 981f21e56..eceab0354 100644 --- a/src/app/shared/components/resources/resource-filters/mappers/provider/provider.mapper.ts +++ b/src/app/shared/components/resources/resource-filters/mappers/provider/provider.mapper.ts @@ -1,6 +1,6 @@ -import { ProviderIndexValueSearch } from '@shared/components/resources/resource-filters/models/provider/provider-index-value-search.entity'; import { ProviderFilter } from '@shared/components/resources/resource-filters/models/provider/provider-filter.entity'; import { ProviderIndexCardFilter } from '@shared/components/resources/resource-filters/models/provider/provider-index-card-filter.entity'; +import { ProviderIndexValueSearch } from '@shared/components/resources/resource-filters/models/provider/provider-index-value-search.entity'; export function MapProviders( items: ProviderIndexValueSearch[], diff --git a/src/app/shared/components/resources/resource-filters/mappers/resource-type/resource-type.mapper.ts b/src/app/shared/components/resources/resource-filters/mappers/resource-type/resource-type.mapper.ts index bd76a7cd5..46236022c 100644 --- a/src/app/shared/components/resources/resource-filters/mappers/resource-type/resource-type.mapper.ts +++ b/src/app/shared/components/resources/resource-filters/mappers/resource-type/resource-type.mapper.ts @@ -1,6 +1,6 @@ -import { ResourceTypeIndexValueSearch } from '@shared/components/resources/resource-filters/models/resource-type/resource-type-index-value-search.entity'; import { ResourceTypeFilter } from '@shared/components/resources/resource-filters/models/resource-type/resource-type.entity'; import { ResourceTypeIndexCardFilter } from '@shared/components/resources/resource-filters/models/resource-type/resource-type-index-card-filter.entity'; +import { ResourceTypeIndexValueSearch } from '@shared/components/resources/resource-filters/models/resource-type/resource-type-index-value-search.entity'; export function MapResourceType( items: ResourceTypeIndexValueSearch[], diff --git a/src/app/shared/components/resources/resource-filters/mappers/subject/subject.mapper.ts b/src/app/shared/components/resources/resource-filters/mappers/subject/subject.mapper.ts index e3e4e6730..66ed126ac 100644 --- a/src/app/shared/components/resources/resource-filters/mappers/subject/subject.mapper.ts +++ b/src/app/shared/components/resources/resource-filters/mappers/subject/subject.mapper.ts @@ -1,6 +1,6 @@ +import { IndexCardFilter } from '@shared/components/resources/resource-filters/models/index-card-filter.entity'; import { IndexValueSearch } from '@shared/components/resources/resource-filters/models/index-value-search.entity'; import { SubjectFilter } from '@shared/components/resources/resource-filters/models/subject/subject-filter.entity'; -import { IndexCardFilter } from '@shared/components/resources/resource-filters/models/index-card-filter.entity'; export function MapSubject(items: IndexValueSearch[]): SubjectFilter[] { const subjects: SubjectFilter[] = []; diff --git a/src/app/shared/components/resources/resource-filters/models/index-value-search.entity.ts b/src/app/shared/components/resources/resource-filters/models/index-value-search.entity.ts index 2c4f62f0d..c09f5bbd3 100644 --- a/src/app/shared/components/resources/resource-filters/models/index-value-search.entity.ts +++ b/src/app/shared/components/resources/resource-filters/models/index-value-search.entity.ts @@ -1,4 +1,4 @@ -import { SearchResultCount } from '@shared/components/resources/resource-filters/models/search-result-count.entity'; import { IndexCardFilter } from '@shared/components/resources/resource-filters/models/index-card-filter.entity'; +import { SearchResultCount } from '@shared/components/resources/resource-filters/models/search-result-count.entity'; export type IndexValueSearch = SearchResultCount | IndexCardFilter; diff --git a/src/app/shared/components/resources/resource-filters/models/institution/institution-index-value-search.entity.ts b/src/app/shared/components/resources/resource-filters/models/institution/institution-index-value-search.entity.ts index bacd74265..32088406b 100644 --- a/src/app/shared/components/resources/resource-filters/models/institution/institution-index-value-search.entity.ts +++ b/src/app/shared/components/resources/resource-filters/models/institution/institution-index-value-search.entity.ts @@ -1,5 +1,5 @@ -import { SearchResultCount } from '@shared/components/resources/resource-filters/models/search-result-count.entity'; import { InstitutionIndexCardFilter } from '@shared/components/resources/resource-filters/models/institution/institution-index-card-filter.entity'; +import { SearchResultCount } from '@shared/components/resources/resource-filters/models/search-result-count.entity'; export type InstitutionIndexValueSearch = | SearchResultCount diff --git a/src/app/shared/components/resources/resource-filters/models/license/license-index-value-search.entity.ts b/src/app/shared/components/resources/resource-filters/models/license/license-index-value-search.entity.ts index d972ddcac..55f812d45 100644 --- a/src/app/shared/components/resources/resource-filters/models/license/license-index-value-search.entity.ts +++ b/src/app/shared/components/resources/resource-filters/models/license/license-index-value-search.entity.ts @@ -1,5 +1,5 @@ -import { SearchResultCount } from '@shared/components/resources/resource-filters/models/search-result-count.entity'; import { LicenseIndexCardFilter } from '@shared/components/resources/resource-filters/models/license/license-index-card-filter.entity'; +import { SearchResultCount } from '@shared/components/resources/resource-filters/models/search-result-count.entity'; export type LicenseIndexValueSearch = | SearchResultCount diff --git a/src/app/shared/components/resources/resource-filters/models/part-of-collection/part-of-collection-index-value-search.entity.ts b/src/app/shared/components/resources/resource-filters/models/part-of-collection/part-of-collection-index-value-search.entity.ts index cbe227b48..7babbf73b 100644 --- a/src/app/shared/components/resources/resource-filters/models/part-of-collection/part-of-collection-index-value-search.entity.ts +++ b/src/app/shared/components/resources/resource-filters/models/part-of-collection/part-of-collection-index-value-search.entity.ts @@ -1,5 +1,5 @@ -import { SearchResultCount } from '@shared/components/resources/resource-filters/models/search-result-count.entity'; import { PartOfCollectionIndexCardFilter } from '@shared/components/resources/resource-filters/models/part-of-collection/part-of-collection-index-card-filter.entity'; +import { SearchResultCount } from '@shared/components/resources/resource-filters/models/search-result-count.entity'; export type PartOfCollectionIndexValueSearch = | SearchResultCount diff --git a/src/app/shared/components/resources/resource-filters/models/provider/provider-index-value-search.entity.ts b/src/app/shared/components/resources/resource-filters/models/provider/provider-index-value-search.entity.ts index 7e4cfb7a6..c4222a50e 100644 --- a/src/app/shared/components/resources/resource-filters/models/provider/provider-index-value-search.entity.ts +++ b/src/app/shared/components/resources/resource-filters/models/provider/provider-index-value-search.entity.ts @@ -1,5 +1,5 @@ -import { SearchResultCount } from '@shared/components/resources/resource-filters/models/search-result-count.entity'; import { ProviderIndexCardFilter } from '@shared/components/resources/resource-filters/models/provider/provider-index-card-filter.entity'; +import { SearchResultCount } from '@shared/components/resources/resource-filters/models/search-result-count.entity'; export type ProviderIndexValueSearch = | SearchResultCount diff --git a/src/app/shared/components/resources/resource-filters/models/resource-type/resource-type-index-value-search.entity.ts b/src/app/shared/components/resources/resource-filters/models/resource-type/resource-type-index-value-search.entity.ts index 126e81cfd..a5a0b19ea 100644 --- a/src/app/shared/components/resources/resource-filters/models/resource-type/resource-type-index-value-search.entity.ts +++ b/src/app/shared/components/resources/resource-filters/models/resource-type/resource-type-index-value-search.entity.ts @@ -1,5 +1,5 @@ -import { SearchResultCount } from '@shared/components/resources/resource-filters/models/search-result-count.entity'; import { ResourceTypeIndexCardFilter } from '@shared/components/resources/resource-filters/models/resource-type/resource-type-index-card-filter.entity'; +import { SearchResultCount } from '@shared/components/resources/resource-filters/models/search-result-count.entity'; export type ResourceTypeIndexValueSearch = | SearchResultCount diff --git a/src/app/shared/components/resources/resource-filters/resource-filters.component.ts b/src/app/shared/components/resources/resource-filters/resource-filters.component.ts index a281c5995..581a2fc43 100644 --- a/src/app/shared/components/resources/resource-filters/resource-filters.component.ts +++ b/src/app/shared/components/resources/resource-filters/resource-filters.component.ts @@ -1,9 +1,5 @@ -import { - ChangeDetectionStrategy, - Component, - computed, - inject, -} from '@angular/core'; +import { Store } from '@ngxs/store'; + import { Accordion, AccordionContent, @@ -11,19 +7,26 @@ import { AccordionPanel, } from 'primeng/accordion'; import { AutoCompleteModule } from 'primeng/autocomplete'; + +import { + ChangeDetectionStrategy, + Component, + computed, + inject, +} from '@angular/core'; import { ReactiveFormsModule } from '@angular/forms'; + +import { SearchSelectors } from '@osf/features/search/store'; import { CreatorsFilterComponent } from '@shared/components/resources/resource-filters/filters/creators/creators-filter.component'; import { DateCreatedFilterComponent } from '@shared/components/resources/resource-filters/filters/date-created/date-created-filter.component'; -import { SubjectFilterComponent } from '@shared/components/resources/resource-filters/filters/subject/subject-filter.component'; import { FunderFilterComponent } from '@shared/components/resources/resource-filters/filters/funder/funder-filter.component'; +import { InstitutionFilterComponent } from '@shared/components/resources/resource-filters/filters/institution-filter/institution-filter.component'; import { LicenseFilterComponent } from '@shared/components/resources/resource-filters/filters/license-filter/license-filter.component'; -import { ResourceTypeFilterComponent } from '@shared/components/resources/resource-filters/filters/resource-type-filter/resource-type-filter.component'; -import { ProviderFilterComponent } from '@shared/components/resources/resource-filters/filters/provider-filter/provider-filter.component'; import { PartOfCollectionFilterComponent } from '@shared/components/resources/resource-filters/filters/part-of-collection-filter/part-of-collection-filter.component'; -import { Store } from '@ngxs/store'; +import { ProviderFilterComponent } from '@shared/components/resources/resource-filters/filters/provider-filter/provider-filter.component'; +import { ResourceTypeFilterComponent } from '@shared/components/resources/resource-filters/filters/resource-type-filter/resource-type-filter.component'; import { ResourceFiltersOptionsSelectors } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.selectors'; -import { InstitutionFilterComponent } from '@shared/components/resources/resource-filters/filters/institution-filter/institution-filter.component'; -import { SearchSelectors } from '@osf/features/search/store'; +import { SubjectFilterComponent } from '@shared/components/resources/resource-filters/filters/subject/subject-filter.component'; @Component({ selector: 'osf-resource-filters', diff --git a/src/app/shared/components/resources/resource-filters/resource-filters.service.ts b/src/app/shared/components/resources/resource-filters/resource-filters.service.ts index 6c1c2ea30..c6b6a4b61 100644 --- a/src/app/shared/components/resources/resource-filters/resource-filters.service.ts +++ b/src/app/shared/components/resources/resource-filters/resource-filters.service.ts @@ -1,41 +1,45 @@ -import { inject, Injectable } from '@angular/core'; +import { Store } from '@ngxs/store'; + import { map, Observable } from 'rxjs'; + +import { inject, Injectable } from '@angular/core'; + import { ApiData, JsonApiResponse, } from '@core/services/json-api/json-api.entity'; -import { environment } from '../../../../../environments/environment'; -import { CreatorItem } from '@shared/components/resources/resource-filters/models/creator/creator-item.entity'; import { JsonApiService } from '@core/services/json-api/json-api.service'; +import { SearchSelectors } from '@osf/features/search/store'; +import { getResourceTypes } from '@osf/features/search/utils/helpers/get-resource-types.helper'; import { MapCreators } from '@shared/components/resources/resource-filters/mappers/creators/creators.mappers'; -import { Creator } from '@shared/components/resources/resource-filters/models/creator/creator.entity'; -import { IndexValueSearch } from '@shared/components/resources/resource-filters/models/index-value-search.entity'; import { MapDateCreated } from '@shared/components/resources/resource-filters/mappers/dateCreated/date-created.mapper'; -import { DateCreated } from '@shared/components/resources/resource-filters/models/dateCreated/date-created.entity'; -import { SubjectFilter } from '@shared/components/resources/resource-filters/models/subject/subject-filter.entity'; +import { MapFunders } from '@shared/components/resources/resource-filters/mappers/funder/funder.mapper'; +import { MapInstitutions } from '@shared/components/resources/resource-filters/mappers/institution/institution.mapper'; +import { MapLicenses } from '@shared/components/resources/resource-filters/mappers/license/license.mapper'; +import { MapPartOfCollections } from '@shared/components/resources/resource-filters/mappers/part-of-collection/part-of-collection.mapper'; +import { MapProviders } from '@shared/components/resources/resource-filters/mappers/provider/provider.mapper'; +import { MapResourceType } from '@shared/components/resources/resource-filters/mappers/resource-type/resource-type.mapper'; import { MapSubject } from '@shared/components/resources/resource-filters/mappers/subject/subject.mapper'; -import { FunderIndexValueSearch } from '@shared/components/resources/resource-filters/models/funder/funder-index-value-search.entity'; +import { Creator } from '@shared/components/resources/resource-filters/models/creator/creator.entity'; +import { CreatorItem } from '@shared/components/resources/resource-filters/models/creator/creator-item.entity'; +import { DateCreated } from '@shared/components/resources/resource-filters/models/dateCreated/date-created.entity'; import { FunderFilter } from '@shared/components/resources/resource-filters/models/funder/funder-filter.entity'; -import { MapFunders } from '@shared/components/resources/resource-filters/mappers/funder/funder.mapper'; +import { FunderIndexValueSearch } from '@shared/components/resources/resource-filters/models/funder/funder-index-value-search.entity'; +import { IndexValueSearch } from '@shared/components/resources/resource-filters/models/index-value-search.entity'; +import { InstitutionIndexValueSearch } from '@shared/components/resources/resource-filters/models/institution/institution-index-value-search.entity'; import { LicenseFilter } from '@shared/components/resources/resource-filters/models/license/license-filter.entity'; import { LicenseIndexValueSearch } from '@shared/components/resources/resource-filters/models/license/license-index-value-search.entity'; -import { MapLicenses } from '@shared/components/resources/resource-filters/mappers/license/license.mapper'; -import { ResourceTypeIndexValueSearch } from '@shared/components/resources/resource-filters/models/resource-type/resource-type-index-value-search.entity'; -import { ResourceTypeFilter } from '@shared/components/resources/resource-filters/models/resource-type/resource-type.entity'; -import { MapResourceType } from '@shared/components/resources/resource-filters/mappers/resource-type/resource-type.mapper'; -import { ProviderFilter } from '@shared/components/resources/resource-filters/models/provider/provider-filter.entity'; -import { MapProviders } from '@shared/components/resources/resource-filters/mappers/provider/provider.mapper'; -import { ProviderIndexValueSearch } from '@shared/components/resources/resource-filters/models/provider/provider-index-value-search.entity'; import { PartOfCollectionFilter } from '@shared/components/resources/resource-filters/models/part-of-collection/part-of-collection-filter.entity'; -import { MapPartOfCollections } from '@shared/components/resources/resource-filters/mappers/part-of-collection/part-of-collection.mapper'; import { PartOfCollectionIndexValueSearch } from '@shared/components/resources/resource-filters/models/part-of-collection/part-of-collection-index-value-search.entity'; -import { Store } from '@ngxs/store'; -import { addFiltersParams } from '@shared/components/resources/resource-filters/utils/add-filters-params.helper'; +import { ProviderFilter } from '@shared/components/resources/resource-filters/models/provider/provider-filter.entity'; +import { ProviderIndexValueSearch } from '@shared/components/resources/resource-filters/models/provider/provider-index-value-search.entity'; +import { ResourceTypeFilter } from '@shared/components/resources/resource-filters/models/resource-type/resource-type.entity'; +import { ResourceTypeIndexValueSearch } from '@shared/components/resources/resource-filters/models/resource-type/resource-type-index-value-search.entity'; +import { SubjectFilter } from '@shared/components/resources/resource-filters/models/subject/subject-filter.entity'; import { ResourceFiltersSelectors } from '@shared/components/resources/resource-filters/store'; -import { SearchSelectors } from '@osf/features/search/store'; -import { getResourceTypes } from '@osf/features/search/utils/helpers/get-resource-types.helper'; -import { InstitutionIndexValueSearch } from '@shared/components/resources/resource-filters/models/institution/institution-index-value-search.entity'; -import { MapInstitutions } from '@shared/components/resources/resource-filters/mappers/institution/institution.mapper'; +import { addFiltersParams } from '@shared/components/resources/resource-filters/utils/add-filters-params.helper'; + +import { environment } from '../../../../../environments/environment'; @Injectable({ providedIn: 'root', diff --git a/src/app/shared/components/resources/resource-filters/store/index.ts b/src/app/shared/components/resources/resource-filters/store/index.ts index 6c3ba20b4..0bbc2ed4b 100644 --- a/src/app/shared/components/resources/resource-filters/store/index.ts +++ b/src/app/shared/components/resources/resource-filters/store/index.ts @@ -1,4 +1,4 @@ -export * from './resource-filters.model'; export * from './resource-filters.actions'; +export * from './resource-filters.model'; export * from './resource-filters.selectors'; export * from './resource-filters.state'; diff --git a/src/app/shared/components/resources/resource-filters/store/resource-filters.selectors.ts b/src/app/shared/components/resources/resource-filters/store/resource-filters.selectors.ts index 8ea486ec3..c710c3e91 100644 --- a/src/app/shared/components/resources/resource-filters/store/resource-filters.selectors.ts +++ b/src/app/shared/components/resources/resource-filters/store/resource-filters.selectors.ts @@ -1,9 +1,10 @@ -import { ResourceFiltersState } from '@shared/components/resources/resource-filters/store/resource-filters.state'; import { Selector } from '@ngxs/store'; + import { ResourceFilterLabel, ResourceFiltersStateModel, } from '@shared/components/resources/resource-filters/store/resource-filters.model'; +import { ResourceFiltersState } from '@shared/components/resources/resource-filters/store/resource-filters.state'; export class ResourceFiltersSelectors { @Selector([ResourceFiltersState]) diff --git a/src/app/shared/components/resources/resource-filters/store/resource-filters.state.ts b/src/app/shared/components/resources/resource-filters/store/resource-filters.state.ts index a64e0a090..b49440b2c 100644 --- a/src/app/shared/components/resources/resource-filters/store/resource-filters.state.ts +++ b/src/app/shared/components/resources/resource-filters/store/resource-filters.state.ts @@ -1,7 +1,8 @@ -import { ResourceFiltersStateModel } from '@shared/components/resources/resource-filters/store/resource-filters.model'; import { Action, State, StateContext } from '@ngxs/store'; import { Injectable } from '@angular/core'; + +import { FilterLabels } from '@shared/components/resources/resource-filters/models/filter-labels'; import { ResetFiltersState, SetCreator, @@ -14,7 +15,7 @@ import { SetResourceType, SetSubject, } from '@shared/components/resources/resource-filters/store/resource-filters.actions'; -import { FilterLabels } from '@shared/components/resources/resource-filters/models/filter-labels'; +import { ResourceFiltersStateModel } from '@shared/components/resources/resource-filters/store/resource-filters.model'; import { resourceFiltersDefaults } from '@shared/components/resources/resource-filters/utils/data'; // Store for user selected filters values diff --git a/src/app/shared/components/resources/resources-wrapper/resources-wrapper.component.ts b/src/app/shared/components/resources/resources-wrapper/resources-wrapper.component.ts index 536d70cf2..7788f1a8c 100644 --- a/src/app/shared/components/resources/resources-wrapper/resources-wrapper.component.ts +++ b/src/app/shared/components/resources/resources-wrapper/resources-wrapper.component.ts @@ -1,3 +1,7 @@ +import { Store } from '@ngxs/store'; + +import { take } from 'rxjs'; + import { ChangeDetectionStrategy, Component, @@ -6,6 +10,16 @@ import { OnInit, } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; + +import { ResourceTab } from '@osf/features/search/models/resource-tab.enum'; +import { + SearchSelectors, + SetResourceTab, + SetSearchText, + SetSortBy, +} from '@osf/features/search/store'; +import { GetAllOptions } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.actions'; +import { FilterLabels } from '@shared/components/resources/resource-filters/models/filter-labels'; import { ResourceFilterLabel, ResourceFiltersSelectors, @@ -19,17 +33,6 @@ import { SetResourceType, SetSubject, } from '@shared/components/resources/resource-filters/store'; -import { - SearchSelectors, - SetResourceTab, - SetSearchText, - SetSortBy, -} from '@osf/features/search/store'; -import { Store } from '@ngxs/store'; -import { take } from 'rxjs'; -import { FilterLabels } from '@shared/components/resources/resource-filters/models/filter-labels'; -import { GetAllOptions } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.actions'; -import { ResourceTab } from '@osf/features/search/models/resource-tab.enum'; import { ResourcesComponent } from '@shared/components/resources/resources.component'; @Component({ diff --git a/src/app/shared/components/resources/resources.component.ts b/src/app/shared/components/resources/resources.component.ts index e5d2eb756..14a8d7d51 100644 --- a/src/app/shared/components/resources/resources.component.ts +++ b/src/app/shared/components/resources/resources.component.ts @@ -1,3 +1,13 @@ +import { Store } from '@ngxs/store'; + +import { AccordionModule } from 'primeng/accordion'; +import { AutoCompleteModule } from 'primeng/autocomplete'; +import { DataViewModule } from 'primeng/dataview'; +import { DropdownModule } from 'primeng/dropdown'; +import { Select } from 'primeng/select'; +import { TableModule } from 'primeng/table'; + +import { NgOptimizedImage } from '@angular/common'; import { ChangeDetectionStrategy, Component, @@ -8,16 +18,8 @@ import { untracked, } from '@angular/core'; import { toSignal } from '@angular/core/rxjs-interop'; -import { IS_XSMALL, IS_WEB } from '@shared/utils/breakpoints.tokens'; -import { DropdownModule } from 'primeng/dropdown'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { ResourceFiltersComponent } from '@shared/components/resources/resource-filters/resource-filters.component'; -import { AutoCompleteModule } from 'primeng/autocomplete'; -import { AccordionModule } from 'primeng/accordion'; -import { TableModule } from 'primeng/table'; -import { DataViewModule } from 'primeng/dataview'; -import { ResourceCardComponent } from '@shared/components/resources/resource-card/resource-card.component'; -import { Store } from '@ngxs/store'; + import { ResourceTab } from '@osf/features/search/models/resource-tab.enum'; import { GetResourcesByLink, @@ -26,10 +28,11 @@ import { SetSortBy, } from '@osf/features/search/store'; import { FilterChipsComponent } from '@shared/components/resources/filter-chips/filter-chips.component'; -import { ResourceFiltersSelectors } from '@shared/components/resources/resource-filters/store'; -import { Select } from 'primeng/select'; -import { NgOptimizedImage } from '@angular/common'; +import { ResourceCardComponent } from '@shared/components/resources/resource-card/resource-card.component'; import { ResourceFiltersOptionsSelectors } from '@shared/components/resources/resource-filters/filters/store/resource-filters-options.selectors'; +import { ResourceFiltersComponent } from '@shared/components/resources/resource-filters/resource-filters.component'; +import { ResourceFiltersSelectors } from '@shared/components/resources/resource-filters/store'; +import { IS_WEB, IS_XSMALL } from '@shared/utils/breakpoints.tokens'; @Component({ selector: 'osf-resources', diff --git a/src/app/shared/components/search-input/search-input.component.ts b/src/app/shared/components/search-input/search-input.component.ts index 2b21af88c..cc741d777 100644 --- a/src/app/shared/components/search-input/search-input.component.ts +++ b/src/app/shared/components/search-input/search-input.component.ts @@ -1,10 +1,11 @@ +import { InputText } from 'primeng/inputtext'; + import { ChangeDetectionStrategy, Component, input, model, } from '@angular/core'; -import { InputText } from 'primeng/inputtext'; import { FormsModule } from '@angular/forms'; @Component({ diff --git a/src/app/shared/components/sub-header/sub-header.component.ts b/src/app/shared/components/sub-header/sub-header.component.ts index edf768bd9..9bb3a75a0 100644 --- a/src/app/shared/components/sub-header/sub-header.component.ts +++ b/src/app/shared/components/sub-header/sub-header.component.ts @@ -1,14 +1,16 @@ +import { Button } from 'primeng/button'; + import { ChangeDetectionStrategy, Component, - input, inject, + input, output, } from '@angular/core'; -import { Button } from 'primeng/button'; -import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; import { toSignal } from '@angular/core/rxjs-interop'; +import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; + @Component({ selector: 'osf-sub-header', imports: [Button], diff --git a/src/app/shared/entities/create-project-form.interface.ts b/src/app/shared/entities/create-project-form.interface.ts index 3b948d81e..a62242578 100644 --- a/src/app/shared/entities/create-project-form.interface.ts +++ b/src/app/shared/entities/create-project-form.interface.ts @@ -1,4 +1,5 @@ import { FormControl } from '@angular/forms'; + import { ProjectFormControls } from '@shared/entities/create-project-form-controls.enum'; export interface ProjectForm { diff --git a/src/app/shared/utils/breakpoints.tokens.ts b/src/app/shared/utils/breakpoints.tokens.ts index b2403f774..14ab29fc7 100644 --- a/src/app/shared/utils/breakpoints.tokens.ts +++ b/src/app/shared/utils/breakpoints.tokens.ts @@ -1,6 +1,8 @@ -import { inject, InjectionToken } from '@angular/core'; +import { map, Observable } from 'rxjs'; + import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout'; -import { Observable, map } from 'rxjs'; +import { inject, InjectionToken } from '@angular/core'; + import { BreakpointQueries } from '@shared/utils/breakpoint-queries.enum'; function createBreakpointToken( diff --git a/src/main.ts b/src/main.ts index 2c6030824..6ad6b3a1c 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,9 +1,10 @@ -import { bootstrapApplication } from '@angular/platform-browser'; -import { appConfig } from '@osf/app.config'; -import { AppComponent } from '@osf/app.component'; import { isDevMode } from '@angular/core'; +import { bootstrapApplication } from '@angular/platform-browser'; import { provideServiceWorker } from '@angular/service-worker'; +import { AppComponent } from '@osf/app.component'; +import { appConfig } from '@osf/app.config'; + bootstrapApplication(AppComponent, { providers: [ ...appConfig.providers, From 9ab29107ed33bcfd05e10665a8b12644a1de94a6 Mon Sep 17 00:00:00 2001 From: Nazar Semets Date: Fri, 9 May 2025 15:34:23 +0300 Subject: [PATCH 3/4] chore(eslint): clean up code --- angular.json | 3 +- bun.lock | 2 +- public/favicon.ico | Bin 15086 -> 15406 bytes public/icons/icon-128x128.png | Bin 2875 -> 0 bytes public/icons/icon-144x144.png | Bin 3077 -> 0 bytes public/icons/icon-152x152.png | Bin 3293 -> 0 bytes public/icons/icon-192x192.png | Bin 4306 -> 0 bytes public/icons/icon-384x384.png | Bin 11028 -> 0 bytes public/icons/icon-512x512.png | Bin 16332 -> 0 bytes public/icons/icon-72x72.png | Bin 1995 -> 0 bytes public/icons/icon-96x96.png | Bin 2404 -> 0 bytes public/manifest.webmanifest | 59 ---------------------------------- src/app/app.component.ts | 1 - src/index.html | 2 +- 14 files changed, 3 insertions(+), 64 deletions(-) delete mode 100644 public/icons/icon-128x128.png delete mode 100644 public/icons/icon-144x144.png delete mode 100644 public/icons/icon-152x152.png delete mode 100644 public/icons/icon-192x192.png delete mode 100644 public/icons/icon-384x384.png delete mode 100644 public/icons/icon-512x512.png delete mode 100644 public/icons/icon-72x72.png delete mode 100644 public/icons/icon-96x96.png delete mode 100644 public/manifest.webmanifest diff --git a/angular.json b/angular.json index d3f8f471d..f68268696 100644 --- a/angular.json +++ b/angular.json @@ -57,8 +57,7 @@ "maximumError": "16kB" } ], - "outputHashing": "all", - "serviceWorker": "ngsw-config.json" + "outputHashing": "all" }, "development": { "optimization": false, diff --git a/bun.lock b/bun.lock index 7f2d54764..878274769 100644 --- a/bun.lock +++ b/bun.lock @@ -102,7 +102,7 @@ "@angular/router": ["@angular/router@19.2.7", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/common": "19.2.7", "@angular/core": "19.2.7", "@angular/platform-browser": "19.2.7", "rxjs": "^6.5.3 || ^7.4.0" } }, "sha512-tbvDz/gkifgdeQ9CazoLLfSRqHE4FQcwMOglzEE9gNCIFohpcUwRnxqZMRhZ3RE4BVLqUmzk2LmJ3VYDf6RbqA=="], - "@angular/service-worker": ["@angular/service-worker@19.2.7", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/core": "19.2.7", "rxjs": "^6.5.3 || ^7.4.0" }, "bin": { "ngsw-config": "ngsw-config.js" } }, "sha512-zSgq7Vg65VMbPYUZDohNbmrMohulfAbH1CjJU9QdaGg7FbPSJfrN8noi6XnfHl2HqI4QMqvk+jqNNjalhMj0Gw=="], + "@angular/service-worker": ["@angular/service-worker@19.2.7", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/core": "19.2.7", "rxjs": "^6.5.3 || ^7.4.0" } }, "sha512-zSgq7Vg65VMbPYUZDohNbmrMohulfAbH1CjJU9QdaGg7FbPSJfrN8noi6XnfHl2HqI4QMqvk+jqNNjalhMj0Gw=="], "@babel/code-frame": ["@babel/code-frame@7.26.2", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ=="], diff --git a/public/favicon.ico b/public/favicon.ico index 57614f9c967596fad0a3989bec2b1deff33034f6..a3bc362bb1816cdd49af2070e665c316e985247f 100644 GIT binary patch literal 15406 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 Nr__JTFzvMr^FKp4S3v*( diff --git a/public/icons/icon-128x128.png b/public/icons/icon-128x128.png deleted file mode 100644 index 5a9a2ccdb34a97a06510d04238d8bedd8e063d3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2875 zcmV-B3&iw^P)C0008_P)t-s0002& z9EbENqopD5@(y0~Ac4&(;F%uw?h$_L3~Rb4@Sh>}?lk4{A#>dpkIgIViW&F%F}(B? zSI#Ko-665>9e3aedGj;V?;nisG~&uE@!BTIsUYpu3W?t$vbrbqDfEpQ^!YHm_Aa;gF0b?~uc09I z!6@*Z9PFwe>h&?n^Do8tFSGY8s`V$5^d*JzB6;ctX7dkLr6Tu{8S%y`?!PDQwIuHI zG}-qu&Gjz3^)0gF9GvO`U-Af9wkP=YGu8Mox6~cC-WHeT8kFq^VeSQ7pd$H{9rwE@ z^R6WGnH}=FCGPPu)!7}c<`|6C27>GXTJ{A?_X0(q9`Ugw@3JB4_A}9$9`~Ie_028v zsUh&KA?~Ce?YSiC@-WNzGRX5SyWSqE_XkL&Ao78}srm!1FA&+8?yi8L-$IsNNZ!*cF`K19I{qap3}Nq#fz+G~(JL z!P+6a-yEdb8KUVJhTtKu(-ot_2%X3WmCFZ_&e$%S$i%~zlzw4hAp7y}?dj;} z;oslf&(FWMvapSBK>PRh^78TU@9*#G&&RT;Pv0?%000M;NklCo2*8x$)93d|qJeXTx^d$M0)Q>! z`}gm+Z3_jCwE9nlIR1gl2~@VekbuzjA)EV~9n0jEwSjjVL?>tH5fm?t5C(&5zrOR?_VJ?7V~TQ{0Iz+3_W zb_+sEP%7frfcpA;EQkuAUq316*s)`^YQym#2}CZyR8GO9!ILIUA^=7JIlrD70Fwf0 zI3@wHK(Qo~L@TuU_3In+)c|w*X&D4+_ij**=C4>G0QIrhM;cvggf(4br>37G5&sHX~uF=B)S^zYw)8g-UR2^NZj^ARvv z%wJ{zx^xMs@(~z8;douJckf;Vqz4P7+qLT(Ks^HZ1%)I)ClCOO1(wQ&g2|I7Z^Zcm z&{fXw0xAs{Fkr+0A($=+5)hxc+sq3-@~&OG1YqMbtbNz6UF(hSq70y>%le-aA%M9! zQY7XF4M2jf*m!lo$dM#45JZT|T>SAP_et{D0L`}mz{oHV(+O^70UtjyEATZp(A5Ae zRt8Yjg@6?70usOYn3!F`rcF41#|{Iqc(EEFcJta;a4guI{8PG^%5`38JD&M>J_WXGQa36$d8eqeqty>YWMGX+X zabqG#M8#V~QmMsB5C3j=YM5Jae^AUhm0)Rya=Bqq( z=ye^iWy=;{P)Y)%qH!Z&dbw}kzI&^50Wb}{?g;?3M#&_BTR@DLLa=WY5`-WIw*n17 z^OvXt%z!ECOHF_wASy5kz>p0amM^ye=wvo3Eqe#B+qX>tFa^GTeTV>{V2MQl6`uQK z&X_Ud_H7}!h=2@oB!0cR`&G6C0W(GhGucKPz@0ASHaeBz7@dLt5*YotwpvBaDlD)wF(FWHW$|-ASBpa5Nm*7V0)!40K(7$ zY+pfKP|g2UaG<^cL0te26cD_5`{P3T`=&s8VMS3y@#4kv0jJ8+(&(gUAvSjG*ki|@ zKY#Y@-Mgb}o;-g2=;5of;7~4ezDY0z2tWY>9=O1nvW(MfIjiL?>}!F!g7V-*kUb&%yArH#n*h9d^XAQ)H*f!U ZUjT_fSx^~10a*Y5002ovPDHLkV1ljCVV(d0 diff --git a/public/icons/icon-144x144.png b/public/icons/icon-144x144.png deleted file mode 100644 index 11702cd7bd67cee3c26172d0b69968b568c210e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3077 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 diff --git a/public/icons/icon-384x384.png b/public/icons/icon-384x384.png deleted file mode 100644 index 613ac793e063b1da8d0dc36dcbd1cc0ae620291d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11028 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 diff --git a/public/icons/icon-72x72.png b/public/icons/icon-72x72.png deleted file mode 100644 index 033724e15f5485c4d86af398a68ca293e6116f72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1995 zcmV;+2Q>JJP)291V+*= z^06lJ@iNwq8T9WTgUAk`+9JF2BZb^3%m;Ym7q0XGMcgOF zo*(n@GuZeu%=Iw5@*;!h3u5#YR+k?7ogMGqEYs})RJtkn_%qPMDD2W6x#A(I$Sm}o zA^G<$pUy4t>@(lADEhM@>G?Ft@+z(JAaC^$NSYe!pBv}r0bck9LaiqJxheViGtbl@ zy}}5d^Cy_k1%~qyQ1%W*(l7GuH0Hbrq4E(+ix>0pA#9i%>7pLz?J&~A37p9UhRiMW z^fTl6FSzm!Tkir^@&Zxx15Nb|N%sguuqOGsDE7%K^7t~w^AA?`3QY9^NuwkBv?uuV zG0F8Uv-A#5_yj_%CHkKs`M)Xk%`NiuGuQbt!SpV^`7ylqF1h$Fukg`I;a1 zlpOZND)p%%^`9X1u_g4sDDk2n@w_GM^fJx(Gt1j0#_}w=_%FED8maawpV}9m^e340 zCzSOkk@O{s+XQy!2W;&KW9tH5?E+f#4^s6BQK%*Rr6TsMBlMRX^t&hWogMPTDe<@_ z@tGX(wIuJjBX;8kfijmgE?a^d*MW27~eIY}!0%!3FTBIQJjv4c+A@Ig2@4+YSr628< z8ttMT>hd((@i5NuF2&pw9<Kg+s;a1{rKNOoa8*@RRaI3rE*=;6@9*Q|U3Qy|k;Vs;a80s;a80s*R0^h=hc4RaI3vEiEf^xaC#=00bjRL_t(o!|l{%P*hPA z!0{_EF$B`*s`{HM-~hB}QNAp^;Xci8 z+_(->TwGk{EjUgHNt^X9W%!s*`}Xa-0n+tr*RIvcye~Gx*U4!SKvJnm2LorB8XFsf zw0G}bl!!>azD~P$3yz7&^y%VC{>rANC>hV43sPXE^FB3cVSfE={Y!i5WKlgv$63T@c1;pWYo2vrh?3j6svI9y!2)?^Jr=Nb`_4jedu z5>i1yK?TL3LVh+j7XjL}W(_#!h*%aDK$)2>!Gho*#z_LS3n428WNrbOL1@)uLHTSh zU%IplAuB7ZIpUDHxy3xlY(J#CXwrn}WOMoQrS|9mOdb4jgU+fdI~ADRDRugEnC}KM5j_8V%GckSliprk%>dg zp^ccLGc^wm);pZ1hc@gDD;JGV6^qPe+k5~@y3RjQDLgm`LH?dsLXd-ecC zSdiOcXcIN8o}yAEhKBZ~hFWMF3p#=wKHQ%gwn|A+B_@Wpq)!6K(UA!q6*@xA3c9-9 zzI{76IkXTp4hVSf=y+i}19|~{`BI;nrK?f0OHN9n#-jjoW2mMx#-y!%?b1ExN}#UtmI8FnW}c;jYoVI&>)9?$#}O6YKB1 zoduQMvL#aQpok22_vg<+diG53q;CG})|FvExg#SZi_&yNM8t2Y9JLw=P#zZK;o(6~ zjIdn4qIdr59vOh@lPp);0QB}P;m8m~xO$YAu_)4o4=TfiM({zynGoTO1vTV_8j=6n zL~Scqo;>;B#EGvjU#{5v?d~0Zr@_pbGZFIoEv>k}`OV!i+z>dJrI!~_AbGxnliu*3 zRPc<@SxZPOy*myky}nb36B;;Q=qzMuIqCGNtq(jwf|L4jLV(QDc6RdQNhm$^gpYSTjcV2; dIpy?!`T;k-MF8k)@eTk0002ovPDHLkV1mgk?e+iw diff --git a/public/icons/icon-96x96.png b/public/icons/icon-96x96.png deleted file mode 100644 index 3090dc2d8f93429535c667e616e367c010d941ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2404 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 W@LC!C(#4Aa0000 - Osf + OSF From 29f7b14728e08afff0dbd89d70139032e5af2052 Mon Sep 17 00:00:00 2001 From: Nazar Semets Date: Fri, 9 May 2025 15:40:36 +0300 Subject: [PATCH 4/4] chore(eslint): clean up code --- angular.json | 3 +- bun.lock | 2 +- ngsw-config.json | 30 --------- public/favicon.ico | Bin 15086 -> 15406 bytes public/icons/icon-128x128.png | Bin 2875 -> 0 bytes public/icons/icon-144x144.png | Bin 3077 -> 0 bytes public/icons/icon-152x152.png | Bin 3293 -> 0 bytes public/icons/icon-192x192.png | Bin 4306 -> 0 bytes public/icons/icon-384x384.png | Bin 11028 -> 0 bytes public/icons/icon-512x512.png | Bin 16332 -> 0 bytes public/icons/icon-72x72.png | Bin 1995 -> 0 bytes public/icons/icon-96x96.png | Bin 2404 -> 0 bytes public/manifest.webmanifest | 59 ------------------ src/app/app.component.ts | 1 - .../nav-menu/nav-menu.component.html | 1 + src/index.html | 5 +- 16 files changed, 5 insertions(+), 96 deletions(-) delete mode 100644 ngsw-config.json delete mode 100644 public/icons/icon-128x128.png delete mode 100644 public/icons/icon-144x144.png delete mode 100644 public/icons/icon-152x152.png delete mode 100644 public/icons/icon-192x192.png delete mode 100644 public/icons/icon-384x384.png delete mode 100644 public/icons/icon-512x512.png delete mode 100644 public/icons/icon-72x72.png delete mode 100644 public/icons/icon-96x96.png delete mode 100644 public/manifest.webmanifest diff --git a/angular.json b/angular.json index d3f8f471d..f68268696 100644 --- a/angular.json +++ b/angular.json @@ -57,8 +57,7 @@ "maximumError": "16kB" } ], - "outputHashing": "all", - "serviceWorker": "ngsw-config.json" + "outputHashing": "all" }, "development": { "optimization": false, diff --git a/bun.lock b/bun.lock index 7f2d54764..878274769 100644 --- a/bun.lock +++ b/bun.lock @@ -102,7 +102,7 @@ "@angular/router": ["@angular/router@19.2.7", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/common": "19.2.7", "@angular/core": "19.2.7", "@angular/platform-browser": "19.2.7", "rxjs": "^6.5.3 || ^7.4.0" } }, "sha512-tbvDz/gkifgdeQ9CazoLLfSRqHE4FQcwMOglzEE9gNCIFohpcUwRnxqZMRhZ3RE4BVLqUmzk2LmJ3VYDf6RbqA=="], - "@angular/service-worker": ["@angular/service-worker@19.2.7", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/core": "19.2.7", "rxjs": "^6.5.3 || ^7.4.0" }, "bin": { "ngsw-config": "ngsw-config.js" } }, "sha512-zSgq7Vg65VMbPYUZDohNbmrMohulfAbH1CjJU9QdaGg7FbPSJfrN8noi6XnfHl2HqI4QMqvk+jqNNjalhMj0Gw=="], + "@angular/service-worker": ["@angular/service-worker@19.2.7", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/core": "19.2.7", "rxjs": "^6.5.3 || ^7.4.0" } }, "sha512-zSgq7Vg65VMbPYUZDohNbmrMohulfAbH1CjJU9QdaGg7FbPSJfrN8noi6XnfHl2HqI4QMqvk+jqNNjalhMj0Gw=="], "@babel/code-frame": ["@babel/code-frame@7.26.2", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ=="], diff --git a/ngsw-config.json b/ngsw-config.json deleted file mode 100644 index 69edd2878..000000000 --- a/ngsw-config.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "$schema": "./node_modules/@angular/service-worker/config/schema.json", - "index": "/index.html", - "assetGroups": [ - { - "name": "app", - "installMode": "prefetch", - "resources": { - "files": [ - "/favicon.ico", - "/index.csr.html", - "/index.html", - "/manifest.webmanifest", - "/*.css", - "/*.js" - ] - } - }, - { - "name": "assets", - "installMode": "lazy", - "updateMode": "prefetch", - "resources": { - "files": [ - "/**/*.(svg|cur|jpg|jpeg|png|apng|webp|avif|gif|otf|ttf|woff|woff2)" - ] - } - } - ] -} diff --git a/public/favicon.ico b/public/favicon.ico index 57614f9c967596fad0a3989bec2b1deff33034f6..a3bc362bb1816cdd49af2070e665c316e985247f 100644 GIT binary patch literal 15406 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 Nr__JTFzvMr^FKp4S3v*( diff --git a/public/icons/icon-128x128.png b/public/icons/icon-128x128.png deleted file mode 100644 index 5a9a2ccdb34a97a06510d04238d8bedd8e063d3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2875 zcmV-B3&iw^P)C0008_P)t-s0002& z9EbENqopD5@(y0~Ac4&(;F%uw?h$_L3~Rb4@Sh>}?lk4{A#>dpkIgIViW&F%F}(B? zSI#Ko-665>9e3aedGj;V?;nisG~&uE@!BTIsUYpu3W?t$vbrbqDfEpQ^!YHm_Aa;gF0b?~uc09I z!6@*Z9PFwe>h&?n^Do8tFSGY8s`V$5^d*JzB6;ctX7dkLr6Tu{8S%y`?!PDQwIuHI zG}-qu&Gjz3^)0gF9GvO`U-Af9wkP=YGu8Mox6~cC-WHeT8kFq^VeSQ7pd$H{9rwE@ z^R6WGnH}=FCGPPu)!7}c<`|6C27>GXTJ{A?_X0(q9`Ugw@3JB4_A}9$9`~Ie_028v zsUh&KA?~Ce?YSiC@-WNzGRX5SyWSqE_XkL&Ao78}srm!1FA&+8?yi8L-$IsNNZ!*cF`K19I{qap3}Nq#fz+G~(JL z!P+6a-yEdb8KUVJhTtKu(-ot_2%X3WmCFZ_&e$%S$i%~zlzw4hAp7y}?dj;} z;oslf&(FWMvapSBK>PRh^78TU@9*#G&&RT;Pv0?%000M;NklCo2*8x$)93d|qJeXTx^d$M0)Q>! z`}gm+Z3_jCwE9nlIR1gl2~@VekbuzjA)EV~9n0jEwSjjVL?>tH5fm?t5C(&5zrOR?_VJ?7V~TQ{0Iz+3_W zb_+sEP%7frfcpA;EQkuAUq316*s)`^YQym#2}CZyR8GO9!ILIUA^=7JIlrD70Fwf0 zI3@wHK(Qo~L@TuU_3In+)c|w*X&D4+_ij**=C4>G0QIrhM;cvggf(4br>37G5&sHX~uF=B)S^zYw)8g-UR2^NZj^ARvv z%wJ{zx^xMs@(~z8;douJckf;Vqz4P7+qLT(Ks^HZ1%)I)ClCOO1(wQ&g2|I7Z^Zcm z&{fXw0xAs{Fkr+0A($=+5)hxc+sq3-@~&OG1YqMbtbNz6UF(hSq70y>%le-aA%M9! zQY7XF4M2jf*m!lo$dM#45JZT|T>SAP_et{D0L`}mz{oHV(+O^70UtjyEATZp(A5Ae zRt8Yjg@6?70usOYn3!F`rcF41#|{Iqc(EEFcJta;a4guI{8PG^%5`38JD&M>J_WXGQa36$d8eqeqty>YWMGX+X zabqG#M8#V~QmMsB5C3j=YM5Jae^AUhm0)Rya=Bqq( z=ye^iWy=;{P)Y)%qH!Z&dbw}kzI&^50Wb}{?g;?3M#&_BTR@DLLa=WY5`-WIw*n17 z^OvXt%z!ECOHF_wASy5kz>p0amM^ye=wvo3Eqe#B+qX>tFa^GTeTV>{V2MQl6`uQK z&X_Ud_H7}!h=2@oB!0cR`&G6C0W(GhGucKPz@0ASHaeBz7@dLt5*YotwpvBaDlD)wF(FWHW$|-ASBpa5Nm*7V0)!40K(7$ zY+pfKP|g2UaG<^cL0te26cD_5`{P3T`=&s8VMS3y@#4kv0jJ8+(&(gUAvSjG*ki|@ zKY#Y@-Mgb}o;-g2=;5of;7~4ezDY0z2tWY>9=O1nvW(MfIjiL?>}!F!g7V-*kUb&%yArH#n*h9d^XAQ)H*f!U ZUjT_fSx^~10a*Y5002ovPDHLkV1ljCVV(d0 diff --git a/public/icons/icon-144x144.png b/public/icons/icon-144x144.png deleted file mode 100644 index 11702cd7bd67cee3c26172d0b69968b568c210e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3077 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 diff --git a/public/icons/icon-384x384.png b/public/icons/icon-384x384.png deleted file mode 100644 index 613ac793e063b1da8d0dc36dcbd1cc0ae620291d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11028 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 diff --git a/public/icons/icon-72x72.png b/public/icons/icon-72x72.png deleted file mode 100644 index 033724e15f5485c4d86af398a68ca293e6116f72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1995 zcmV;+2Q>JJP)291V+*= z^06lJ@iNwq8T9WTgUAk`+9JF2BZb^3%m;Ym7q0XGMcgOF zo*(n@GuZeu%=Iw5@*;!h3u5#YR+k?7ogMGqEYs})RJtkn_%qPMDD2W6x#A(I$Sm}o zA^G<$pUy4t>@(lADEhM@>G?Ft@+z(JAaC^$NSYe!pBv}r0bck9LaiqJxheViGtbl@ zy}}5d^Cy_k1%~qyQ1%W*(l7GuH0Hbrq4E(+ix>0pA#9i%>7pLz?J&~A37p9UhRiMW z^fTl6FSzm!Tkir^@&Zxx15Nb|N%sguuqOGsDE7%K^7t~w^AA?`3QY9^NuwkBv?uuV zG0F8Uv-A#5_yj_%CHkKs`M)Xk%`NiuGuQbt!SpV^`7ylqF1h$Fukg`I;a1 zlpOZND)p%%^`9X1u_g4sDDk2n@w_GM^fJx(Gt1j0#_}w=_%FED8maawpV}9m^e340 zCzSOkk@O{s+XQy!2W;&KW9tH5?E+f#4^s6BQK%*Rr6TsMBlMRX^t&hWogMPTDe<@_ z@tGX(wIuJjBX;8kfijmgE?a^d*MW27~eIY}!0%!3FTBIQJjv4c+A@Ig2@4+YSr628< z8ttMT>hd((@i5NuF2&pw9<Kg+s;a1{rKNOoa8*@RRaI3rE*=;6@9*Q|U3Qy|k;Vs;a80s;a80s*R0^h=hc4RaI3vEiEf^xaC#=00bjRL_t(o!|l{%P*hPA z!0{_EF$B`*s`{HM-~hB}QNAp^;Xci8 z+_(->TwGk{EjUgHNt^X9W%!s*`}Xa-0n+tr*RIvcye~Gx*U4!SKvJnm2LorB8XFsf zw0G}bl!!>azD~P$3yz7&^y%VC{>rANC>hV43sPXE^FB3cVSfE={Y!i5WKlgv$63T@c1;pWYo2vrh?3j6svI9y!2)?^Jr=Nb`_4jedu z5>i1yK?TL3LVh+j7XjL}W(_#!h*%aDK$)2>!Gho*#z_LS3n428WNrbOL1@)uLHTSh zU%IplAuB7ZIpUDHxy3xlY(J#CXwrn}WOMoQrS|9mOdb4jgU+fdI~ADRDRugEnC}KM5j_8V%GckSliprk%>dg zp^ccLGc^wm);pZ1hc@gDD;JGV6^qPe+k5~@y3RjQDLgm`LH?dsLXd-ecC zSdiOcXcIN8o}yAEhKBZ~hFWMF3p#=wKHQ%gwn|A+B_@Wpq)!6K(UA!q6*@xA3c9-9 zzI{76IkXTp4hVSf=y+i}19|~{`BI;nrK?f0OHN9n#-jjoW2mMx#-y!%?b1ExN}#UtmI8FnW}c;jYoVI&>)9?$#}O6YKB1 zoduQMvL#aQpok22_vg<+diG53q;CG})|FvExg#SZi_&yNM8t2Y9JLw=P#zZK;o(6~ zjIdn4qIdr59vOh@lPp);0QB}P;m8m~xO$YAu_)4o4=TfiM({zynGoTO1vTV_8j=6n zL~Scqo;>;B#EGvjU#{5v?d~0Zr@_pbGZFIoEv>k}`OV!i+z>dJrI!~_AbGxnliu*3 zRPc<@SxZPOy*myky}nb36B;;Q=qzMuIqCGNtq(jwf|L4jLV(QDc6RdQNhm$^gpYSTjcV2; dIpy?!`T;k-MF8k)@eTk0002ovPDHLkV1mgk?e+iw diff --git a/public/icons/icon-96x96.png b/public/icons/icon-96x96.png deleted file mode 100644 index 3090dc2d8f93429535c667e616e367c010d941ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2404 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 W@LC!C(#4Aa0000 @if (item.icon) { diff --git a/src/index.html b/src/index.html index a80bf7222..0628ad111 100644 --- a/src/index.html +++ b/src/index.html @@ -2,11 +2,10 @@ - Osf + OSF - - +