Skip to content

Commit

Permalink
dev: create DotBinaryFieldUrlMode component
Browse files Browse the repository at this point in the history
  • Loading branch information
rjvelazco committed Sep 27, 2023
1 parent abe7ab8 commit a8e1ae4
Show file tree
Hide file tree
Showing 7 changed files with 172 additions and 30 deletions.
Expand Up @@ -80,35 +80,13 @@
[header]="dialogHeaderMap[vm.mode] | dm"
[draggable]="false"
[resizable]="false"
(onHide)="dialogClosed()"
(visibleChange)="visibleChange($event)">
<div [ngSwitch]="vm.mode">
<div *ngSwitchCase="BINARY_FIELD_MODE.URL" data-testId="url">
<div class="binary-field__external-source">
<div class="binary-field__external-source--input">
<span>Import from URL</span>
<input
#urlInput
[ngStyle]="{ width: '32rem' }"
pInputText
type="text"
placeholder="https://www.google.com/"
data-testId="url-input" />
</div>
<div class="binary-field__external-source--action">
<p-button
[label]="'dot.binary.field.action.cancel' | dm"
(click)="visibleChange(false)"
data-testId="action-cancel-btn"
styleClass="p-button-outlined"
icon="pi pi-times"></p-button>

<p-button
[label]="'dot.binary.field.action.import' | dm"
(click)="handleExternalSourceFile(urlInput.value)"
data-testId="action-import-btn"
icon="pi pi-link"></p-button>
</div>
</div>
<dot-dot-binary-field-url-mode
(cancel)="visibleChange(false)"
(accept)="handleExternalSourceFile($event)"></dot-dot-binary-field-url-mode>
</div>
<div *ngSwitchCase="BINARY_FIELD_MODE.EDITOR" data-testId="editor">
TODO: Implement Write Code
Expand Down
Expand Up @@ -14,6 +14,7 @@ import { DotDropZoneComponent, DotMessagePipe, DotSpinnerModule } from '@dotcms/

import { DotBinaryFieldComponent } from './binary-field.component';
import { DotBinaryFieldUiMessageComponent } from './components/dot-binary-field-ui-message/dot-binary-field-ui-message.component';
import { DotBinaryFieldUrlModeComponent } from './components/dot-binary-field-url-mode/dot-binary-field-url-mode.component';
import { DotBinaryFieldStore } from './store/binary-field.store';

import { CONTENTTYPE_FIELDS_MESSAGE_MOCK } from '../../utils/mock';
Expand All @@ -34,7 +35,8 @@ export default {
DotBinaryFieldUiMessageComponent,
DotMessagePipe,
DotSpinnerModule,
InputTextModule
InputTextModule,
DotBinaryFieldUrlModeComponent
],
providers: [
DotBinaryFieldStore,
Expand Down
Expand Up @@ -15,6 +15,7 @@ import {

import { ButtonModule } from 'primeng/button';
import { DialogModule } from 'primeng/dialog';
import { InputTextModule } from 'primeng/inputtext';

import { skip } from 'rxjs/operators';

Expand All @@ -28,9 +29,8 @@ import {
DropZoneFileValidity
} from '@dotcms/ui';

import { InputTextModule } from 'primeng/inputtext';

import { DotBinaryFieldUiMessageComponent } from './components/dot-binary-field-ui-message/dot-binary-field-ui-message.component';
import { DotBinaryFieldUrlModeComponent } from './components/dot-binary-field-url-mode/dot-binary-field-url-mode.component';
import {
BINARY_FIELD_MODE,
BINARY_FIELD_STATUS,
Expand Down Expand Up @@ -63,7 +63,8 @@ const initialState: BinaryFieldState = {
DotBinaryFieldUiMessageComponent,
DotSpinnerModule,
HttpClientModule,
InputTextModule
InputTextModule,
DotBinaryFieldUrlModeComponent
],
providers: [DotBinaryFieldStore],
templateUrl: './binary-field.component.html',
Expand Down Expand Up @@ -164,6 +165,15 @@ export class DotBinaryFieldComponent implements OnInit {
}
}

/**
* Listen to dialog close event
*
* @memberof DotBinaryFieldComponent
*/
dialogClosed() {
this.dotBinaryFieldStore.setMode(BINARY_FIELD_MODE.DROPZONE);
}

/**
* Open file picker dialog
*
Expand Down
@@ -0,0 +1,27 @@
<form class="url-mode__form" [formGroup]="form" (ngSubmit)="onSubmit()">
<div class="url-mode__input-container">
<span>Import from URL</span>
<input
[ngClass]="{ 'p-invalid': isInvalid }"
formControlName="url"
pInputText
type="text"
placeholder="https://www.google.com/"
data-testId="url-input" />
<span class="error-message p-invalid" *ngIf="isInvalid">{{ errorMessage }}</span>
</div>
<div class="url-mode__actions">
<p-button
[label]="'dot.binary.field.action.cancel' | dm"
(click)="cancel.emit()"
data-testId="action-cancel-btn"
styleClass="p-button-outlined"
icon="pi pi-times"></p-button>

<p-button
[label]="'dot.binary.field.action.import' | dm"
type="submit"
data-testId="action-import-btn"
icon="pi pi-link"></p-button>
</div>
</form>
@@ -0,0 +1,33 @@
@use "variables" as *;

.url-mode__form {
display: flex;
flex-direction: column;
gap: $spacing-3;
justify-content: center;
align-items: flex-start;
}

.url-mode__input-container {
width: 100%;
display: flex;
gap: $spacing-1;
flex-direction: column;

input {
width: 100%;
min-width: 32rem;
}
}

.url-mode__actions {
width: 100%;
display: flex;
gap: $spacing-1;
align-items: center;
justify-content: flex-end;
}

.error-message {
font-size: $font-size-sm;
}
@@ -0,0 +1,37 @@
import { expect, it } from '@jest/globals';
import { Spectator, byTestId, createComponentFactory } from '@ngneat/spectator';

import { DotMessageService } from '@dotcms/data-access';

import { DotBinaryFieldUrlModeComponent } from './dot-binary-field-url-mode.component';

import { CONTENTTYPE_FIELDS_MESSAGE_MOCK } from '../../../../utils/mock';

describe('DotBinaryFieldUrlModeComponent', () => {
let spectator: Spectator<DotBinaryFieldUrlModeComponent>;

const createComponent = createComponentFactory({
component: DotBinaryFieldUrlModeComponent,
imports: [],
providers: [
{
provide: DotMessageService,
useValue: CONTENTTYPE_FIELDS_MESSAGE_MOCK
}
]
});

beforeEach(() => {
spectator = createComponent({
detectChanges: false
});
});

afterEach(() => {
jest.resetAllMocks();
});

it('should have a form with url field', () => {
expect(spectator.query(byTestId('url-input'))).not.toBeNull();
});
});
@@ -0,0 +1,55 @@
import { CommonModule } from '@angular/common';
import { ChangeDetectionStrategy, Component, EventEmitter, Output } from '@angular/core';
import {
FormGroup,
FormControl,
FormsModule,
ReactiveFormsModule,
Validators
} from '@angular/forms';

import { ButtonModule } from 'primeng/button';
import { InputTextModule } from 'primeng/inputtext';

import { DotMessagePipe } from '@dotcms/ui';

@Component({
selector: 'dot-dot-binary-field-url-mode',
standalone: true,
imports: [
CommonModule,
FormsModule,
ReactiveFormsModule,
ButtonModule,
InputTextModule,
DotMessagePipe
],
templateUrl: './dot-binary-field-url-mode.component.html',
styleUrls: ['./dot-binary-field-url-mode.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class DotBinaryFieldUrlModeComponent {
@Output() accept: EventEmitter<string> = new EventEmitter<string>();
@Output() cancel: EventEmitter<void> = new EventEmitter<void>();

private readonly validators = [
Validators.required,
Validators.pattern(/^(ftp|http|https):\/\/[^ "]+$/)
];
readonly errorMessage = 'The URL you requested is not valid. Please try again.';
readonly form = new FormGroup({
url: new FormControl('', this.validators)
});

get isInvalid(): boolean {
const ngControl = this.form.get('url');

return ngControl.invalid && (ngControl.dirty || ngControl.touched);
}

onSubmit(): void {
if (this.form.valid) {
this.accept.emit(this.form.value.url);
}
}
}

0 comments on commit a8e1ae4

Please sign in to comment.