From cbd6c29800b899d945d10f1ba3d135fc2669ef7c Mon Sep 17 00:00:00 2001 From: Jonas Dyrlie Date: Wed, 25 Sep 2024 10:48:21 +0200 Subject: [PATCH 1/8] feat: support summary 2 configuration for components, pages and selected layout set (#13573) Co-authored-by: Erling Hauan Co-authored-by: Erling Hauan <148075168+ErlingHauan@users.noreply.github.com> Co-authored-by: William Thorenfeldt <48119543+wrt95@users.noreply.github.com> --- frontend/language/src/nb.json | 5 + .../src/types/ComponentSpecificConfig.ts | 12 +- .../components/config/FormComponentConfig.tsx | 1 + .../ComponentSpecificContent.tsx | 7 + .../Summary2/Summary2Component.test.tsx | 149 ++++++++++++++++++ .../Summary2/Summary2Component.tsx | 126 +++++++++++++++ .../Summary2ComponentTargetSelector.tsx | 41 +++++ .../Summary2/index.ts | 1 + .../ux-editor/src/data/formItemConfig.ts | 9 +- .../packages/ux-editor/src/hooks/index.ts | 1 + .../ux-editor/src/testing/componentMocks.ts | 7 + .../src/utils/formLayoutUtils.test.tsx | 15 ++ .../ux-editor/src/utils/formLayoutUtils.ts | 15 ++ 13 files changed, 387 insertions(+), 2 deletions(-) create mode 100644 frontend/packages/ux-editor/src/components/config/componentSpecificContent/Summary2/Summary2Component.test.tsx create mode 100644 frontend/packages/ux-editor/src/components/config/componentSpecificContent/Summary2/Summary2Component.tsx create mode 100644 frontend/packages/ux-editor/src/components/config/componentSpecificContent/Summary2/Summary2ComponentTargetSelector.tsx create mode 100644 frontend/packages/ux-editor/src/components/config/componentSpecificContent/Summary2/index.ts diff --git a/frontend/language/src/nb.json b/frontend/language/src/nb.json index b49d7619db9..2a498d49608 100644 --- a/frontend/language/src/nb.json +++ b/frontend/language/src/nb.json @@ -251,6 +251,7 @@ "general.choose_method": "Velg metode", "general.close": "Lukk", "general.close_item": "Lukk {{item}}", + "general.component": "Komponent", "general.contact": "Kontakt og hjelp", "general.create_new": "Lag ny", "general.data_model": "datamodell", @@ -267,6 +268,7 @@ "general.for": "for", "general.help": "Hjelp", "general.layout": "layout", + "general.layout_set": "Sidegruppe", "general.layout_sets": "Sidegrupper", "general.loading": "Laster...", "general.next": "Neste", @@ -1275,6 +1277,9 @@ "ux_editor.component_properties.tabs": "Faner", "ux_editor.component_properties.tagName": "Tag-navn", "ux_editor.component_properties.target": "Mål", + "ux_editor.component_properties.target_description": "Mål for oppsummeringskomponenten", + "ux_editor.component_properties.target_invalid": "Ugyldig mål", + "ux_editor.component_properties.target_type": "Type", "ux_editor.component_properties.taskId": "Oppgave-ID", "ux_editor.component_properties.timeStamp": "Inkluder tidsstempel i dato (på som standard)", "ux_editor.component_properties.triggers": "Feltet skal utløse:", diff --git a/frontend/packages/shared/src/types/ComponentSpecificConfig.ts b/frontend/packages/shared/src/types/ComponentSpecificConfig.ts index fb72f58865c..fac7d27aabc 100644 --- a/frontend/packages/shared/src/types/ComponentSpecificConfig.ts +++ b/frontend/packages/shared/src/types/ComponentSpecificConfig.ts @@ -104,6 +104,8 @@ type SummarizableComponentProps = { renderAsSummary?: BooleanExpression; }; +export type SummaryTargetType = 'page' | 'layoutSet' | 'component'; + type LabeledComponentProps = { labelSettings?: LabelSettings; }; @@ -368,7 +370,15 @@ export type ComponentSpecificConfig = { hideBottomBorder?: boolean; }; }; - [ComponentType.Summary2]: {}; + [ComponentType.Summary2]: { + target: { + type?: SummaryTargetType; + id?: string; + taskId?: string; + }; + showPageInAccordion?: boolean; + hideEmptyFields?: boolean; + }; [ComponentType.TextArea]: FormComponentProps & SummarizableComponentProps & LabeledComponentProps & { diff --git a/frontend/packages/ux-editor/src/components/config/FormComponentConfig.tsx b/frontend/packages/ux-editor/src/components/config/FormComponentConfig.tsx index 8f1595a3132..03e10557e34 100644 --- a/frontend/packages/ux-editor/src/components/config/FormComponentConfig.tsx +++ b/frontend/packages/ux-editor/src/components/config/FormComponentConfig.tsx @@ -50,6 +50,7 @@ export const FormComponentConfig = ({ 'grid', 'children', 'dataTypeIds', + 'target', ]; const booleanPropertyKeys: string[] = getSupportedPropertyKeysForPropertyType( diff --git a/frontend/packages/ux-editor/src/components/config/componentSpecificContent/ComponentSpecificContent.tsx b/frontend/packages/ux-editor/src/components/config/componentSpecificContent/ComponentSpecificContent.tsx index f00c7588dce..282e98fb2aa 100644 --- a/frontend/packages/ux-editor/src/components/config/componentSpecificContent/ComponentSpecificContent.tsx +++ b/frontend/packages/ux-editor/src/components/config/componentSpecificContent/ComponentSpecificContent.tsx @@ -4,6 +4,7 @@ import type { IGenericEditComponent } from '../componentConfig'; import { ComponentType } from 'app-shared/types/ComponentType'; import { MapComponent } from './Map'; import { AttachmentListComponent } from './AttachmentList'; +import { Summary2Component } from './Summary2'; export function ComponentSpecificContent({ component, @@ -33,6 +34,12 @@ export function ComponentSpecificContent({ ); } + case ComponentType.Summary2: { + return ( + + ); + } + default: { return null; } diff --git a/frontend/packages/ux-editor/src/components/config/componentSpecificContent/Summary2/Summary2Component.test.tsx b/frontend/packages/ux-editor/src/components/config/componentSpecificContent/Summary2/Summary2Component.test.tsx new file mode 100644 index 00000000000..a834b0fe67d --- /dev/null +++ b/frontend/packages/ux-editor/src/components/config/componentSpecificContent/Summary2/Summary2Component.test.tsx @@ -0,0 +1,149 @@ +import { textMock } from '@studio/testing/mocks/i18nMock'; +import { app, org } from '@studio/testing/testids'; +import { screen, waitFor } from '@testing-library/react'; +import { createQueryClientMock } from 'app-shared/mocks/queryClientMock'; +import { ComponentType } from 'app-shared/types/ComponentType'; +import { QueryKey } from 'app-shared/types/QueryKey'; +import React from 'react'; +import { componentMocks } from '../../../../testing/componentMocks'; +import { + component1IdMock, + layout1NameMock, + layout2NameMock, + layoutMock, +} from '../../../../testing/layoutMock'; +import { layoutSet1NameMock } from '../../../../testing/layoutSetsMock'; +import { renderWithProviders } from '../../../../testing/mocks'; +import type { IGenericEditComponent } from '../../componentConfig'; +import { Summary2Component } from './Summary2Component'; +import userEvent from '@testing-library/user-event'; + +describe('Summary2ComponentTargetSelector', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should render', async () => { + render(); + + expect( + screen.getByRole('heading', { name: textMock('ux_editor.component_properties.target') }), + ).toBeInTheDocument(); + + expect(targetTypeSelect()).toBeInTheDocument(); + + expect(componentTargetSelect()).toBeInTheDocument(); + }); + + it('should allow selecting page target and defaults to same page', async () => { + const user = userEvent.setup(); + render(); + + await user.selectOptions(targetTypeSelect(), 'page'); + expect(defaultProps.handleComponentChange).toHaveBeenCalledWith( + expect.objectContaining({ target: { type: 'page', id: layout1NameMock } }), + ); + }); + + it('should allow selecting layoutSet target', async () => { + const user = userEvent.setup(); + render(); + + await user.selectOptions(targetTypeSelect(), 'layoutSet'); + expect(defaultProps.handleComponentChange).toHaveBeenCalledWith( + expect.objectContaining({ target: { type: 'layoutSet' } }), + ); + }); + + it('should allow selecting component target', async () => { + const user = userEvent.setup(); + render(); + + const componentId = component1IdMock; + + await user.click(componentTargetSelect()); + await user.click( + screen.getByRole('option', { + name: (content, _) => content.startsWith(componentId), + }), + ); + await waitFor(() => + expect(defaultProps.handleComponentChange).toHaveBeenCalledWith( + expect.objectContaining({ target: { type: 'component', id: componentId } }), + ), + ); + }); + + it('should allow selecting page target', async () => { + const user = userEvent.setup(); + render({ + component: { ...defaultProps.component, target: { type: 'page', id: layout1NameMock } }, + }); + + const pageId = layout2NameMock; + + await user.click(pageTargetSelect()); + await user.click( + screen.getByRole('option', { + name: (content, _) => content.startsWith(pageId), + }), + ); + await waitFor(() => + expect(defaultProps.handleComponentChange).toHaveBeenCalledWith( + expect.objectContaining({ target: { type: 'page', id: pageId } }), + ), + ); + }); + + it('should show error if page target is invalid', async () => { + render({ + component: { ...defaultProps.component, target: { type: 'page', id: 'invalid' } }, + }); + expect( + screen.getByText(textMock('ux_editor.component_properties.target_invalid')), + ).toBeInTheDocument(); + }); + + it('should show error if component target is invalid', async () => { + render({ + component: { ...defaultProps.component, target: { type: 'component', id: 'invalid' } }, + }); + expect( + screen.getByText(textMock('ux_editor.component_properties.target_invalid')), + ).toBeInTheDocument(); + }); +}); + +const targetTypeSelect = () => + screen.getByRole('combobox', { + name: textMock('ux_editor.component_properties.target_type'), + }); + +const componentTargetSelect = () => + screen.getByRole('combobox', { + name: textMock('general.component'), + }); + +const pageTargetSelect = () => + screen.getByRole('combobox', { + name: textMock('general.page'), + }); + +const defaultProps = { + component: componentMocks[ComponentType.Summary2], + handleComponentChange: jest.fn(), +}; +const render = (props?: Partial>) => { + const queryClient = createQueryClientMock(); + queryClient.setQueryData([QueryKey.FormLayouts, org, app, layoutSet1NameMock], { + [layout1NameMock]: layoutMock, + [layout2NameMock]: layoutMock, + }); + renderWithProviders(, { + queryClient, + appContextProps: { + selectedFormLayoutSetName: layoutSet1NameMock, + selectedFormLayoutName: layout1NameMock, + }, + }); +}; diff --git a/frontend/packages/ux-editor/src/components/config/componentSpecificContent/Summary2/Summary2Component.tsx b/frontend/packages/ux-editor/src/components/config/componentSpecificContent/Summary2/Summary2Component.tsx new file mode 100644 index 00000000000..a4a20e2ebe1 --- /dev/null +++ b/frontend/packages/ux-editor/src/components/config/componentSpecificContent/Summary2/Summary2Component.tsx @@ -0,0 +1,126 @@ +import React from 'react'; +import type { IGenericEditComponent } from '../../componentConfig'; +import { ComponentType } from 'app-shared/types/ComponentType'; +import { + StudioCard, + StudioHeading, + StudioNativeSelect, + StudioParagraph, + StudioTextfield, +} from '@studio/components'; +import { useFormLayoutsQuery } from '../../../../hooks/queries/useFormLayoutsQuery'; +import { useStudioEnvironmentParams } from 'app-shared/hooks/useStudioEnvironmentParams'; +import { useAppContext, useComponentTypeName } from '../../../../hooks'; +import { useTranslation } from 'react-i18next'; +import { Summmary2ComponentTargetSelector } from './Summary2ComponentTargetSelector'; +import { getAllLayoutComponents } from '../../../../utils/formLayoutUtils'; +import type { SummaryTargetType } from 'app-shared/types/ComponentSpecificConfig'; +import type { FormComponent } from '../../../../types/FormComponent'; + +export const Summary2Component = ({ + component, + handleComponentChange, +}: IGenericEditComponent) => { + const { t } = useTranslation(); + const { org, app } = useStudioEnvironmentParams(); + const { selectedFormLayoutSetName, selectedFormLayoutName } = useAppContext(); + const { data: formLayoutsData } = useFormLayoutsQuery(org, app, selectedFormLayoutSetName); + const componentTypeName = useComponentTypeName(); + + const excludedComponents = [ + ComponentType.Summary2, + ComponentType.NavigationButtons, + ComponentType.NavigationBar, + ]; + // TODO: This list of components to exclude when listing targets + // is not complete. Add more components that should be excluded + // as part of https://github.com/Altinn/altinn-studio/issues/13528 + + const components = Object.values(formLayoutsData).flatMap((layout) => + getAllLayoutComponents(layout, excludedComponents), + ); + const componentOptions = components.map((formComponent: FormComponent) => ({ + id: formComponent.id, + description: componentTypeName(formComponent.type), + })); + + const pageOptions = Object.keys(formLayoutsData).map((page) => ({ + id: page, + description: undefined, + })); + + const handleTypeChange = (event: React.ChangeEvent) => { + const newType = event.target.value as SummaryTargetType; + const updatedComponent = { ...component }; + + updatedComponent.target = { type: newType }; + // set default value for page + if (newType === 'page' && pageOptions.some((page) => page.id === selectedFormLayoutName)) { + updatedComponent.target.id = selectedFormLayoutName; + } + handleComponentChange(updatedComponent); + }; + + const handleTargetIdChange = (value: string) => { + const updatedComponent = { ...component }; + + updatedComponent.target.id = value; + handleComponentChange(updatedComponent); + }; + + const target = component.target; + const targetTypes = [ + { value: 'page', label: t('general.page') }, + { value: 'component', label: t('general.component') }, + { value: 'layoutSet', label: t('general.layout_set') }, + ]; + + return ( + + + {t('ux_editor.component_properties.target')} + + + {t('ux_editor.component_properties.target_description')} + + + + {targetTypes.map((type) => ( + + ))} + + {target.type === 'page' && ( + + )} + {target.type === 'component' && ( + + )} + {target.type === 'layoutSet' && ( + + )} + + + ); +}; diff --git a/frontend/packages/ux-editor/src/components/config/componentSpecificContent/Summary2/Summary2ComponentTargetSelector.tsx b/frontend/packages/ux-editor/src/components/config/componentSpecificContent/Summary2/Summary2ComponentTargetSelector.tsx new file mode 100644 index 00000000000..507fa56d05b --- /dev/null +++ b/frontend/packages/ux-editor/src/components/config/componentSpecificContent/Summary2/Summary2ComponentTargetSelector.tsx @@ -0,0 +1,41 @@ +import React from 'react'; +import { StudioCombobox } from '@studio/components'; +import { useTranslation } from 'react-i18next'; + +type Summary2ComponentTargetIdProps = { + label: string; + value: string; + options: { id: string; description: string }[]; + onValueChange: (value: string) => void; +}; + +export const Summmary2ComponentTargetSelector = ({ + label, + value, + options, + onValueChange, +}: Summary2ComponentTargetIdProps) => { + const invalidOption = Boolean(value) && !options.some((option) => option.id === value); + const { t } = useTranslation(); + return ( + onValueChange(v[0])} + error={invalidOption ? t('ux_editor.component_properties.target_invalid') : false} + multiple={false} + > + {options.map((option) => ( + + {option.id} + + ))} + {value && invalidOption && ( + + {value} + + )} + + ); +}; diff --git a/frontend/packages/ux-editor/src/components/config/componentSpecificContent/Summary2/index.ts b/frontend/packages/ux-editor/src/components/config/componentSpecificContent/Summary2/index.ts new file mode 100644 index 00000000000..f5485b22910 --- /dev/null +++ b/frontend/packages/ux-editor/src/components/config/componentSpecificContent/Summary2/index.ts @@ -0,0 +1 @@ +export { Summary2Component } from './Summary2Component'; diff --git a/frontend/packages/ux-editor/src/data/formItemConfig.ts b/frontend/packages/ux-editor/src/data/formItemConfig.ts index 109d6f98c35..a37467f2137 100644 --- a/frontend/packages/ux-editor/src/data/formItemConfig.ts +++ b/frontend/packages/ux-editor/src/data/formItemConfig.ts @@ -444,7 +444,14 @@ export const formItemConfigs: FormItemConfigs = { [ComponentType.Summary2]: { name: ComponentType.Summary2, itemType: LayoutItemType.Component, - defaultProperties: {}, + defaultProperties: { + target: { + type: 'component', + id: '', + taskId: '', + }, + }, + propertyPath: 'definitions/summary2Component', icon: FileTextIcon, }, [ComponentType.TextArea]: { diff --git a/frontend/packages/ux-editor/src/hooks/index.ts b/frontend/packages/ux-editor/src/hooks/index.ts index b361f5af526..4c0deab9c85 100644 --- a/frontend/packages/ux-editor/src/hooks/index.ts +++ b/frontend/packages/ux-editor/src/hooks/index.ts @@ -1,5 +1,6 @@ export type { UseText } from './useText'; export { useComponentErrorMessage } from './useComponentErrorMessage'; +export { useComponentTypeName } from './useComponentTypeName'; export { useFormLayouts } from './useFormLayouts'; export { useFormLayout } from './useFormLayout'; export { useSelectedFormLayout } from './useSelectedFormLayout'; diff --git a/frontend/packages/ux-editor/src/testing/componentMocks.ts b/frontend/packages/ux-editor/src/testing/componentMocks.ts index ae05d7501ff..e0616139a2f 100644 --- a/frontend/packages/ux-editor/src/testing/componentMocks.ts +++ b/frontend/packages/ux-editor/src/testing/componentMocks.ts @@ -142,6 +142,12 @@ const repeatingGroupContainer: FormContainer = { itemType: 'CONTAINER', dataModelBindings: { group: '' }, }; +const summary2Component: FormComponent = { + ...commonProps(ComponentType.Summary2), + target: { + type: 'component', + }, +}; export const componentMocks = { [ComponentType.AccordionGroup]: accordionGroupContainer, @@ -167,4 +173,5 @@ export const componentMocks = { [ComponentType.RepeatingGroup]: repeatingGroupContainer, [ComponentType.TextArea]: textareaComponent, [ComponentType.Custom]: thirdPartyComponent, + [ComponentType.Summary2]: summary2Component, }; diff --git a/frontend/packages/ux-editor/src/utils/formLayoutUtils.test.tsx b/frontend/packages/ux-editor/src/utils/formLayoutUtils.test.tsx index a0f2a35dece..7a53856b016 100644 --- a/frontend/packages/ux-editor/src/utils/formLayoutUtils.test.tsx +++ b/frontend/packages/ux-editor/src/utils/formLayoutUtils.test.tsx @@ -24,6 +24,7 @@ import { findLayoutsContainingDuplicateComponents, getAllDescendants, getAllFormItemIds, + getAllLayoutComponents, } from './formLayoutUtils'; import { ComponentType } from 'app-shared/types/ComponentType'; import type { IInternalLayout } from '../types/global'; @@ -680,4 +681,18 @@ describe('formLayoutUtils', () => { paragraphInGroupInGroupId, ]); }); + + describe('getAllLayoutComponents', () => { + it('Returns all components in the given layout, excluding types in the exclude list', () => { + const layout = { ...mockInternal }; + expect(getAllLayoutComponents(layout, [ComponentType.Paragraph])).toEqual([ + mockInternal.components[headerId], + ]); + }); + + it('Returns all components in the given layout', () => { + const layout = { ...mockInternal }; + expect(getAllLayoutComponents(layout)).toEqual(Object.values(mockInternal.components)); + }); + }); }); diff --git a/frontend/packages/ux-editor/src/utils/formLayoutUtils.ts b/frontend/packages/ux-editor/src/utils/formLayoutUtils.ts index 4c3eb521e95..19a445cb570 100644 --- a/frontend/packages/ux-editor/src/utils/formLayoutUtils.ts +++ b/frontend/packages/ux-editor/src/utils/formLayoutUtils.ts @@ -490,3 +490,18 @@ export const getDuplicatedIds = (layout: IInternalLayout): string[] => { * */ export const getAllFormItemIds = (layout: IInternalLayout): string[] => flattenObjectValues(layout.order); + +/** + * Get all components in the given layout + * @param layout The layout + * @param excludeTypes Optional array to exclude certain component types + * @returns An array of all components in the layout, excluding the types in the excludeTypes array + * */ +export const getAllLayoutComponents = ( + layout: IInternalLayout, + excludeTypes?: ComponentType[], +): FormComponent[] => { + return Object.values(layout.components).filter( + (component) => !excludeTypes || !excludeTypes.includes(component.type), + ); +}; From 8b4aa15c5965fe63a5595dfa2f180589bc4e465d Mon Sep 17 00:00:00 2001 From: Erling Hauan <148075168+ErlingHauan@users.noreply.github.com> Date: Wed, 25 Sep 2024 12:07:37 +0200 Subject: [PATCH 2/8] fix: Error when deleting the last sub-resource from a resource in policy editor (#13620) --- .../PolicyResourceFields.test.tsx | 60 +++++++++++++++---- .../PolicyResourceFields.tsx | 4 +- .../test/mocks/policyEditorContextMock.ts | 17 +++++- .../test/mocks/policyRuleContextMock.ts | 13 +++- .../test/mocks/policyRuleMocks.ts | 14 ++++- .../test/mocks/policySubResourceMocks.ts | 4 ++ 6 files changed, 97 insertions(+), 15 deletions(-) diff --git a/frontend/packages/policy-editor/src/components/PolicyCardRules/PolicyRule/SubResources/ResourceNarrowingList/PolicyResourceFields/PolicyResourceFields.test.tsx b/frontend/packages/policy-editor/src/components/PolicyCardRules/PolicyRule/SubResources/ResourceNarrowingList/PolicyResourceFields/PolicyResourceFields.test.tsx index 5538e967151..998e61f1f1c 100644 --- a/frontend/packages/policy-editor/src/components/PolicyCardRules/PolicyRule/SubResources/ResourceNarrowingList/PolicyResourceFields/PolicyResourceFields.test.tsx +++ b/frontend/packages/policy-editor/src/components/PolicyCardRules/PolicyRule/SubResources/ResourceNarrowingList/PolicyResourceFields/PolicyResourceFields.test.tsx @@ -6,8 +6,14 @@ import { PolicyResourceFields } from './PolicyResourceFields'; import { textMock } from '@studio/testing/mocks/i18nMock'; import { PolicyEditorContext } from '../../../../../../contexts/PolicyEditorContext'; import { PolicyRuleContext } from '../../../../../../contexts/PolicyRuleContext'; -import { mockPolicyEditorContextValue } from '../../../../../../../test/mocks/policyEditorContextMock'; -import { mockPolicyRuleContextValue } from '../../../../../../../test/mocks/policyRuleContextMock'; +import { + mockPolicyEditorContextValue, + mockPolicyEditorContextValueWithSingleNarrowingPolicy, +} from '../../../../../../../test/mocks/policyEditorContextMock'; +import { + mockPolicyRuleContextValue, + mockPolicyRuleContextValueWithSingleNarrowingPolicy, +} from '../../../../../../../test/mocks/policyRuleContextMock'; import { mockResource11 } from '../../../../../../../test/mocks/policySubResourceMocks'; const mockValudNewText = '45'; @@ -23,7 +29,7 @@ describe('PolicyResourceFields', () => { afterEach(jest.clearAllMocks); it('sets text fields to readonly when "canEditTypeAndId" is false', () => { - renderPolicyResourceFields({ canEditTypeAndId: false }); + renderPolicyResourceFieldsWithMultipleNarrowingPolicies({ canEditTypeAndId: false }); const idInput = screen.getByLabelText(textMock('policy_editor.narrowing_list_field_id')); expect(idInput).toHaveAttribute('readonly'); @@ -33,7 +39,7 @@ describe('PolicyResourceFields', () => { }); it('sets text fields to not be readonly when "canEditTypeAndId" is true', () => { - renderPolicyResourceFields(); + renderPolicyResourceFieldsWithMultipleNarrowingPolicies(); const idInput = screen.getByLabelText(textMock('policy_editor.narrowing_list_field_id')); expect(idInput).not.toHaveAttribute('readonly'); @@ -44,7 +50,7 @@ describe('PolicyResourceFields', () => { it('calls "setPolicyRules" when id input values change', async () => { const user = userEvent.setup(); - renderPolicyResourceFields(); + renderPolicyResourceFieldsWithMultipleNarrowingPolicies(); const idInput = screen.getByLabelText(textMock('policy_editor.narrowing_list_field_id')); @@ -57,7 +63,7 @@ describe('PolicyResourceFields', () => { it('calls "setPolicyRules" when type input values change', async () => { const user = userEvent.setup(); - renderPolicyResourceFields(); + renderPolicyResourceFieldsWithMultipleNarrowingPolicies(); const typeInput = screen.getByLabelText(textMock('policy_editor.narrowing_list_field_type')); @@ -70,7 +76,7 @@ describe('PolicyResourceFields', () => { it('calls "savePolicy" when input fields lose focus', async () => { const user = userEvent.setup(); - renderPolicyResourceFields(); + renderPolicyResourceFieldsWithMultipleNarrowingPolicies(); const typeInput = screen.getByLabelText(textMock('policy_editor.narrowing_list_field_type')); @@ -79,8 +85,18 @@ describe('PolicyResourceFields', () => { expect(mockPolicyEditorContextValue.savePolicy).toHaveBeenCalledTimes(1); }); - it('hides the delete button when "canEditTypeAndId" is false', () => { - renderPolicyResourceFields({ canEditTypeAndId: false }); + it('renders the delete button when there are multiple narrowing policies', () => { + renderPolicyResourceFieldsWithMultipleNarrowingPolicies(); + + const deleteButton = screen.queryByRole('button', { + name: textMock('policy_editor.narrowing_list_field_delete'), + }); + + expect(deleteButton).toBeInTheDocument(); + }); + + it('hides the delete button when there is only a single narrowing policy', () => { + renderPolicyResourceFieldsWithSingleNarrowingPolicy(); const deleteButton = screen.queryByRole('button', { name: textMock('policy_editor.narrowing_list_field_delete'), @@ -91,7 +107,7 @@ describe('PolicyResourceFields', () => { it('calls "setPolicyRules" and "savePolicy" when delete button is clicked', async () => { const user = userEvent.setup(); - renderPolicyResourceFields(); + renderPolicyResourceFieldsWithMultipleNarrowingPolicies(); const deleteButton = screen.getByRole('button', { name: textMock('policy_editor.narrowing_list_field_delete'), @@ -104,9 +120,19 @@ describe('PolicyResourceFields', () => { expect(mockPolicyEditorContextValue.setPolicyRules).toHaveBeenCalledTimes(1); expect(mockPolicyEditorContextValue.savePolicy).toHaveBeenCalledTimes(1); }); + + it('hides the delete button when there are multiple narrowing policies and "canEditTypeAndId" is false', () => { + renderPolicyResourceFieldsWithMultipleNarrowingPolicies({ canEditTypeAndId: false }); + + const deleteButton = screen.queryByRole('button', { + name: textMock('policy_editor.narrowing_list_field_delete'), + }); + + expect(deleteButton).not.toBeInTheDocument(); + }); }); -const renderPolicyResourceFields = ( +const renderPolicyResourceFieldsWithMultipleNarrowingPolicies = ( policyResourceFieldsProps: Partial = {}, ) => { return render( @@ -117,3 +143,15 @@ const renderPolicyResourceFields = ( , ); }; + +const renderPolicyResourceFieldsWithSingleNarrowingPolicy = ( + policyResourceFieldsProps: Partial = {}, +) => { + return render( + + + + + , + ); +}; diff --git a/frontend/packages/policy-editor/src/components/PolicyCardRules/PolicyRule/SubResources/ResourceNarrowingList/PolicyResourceFields/PolicyResourceFields.tsx b/frontend/packages/policy-editor/src/components/PolicyCardRules/PolicyRule/SubResources/ResourceNarrowingList/PolicyResourceFields/PolicyResourceFields.tsx index e226e2188c6..52a697957b5 100644 --- a/frontend/packages/policy-editor/src/components/PolicyCardRules/PolicyRule/SubResources/ResourceNarrowingList/PolicyResourceFields/PolicyResourceFields.tsx +++ b/frontend/packages/policy-editor/src/components/PolicyCardRules/PolicyRule/SubResources/ResourceNarrowingList/PolicyResourceFields/PolicyResourceFields.tsx @@ -25,6 +25,8 @@ export const PolicyResourceFields = ({ const { savePolicy, setPolicyRules, policyRules } = usePolicyEditorContext(); const { policyRule } = usePolicyRuleContext(); + const isMultipleNarrowingResources = policyRule.resources[resourceIndex].length > 1; + const handleInputChange = (field: 'id' | 'type', value: string) => { const updatedResources = [...policyRule.resources]; updatedResources[resourceIndex][resourceNarrowingIndex] = { @@ -95,7 +97,7 @@ export const PolicyResourceFields = ({
- {canEditTypeAndId && ( + {canEditTypeAndId && isMultipleNarrowingResources && ( Date: Wed, 25 Sep 2024 13:00:27 +0200 Subject: [PATCH 3/8] refactor: Changed some button names and their help texts : #13305 (#13609) --- frontend/language/src/nb.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/frontend/language/src/nb.json b/frontend/language/src/nb.json index 2a498d49608..d6ed31b6c78 100644 --- a/frontend/language/src/nb.json +++ b/frontend/language/src/nb.json @@ -1055,12 +1055,12 @@ "ux_editor.component_group_deletion_text": "Er du sikker på at du vil slette denne gruppen?\nAlle komponenter i denne gruppen blir også slettet", "ux_editor.component_help_text.Accordion": "Med komponenten Trekkspilliste kan du presentere mye innhold på liten plass i en eller flere rader. Brukerne kan klikke på hele raden, og åpne eller lukke visningen av innholdet under.", "ux_editor.component_help_text.AccordionGroup": "En samling med trekkspillister som vises vertikalt. Brukes for å gruppere lister som hører sammen.", - "ux_editor.component_help_text.ActionButton": "Knapp for å utløse en bestemt handling knyttet til det steget i prosessen som sluttbrukeren befinner seg på. Eksempler inkluderer 'sign', 'confirm', 'reject'.", + "ux_editor.component_help_text.ActionButton": "Knapp for å utløse en bestemt handling knyttet til det steget i prosessen sluttbrukeren befinner seg på. Steget kan være for eksempel være signering, bekreftelse eller avvisning.", "ux_editor.component_help_text.Address": "Komponent for å fylle ut adresse. Poststedet blir slått opp automatisk, basert på postnummeret.", "ux_editor.component_help_text.AddressComponent": "Komponent for å fylle ut adresse. Poststedet blir slått opp automatisk, basert på postnummeret.", "ux_editor.component_help_text.Alert": "Komponenten kan brukes til å vise en melding med ulike alvorlighetsgrader.", "ux_editor.component_help_text.AttachmentList": "Viser en liste over vedlegg som er lastet opp på eksemplaret for det prosess-steget sluttbruker er på.", - "ux_editor.component_help_text.Button": "Knapp for å sende inn skjema", + "ux_editor.component_help_text.Button": "Knapp for å sende inn et skjema eller avslutte. Du kan sette et eget navn på knappen", "ux_editor.component_help_text.ButtonGroup": "En samling knapper som vises side om side horisontalt. Brukes for å gruppere knapper som hører sammen.", "ux_editor.component_help_text.Checkboxes": "Du bruker avmerkingsbokser når brukeren skal kunne velge flere svar. Hvis brukeren bare skal velge ett av to alternativer, bruker du radioknapper.", "ux_editor.component_help_text.Datepicker": "Datovelger som tilbyr en kalender brukeren kan velge dato fra.", @@ -1080,15 +1080,15 @@ "ux_editor.component_help_text.List": "Listekomponenten kan brukes til å presentere innholdsrike data til bruker i tabellformat. Hver rad i tabellen er velgbar. Komponenten støtter søk, sortering og paginering.", "ux_editor.component_help_text.Map": "Kartkomponent der brukeren kan angi posisjon i kartet.", "ux_editor.component_help_text.MultipleSelect": "Nedtrekksliste med flere valg brukes i tilfeller der brukeren skal velge flere alternativ. Det samme gjelder avmerkingsbokser, så vær bevisst på når du bruker hvilken.", - "ux_editor.component_help_text.NavigationBar": "Navigasjonsbar gir enkel tilgang til alle sider i en app. Alle sider i appen blir listet opp, så denne komponenten egner seg derfor ikke til bruk sammen med sporvalg.", - "ux_editor.component_help_text.NavigationButtons": "Knapp for å navigere frem/tilbake mellom skjemasider.", + "ux_editor.component_help_text.NavigationBar": "Navigasjonsfeltet gir enkel tilgang til alle sider i en app. Alle sider i appen blir listet opp, så denne komponenten egner seg derfor ikke til bruk sammen med sporvalg.", + "ux_editor.component_help_text.NavigationButtons": "Knapper for å navigere frem/tilbake mellom skjemasider. Blir automatisk lagt til når du oppretter nye sider", "ux_editor.component_help_text.Panel": "Bruk Panel-komponenten til å vise viktig informasjon til brukeren.", "ux_editor.component_help_text.Paragraph": "Avsnitt med tekst.", "ux_editor.component_help_text.PrintButton": "Knapp for å starte utskrift av siden fra nettleseren", "ux_editor.component_help_text.RadioButtons": "Bruk radioknapper når du vil at brukeren kun skal kunne svare på ett av alternativene. Om brukeren skal kunne svare på flere må du bruke avmerkingsbokser. Er det veldig mange alternativer kan det lønne seg å bruke en nedtrekksmeny.", "ux_editor.component_help_text.Summary": "Komponent som viser informasjon som oppsummering. Brukes ofte på slutten av et skjema for å vise brukeren hva som er fylt ut.", "ux_editor.component_help_text.TextArea": "Du bruker Stort tekstfelt når du vil at brukerne skal skrive litt lengre tekst.", - "ux_editor.component_help_text.default": "Det kommer mer informasjon om denne komponenten senere.", + "ux_editor.component_help_text.default": "Knapp uten forhåndsdefinert handling eller navn. Du kan for eksempel bruke den i egendefinert kvittering eller PDF.", "ux_editor.component_help_text_general_title": "Åpne hjelpetekst for komponenten", "ux_editor.component_other_properties_title": "Andre innstillinger", "ux_editor.component_properties.action": "Handling", @@ -1312,11 +1312,11 @@ "ux_editor.component_title.AttachmentListOrPdf_error": "Du må velge minst ett vedlegg eller PDF", "ux_editor.component_title.AttachmentList_error": "Du må velge minst ett vedlegg", "ux_editor.component_title.AttachmentList_legend": "Vedleggsliste", - "ux_editor.component_title.Button": "Knapp", + "ux_editor.component_title.Button": "Send inn", "ux_editor.component_title.ButtonGroup": "Knappegruppe", "ux_editor.component_title.Checkboxes": "Avmerkingsbokser", "ux_editor.component_title.Custom": "Egendefinert", - "ux_editor.component_title.CustomButton": "Egendefinert knapp", + "ux_editor.component_title.CustomButton": "Tom knapp", "ux_editor.component_title.Datepicker": "Dato", "ux_editor.component_title.Dropdown": "Nedtrekksliste", "ux_editor.component_title.FileUpload": "Vedlegg", @@ -1335,13 +1335,13 @@ "ux_editor.component_title.List": "Liste", "ux_editor.component_title.Map": "Stedfeste i kart", "ux_editor.component_title.MultipleSelect": "Nedtrekksliste med flere valg", - "ux_editor.component_title.NavigationBar": "Navigasjonsbar", + "ux_editor.component_title.NavigationBar": "Navigasjonsfelt", "ux_editor.component_title.NavigationButtons": "Navigasjonsknapper", "ux_editor.component_title.Panel": "Informativ melding", "ux_editor.component_title.Paragraph": "Avsnitt", "ux_editor.component_title.Payment": "Betaling", "ux_editor.component_title.PaymentDetails": "Betalingsdetaljer", - "ux_editor.component_title.PrintButton": "Utskriftsknapp", + "ux_editor.component_title.PrintButton": "Utskrift", "ux_editor.component_title.RadioButtons": "Radioknapper", "ux_editor.component_title.RepeatingGroup": "Repeterende gruppe", "ux_editor.component_title.SubForm": "Underskjema", @@ -1456,7 +1456,7 @@ "ux_editor.modal_properties_grid_size_xl": "Monitor", "ux_editor.modal_properties_grid_size_xs": "Mobil", "ux_editor.modal_properties_grid_use_default": "Bruk standardinnstilling", - "ux_editor.modal_properties_group_add_button": "Tekst til “legg til ny”-knapp", + "ux_editor.modal_properties_group_add_button": "Tekst til “Legg til ny”-knapp", "ux_editor.modal_properties_group_add_button_description": "Teksten legger seg på slutten av teksten i knappen. “Legg til ny (din tekst)”", "ux_editor.modal_properties_group_change_id": "Gruppe-ID", "ux_editor.modal_properties_group_max_occur": "Maksimalt antall repetisjoner", From 034c44dca4d1a3569fa741b2bf61e9a4c899c9a3 Mon Sep 17 00:00:00 2001 From: Tomas Engebretsen Date: Wed, 25 Sep 2024 14:45:20 +0200 Subject: [PATCH 4/8] build: Update I18Next (#13603) --- frontend/app-development/package.json | 2 +- .../AboutResourcePage/AboutResourcePage.test.tsx | 2 +- package.json | 2 +- yarn.lock | 12 ++++++------ 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frontend/app-development/package.json b/frontend/app-development/package.json index 7746e46b67c..5900f432e55 100644 --- a/frontend/app-development/package.json +++ b/frontend/app-development/package.json @@ -14,7 +14,7 @@ "@studio/pure-functions": "workspace:^", "axios": "1.7.7", "classnames": "2.5.1", - "i18next": "23.14.0", + "i18next": "23.15.1", "react": "18.3.1", "react-dom": "18.3.1", "react-i18next": "15.0.1", diff --git a/frontend/resourceadm/pages/AboutResourcePage/AboutResourcePage.test.tsx b/frontend/resourceadm/pages/AboutResourcePage/AboutResourcePage.test.tsx index 672e7195d59..80cf1c8f550 100644 --- a/frontend/resourceadm/pages/AboutResourcePage/AboutResourcePage.test.tsx +++ b/frontend/resourceadm/pages/AboutResourcePage/AboutResourcePage.test.tsx @@ -55,7 +55,7 @@ const mockResource2: Resource = { }; const mockResourceType: ResourceTypeOption = textMock( 'resourceadm.about_resource_resource_type_system_resource', -); +) as ResourceTypeOption; const mockStatus: ResourceStatusOption = 'Deprecated'; const mockNewTitleInput: string = '23'; diff --git a/package.json b/package.json index 474d03ca520..565408ec5fc 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "@tanstack/react-query-devtools": "5.56.2", "ajv": "8.17.1", "ajv-formats": "3.0.1", - "i18next": "23.14.0", + "i18next": "23.15.1", "identity-obj-proxy": "3.0.0", "react": "18.3.1", "react-dom": "18.3.1", diff --git a/yarn.lock b/yarn.lock index 347b14256aa..3e3e6d2555a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8060,7 +8060,7 @@ __metadata: eslint-plugin-testing-library: "npm:6.3.0" glob: "npm:11.0.0" husky: "npm:9.1.6" - i18next: "npm:23.14.0" + i18next: "npm:23.15.1" identity-obj-proxy: "npm:3.0.0" jest: "npm:29.7.0" jest-environment-jsdom: "npm:29.7.0" @@ -8187,7 +8187,7 @@ __metadata: axios: "npm:1.7.7" classnames: "npm:2.5.1" cross-env: "npm:7.0.3" - i18next: "npm:23.14.0" + i18next: "npm:23.15.1" jest: "npm:29.7.0" react: "npm:18.3.1" react-dom: "npm:18.3.1" @@ -13348,12 +13348,12 @@ __metadata: languageName: node linkType: hard -"i18next@npm:23.14.0": - version: 23.14.0 - resolution: "i18next@npm:23.14.0" +"i18next@npm:23.15.1": + version: 23.15.1 + resolution: "i18next@npm:23.15.1" dependencies: "@babel/runtime": "npm:^7.23.2" - checksum: 10/661c1b22ae20bf75a616b3a804b96fd55bd04ed880853a05ef93912ed37f65b9546d8f8bbe55dfe2967a5b0f2ce110a7e9f4b7a6a3d90eb097d06c858d2b3e3f + checksum: 10/bfd4935517ddd68bd12ccc0b7bd454f1a19403b627d79a2fe81c9059380674f085804f8d7475dd248a887f90d9e2da0f9be64179ddf32e9eebac47e4b9f92889 languageName: node linkType: hard From 714001c7df1d670df1c0928e8f1005fa6a5cbcef Mon Sep 17 00:00:00 2001 From: Tomas Engebretsen Date: Wed, 25 Sep 2024 14:58:18 +0200 Subject: [PATCH 5/8] fix: Generate unique pointer correctly (#13635) --- .../schema-model/src/lib/SchemaModel.test.ts | 33 +++++++++++++---- .../schema-model/src/lib/SchemaModel.ts | 8 ++--- .../schema-model/src/lib/pointerUtils.test.ts | 25 +++++++++++++ .../schema-model/src/lib/pointerUtils.ts | 20 ++++++++++- .../schema-model/test/uiSchemaMock.ts | 35 +++++++++++++++++++ 5 files changed, 110 insertions(+), 11 deletions(-) diff --git a/frontend/packages/schema-model/src/lib/SchemaModel.test.ts b/frontend/packages/schema-model/src/lib/SchemaModel.test.ts index e6eb4c4bcd8..3259b8387a4 100644 --- a/frontend/packages/schema-model/src/lib/SchemaModel.test.ts +++ b/frontend/packages/schema-model/src/lib/SchemaModel.test.ts @@ -3,6 +3,8 @@ import { allOfNodeChildMock, allOfNodeMock, arrayNodeMock, + combinationDefNodeChild1Mock, + combinationDefNodeMock, combinationNodeWithMultipleChildrenMock, defNodeMock, defNodeWithChildrenChildMock, @@ -16,6 +18,7 @@ import { parentNodeMock, referenceDefinitionMock, referenceNodeMock, + referenceToCombinationDefNodeMock, referenceToObjectNodeMock, requiredNodeMock, rootNodeMock, @@ -145,11 +148,10 @@ describe('SchemaModel', () => { }); describe('getSchemaPointerByUniquePointer', () => { - const uniqueGrandChildPointer = - '#/properties/referenceToParent/properties/child/properties/grandchild'; - const uniqueChildPointer = '#/properties/referenceToParent/properties/child'; - - it('Returns the schema pointer for a given unique pointer', () => { + it('Returns the schema pointer for a given unique pointer to an object', () => { + const uniqueGrandChildPointer = + '#/properties/referenceToParent/properties/child/properties/grandchild'; + const uniqueChildPointer = '#/properties/referenceToParent/properties/child'; expect(schemaModel.getSchemaPointerByUniquePointer(uniqueChildPointer)).toEqual( defNodeWithChildrenChildMock.schemaPointer, ); @@ -157,6 +159,13 @@ describe('SchemaModel', () => { defNodeWithChildrenGrandchildMock.schemaPointer, ); }); + + it('Returns the schema pointer for a given unique pointer to a combination', () => { + const uniquePointer = '#/properties/referenceToCombinationDef/oneOf/0'; + const expectedResult = combinationDefNodeChild1Mock.schemaPointer; + const result = schemaModel.getSchemaPointerByUniquePointer(uniquePointer); + expect(result).toEqual(expectedResult); + }); }); describe('getUniquePointer', () => { @@ -172,7 +181,7 @@ describe('SchemaModel', () => { ); }); - it('Returns a pointer reflecting the path to a given node in a reference', () => { + it('Returns a pointer reflecting the path to a given node in a reference to an object', () => { const expectedChildPointer = '#/properties/referenceToParent/properties/child'; const expectedGrandchildPointer = '#/properties/referenceToParent/properties/child/properties/grandchild'; @@ -190,6 +199,14 @@ describe('SchemaModel', () => { ), ).toEqual(expectedGrandchildPointer); }); + + it('Returns a pointer reflecting the path to a given node in a reference to a combination', () => { + const { schemaPointer } = combinationDefNodeChild1Mock; + const uniquePointerOfParent = referenceToCombinationDefNodeMock.schemaPointer; + const result = schemaModel.getUniquePointer(schemaPointer, uniquePointerOfParent); + const expectedResult = '#/properties/referenceToCombinationDef/oneOf/0'; + expect(result).toEqual(expectedResult); + }); }); describe('hasNode', () => { @@ -229,6 +246,7 @@ describe('SchemaModel', () => { unusedDefinitionMock, unusedDefinitionWithSameNameAsExistingObjectMock, referenceDefinitionMock, + combinationDefNodeMock, ]); }); }); @@ -244,6 +262,7 @@ describe('SchemaModel', () => { referenceToObjectNodeMock, nodeWithSameNameAsStringNodeMock, combinationNodeWithMultipleChildrenMock, + referenceToCombinationDefNodeMock, ]); }); }); @@ -264,6 +283,8 @@ describe('SchemaModel', () => { referenceDefinitionMock, nodeWithSameNameAsStringNodeMock, combinationNodeWithMultipleChildrenMock, + referenceToCombinationDefNodeMock, + combinationDefNodeMock, ]); }); }); diff --git a/frontend/packages/schema-model/src/lib/SchemaModel.ts b/frontend/packages/schema-model/src/lib/SchemaModel.ts index 99577ee6ef8..eabf91f7154 100644 --- a/frontend/packages/schema-model/src/lib/SchemaModel.ts +++ b/frontend/packages/schema-model/src/lib/SchemaModel.ts @@ -1,7 +1,6 @@ import { CombinationKind, FieldType, - Keyword, type NodePosition, type UiSchemaNode, type UiSchemaNodes, @@ -31,6 +30,7 @@ import { replaceStart } from 'app-shared/utils/stringUtils'; import { createDefinitionPointer, createPropertyPointer, + extractCategoryFromPointer, extractNameFromPointer, makePointerFromArray, } from './pointerUtils'; @@ -90,7 +90,7 @@ export class SchemaModel { const parentNodePointer = this.getParentSchemaPointerByUniquePointer(uniquePointer); return makePointerFromArray([ parentNodePointer, - Keyword.Properties, + extractCategoryFromPointer(uniquePointer), extractNameFromPointer(uniquePointer), ]); } @@ -109,8 +109,8 @@ export class SchemaModel { public getUniquePointer(schemaPointer: string, uniqueParentPointer?: string): string { if (!uniqueParentPointer || !isDefinitionPointer(schemaPointer)) return schemaPointer; - - return `${uniqueParentPointer}/properties/${extractNameFromPointer(schemaPointer)}`; + const category = extractCategoryFromPointer(schemaPointer); + return `${uniqueParentPointer}/${category}/${extractNameFromPointer(schemaPointer)}`; } public hasNode(schemaPointer: string): boolean { diff --git a/frontend/packages/schema-model/src/lib/pointerUtils.test.ts b/frontend/packages/schema-model/src/lib/pointerUtils.test.ts index 8e914196b5e..ade02d01acd 100644 --- a/frontend/packages/schema-model/src/lib/pointerUtils.test.ts +++ b/frontend/packages/schema-model/src/lib/pointerUtils.test.ts @@ -3,6 +3,7 @@ import { changeNameInPointer, createDefinitionPointer, createPropertyPointer, + extractCategoryFromPointer, extractNameFromPointer, makePointerFromArray, } from './pointerUtils'; @@ -13,6 +14,7 @@ import { simpleParentNodeMock, stringNodeMock, } from '../../test/uiSchemaMock'; +import { CombinationKind, Keyword } from '@altinn/schema-model/types'; describe('pointerUtils', () => { test('makePointerFromArray', () => { @@ -65,6 +67,29 @@ describe('pointerUtils', () => { }); }); + describe('extractCategoryFromPointer', () => { + it('Returns "properties" when the pointer is a property pointer', () => { + expect(extractCategoryFromPointer('#/properties/hello')).toBe(Keyword.Properties); + expect(extractCategoryFromPointer('#/anyOf/hello/properties/world')).toBe(Keyword.Properties); + expect(extractCategoryFromPointer('#/$defs/test/properties/hello')).toBe(Keyword.Properties); + }); + + it('Returns the combination kind when the pointer is a combination pointer', () => { + expect(extractCategoryFromPointer('#/allOf/0')).toBe(CombinationKind.AllOf); + expect(extractCategoryFromPointer('#/properties/test/anyOf/1')).toBe(CombinationKind.AnyOf); + expect(extractCategoryFromPointer('#/allOf/test/oneOf/2')).toBe(CombinationKind.OneOf); + expect(extractCategoryFromPointer('#/$defs/test/anyOf/3')).toBe(CombinationKind.AnyOf); + }); + + it('Returns "$defs" when the pointer is a definition pointer', () => { + expect(extractCategoryFromPointer('#/$defs/test')).toBe(Keyword.Definitions); + }); + + it('Returns undefined when the pointer is the root pointer', () => { + expect(extractCategoryFromPointer('#')).toBe(undefined); + }); + }); + describe('changeNameInPointer', () => { it('Changes the last part of the pointer', () => { expect(changeNameInPointer('#/$defs/hello', 'world')).toBe('#/$defs/world'); diff --git a/frontend/packages/schema-model/src/lib/pointerUtils.ts b/frontend/packages/schema-model/src/lib/pointerUtils.ts index 169e9c207f7..1ed0f09252b 100644 --- a/frontend/packages/schema-model/src/lib/pointerUtils.ts +++ b/frontend/packages/schema-model/src/lib/pointerUtils.ts @@ -1,5 +1,6 @@ import type { UiSchemaNode } from '../types'; -import { Keyword, ObjectKind } from '../types'; +import { CombinationKind, Keyword, ObjectKind } from '../types'; + import { ROOT_POINTER } from './constants'; import type { FieldNode } from '../types/FieldNode'; import type { CombinationNode } from '../types/CombinationNode'; @@ -45,6 +46,23 @@ export const extractNameFromPointer = (pointer: string): string => { return parts.pop(); }; +export const extractCategoryFromPointer = ( + pointer: string, +): Keyword.Properties | Keyword.Definitions | CombinationKind | undefined => { + const parts = pointer.split('/'); + const category = parts[parts.length - 2]; + switch (category) { + case Keyword.Properties: + case Keyword.Definitions: + case CombinationKind.AllOf: + case CombinationKind.AnyOf: + case CombinationKind.OneOf: + return category; + default: + return undefined; + } +}; + export const changeNameInPointer = (pointer: string, newName: string): string => { const parts = pointer.split('/'); parts.pop(); diff --git a/frontend/packages/schema-model/test/uiSchemaMock.ts b/frontend/packages/schema-model/test/uiSchemaMock.ts index c54458f22e1..c713adcc445 100644 --- a/frontend/packages/schema-model/test/uiSchemaMock.ts +++ b/frontend/packages/schema-model/test/uiSchemaMock.ts @@ -45,6 +45,11 @@ const combinationNodeChild1Pointer = '#/properties/combinationNodeWithMultipleCh const combinationNodeChild2Pointer = '#/properties/combinationNodeWithMultipleChildren/anyOf/1'; const combinationNodeChild3Pointer = '#/properties/combinationNodeWithMultipleChildren/anyOf/2'; +const combinationDefNodePointer = '#/$defs/combinationDef'; +const combinationDefNodeChild1Pointer = '#/$defs/combinationDef/oneOf/0'; +const combinationDefNodeChild2Pointer = '#/$defs/combinationDef/oneOf/1'; +const referenceToCombinationDefNodePointer = '#/properties/referenceToCombinationDef'; + export const nodeMockBase: UiSchemaNode = { objectKind: ObjectKind.Field, fieldType: FieldType.String, @@ -77,6 +82,8 @@ export const rootNodeMock: FieldNode = { referenceDefinitionPointer, nodeWithSameNameAsStringNodePointer, combinationNodeWithMultipleChildrenPointer, + referenceToCombinationDefNodePointer, + combinationDefNodePointer, ], }; @@ -274,6 +281,30 @@ export const combinationNodeChild3Mock: FieldNode = { title: 'Child 3', }; +export const combinationDefNodeMock: CombinationNode = { + ...nodeMockBase, + schemaPointer: combinationDefNodePointer, + objectKind: ObjectKind.Combination, + combinationType: CombinationKind.OneOf, + children: [combinationDefNodeChild1Pointer, combinationDefNodeChild2Pointer], +}; + +export const combinationDefNodeChild1Mock: FieldNode = { + ...nodeMockBase, + schemaPointer: combinationDefNodeChild1Pointer, +}; + +export const combinationDefNodeChild2Mock: FieldNode = { + ...nodeMockBase, + schemaPointer: combinationDefNodeChild2Pointer, +}; + +export const referenceToCombinationDefNodeMock: ReferenceNode = { + ...defaultReferenceNode, + schemaPointer: referenceToCombinationDefNodePointer, + reference: combinationDefNodePointer, +}; + export const uiSchemaMock: UiSchemaNodes = [ rootNodeMock, parentNodeMock, @@ -305,4 +336,8 @@ export const uiSchemaMock: UiSchemaNodes = [ combinationNodeChild1Mock, combinationNodeChild2Mock, combinationNodeChild3Mock, + combinationDefNodeMock, + combinationDefNodeChild1Mock, + combinationDefNodeChild2Mock, + referenceToCombinationDefNodeMock, ]; From 9bdf6e2d79066a2a7e4bca366ef94d41e5abdf49 Mon Sep 17 00:00:00 2001 From: Konrad-Simso Date: Wed, 25 Sep 2024 17:40:52 +0200 Subject: [PATCH 6/8] fix: flaky playwright tests (#13600) --- .../ui-editor/ui-editor-data-model-binding-and-gitea.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/testing/playwright/tests/ui-editor/ui-editor-data-model-binding-and-gitea.spec.ts b/frontend/testing/playwright/tests/ui-editor/ui-editor-data-model-binding-and-gitea.spec.ts index cb92d550016..ba23b332d07 100644 --- a/frontend/testing/playwright/tests/ui-editor/ui-editor-data-model-binding-and-gitea.spec.ts +++ b/frontend/testing/playwright/tests/ui-editor/ui-editor-data-model-binding-and-gitea.spec.ts @@ -130,7 +130,7 @@ test('That is possible to select a different data model binding, and that the fi await header.clickOnNavigateToPageInTopMenuHeader('data_model'); - const newDataModel = 'testDataModel'; + const newDataModel = 'testDataModel2'; await dataModelPage.clickOnCreateNewDataModelButton(); await dataModelPage.typeDataModelName(newDataModel); await dataModelPage.clickOnCreateModelButton(); From b05a627a87e2b755f8b6864b75d79e49a399ab46 Mon Sep 17 00:00:00 2001 From: Tomas Engebretsen Date: Wed, 25 Sep 2024 23:41:30 +0200 Subject: [PATCH 7/8] build: Update Typescript (#13602) Co-authored-by: JamalAlabdullah <90609090+JamalAlabdullah@users.noreply.github.com> --- frontend/app-development/package.json | 2 +- frontend/app-preview/package.json | 2 +- .../components/OrgRepoList/OrgReposList.tsx | 2 +- frontend/dashboard/package.json | 2 +- frontend/libs/studio-components/package.json | 2 +- frontend/libs/studio-hooks/package.json | 2 +- frontend/libs/studio-icons/package.json | 2 +- .../libs/studio-pure-functions/package.json | 2 +- frontend/packages/policy-editor/package.json | 2 +- frontend/packages/process-editor/package.json | 2 +- frontend/packages/shared/package.json | 2 +- .../FetchChangesPopover.tsx | 6 ++- .../ShareChangesPopover.tsx | 2 +- frontend/packages/text-editor/package.json | 2 +- frontend/packages/ux-editor-v3/package.json | 2 +- frontend/packages/ux-editor/package.json | 2 +- frontend/resourceadm/package.json | 2 +- .../AboutResourcePage/AboutResourcePage.tsx | 2 +- frontend/scripts/package.json | 2 +- frontend/scripts/yarn.lock | 18 ++++---- package.json | 2 +- yarn.lock | 46 +++++++++---------- 22 files changed, 56 insertions(+), 52 deletions(-) diff --git a/frontend/app-development/package.json b/frontend/app-development/package.json index 5900f432e55..7679830d151 100644 --- a/frontend/app-development/package.json +++ b/frontend/app-development/package.json @@ -23,7 +23,7 @@ "devDependencies": { "cross-env": "7.0.3", "jest": "29.7.0", - "typescript": "5.5.4", + "typescript": "5.6.2", "webpack": "5.94.0", "webpack-dev-server": "5.1.0" }, diff --git a/frontend/app-preview/package.json b/frontend/app-preview/package.json index c559fdc5a33..2c5fcc6575e 100644 --- a/frontend/app-preview/package.json +++ b/frontend/app-preview/package.json @@ -16,7 +16,7 @@ "devDependencies": { "cross-env": "7.0.3", "jest": "29.7.0", - "typescript": "5.5.4", + "typescript": "5.6.2", "webpack": "5.94.0", "webpack-dev-server": "5.1.0" }, diff --git a/frontend/dashboard/components/OrgRepoList/OrgReposList.tsx b/frontend/dashboard/components/OrgRepoList/OrgReposList.tsx index bd8d5ee75ff..42d29864243 100644 --- a/frontend/dashboard/components/OrgRepoList/OrgReposList.tsx +++ b/frontend/dashboard/components/OrgRepoList/OrgReposList.tsx @@ -36,7 +36,7 @@ export const OrgReposList = ({ user, organizations }: OrgReposListProps) => { uid: uid as number, keyword: DATA_MODEL_REPO_IDENTIFIER, }); - const totalRows = repoResults?.totalCount - dataModelsResults?.totalCount ?? 0; + const totalRows = repoResults?.totalCount - dataModelsResults?.totalCount || 0; const { data: starredRepos = [], isPending: hasPendingStarredRepos } = useStarredReposQuery(); const reposIncludingStarredData = useAugmentReposWithStarred({ diff --git a/frontend/dashboard/package.json b/frontend/dashboard/package.json index 942cd32510a..1932c5b3a44 100644 --- a/frontend/dashboard/package.json +++ b/frontend/dashboard/package.json @@ -16,7 +16,7 @@ "devDependencies": { "cross-env": "7.0.3", "jest": "29.7.0", - "typescript": "5.5.4", + "typescript": "5.6.2", "webpack": "5.94.0", "webpack-dev-server": "5.1.0" }, diff --git a/frontend/libs/studio-components/package.json b/frontend/libs/studio-components/package.json index 9937c4bb88e..cf1042827be 100644 --- a/frontend/libs/studio-components/package.json +++ b/frontend/libs/studio-components/package.json @@ -36,6 +36,6 @@ "jest-environment-jsdom": "^29.7.0", "storybook": "^8.0.4", "ts-jest": "^29.1.1", - "typescript": "^5.2.2" + "typescript": "5.6.2" } } diff --git a/frontend/libs/studio-hooks/package.json b/frontend/libs/studio-hooks/package.json index dfc8f17009c..4897ca12d87 100644 --- a/frontend/libs/studio-hooks/package.json +++ b/frontend/libs/studio-hooks/package.json @@ -21,6 +21,6 @@ "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "ts-jest": "^29.1.1", - "typescript": "^5.2.2" + "typescript": "5.6.2" } } diff --git a/frontend/libs/studio-icons/package.json b/frontend/libs/studio-icons/package.json index fcca7f848c6..fec429fe867 100644 --- a/frontend/libs/studio-icons/package.json +++ b/frontend/libs/studio-icons/package.json @@ -18,6 +18,6 @@ "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "ts-jest": "^29.1.1", - "typescript": "^5.2.2" + "typescript": "5.6.2" } } diff --git a/frontend/libs/studio-pure-functions/package.json b/frontend/libs/studio-pure-functions/package.json index d388b4a30b3..c3c29e7f731 100644 --- a/frontend/libs/studio-pure-functions/package.json +++ b/frontend/libs/studio-pure-functions/package.json @@ -13,6 +13,6 @@ "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "ts-jest": "^29.1.1", - "typescript": "^5.2.2" + "typescript": "5.6.2" } } diff --git a/frontend/packages/policy-editor/package.json b/frontend/packages/policy-editor/package.json index a4be2932b9c..fd794877ec0 100644 --- a/frontend/packages/policy-editor/package.json +++ b/frontend/packages/policy-editor/package.json @@ -15,6 +15,6 @@ "peerDependencies": { "react": "18.3.1", "react-dom": "18.3.1", - "typescript": "5.5.4" + "typescript": "5.6.2" } } diff --git a/frontend/packages/process-editor/package.json b/frontend/packages/process-editor/package.json index 1020d5ea8b4..a5526ddd6d0 100644 --- a/frontend/packages/process-editor/package.json +++ b/frontend/packages/process-editor/package.json @@ -15,7 +15,7 @@ "peerDependencies": { "react": "18.3.1", "react-dom": "18.3.1", - "typescript": "5.5.4" + "typescript": "5.6.2" }, "dependencies": { "bpmn-js": "^13.2.2" diff --git a/frontend/packages/shared/package.json b/frontend/packages/shared/package.json index 7e89e3b4ae7..367dabe93d6 100644 --- a/frontend/packages/shared/package.json +++ b/frontend/packages/shared/package.json @@ -16,7 +16,7 @@ "devDependencies": { "@types/react": "18.3.5", "jest": "29.7.0", - "typescript": "5.5.4" + "typescript": "5.6.2" }, "license": "3-Clause BSD", "private": true, diff --git a/frontend/packages/shared/src/components/GiteaHeader/VersionControlButtons/components/FetchChangesPopover/FetchChangesPopover.tsx b/frontend/packages/shared/src/components/GiteaHeader/VersionControlButtons/components/FetchChangesPopover/FetchChangesPopover.tsx index c88253778d2..83b1018ad56 100644 --- a/frontend/packages/shared/src/components/GiteaHeader/VersionControlButtons/components/FetchChangesPopover/FetchChangesPopover.tsx +++ b/frontend/packages/shared/src/components/GiteaHeader/VersionControlButtons/components/FetchChangesPopover/FetchChangesPopover.tsx @@ -28,7 +28,11 @@ export const FetchChangesPopover = (): React.ReactElement => { const [popoverOpen, setPopoverOpen] = useState(false); - const displayNotification: boolean = (repoStatus?.behindBy > 0 ?? false) && !hasMergeConflict; + const displayNotification: boolean = + repoStatus?.behindBy !== undefined && + repoStatus?.behindBy !== null && + repoStatus.behindBy > 0 && + !hasMergeConflict; const handleClosePopover = () => setPopoverOpen(false); diff --git a/frontend/packages/shared/src/components/GiteaHeader/VersionControlButtons/components/ShareChangesPopover/ShareChangesPopover.tsx b/frontend/packages/shared/src/components/GiteaHeader/VersionControlButtons/components/ShareChangesPopover/ShareChangesPopover.tsx index f976e8f9743..9f0d86a1dd6 100644 --- a/frontend/packages/shared/src/components/GiteaHeader/VersionControlButtons/components/ShareChangesPopover/ShareChangesPopover.tsx +++ b/frontend/packages/shared/src/components/GiteaHeader/VersionControlButtons/components/ShareChangesPopover/ShareChangesPopover.tsx @@ -26,7 +26,7 @@ export const ShareChangesPopover = () => { const fetchCompleted: boolean = !isLoading && !hasChangesToPush; const displayNotification: boolean = - (repoStatus?.contentStatus?.length > 0 ?? false) && !hasMergeConflict; + repoStatus?.contentStatus && repoStatus?.contentStatus?.length > 0 && !hasMergeConflict; const fileChanges: RepoContentStatus[] = repoStatus?.contentStatus; diff --git a/frontend/packages/text-editor/package.json b/frontend/packages/text-editor/package.json index 5f368cad681..aba0eaff523 100644 --- a/frontend/packages/text-editor/package.json +++ b/frontend/packages/text-editor/package.json @@ -12,7 +12,7 @@ "peerDependencies": { "react": "18.3.1", "react-dom": "18.3.1", - "typescript": "5.5.4" + "typescript": "5.6.2" }, "scripts": { "test": "jest" diff --git a/frontend/packages/ux-editor-v3/package.json b/frontend/packages/ux-editor-v3/package.json index 0073c6c36a9..1ac8ce940c9 100644 --- a/frontend/packages/ux-editor-v3/package.json +++ b/frontend/packages/ux-editor-v3/package.json @@ -15,7 +15,7 @@ "react-modal": "3.16.1", "react-redux": "9.1.2", "redux": "5.0.1", - "typescript": "5.5.4", + "typescript": "5.6.2", "uuid": "10.0.0" }, "devDependencies": { diff --git a/frontend/packages/ux-editor/package.json b/frontend/packages/ux-editor/package.json index 681ce7e259c..1c4394723e3 100644 --- a/frontend/packages/ux-editor/package.json +++ b/frontend/packages/ux-editor/package.json @@ -12,7 +12,7 @@ "react-dnd-html5-backend": "16.0.1", "react-dom": "18.3.1", "react-modal": "3.16.1", - "typescript": "5.5.4", + "typescript": "5.6.2", "uuid": "10.0.0" }, "devDependencies": { diff --git a/frontend/resourceadm/package.json b/frontend/resourceadm/package.json index f83bf1f9fc3..d54f2acc1d8 100644 --- a/frontend/resourceadm/package.json +++ b/frontend/resourceadm/package.json @@ -18,7 +18,7 @@ "@svgr/webpack": "8.1.0", "cross-env": "7.0.3", "jest": "29.7.0", - "typescript": "5.5.4", + "typescript": "5.6.2", "webpack": "5.94.0", "webpack-dev-server": "5.1.0" }, diff --git a/frontend/resourceadm/pages/AboutResourcePage/AboutResourcePage.tsx b/frontend/resourceadm/pages/AboutResourcePage/AboutResourcePage.tsx index e55460f7031..b7e9b5338f7 100644 --- a/frontend/resourceadm/pages/AboutResourcePage/AboutResourcePage.tsx +++ b/frontend/resourceadm/pages/AboutResourcePage/AboutResourcePage.tsx @@ -301,7 +301,7 @@ export const AboutResourcePage = ({ id='accessListMode' label={t('resourceadm.about_resource_limited_by_rrr_label')} description={t('resourceadm.about_resource_limited_by_rrr_description')} - value={resourceData.accessListMode === 'Enabled' ?? false} + value={resourceData.accessListMode === 'Enabled'} onFocus={() => setTranslationType('none')} onChange={(isChecked: boolean) => handleSave({ ...resourceData, accessListMode: isChecked ? 'Enabled' : 'Disabled' }) diff --git a/frontend/scripts/package.json b/frontend/scripts/package.json index dc345c1ca6b..9b337b3ac23 100644 --- a/frontend/scripts/package.json +++ b/frontend/scripts/package.json @@ -15,7 +15,7 @@ "prettier": "^3.0.3", "ts-node": "^10.9.1", "tsconfig-paths": "^4.2.0", - "typescript": "5.5.4" + "typescript": "5.6.2" }, "packageManager": "yarn@4.5.0", "private": true, diff --git a/frontend/scripts/yarn.lock b/frontend/scripts/yarn.lock index a54251b7c8b..aa6a3df3727 100644 --- a/frontend/scripts/yarn.lock +++ b/frontend/scripts/yarn.lock @@ -380,7 +380,7 @@ __metadata: prettier: "npm:^3.0.3" ts-node: "npm:^10.9.1" tsconfig-paths: "npm:^4.2.0" - typescript: "npm:5.5.4" + typescript: "npm:5.6.2" languageName: unknown linkType: soft @@ -3268,23 +3268,23 @@ __metadata: languageName: node linkType: hard -"typescript@npm:5.5.4": - version: 5.5.4 - resolution: "typescript@npm:5.5.4" +"typescript@npm:5.6.2": + version: 5.6.2 + resolution: "typescript@npm:5.6.2" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/1689ccafef894825481fc3d856b4834ba3cc185a9c2878f3c76a9a1ef81af04194849840f3c69e7961e2312771471bb3b460ca92561e1d87599b26c37d0ffb6f + checksum: 10/f95365d4898f357823e93d334ecda9fcade54f009b397c7d05b7621cd9e865981033cf89ccde0f3e3a7b73b1fdbae18e92bc77db237b43e912f053fef0f9a53b languageName: node linkType: hard -"typescript@patch:typescript@npm%3A5.5.4#optional!builtin": - version: 5.5.4 - resolution: "typescript@patch:typescript@npm%3A5.5.4#optional!builtin::version=5.5.4&hash=379a07" +"typescript@patch:typescript@npm%3A5.6.2#optional!builtin": + version: 5.6.2 + resolution: "typescript@patch:typescript@npm%3A5.6.2#optional!builtin::version=5.6.2&hash=8c6c40" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/746fdd0865c5ce4f15e494c57ede03a9e12ede59cfdb40da3a281807853fe63b00ef1c912d7222143499aa82f18b8b472baa1830df8804746d09b55f6cf5b1cc + checksum: 10/8bfc7ca0d9feca4c3fcbd6c70741abfcd714197d6448e68225ae71e462447d904d3bfba49759a8fbe4956d87f054e2d346833c8349c222daa594a2626d4e1be8 languageName: node linkType: hard diff --git a/package.json b/package.json index 565408ec5fc..96fd6372da4 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "source-map-loader": "5.0.0", "swc-loader": "0.2.6", "terser-webpack-plugin": "5.3.10", - "typescript": "5.5.4", + "typescript": "5.6.2", "typescript-plugin-css-modules": "5.1.0", "webpack": "5.94.0", "webpack-cli": "5.1.4", diff --git a/yarn.lock b/yarn.lock index 3e3e6d2555a..5ec11cd0334 100644 --- a/yarn.lock +++ b/yarn.lock @@ -64,7 +64,7 @@ __metadata: peerDependencies: react: 18.3.1 react-dom: 18.3.1 - typescript: 5.5.4 + typescript: 5.6.2 languageName: unknown linkType: soft @@ -77,7 +77,7 @@ __metadata: peerDependencies: react: 18.3.1 react-dom: 18.3.1 - typescript: 5.5.4 + typescript: 5.6.2 languageName: unknown linkType: soft @@ -112,7 +112,7 @@ __metadata: peerDependencies: react: 18.3.1 react-dom: 18.3.1 - typescript: 5.5.4 + typescript: 5.6.2 languageName: unknown linkType: soft @@ -133,7 +133,7 @@ __metadata: react-redux: "npm:9.1.2" redux: "npm:5.0.1" redux-mock-store: "npm:1.5.4" - typescript: "npm:5.5.4" + typescript: "npm:5.6.2" uuid: "npm:10.0.0" peerDependencies: webpack: 5.94.0 @@ -153,7 +153,7 @@ __metadata: react-dnd-html5-backend: "npm:16.0.1" react-dom: "npm:18.3.1" react-modal: "npm:3.16.1" - typescript: "npm:5.5.4" + typescript: "npm:5.6.2" uuid: "npm:10.0.0" peerDependencies: webpack: 5.94.0 @@ -5910,7 +5910,7 @@ __metadata: react-dom: "npm:^18.2.0" storybook: "npm:^8.0.4" ts-jest: "npm:^29.1.1" - typescript: "npm:^5.2.2" + typescript: "npm:5.6.2" uuid: "npm:10.0.0" languageName: unknown linkType: soft @@ -5929,7 +5929,7 @@ __metadata: react: "npm:^18.2.0" react-dom: "npm:^18.2.0" ts-jest: "npm:^29.1.1" - typescript: "npm:^5.2.2" + typescript: "npm:5.6.2" uuid: "npm:10.0.0" languageName: unknown linkType: soft @@ -5947,7 +5947,7 @@ __metadata: react: "npm:^18.2.0" react-dom: "npm:^18.2.0" ts-jest: "npm:^29.1.1" - typescript: "npm:^5.2.2" + typescript: "npm:5.6.2" languageName: unknown linkType: soft @@ -5960,7 +5960,7 @@ __metadata: jest: "npm:^29.7.0" jest-environment-jsdom: "npm:^29.7.0" ts-jest: "npm:^29.1.1" - typescript: "npm:^5.2.2" + typescript: "npm:5.6.2" languageName: unknown linkType: soft @@ -8078,7 +8078,7 @@ __metadata: source-map-loader: "npm:5.0.0" swc-loader: "npm:0.2.6" terser-webpack-plugin: "npm:5.3.10" - typescript: "npm:5.5.4" + typescript: "npm:5.6.2" typescript-plugin-css-modules: "npm:5.1.0" webpack: "npm:5.94.0" webpack-cli: "npm:5.1.4" @@ -8193,7 +8193,7 @@ __metadata: react-dom: "npm:18.3.1" react-i18next: "npm:15.0.1" react-router-dom: "npm:6.26.2" - typescript: "npm:5.5.4" + typescript: "npm:5.6.2" webpack: "npm:5.94.0" webpack-dev-server: "npm:5.1.0" languageName: unknown @@ -8208,7 +8208,7 @@ __metadata: react: "npm:18.3.1" react-dom: "npm:18.3.1" react-router-dom: "npm:6.26.2" - typescript: "npm:5.5.4" + typescript: "npm:5.6.2" webpack: "npm:5.94.0" webpack-dev-server: "npm:5.1.0" languageName: unknown @@ -8229,7 +8229,7 @@ __metadata: react-dnd-html5-backend: "npm:16.0.1" react-dom: "npm:18.3.1" react-router-dom: "npm:6.26.2" - typescript: "npm:5.5.4" + typescript: "npm:5.6.2" languageName: unknown linkType: soft @@ -10256,7 +10256,7 @@ __metadata: react: "npm:18.3.1" react-dom: "npm:18.3.1" react-router-dom: "npm:6.26.2" - typescript: "npm:5.5.4" + typescript: "npm:5.6.2" webpack: "npm:5.94.0" webpack-dev-server: "npm:5.1.0" languageName: unknown @@ -18415,7 +18415,7 @@ __metadata: react-dom: "npm:18.3.1" react-modal: "npm:3.16.1" react-router-dom: "npm:6.26.2" - typescript: "npm:5.5.4" + typescript: "npm:5.6.2" webpack: "npm:5.94.0" webpack-dev-server: "npm:5.1.0" languageName: unknown @@ -20422,23 +20422,23 @@ __metadata: languageName: node linkType: hard -"typescript@npm:5.5.4, typescript@npm:^5.2.2": - version: 5.5.4 - resolution: "typescript@npm:5.5.4" +"typescript@npm:5.6.2": + version: 5.6.2 + resolution: "typescript@npm:5.6.2" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/1689ccafef894825481fc3d856b4834ba3cc185a9c2878f3c76a9a1ef81af04194849840f3c69e7961e2312771471bb3b460ca92561e1d87599b26c37d0ffb6f + checksum: 10/f95365d4898f357823e93d334ecda9fcade54f009b397c7d05b7621cd9e865981033cf89ccde0f3e3a7b73b1fdbae18e92bc77db237b43e912f053fef0f9a53b languageName: node linkType: hard -"typescript@patch:typescript@npm%3A5.5.4#optional!builtin, typescript@patch:typescript@npm%3A^5.2.2#optional!builtin": - version: 5.5.4 - resolution: "typescript@patch:typescript@npm%3A5.5.4#optional!builtin::version=5.5.4&hash=379a07" +"typescript@patch:typescript@npm%3A5.6.2#optional!builtin": + version: 5.6.2 + resolution: "typescript@patch:typescript@npm%3A5.6.2#optional!builtin::version=5.6.2&hash=8c6c40" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/746fdd0865c5ce4f15e494c57ede03a9e12ede59cfdb40da3a281807853fe63b00ef1c912d7222143499aa82f18b8b472baa1830df8804746d09b55f6cf5b1cc + checksum: 10/8bfc7ca0d9feca4c3fcbd6c70741abfcd714197d6448e68225ae71e462447d904d3bfba49759a8fbe4956d87f054e2d346833c8349c222daa594a2626d4e1be8 languageName: node linkType: hard From 49d1da71caff3b7b1271bcbba7a435ce4ce032b0 Mon Sep 17 00:00:00 2001 From: andreastanderen <71079896+standeren@users.noreply.github.com> Date: Wed, 25 Sep 2024 23:44:19 +0200 Subject: [PATCH 8/8] fix: correct css for studioTextfieldToggleView (#13630) --- .../StudioTextfieldToggleView.module.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/libs/studio-components/src/components/StudioToggleableTextfield/StudioTextfieldToggleView/StudioTextfieldToggleView.module.css b/frontend/libs/studio-components/src/components/StudioToggleableTextfield/StudioTextfieldToggleView/StudioTextfieldToggleView.module.css index 85a780d4e9f..d74c50041e5 100644 --- a/frontend/libs/studio-components/src/components/StudioToggleableTextfield/StudioTextfieldToggleView/StudioTextfieldToggleView.module.css +++ b/frontend/libs/studio-components/src/components/StudioToggleableTextfield/StudioTextfieldToggleView/StudioTextfieldToggleView.module.css @@ -13,8 +13,10 @@ align-items: center; color: var(--fds-semantic-text-neutral-default); width: 100%; + gap: var(--fds-spacing-1); } +.textContainer, .label, .ellipsis { overflow: hidden;