ConceptPortal-public/rsconcept/frontend/src/models/library.ts
2024-06-04 23:00:22 +03:00

138 lines
2.8 KiB
TypeScript

/**
* Module: Models for LibraryItem.
*/
import { UserID } from './user';
/**
* Represents type of library items.
*/
export enum LibraryItemType {
RSFORM = 'rsform',
OSS = 'oss'
}
/**
* Represents Access policy for library items.
*/
export enum AccessPolicy {
PUBLIC = 'public',
PROTECTED = 'protected',
PRIVATE = 'private'
}
/**
* Represents valid location headers.
*/
export enum LocationHead {
USER = '/U',
LIBRARY = '/L',
COMMON = '/S',
PROJECTS = '/P'
}
/**
* Represents {@link LibraryItem} identifier type.
*/
export type LibraryItemID = number;
/**
* Represents {@link Version} identifier type.
*/
export type VersionID = number;
/**
* Represents library item version information.
*/
export interface IVersionInfo {
id: VersionID;
version: string;
description: string;
time_create: string;
}
/**
* Represents user data, intended to create or update version metadata in persistent storage.
*/
export interface IVersionData extends Omit<IVersionInfo, 'id' | 'time_create'> {}
/**
* Represents library item common data typical for all item types.
*/
export interface ILibraryItem {
id: LibraryItemID;
item_type: LibraryItemType;
title: string;
alias: string;
comment: string;
visible: boolean;
read_only: boolean;
location: string;
access_policy: AccessPolicy;
time_create: string;
time_update: string;
owner: UserID | null;
}
/**
* Represents library item constant data loaded for both OSS and RSForm.
*/
export interface ILibraryItemData extends ILibraryItem {
subscribers: UserID[];
editors: UserID[];
}
/**
* Represents library item extended data with versions.
*/
export interface ILibraryItemVersioned extends ILibraryItemData {
version?: VersionID;
versions: IVersionInfo[];
}
/**
* Represents common library item editor controller.
*/
export interface ILibraryItemEditor {
schema?: ILibraryItemData;
isMutable: boolean;
isProcessing: boolean;
setOwner: (newOwner: UserID) => void;
setAccessPolicy: (newPolicy: AccessPolicy) => void;
promptEditors: () => void;
promptLocation: () => void;
toggleSubscribe: () => void;
share: () => void;
}
/**
* Represents update data for editing {@link ILibraryItem}.
*/
export interface ILibraryUpdateData
extends Omit<ILibraryItem, 'time_create' | 'time_update' | 'access_policy' | 'location' | 'id' | 'owner'> {}
/**
* Represents update data for editing {@link AccessPolicy} of a {@link ILibraryItem}.
*/
export interface ITargetAccessPolicy {
access_policy: AccessPolicy;
}
/**
* Represents update data for editing Location of a {@link ILibraryItem}.
*/
export interface ITargetLocation {
location: string;
}
/**
* Represents data, used for creating {@link IRSForm}.
*/
export interface ILibraryCreateData extends Omit<ILibraryItem, 'time_create' | 'time_update' | 'id' | 'owner'> {
file?: File;
fileName?: string;
}