mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-07 01:54:15 +00:00
Merge branch 'DSpace:main' into issue/1081
This commit is contained in:
@@ -39,6 +39,8 @@ jobs:
|
||||
# Copy all labels from original PR to (newly created) port PR
|
||||
# NOTE: The labels matching 'label_pattern' are automatically excluded
|
||||
copy_labels_pattern: '.*'
|
||||
# Skip any merge commits in the ported PR. This means only non-merge commits are cherry-picked to the new PR
|
||||
merge_commits: 'skip'
|
||||
# Use a personal access token (PAT) to create PR as 'dspace-bot' user.
|
||||
# A PAT is required in order for the new PR to trigger its own actions (for CI checks)
|
||||
github_token: ${{ secrets.PR_PORT_TOKEN }}
|
@@ -157,8 +157,8 @@ DSPACE_UI_SSL => DSPACE_SSL
|
||||
|
||||
The same settings can also be overwritten by setting system environment variables instead, E.g.:
|
||||
```bash
|
||||
export DSPACE_HOST=api7.dspace.org
|
||||
export DSPACE_UI_PORT=4200
|
||||
export DSPACE_HOST=demo.dspace.org
|
||||
export DSPACE_UI_PORT=4000
|
||||
```
|
||||
|
||||
The priority works as follows: **environment variable** overrides **variable in `.env` file** overrides external config set by `DSPACE_APP_CONFIG_PATH` overrides **`config.(prod or dev).yml`**
|
||||
@@ -288,7 +288,7 @@ E2E tests (aka integration tests) use [Cypress.io](https://www.cypress.io/). Con
|
||||
The test files can be found in the `./cypress/integration/` folder.
|
||||
|
||||
Before you can run e2e tests, two things are REQUIRED:
|
||||
1. You MUST be running the DSpace backend (i.e. REST API) locally. The e2e tests will *NOT* succeed if run against our demo REST API (https://api7.dspace.org/server/), as that server is uncontrolled and may have content added/removed at any time.
|
||||
1. You MUST be running the DSpace backend (i.e. REST API) locally. The e2e tests will *NOT* succeed if run against our demo/sandbox REST API (https://demo.dspace.org/server/ or https://sandbox.dspace.org/server/), as those sites may have content added/removed at any time.
|
||||
* After starting up your backend on localhost, make sure either your `config.prod.yml` or `config.dev.yml` has its `rest` settings defined to use that localhost backend.
|
||||
* If you'd prefer, you may instead use environment variables as described at [Configuring](#configuring). For example:
|
||||
```
|
||||
|
@@ -22,7 +22,7 @@ ui:
|
||||
# 'synced' with the 'dspace.server.url' setting in your backend's local.cfg.
|
||||
rest:
|
||||
ssl: true
|
||||
host: api7.dspace.org
|
||||
host: sandbox.dspace.org
|
||||
port: 443
|
||||
# NOTE: Space is capitalized because 'namespace' is a reserved string in TypeScript
|
||||
nameSpace: /server
|
||||
@@ -292,33 +292,33 @@ themes:
|
||||
#
|
||||
# # A theme with a handle property will match the community, collection or item with the given
|
||||
# # handle, and all collections and/or items within it
|
||||
# - name: 'custom',
|
||||
# handle: '10673/1233'
|
||||
# - name: custom
|
||||
# handle: 10673/1233
|
||||
#
|
||||
# # A theme with a regex property will match the route using a regular expression. If it
|
||||
# # matches the route for a community or collection it will also apply to all collections
|
||||
# # and/or items within it
|
||||
# - name: 'custom',
|
||||
# regex: 'collections\/e8043bc2.*'
|
||||
# - name: custom
|
||||
# regex: collections\/e8043bc2.*
|
||||
#
|
||||
# # A theme with a uuid property will match the community, collection or item with the given
|
||||
# # ID, and all collections and/or items within it
|
||||
# - name: 'custom',
|
||||
# uuid: '0958c910-2037-42a9-81c7-dca80e3892b4'
|
||||
# - name: custom
|
||||
# uuid: 0958c910-2037-42a9-81c7-dca80e3892b4
|
||||
#
|
||||
# # The extends property specifies an ancestor theme (by name). Whenever a themed component is not found
|
||||
# # in the current theme, its ancestor theme(s) will be checked recursively before falling back to default.
|
||||
# - name: 'custom-A',
|
||||
# extends: 'custom-B',
|
||||
# - name: custom-A
|
||||
# extends: custom-B
|
||||
# # Any of the matching properties above can be used
|
||||
# handle: '10673/34'
|
||||
# handle: 10673/34
|
||||
#
|
||||
# - name: 'custom-B',
|
||||
# extends: 'custom',
|
||||
# handle: '10673/12'
|
||||
# - name: custom-B
|
||||
# extends: custom
|
||||
# handle: 10673/12
|
||||
#
|
||||
# # A theme with only a name will match every route
|
||||
# name: 'custom'
|
||||
# name: custom
|
||||
#
|
||||
# # This theme will use the default bootstrap styling for DSpace components
|
||||
# - name: BASE_THEME_NAME
|
||||
|
@@ -1,5 +1,5 @@
|
||||
rest:
|
||||
ssl: true
|
||||
host: api7.dspace.org
|
||||
host: sandbox.dspace.org
|
||||
port: 443
|
||||
nameSpace: /server
|
||||
|
@@ -1,4 +1,3 @@
|
||||
import { Options } from 'cypress-axe';
|
||||
import { testA11y } from 'cypress/support/utils';
|
||||
|
||||
describe('Community List Page', () => {
|
||||
@@ -13,13 +12,6 @@ describe('Community List Page', () => {
|
||||
cy.get('[data-test="expand-button"]').click({ multiple: true });
|
||||
|
||||
// Analyze <ds-community-list-page> for accessibility issues
|
||||
// Disable heading-order checks until it is fixed
|
||||
testA11y('ds-community-list-page',
|
||||
{
|
||||
rules: {
|
||||
'heading-order': { enabled: false }
|
||||
}
|
||||
} as Options
|
||||
);
|
||||
testA11y('ds-community-list-page');
|
||||
});
|
||||
});
|
||||
|
@@ -11,8 +11,7 @@ describe('Header', () => {
|
||||
testA11y({
|
||||
include: ['ds-header'],
|
||||
exclude: [
|
||||
['#search-navbar-container'], // search in navbar has duplicative ID. Will be fixed in #1174
|
||||
['.dropdownLogin'] // "Log in" link has color contrast issues. Will be fixed in #1149
|
||||
['#search-navbar-container'] // search in navbar has duplicative ID. Will be fixed in #1174
|
||||
],
|
||||
});
|
||||
});
|
||||
|
@@ -1,4 +1,3 @@
|
||||
import { Options } from 'cypress-axe';
|
||||
import { TEST_ENTITY_PUBLICATION } from 'cypress/support/e2e';
|
||||
import { testA11y } from 'cypress/support/utils';
|
||||
|
||||
@@ -19,13 +18,16 @@ describe('Item Page', () => {
|
||||
cy.get('ds-item-page').should('be.visible');
|
||||
|
||||
// Analyze <ds-item-page> for accessibility issues
|
||||
// Disable heading-order checks until it is fixed
|
||||
testA11y('ds-item-page',
|
||||
{
|
||||
rules: {
|
||||
'heading-order': { enabled: false }
|
||||
}
|
||||
} as Options
|
||||
);
|
||||
testA11y('ds-item-page');
|
||||
});
|
||||
|
||||
it('should pass accessibility tests on full item page', () => {
|
||||
cy.visit(ENTITYPAGE + '/full');
|
||||
|
||||
// <ds-full-item-page> tag must be loaded
|
||||
cy.get('ds-full-item-page').should('be.visible');
|
||||
|
||||
// Analyze <ds-full-item-page> for accessibility issues
|
||||
testA11y('ds-full-item-page');
|
||||
});
|
||||
});
|
||||
|
@@ -1,4 +1,5 @@
|
||||
import { TEST_ADMIN_PASSWORD, TEST_ADMIN_USER, TEST_ENTITY_PUBLICATION } from 'cypress/support/e2e';
|
||||
import { testA11y } from 'cypress/support/utils';
|
||||
|
||||
const page = {
|
||||
openLoginMenu() {
|
||||
@@ -123,4 +124,15 @@ describe('Login Modal', () => {
|
||||
cy.location('pathname').should('eq', '/forgot');
|
||||
cy.get('ds-forgot-email').should('exist');
|
||||
});
|
||||
|
||||
it('should pass accessibility tests', () => {
|
||||
cy.visit('/');
|
||||
|
||||
page.openLoginMenu();
|
||||
|
||||
cy.get('ds-log-in').should('exist');
|
||||
|
||||
// Analyze <ds-log-in> for accessibility issues
|
||||
testA11y('ds-log-in');
|
||||
});
|
||||
});
|
||||
|
@@ -19,21 +19,7 @@ describe('My DSpace page', () => {
|
||||
cy.get('.filter-toggle').click({ multiple: true });
|
||||
|
||||
// Analyze <ds-my-dspace-page> for accessibility issues
|
||||
testA11y(
|
||||
{
|
||||
include: ['ds-my-dspace-page'],
|
||||
exclude: [
|
||||
['nouislider'] // Date filter slider is missing ARIA labels. Will be fixed by #1175
|
||||
],
|
||||
},
|
||||
{
|
||||
rules: {
|
||||
// Search filters fail these two "moderate" impact rules
|
||||
'heading-order': { enabled: false },
|
||||
'landmark-unique': { enabled: false }
|
||||
}
|
||||
} as Options
|
||||
);
|
||||
testA11y('ds-my-dspace-page');
|
||||
});
|
||||
|
||||
it('should have a working detailed view that passes accessibility tests', () => {
|
||||
|
@@ -1,8 +1,13 @@
|
||||
import { testA11y } from 'cypress/support/utils';
|
||||
|
||||
describe('PageNotFound', () => {
|
||||
it('should contain element ds-pagenotfound when navigating to page that doesnt exist', () => {
|
||||
// request an invalid page (UUIDs at root path aren't valid)
|
||||
cy.visit('/e9019a69-d4f1-4773-b6a3-bd362caa46f2', { failOnStatusCode: false });
|
||||
cy.get('ds-pagenotfound').should('be.visible');
|
||||
|
||||
// Analyze <ds-pagenotfound> for accessibility issues
|
||||
testA11y('ds-pagenotfound');
|
||||
});
|
||||
|
||||
it('should not contain element ds-pagenotfound when navigating to existing page', () => {
|
||||
|
@@ -27,21 +27,7 @@ describe('Search Page', () => {
|
||||
cy.get('[data-test="filter-toggle"]').click({ multiple: true });
|
||||
|
||||
// Analyze <ds-search-page> for accessibility issues
|
||||
testA11y(
|
||||
{
|
||||
include: ['ds-search-page'],
|
||||
exclude: [
|
||||
['nouislider'] // Date filter slider is missing ARIA labels. Will be fixed by #1175
|
||||
],
|
||||
},
|
||||
{
|
||||
rules: {
|
||||
// Search filters fail these two "moderate" impact rules
|
||||
'heading-order': { enabled: false },
|
||||
'landmark-unique': { enabled: false }
|
||||
}
|
||||
} as Options
|
||||
);
|
||||
testA11y('ds-search-page');
|
||||
});
|
||||
|
||||
it('should have a working grid view that passes accessibility tests', () => {
|
||||
|
@@ -101,8 +101,8 @@ and the backend at http://localhost:8080/server/
|
||||
|
||||
## Run DSpace Angular dist build with DSpace Demo site backend
|
||||
|
||||
This allows you to run the Angular UI in *production* mode, pointing it at the demo backend
|
||||
(https://api7.dspace.org/server/).
|
||||
This allows you to run the Angular UI in *production* mode, pointing it at the demo or sandbox backend
|
||||
(https://demo.dspace.org/server/ or https://sandbox.dspace.org/server/).
|
||||
|
||||
```
|
||||
docker-compose -f docker/docker-compose-dist.yml pull
|
||||
|
@@ -24,7 +24,7 @@ services:
|
||||
# This is because Server Side Rendering (SSR) currently requires a public URL,
|
||||
# see this bug: https://github.com/DSpace/dspace-angular/issues/1485
|
||||
DSPACE_REST_SSL: 'true'
|
||||
DSPACE_REST_HOST: api7.dspace.org
|
||||
DSPACE_REST_HOST: sandbox.dspace.org
|
||||
DSPACE_REST_PORT: 443
|
||||
DSPACE_REST_NAMESPACE: /server
|
||||
image: dspace/dspace-angular:${DSPACE_VER:-latest}-dist
|
||||
|
@@ -48,7 +48,7 @@ dspace-angular connects to your DSpace installation by using its REST endpoint.
|
||||
```yaml
|
||||
rest:
|
||||
ssl: true
|
||||
host: api7.dspace.org
|
||||
host: demo.dspace.org
|
||||
port: 443
|
||||
nameSpace: /server
|
||||
}
|
||||
@@ -57,7 +57,7 @@ rest:
|
||||
Alternately you can set the following environment variables. If any of these are set, it will override all configuration files:
|
||||
```
|
||||
DSPACE_REST_SSL=true
|
||||
DSPACE_REST_HOST=api7.dspace.org
|
||||
DSPACE_REST_HOST=demo.dspace.org
|
||||
DSPACE_REST_PORT=443
|
||||
DSPACE_REST_NAMESPACE=/server
|
||||
```
|
||||
|
@@ -116,12 +116,12 @@
|
||||
"morgan": "^1.10.0",
|
||||
"ng-mocks": "^14.10.0",
|
||||
"ng2-file-upload": "1.4.0",
|
||||
"ng2-nouislider": "^1.8.3",
|
||||
"ng2-nouislider": "^2.0.0",
|
||||
"ngx-infinite-scroll": "^15.0.0",
|
||||
"ngx-pagination": "6.0.3",
|
||||
"ngx-sortablejs": "^11.1.0",
|
||||
"ngx-ui-switch": "^14.0.3",
|
||||
"nouislider": "^14.6.3",
|
||||
"nouislider": "^15.7.1",
|
||||
"pem": "1.14.7",
|
||||
"prop-types": "^15.8.1",
|
||||
"react-copy-to-clipboard": "^5.1.0",
|
||||
@@ -159,11 +159,11 @@
|
||||
"@types/sanitize-html": "^2.9.0",
|
||||
"@typescript-eslint/eslint-plugin": "^5.59.1",
|
||||
"@typescript-eslint/parser": "^5.59.1",
|
||||
"axe-core": "^4.7.0",
|
||||
"axe-core": "^4.7.2",
|
||||
"compression-webpack-plugin": "^9.2.0",
|
||||
"copy-webpack-plugin": "^6.4.1",
|
||||
"cross-env": "^7.0.3",
|
||||
"cypress": "12.10.0",
|
||||
"cypress": "12.17.4",
|
||||
"cypress-axe": "^1.4.0",
|
||||
"deep-freeze": "0.0.1",
|
||||
"eslint": "^8.39.0",
|
||||
|
13
server.ts
13
server.ts
@@ -320,22 +320,23 @@ function initCache() {
|
||||
if (botCacheEnabled()) {
|
||||
// Initialize a new "least-recently-used" item cache (where least recently used pages are removed first)
|
||||
// See https://www.npmjs.com/package/lru-cache
|
||||
// When enabled, each page defaults to expiring after 1 day
|
||||
// When enabled, each page defaults to expiring after 1 day (defined in default-app-config.ts)
|
||||
botCache = new LRU( {
|
||||
max: environment.cache.serverSide.botCache.max,
|
||||
ttl: environment.cache.serverSide.botCache.timeToLive || 24 * 60 * 60 * 1000, // 1 day
|
||||
allowStale: environment.cache.serverSide.botCache.allowStale ?? true // if object is stale, return stale value before deleting
|
||||
ttl: environment.cache.serverSide.botCache.timeToLive,
|
||||
allowStale: environment.cache.serverSide.botCache.allowStale
|
||||
});
|
||||
}
|
||||
|
||||
if (anonymousCacheEnabled()) {
|
||||
// NOTE: While caches may share SSR pages, this cache must be kept separately because the timeToLive
|
||||
// may expire pages more frequently.
|
||||
// When enabled, each page defaults to expiring after 10 seconds (to minimize anonymous users seeing out-of-date content)
|
||||
// When enabled, each page defaults to expiring after 10 seconds (defined in default-app-config.ts)
|
||||
// to minimize anonymous users seeing out-of-date content
|
||||
anonymousCache = new LRU( {
|
||||
max: environment.cache.serverSide.anonymousCache.max,
|
||||
ttl: environment.cache.serverSide.anonymousCache.timeToLive || 10 * 1000, // 10 seconds
|
||||
allowStale: environment.cache.serverSide.anonymousCache.allowStale ?? true // if object is stale, return stale value before deleting
|
||||
ttl: environment.cache.serverSide.anonymousCache.timeToLive,
|
||||
allowStale: environment.cache.serverSide.anonymousCache.allowStale
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
<div class="container">
|
||||
<h2>{{ 'communityList.title' | translate }}</h2>
|
||||
<h1>{{ 'communityList.title' | translate }}</h1>
|
||||
<ds-themed-community-list></ds-themed-community-list>
|
||||
</div>
|
||||
|
@@ -25,7 +25,7 @@ import { ShowMoreFlatNode } from './show-more-flat-node.model';
|
||||
import { FindListOptions } from '../core/data/find-list-options.model';
|
||||
import { AppConfig, APP_CONFIG } from 'src/config/app-config.interface';
|
||||
|
||||
// Helper method to combine an flatten an array of observables of flatNode arrays
|
||||
// Helper method to combine and flatten an array of observables of flatNode arrays
|
||||
export const combineAndFlatten = (obsList: Observable<FlatNode[]>[]): Observable<FlatNode[]> =>
|
||||
observableCombineLatest([...obsList]).pipe(
|
||||
map((matrix: any[][]) => [].concat(...matrix)),
|
||||
@@ -199,7 +199,7 @@ export class CommunityListService {
|
||||
* Transforms a community in a list of FlatNodes containing firstly a flatnode of the community itself,
|
||||
* followed by flatNodes of its possible subcommunities and collection
|
||||
* It gets called recursively for each subcommunity to add its subcommunities and collections to the list
|
||||
* Number of subcommunities and collections added, is dependant on the current page the parent is at for respectively subcommunities and collections.
|
||||
* Number of subcommunities and collections added, is dependent on the current page the parent is at for respectively subcommunities and collections.
|
||||
* @param community Community being transformed
|
||||
* @param level Depth of the community in the list, subcommunities and collections go one level deeper
|
||||
* @param parent Flatnode of the parent community
|
||||
@@ -275,7 +275,7 @@ export class CommunityListService {
|
||||
|
||||
/**
|
||||
* Checks if a community has subcommunities or collections by querying the respective services with a pageSize = 0
|
||||
* Returns an observable that combines the result.payload.totalElements fo the observables that the
|
||||
* Returns an observable that combines the result.payload.totalElements of the observables that the
|
||||
* respective services return when queried
|
||||
* @param community Community being checked whether it is expandable (if it has subcommunities or collections)
|
||||
*/
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<ds-themed-loading *ngIf="(dataSource.loading$ | async) && !loadingNode" class="ds-themed-loading"></ds-themed-loading>
|
||||
<cdk-tree [dataSource]="dataSource" [treeControl]="treeControl">
|
||||
<cdk-tree [dataSource]="dataSource" [treeControl]="treeControl" [trackBy]="trackBy">
|
||||
<!-- This is the tree node template for show more node -->
|
||||
<cdk-tree-node *cdkTreeNodeDef="let node; when: isShowMore" cdkTreeNodePadding
|
||||
class="example-tree-node show-more-node">
|
||||
@@ -34,13 +34,13 @@
|
||||
aria-hidden="true"></span>
|
||||
</button>
|
||||
<div class="d-flex flex-row">
|
||||
<h5 class="align-middle pt-2">
|
||||
<span class="align-middle pt-2 lead">
|
||||
<a [routerLink]="node.route" class="lead">
|
||||
{{ dsoNameService.getName(node.payload) }}
|
||||
</a>
|
||||
<span class="pr-2"> </span>
|
||||
<span *ngIf="node.payload.archivedItemsCount >= 0" class="badge badge-pill badge-secondary align-top archived-items-lead">{{node.payload.archivedItemsCount}}</span>
|
||||
</h5>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<ds-truncatable [id]="node.id">
|
||||
|
@@ -28,10 +28,9 @@ export class CommunityListComponent implements OnInit, OnDestroy {
|
||||
treeControl = new FlatTreeControl<FlatNode>(
|
||||
(node: FlatNode) => node.level, (node: FlatNode) => true
|
||||
);
|
||||
|
||||
dataSource: CommunityListDatasource;
|
||||
|
||||
paginationConfig: FindListOptions;
|
||||
trackBy = (index, node: FlatNode) => node.id;
|
||||
|
||||
constructor(
|
||||
protected communityListService: CommunityListService,
|
||||
@@ -58,18 +57,28 @@ export class CommunityListComponent implements OnInit, OnDestroy {
|
||||
this.communityListService.saveCommunityListStateToStore(this.expandedNodes, this.loadingNode);
|
||||
}
|
||||
|
||||
// whether or not this node has children (subcommunities or collections)
|
||||
/**
|
||||
* Whether this node has children (subcommunities or collections)
|
||||
* @param _
|
||||
* @param node
|
||||
*/
|
||||
hasChild(_: number, node: FlatNode) {
|
||||
return node.isExpandable$;
|
||||
}
|
||||
|
||||
// whether or not it is a show more node (contains no data, but is indication that there are more topcoms, subcoms or collections
|
||||
/**
|
||||
* Whether this is a show more node that contains no data, but indicates that there is
|
||||
* one or more community or collection.
|
||||
* @param _
|
||||
* @param node
|
||||
*/
|
||||
isShowMore(_: number, node: FlatNode) {
|
||||
return node.isShowMoreNode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Toggles the expanded variable of a node, adds it to the expanded nodes list and reloads the tree so this node is expanded
|
||||
* Toggles the expanded variable of a node, adds it to the expanded nodes list and reloads the tree
|
||||
* so this node is expanded
|
||||
* @param node Node we want to expand
|
||||
*/
|
||||
toggleExpanded(node: FlatNode) {
|
||||
@@ -92,9 +101,12 @@ export class CommunityListComponent implements OnInit, OnDestroy {
|
||||
|
||||
/**
|
||||
* Makes sure the next page of a node is added to the tree (top community, sub community of collection)
|
||||
* > Finds its parent (if not top community) and increases its corresponding collection/subcommunity currentPage
|
||||
* > Reloads tree with new page added to corresponding top community lis, sub community list or collection list
|
||||
* @param node The show more node indicating whether it's an increase in top communities, sub communities or collections
|
||||
* > Finds its parent (if not top community) and increases its corresponding collection/subcommunity
|
||||
* currentPage
|
||||
* > Reloads tree with new page added to corresponding top community lis, sub community list or
|
||||
* collection list
|
||||
* @param node The show more node indicating whether it's an increase in top communities, sub communities
|
||||
* or collections
|
||||
*/
|
||||
getNextPage(node: FlatNode): void {
|
||||
this.loadingNode = node;
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/**
|
||||
* The show more links in the community tree are also represented by a flatNode so we know where in
|
||||
* the tree it should be rendered an who its parent is (needed for the action resulting in clicking this link)
|
||||
* the tree it should be rendered and who its parent is (needed for the action resulting in clicking this link)
|
||||
*/
|
||||
export class ShowMoreFlatNode {
|
||||
}
|
||||
|
@@ -1,6 +1,6 @@
|
||||
import { Store, StoreModule } from '@ngrx/store';
|
||||
import { cold, getTestScheduler } from 'jasmine-marbles';
|
||||
import { EMPTY, of as observableOf } from 'rxjs';
|
||||
import { EMPTY, Observable, of as observableOf } from 'rxjs';
|
||||
import { TestScheduler } from 'rxjs/testing';
|
||||
|
||||
import { getMockObjectCacheService } from '../../shared/mocks/object-cache.service.mock';
|
||||
@@ -638,4 +638,48 @@ describe('RequestService', () => {
|
||||
expect(done$).toBeObservable(cold('-----(t|)', { t: true }));
|
||||
}));
|
||||
});
|
||||
|
||||
describe('setStaleByHrefSubstring', () => {
|
||||
let dispatchSpy: jasmine.Spy;
|
||||
let getByUUIDSpy: jasmine.Spy;
|
||||
|
||||
beforeEach(() => {
|
||||
dispatchSpy = spyOn(store, 'dispatch');
|
||||
getByUUIDSpy = spyOn(service, 'getByUUID').and.callThrough();
|
||||
});
|
||||
|
||||
describe('with an empty/no matching requests in the state', () => {
|
||||
it('should return true', () => {
|
||||
const done$: Observable<boolean> = service.setStaleByHrefSubstring('https://rest.api/endpoint/selfLink');
|
||||
expect(done$).toBeObservable(cold('(a|)', { a: true }));
|
||||
});
|
||||
});
|
||||
|
||||
describe('with a matching request in the state', () => {
|
||||
beforeEach(() => {
|
||||
const state = Object.assign({}, initialState, {
|
||||
core: Object.assign({}, initialState.core, {
|
||||
'index': {
|
||||
'get-request/href-to-uuid': {
|
||||
'https://rest.api/endpoint/selfLink': '5f2a0d2a-effa-4d54-bd54-5663b960f9eb'
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
mockStore.setState(state);
|
||||
});
|
||||
|
||||
it('should return an Observable that emits true as soon as the request is stale', () => {
|
||||
dispatchSpy.and.callFake(() => { /* empty */ }); // don't actually set as stale
|
||||
getByUUIDSpy.and.returnValue(cold('a-b--c--d-', { // but fake the state in the cache
|
||||
a: { state: RequestEntryState.ResponsePending },
|
||||
b: { state: RequestEntryState.Success },
|
||||
c: { state: RequestEntryState.SuccessStale },
|
||||
d: { state: RequestEntryState.Error },
|
||||
}));
|
||||
const done$: Observable<boolean> = service.setStaleByHrefSubstring('https://rest.api/endpoint/selfLink');
|
||||
expect(done$).toBeObservable(cold('-----(a|)', { a: true }));
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@@ -2,8 +2,8 @@ import { Injectable } from '@angular/core';
|
||||
import { HttpHeaders } from '@angular/common/http';
|
||||
|
||||
import { createSelector, MemoizedSelector, select, Store } from '@ngrx/store';
|
||||
import { Observable } from 'rxjs';
|
||||
import { filter, map, take, tap } from 'rxjs/operators';
|
||||
import { Observable, from as observableFrom } from 'rxjs';
|
||||
import { filter, find, map, mergeMap, switchMap, take, tap, toArray } from 'rxjs/operators';
|
||||
import cloneDeep from 'lodash/cloneDeep';
|
||||
import { hasValue, isEmpty, isNotEmpty, hasNoValue } from '../../shared/empty.util';
|
||||
import { ObjectCacheEntry } from '../cache/object-cache.reducer';
|
||||
@@ -300,22 +300,42 @@ export class RequestService {
|
||||
* Set all requests that match (part of) the href to stale
|
||||
*
|
||||
* @param href A substring of the request(s) href
|
||||
* @return Returns an observable emitting whether or not the cache is removed
|
||||
* @return Returns an observable emitting when those requests are all stale
|
||||
*/
|
||||
setStaleByHrefSubstring(href: string): Observable<boolean> {
|
||||
this.store.pipe(
|
||||
const requestUUIDs$ = this.store.pipe(
|
||||
select(uuidsFromHrefSubstringSelector(requestIndexSelector, href)),
|
||||
take(1)
|
||||
).subscribe((uuids: string[]) => {
|
||||
);
|
||||
requestUUIDs$.subscribe((uuids: string[]) => {
|
||||
for (const uuid of uuids) {
|
||||
this.store.dispatch(new RequestStaleAction(uuid));
|
||||
}
|
||||
});
|
||||
this.requestsOnTheirWayToTheStore = this.requestsOnTheirWayToTheStore.filter((reqHref: string) => reqHref.indexOf(href) < 0);
|
||||
|
||||
return this.store.pipe(
|
||||
select(uuidsFromHrefSubstringSelector(requestIndexSelector, href)),
|
||||
map((uuids) => isEmpty(uuids))
|
||||
// emit true after all requests are stale
|
||||
return requestUUIDs$.pipe(
|
||||
switchMap((uuids: string[]) => {
|
||||
if (isEmpty(uuids)) {
|
||||
// if there were no matching requests, emit true immediately
|
||||
return [true];
|
||||
} else {
|
||||
// otherwise emit all request uuids in order
|
||||
return observableFrom(uuids).pipe(
|
||||
// retrieve the RequestEntry for each uuid
|
||||
mergeMap((uuid: string) => this.getByUUID(uuid)),
|
||||
// check whether it is undefined or stale
|
||||
map((request: RequestEntry) => hasNoValue(request) || isStale(request.state)),
|
||||
// if it is, complete
|
||||
find((stale: boolean) => stale === true),
|
||||
// after all observables above are completed, emit them as a single array
|
||||
toArray(),
|
||||
// when the array comes in, emit true
|
||||
map(() => true)
|
||||
);
|
||||
}
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
|
@@ -38,8 +38,8 @@ export class BrowserHardRedirectService extends HardRedirectService {
|
||||
/**
|
||||
* Get the origin of the current URL
|
||||
* i.e. <scheme> "://" <hostname> [ ":" <port> ]
|
||||
* e.g. if the URL is https://demo7.dspace.org/search?query=test,
|
||||
* the origin would be https://demo7.dspace.org
|
||||
* e.g. if the URL is https://demo.dspace.org/search?query=test,
|
||||
* the origin would be https://demo.dspace.org
|
||||
*/
|
||||
getCurrentOrigin(): string {
|
||||
return this.location.origin;
|
||||
|
@@ -25,8 +25,8 @@ export abstract class HardRedirectService {
|
||||
/**
|
||||
* Get the origin of the current URL
|
||||
* i.e. <scheme> "://" <hostname> [ ":" <port> ]
|
||||
* e.g. if the URL is https://demo7.dspace.org/search?query=test,
|
||||
* the origin would be https://demo7.dspace.org
|
||||
* e.g. if the URL is https://demo.dspace.org/search?query=test,
|
||||
* the origin would be https://demo.dspace.org
|
||||
*/
|
||||
abstract getCurrentOrigin(): string;
|
||||
}
|
||||
|
@@ -69,8 +69,8 @@ export class ServerHardRedirectService extends HardRedirectService {
|
||||
/**
|
||||
* Get the origin of the current URL
|
||||
* i.e. <scheme> "://" <hostname> [ ":" <port> ]
|
||||
* e.g. if the URL is https://demo7.dspace.org/search?query=test,
|
||||
* the origin would be https://demo7.dspace.org
|
||||
* e.g. if the URL is https://demo.dspace.org/search?query=test,
|
||||
* the origin would be https://demo.dspace.org
|
||||
*/
|
||||
getCurrentOrigin(): string {
|
||||
return this.req.protocol + '://' + this.req.headers.host;
|
||||
|
@@ -1,6 +1,6 @@
|
||||
<h2 class="item-page-title-field">
|
||||
<h1 class="item-page-title-field">
|
||||
<div *ngIf="item.firstMetadataValue('dspace.entity.type') as type" class="d-inline">
|
||||
{{ type.toLowerCase() + '.page.titleprefix' | translate }}
|
||||
</div>
|
||||
<span class="dont-break-out">{{ dsoNameService.getName(item) }}</span>
|
||||
</h2>
|
||||
</h1>
|
||||
|
@@ -2,5 +2,6 @@
|
||||
[fixedFilterQuery]="fixedFilter"
|
||||
[configuration]="configuration"
|
||||
[searchEnabled]="searchEnabled"
|
||||
[sideBarWidth]="sideBarWidth">
|
||||
[sideBarWidth]="sideBarWidth"
|
||||
[showCsvExport]="true">
|
||||
</ds-configuration-search-page>
|
||||
|
@@ -130,7 +130,7 @@ export class DsDynamicListComponent extends DynamicFormControlComponent implemen
|
||||
(v) => v.value === option.value));
|
||||
|
||||
const item: ListItem = {
|
||||
id: value,
|
||||
id: `${this.model.id}_${value}`,
|
||||
label: option.display,
|
||||
value: checked,
|
||||
index: key
|
||||
|
@@ -43,7 +43,7 @@
|
||||
|
||||
<button class="dropdown-item disabled" *ngIf="optionsList && optionsList.length == 0">{{'form.no-results' | translate}}</button>
|
||||
<button class="dropdown-item collection-item text-truncate" *ngFor="let listEntry of optionsList"
|
||||
(click)="onSelect(listEntry); sdRef.close()" (mousedown)="onSelect(listEntry); sdRef.close()"
|
||||
(keydown.enter)="onSelect(listEntry); sdRef.close()" (mousedown)="onSelect(listEntry); sdRef.close()"
|
||||
title="{{ listEntry.display }}" role="option"
|
||||
[attr.id]="listEntry.display == (currentValue|async) ? ('combobox_' + id + '_selected') : null">
|
||||
{{inputFormatter(listEntry)}}
|
||||
|
@@ -159,14 +159,15 @@ describe('Dynamic Dynamic Scrollable Dropdown component', () => {
|
||||
let de: any = scrollableDropdownFixture.debugElement.query(By.css('input.form-control'));
|
||||
let btnEl = de.nativeElement;
|
||||
|
||||
btnEl.click();
|
||||
const mousedownEvent = new MouseEvent('mousedown');
|
||||
|
||||
btnEl.dispatchEvent(mousedownEvent);
|
||||
scrollableDropdownFixture.detectChanges();
|
||||
|
||||
de = scrollableDropdownFixture.debugElement.queryAll(By.css('button.dropdown-item'));
|
||||
btnEl = de[0].nativeElement;
|
||||
|
||||
btnEl.click();
|
||||
|
||||
btnEl.dispatchEvent(mousedownEvent);
|
||||
scrollableDropdownFixture.detectChanges();
|
||||
|
||||
expect((scrollableDropdownComp.model as any).value).toEqual(selectedValue);
|
||||
|
@@ -42,6 +42,7 @@
|
||||
[collection]="collection"
|
||||
[relationship]="relationshipOptions"
|
||||
[context]="context"
|
||||
[query]="query"
|
||||
[externalSource]="source"
|
||||
(importedObject)="imported($event)"
|
||||
class="d-block pt-3">
|
||||
|
@@ -75,6 +75,12 @@ export class DsDynamicLookupRelationExternalSourceTabComponent implements OnInit
|
||||
* The context to displaying lists for
|
||||
*/
|
||||
@Input() context: Context;
|
||||
|
||||
/**
|
||||
* The search query
|
||||
*/
|
||||
@Input() query: string;
|
||||
|
||||
@Input() repeatable: boolean;
|
||||
/**
|
||||
* Emit an event when an object has been imported (or selected from similar local entries)
|
||||
@@ -149,8 +155,12 @@ export class DsDynamicLookupRelationExternalSourceTabComponent implements OnInit
|
||||
|
||||
this.resetRoute();
|
||||
this.entriesRD$ = this.searchConfigService.paginatedSearchOptions.pipe(
|
||||
switchMap((searchOptions: PaginatedSearchOptions) =>
|
||||
this.externalSourceService.getExternalSourceEntries(this.externalSource.id, searchOptions).pipe(startWith(undefined)))
|
||||
switchMap((searchOptions: PaginatedSearchOptions) => {
|
||||
if (searchOptions.query === '') {
|
||||
searchOptions.query = this.query;
|
||||
}
|
||||
return this.externalSourceService.getExternalSourceEntries(this.externalSource.id, searchOptions).pipe(startWith(undefined));
|
||||
})
|
||||
);
|
||||
this.currentPagination$ = this.paginationService.getCurrentPagination(this.searchConfigService.paginationID, this.initialPagination);
|
||||
this.importConfig = {
|
||||
|
@@ -15,7 +15,7 @@ import { DsDynamicLookupRelationExternalSourceTabComponent } from './dynamic-loo
|
||||
})
|
||||
export class ThemedDynamicLookupRelationExternalSourceTabComponent extends ThemedComponent<DsDynamicLookupRelationExternalSourceTabComponent> {
|
||||
protected inAndOutputNames: (keyof DsDynamicLookupRelationExternalSourceTabComponent & keyof this)[] = ['label', 'listId',
|
||||
'item', 'collection', 'relationship', 'context', 'repeatable', 'importedObject', 'externalSource'];
|
||||
'item', 'collection', 'relationship', 'context', 'query', 'repeatable', 'importedObject', 'externalSource'];
|
||||
|
||||
@Input() label: string;
|
||||
|
||||
@@ -29,6 +29,8 @@ export class ThemedDynamicLookupRelationExternalSourceTabComponent extends Theme
|
||||
|
||||
@Input() context: Context;
|
||||
|
||||
@Input() query: string;
|
||||
|
||||
@Input() repeatable: boolean;
|
||||
|
||||
@Output() importedObject: EventEmitter<ListableObject> = new EventEmitter();
|
||||
|
@@ -1,5 +1,5 @@
|
||||
import { FlatTreeControl } from '@angular/cdk/tree';
|
||||
import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';
|
||||
import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, OnChanges, SimpleChanges } from '@angular/core';
|
||||
|
||||
import { map } from 'rxjs/operators';
|
||||
import { Observable, Subscription } from 'rxjs';
|
||||
@@ -28,7 +28,7 @@ import { getFirstSucceededRemoteDataPayload } from '../../../core/shared/operato
|
||||
templateUrl: './vocabulary-treeview.component.html',
|
||||
styleUrls: ['./vocabulary-treeview.component.scss']
|
||||
})
|
||||
export class VocabularyTreeviewComponent implements OnDestroy, OnInit {
|
||||
export class VocabularyTreeviewComponent implements OnDestroy, OnInit, OnChanges {
|
||||
|
||||
/**
|
||||
* The {@link VocabularyOptions} object
|
||||
@@ -322,4 +322,9 @@ export class VocabularyTreeviewComponent implements OnDestroy, OnInit {
|
||||
private getEntryId(entry: VocabularyEntry): string {
|
||||
return entry.authority || entry.otherInformation.id || undefined;
|
||||
}
|
||||
|
||||
ngOnChanges(changes: SimpleChanges): void {
|
||||
this.reset();
|
||||
this.vocabularyTreeviewService.initialize(this.vocabularyOptions, new PageInfo(), this.selectedItems, null);
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<div class="simple-view-element" [class.d-none]="hideIfNoTextContent && content.textContent.trim().length === 0">
|
||||
<h5 class="simple-view-element-header" *ngIf="label">{{ label }}</h5>
|
||||
<h2 class="simple-view-element-header" *ngIf="label">{{ label }}</h2>
|
||||
<div #content class="simple-view-element-body">
|
||||
<ng-content></ng-content>
|
||||
</div>
|
||||
|
@@ -2,4 +2,7 @@
|
||||
.simple-view-element {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
.simple-view-element-header {
|
||||
font-size: 1.25rem;
|
||||
}
|
||||
}
|
||||
|
@@ -28,6 +28,7 @@ describe('SearchFormComponent', () => {
|
||||
const searchService = new SearchServiceStub();
|
||||
const paginationService = new PaginationServiceStub();
|
||||
const searchConfigService = { paginationID: 'test-id' };
|
||||
const firstPage = { 'spc.page': 1 };
|
||||
const dspaceObjectService = {
|
||||
findById: () => createSuccessfulRemoteDataObject$(undefined),
|
||||
};
|
||||
@@ -104,16 +105,16 @@ describe('SearchFormComponent', () => {
|
||||
const scope = 'MCU';
|
||||
let searchQuery = {};
|
||||
|
||||
it('should navigate to the search page even when no parameters are provided', () => {
|
||||
it('should navigate to the search first page even when no parameters are provided', () => {
|
||||
comp.updateSearch(searchQuery);
|
||||
|
||||
expect(router.navigate).toHaveBeenCalledWith(comp.getSearchLinkParts(), {
|
||||
queryParams: searchQuery,
|
||||
queryParams: { ...searchQuery, ...firstPage },
|
||||
queryParamsHandling: 'merge'
|
||||
});
|
||||
});
|
||||
|
||||
it('should navigate to the search page with parameters only query if only query is provided', () => {
|
||||
it('should navigate to the search first page with parameters only query if only query is provided', () => {
|
||||
searchQuery = {
|
||||
query: query
|
||||
};
|
||||
@@ -121,12 +122,12 @@ describe('SearchFormComponent', () => {
|
||||
comp.updateSearch(searchQuery);
|
||||
|
||||
expect(router.navigate).toHaveBeenCalledWith(comp.getSearchLinkParts(), {
|
||||
queryParams: searchQuery,
|
||||
queryParams: { ...searchQuery, ...firstPage },
|
||||
queryParamsHandling: 'merge'
|
||||
});
|
||||
});
|
||||
|
||||
it('should navigate to the search page with parameters only query if only scope is provided', () => {
|
||||
it('should navigate to the search first page with parameters only query if only scope is provided', () => {
|
||||
searchQuery = {
|
||||
scope: scope
|
||||
};
|
||||
@@ -134,7 +135,7 @@ describe('SearchFormComponent', () => {
|
||||
comp.updateSearch(searchQuery);
|
||||
|
||||
expect(router.navigate).toHaveBeenCalledWith(comp.getSearchLinkParts(), {
|
||||
queryParams: searchQuery,
|
||||
queryParams: {...searchQuery, ...firstPage},
|
||||
queryParamsHandling: 'merge'
|
||||
});
|
||||
});
|
||||
|
@@ -114,7 +114,14 @@ export class SearchFormComponent implements OnChanges {
|
||||
* @param data Updated parameters
|
||||
*/
|
||||
updateSearch(data: any) {
|
||||
const queryParams = Object.assign({}, data);
|
||||
const goToFirstPage = { 'spc.page': 1 };
|
||||
|
||||
const queryParams = Object.assign(
|
||||
{
|
||||
...goToFirstPage
|
||||
},
|
||||
data
|
||||
);
|
||||
|
||||
void this.router.navigate(this.getSearchLinkParts(), {
|
||||
queryParams: queryParams,
|
||||
|
@@ -94,6 +94,19 @@ export class SearchExportCsvComponent implements OnInit {
|
||||
}
|
||||
});
|
||||
}
|
||||
if (isNotEmpty(this.searchConfig.fixedFilter)) {
|
||||
const fixedFilter = this.searchConfig.fixedFilter.substring(2);
|
||||
const keyAndValue = fixedFilter.split('=');
|
||||
if (keyAndValue.length > 1) {
|
||||
const key = keyAndValue[0];
|
||||
const valueAndOperator = keyAndValue[1].split(',');
|
||||
if (valueAndOperator.length > 1) {
|
||||
const value = valueAndOperator[0];
|
||||
const operator = valueAndOperator[1];
|
||||
parameters.push({name: '-f', value: `${key},${operator}=${value}`});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.scriptDataService.invoke('metadata-export-search', parameters, []).pipe(
|
||||
|
@@ -6,9 +6,9 @@
|
||||
[attr.aria-label]="(((collapsed$ | async) ? 'search.filters.filter.expand' : 'search.filters.filter.collapse') | translate) + ' ' + (('search.filters.filter.' + filter.name + '.head') | translate | lowercase)"
|
||||
[attr.data-test]="'filter-toggle' | dsBrowserOnly"
|
||||
>
|
||||
<h5 class="d-inline-block mb-0">
|
||||
<h4 class="d-inline-block mb-0">
|
||||
{{'search.filters.filter.' + filter.name + '.head'| translate}}
|
||||
</h5>
|
||||
</h4>
|
||||
<span class="filter-toggle flex-grow-1 fas p-auto"
|
||||
[ngClass]="(collapsed$ | async) ? 'fa-plus' : 'fa-minus'"
|
||||
[title]="((collapsed$ | async) ? 'search.filters.filter.expand' : 'search.filters.filter.collapse') | translate">
|
||||
|
@@ -9,8 +9,8 @@
|
||||
</span>
|
||||
<input type="text" [(ngModel)]="range[0]" [name]="filterConfig.paramName + '.min'"
|
||||
class="form-control" (blur)="onSubmit()"
|
||||
aria-label="Mininum value"
|
||||
[placeholder]="'search.filters.filter.' + filterConfig.name + '.min.placeholder' | translate"
|
||||
[attr.aria-label]="minLabel"
|
||||
[placeholder]="minLabel"
|
||||
/>
|
||||
</label>
|
||||
</div>
|
||||
@@ -21,8 +21,8 @@
|
||||
</span>
|
||||
<input type="text" [(ngModel)]="range[1]" [name]="filterConfig.paramName + '.max'"
|
||||
class="form-control" (blur)="onSubmit()"
|
||||
aria-label="Maximum value"
|
||||
[placeholder]="'search.filters.filter.' + filterConfig.name + '.max.placeholder' | translate"
|
||||
[attr.aria-label]="maxLabel"
|
||||
[placeholder]="maxLabel"
|
||||
/>
|
||||
</label>
|
||||
</div>
|
||||
@@ -33,7 +33,7 @@
|
||||
</form>
|
||||
|
||||
<ng-container *ngIf="shouldShowSlider()">
|
||||
<nouislider [connect]="true" [min]="min" [max]="max" [step]="1"
|
||||
<nouislider [connect]="true" [config]="config" [min]="min" [max]="max" [step]="1"
|
||||
[dsDebounce]="250" (onDebounce)="onSubmit()"
|
||||
(keydown)="startKeyboardControl()" (keyup)="stopKeyboardControl()"
|
||||
[(ngModel)]="range" ngDefaultControl>
|
||||
|
@@ -2,6 +2,7 @@ import { BehaviorSubject, combineLatest as observableCombineLatest, Subscription
|
||||
import { map, startWith } from 'rxjs/operators';
|
||||
import { isPlatformBrowser } from '@angular/common';
|
||||
import { Component, Inject, OnDestroy, OnInit, PLATFORM_ID } from '@angular/core';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { RemoteDataBuildService } from '../../../../../core/cache/builders/remote-data-build.service';
|
||||
import { FilterType } from '../../../models/filter-type.model';
|
||||
import { renderFacetFor } from '../search-filter-type-decorator';
|
||||
@@ -53,11 +54,27 @@ export class SearchRangeFilterComponent extends SearchFacetFilterComponent imple
|
||||
*/
|
||||
min = 1950;
|
||||
|
||||
/**
|
||||
* i18n Label to use for minimum field
|
||||
*/
|
||||
minLabel: string;
|
||||
|
||||
/**
|
||||
* Fallback maximum for the range
|
||||
*/
|
||||
max = new Date().getUTCFullYear();
|
||||
|
||||
/**
|
||||
* i18n Label to use for maximum field
|
||||
*/
|
||||
maxLabel: string;
|
||||
|
||||
/**
|
||||
* Base configuration for nouislider
|
||||
* https://refreshless.com/nouislider/slider-options/
|
||||
*/
|
||||
config = {};
|
||||
|
||||
/**
|
||||
* The current range of the filter
|
||||
*/
|
||||
@@ -78,6 +95,7 @@ export class SearchRangeFilterComponent extends SearchFacetFilterComponent imple
|
||||
protected filterService: SearchFilterService,
|
||||
protected router: Router,
|
||||
protected rdbs: RemoteDataBuildService,
|
||||
private translateService: TranslateService,
|
||||
@Inject(SEARCH_CONFIG_SERVICE) public searchConfigService: SearchConfigurationService,
|
||||
@Inject(IN_PLACE_SEARCH) public inPlaceSearch: boolean,
|
||||
@Inject(FILTER_CONFIG) public filterConfig: SearchFilterConfig,
|
||||
@@ -96,6 +114,8 @@ export class SearchRangeFilterComponent extends SearchFacetFilterComponent imple
|
||||
super.ngOnInit();
|
||||
this.min = yearFromString(this.filterConfig.minValue) || this.min;
|
||||
this.max = yearFromString(this.filterConfig.maxValue) || this.max;
|
||||
this.minLabel = this.translateService.instant('search.filters.filter.' + this.filterConfig.name + '.min.placeholder');
|
||||
this.maxLabel = this.translateService.instant('search.filters.filter.' + this.filterConfig.name + '.max.placeholder');
|
||||
const iniMin = this.route.getQueryParameterValue(this.filterConfig.paramName + RANGE_FILTER_MIN_SUFFIX).pipe(startWith(undefined));
|
||||
const iniMax = this.route.getQueryParameterValue(this.filterConfig.paramName + RANGE_FILTER_MAX_SUFFIX).pipe(startWith(undefined));
|
||||
this.sub = observableCombineLatest(iniMin, iniMax).pipe(
|
||||
@@ -105,6 +125,15 @@ export class SearchRangeFilterComponent extends SearchFacetFilterComponent imple
|
||||
return [minimum, maximum];
|
||||
})
|
||||
).subscribe((minmax) => this.range = minmax);
|
||||
|
||||
// Default/base config for nouislider
|
||||
this.config = {
|
||||
// Ensure draggable handles have labels
|
||||
handleAttributes: [
|
||||
{ 'aria-label': this.minLabel },
|
||||
{ 'aria-label': this.maxLabel },
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<div class="setting-option mb-3 p-3">
|
||||
<h5><label for="{{id}}">{{label | translate}}</label></h5>
|
||||
<h4><label for="{{id}}">{{label | translate}}</label></h4>
|
||||
<select id="{{id}}" class="form-control" (change)="change.emit($event)">
|
||||
<ng-content></ng-content>
|
||||
</select>
|
||||
|
@@ -29,7 +29,7 @@ export const themeStateSelector = createFeatureSelector<ThemeState>('theme');
|
||||
|
||||
export const currentThemeSelector = createSelector(
|
||||
themeStateSelector,
|
||||
(state: ThemeState): string => hasValue(state) ? state.currentTheme : undefined
|
||||
(state: ThemeState): string => hasValue(state) ? state.currentTheme : BASE_THEME_NAME,
|
||||
);
|
||||
|
||||
@Injectable({
|
||||
@@ -240,14 +240,7 @@ export class ThemeService {
|
||||
if (hasValue(parentThemeName)) {
|
||||
// inherit the head tags of the parent theme
|
||||
return this.createHeadTags(parentThemeName);
|
||||
}
|
||||
const defaultThemeConfig = getDefaultThemeConfig();
|
||||
const defaultThemeName = defaultThemeConfig.name;
|
||||
if (
|
||||
hasNoValue(defaultThemeName) ||
|
||||
themeName === defaultThemeName ||
|
||||
themeName === BASE_THEME_NAME
|
||||
) {
|
||||
} else {
|
||||
// last resort, use fallback favicon.ico
|
||||
return [
|
||||
this.createHeadTag({
|
||||
@@ -260,9 +253,6 @@ export class ThemeService {
|
||||
})
|
||||
];
|
||||
}
|
||||
|
||||
// inherit the head tags of the default theme
|
||||
return this.createHeadTags(defaultThemeConfig.name);
|
||||
}
|
||||
|
||||
return headTagConfigs.map(this.createHeadTag.bind(this));
|
||||
@@ -425,9 +415,10 @@ export class ThemeService {
|
||||
* @private
|
||||
*/
|
||||
private getActionForMatch(newTheme: Theme, currentThemeName: string): SetThemeAction | NoOpAction {
|
||||
if (hasValue(newTheme) && newTheme.config.name !== currentThemeName) {
|
||||
const newThemeName: string = newTheme?.config.name ?? BASE_THEME_NAME;
|
||||
if (newThemeName !== currentThemeName) {
|
||||
// If we have a match, and it isn't already the active theme, set it as the new theme
|
||||
return new SetThemeAction(newTheme.config.name);
|
||||
return new SetThemeAction(newThemeName);
|
||||
} else {
|
||||
// Otherwise, do nothing
|
||||
return new NoOpAction();
|
||||
|
@@ -1,10 +1,10 @@
|
||||
import {
|
||||
AfterViewInit,
|
||||
Component,
|
||||
ViewChild,
|
||||
ViewContainerRef,
|
||||
ComponentRef,
|
||||
SimpleChanges,
|
||||
OnInit,
|
||||
OnDestroy,
|
||||
ComponentFactoryResolver,
|
||||
ChangeDetectorRef,
|
||||
@@ -24,7 +24,7 @@ import { BASE_THEME_NAME } from './theme.constants';
|
||||
styleUrls: ['./themed.component.scss'],
|
||||
templateUrl: './themed.component.html',
|
||||
})
|
||||
export abstract class ThemedComponent<T> implements OnInit, OnDestroy, OnChanges {
|
||||
export abstract class ThemedComponent<T> implements AfterViewInit, OnDestroy, OnChanges {
|
||||
@ViewChild('vcr', { read: ViewContainerRef }) vcr: ViewContainerRef;
|
||||
@ViewChild('content') themedElementContent: ElementRef;
|
||||
protected compRef: ComponentRef<T>;
|
||||
@@ -74,8 +74,7 @@ export abstract class ThemedComponent<T> implements OnInit, OnDestroy, OnChanges
|
||||
}
|
||||
}
|
||||
|
||||
ngOnInit(): void {
|
||||
this.destroyComponentInstance();
|
||||
ngAfterViewInit(): void {
|
||||
this.initComponentInstance();
|
||||
}
|
||||
|
||||
@@ -96,8 +95,6 @@ export abstract class ThemedComponent<T> implements OnInit, OnDestroy, OnChanges
|
||||
}
|
||||
|
||||
if (hasNoValue(this.lazyLoadObs)) {
|
||||
this.destroyComponentInstance();
|
||||
|
||||
this.lazyLoadObs = combineLatest([
|
||||
observableOf(changes),
|
||||
this.resolveThemedComponent(this.themeService.getThemeName()).pipe(
|
||||
@@ -120,6 +117,7 @@ export abstract class ThemedComponent<T> implements OnInit, OnDestroy, OnChanges
|
||||
}
|
||||
|
||||
this.lazyLoadSub = this.lazyLoadObs.subscribe(([simpleChanges, constructor]: [SimpleChanges, GenericConstructor<T>]) => {
|
||||
this.destroyComponentInstance();
|
||||
const factory = this.resolver.resolveComponentFactory(constructor);
|
||||
this.compRef = this.vcr.createComponent(factory, undefined, undefined, [this.themedElementContent.nativeElement.childNodes]);
|
||||
if (hasValue(simpleChanges)) {
|
||||
|
@@ -1712,7 +1712,8 @@
|
||||
// "curation-task.task.vscan.label": "Virus Scan",
|
||||
"curation-task.task.vscan.label": "Virenscan",
|
||||
|
||||
|
||||
// "curation-task.task.registerdoi.label": "Register DOI",
|
||||
"curation-task.task.registerdoi.label": "DOI registrieren",
|
||||
|
||||
// "curation.form.task-select.label": "Task:",
|
||||
"curation.form.task-select.label": "Aufgabe:",
|
||||
|
@@ -782,6 +782,8 @@
|
||||
|
||||
"browse.comcol.by.srsc": "By Subject Category",
|
||||
|
||||
"browse.comcol.by.nsi": "By Norwegian Science Index",
|
||||
|
||||
"browse.comcol.by.title": "By Title",
|
||||
|
||||
"browse.comcol.head": "Browse",
|
||||
@@ -804,6 +806,8 @@
|
||||
|
||||
"browse.metadata.srsc.breadcrumbs": "Browse by Subject Category",
|
||||
|
||||
"browse.metadata.nsi.breadcrumbs": "Browse by Norwegian Science Index",
|
||||
|
||||
"browse.metadata.title.breadcrumbs": "Browse by Title",
|
||||
|
||||
"pagination.next.button": "Next",
|
||||
@@ -1392,7 +1396,7 @@
|
||||
|
||||
"curation-task.task.vscan.label": "Virus Scan",
|
||||
|
||||
"curation-task.task.register-doi.label": "Register DOI",
|
||||
"curation-task.task.registerdoi.label": "Register DOI",
|
||||
|
||||
"curation.form.task-select.label": "Task:",
|
||||
|
||||
@@ -2826,6 +2830,8 @@
|
||||
|
||||
"menu.section.browse_global_by_srsc": "By Subject Category",
|
||||
|
||||
"menu.section.browse_global_by_nsi": "By Norwegian Science Index",
|
||||
|
||||
"menu.section.browse_global_by_title": "By Title",
|
||||
|
||||
"menu.section.browse_global_communities_and_collections": "Communities & Collections",
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -2228,9 +2228,9 @@
|
||||
// "curation-task.task.vscan.label": "Virus Scan",
|
||||
"curation-task.task.vscan.label": "Virus ellenőrzés",
|
||||
|
||||
// "curation-task.task.register-doi.label": "Register DOI",
|
||||
// "curation-task.task.registerdoi.label": "Register DOI",
|
||||
// TODO New key - Add a translation
|
||||
"curation-task.task.register-doi.label": "Register DOI",
|
||||
"curation-task.task.registerdoi.label": "Register DOI",
|
||||
|
||||
|
||||
|
||||
|
@@ -2160,9 +2160,9 @@
|
||||
// "curation-task.task.vscan.label": "Virus Scan",
|
||||
"curation-task.task.vscan.label": "Scansione antivirus",
|
||||
|
||||
// "curation-task.task.register-doi.label": "Register DOI",
|
||||
// "curation-task.task.registerdoi.label": "Register DOI",
|
||||
// TODO New key - Add a translation
|
||||
"curation-task.task.register-doi.label": "Register DOI",
|
||||
"curation-task.task.registerdoi.label": "Register DOI",
|
||||
|
||||
|
||||
|
||||
|
@@ -2296,4 +2296,326 @@
|
||||
"submission.sections.license.required": "Najpierw musisz zaakceptować licencję",
|
||||
"confirmation-modal.export-batch.confirm": "Eksportuj",
|
||||
"confirmation-modal.export-batch.cancel": "Anuluj",
|
||||
"admin.access-control.bulk-access.breadcrumbs": "Zbiorcza edycja dostępu do osiągnięć",
|
||||
"administrativeBulkAccess.search.results.head": "Wyniki wyszukiwania",
|
||||
"admin.access-control.bulk-access": "Zbiorcza edycja dostępu do osiągnięć",
|
||||
"admin.access-control.bulk-access.title": "Zbiorcza edycja dostępu do osiągnięć",
|
||||
"admin.access-control.bulk-access-browse.header": "Krok 1: Wybierz pozycje",
|
||||
"admin.access-control.bulk-access-browse.search.header": "Wyszukaj",
|
||||
"admin.access-control.bulk-access-browse.selected.header": "Obecny wybór({{number}})",
|
||||
"admin.access-control.bulk-access-settings.header": "Krok 2: Działanie do wykonania",
|
||||
"admin.access-control.groups.form.tooltip.editGroupPage": "Na tej stronie można edytować opcje grupy i przypisane do niej osoby. W górnej sekcji można edytować nazwę i opis grupy, chyba że jest to grupa administratorów dla zbioru i kolekcji. W tym przypadku nazwa i opis grupy są generowane automatycznie i nie można ich edytować. W kolejnych sekcjach można edytować przypisanie użytkowników do grupy. Szczegóły na [stronie](https://wiki.lyrasis.org/display/DSDOC7x/Create+or+manage+a+user+group).",
|
||||
"admin.access-control.groups.form.tooltip.editGroup.addEpeople": "Aby dodać lub usunąć użytkownika do/z tej grupy, kliknij przycisk 'Przeglądaj wszystko' lub użyj paska wyszukiwania poniżej, aby wyszukać użytkowników (użyj listy rozwijanej po lewej stronie paska wyszukiwania, aby wybrać, czy chcesz wyszukiwać według imienia i nazwiska, czy według adresu e-mail). Następnie kliknij ikonę plusa przy każdym użytkowniku, którego chcesz dodać do poniższej listy, lub ikonę kosza przy każdym użytkowniku, którego chcesz usunąć. Poniższa lista może mieć kilka stron: użyj strzałek pod listą, aby przejść do kolejnych stron. Gdy wszystkie zmiany zostaną wprowadzone, zapisz je, klikając przycisk 'Zapisz' w górnej sekcji.",
|
||||
"admin.access-control.groups.form.tooltip.editGroup.addSubgroups": "Aby dodać lub usunąć podgrupę do/z tej grupy, kliknij przycisk 'Przeglądaj wszystko' lub użyj wyszukiwarki poniżej, aby wyszukać użytkowników. Następnie kliknij ikonę plusa przy każdym użytkowniku, którego chcesz dodać do poniższej listy, lub ikonę kosza przy każdym użytkowniku, którego chcesz usunąć. Poniższa lista może składać się z kilku stron: użyj przycisków pod listą, aby przejść do kolejnych stron. Gdy wszystkie zmiany zostaną wprowadzone, zapisz je, klikając przycisk 'Zapisz' w górnej sekcji.",
|
||||
"admin.workflow.item.workspace": "Przestrzeń robocza",
|
||||
"admin.workflow.item.policies": "Polityki",
|
||||
"admin.workflow.item.supervision": "Recenzja",
|
||||
"admin.batch-import.page.toggle.help": "It is possible to perform import either with file upload or via URL, use above toggle to set the input source",
|
||||
"admin.metadata-import.page.error.addFileUrl": "Najpierw wpisz URL pliku!",
|
||||
"admin.metadata-import.page.toggle.upload": "Prześlij",
|
||||
"admin.metadata-import.page.toggle.url": "URL",
|
||||
"admin.metadata-import.page.urlMsg": "Wpisz URL pliku ZIP, aby wykonać import masowy",
|
||||
"advanced-workflow-action.rating.form.rating.label": "Ocena",
|
||||
"advanced-workflow-action.rating.form.rating.error": "Ta pozycja musi zostać oceniona",
|
||||
"advanced-workflow-action.rating.form.review.label": "Recenzja",
|
||||
"advanced-workflow-action.rating.form.review.error": "Musisz wpisać tekst recenzji",
|
||||
"advanced-workflow-action.rating.description": "Wybierz ocenę poniżej",
|
||||
"advanced-workflow-action.rating.description-requiredDescription": "Wybierz ocenę poniżej i wpisz uzasadnienie",
|
||||
"advanced-workflow-action.select-reviewer.description-single": "Wybierz recenzenta przed zdeponowaniem pozycji",
|
||||
"advanced-workflow-action.select-reviewer.description-multiple": "Wybierz jednego lub więcej recenzentów przed zdeponowaniem pozycji",
|
||||
"advanced-workflow-action-select-reviewer.groups.form.reviewers-list.head": "Użytkownicy",
|
||||
"advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.head": "Dodaj użytkownika",
|
||||
"advanced-workflow-action-select-reviewer.groups.form.reviewers-list.button.see-all": "Przeglądaj wszystko",
|
||||
"advanced-workflow-action-select-reviewer.groups.form.reviewers-list.headMembers": "Aktualni użytkownicy",
|
||||
"advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.scope.metadata": "Metadane",
|
||||
"advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.scope.email": "Adres e-mail (dokładny)",
|
||||
"advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.button": "Wyszukaj",
|
||||
"advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.id": "ID",
|
||||
"advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.name": "Nazwa",
|
||||
"advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.identity": "Tożsamość",
|
||||
"advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.email": "Adres e-mail",
|
||||
"advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.netid": "NetID",
|
||||
"advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit": "Usuń / Dodaj",
|
||||
"advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit.buttons.remove": "Usuń użytkownika z nazwę \"{{name}}\"",
|
||||
"advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.success.addMember": "Dodano użytkownika o nazwie: \"{{name}}\"",
|
||||
"advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.addMember": "Nie dodano użytkownika: \"{{name}}\"",
|
||||
"advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.success.deleteMember": "Usunięto użytkownika: \"{{name}}\"",
|
||||
"advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.deleteMember": "Nie usunięto użytkownika: \"{{name}}\"",
|
||||
"advanced-workflow-action-select-reviewer.groups.form.reviewers-list.table.edit.buttons.add": "Dodano użytkownika \"{{name}}\"",
|
||||
"advanced-workflow-action-select-reviewer.groups.form.reviewers-list.notification.failure.noActiveGroup": "Brak aktywnej grupy, najpierw wpisz nazwę.",
|
||||
"advanced-workflow-action-select-reviewer.groups.form.reviewers-list.no-members-yet": "W tej grupie nie ma użytkowników, wyszukaj ich i dodaj.",
|
||||
"advanced-workflow-action-select-reviewer.groups.form.reviewers-list.no-items": "Nie znaleziono żadnych użytkowników",
|
||||
"advanced-workflow-action.select-reviewer.no-reviewer-selected.error": "Recenzent nie jest wybrany.",
|
||||
"bitstream.edit.notifications.error.primaryBitstream.title": "Wystąpił błąd podczas zapisu pliku.",
|
||||
"browse.comcol.by.srsc": "Wg słów kluczowych",
|
||||
"browse.metadata.srsc.breadcrumbs": "Przeglądaj wg słów kluczowych",
|
||||
"browse.startsWith.input": "Filtr",
|
||||
"browse.taxonomy.button": "Przeglądaj",
|
||||
"search.browse.item-back": "Powrót do wyników wyszukiwania",
|
||||
"claimed-approved-search-result-list-element.title": "Zaakceptowano",
|
||||
"claimed-declined-search-result-list-element.title": "Odrzucono i przesłano do deponującego",
|
||||
"claimed-declined-task-search-result-list-element.title": "Odrzucono i przesłano do recenzenta",
|
||||
"collection.edit.tabs.access-control.head": "Dostępy",
|
||||
"collection.edit.tabs.access-control.title": "Edycja kolekcji - dostępy",
|
||||
"collection.listelement.badge": "Kolekcja",
|
||||
"community.edit.tabs.access-control.head": "Dostępy",
|
||||
"community.edit.tabs.access-control.title": "Edycja zbioru - dostępy",
|
||||
"comcol-role.edit.scorereviewers.name": "Ocena recenzenta",
|
||||
"comcol-role.edit.scorereviewers.description": "Recenzenci mogą oceniać zdeponowane pozycje, co określi, czy pozycja zostanie przyjęta lub odrzucona.",
|
||||
"curation-task.task.register-doi.label": "Rejestracja DOI",
|
||||
"dso.name.unnamed": "Bez nazwy",
|
||||
"dso-selector.create.community.or-divider": "lub",
|
||||
"dso-selector.set-scope.community.or-divider": "lub",
|
||||
"dso-selector.results-could-not-be-retrieved": "Wystąpił błąd, proszę odświeżyć stronę",
|
||||
"supervision-group-selector.header": "Wybór grupy recenzenckiej",
|
||||
"supervision-group-selector.select.type-of-order.label": "Wybierz typ funkcji",
|
||||
"supervision-group-selector.select.type-of-order.option.none": "BRAK",
|
||||
"supervision-group-selector.select.type-of-order.option.editor": "REDAKTOR",
|
||||
"supervision-group-selector.select.type-of-order.option.observer": "OBSERWATOR",
|
||||
"supervision-group-selector.select.group.label": "Wybierz grupę",
|
||||
"supervision-group-selector.button.cancel": "Anuluj",
|
||||
"supervision-group-selector.button.save": "Zapisz",
|
||||
"supervision-group-selector.select.type-of-order.error": "Wybierz typ funkcji",
|
||||
"supervision-group-selector.select.group.error": "Wybierz grupę",
|
||||
"supervision-group-selector.notification.create.success.title": "Grupa recenzencka został dodana dla grupy {{ name }}",
|
||||
"supervision-group-selector.notification.create.failure.title": "Błąd",
|
||||
"supervision-group-selector.notification.create.already-existing": "Funkcja recenzenta już jest przypisana do tej grupy",
|
||||
"confirmation-modal.delete-subscription.header": "Usuń subksrypcje",
|
||||
"confirmation-modal.delete-subscription.info": "Czy na pewno chcesz usunąć subskrypcję: \"{{ dsoName }}\"",
|
||||
"confirmation-modal.delete-subscription.cancel": "Anuluj",
|
||||
"confirmation-modal.delete-subscription.confirm": "Usuń",
|
||||
"error.validation.metadata.name.invalid-pattern": "To pole nie może zawierać kropek, przecinków i spacji. Zamiast tego This field cannot contain dots, commas or spaces. Zamiast tego może użyć pól z notacji SNEQ",
|
||||
"error.validation.metadata.name.max-length": "To pole nie może zawierać więcej niż 32 znaki",
|
||||
"error.validation.metadata.namespace.max-length": "To pole nie może zawierać więcej niż 256 znaków",
|
||||
"error.validation.metadata.element.invalid-pattern": "To pole nie może zawierać kropek, przecinków i spacji. Zamiast tego This field cannot contain dots, commas or spaces. Zamiast tego może użyć pól z notacji SNEQ",
|
||||
"error.validation.metadata.element.max-length": "To pole nie może zawierać więcej niż 64 znaki",
|
||||
"error.validation.metadata.qualifier.invalid-pattern": "To pole nie może zawierać kropek, przecinków i spacji",
|
||||
"error.validation.metadata.qualifier.max-length": "To pole nie może zawierać więcej niż 64 znaki",
|
||||
"forgot-email.form.email.error.not-email-form": "Wpisz prawidłowy adres e-mail",
|
||||
"form.other-information.email": "Adres e-mail",
|
||||
"form.other-information.first-name": "Imię",
|
||||
"form.other-information.insolr": "Solr Index",
|
||||
"form.other-information.institution": "Instytucja",
|
||||
"form.other-information.last-name": "Nazwisko",
|
||||
"form.other-information.orcid": "ORCID",
|
||||
"form.create": "Utwórz",
|
||||
"info.end-user-agreement.hosting-country": "Stany Zjednoczone",
|
||||
"item.edit.identifiers.doi.status.UNKNOWN": "Nieznane",
|
||||
"item.edit.identifiers.doi.status.TO_BE_REGISTERED": "W kolejce do rejestracji",
|
||||
"item.edit.identifiers.doi.status.TO_BE_RESERVED": "W kolejce do rezerwacji",
|
||||
"item.edit.identifiers.doi.status.IS_REGISTERED": "Zarejestrowane",
|
||||
"item.edit.identifiers.doi.status.IS_RESERVED": "Zarezerwowane",
|
||||
"item.edit.identifiers.doi.status.UPDATE_RESERVED": "Zarezerwowane (aktualizacja w kolejce)",
|
||||
"item.edit.identifiers.doi.status.UPDATE_REGISTERED": "Zarejestrowane (aktualizacja w kolejce)",
|
||||
"item.edit.identifiers.doi.status.UPDATE_BEFORE_REGISTRATION": "W kolejce do aktualizacji i rejestracji",
|
||||
"item.edit.identifiers.doi.status.TO_BE_DELETED": "Zakolejkowane do usunięcia",
|
||||
"item.edit.identifiers.doi.status.DELETED": "Usunięte",
|
||||
"item.edit.identifiers.doi.status.PENDING": "Oczekujące (niezarejestrowane)",
|
||||
"item.edit.identifiers.doi.status.MINTED": "Rezerwowanie nazwy (niezarejestrowane)",
|
||||
"item.edit.tabs.status.buttons.register-doi.label": "Zarejestruj nowe lub oczekujące DOI",
|
||||
"item.edit.tabs.status.buttons.register-doi.button": "Rejestruj DOI...",
|
||||
"item.edit.register-doi.header": "Zarejestruj nowe lub oczekujące DOI",
|
||||
"item.edit.register-doi.description": "Zweryfikuj poniższe identyfikatory i metadane pozycji i rozpocznij rejestrację DOI lub anuluj",
|
||||
"item.edit.register-doi.confirm": "Zatwierdź",
|
||||
"item.edit.register-doi.cancel": "Anuluj",
|
||||
"item.edit.register-doi.success": "DOI jest w kolejce do rejestracji.",
|
||||
"item.edit.register-doi.error": "Wystąpił błąd poczas rejestracji DOI",
|
||||
"item.edit.register-doi.to-update": "To DOI zostało zarezerwowane i będzie znajdować się w kolejce do rejestracji",
|
||||
"item.edit.metadata.edit.buttons.confirm": "Zatwierdź",
|
||||
"item.edit.metadata.edit.buttons.drag": "Przeciągnij, aby zmienić kolejność",
|
||||
"item.edit.metadata.edit.buttons.virtual": "To pole przechowuje wirutalne wartości metadanych, np. wartość pobraną z encji, z którą jest połączona ta pozycja. Dodaj lub usuń relację w zakładce 'Relacje' ",
|
||||
"item.edit.metadata.metadatafield.error": "Wystąpił błąd podczas walidcji pól metadanych",
|
||||
"item.edit.metadata.reset-order-button": "Cofnij zamianę kolejności",
|
||||
"item.edit.curate.title": "Zarządzaj pozycją: {{item}}",
|
||||
"item.edit.tabs.access-control.head": "Dostęp",
|
||||
"item.edit.tabs.access-control.title": "Edycja pozycji - dostęp",
|
||||
"workflow-item.search.result.delete-supervision.modal.header": "Usuń zadanie dla recenzenta",
|
||||
"workflow-item.search.result.delete-supervision.modal.info": "Czy na pewno usunąć zadanie dla recenzenta",
|
||||
"workflow-item.search.result.delete-supervision.modal.cancel": "Anuluj",
|
||||
"workflow-item.search.result.delete-supervision.modal.confirm": "Usuń",
|
||||
"workflow-item.search.result.notification.deleted.success": "Usunięto zadanie dla recenzenta \"{{name}}\"",
|
||||
"workflow-item.search.result.notification.deleted.failure": "Nie usunięto zadania dla recenzenta \"{{name}}\"",
|
||||
"workflow-item.search.result.list.element.supervised-by": "Recenzja:",
|
||||
"workflow-item.search.result.list.element.supervised.remove-tooltip": "Usuń grupę recenzencką",
|
||||
"item.preview.dc.subject": "Słowo kluczowe:",
|
||||
"item.preview.dc.publisher": "Wydawca:",
|
||||
"itemtemplate.edit.metadata.add-button": "Dodaj",
|
||||
"itemtemplate.edit.metadata.discard-button": "Cofnij",
|
||||
"itemtemplate.edit.metadata.edit.buttons.confirm": "Zatwierdź",
|
||||
"itemtemplate.edit.metadata.edit.buttons.drag": "Przeciągnij, aby zmienić kolejność",
|
||||
"itemtemplate.edit.metadata.edit.buttons.edit": "Edytuj",
|
||||
"itemtemplate.edit.metadata.edit.buttons.remove": "Usuń",
|
||||
"itemtemplate.edit.metadata.edit.buttons.undo": "Cofnij zmiany",
|
||||
"itemtemplate.edit.metadata.edit.buttons.unedit": "Nie edytuj",
|
||||
"itemtemplate.edit.metadata.empty": "To pozycja nie zawiera żadnych metadanych. Wybierz Dodaj, aby je wprowadzić.",
|
||||
"itemtemplate.edit.metadata.headers.edit": "Edytuj",
|
||||
"itemtemplate.edit.metadata.headers.field": "Pole",
|
||||
"itemtemplate.edit.metadata.headers.language": "Język",
|
||||
"itemtemplate.edit.metadata.headers.value": "Wartość",
|
||||
"itemtemplate.edit.metadata.metadatafield.error": "Wystąpił błąd podczas walidowania pola metadanych",
|
||||
"itemtemplate.edit.metadata.metadatafield.invalid": "Wybierz odpowiednie pole metadanych",
|
||||
"itemtemplate.edit.metadata.notifications.discarded.content": "Twoje zmiany nie zostały zachowane. Aby spróbować wprowadzić je ponownie wybierz Cofnij",
|
||||
"itemtemplate.edit.metadata.notifications.discarded.title": "Zmiany nie zostały zachowane",
|
||||
"itemtemplate.edit.metadata.notifications.error.title": "Wystąpił błąd",
|
||||
"itemtemplate.edit.metadata.notifications.invalid.content": "Twoje zmiany nie zostały zapisane. Upewnij się, że wszystkie pola zostały wypełnione prawidłowo.",
|
||||
"itemtemplate.edit.metadata.notifications.invalid.title": "Nieprawidłowe metadan",
|
||||
"itemtemplate.edit.metadata.notifications.outdated.content": "Wzór dla pozycji, na którą w tym momencie pracujesz, został zmodyfikowany przez innego użytkownika. Twoje zmiany zostały odrzucone, aby uniknąć konfliktów pomiędzy wersjami.",
|
||||
"itemtemplate.edit.metadata.notifications.outdated.title": "Zmiany zostały odrzucone",
|
||||
"itemtemplate.edit.metadata.notifications.saved.content": "Zmiany w metadanych wzoru pozycji zostały zapisane.",
|
||||
"itemtemplate.edit.metadata.notifications.saved.title": "Metadane zostały zapisane",
|
||||
"itemtemplate.edit.metadata.reinstate-button": "Cofnij",
|
||||
"itemtemplate.edit.metadata.reset-order-button": "Cofnij zmianę kolejności",
|
||||
"itemtemplate.edit.metadata.save-button": "Zapisz",
|
||||
"menu.section.access_control_bulk": "Zbiorowe zarządzanie dostępem",
|
||||
"menu.section.browse_global_by_srsc": "Wg słów kluczowych",
|
||||
"mydspace.show.supervisedWorkspace": "Pozycje recenzowane",
|
||||
"mydspace.status.mydspaceArchived": "Opublikowano",
|
||||
"mydspace.status.mydspaceValidation": "Walidacja",
|
||||
"mydspace.status.mydspaceWaitingController": "Oczekiwanie na redakctora",
|
||||
"mydspace.status.mydspaceWorkflow": "Redakcja",
|
||||
"mydspace.status.mydspaceWorkspace": "Przestrzeń robocza",
|
||||
"nav.context-help-toggle": "Przełącz pomoc kontekstową",
|
||||
"nav.search.button": "Wpisz wyszukiwaną frazę",
|
||||
"nav.subscriptions": "Subksrypcje",
|
||||
"process.new.notification.error.max-upload.content": "Plik jest większy niż maksymalny dozwolony rozmiar pliku",
|
||||
"register-page.registration.email.error.not-email-form": "Wprowadź poprawny adres e-mail",
|
||||
"register-page.registration.email.error.not-valid-domain": "Użyj adresu e-mail z domeny: {{ domains }}",
|
||||
"register-page.registration.error.maildomain": "Tego adresu e-mail nie możesz zarejestrować, ponieważ nie ma go na liście domen. Dozwolone domeny to: {{ domains }}",
|
||||
"register-page.registration.info.maildomain": "Konta mogą być założone dla adresów e-mail z domeną",
|
||||
"repository.title": "Repozytorium DSpace",
|
||||
"search.filters.applied.f.supervisedBy": "Recenzent",
|
||||
"search.filters.filter.show-tree": "Przeglądaj {{ name }} strukturę recenzentów",
|
||||
"search.filters.filter.supervisedBy.head": "Recenzent",
|
||||
"search.filters.filter.supervisedBy.placeholder": "Recenzent",
|
||||
"search.filters.filter.supervisedBy.label": "Wyszukaj recenzenta",
|
||||
"statistics.table.no-name": "(nazwa obiektu nie może zostać załadowana)",
|
||||
"submission.import-external.source.datacite": "DataCite",
|
||||
"submission.sections.describe.relationship-lookup.search-tab.tab-title.isPublicationOfAuthor": "Publikacje autora",
|
||||
"submission.sections.describe.relationship-lookup.title.isPublicationOfAuthor": "Publikacje",
|
||||
"submission.sections.identifiers.info": "Te identyfikatory zostaną utworzone dla pozycji:",
|
||||
"submission.sections.identifiers.no_handle": "Do tej pozycji nie zostały przypisane żadne Handle",
|
||||
"submission.sections.identifiers.no_doi": "Do tej pozycji nie zostały przypisane żadne DOI",
|
||||
"submission.sections.identifiers.handle_label": "Handle: ",
|
||||
"submission.sections.identifiers.doi_label": "DOI: ",
|
||||
"submission.sections.identifiers.otherIdentifiers_label": "Inne identyfikatory: ",
|
||||
"submission.sections.submit.progressbar.identifiers": "Identyfikatory",
|
||||
"submission.workflow.generic.submit_select_reviewer": "Wybierz recenzenta",
|
||||
"submission.workflow.generic.submit_select_reviewer-help": "",
|
||||
"submission.workflow.generic.submit_score": "Wynik",
|
||||
"submission.workflow.generic.submit_score-help": "",
|
||||
"submission.workflow.tasks.claimed.decline": "Odrzuć",
|
||||
"submission.workflow.tasks.claimed.decline_help": "",
|
||||
"submitter.empty": "n.d.",
|
||||
"subscriptions.title": "Subskrypcje",
|
||||
"subscriptions.item": "Subskrypcje pozycji",
|
||||
"subscriptions.collection": "Subskrypcje kolekcji",
|
||||
"subscriptions.community": "Subskrypcje zbiorów",
|
||||
"subscriptions.subscription_type": "Typ subksrypcji",
|
||||
"subscriptions.frequency": "Częstotliwość subskrypcji",
|
||||
"subscriptions.frequency.D": "Codziennie",
|
||||
"subscriptions.frequency.M": "Co miesiąc",
|
||||
"subscriptions.frequency.W": "Co tydzień",
|
||||
"subscriptions.tooltip": "Subskrybuj",
|
||||
"subscriptions.modal.title": "Subksrypcje",
|
||||
"subscriptions.modal.type-frequency": "Rodzaj i częstotliwość subksrypcji",
|
||||
"subscriptions.modal.close": "Zamknij",
|
||||
"subscriptions.modal.delete-info": "Aby usunąć tę subksrypcję przejdź do strony 'Subskrypcje', która znajduje się w profilu użytkownika",
|
||||
"subscriptions.modal.new-subscription-form.type.content": "Zawartość",
|
||||
"subscriptions.modal.new-subscription-form.frequency.D": "Codziennie",
|
||||
"subscriptions.modal.new-subscription-form.frequency.W": "Co tydzień",
|
||||
"subscriptions.modal.new-subscription-form.frequency.M": "Co miesiąc",
|
||||
"subscriptions.modal.new-subscription-form.submit": "Zapisz",
|
||||
"subscriptions.modal.new-subscription-form.processing": "Ładowanie...",
|
||||
"subscriptions.modal.create.success": "Zasubskrybowano {{ type }}",
|
||||
"subscriptions.modal.delete.success": "Subskrypcja została anulowana",
|
||||
"subscriptions.modal.update.success": "Twoja subskrypcja {{ type }} została zaktualizowana",
|
||||
"subscriptions.modal.create.error": "Wystąpił bład podczas tworzenia subskrypcji",
|
||||
"subscriptions.modal.delete.error": "Wystąpił bład podczas usuwania subskrypcji",
|
||||
"subscriptions.modal.update.error": "Wystąpił bład podczas aktualizacji subskrypcji",
|
||||
"subscriptions.table.dso": "Słowo kluczowe",
|
||||
"subscriptions.table.subscription_type": "Typ subskrypcji",
|
||||
"subscriptions.table.subscription_frequency": "Częstotliwość subskrypcji",
|
||||
"subscriptions.table.action": "Akcja",
|
||||
"subscriptions.table.edit": "Edytuj",
|
||||
"subscriptions.table.delete": "Usuń",
|
||||
"subscriptions.table.not-available": "Niedostępne",
|
||||
"subscriptions.table.not-available-message": "Ta pozycja została usunięta lun nie masz do niej dostępu, aby ją wyswietlić",
|
||||
"subscriptions.table.empty.message": "Ta pozycja nie ma w tym momencie żadnych subksrypcji. Aby zasubkrybować i otrzymywać aktualizacje o tym zbiorze lub kolekcji, wybierz przycisk subskrypcji na stronie pozycji.",
|
||||
"vocabulary-treeview.info": "Wybierz słowo kluczowe, aby dodać je do filtra",
|
||||
"supervisedWorkspace.search.results.head": "Pozycje recenzowane",
|
||||
"supervision.search.results.head": "Status zadań: Szkic i redakcja",
|
||||
"workspace-item.delete.breadcrumbs": "Usunięto wersję roboczą",
|
||||
"workspace-item.delete.header": "Usuń wersję roboczą",
|
||||
"workspace-item.delete.button.confirm": "Usuń",
|
||||
"workspace-item.delete.button.cancel": "Anuluj",
|
||||
"workspace-item.delete.notification.success.title": "Usunięto",
|
||||
"workspace-item.delete.title": "Wersja robocza została usunieta",
|
||||
"workspace-item.delete.notification.error.title": "Coś poszło nie tak",
|
||||
"workspace-item.delete.notification.error.content": "Wersja robocza nie może zostać usunieta",
|
||||
"workflow-item.advanced.title": "Zaawansowane workflow",
|
||||
"workflow-item.selectrevieweraction.notification.success.title": "Wybrany recenzent",
|
||||
"workflow-item.selectrevieweraction.notification.success.content": "Recenzent został przypisany",
|
||||
"workflow-item.selectrevieweraction.notification.error.title": "Coś poszło nie tak",
|
||||
"workflow-item.selectrevieweraction.notification.error.content": "Nie udało się wybrać recenzenta dla pozycji",
|
||||
"workflow-item.selectrevieweraction.title": "Wybierz recenzenta",
|
||||
"workflow-item.selectrevieweraction.header": "Wybierz recenzenta",
|
||||
"workflow-item.selectrevieweraction.button.cancel": "Anuluj",
|
||||
"workflow-item.selectrevieweraction.button.confirm": "Zatwierdź",
|
||||
"workflow-item.scorereviewaction.notification.success.title": "Ocena recenzji",
|
||||
"workflow-item.scorereviewaction.notification.success.content": "Ocena tej pozycji została zapisana",
|
||||
"workflow-item.scorereviewaction.notification.error.title": "Coś poszło nie tak",
|
||||
"workflow-item.scorereviewaction.notification.error.content": "Nie można ocenić tej pozycji",
|
||||
"workflow-item.scorereviewaction.title": "Oceń pozycję",
|
||||
"workflow-item.scorereviewaction.header": "Oceń pozycję",
|
||||
"workflow-item.scorereviewaction.button.cancel": "Anuluj",
|
||||
"workflow-item.scorereviewaction.button.confirm": "Potwierdź",
|
||||
"listable-notification-object.default-message": "Ta pozycja nie może być odzyskana",
|
||||
"system-wide-alert-banner.retrieval.error": "Coś poszło nie tak podczas odzyskiwania alertu systemowego",
|
||||
"system-wide-alert-banner.countdown.prefix": "W",
|
||||
"system-wide-alert-banner.countdown.days": "{{days}} dni,",
|
||||
"system-wide-alert-banner.countdown.hours": "{{hours}} godziny",
|
||||
"system-wide-alert-banner.countdown.minutes": "{{minutes}} minut:",
|
||||
"menu.section.system-wide-alert": "Alert systemowy",
|
||||
"system-wide-alert.form.header": "Alert systemowy",
|
||||
"system-wide-alert-form.retrieval.error": "Coś poszło nie tak podczas odzyskiwania alertu systemowego",
|
||||
"system-wide-alert.form.cancel": "Anuluj",
|
||||
"system-wide-alert.form.save": "Zapisz",
|
||||
"system-wide-alert.form.label.active": "AKTYWNE",
|
||||
"system-wide-alert.form.label.inactive": "NIEAKTYWNE",
|
||||
"system-wide-alert.form.error.message": "Alert systemowy musi zawierać wiadomość",
|
||||
"system-wide-alert.form.label.message": "Alert systemowy",
|
||||
"system-wide-alert.form.label.countdownTo.enable": "Wprowadź licznik czasowy",
|
||||
"system-wide-alert.form.label.countdownTo.hint": "Wskazówka: Wpisz wartość licznika czasu. Kiedy licznik jest włączony, alert systemowy zostanie wyświetlony o wybranym czasie. Kiedy odliczanie zostanie zakończone, alert systemowy zostanie wyłączony. Serwer NIE zostanie zatrzymany automatycznie.",
|
||||
"system-wide-alert.form.label.preview": "Podgląd alertu systemowego",
|
||||
"system-wide-alert.form.update.success": "Alert systemowy został zaktualizowany",
|
||||
"system-wide-alert.form.update.error": "Coś poszło nie tak podczas aktualizacji alertu systemowego",
|
||||
"system-wide-alert.form.create.success": "Alert systemowy został utworzony",
|
||||
"system-wide-alert.form.create.error": "Coś poszło nie tak podczas tworzenia alertu systemowego",
|
||||
"admin.system-wide-alert.breadcrumbs": "Alerty systemowe",
|
||||
"admin.system-wide-alert.title": "Alerty systemowe",
|
||||
"item-access-control-title": "Ta strona pozwala na zmianę dostępów metadanych pozycji i plików do nich dołączonych.",
|
||||
"collection-access-control-title": "Ta strona pozwala na zmianę warunków dostępu dla wszystkich pozycji w tej kolekcji. Zmiany mogą być wykonywane zarówno na metadanych pozycji jak i plikach do nich dołączonych.",
|
||||
"community-access-control-title": "Ta strona pozwala na zmianę warunków dostępu dla wszystkich pozycji w każdej kolekcji w tym zbiorze. Zmiany mogą być wykonywane zarówno na metadanych pozycji jak i plikach do nich dołączonych.",
|
||||
"access-control-item-header-toggle": "Metadane pozycji",
|
||||
"access-control-bitstream-header-toggle": "Pliki",
|
||||
"access-control-mode": "Tryb",
|
||||
"access-control-access-conditions": "Warunki dostępu",
|
||||
"access-control-no-access-conditions-warning-message": "W tym momencie żadne warunki dostępu nie zostały określone. Jeśli zadanie zostanie rozpoczęte, obecne warunki dostępu zostaną zastąpione domyślnymi warunkami dostępu z nadrzędnej kolekcji.",
|
||||
"access-control-replace-all": "Zastąp warunki dostępu",
|
||||
"access-control-add-to-existing": "Dodaj do już istniejących",
|
||||
"access-control-limit-to-specific": "Ogranicz zmiany do wybranych plików",
|
||||
"access-control-process-all-bitstreams": "Zaktualizuj wszystkie pliki dla tej pozycji",
|
||||
"access-control-bitstreams-selected": "wybrane pliki",
|
||||
"access-control-cancel": "Anuluj",
|
||||
"access-control-execute": "Wykonaj",
|
||||
"access-control-add-more": "Dodaj więcej",
|
||||
"access-control-select-bitstreams-modal.title": "Wybierz pliki",
|
||||
"access-control-select-bitstreams-modal.no-items": "Brak pozycji do wyświetlenia.",
|
||||
"access-control-select-bitstreams-modal.close": "Zamknij",
|
||||
"access-control-option-label": "Typ warunków dostępu",
|
||||
"access-control-option-note": "Wybierz warunki dostępu, które chcesz przypisać do zaznaczonych pozycji.",
|
||||
"access-control-option-start-date": "Dostęp od",
|
||||
"access-control-option-start-date-note": "Wybierz datę, kiedy wybrane warunki dostępu mają obowiązywać",
|
||||
"access-control-option-end-date": "Dostęp do",
|
||||
"access-control-option-end-date-note": "Wybierz datę, kiedy wybrane warunki dostępu mają obowiązywać",
|
||||
}
|
||||
|
@@ -2054,8 +2054,8 @@
|
||||
// "curation-task.task.vscan.label": "Virus Scan",
|
||||
"curation-task.task.vscan.label": "Scan de vírus",
|
||||
|
||||
// "curation-task.task.register-doi.label": "Register DOI",
|
||||
"curation-task.task.register-doi.label": "Registo DOI",
|
||||
// "curation-task.task.registerdoi.label": "Register DOI",
|
||||
"curation-task.task.registerdoi.label": "Registo DOI",
|
||||
|
||||
// "curation.form.task-select.label": "Task:",
|
||||
"curation.form.task-select.label": "Tarefa:",
|
||||
@@ -2259,7 +2259,7 @@
|
||||
"confirmation-modal.delete-eperson.header": "Apagar Utilizador \"{{ dsoName }}\"",
|
||||
|
||||
// "confirmation-modal.delete-eperson.info": "Are you sure you want to delete EPerson \"{{ dsoName }}\"",
|
||||
"confirmation-modal.delete-eperson.info": "Pretende apagar o utilizar \"{{ dsoName }}\"",
|
||||
"confirmation-modal.delete-eperson.info": "Pretende apagar o utilizador \"{{ dsoName }}\"",
|
||||
|
||||
// "confirmation-modal.delete-eperson.cancel": "Cancel",
|
||||
"confirmation-modal.delete-eperson.cancel": "Cancelar",
|
||||
@@ -2666,7 +2666,7 @@
|
||||
"health-page.property.status": "Código Estado",
|
||||
|
||||
// "health-page.section.db.title": "Database",
|
||||
"health-page.section.db.title": "Base Dados",
|
||||
"health-page.section.db.title": "Base de Dados",
|
||||
|
||||
// "health-page.section.geoIp.title": "GeoIp",
|
||||
"health-page.section.geoIp.title": "GeoIp",
|
||||
|
@@ -671,7 +671,7 @@
|
||||
"curation-task.task.citationpage.label": "Tạo trang trích dẫn",
|
||||
"curation-task.task.noop.label": "NOOP",
|
||||
"curation-task.task.profileformats.label": "Định dạng tệp tin",
|
||||
"curation-task.task.register-doi.label": "Đăng ký DOI",
|
||||
"curation-task.task.registerdoi.label": "Đăng ký DOI",
|
||||
"curation-task.task.requiredmetadata.label": "Kiểm tra các trường dữ liệu bắt buộc",
|
||||
"curation-task.task.translate.label": "Bộ dịch của Microsoft",
|
||||
"curation-task.task.vscan.label": "Quét Virus",
|
||||
|
@@ -5,7 +5,8 @@ import { environment } from '../environments/environment';
|
||||
import { hasNoValue } from '../app/shared/empty.util';
|
||||
|
||||
import { AppConfig } from './app-config.interface';
|
||||
import { ThemeConfig } from './theme.model';
|
||||
import { ThemeConfig, NamedThemeConfig } from './theme.model';
|
||||
import { BASE_THEME_NAME } from '../app/shared/theme-support/theme.constants';
|
||||
|
||||
/**
|
||||
* Extend Angular environment with app config.
|
||||
@@ -44,7 +45,9 @@ const getDefaultThemeConfig = (): ThemeConfig => {
|
||||
hasNoValue(themeConfig.regex) &&
|
||||
hasNoValue(themeConfig.handle) &&
|
||||
hasNoValue(themeConfig.uuid)
|
||||
);
|
||||
) ?? {
|
||||
name: BASE_THEME_NAME,
|
||||
} as NamedThemeConfig;
|
||||
};
|
||||
|
||||
export {
|
||||
|
@@ -1,5 +1,5 @@
|
||||
// node_modules imports meant for all the themes
|
||||
|
||||
@import '~node_modules/bootstrap/scss/bootstrap.scss';
|
||||
@import '~node_modules/nouislider/distribute/nouislider.min';
|
||||
@import '~node_modules/nouislider/dist/nouislider.min';
|
||||
@import '~node_modules/ngx-ui-switch/ui-switch.component.scss';
|
||||
|
@@ -3,9 +3,9 @@ import { FooterComponent as BaseComponent } from '../../../../app/footer/footer.
|
||||
|
||||
@Component({
|
||||
selector: 'ds-footer',
|
||||
// styleUrls: ['footer.component.scss'],
|
||||
// styleUrls: ['./footer.component.scss'],
|
||||
styleUrls: ['../../../../app/footer/footer.component.scss'],
|
||||
// templateUrl: 'footer.component.html'
|
||||
// templateUrl: './footer.component.html'
|
||||
templateUrl: '../../../../app/footer/footer.component.html'
|
||||
})
|
||||
export class FooterComponent extends BaseComponent {
|
||||
|
@@ -6,9 +6,9 @@ import { HeaderNavbarWrapperComponent as BaseComponent } from '../../../../app/h
|
||||
*/
|
||||
@Component({
|
||||
selector: 'ds-header-navbar-wrapper',
|
||||
// styleUrls: ['header-navbar-wrapper.component.scss'],
|
||||
// styleUrls: ['./header-navbar-wrapper.component.scss'],
|
||||
styleUrls: ['../../../../app/header-nav-wrapper/header-navbar-wrapper.component.scss'],
|
||||
// templateUrl: 'header-navbar-wrapper.component.html',
|
||||
// templateUrl: './header-navbar-wrapper.component.html',
|
||||
templateUrl: '../../../../app/header-nav-wrapper/header-navbar-wrapper.component.html',
|
||||
})
|
||||
export class HeaderNavbarWrapperComponent extends BaseComponent {
|
||||
|
@@ -9,9 +9,9 @@ import { fadeInOut, fadeOut } from '../../../../../app/shared/animations/fade';
|
||||
*/
|
||||
@Component({
|
||||
selector: 'ds-auth-nav-menu',
|
||||
// templateUrl: 'auth-nav-menu.component.html',
|
||||
// templateUrl: './auth-nav-menu.component.html',
|
||||
templateUrl: '../../../../../app/shared/auth-nav-menu/auth-nav-menu.component.html',
|
||||
// styleUrls: ['auth-nav-menu.component.scss'],
|
||||
// styleUrls: ['./auth-nav-menu.component.scss'],
|
||||
styleUrls: ['../../../../../app/shared/auth-nav-menu/auth-nav-menu.component.scss'],
|
||||
animations: [fadeInOut, fadeOut]
|
||||
})
|
||||
|
@@ -9,7 +9,7 @@ import { ObjectListComponent as BaseComponent} from '../../../../../app/shared/o
|
||||
selector: 'ds-object-list',
|
||||
// styleUrls: ['./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'
|
||||
})
|
||||
|
||||
|
@@ -3,7 +3,10 @@ import { WorkflowItemSendBackComponent as BaseComponent } from '../../../../../a
|
||||
|
||||
@Component({
|
||||
selector: 'ds-workflow-item-send-back',
|
||||
// styleUrls: ['workflow-item-send-back.component.scss'],
|
||||
// NOTE: the SCSS file for workflow-item-action-page does not have a corresponding file in the original
|
||||
// implementation, so this commented out line below is a stub, here if you
|
||||
// need it, but you probably don't need it.
|
||||
// styleUrls: ['./workflow-item-send-back.component.scss'],
|
||||
// templateUrl: './workflow-item-send-back.component.html'
|
||||
templateUrl: '../../../../../app/workflowitems-edit-page/workflow-item-action-page.component.html'
|
||||
})
|
||||
|
@@ -7,7 +7,7 @@ nav.navbar {
|
||||
/** Mobile menu styling **/
|
||||
@media screen and (max-width: map-get($grid-breakpoints, md)-0.02) {
|
||||
.navbar {
|
||||
width: 100%;
|
||||
width: 100vw;
|
||||
background-color: var(--bs-white);
|
||||
position: absolute;
|
||||
overflow: hidden;
|
||||
|
@@ -17,7 +17,7 @@
|
||||
background-color: var(--bs-primary);
|
||||
}
|
||||
|
||||
h5 {
|
||||
h4 {
|
||||
font-size: 1.1rem
|
||||
}
|
||||
}
|
||||
|
75
yarn.lock
75
yarn.lock
@@ -1551,10 +1551,10 @@
|
||||
resolved "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz"
|
||||
integrity sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==
|
||||
|
||||
"@cypress/request@^2.88.10":
|
||||
version "2.88.11"
|
||||
resolved "https://registry.npmjs.org/@cypress/request/-/request-2.88.11.tgz"
|
||||
integrity sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w==
|
||||
"@cypress/request@2.88.12":
|
||||
version "2.88.12"
|
||||
resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.12.tgz#ba4911431738494a85e93fb04498cb38bc55d590"
|
||||
integrity sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA==
|
||||
dependencies:
|
||||
aws-sign2 "~0.7.0"
|
||||
aws4 "^1.8.0"
|
||||
@@ -1571,7 +1571,7 @@
|
||||
performance-now "^2.1.0"
|
||||
qs "~6.10.3"
|
||||
safe-buffer "^5.1.2"
|
||||
tough-cookie "~2.5.0"
|
||||
tough-cookie "^4.1.3"
|
||||
tunnel-agent "^0.6.0"
|
||||
uuid "^8.3.2"
|
||||
|
||||
@@ -2457,11 +2457,16 @@
|
||||
resolved "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz"
|
||||
integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==
|
||||
|
||||
"@types/node@*", "@types/node@>=10.0.0", "@types/node@^14.14.31", "@types/node@^14.14.9":
|
||||
"@types/node@*", "@types/node@>=10.0.0", "@types/node@^14.14.9":
|
||||
version "14.18.42"
|
||||
resolved "https://registry.npmjs.org/@types/node/-/node-14.18.42.tgz"
|
||||
integrity sha512-xefu+RBie4xWlK8hwAzGh3npDz/4VhF6icY/shU+zv/1fNn+ZVG7T7CRwe9LId9sAYRPxI+59QBPuKL3WpyGRg==
|
||||
|
||||
"@types/node@^16.18.39":
|
||||
version "16.18.46"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.46.tgz#9f2102d0ba74a318fcbe170cbff5463f119eab59"
|
||||
integrity sha512-Mnq3O9Xz52exs3mlxMcQuA7/9VFe/dXcrgAyfjLkABIqxXKOgBRjyazTxUbjsxDa4BP7hhPliyjVTP9RDP14xg==
|
||||
|
||||
"@types/parse-json@^4.0.0":
|
||||
version "4.0.0"
|
||||
resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz"
|
||||
@@ -3358,10 +3363,10 @@ aws4@^1.8.0:
|
||||
resolved "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz"
|
||||
integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==
|
||||
|
||||
axe-core@^4.7.0:
|
||||
version "4.7.0"
|
||||
resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf"
|
||||
integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==
|
||||
axe-core@^4.7.2:
|
||||
version "4.7.2"
|
||||
resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.2.tgz#040a7342b20765cb18bb50b628394c21bccc17a0"
|
||||
integrity sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==
|
||||
|
||||
axios@0.21.4:
|
||||
version "0.21.4"
|
||||
@@ -4437,14 +4442,14 @@ cypress-axe@^1.4.0:
|
||||
resolved "https://registry.yarnpkg.com/cypress-axe/-/cypress-axe-1.4.0.tgz#e67482bfe9e740796bf77c7823f19781a8a2faff"
|
||||
integrity sha512-Ut7NKfzjyKm0BEbt2WxuKtLkIXmx6FD2j0RwdvO/Ykl7GmB/qRQkwbKLk3VP35+83hiIr8GKD04PDdrTK5BnyA==
|
||||
|
||||
cypress@12.10.0:
|
||||
version "12.10.0"
|
||||
resolved "https://registry.yarnpkg.com/cypress/-/cypress-12.10.0.tgz#b6264f77c214d63530ebac2b33c4d099bd40b715"
|
||||
integrity sha512-Y0wPc221xKKW1/4iAFCphkrG2jNR4MjOne3iGn4mcuCaE7Y5EtXL83N8BzRsAht7GYfWVjJ/UeTqEdDKHz39HQ==
|
||||
cypress@12.17.4:
|
||||
version "12.17.4"
|
||||
resolved "https://registry.yarnpkg.com/cypress/-/cypress-12.17.4.tgz#b4dadf41673058493fa0d2362faa3da1f6ae2e6c"
|
||||
integrity sha512-gAN8Pmns9MA5eCDFSDJXWKUpaL3IDd89N9TtIupjYnzLSmlpVr+ZR+vb4U/qaMp+lB6tBvAmt7504c3Z4RU5KQ==
|
||||
dependencies:
|
||||
"@cypress/request" "^2.88.10"
|
||||
"@cypress/request" "2.88.12"
|
||||
"@cypress/xvfb" "^1.2.4"
|
||||
"@types/node" "^14.14.31"
|
||||
"@types/node" "^16.18.39"
|
||||
"@types/sinonjs__fake-timers" "8.1.1"
|
||||
"@types/sizzle" "^2.3.2"
|
||||
arch "^2.2.0"
|
||||
@@ -4477,9 +4482,10 @@ cypress@12.10.0:
|
||||
minimist "^1.2.8"
|
||||
ospath "^1.2.2"
|
||||
pretty-bytes "^5.6.0"
|
||||
process "^0.11.10"
|
||||
proxy-from-env "1.0.0"
|
||||
request-progress "^3.0.0"
|
||||
semver "^7.3.2"
|
||||
semver "^7.5.3"
|
||||
supports-color "^8.1.1"
|
||||
tmp "~0.2.1"
|
||||
untildify "^4.0.0"
|
||||
@@ -8191,10 +8197,12 @@ ng2-file-upload@1.4.0:
|
||||
dependencies:
|
||||
tslib "^1.9.0"
|
||||
|
||||
ng2-nouislider@^1.8.3:
|
||||
version "1.8.3"
|
||||
resolved "https://registry.npmjs.org/ng2-nouislider/-/ng2-nouislider-1.8.3.tgz"
|
||||
integrity sha512-Vl8tHCcJ/ioJLAs2t6FBC35sZq1P/O5ZdqdFwYxOCOMVbILGWNg+2gWZIjFstvv9pqb/mVvVUYe6qGG/mA/RBQ==
|
||||
ng2-nouislider@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/ng2-nouislider/-/ng2-nouislider-2.0.0.tgz#a62fd6cf3f1561be19a2691c2f68d21a46dc6006"
|
||||
integrity sha512-NGbF/0w0+bZqclpSPFOlWIeVJaVwRRYFJzD1x8PClbw9GIeo7fCHoBzZ81y7K7FTJg6to+cgjSTFETPZG/Dizg==
|
||||
dependencies:
|
||||
tslib "^2.3.0"
|
||||
|
||||
ngx-infinite-scroll@^15.0.0:
|
||||
version "15.0.0"
|
||||
@@ -8337,10 +8345,10 @@ normalize-url@^4.5.0:
|
||||
resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz"
|
||||
integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==
|
||||
|
||||
nouislider@^14.6.3:
|
||||
version "14.7.0"
|
||||
resolved "https://registry.npmjs.org/nouislider/-/nouislider-14.7.0.tgz"
|
||||
integrity sha512-4RtQ1+LHJKesDCNJrXkQcwXAWCrC2aggdLYMstS/G5fEWL+fXZbUA9pwVNHFghMGuFGRATlDLNInRaPeRKzpFQ==
|
||||
nouislider@^15.7.1:
|
||||
version "15.7.1"
|
||||
resolved "https://registry.yarnpkg.com/nouislider/-/nouislider-15.7.1.tgz#77d55e47d9b4cd771728515713df43b489db9705"
|
||||
integrity sha512-5N7C1ru/i8y3dg9+Z6ilj6+m1EfabvOoaRa7ztpxBSKKRZso4vA52DGSbBJjw5XLtFr/LZ9SgGAXqyVtlVHO5w==
|
||||
|
||||
npm-bundled@^3.0.0:
|
||||
version "3.0.0"
|
||||
@@ -9267,6 +9275,11 @@ process-nextick-args@~2.0.0:
|
||||
resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz"
|
||||
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
|
||||
|
||||
process@^0.11.10:
|
||||
version "0.11.10"
|
||||
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
|
||||
integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==
|
||||
|
||||
promise-inflight@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz"
|
||||
@@ -10131,7 +10144,7 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
|
||||
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
|
||||
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
|
||||
|
||||
semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8:
|
||||
semver@^7.0.0, semver@^7.1.1, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3:
|
||||
version "7.5.4"
|
||||
resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
|
||||
integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
|
||||
@@ -10912,6 +10925,16 @@ tough-cookie@^4.0.0, tough-cookie@^4.1.2:
|
||||
universalify "^0.2.0"
|
||||
url-parse "^1.5.3"
|
||||
|
||||
tough-cookie@^4.1.3:
|
||||
version "4.1.3"
|
||||
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf"
|
||||
integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==
|
||||
dependencies:
|
||||
psl "^1.1.33"
|
||||
punycode "^2.1.1"
|
||||
universalify "^0.2.0"
|
||||
url-parse "^1.5.3"
|
||||
|
||||
tough-cookie@~2.5.0:
|
||||
version "2.5.0"
|
||||
resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz"
|
||||
|
Reference in New Issue
Block a user