mirror of https://github.com/Squidex/squidex.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
4.0 KiB
149 lines
4.0 KiB
/*
|
|
* Squidex Headless CMS
|
|
*
|
|
* @license
|
|
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
|
|
*/
|
|
|
|
// tslint:disable:prefer-for-of
|
|
|
|
import { Component, forwardRef } from '@angular/core';
|
|
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
|
|
import {
|
|
AppsState,
|
|
AssetDto,
|
|
AssetsService,
|
|
DialogModel,
|
|
ImmutableArray,
|
|
LocalStoreService,
|
|
Types
|
|
} from '@app/shared';
|
|
|
|
export const SQX_ASSETS_EDITOR_CONTROL_VALUE_ACCESSOR: any = {
|
|
provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => AssetsEditorComponent), multi: true
|
|
};
|
|
|
|
@Component({
|
|
selector: 'sqx-assets-editor',
|
|
styleUrls: ['./assets-editor.component.scss'],
|
|
templateUrl: './assets-editor.component.html',
|
|
providers: [
|
|
SQX_ASSETS_EDITOR_CONTROL_VALUE_ACCESSOR
|
|
]
|
|
})
|
|
export class AssetsEditorComponent implements ControlValueAccessor {
|
|
private callChange = (v: any) => { /* NOOP */ };
|
|
private callTouched = () => { /* NOOP */ };
|
|
|
|
public assetsDialog = new DialogModel();
|
|
|
|
public newAssets = ImmutableArray.empty<File>();
|
|
public oldAssets = ImmutableArray.empty<AssetDto>();
|
|
|
|
public isListView = false;
|
|
public isDisabled = false;
|
|
|
|
constructor(
|
|
private readonly appsState: AppsState,
|
|
private readonly assetsService: AssetsService,
|
|
private readonly localStore: LocalStoreService
|
|
) {
|
|
this.isListView = this.localStore.get('assetView') === 'List';
|
|
}
|
|
|
|
public writeValue(obj: any) {
|
|
if (Types.isArrayOfString(obj)) {
|
|
if (!Types.isEquals(obj, this.oldAssets.map(x => x.id).values)) {
|
|
const assetIds: string[] = obj;
|
|
|
|
this.assetsService.getAssets(this.appsState.appName, 0, 0, undefined, undefined, obj)
|
|
.subscribe(dtos => {
|
|
this.oldAssets = ImmutableArray.of(assetIds.map(id => dtos.items.find(x => x.id === id)).filter(a => !!a).map(a => a!));
|
|
|
|
if (this.oldAssets.length !== assetIds.length) {
|
|
this.updateValue();
|
|
}
|
|
}, () => {
|
|
this.oldAssets = ImmutableArray.empty();
|
|
});
|
|
}
|
|
} else {
|
|
this.oldAssets = ImmutableArray.empty();
|
|
}
|
|
}
|
|
|
|
public setDisabledState(isDisabled: boolean): void {
|
|
this.isDisabled = isDisabled;
|
|
}
|
|
|
|
public registerOnChange(fn: any) {
|
|
this.callChange = fn;
|
|
}
|
|
|
|
public registerOnTouched(fn: any) {
|
|
this.callTouched = fn;
|
|
}
|
|
|
|
public addFiles(files: FileList) {
|
|
for (let i = 0; i < files.length; i++) {
|
|
this.newAssets = this.newAssets.pushFront(files[i]);
|
|
}
|
|
}
|
|
|
|
public onAssetsSelected(assets: AssetDto[]) {
|
|
for (let asset of assets) {
|
|
this.oldAssets = this.oldAssets.push(asset);
|
|
}
|
|
|
|
if (assets.length > 0) {
|
|
this.updateValue();
|
|
}
|
|
|
|
this.assetsDialog.hide();
|
|
}
|
|
|
|
public onAssetRemoving(asset: AssetDto) {
|
|
if (asset) {
|
|
this.oldAssets = this.oldAssets.remove(asset);
|
|
|
|
this.updateValue();
|
|
}
|
|
}
|
|
|
|
public onAssetLoaded(file: File, asset: AssetDto) {
|
|
this.newAssets = this.newAssets.remove(file);
|
|
this.oldAssets = this.oldAssets.pushFront(asset);
|
|
|
|
this.updateValue();
|
|
}
|
|
|
|
public onAssetFailed(file: File) {
|
|
this.newAssets = this.newAssets.remove(file);
|
|
}
|
|
|
|
private updateValue() {
|
|
let ids: string[] | null = this.oldAssets.values.map(x => x.id);
|
|
|
|
if (ids.length === 0) {
|
|
ids = null;
|
|
}
|
|
|
|
this.callTouched();
|
|
this.callChange(ids);
|
|
}
|
|
|
|
public sort(assets: AssetDto[]) {
|
|
if (assets) {
|
|
this.oldAssets = ImmutableArray.of(assets);
|
|
|
|
this.updateValue();
|
|
}
|
|
}
|
|
|
|
public changeView(isListView: boolean) {
|
|
this.localStore.set('assetView', isListView ? 'List' : 'Grid');
|
|
|
|
this.isListView = isListView;
|
|
}
|
|
}
|