diff --git a/frontend/.oxlintrc.json b/frontend/.oxlintrc.json index cc3149bfb..c4dff21e1 100644 --- a/frontend/.oxlintrc.json +++ b/frontend/.oxlintrc.json @@ -20,7 +20,8 @@ "jest/valid-expect": "error", "jest/expect-expect": ["error", { "assertFunctionNames": ["expect*", "screen.*", "test*"] - }] + }], + "nextjs/no-img-element": "off" }, "env": { "browser": true, diff --git a/frontend/global-styles/index.scss b/frontend/global-styles/index.scss index b61bd7742..7dbfa1b56 100644 --- a/frontend/global-styles/index.scss +++ b/frontend/global-styles/index.scss @@ -76,3 +76,9 @@ .overflow-y-hidden { overflow-y: hidden !important; } + +.unstyled-button { + appearance: none; + background: transparent; + border: none; +} diff --git a/frontend/src/app/(editor)/@appBar/n/[noteId]/editor-app-bar.spec.tsx b/frontend/src/app/(editor)/@appBar/n/[noteId]/editor-app-bar.spec.tsx index c1eaca5f3..fa38304af 100644 --- a/frontend/src/app/(editor)/@appBar/n/[noteId]/editor-app-bar.spec.tsx +++ b/frontend/src/app/(editor)/@appBar/n/[noteId]/editor-app-bar.spec.tsx @@ -38,7 +38,8 @@ const mockedCommonAppState = { canEdit: false } ] as NoteGroupPermissionEntryInterface[], - sharedToUsers: [] as NoteUserPermissionEntryInterface[] + sharedToUsers: [] as NoteUserPermissionEntryInterface[], + publiclyVisible: false } }, user: { diff --git a/frontend/src/components/common/copyable/copy-to-clipboard-button/__snapshots__/copy-to-clipboard-button.spec.tsx.snap b/frontend/src/components/common/copyable/copy-to-clipboard-button/__snapshots__/copy-to-clipboard-button.spec.tsx.snap index 12b168954..507d20499 100644 --- a/frontend/src/components/common/copyable/copy-to-clipboard-button/__snapshots__/copy-to-clipboard-button.spec.tsx.snap +++ b/frontend/src/components/common/copyable/copy-to-clipboard-button/__snapshots__/copy-to-clipboard-button.spec.tsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`Copy to clipboard button show an error text if clipboard api isn't available 1`] = ` +exports[`Copy to clipboard button show an error text if clipboard api isn't available: renders copy button 1`] = `
BootstrapIconMock_ArrowLeftRight @@ -62,7 +65,7 @@ exports[`Splitter resize can change size with mouse 1`] = `
`; -exports[`Splitter resize can change size with touch 1`] = ` +exports[`Splitter resize can change size with touch: touch initial 1`] = `
BootstrapIconMock_ArrowLeftRight @@ -124,7 +130,7 @@ exports[`Splitter resize can change size with touch 1`] = `
`; -exports[`Splitter resize can change size with touch 2`] = ` +exports[`Splitter resize can change size with touch: touch move to left 1`] = `
BootstrapIconMock_ArrowLeftRight @@ -186,7 +195,7 @@ exports[`Splitter resize can change size with touch 2`] = `
`; -exports[`Splitter resize can change size with touch 3`] = ` +exports[`Splitter resize can change size with touch: touch move to middle 1`] = `
BootstrapIconMock_ArrowLeftRight @@ -248,7 +260,7 @@ exports[`Splitter resize can change size with touch 3`] = `
`; -exports[`Splitter resize can change size with touch 4`] = ` +exports[`Splitter resize can change size with touch: touch move to right 1`] = `
BootstrapIconMock_ArrowLeftRight diff --git a/frontend/src/components/editor-page/splitter/split-divider/split-divider.tsx b/frontend/src/components/editor-page/splitter/split-divider/split-divider.tsx index 0389901b1..423ab8b25 100644 --- a/frontend/src/components/editor-page/splitter/split-divider/split-divider.tsx +++ b/frontend/src/components/editor-page/splitter/split-divider/split-divider.tsx @@ -66,7 +66,14 @@ export const SplitDivider: React.FC = ({ - + {/* oxlint-disable-next-line jsx_a11y/no-static-element-interactions */} +
+ ) } diff --git a/frontend/src/components/explore-page/pinned-notes/pinned-note-card.tsx b/frontend/src/components/explore-page/pinned-notes/pinned-note-card.tsx index d3858d65a..f11448734 100644 --- a/frontend/src/components/explore-page/pinned-notes/pinned-note-card.tsx +++ b/frontend/src/components/explore-page/pinned-notes/pinned-note-card.tsx @@ -33,7 +33,7 @@ export const PinnedNoteCard: React.FC = ({ title, las const lastChangedString = useMemo(() => formatChangedAt(lastChangedAt), [lastChangedAt]) const onClickUnpin = useCallback( - (event: MouseEvent) => { + (event: MouseEvent) => { event.preventDefault() unpinNote(primaryAlias).catch( showErrorNotificationBuilder('explore.pinnedNotes.unpinError', { name: primaryAlias }) @@ -46,10 +46,10 @@ export const PinnedNoteCard: React.FC = ({ title, las
-
+ diff --git a/frontend/src/components/global-dialogs/motd-modal/__snapshots__/motd-modal.spec.tsx.snap b/frontend/src/components/global-dialogs/motd-modal/__snapshots__/motd-modal.spec.tsx.snap index 02a70a695..66412768f 100644 --- a/frontend/src/components/global-dialogs/motd-modal/__snapshots__/motd-modal.spec.tsx.snap +++ b/frontend/src/components/global-dialogs/motd-modal/__snapshots__/motd-modal.spec.tsx.snap @@ -8,7 +8,16 @@ exports[`motd modal doesn't render a modal if no motd has been fetched 1`] = `
`; -exports[`motd modal renders a modal if a motd was fetched and can dismiss it 1`] = ` +exports[`motd modal renders a modal if a motd was fetched and can dismiss it: modal is dismissed 1`] = ` +
+ + This is a mock implementation of a Modal: + Modal is invisible + +
+`; + +exports[`motd modal renders a modal if a motd was fetched and can dismiss it: renders motd modal 1`] = `
This is a mock implementation of a Modal: @@ -38,12 +47,3 @@ exports[`motd modal renders a modal if a motd was fetched and can dismiss it 1`]
`; - -exports[`motd modal renders a modal if a motd was fetched and can dismiss it 2`] = ` -
- - This is a mock implementation of a Modal: - Modal is invisible - -
-`; diff --git a/frontend/src/components/global-dialogs/motd-modal/motd-modal.spec.tsx b/frontend/src/components/global-dialogs/motd-modal/motd-modal.spec.tsx index 16b798eac..061dc4e6f 100644 --- a/frontend/src/components/global-dialogs/motd-modal/motd-modal.spec.tsx +++ b/frontend/src/components/global-dialogs/motd-modal/motd-modal.spec.tsx @@ -58,13 +58,13 @@ describe('motd modal', () => { ) await screen.findByTestId('motd-renderer') - expect(view.container).toMatchSnapshot() + expect(view.container).toMatchSnapshot('renders motd modal') const button = await screen.findByTestId('motd-dismiss') await act(() => { button.click() }) - expect(view.container).toMatchSnapshot() + expect(view.container).toMatchSnapshot('modal is dismissed') }) it("doesn't render a modal if no motd has been fetched", async () => { diff --git a/frontend/src/components/global-dialogs/settings-dialog/utils/__snapshots__/on-off-button-group.spec.tsx.snap b/frontend/src/components/global-dialogs/settings-dialog/utils/__snapshots__/on-off-button-group.spec.tsx.snap index 1dcfd5494..a79cba61e 100644 --- a/frontend/src/components/global-dialogs/settings-dialog/utils/__snapshots__/on-off-button-group.spec.tsx.snap +++ b/frontend/src/components/global-dialogs/settings-dialog/utils/__snapshots__/on-off-button-group.spec.tsx.snap @@ -28,7 +28,7 @@ exports[`Settings On-Off Button Group accepts custom labels 1`] = `
`; -exports[`Settings On-Off Button Group can switch value 1`] = ` +exports[`Settings On-Off Button Group can switch value: defaults to off 1`] = `
`; -exports[`Settings On-Off Button Group can switch value 2`] = ` +exports[`Settings On-Off Button Group can switch value: is set to on 1`] = `
{ const onSelect = (newValue: boolean) => (value = newValue) const view = render() - expect(view.container).toMatchSnapshot() + expect(view.container).toMatchSnapshot('defaults to off') const onButton = await screen.findByTestId('onOffButtonGroupOn') await act(() => { onButton.click() @@ -23,7 +23,7 @@ describe('Settings On-Off Button Group', () => { expect(value).toBeTruthy() view.rerender() - expect(view.container).toMatchSnapshot() + expect(view.container).toMatchSnapshot('is set to on') const offButton = await screen.findByTestId('onOffButtonGroupOff') await act(() => { offButton.click() diff --git a/frontend/src/components/markdown-renderer/extensions/link-replacer/jump-anchor.tsx b/frontend/src/components/markdown-renderer/extensions/link-replacer/jump-anchor.tsx index ca4a84877..45271ef2c 100644 --- a/frontend/src/components/markdown-renderer/extensions/link-replacer/jump-anchor.tsx +++ b/frontend/src/components/markdown-renderer/extensions/link-replacer/jump-anchor.tsx @@ -34,7 +34,7 @@ export const JumpAnchor: React.FC = ({ jumpTargetId, children, ) return ( - + {children} ) diff --git a/frontend/src/components/markdown-renderer/replace-components/click-shield/click-shield.tsx b/frontend/src/components/markdown-renderer/replace-components/click-shield/click-shield.tsx index 1abd7110a..c31f02237 100644 --- a/frontend/src/components/markdown-renderer/replace-components/click-shield/click-shield.tsx +++ b/frontend/src/components/markdown-renderer/replace-components/click-shield/click-shield.tsx @@ -37,6 +37,7 @@ export interface ClickShieldProps extends PropsWithChildren = ({ @@ -130,7 +131,7 @@ export const ClickShield: React.FC = ({ return ( - + diff --git a/frontend/src/components/notifications/ui-notification-boundary.tsx b/frontend/src/components/notifications/ui-notification-boundary.tsx index dc459022a..af974cd2a 100644 --- a/frontend/src/components/notifications/ui-notification-boundary.tsx +++ b/frontend/src/components/notifications/ui-notification-boundary.tsx @@ -87,7 +87,7 @@ export const UiNotificationBoundary: React.FC = ({ children } (messageI18nKey: string, messageI18nOptions: Record = {}, showErrorMessage = false) => (error: Error): void => { log.error(t(messageI18nKey, messageI18nOptions), error) - dispatchUiNotification('common.errorOccurred', messageI18nKey, { + dispatchUiNotification('common.errorOccurred', messageI18nKey, { contentI18nOptions: showErrorMessage ? { ...messageI18nOptions, errorMessage: error.message } : messageI18nOptions, diff --git a/frontend/src/extensions/external-lib-app-extensions/abcjs/__snapshots__/abc-frame.spec.tsx.snap b/frontend/src/extensions/external-lib-app-extensions/abcjs/__snapshots__/abc-frame.spec.tsx.snap index 870a433df..fb4882966 100644 --- a/frontend/src/extensions/external-lib-app-extensions/abcjs/__snapshots__/abc-frame.spec.tsx.snap +++ b/frontend/src/extensions/external-lib-app-extensions/abcjs/__snapshots__/abc-frame.spec.tsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`AbcFrame renders a music sheet 1`] = ` +exports[`AbcFrame renders a music sheet: before rendering abcjs 1`] = `
`; -exports[`AbcFrame renders a music sheet 2`] = ` +exports[`AbcFrame renders a music sheet: with rendered abcjs 1`] = `
`; -exports[`AbcFrame renders an error if abcjs file can't be loaded 1`] = ` +exports[`AbcFrame renders an error if abcjs file can't be loaded: before rendering abcjs 1`] = `
`; -exports[`AbcFrame renders an error if abcjs file can't be loaded 2`] = ` +exports[`AbcFrame renders an error if abcjs file can't be loaded: with loading error message shown 1`] = `
`; -exports[`AbcFrame renders an error if abcjs render function crashes 1`] = ` +exports[`AbcFrame renders an error if abcjs render function crashes: before rendering abcjs 1`] = `
`; -exports[`AbcFrame renders an error if abcjs render function crashes 2`] = ` +exports[`AbcFrame renders an error if abcjs render function crashes: with rendering error message shown 1`] = `

This is a mock for ApplicationErrorAlert.

- Props: + Props: {} diff --git a/frontend/src/extensions/external-lib-app-extensions/abcjs/abc-frame.spec.tsx b/frontend/src/extensions/external-lib-app-extensions/abcjs/abc-frame.spec.tsx index b75601bd0..eebc2c2ce 100644 --- a/frontend/src/extensions/external-lib-app-extensions/abcjs/abc-frame.spec.tsx +++ b/frontend/src/extensions/external-lib-app-extensions/abcjs/abc-frame.spec.tsx @@ -36,9 +36,9 @@ describe('AbcFrame', () => { /> ) const view = render(element) - expect(view.container).toMatchSnapshot() + expect(view.container).toMatchSnapshot('before rendering abcjs') expect(await screen.findByText('Sheet Music for "Speed the Plough"')).toBeInTheDocument() - expect(view.container).toMatchSnapshot() + expect(view.container).toMatchSnapshot('with rendered abcjs') }) it("renders an error if abcjs file can't be loaded", async () => { @@ -53,9 +53,9 @@ describe('AbcFrame', () => { /> ) const view = render(element) - expect(view.container).toMatchSnapshot() + expect(view.container).toMatchSnapshot('before rendering abcjs') expect(await screen.findByText('common.errorWhileLoading')).toBeInTheDocument() - expect(view.container).toMatchSnapshot() + expect(view.container).toMatchSnapshot('with loading error message shown') }) it('renders an error if abcjs render function crashes', async () => { @@ -72,8 +72,8 @@ describe('AbcFrame', () => { /> ) const view = render(element) - expect(view.container).toMatchSnapshot() + expect(view.container).toMatchSnapshot('before rendering abcjs') expect(await screen.findByText('editor.embeddings.abcJs.errorWhileRendering')).toBeInTheDocument() - expect(view.container).toMatchSnapshot() + expect(view.container).toMatchSnapshot('with rendering error message shown') }) }) diff --git a/frontend/src/extensions/external-lib-app-extensions/gist/gist-frame.tsx b/frontend/src/extensions/external-lib-app-extensions/gist/gist-frame.tsx index 785db416a..53328384b 100644 --- a/frontend/src/extensions/external-lib-app-extensions/gist/gist-frame.tsx +++ b/frontend/src/extensions/external-lib-app-extensions/gist/gist-frame.tsx @@ -44,7 +44,14 @@ export const GistFrame: React.FC = ({ id }) => { src={`https://gist.github.com/${id}.pibb`} /> - + {/* oxlint-disable-next-line jsx_a11y/no-static-element-interactions */} + ) diff --git a/frontend/src/extensions/external-lib-app-extensions/vimeo/replace-vimeo-link.spec.ts b/frontend/src/extensions/external-lib-app-extensions/vimeo/replace-vimeo-link.spec.ts index e7b0adf25..4948aa3ac 100644 --- a/frontend/src/extensions/external-lib-app-extensions/vimeo/replace-vimeo-link.spec.ts +++ b/frontend/src/extensions/external-lib-app-extensions/vimeo/replace-vimeo-link.spec.ts @@ -6,7 +6,7 @@ import { replaceVimeoLinkMarkdownItPlugin } from './replace-vimeo-link' import MarkdownIt from 'markdown-it' -describe('Replace youtube link', () => { +describe('Replace vimeo link', () => { let markdownIt: MarkdownIt beforeEach(() => { @@ -22,7 +22,7 @@ describe('Replace youtube link', () => { ;['player.', ''].forEach((subdomain) => { ;['vimeo.com'].forEach((domain) => { const origin = `${protocol}${subdomain}${domain}/` - describe(origin, () => { + describe(`Replacer for ${origin}`, () => { const validUrl = `${origin}23237102` it(`can detect a correct vimeo video url`, () => { expect(markdownIt.renderInline(validUrl)).toBe("") diff --git a/frontend/src/extensions/external-lib-app-extensions/youtube/replace-youtube-link.spec.ts b/frontend/src/extensions/external-lib-app-extensions/youtube/replace-youtube-link.spec.ts index 13b741671..b641af5b1 100644 --- a/frontend/src/extensions/external-lib-app-extensions/youtube/replace-youtube-link.spec.ts +++ b/frontend/src/extensions/external-lib-app-extensions/youtube/replace-youtube-link.spec.ts @@ -22,7 +22,7 @@ describe('Replace youtube link', () => { ;['www.', ''].forEach((subdomain) => { ;['youtube.com', 'youtube-nocookie.com'].forEach((domain) => { const origin = `${protocol}${subdomain}${domain}/` - describe(origin, () => { + describe(`Replacer for ${origin}`, () => { const validUrl = `${origin}?v=12312312312` it(`can detect a correct youtube video url`, () => { expect(markdownIt.renderInline(validUrl)).toBe('') diff --git a/frontend/src/pages/api/private/me/media.ts b/frontend/src/pages/api/private/me/media.ts index fdfbcd4be..689bd995d 100644 --- a/frontend/src/pages/api/private/me/media.ts +++ b/frontend/src/pages/api/private/me/media.ts @@ -14,14 +14,14 @@ const handler = (req: NextApiRequest, res: NextApiResponse) => { createdAt: '2022-03-20T20:36:32Z', uuid: '5355ed83-7e12-4db0-95ed-837e124db08c', fileName: 'dummy.png', - noteId: 'features' + noteAlias: 'features' }, { username: 'tilman', createdAt: '2022-03-20T20:36:57+0000', uuid: '656745ab-fbf9-47f1-a745-abfbf9a7f10c', fileName: 'dummy2.png', - noteId: null + noteAlias: null } ]) } diff --git a/frontend/src/pages/api/private/media.ts b/frontend/src/pages/api/private/media.ts index 5065f9fd4..70b37d33a 100644 --- a/frontend/src/pages/api/private/media.ts +++ b/frontend/src/pages/api/private/media.ts @@ -22,7 +22,7 @@ const handler = async (req: NextApiRequest, res: NextApiResponse): Promise { uuid: 'e81f57cd-5866-4253-9f57-cd5866a253ca', fileName: 'avatar.png', - noteId: null, + noteAlias: null, username: 'test', createdAt: '2022-02-27T21:54:23.856Z' }, diff --git a/frontend/src/pages/api/private/notes/features/index.ts b/frontend/src/pages/api/private/notes/features/index.ts index abc925288..2af9e0aba 100644 --- a/frontend/src/pages/api/private/notes/features/index.ts +++ b/frontend/src/pages/api/private/notes/features/index.ts @@ -40,7 +40,8 @@ const handler = (req: NextApiRequest, res: NextApiResponse): void => { groupName: '_EVERYONE', canEdit: false } - ] + ], + publiclyVisible: true } }, editedByAtPosition: [] diff --git a/frontend/src/pages/api/private/notes/index.ts b/frontend/src/pages/api/private/notes/index.ts index 799d8d8dc..06d82555c 100644 --- a/frontend/src/pages/api/private/notes/index.ts +++ b/frontend/src/pages/api/private/notes/index.ts @@ -38,7 +38,8 @@ const handler = (req: NextApiRequest, res: NextApiResponse): void => { groupName: '_LOGGED_IN', canEdit: false } - ] + ], + publiclyVisible: true } }, editedByAtPosition: [] diff --git a/frontend/src/pages/api/private/notes/slide-example/index.ts b/frontend/src/pages/api/private/notes/slide-example/index.ts index 918ef13c3..3ed35c246 100644 --- a/frontend/src/pages/api/private/notes/slide-example/index.ts +++ b/frontend/src/pages/api/private/notes/slide-example/index.ts @@ -47,7 +47,8 @@ const handler = (req: NextApiRequest, res: NextApiResponse): void => { groupName: 'hedgedoc-devs', canEdit: true } - ] + ], + publiclyVisible: true } }, editedByAtPosition: [] diff --git a/frontend/src/redux/note-details/reducers/build-state-from-metadata-update.spec.ts b/frontend/src/redux/note-details/reducers/build-state-from-metadata-update.spec.ts index cce5f91c1..25a5e42ee 100644 --- a/frontend/src/redux/note-details/reducers/build-state-from-metadata-update.spec.ts +++ b/frontend/src/redux/note-details/reducers/build-state-from-metadata-update.spec.ts @@ -16,7 +16,8 @@ describe('build state from server permissions', () => { permissions: { owner: null, sharedToGroups: [], - sharedToUsers: [] + sharedToUsers: [], + publiclyVisible: false }, editedBy: [], primaryAlias: 'test-id', diff --git a/frontend/src/redux/note-details/reducers/build-state-from-server-permissions.spec.ts b/frontend/src/redux/note-details/reducers/build-state-from-server-permissions.spec.ts index fa0bca6b1..bdf89c375 100644 --- a/frontend/src/redux/note-details/reducers/build-state-from-server-permissions.spec.ts +++ b/frontend/src/redux/note-details/reducers/build-state-from-server-permissions.spec.ts @@ -24,7 +24,8 @@ describe('build state from server permissions', () => { groupName: 'test-group', canEdit: false } - ] + ], + publiclyVisible: false } expect(buildStateFromServerPermissions(state, permissions)).toStrictEqual({ ...state, permissions: permissions }) }) diff --git a/frontend/src/redux/note-details/reducers/build-state-from-set-note-data-from-server.spec.ts b/frontend/src/redux/note-details/reducers/build-state-from-set-note-data-from-server.spec.ts index d14a4e6dd..b79c1bfdb 100644 --- a/frontend/src/redux/note-details/reducers/build-state-from-set-note-data-from-server.spec.ts +++ b/frontend/src/redux/note-details/reducers/build-state-from-set-note-data-from-server.spec.ts @@ -50,7 +50,8 @@ describe('build state from set note data from server', () => { canEdit: true, username: 'shareusername' } - ] + ], + publiclyVisible: false }, tags: ['tag'], title: 'title', @@ -118,7 +119,8 @@ describe('build state from set note data from server', () => { canEdit: true, username: 'shareusername' } - ] + ], + publiclyVisible: false } }