Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • dlcm/ui/dlcm-portal
1 result
Select Git revision
Show changes
Commits on Source (3)
Showing
with 174 additions and 76 deletions
......@@ -46,9 +46,6 @@
{
"glob": "**/*",
"input": "src/assets/",
"ignore": [
"**/configurations/environment.runtime.json"
],
"output": "/assets/"
}
],
......
......@@ -16232,9 +16232,9 @@
}
},
"solidify-frontend": {
"version": "2.3.2",
"resolved": "https://nexus.unige.ch/repository/npm-all/solidify-frontend/-/solidify-frontend-2.3.2.tgz",
"integrity": "sha512-qctlIF30v1XkDMmWAXkfkboARaPsPwVZCHJeAMdK3TkUceNF08h8+aRZzKwQrJKvMI1jtWLCp3i7fIni5jdvEQ==",
"version": "2.3.3",
"resolved": "https://nexus.unige.ch/repository/npm-all/solidify-frontend/-/solidify-frontend-2.3.3.tgz",
"integrity": "sha512-kCHBo+70lta64SpnMlKz1p5PggA495txgnCL8Ja1YuA/d6ebS9sZE0V7xKQzeqJg64Qk8HE4DXlXZBiK0/d8lA==",
"requires": {
"tslib": "^2.3.0"
}
......
......@@ -109,7 +109,7 @@ const routes: DlcmRoutes = [
@NgModule({
imports: [RouterModule.forRoot(routes, {
useHash: true,
useHash: false,
relativeLinkResolution: "legacy",
})],
exports: [RouterModule],
......
......@@ -63,6 +63,10 @@ export const dataTableComponentSolidify: MappingObject<DataTableComponent> = {
key: "user",
valueType: ValueType.isRowData,
},
{
key: "resourceContainer",
valueType: ValueType.isRowData,
},
{
key: "logoNamespace",
valueType: ValueType.isAttributeOnCol,
......
import {adminInstitutionActionNameSpace} from "@admin/institution/stores/admin-institution.action";
import {AdminInstitutionStateModel} from "@admin/institution/stores/admin-institution.state";
import {
AdminInstitutionState,
AdminInstitutionStateModel,
} from "@admin/institution/stores/admin-institution.state";
import {
ChangeDetectionStrategy,
ChangeDetectorRef,
......@@ -13,10 +16,13 @@ import {
Actions,
Store,
} from "@ngxs/store";
import {DataTableComponentEnum} from "@shared/enums/data-table-component.enum";
import {LabelTranslateEnum} from "@shared/enums/label-translate.enum";
import {StateEnum} from "@shared/enums/state.enum";
import {DataTableComponentHelper} from "@shared/helpers/data-table-component.helper";
import {
AbstractListRoutable,
DataTableColumns,
DataTableFieldTypeEnum,
OrderEnum,
RouterExtensionService,
......@@ -33,6 +39,8 @@ export class AdminInstitutionListRoutable extends AbstractListRoutable<Instituti
readonly KEY_BACK_BUTTON: string | undefined = LabelTranslateEnum.backToAdmin;
readonly KEY_PARAM_NAME: keyof Institution & string = "name";
adminInstitutionState: typeof AdminInstitutionState = AdminInstitutionState;
constructor(protected readonly _store: Store,
protected readonly _changeDetector: ChangeDetectorRef,
protected readonly _route: ActivatedRoute,
......@@ -53,6 +61,18 @@ export class AdminInstitutionListRoutable extends AbstractListRoutable<Instituti
defineColumns(): void {
this.columns = [
{
field: "avatar",
header: LabelTranslateEnum.avatar,
order: OrderEnum.none,
resourceNameSpace: adminInstitutionActionNameSpace,
resourceState: this.adminInstitutionState as any,
isFilterable: false,
isSortable: false,
component: DataTableComponentHelper.get(DataTableComponentEnum.logo),
isUser: false,
skipIfAvatarMissing: true,
} as DataTableColumns<Institution>,
{
field: "name",
header: LabelTranslateEnum.nameLabel,
......
import {adminOrganizationalUnitActionNameSpace} from "@admin/organizational-unit/stores/admin-organizational-unit.action";
import {AdminOrganizationalUnitStateModel} from "@admin/organizational-unit/stores/admin-organizational-unit.state";
import {
AdminOrganizationalUnitState,
AdminOrganizationalUnitStateModel,
} from "@admin/organizational-unit/stores/admin-organizational-unit.state";
import {
ChangeDetectionStrategy,
ChangeDetectorRef,
......@@ -14,6 +17,7 @@ import {
Actions,
Store,
} from "@ngxs/store";
import {DataTableComponentEnum} from "@shared/enums/data-table-component.enum";
import {DataTestEnum} from "@shared/enums/data-test.enum";
import {LabelTranslateEnum} from "@shared/enums/label-translate.enum";
import {
......@@ -21,8 +25,10 @@ import {
RoutesEnum,
} from "@shared/enums/routes.enum";
import {StateEnum} from "@shared/enums/state.enum";
import {DataTableComponentHelper} from "@shared/helpers/data-table-component.helper";
import {
AbstractListRoutable,
DataTableColumns,
DataTableFieldTypeEnum,
OrderEnum,
RouterExtensionService,
......@@ -39,6 +45,8 @@ export class AdminOrganizationalUnitListRoutable extends AbstractListRoutable<Or
readonly KEY_BACK_BUTTON: string | undefined = LabelTranslateEnum.backToAdmin;
readonly KEY_PARAM_NAME: keyof OrganizationalUnit & string = "name";
adminOrganizationalUnitState: typeof AdminOrganizationalUnitState = AdminOrganizationalUnitState;
constructor(protected readonly _store: Store,
protected readonly _changeDetector: ChangeDetectorRef,
protected readonly _route: ActivatedRoute,
......@@ -63,6 +71,18 @@ export class AdminOrganizationalUnitListRoutable extends AbstractListRoutable<Or
defineColumns(): void {
this.columns = [
{
field: "avatar",
header: LabelTranslateEnum.avatar,
order: OrderEnum.none,
resourceNameSpace: adminOrganizationalUnitActionNameSpace,
resourceState: this.adminOrganizationalUnitState as any,
isFilterable: false,
isSortable: false,
component: DataTableComponentHelper.get(DataTableComponentEnum.logo),
isUser: false,
skipIfAvatarMissing: true,
} as DataTableColumns<OrganizationalUnit>,
{
field: "name",
header: LabelTranslateEnum.nameLabel,
......
......@@ -160,7 +160,7 @@
class="link"
>
<mat-label class="disabled">{{labelTranslateEnum.sip | translate}}</mat-label>
<a [href]="getSipPath(model.sipId)">{{model.title}}</a>
<a [routerLink]="getSipPath(model.sipId)">{{model.title}}</a>
</div>
<mat-form-field *ngIf="getFormControl(formDefinition.doi).value !== null"
......
......@@ -402,7 +402,7 @@ export class DepositFormPresentational extends AbstractFormPresentational<Deposi
}
getSipPath(sipId: string): string {
return "#" + SOLIDIFY_CONSTANTS.URL_SEPARATOR + RoutesEnum.preservationPlanningSipDetail + SOLIDIFY_CONSTANTS.URL_SEPARATOR + sipId;
return SOLIDIFY_CONSTANTS.URL_SEPARATOR + RoutesEnum.preservationPlanningSipDetail + SOLIDIFY_CONSTANTS.URL_SEPARATOR + sipId;
}
navigateToPerson(person: Person): void {
......
......@@ -10,7 +10,10 @@ import {
PreservationSpaceOrganizationalUnitAction,
preservationSpaceOrganizationalUnitActionNameSpace,
} from "@app/features/preservation-space/organizational-unit/stores/preservation-space-organizational-unit.action";
import {PreservationSpaceOrganizationalUnitStateModel} from "@app/features/preservation-space/organizational-unit/stores/preservation-space-organizational-unit.state";
import {
PreservationSpaceOrganizationalUnitState,
PreservationSpaceOrganizationalUnitStateModel,
} from "@app/features/preservation-space/organizational-unit/stores/preservation-space-organizational-unit.state";
import {AppUserState} from "@app/stores/user/app-user.state";
import {Enums} from "@enums";
import {OrganizationalUnit} from "@models";
......@@ -43,6 +46,7 @@ import {SharedNotificationAction} from "@shared/stores/notification/shared-notif
import {
AbstractListRoutable,
DataTableActions,
DataTableColumns,
DataTableFieldTypeEnum,
DialogUtil,
isNullOrUndefined,
......@@ -64,6 +68,8 @@ export class PreservationSpaceOrganizationalUnitListRoutable extends AbstractLis
readonly KEY_BACK_BUTTON: string | undefined = undefined;
readonly KEY_PARAM_NAME: keyof OrganizationalUnit & string = "name";
preservationSpaceOrganizationalUnitState: typeof PreservationSpaceOrganizationalUnitState = PreservationSpaceOrganizationalUnitState;
protected onlyMyOrgUnits: boolean = false;
override stickyTopPosition: number = 0;
......@@ -193,6 +199,18 @@ export class PreservationSpaceOrganizationalUnitListRoutable extends AbstractLis
defineColumns(): void {
this.columns = [
{
field: "avatar",
header: LabelTranslateEnum.avatar,
order: OrderEnum.none,
resourceNameSpace: preservationSpaceOrganizationalUnitActionNameSpace,
resourceState: this.preservationSpaceOrganizationalUnitState as any,
isFilterable: false,
isSortable: false,
component: DataTableComponentHelper.get(DataTableComponentEnum.logo),
isUser: false,
skipIfAvatarMissing: true,
} as DataTableColumns<OrganizationalUnit>,
{
field: "name",
header: LabelTranslateEnum.nameLabel,
......
......@@ -55,6 +55,10 @@ import RatingTypeEnum = Enums.Archive.RatingTypeEnum;
/* eslint-enable no-restricted-imports */
export interface BaseResourceLogo extends BaseResource {
logo?: Logo;
}
export interface AccessOrganizationalUnit extends AccessOrganizationalUnitPartial, BaseResource {
}
......@@ -177,8 +181,7 @@ export interface IndexFieldAlias extends BaseResource {
export interface Ingest extends IngestPartial {
}
export interface Institution extends InstitutionPartial, BaseResource {
logo?: Logo;
export interface Institution extends InstitutionPartial, BaseResourceLogo {
}
export interface Language extends LanguagePartial, BaseResource {
......@@ -231,7 +234,7 @@ export interface OaiSet extends OaiSetPartial, BaseResource {
export interface Order extends OrderPartial, BaseResource {
}
export interface OrganizationalUnit extends OrganizationalUnitPartial, BaseResource {
export interface OrganizationalUnit extends OrganizationalUnitPartial, BaseResourceLogo {
defaultSubmissionPolicy?: SubmissionPolicy;
defaultPreservationPolicy?: PreservationPolicy;
defaultDisseminationPolicy?: DisseminationPolicy;
......@@ -244,7 +247,6 @@ export interface OrganizationalUnit extends OrganizationalUnitPartial, BaseResou
keywords?: string[];
defaultLicense?: License;
role?: Role | null;
logo?: Logo;
}
export interface Page extends PagePartial {
......
......@@ -2,18 +2,19 @@
[solidifySpinnerStrokeWidth]="2"
[solidifySpinner]="isLoading"
>
<div *ngIf="(this.photo | isNotNullNorUndefined) && (this.photo | isNonEmptyString); else noPhoto"
>
<img *ngIf="sanitizeUrl(this.photo) as image"
[src]="image"
alt="photo"
class="photo"
>
</div>
<ng-template #noPhoto>
<dlcm-shared-avatar *ngIf="this.isUser"
[user]="this.user"
class="avatar-initial"
></dlcm-shared-avatar>
<dlcm-shared-avatar *ngIf="isUser; else isImage"
[user]="user"
[photoUser]="photo"
class="avatar-initial"
></dlcm-shared-avatar>
<ng-template #isImage>
<dlcm-shared-image-display *ngIf="sanitizeUrl(photo); else fallback"
[image]="sanitizeUrl(photo)"
class="in-list"
></dlcm-shared-image-display>
<ng-template #fallback>
<dlcm-shared-image-display class="in-list"></dlcm-shared-image-display>
</ng-template>
</ng-template>
</div>
@import "src/sass/abstracts/abstracts";
$avatar-size: 45px;
:host {
background-color: transparent;
background-size: cover;
color: $white;
height: $avatar-size;
width: $avatar-size;
border-radius: 50%;
flex-shrink: 0;
object-fit: cover;
text-transform: uppercase;
display: flex;
justify-content: center;
align-items: center;
font-size: 17px;
font-weight: bold;
cursor: pointer;
.photo {
display: flex;
border-radius: 100%;
width: 100%;
height: 100%;
}
}
@import "abstracts/abstracts";
......@@ -11,7 +11,10 @@ import {
DomSanitizer,
SafeResourceUrl,
} from "@angular/platform-browser";
import {User} from "@models";
import {
BaseResourceLogo,
User,
} from "@models";
import {
Actions,
Store,
......@@ -43,6 +46,8 @@ import {MappingObject} from "solidify-frontend/lib/models";
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class SharedLogoWrapperContainer<TResource extends BaseResource> extends SharedAbstractContainer implements OnChanges, OnInit {
// COMPONENT TO USE ONLY ON DATATABLE
_idResource: string;
isLoading: boolean = true;
......@@ -58,6 +63,9 @@ export class SharedLogoWrapperContainer<TResource extends BaseResource> extends
@Input()
user: User;
@Input()
resourceContainer: BaseResourceLogo;
@Input()
set id(id: string) {
this._idResource = id;
......@@ -72,30 +80,28 @@ export class SharedLogoWrapperContainer<TResource extends BaseResource> extends
listPhotosObs: Observable<MappingObject<string>>;
photo: string;
photo: string | undefined;
constructor(protected readonly _store: Store,
protected readonly _actions$: Actions,
constructor(private readonly _store: Store,
private readonly _actions$: Actions,
private readonly _changeDetector: ChangeDetectorRef,
protected readonly _sanitizer: DomSanitizer) {
private readonly _sanitizer: DomSanitizer) {
super();
}
ngOnInit(): void {
super.ngOnInit();
this._loadPhoto(this.logoNamespace, this.id, this.user);
this._loadPhoto(this.logoNamespace, this.id, this.user, this.resourceContainer);
}
ngOnChanges(changes: SimpleChanges): void {
this._loadPhoto(this.logoNamespace, changes?.id?.currentValue, changes?.user?.currentValue);
this._loadPhoto(this.logoNamespace, changes?.id?.currentValue, changes?.user?.currentValue, changes?.resourceContainer?.currentValue);
}
private _loadPhoto(logoNamespace: ResourceLogoNameSpace, id: string, user: User): void {
if (isNotNullNorUndefined(logoNamespace)
&& isNotNullNorUndefined(id)
&& isNotNullNorUndefined(user)) {
private _loadPhoto(logoNamespace: ResourceLogoNameSpace, id: string, user: User, resourceContainer: BaseResourceLogo): void {
if (isNotNullNorUndefined(logoNamespace) && isNotNullNorUndefined(id)) {
if (isTrue(this.skipIfAvatarMissing) && isNullOrUndefined(user?.person?.avatar)) {
if (isTrue(this.skipIfAvatarMissing) && ((this.isUser && isNullOrUndefined(user?.person?.avatar)) || !this.isUser && isNullOrUndefined(resourceContainer?.logo))) {
this.isLoading = false;
return;
}
......@@ -132,7 +138,7 @@ export class SharedLogoWrapperContainer<TResource extends BaseResource> extends
}
}
protected sanitizeUrl(url: string | undefined): undefined | SafeResourceUrl {
sanitizeUrl(url: string | undefined): undefined | SafeResourceUrl {
if (isNullOrUndefined(url)) {
return undefined;
} else {
......
......@@ -6,7 +6,7 @@
class="status"
>
<ng-container *ngIf="getUrl(copy) as url; else noUrl">
<a [href]="getUrl(copy)">{{getStatusLabel(copy.status) | translate}}</a>
<a [routerLink]="url">{{getStatusLabel(copy.status) | translate}}</a>
</ng-container>
<ng-template #noUrl>
{{getStatusLabel(copy.status) | translate}}
......
......@@ -50,7 +50,7 @@ export class SharedAipStatusSummaryPresentational extends SharedAbstractPresenta
aipCopySorted: AipCopy[] = [];
private readonly PATH_TO_AIP_STORAGION: string = "#" + urlSeparator + AppRoutesEnum.preservationPlanning + urlSeparator + PreservationPlanningRoutesEnum.aip + urlSeparator;
private readonly PATH_TO_AIP_STORAGION: string = urlSeparator + AppRoutesEnum.preservationPlanning + urlSeparator + PreservationPlanningRoutesEnum.aip + urlSeparator;
get packageStatusEnum(): typeof Enums.Package.StatusEnum {
return Enums.Package.StatusEnum;
......
......@@ -62,4 +62,19 @@ $size-image: 400px;
height: $size-image;
width: $size-image;
}
}
\ No newline at end of file
}
:host(.in-list) {
$size-image: 50px;
justify-self: center;
height: $size-image;
width: $size-image;
.fallback-image,
.main-image {
height: $size-image;
width: $size-image;
}
}
......@@ -19,7 +19,7 @@ import {isNullOrUndefined} from "solidify-frontend";
})
export class SharedImageDisplayPresentational extends SharedAbstractPresentational {
@Input()
image: string | undefined;
image: SafeResourceUrl | undefined;
defaultImageArchive: string = `assets/themes/${environment.theme}/toolbar-header-image.svg`;
displayFallback: boolean = true;
......
<div *ngIf="photoUserSanitize | isNullOrUndefined"
class="avatar"
>
{{initial}}
</div>
<img *ngIf="photoUserSanitize | isNotNullNorUndefined"
[src]="photoUserSanitize"
alt="photo"
class="photo"
>
\ No newline at end of file
@import "src/sass/abstracts/abstracts";
$avatar-size: 45px;
:host {
background-size: cover;
background-color: $primary-color;
color: $white;
height: $avatar-size;
width: $avatar-size;
border-radius: 50%;
flex-shrink: 0;
object-fit: cover;
text-transform: uppercase;
display: flex;
justify-content: center;
align-items: center;
font-size: 17px;
font-weight: bold;
cursor: pointer;
.photo {
border-radius: 100%;
width: 100%;
height: 100%;
}
}
:host(.is-photo) {
background-color: transparent;
}