Merge remote-tracking branch 'origin/main' into poc-eslint-plugin-autofix-selectors

This commit is contained in:
Yury Bondarenko
2024-04-30 10:45:55 +02:00
35 changed files with 180 additions and 90 deletions

View File

@@ -0,0 +1,15 @@
const ADD_TEMPLATE_ITEM_PAGE = '/collections/'.concat(Cypress.env('DSPACE_TEST_COLLECTION')).concat('/itemtemplate');
describe('Item Template', () => {
beforeEach(() => {
cy.visit(ADD_TEMPLATE_ITEM_PAGE);
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
it('should load properly', () => {
cy.contains('.ds-header-row .lbl-cell', 'Field', { timeout: 10000 }).should('exist').should('be.visible');
cy.contains('.ds-header-row b', 'Value', { timeout: 10000 }).should('exist').should('be.visible');
cy.contains('.ds-header-row b', 'Lang', { timeout: 10000 }).should('exist').should('be.visible');
cy.contains('.ds-header-row b', 'Edit', { timeout: 10000 }).should('exist').should('be.visible');
});
});

View File

@@ -20,7 +20,7 @@ the Docker compose scripts in this 'docker' folder.
### Dockerfile ### Dockerfile
This Dockerfile is used to build a *development* DSpace 7 Angular UI image, published as 'dspace/dspace-angular' This Dockerfile is used to build a *development* DSpace Angular UI image, published as 'dspace/dspace-angular'
``` ```
docker build -t dspace/dspace-angular:latest . docker build -t dspace/dspace-angular:latest .
@@ -46,11 +46,11 @@ A default/demo version of this image is built *automatically*.
## 'docker' directory ## 'docker' directory
- docker-compose.yml - docker-compose.yml
- Starts DSpace Angular with Docker Compose from the current branch. This file assumes that a DSpace 7 REST instance will also be started in Docker. - Starts DSpace Angular with Docker Compose from the current branch. This file assumes that a DSpace REST instance will also be started in Docker.
- docker-compose-rest.yml - docker-compose-rest.yml
- Runs a published instance of the DSpace 7 REST API - persists data in Docker volumes - Runs a published instance of the DSpace REST API - persists data in Docker volumes
- docker-compose-ci.yml - docker-compose-ci.yml
- Runs a published instance of the DSpace 7 REST API for CI testing. The database is re-populated from a SQL dump on each startup. - Runs a published instance of the DSpace REST API for CI testing. The database is re-populated from a SQL dump on each startup.
- cli.yml - cli.yml
- Docker compose file that provides a DSpace CLI container to work with a running DSpace REST container. - Docker compose file that provides a DSpace CLI container to work with a running DSpace REST container.
- cli.assetstore.yml - cli.assetstore.yml
@@ -71,7 +71,7 @@ docker-compose -f docker/docker-compose.yml build
This command provides a quick way to start both the frontend & backend from this single codebase This command provides a quick way to start both the frontend & backend from this single codebase
``` ```
docker-compose -p d7 -f docker/docker-compose.yml -f docker/docker-compose-rest.yml up -d docker-compose -p d8 -f docker/docker-compose.yml -f docker/docker-compose-rest.yml up -d
``` ```
Keep in mind, you may also start the backend by cloning the 'DSpace/DSpace' GitHub repository separately. See the next section. Keep in mind, you may also start the backend by cloning the 'DSpace/DSpace' GitHub repository separately. See the next section.
@@ -86,14 +86,14 @@ _The system will be started in 2 steps. Each step shares the same docker network
From 'DSpace/DSpace' clone (build first as needed): From 'DSpace/DSpace' clone (build first as needed):
``` ```
docker-compose -p d7 up -d docker-compose -p d8 up -d
``` ```
NOTE: More detailed instructions on starting the backend via Docker can be found in the [Docker Compose instructions for the Backend](https://github.com/DSpace/DSpace/blob/main/dspace/src/main/docker-compose/README.md). NOTE: More detailed instructions on starting the backend via Docker can be found in the [Docker Compose instructions for the Backend](https://github.com/DSpace/DSpace/blob/main/dspace/src/main/docker-compose/README.md).
From 'DSpace/dspace-angular' clone (build first as needed) From 'DSpace/dspace-angular' clone (build first as needed)
``` ```
docker-compose -p d7 -f docker/docker-compose.yml up -d docker-compose -p d8 -f docker/docker-compose.yml up -d
``` ```
At this point, you should be able to access the UI from http://localhost:4000, At this point, you should be able to access the UI from http://localhost:4000,
@@ -107,19 +107,19 @@ This allows you to run the Angular UI in *production* mode, pointing it at the d
``` ```
docker-compose -f docker/docker-compose-dist.yml pull docker-compose -f docker/docker-compose-dist.yml pull
docker-compose -f docker/docker-compose-dist.yml build docker-compose -f docker/docker-compose-dist.yml build
docker-compose -p d7 -f docker/docker-compose-dist.yml up -d docker-compose -p d8 -f docker/docker-compose-dist.yml up -d
``` ```
## Ingest test data from AIPDIR ## Ingest test data from AIPDIR
Create an administrator Create an administrator
``` ```
docker-compose -p d7 -f docker/cli.yml run --rm dspace-cli create-administrator -e test@test.edu -f admin -l user -p admin -c en docker-compose -p d8 -f docker/cli.yml run --rm dspace-cli create-administrator -e test@test.edu -f admin -l user -p admin -c en
``` ```
Load content from AIP files Load content from AIP files
``` ```
docker-compose -p d7 -f docker/cli.yml -f ./docker/cli.ingest.yml run --rm dspace-cli docker-compose -p d8 -f docker/cli.yml -f ./docker/cli.ingest.yml run --rm dspace-cli
``` ```
## Alternative Ingest - Use Entities dataset ## Alternative Ingest - Use Entities dataset
@@ -127,12 +127,12 @@ _Delete your docker volumes or use a unique project (-p) name_
Start DSpace with Database Content from a database dump Start DSpace with Database Content from a database dump
``` ```
docker-compose -p d7 -f docker/docker-compose.yml -f docker/docker-compose-rest.yml -f docker/db.entities.yml up -d docker-compose -p d8 -f docker/docker-compose.yml -f docker/docker-compose-rest.yml -f docker/db.entities.yml up -d
``` ```
Load assetstore content and trigger a re-index of the repository Load assetstore content and trigger a re-index of the repository
``` ```
docker-compose -p d7 -f docker/cli.yml -f docker/cli.assetstore.yml run --rm dspace-cli docker-compose -p d8 -f docker/cli.yml -f docker/cli.assetstore.yml run --rm dspace-cli
``` ```
## End to end testing of the REST API (runs in GitHub Actions CI). ## End to end testing of the REST API (runs in GitHub Actions CI).
@@ -140,5 +140,5 @@ _In this instance, only the REST api runs in Docker using the Entities dataset.
This command is only really useful for testing our Continuous Integration process. This command is only really useful for testing our Continuous Integration process.
``` ```
docker-compose -p d7ci -f docker/docker-compose-ci.yml up -d docker-compose -p d8ci -f docker/docker-compose-ci.yml up -d
``` ```

View File

@@ -33,6 +33,7 @@ services:
# Tell Statistics to commit all views immediately instead of waiting on Solr's autocommit. # Tell Statistics to commit all views immediately instead of waiting on Solr's autocommit.
# This allows us to generate statistics in e2e tests so that statistics pages can be tested thoroughly. # This allows us to generate statistics in e2e tests so that statistics pages can be tested thoroughly.
solr__D__statistics__P__autoCommit: 'false' solr__D__statistics__P__autoCommit: 'false'
LOGGING_CONFIG: /dspace/config/log4j2-container.xml
image: "${DOCKER_OWNER:-dspace}/dspace:${DSPACE_VER:-latest-test}" image: "${DOCKER_OWNER:-dspace}/dspace:${DSPACE_VER:-latest-test}"
depends_on: depends_on:
- dspacedb - dspacedb
@@ -60,15 +61,19 @@ services:
# NOTE: This is customized to use our loadsql image, so that we are using a database with existing test data # NOTE: This is customized to use our loadsql image, so that we are using a database with existing test data
dspacedb: dspacedb:
container_name: dspacedb container_name: dspacedb
image: "${DOCKER_OWNER:-dspace}/dspace-postgres-pgcrypto:${DSPACE_VER:-latest-loadsql}"
environment: environment:
# This LOADSQL should be kept in sync with the LOADSQL in # This LOADSQL should be kept in sync with the LOADSQL in
# https://github.com/DSpace/DSpace/blob/main/dspace/src/main/docker-compose/db.entities.yml # https://github.com/DSpace/DSpace/blob/main/dspace/src/main/docker-compose/db.entities.yml
# This SQL is available from https://github.com/DSpace-Labs/AIP-Files/releases/tag/demo-entities-data # This SQL is available from https://github.com/DSpace-Labs/AIP-Files/releases/tag/demo-entities-data
LOADSQL: https://github.com/DSpace-Labs/AIP-Files/releases/download/demo-entities-data/dspace7-entities-data.sql LOADSQL: https://github.com/DSpace-Labs/AIP-Files/releases/download/demo-entities-data/dspace7-entities-data.sql
PGDATA: /pgdata PGDATA: /pgdata
image: dspace/dspace-postgres-pgcrypto:loadsql POSTGRES_PASSWORD: dspace
networks: networks:
- dspacenet - dspacenet
ports:
- published: 5432
target: 5432
stdin_open: true stdin_open: true
tty: true tty: true
volumes: volumes:
@@ -105,6 +110,8 @@ services:
cp -r /opt/solr/server/solr/configsets/statistics/* statistics cp -r /opt/solr/server/solr/configsets/statistics/* statistics
precreate-core qaevent /opt/solr/server/solr/configsets/qaevent precreate-core qaevent /opt/solr/server/solr/configsets/qaevent
cp -r /opt/solr/server/solr/configsets/qaevent/* qaevent cp -r /opt/solr/server/solr/configsets/qaevent/* qaevent
precreate-core suggestion /opt/solr/server/solr/configsets/suggestion
cp -r /opt/solr/server/solr/configsets/suggestion/* suggestion
exec solr -f exec solr -f
volumes: volumes:
assetstore: assetstore:

View File

@@ -29,8 +29,9 @@ services:
# __D__ => "-" (e.g. google__D__metadata => google-metadata) # __D__ => "-" (e.g. google__D__metadata => google-metadata)
# dspace.dir, dspace.server.url, dspace.ui.url and dspace.name # dspace.dir, dspace.server.url, dspace.ui.url and dspace.name
dspace__P__dir: /dspace dspace__P__dir: /dspace
dspace__P__server__P__url: http://localhost:8080/server # Uncomment to set a non-default value for dspace.server.url or dspace.ui.url
dspace__P__ui__P__url: http://localhost:4000 # dspace__P__server__P__url: http://localhost:8080/server
# dspace__P__ui__P__url: http://localhost:4000
dspace__P__name: 'DSpace Started with Docker Compose' dspace__P__name: 'DSpace Started with Docker Compose'
# db.url: Ensure we are using the 'dspacedb' image for our database # db.url: Ensure we are using the 'dspacedb' image for our database
db__P__url: 'jdbc:postgresql://dspacedb:5432/dspace' db__P__url: 'jdbc:postgresql://dspacedb:5432/dspace'
@@ -39,6 +40,7 @@ services:
# proxies.trusted.ipranges: This setting is required for a REST API running in Docker to trust requests # proxies.trusted.ipranges: This setting is required for a REST API running in Docker to trust requests
# from the host machine. This IP range MUST correspond to the 'dspacenet' subnet defined above. # from the host machine. This IP range MUST correspond to the 'dspacenet' subnet defined above.
proxies__P__trusted__P__ipranges: '172.23.0' proxies__P__trusted__P__ipranges: '172.23.0'
LOGGING_CONFIG: /dspace/config/log4j2-container.xml
image: "${DOCKER_OWNER:-dspace}/dspace:${DSPACE_VER:-latest-test}" image: "${DOCKER_OWNER:-dspace}/dspace:${DSPACE_VER:-latest-test}"
depends_on: depends_on:
- dspacedb - dspacedb
@@ -50,6 +52,7 @@ services:
stdin_open: true stdin_open: true
tty: true tty: true
volumes: volumes:
# Keep DSpace assetstore directory between reboots
- assetstore:/dspace/assetstore - assetstore:/dspace/assetstore
# Ensure that the database is ready BEFORE starting tomcat # Ensure that the database is ready BEFORE starting tomcat
# 1. While a TCP connection to dspacedb port 5432 is not available, continue to sleep # 1. While a TCP connection to dspacedb port 5432 is not available, continue to sleep
@@ -65,9 +68,11 @@ services:
# DSpace database container # DSpace database container
dspacedb: dspacedb:
container_name: dspacedb container_name: dspacedb
# Uses a custom Postgres image with pgcrypto installed
image: "${DOCKER_OWNER:-dspace}/dspace-postgres-pgcrypto:${DSPACE_VER:-latest}"
environment: environment:
PGDATA: /pgdata PGDATA: /pgdata
image: "${DOCKER_OWNER:-dspace}/dspace-postgres-pgcrypto:${DSPACE_VER:-latest}" POSTGRES_PASSWORD: dspace
networks: networks:
- dspacenet - dspacenet
ports: ports:
@@ -113,6 +118,8 @@ services:
cp -r /opt/solr/server/solr/configsets/statistics/* statistics cp -r /opt/solr/server/solr/configsets/statistics/* statistics
precreate-core qaevent /opt/solr/server/solr/configsets/qaevent precreate-core qaevent /opt/solr/server/solr/configsets/qaevent
cp -r /opt/solr/server/solr/configsets/qaevent/* qaevent cp -r /opt/solr/server/solr/configsets/qaevent/* qaevent
precreate-core suggestion /opt/solr/server/solr/configsets/suggestion
cp -r /opt/solr/server/solr/configsets/suggestion/* suggestion
exec solr -f exec solr -f
volumes: volumes:
assetstore: assetstore:

View File

@@ -17,6 +17,9 @@ describe('SubmissionJsonPatchOperationsService', () => {
const rdbService = {} as RemoteDataBuildService; const rdbService = {} as RemoteDataBuildService;
const halEndpointService = {} as HALEndpointService; const halEndpointService = {} as HALEndpointService;
const uuid = '91ecbeda-99fe-42ac-9430-b9b75af56f78';
const href = 'https://rest.api/some/self/link?with=maybe&a=few&other=parameters';
function initTestService() { function initTestService() {
return new SubmissionJsonPatchOperationsService( return new SubmissionJsonPatchOperationsService(
requestService, requestService,
@@ -36,4 +39,16 @@ describe('SubmissionJsonPatchOperationsService', () => {
expect((service as any).patchRequestConstructor).toEqual(SubmissionPatchRequest); expect((service as any).patchRequestConstructor).toEqual(SubmissionPatchRequest);
}); });
describe(`getRequestInstance`, () => {
it(`should add a parameter to embed the item to the request URL`, () => {
const result = (service as any).getRequestInstance(uuid, href);
const resultURL = new URL(result.href);
expect(resultURL.searchParams.get('embed')).toEqual('item');
// if we delete the embed item param, it should be identical to the original url
resultURL.searchParams.delete('embed', 'item');
expect(href).toEqual(resultURL.toString());
});
});
}); });

View File

@@ -8,6 +8,7 @@ import { RequestService } from '../data/request.service';
import { JsonPatchOperationsService } from '../json-patch/json-patch-operations.service'; import { JsonPatchOperationsService } from '../json-patch/json-patch-operations.service';
import { HALEndpointService } from '../shared/hal-endpoint.service'; import { HALEndpointService } from '../shared/hal-endpoint.service';
import { SubmitDataResponseDefinitionObject } from '../shared/submit-data-response-definition.model'; import { SubmitDataResponseDefinitionObject } from '../shared/submit-data-response-definition.model';
import { URLCombiner } from '../url-combiner/url-combiner';
/** /**
* A service that provides methods to make JSON Patch requests. * A service that provides methods to make JSON Patch requests.
@@ -26,4 +27,20 @@ export class SubmissionJsonPatchOperationsService extends JsonPatchOperationsSer
super(); super();
} }
/**
* Return an instance for RestRequest class
*
* @param uuid
* The request uuid
* @param href
* The request href
* @param body
* The request body
* @return Object<PatchRequestDefinition>
* instance of PatchRequestDefinition
*/
protected getRequestInstance(uuid: string, href: string, body?: any): SubmissionPatchRequest {
return new this.patchRequestConstructor(uuid, new URLCombiner(href, '?embed=item').toString(), body);
}
} }

View File

@@ -24,8 +24,8 @@ import {
import { import {
BehaviorSubject, BehaviorSubject,
combineLatest as observableCombineLatest, combineLatest as observableCombineLatest,
EMPTY,
Observable, Observable,
of,
Subscription, Subscription,
} from 'rxjs'; } from 'rxjs';
import { import {
@@ -188,7 +188,7 @@ export class DsoEditMetadataComponent implements OnInit, OnDestroy {
const lazyProvider$: Observable<UpdateDataService<DSpaceObject>> = lazyDataService(this.dataServiceMap, this.dsoType, this.parentInjector); const lazyProvider$: Observable<UpdateDataService<DSpaceObject>> = lazyDataService(this.dataServiceMap, this.dsoType, this.parentInjector);
return lazyProvider$; return lazyProvider$;
} else { } else {
return EMPTY; return of(this.updateDataService);
} }
} }

View File

@@ -1,7 +1,9 @@
<a class="badge badge-primary mr-1 mb-1" <a class="badge badge-primary mb-1"
[attr.aria-label]="'search.filters.remove' | translate:{ type: ('search.filters.applied.' + key) | translate, value: normalizeFilterValue(value) }" [attr.aria-label]="'search.filters.remove' | translate:{ type: ('search.filters.applied.' + key) | translate, value: normalizeFilterValue(value) }"
[routerLink]="searchLink" [routerLink]="searchLink"
[queryParams]="(removeParameters | async)" queryParamsHandling="merge"> [queryParams]="(removeParameters | async)" queryParamsHandling="merge">
{{('search.filters.applied.' + key) | translate}}: {{'search.filters.' + filterName + '.' + value | translate: {default: normalizeFilterValue(value)} }} <span class="d-flex">
<span aria-hidden="true"> ×</span> <span class="flex-grow-1 text-left">{{('search.filters.applied.' + key) | translate}}: {{'search.filters.' + filterName + '.' + value | translate: {default: normalizeFilterValue(value)} }}</span>
<span class="pl-1" aria-hidden="true">×</span>
</span>
</a> </a>

View File

@@ -0,0 +1,3 @@
.badge {
white-space: inherit;
}

View File

@@ -26,6 +26,7 @@ import { stripOperatorFromFilterValue } from '../../search.utils';
@Component({ @Component({
selector: 'ds-search-label', selector: 'ds-search-label',
templateUrl: './search-label.component.html', templateUrl: './search-label.component.html',
styleUrls: ['./search-label.component.scss'],
standalone: true, standalone: true,
imports: [RouterLink, AsyncPipe, TranslateModule], imports: [RouterLink, AsyncPipe, TranslateModule],
}) })

View File

@@ -1,3 +1,10 @@
:host { :host {
line-height: 1; line-height: 1;
} .labels {
margin: 0 calc(-1 * var(--bs-spacer)/8);
ds-search-label {
display: inline-block;
padding: 0 calc(var(--bs-spacer)/8);
}
}
}

View File

@@ -96,8 +96,8 @@
[inPlaceSearch]="inPlaceSearch" [inPlaceSearch]="inPlaceSearch"
[searchPlaceholder]="searchFormPlaceholder | translate"> [searchPlaceholder]="searchFormPlaceholder | translate">
</ds-search-form> </ds-search-form>
<div class="row mb-3 mb-md-1"> <div class="mb-3 mb-md-1">
<div class="labels col-sm-9"> <div class="labels">
<ds-search-labels [inPlaceSearch]="inPlaceSearch"></ds-search-labels> <ds-search-labels [inPlaceSearch]="inPlaceSearch"></ds-search-labels>
</div> </div>
</div> </div>

View File

@@ -16,6 +16,8 @@ Disallow: /submit
Disallow: /workspaceitems Disallow: /workspaceitems
Disallow: /profile Disallow: /profile
Disallow: /workflowitems Disallow: /workflowitems
# Crawlers should be able to access entity pages, but not the facet search links present on entity pages
Disallow: /entities/*?f
# Optionally uncomment the following line ONLY if sitemaps are working # Optionally uncomment the following line ONLY if sitemaps are working
# and you have verified that your site is being indexed correctly. # and you have verified that your site is being indexed correctly.

View File

@@ -3,10 +3,11 @@ import {
NgIf, NgIf,
} from '@angular/common'; } from '@angular/common';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { RouterModule } from '@angular/router'; import { RouterLink } from '@angular/router';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { BrowseByTaxonomyComponent as BaseComponent } from '../../../../../app/browse-by/browse-by-taxonomy/browse-by-taxonomy.component'; import { BrowseByTaxonomyComponent as BaseComponent } from '../../../../../app/browse-by/browse-by-taxonomy/browse-by-taxonomy.component';
import { BrowseByComponent } from '../../../../../app/shared/browse-by/browse-by.component';
import { ThemedBrowseByComponent } from '../../../../../app/shared/browse-by/themed-browse-by.component'; import { ThemedBrowseByComponent } from '../../../../../app/shared/browse-by/themed-browse-by.component';
import { ThemedComcolPageBrowseByComponent } from '../../../../../app/shared/comcol/comcol-page-browse-by/themed-comcol-page-browse-by.component'; import { ThemedComcolPageBrowseByComponent } from '../../../../../app/shared/comcol/comcol-page-browse-by/themed-comcol-page-browse-by.component';
import { ComcolPageContentComponent } from '../../../../../app/shared/comcol/comcol-page-content/comcol-page-content.component'; import { ComcolPageContentComponent } from '../../../../../app/shared/comcol/comcol-page-content/comcol-page-content.component';
@@ -31,15 +32,16 @@ import { VarDirective } from '../../../../../app/shared/utils/var.directive';
ComcolPageHeaderComponent, ComcolPageHeaderComponent,
ComcolPageLogoComponent, ComcolPageLogoComponent,
NgIf, NgIf,
RouterModule,
ThemedComcolPageHandleComponent, ThemedComcolPageHandleComponent,
ComcolPageContentComponent, ComcolPageContentComponent,
DsoEditMenuComponent, DsoEditMenuComponent,
ThemedComcolPageBrowseByComponent, ThemedComcolPageBrowseByComponent,
VocabularyTreeviewComponent, BrowseByComponent,
TranslateModule, TranslateModule,
ThemedLoadingComponent, ThemedLoadingComponent,
ThemedBrowseByComponent, ThemedBrowseByComponent,
VocabularyTreeviewComponent,
RouterLink,
], ],
}) })
export class BrowseByTaxonomyComponent extends BaseComponent { export class BrowseByTaxonomyComponent extends BaseComponent {

View File

@@ -43,7 +43,6 @@ import { ViewTrackerComponent } from '../../../../app/statistics/angulartics/dsp
ComcolPageContentComponent, ComcolPageContentComponent,
ErrorComponent, ErrorComponent,
NgIf, NgIf,
RouterOutlet,
ThemedLoadingComponent, ThemedLoadingComponent,
TranslateModule, TranslateModule,
ViewTrackerComponent, ViewTrackerComponent,
@@ -55,6 +54,7 @@ import { ViewTrackerComponent } from '../../../../app/statistics/angulartics/dsp
DsoEditMenuComponent, DsoEditMenuComponent,
ThemedComcolPageBrowseByComponent, ThemedComcolPageBrowseByComponent,
ObjectCollectionComponent, ObjectCollectionComponent,
RouterOutlet,
], ],
}) })
/** /**

View File

@@ -11,6 +11,7 @@ import { ThemedDsoEditMetadataComponent } from '../../../../../app/dso-shared/ds
import { AlertComponent } from '../../../../../app/shared/alert/alert.component'; import { AlertComponent } from '../../../../../app/shared/alert/alert.component';
import { ThemedLoadingComponent } from '../../../../../app/shared/loading/themed-loading.component'; import { ThemedLoadingComponent } from '../../../../../app/shared/loading/themed-loading.component';
import { VarDirective } from '../../../../../app/shared/utils/var.directive'; import { VarDirective } from '../../../../../app/shared/utils/var.directive';
import { DsoEditMetadataComponent } from '../../dso-shared/dso-edit-metadata/dso-edit-metadata.component';
@Component({ @Component({
selector: 'ds-themed-edit-item-template-page', selector: 'ds-themed-edit-item-template-page',
@@ -20,6 +21,7 @@ import { VarDirective } from '../../../../../app/shared/utils/var.directive';
standalone: true, standalone: true,
imports: [ imports: [
ThemedDsoEditMetadataComponent, ThemedDsoEditMetadataComponent,
DsoEditMetadataComponent,
RouterLink, RouterLink,
AsyncPipe, AsyncPipe,
VarDirective, VarDirective,

View File

@@ -6,7 +6,10 @@ import {
ChangeDetectionStrategy, ChangeDetectionStrategy,
Component, Component,
} from '@angular/core'; } from '@angular/core';
import { RouterModule } from '@angular/router'; import {
RouterModule,
RouterOutlet,
} from '@angular/router';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { CommunityPageComponent as BaseComponent } from '../../../../app/community-page/community-page.component'; import { CommunityPageComponent as BaseComponent } from '../../../../app/community-page/community-page.component';
@@ -50,6 +53,7 @@ import { ViewTrackerComponent } from '../../../../app/statistics/angulartics/dsp
AsyncPipe, AsyncPipe,
ViewTrackerComponent, ViewTrackerComponent,
VarDirective, VarDirective,
RouterOutlet,
RouterModule, RouterModule,
], ],
}) })

View File

@@ -1,6 +1,15 @@
import {
AsyncPipe,
NgIf,
} from '@angular/common';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { TranslateModule } from '@ngx-translate/core';
import { CommunityPageSubCollectionListComponent as BaseComponent } from '../../../../../../../app/community-page/sections/sub-com-col-section/sub-collection-list/community-page-sub-collection-list.component'; import { CommunityPageSubCollectionListComponent as BaseComponent } from '../../../../../../../app/community-page/sections/sub-com-col-section/sub-collection-list/community-page-sub-collection-list.component';
import { ErrorComponent } from '../../../../../../../app/shared/error/error.component';
import { ThemedLoadingComponent } from '../../../../../../../app/shared/loading/themed-loading.component';
import { ObjectCollectionComponent } from '../../../../../../../app/shared/object-collection/object-collection.component';
import { VarDirective } from '../../../../../../../app/shared/utils/var.directive';
@Component({ @Component({
selector: 'ds-themed-community-page-sub-collection-list', selector: 'ds-themed-community-page-sub-collection-list',
@@ -8,6 +17,15 @@ import { CommunityPageSubCollectionListComponent as BaseComponent } from '../../
styleUrls: ['../../../../../app/community-page/sections/sub-com-col-section/sub-collection-list/community-page-sub-collection-list.component.scss'], styleUrls: ['../../../../../app/community-page/sections/sub-com-col-section/sub-collection-list/community-page-sub-collection-list.component.scss'],
// templateUrl: './community-page-sub-collection-list.component.html', // templateUrl: './community-page-sub-collection-list.component.html',
templateUrl: '../../../../../app/community-page/sections/sub-com-col-section/sub-collection-list/community-page-sub-collection-list.component.html', templateUrl: '../../../../../app/community-page/sections/sub-com-col-section/sub-collection-list/community-page-sub-collection-list.component.html',
imports: [
ObjectCollectionComponent,
ErrorComponent,
ThemedLoadingComponent,
NgIf,
TranslateModule,
AsyncPipe,
VarDirective,
],
standalone: true, standalone: true,
}) })
export class CommunityPageSubCollectionListComponent extends BaseComponent { export class CommunityPageSubCollectionListComponent extends BaseComponent {

View File

@@ -2,6 +2,7 @@ import { Component } from '@angular/core';
import { ThemedRegisterEmailFormComponent } from 'src/app/register-email-form/themed-registry-email-form.component'; import { ThemedRegisterEmailFormComponent } from 'src/app/register-email-form/themed-registry-email-form.component';
import { ForgotEmailComponent as BaseComponent } from '../../../../../app/forgot-password/forgot-password-email/forgot-email.component'; import { ForgotEmailComponent as BaseComponent } from '../../../../../app/forgot-password/forgot-password-email/forgot-email.component';
import { RegisterEmailFormComponent } from '../../../../../app/register-email-form/register-email-form.component';
@Component({ @Component({
selector: 'ds-themed-forgot-email', selector: 'ds-themed-forgot-email',
@@ -11,7 +12,7 @@ import { ForgotEmailComponent as BaseComponent } from '../../../../../app/forgot
templateUrl: '../../../../../app/forgot-password/forgot-password-email/forgot-email.component.html', templateUrl: '../../../../../app/forgot-password/forgot-password-email/forgot-email.component.html',
standalone: true, standalone: true,
imports: [ imports: [
ThemedRegisterEmailFormComponent, RegisterEmailFormComponent, ThemedRegisterEmailFormComponent,
], ],
}) })
/** /**

View File

@@ -18,8 +18,8 @@ import { BrowserOnlyPipe } from '../../../../../app/shared/utils/browser-only.pi
standalone: true, standalone: true,
imports: [ imports: [
TranslateModule, TranslateModule,
ProfilePageSecurityFormComponent,
BrowserOnlyPipe, BrowserOnlyPipe,
ProfilePageSecurityFormComponent,
AsyncPipe, AsyncPipe,
NgIf, NgIf,
], ],

View File

@@ -1,3 +1,7 @@
import {
AsyncPipe,
NgIf,
} from '@angular/common';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { RouterLink } from '@angular/router'; import { RouterLink } from '@angular/router';
import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap';
@@ -9,6 +13,7 @@ import { HeaderComponent as BaseComponent } from '../../../../app/header/header.
import { ThemedSearchNavbarComponent } from '../../../../app/search-navbar/themed-search-navbar.component'; import { ThemedSearchNavbarComponent } from '../../../../app/search-navbar/themed-search-navbar.component';
import { ThemedAuthNavMenuComponent } from '../../../../app/shared/auth-nav-menu/themed-auth-nav-menu.component'; import { ThemedAuthNavMenuComponent } from '../../../../app/shared/auth-nav-menu/themed-auth-nav-menu.component';
import { ImpersonateNavbarComponent } from '../../../../app/shared/impersonate-navbar/impersonate-navbar.component'; import { ImpersonateNavbarComponent } from '../../../../app/shared/impersonate-navbar/impersonate-navbar.component';
import { LangSwitchComponent } from '../../../../app/shared/lang-switch/lang-switch.component';
/** /**
* Represents the header with the logo and simple navigation * Represents the header with the logo and simple navigation
@@ -20,7 +25,7 @@ import { ImpersonateNavbarComponent } from '../../../../app/shared/impersonate-n
// templateUrl: 'header.component.html', // templateUrl: 'header.component.html',
templateUrl: '../../../../app/header/header.component.html', templateUrl: '../../../../app/header/header.component.html',
standalone: true, standalone: true,
imports: [RouterLink, ThemedLangSwitchComponent, NgbDropdownModule, ThemedSearchNavbarComponent, ContextHelpToggleComponent, ThemedAuthNavMenuComponent, ImpersonateNavbarComponent, TranslateModule], imports: [RouterLink, ThemedLangSwitchComponent, NgbDropdownModule, ThemedSearchNavbarComponent, LangSwitchComponent, ContextHelpToggleComponent, ThemedAuthNavMenuComponent, ImpersonateNavbarComponent, TranslateModule, AsyncPipe, NgIf],
}) })
export class HeaderComponent extends BaseComponent { export class HeaderComponent extends BaseComponent {
} }

View File

@@ -2,6 +2,7 @@ import {
AsyncPipe, AsyncPipe,
NgClass, NgClass,
NgIf, NgIf,
NgTemplateOutlet,
} from '@angular/common'; } from '@angular/common';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
@@ -12,6 +13,7 @@ import { HomePageComponent as BaseComponent } from '../../../../app/home-page/ho
import { RecentItemListComponent } from '../../../../app/home-page/recent-item-list/recent-item-list.component'; import { RecentItemListComponent } from '../../../../app/home-page/recent-item-list/recent-item-list.component';
import { ThemedTopLevelCommunityListComponent } from '../../../../app/home-page/top-level-community-list/themed-top-level-community-list.component'; import { ThemedTopLevelCommunityListComponent } from '../../../../app/home-page/top-level-community-list/themed-top-level-community-list.component';
import { SuggestionsPopupComponent } from '../../../../app/notifications/suggestions-popup/suggestions-popup.component'; import { SuggestionsPopupComponent } from '../../../../app/notifications/suggestions-popup/suggestions-popup.component';
import { ConfigurationSearchPageComponent } from '../../../../app/search-page/configuration-search-page.component';
import { ThemedConfigurationSearchPageComponent } from '../../../../app/search-page/themed-configuration-search-page.component'; import { ThemedConfigurationSearchPageComponent } from '../../../../app/search-page/themed-configuration-search-page.component';
import { ThemedSearchFormComponent } from '../../../../app/shared/search-form/themed-search-form.component'; import { ThemedSearchFormComponent } from '../../../../app/shared/search-form/themed-search-form.component';
import { PageWithSidebarComponent } from '../../../../app/shared/sidebar/page-with-sidebar.component'; import { PageWithSidebarComponent } from '../../../../app/shared/sidebar/page-with-sidebar.component';
@@ -24,7 +26,7 @@ import { ViewTrackerComponent } from '../../../../app/statistics/angulartics/dsp
// templateUrl: './home-page.component.html' // templateUrl: './home-page.component.html'
templateUrl: '../../../../app/home-page/home-page.component.html', templateUrl: '../../../../app/home-page/home-page.component.html',
standalone: true, standalone: true,
imports: [ThemedHomeNewsComponent, NgIf, ViewTrackerComponent, ThemedSearchFormComponent, ThemedTopLevelCommunityListComponent, RecentItemListComponent, AsyncPipe, TranslateModule, NgClass, ThemedConfigurationSearchPageComponent, SuggestionsPopupComponent, PageWithSidebarComponent, HomeCoarComponent], imports: [ThemedHomeNewsComponent, NgTemplateOutlet, NgIf, ViewTrackerComponent, ThemedSearchFormComponent, ThemedTopLevelCommunityListComponent, RecentItemListComponent, AsyncPipe, TranslateModule, NgClass, ConfigurationSearchPageComponent, SuggestionsPopupComponent, ThemedConfigurationSearchPageComponent, PageWithSidebarComponent, HomeCoarComponent],
}) })
export class HomePageComponent extends BaseComponent { export class HomePageComponent extends BaseComponent {

View File

@@ -44,11 +44,11 @@ import { ViewTrackerComponent } from '../../../../../app/statistics/angulartics/
ItemVersionsComponent, ItemVersionsComponent,
ErrorComponent, ErrorComponent,
ThemedLoadingComponent, ThemedLoadingComponent,
NotifyRequestsStatusComponent,
QaEventNotificationComponent,
TranslateModule, TranslateModule,
AsyncPipe, AsyncPipe,
NgIf, NgIf,
NotifyRequestsStatusComponent,
QaEventNotificationComponent,
], ],
}) })
export class ItemPageComponent extends BaseComponent { export class ItemPageComponent extends BaseComponent {

View File

@@ -1,4 +1,7 @@
import { CommonModule } from '@angular/common'; import {
AsyncPipe,
NgIf,
} from '@angular/common';
import { import {
ChangeDetectionStrategy, ChangeDetectionStrategy,
Component, Component,
@@ -39,26 +42,7 @@ import { ThemedThumbnailComponent } from '../../../../../../../app/thumbnail/the
templateUrl: '../../../../../../../app/item-page/simple/item-types/publication/publication.component.html', templateUrl: '../../../../../../../app/item-page/simple/item-types/publication/publication.component.html',
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true, standalone: true,
imports: [ imports: [NgIf, ThemedResultsBackButtonComponent, MiradorViewerComponent, ThemedItemPageTitleFieldComponent, DsoEditMenuComponent, MetadataFieldWrapperComponent, ThemedThumbnailComponent, ThemedMediaViewerComponent, ThemedFileSectionComponent, ItemPageDateFieldComponent, ThemedMetadataRepresentationListComponent, GenericItemPageFieldComponent, RelatedItemsComponent, ItemPageAbstractFieldComponent, ItemPageUriFieldComponent, CollectionsComponent, RouterLink, AsyncPipe, TranslateModule],
CommonModule,
ThemedResultsBackButtonComponent,
MiradorViewerComponent,
ThemedItemPageTitleFieldComponent,
DsoEditMenuComponent,
MetadataFieldWrapperComponent,
ThemedThumbnailComponent,
ThemedMediaViewerComponent,
ThemedFileSectionComponent,
ItemPageDateFieldComponent,
ThemedMetadataRepresentationListComponent,
GenericItemPageFieldComponent,
RelatedItemsComponent,
ItemPageAbstractFieldComponent,
TranslateModule,
ItemPageUriFieldComponent,
CollectionsComponent,
RouterLink,
],
}) })
export class PublicationComponent extends BaseComponent { export class PublicationComponent extends BaseComponent {

View File

@@ -1,4 +1,7 @@
import { CommonModule } from '@angular/common'; import {
AsyncPipe,
NgIf,
} from '@angular/common';
import { import {
ChangeDetectionStrategy, ChangeDetectionStrategy,
Component, Component,
@@ -38,25 +41,7 @@ import { ThemedThumbnailComponent } from '../../../../../../../app/thumbnail/the
templateUrl: '../../../../../../../app/item-page/simple/item-types/untyped-item/untyped-item.component.html', templateUrl: '../../../../../../../app/item-page/simple/item-types/untyped-item/untyped-item.component.html',
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true, standalone: true,
imports: [ imports: [NgIf, ThemedResultsBackButtonComponent, MiradorViewerComponent, ThemedItemPageTitleFieldComponent, DsoEditMenuComponent, MetadataFieldWrapperComponent, ThemedThumbnailComponent, ThemedMediaViewerComponent, ThemedFileSectionComponent, ItemPageDateFieldComponent, ThemedMetadataRepresentationListComponent, GenericItemPageFieldComponent, ItemPageAbstractFieldComponent, ItemPageUriFieldComponent, CollectionsComponent, RouterLink, AsyncPipe, TranslateModule],
CommonModule,
ThemedItemPageTitleFieldComponent,
DsoEditMenuComponent,
MetadataFieldWrapperComponent,
ThemedThumbnailComponent,
ThemedMediaViewerComponent,
ThemedFileSectionComponent,
ItemPageDateFieldComponent,
ThemedMetadataRepresentationListComponent,
GenericItemPageFieldComponent,
TranslateModule,
MiradorViewerComponent,
ThemedResultsBackButtonComponent,
CollectionsComponent,
RouterLink,
ItemPageUriFieldComponent,
ItemPageAbstractFieldComponent,
],
}) })
export class UntypedItemComponent extends BaseComponent { export class UntypedItemComponent extends BaseComponent {
} }

View File

@@ -3,6 +3,7 @@ import { TranslateModule } from '@ngx-translate/core';
import { ThemedLogInComponent } from 'src/app/shared/log-in/themed-log-in.component'; import { ThemedLogInComponent } from 'src/app/shared/log-in/themed-log-in.component';
import { LoginPageComponent as BaseComponent } from '../../../../app/login-page/login-page.component'; import { LoginPageComponent as BaseComponent } from '../../../../app/login-page/login-page.component';
import { LogInComponent } from '../../../../app/shared/log-in/log-in.component';
/** /**
* This component represents the login page * This component represents the login page
@@ -14,7 +15,7 @@ import { LoginPageComponent as BaseComponent } from '../../../../app/login-page/
// templateUrl: './login-page.component.html' // templateUrl: './login-page.component.html'
templateUrl: '../../../../app/login-page/login-page.component.html', templateUrl: '../../../../app/login-page/login-page.component.html',
standalone: true, standalone: true,
imports: [ThemedLogInComponent ,TranslateModule], imports: [LogInComponent, ThemedLogInComponent ,TranslateModule],
}) })
export class LoginPageComponent extends BaseComponent { export class LoginPageComponent extends BaseComponent {
} }

View File

@@ -40,11 +40,11 @@ import { ThemedSearchComponent } from '../../../../app/shared/search/themed-sear
imports: [ imports: [
ThemedSearchComponent, ThemedSearchComponent,
MyDSpaceNewSubmissionComponent, MyDSpaceNewSubmissionComponent,
MyDspaceQaEventsNotificationsComponent,
SuggestionsNotificationComponent,
AsyncPipe, AsyncPipe,
RoleDirective, RoleDirective,
NgIf, NgIf,
SuggestionsNotificationComponent,
MyDspaceQaEventsNotificationsComponent,
], ],
}) })
export class MyDSpacePageComponent extends BaseComponent { export class MyDSpacePageComponent extends BaseComponent {

View File

@@ -1,7 +1,15 @@
import {
AsyncPipe,
NgComponentOutlet,
NgFor,
NgIf,
} from '@angular/common';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { RouterLinkActive } from '@angular/router';
import { ExpandableNavbarSectionComponent as BaseComponent } from '../../../../../app/navbar/expandable-navbar-section/expandable-navbar-section.component'; import { ExpandableNavbarSectionComponent as BaseComponent } from '../../../../../app/navbar/expandable-navbar-section/expandable-navbar-section.component';
import { slide } from '../../../../../app/shared/animations/slide'; import { slide } from '../../../../../app/shared/animations/slide';
import { VarDirective } from '../../../../../app/shared/utils/var.directive';
/** /**
* Represents an expandable section in the navbar * Represents an expandable section in the navbar
@@ -14,6 +22,7 @@ import { slide } from '../../../../../app/shared/animations/slide';
styleUrls: ['../../../../../app/navbar/expandable-navbar-section/expandable-navbar-section.component.scss'], styleUrls: ['../../../../../app/navbar/expandable-navbar-section/expandable-navbar-section.component.scss'],
animations: [slide], animations: [slide],
standalone: true, standalone: true,
imports: [VarDirective, RouterLinkActive, NgComponentOutlet, NgIf, NgFor, AsyncPipe],
}) })
export class ExpandableNavbarSectionComponent extends BaseComponent { export class ExpandableNavbarSectionComponent extends BaseComponent {
} }

View File

@@ -23,13 +23,13 @@ import { VarDirective } from '../../../../app/shared/utils/var.directive';
imports: [ imports: [
ProfilePageMetadataFormComponent, ProfilePageMetadataFormComponent,
ProfilePageSecurityFormComponent, ProfilePageSecurityFormComponent,
SuggestionsNotificationComponent,
AsyncPipe, AsyncPipe,
TranslateModule, TranslateModule,
ProfilePageResearcherFormComponent, ProfilePageResearcherFormComponent,
VarDirective, VarDirective,
NgIf, NgIf,
NgForOf, NgForOf,
SuggestionsNotificationComponent,
], ],
}) })
/** /**

View File

@@ -1,6 +1,7 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { ThemedRegisterEmailFormComponent } from 'src/app/register-email-form/themed-registry-email-form.component'; import { ThemedRegisterEmailFormComponent } from 'src/app/register-email-form/themed-registry-email-form.component';
import { RegisterEmailFormComponent } from '../../../../../app/register-email-form/register-email-form.component';
import { RegisterEmailComponent as BaseComponent } from '../../../../../app/register-page/register-email/register-email.component'; import { RegisterEmailComponent as BaseComponent } from '../../../../../app/register-page/register-email/register-email.component';
@Component({ @Component({
@@ -11,7 +12,7 @@ import { RegisterEmailComponent as BaseComponent } from '../../../../../app/regi
templateUrl: '../../../../../app/register-page/register-email/register-email.component.html', templateUrl: '../../../../../app/register-page/register-email/register-email.component.html',
standalone: true, standalone: true,
imports: [ imports: [
ThemedRegisterEmailFormComponent, RegisterEmailFormComponent, ThemedRegisterEmailFormComponent,
], ],
}) })
/** /**

View File

@@ -30,8 +30,7 @@ import { StartsWithLoaderComponent } from '../../../../../app/shared/starts-with
fadeInOut, fadeInOut,
], ],
standalone: true, standalone: true,
imports: [VarDirective, NgClass, NgComponentOutlet, NgIf, ThemedResultsBackButtonComponent, ObjectCollectionComponent, imports: [VarDirective, NgClass, NgComponentOutlet, NgIf, ThemedResultsBackButtonComponent, ObjectCollectionComponent, ThemedLoadingComponent, ErrorComponent, AsyncPipe, TranslateModule, StartsWithLoaderComponent],
ThemedLoadingComponent, ErrorComponent, AsyncPipe, TranslateModule, StartsWithLoaderComponent],
}) })
export class BrowseByComponent extends BaseComponent { export class BrowseByComponent extends BaseComponent {
} }

View File

@@ -1,6 +1,7 @@
import { import {
AsyncPipe, AsyncPipe,
NgForOf, NgForOf,
NgIf,
} from '@angular/common'; } from '@angular/common';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { FormsModule } from '@angular/forms'; import { FormsModule } from '@angular/forms';
@@ -30,6 +31,7 @@ import { ComcolPageBrowseByComponent as BaseComponent } from '../../../../../app
RouterLinkActive, RouterLinkActive,
TranslateModule, TranslateModule,
AsyncPipe, AsyncPipe,
NgIf,
], ],
}) })
export class ComcolPageBrowseByComponent extends BaseComponent {} export class ComcolPageBrowseByComponent extends BaseComponent {}

View File

@@ -1,5 +1,5 @@
import { import {
NgForOf, NgFor,
NgIf, NgIf,
} from '@angular/common'; } from '@angular/common';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
@@ -15,7 +15,7 @@ import { LangSwitchComponent as BaseComponent } from '../../../../../app/shared/
// templateUrl: './lang-switch.component.html', // templateUrl: './lang-switch.component.html',
templateUrl: '../../../../../app/shared/lang-switch/lang-switch.component.html', templateUrl: '../../../../../app/shared/lang-switch/lang-switch.component.html',
standalone: true, standalone: true,
imports: [NgIf, NgbDropdownModule, NgForOf, TranslateModule], imports: [NgIf, NgbDropdownModule, NgFor, TranslateModule],
}) })
export class LangSwitchComponent extends BaseComponent { export class LangSwitchComponent extends BaseComponent {
} }

View File

@@ -1,3 +1,4 @@
import { NgIf } from '@angular/common';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { LoadingComponent as BaseComponent } from '../../../../../app/shared/loading/loading.component'; import { LoadingComponent as BaseComponent } from '../../../../../app/shared/loading/loading.component';
@@ -9,6 +10,7 @@ import { LoadingComponent as BaseComponent } from '../../../../../app/shared/loa
templateUrl: '../../../../../app/shared/loading/loading.component.html', templateUrl: '../../../../../app/shared/loading/loading.component.html',
// templateUrl: './loading.component.html' // templateUrl: './loading.component.html'
standalone: true, standalone: true,
imports: [NgIf],
}) })
export class LoadingComponent extends BaseComponent { export class LoadingComponent extends BaseComponent {

View File

@@ -22,10 +22,7 @@ import { BrowserOnlyPipe } from '../../../../../app/shared/utils/browser-only.pi
styleUrls: ['../../../../../app/shared/object-list/object-list.component.scss'], styleUrls: ['../../../../../app/shared/object-list/object-list.component.scss'],
// templateUrl: './object-list.component.html' // templateUrl: './object-list.component.html'
templateUrl: '../../../../../app/shared/object-list/object-list.component.html', templateUrl: '../../../../../app/shared/object-list/object-list.component.html',
imports: [ imports: [PaginationComponent, NgIf, NgClass, NgFor, SelectableListItemControlComponent, ImportableListItemControlComponent, ListableObjectComponentLoaderComponent, BrowserOnlyPipe],
PaginationComponent, NgIf, NgClass, NgFor, SelectableListItemControlComponent,
ImportableListItemControlComponent, ListableObjectComponentLoaderComponent, BrowserOnlyPipe,
],
standalone: true, standalone: true,
}) })