Skip to content

Commit c8c356f

Browse files
authored
Merge branch 'main' into org-library-mvp
2 parents e1f620e + 24921ad commit c8c356f

File tree

5 files changed

+119
-0
lines changed

5 files changed

+119
-0
lines changed

frontend/language/src/nb.json

+4
Original file line numberDiff line numberDiff line change
@@ -1932,6 +1932,10 @@
19321932
"ux_editor.search_text_resources_close": "Lukk tekstsøk",
19331933
"ux_editor.search_text_resources_label": "Velg eksisterende tekst basert på ID",
19341934
"ux_editor.search_text_resources_none": "Ingen",
1935+
"ux_editor.settings.data_model_tab": "Datamodell",
1936+
"ux_editor.settings.navigation_tab": "Navigasjon",
1937+
"ux_editor.settings.other_settings": "Andre innstillinger",
1938+
"ux_editor.settings.wip_message": "Denne fanen er under utvikling - innhold kommer snart.",
19351939
"ux_editor.show_icon": "Skal ikonet vises?",
19361940
"ux_editor.subdomains_label": "Subdomener (kommaseparert)",
19371941
"ux_editor.subdomains_placeholder": "domene1, domene2, domene3",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
.heading {
2+
color: #1e2b3c;
3+
font-family: var(--studio-font-family);
4+
letter-spacing: 1px;
5+
margin-bottom: var(--fds-spacing-7);
6+
}
7+
8+
.icon {
9+
font-size: var(--fds-sizing-6);
10+
margin-right: var(--fds-spacing-1);
11+
}
12+
13+
.wipMessage {
14+
display: inline-grid;
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import React from 'react';
2+
import { screen } from '@testing-library/react';
3+
import { textMock } from '@studio/testing/mocks/i18nMock';
4+
import userEvent from '@testing-library/user-event';
5+
import { renderWithProviders } from '../../testing/mocks';
6+
import { SettingsTabs } from './SettingsTabs';
7+
8+
describe('SettingsTabs', () => {
9+
afterEach(jest.clearAllMocks);
10+
11+
it('should render component and select Navigation as default tab', () => {
12+
renderSettingsTabs();
13+
14+
const navigationTab = screen.getByRole('tab', {
15+
name: textMock('ux_editor.settings.navigation_tab'),
16+
});
17+
expect(navigationTab).toBeInTheDocument();
18+
expect(navigationTab).toHaveAttribute('aria-selected', 'true');
19+
20+
const dataModelTab = screen.getByRole('tab', {
21+
name: textMock('ux_editor.settings.data_model_tab'),
22+
});
23+
expect(dataModelTab).toBeInTheDocument();
24+
});
25+
26+
it('should switch to Navigation tab when clicking Navigation tab', async () => {
27+
const user = userEvent.setup();
28+
renderSettingsTabs();
29+
30+
const navigationTab = screen.getByRole('tab', {
31+
name: textMock('ux_editor.settings.navigation_tab'),
32+
});
33+
await user.click(navigationTab);
34+
35+
expect(navigationTab).toHaveAttribute('aria-selected', 'true');
36+
});
37+
38+
it('should switch to Data model tab when clicking Data model tab', async () => {
39+
const user = userEvent.setup();
40+
renderSettingsTabs();
41+
42+
const dataModelTab = screen.getByRole('tab', {
43+
name: textMock('ux_editor.settings.data_model_tab'),
44+
});
45+
await user.click(dataModelTab);
46+
47+
expect(dataModelTab).toHaveAttribute('aria-selected', 'true');
48+
});
49+
});
50+
51+
const renderSettingsTabs = () => {
52+
return renderWithProviders(<SettingsTabs />);
53+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import type { ReactElement } from 'react';
2+
import React from 'react';
3+
import { StudioAlert, StudioHeading, StudioTabs } from '@studio/components';
4+
import { useTranslation } from 'react-i18next';
5+
import classes from './SettingsTabs.module.css';
6+
import { CompassIcon, DatabaseIcon } from '@studio/icons';
7+
8+
enum Tabs {
9+
Navigation = 'navigation',
10+
Database = 'database',
11+
}
12+
13+
export const SettingsTabs = (): ReactElement => {
14+
const { t } = useTranslation();
15+
16+
return (
17+
<div>
18+
<StudioHeading level={2} size='xsmall' className={classes.heading}>
19+
{t('ux_editor.settings.other_settings')}
20+
</StudioHeading>
21+
<StudioTabs defaultValue={Tabs.Navigation}>
22+
<StudioTabs.List>
23+
<StudioTabs.Tab value={Tabs.Navigation}>
24+
<CompassIcon className={classes.icon} />
25+
{t('ux_editor.settings.navigation_tab')}
26+
</StudioTabs.Tab>
27+
<StudioTabs.Tab value={Tabs.Database}>
28+
<DatabaseIcon className={classes.icon} />
29+
{t('ux_editor.settings.data_model_tab')}
30+
</StudioTabs.Tab>
31+
</StudioTabs.List>
32+
<StudioTabs.Content value={Tabs.Navigation}>
33+
<StudioAlert severity='info' className={classes.wipMessage}>
34+
{t('ux_editor.settings.wip_message')}
35+
</StudioAlert>
36+
</StudioTabs.Content>
37+
<StudioTabs.Content value={Tabs.Database}>
38+
<StudioAlert severity='info' className={classes.wipMessage}>
39+
{t('ux_editor.settings.wip_message')}
40+
</StudioAlert>
41+
</StudioTabs.Content>
42+
</StudioTabs>
43+
</div>
44+
);
45+
};

frontend/packages/ux-editor/src/containers/FormDesignNavigation/FormDesignerNavigation.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import classes from './FormDesignerNavigation.module.css';
44
import { useTranslation } from 'react-i18next';
55
import { useStudioEnvironmentParams } from 'app-shared/hooks/useStudioEnvironmentParams';
66
import { useAppConfigQuery } from 'app-development/hooks/queries';
7+
import { SettingsTabs } from '../../components/Settings/SettingsTabs';
78

89
export const FormDesignerNavigation = () => {
910
const { t } = useTranslation();
@@ -15,6 +16,7 @@ export const FormDesignerNavigation = () => {
1516
<div className={classes.panel}>
1617
<div className={classes.content}>
1718
<div className={classes.header}>{appConfigData?.serviceName}</div>
19+
<SettingsTabs />
1820
</div>
1921
<footer className={classes.footer}>
2022
<Link href='/contact'>{t('general.contact')}</Link>

0 commit comments

Comments
 (0)