Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ export interface ContentByFolderParams {
showWorking?: boolean;
extensions?: string[];
mimeTypes?: string[];
languageId?: number;
}
export const BASE_SITE_URL = '/api/v1/site';
export const DEFAULT_PER_PAGE = 10;
Expand Down
1 change: 1 addition & 0 deletions core-web/libs/dotcms-models/src/lib/dot-site.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,5 @@ export interface ContentByFolderParams {
showWorking?: boolean;
extensions?: string[];
mimeTypes?: string[];
languageId?: number;
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ import {
UploadedFile
} from '../../../../models/dot-edit-content-file.model';
import { BaseControlValueAccessor } from '../../../shared/base-control-value-accesor';
import { DotEditContentStore } from '../../../../store/edit-content.store';

@Component({
selector: 'dot-file-field',
Expand Down Expand Up @@ -108,6 +109,13 @@ export class DotFileFieldComponent
* This service is used to provide AI-related functionalities within the component.
*/
readonly #dotAiService = inject(DotAiService);
/**
* Reference to the parent edit-content store, used to resolve the current
* locale when opening the browser selector so it filters assets by the
* language the user is actively editing in (including new contentlets
* where `$contentlet` has no languageId yet).
*/
readonly #editContentStore = inject(DotEditContentStore, { optional: true });
/**
* Reference to the dynamic dialog. It can be null if no dialog is currently open.
*
Expand Down Expand Up @@ -442,7 +450,9 @@ export class DotFileFieldComponent
showFolders: false,
showWorking: true,
showArchived: false,
sortByDesc: true
sortByDesc: true,
languageId:
this.#editContentStore?.currentLocale()?.id ?? this.$contentlet()?.languageId
}
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,30 @@ xdescribe('DotEditContentFileFieldComponent', () => {
});
});

describe('showSelectExistingFileDialog', () => {
it('should forward the contentlet languageId as a fallback to the browser selector dialog data', () => {
const dialogService = spectator.inject(DialogService);
const spyDialogOpen = jest.spyOn(dialogService, 'open');

spectator.setHostInput(
'contentlet',
createFakeContentlet({
[FILE_FIELD_MOCK.variable]: null,
languageId: 2
})
);
spectator.detectChanges();

const fieldComponent = spectator.query(DotFileFieldComponent);
fieldComponent.showSelectExistingFileDialog();

expect(spyDialogOpen).toHaveBeenCalledTimes(1);
expect(spyDialogOpen.mock.calls[0][1].data).toEqual(
expect.objectContaining({ languageId: 2 })
);
});
});

describe('Disabled State Management', () => {
it('should set disabled state correctly through setDisabledState method', () => {
spectator.detectChanges();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -186,3 +186,73 @@ describe('DotBrowserSelectorComponent', () => {
});
});
});

describe('DotBrowserSelectorComponent — DynamicDialogConfig.data forwarding', () => {
let spectator: Spectator<DotBrowserSelectorComponent>;
let mockStore: ReturnType<typeof createMockStore>;

const createComponent = createComponentFactory({
component: DotBrowserSelectorComponent,
schemas: [CUSTOM_ELEMENTS_SCHEMA],
providers: [
mockProvider(DynamicDialogRef),
mockProvider(DotContentletService, {
getContentletByInodeWithContent: jest
.fn()
.mockReturnValue(of(createFakeContentlet()))
}),
{
provide: DynamicDialogConfig,
useValue: {
data: {
hostFolderId: SYSTEM_HOST_ID,
mimeTypes: ['image'],
languageId: 2
}
}
}
],
detectChanges: false
});

beforeEach(() => {
mockStore = createMockStore();

TestBed.overrideComponent(DotBrowserSelectorComponent, {
set: {
imports: [DotMessagePipe],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
providers: [{ provide: DotBrowserSelectorStore, useValue: mockStore }]
}
});

spectator = createComponent();
spectator.detectChanges();
});

it('should forward languageId from DynamicDialogConfig.data into $folderParams on init', () => {
expect(spectator.component.$folderParams().languageId).toBe(2);
});

it('should preserve languageId in $folderParams after a node selection', () => {
spectator.component.onNodeSelect(mockNodeSelectEvent('demo.dotcms.com'));

expect(spectator.component.$folderParams()).toEqual(
expect.objectContaining({
hostFolderId: 'demo.dotcms.com',
languageId: 2
})
);
});

it('should pass languageId through to store.uploadFile via folderParams', () => {
const mockFile = new File(['content'], 'photo.png', { type: 'image/png' });

spectator.component.onFileUpload(mockFile);

expect(mockStore.uploadFile).toHaveBeenCalledWith({
file: mockFile,
folderParams: expect.objectContaining({ languageId: 2 })
});
});
});
Loading