diff --git a/cypress/e2e/conflict.spec.js b/cypress/e2e/conflict.spec.js index 6d93741b399..5e9f191030e 100644 --- a/cypress/e2e/conflict.spec.js +++ b/cypress/e2e/conflict.spec.js @@ -9,13 +9,13 @@ const variants = [ { fixture: 'lines.txt', mime: 'text/plain' }, { fixture: 'test.md', mime: 'text/markdown' }, ] +const getWrapper = () => cy.get('.text-editor__wrapper.has-conflicts') variants.forEach(function({ fixture, mime }) { const user = randUser() const fileName = fixture const prefix = mime.replaceAll('/', '-') describe(`${mime} (${fileName})`, function() { - const getWrapper = () => cy.get('.text-editor__wrapper.has-conflicts') before(() => { cy.createUser(user) @@ -117,6 +117,36 @@ variants.forEach(function({ fixture, mime }) { }) }) +describe('conflict dialog scroll behaviour', function() { + const user = randUser() + const fileName = 'long.md' + + before(() => { + cy.createUser(user) + }) + + it('document status and collision resolution dialog elements are sticky', function() { + cy.login(user) + cy.createTestFolder() + + createConflict(fileName, 'text/markdown') + + cy.openFile(fileName) + + cy.get('.text-editor .document-status') + .should('contain', 'The file was overwritten.') + getWrapper() + .find('.text-editor__main h2') + .contains('Third subheading') + .scrollIntoView() + + cy.get('.text-editor #resolve-conflicts') + .should('be.visible') + cy.get('.text-editor .document-status') + .should('be.visible') + }) +}) + /** * @param {string} fileName - filename * @param {string} mime - mimetype diff --git a/cypress/e2e/nodes/CodeBlock.spec.js b/cypress/e2e/nodes/CodeBlock.spec.js index 3016bdac9b6..d58375ee8b1 100644 --- a/cypress/e2e/nodes/CodeBlock.spec.js +++ b/cypress/e2e/nodes/CodeBlock.spec.js @@ -77,7 +77,7 @@ describe('Front matter support', function() { cy.getContent().find('code').eq(1).find('.hljs-keyword').eq(1).contains('function') // Mermaid diagram - cy.getEditor().find('.text-editor__wrapper').scrollTo('bottom') + cy.get('#viewer .modal-container__content').scrollTo('bottom') cy.getContent().find('.split-view__preview').eq(2).should('be.visible') cy.get('.code-block').eq(2).find('code').should('not.be.visible') cy.get('.split-view__preview').find('svg .erDiagramTitleText') diff --git a/cypress/fixtures/long.md b/cypress/fixtures/long.md new file mode 100644 index 00000000000..3dc1d35537f --- /dev/null +++ b/cypress/fixtures/long.md @@ -0,0 +1,21 @@ +# Hello world + +## First subheading + +Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu aenean sed diam urna tempor. Pulvinar vivamus fringilla lacus nec metus bibendum egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra inceptos himenaeos. + +Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu aenean sed diam urna tempor. Pulvinar vivamus fringilla lacus nec metus bibendum egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra inceptos himenaeos. + +Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu aenean sed diam urna tempor. Pulvinar vivamus fringilla lacus nec metus bibendum egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra inceptos himenaeos. + +## Second subheading + +Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu aenean sed diam urna tempor. Pulvinar vivamus fringilla lacus nec metus bibendum egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra inceptos himenaeos. + +Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu aenean sed diam urna tempor. Pulvinar vivamus fringilla lacus nec metus bibendum egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra inceptos himenaeos. + +Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu aenean sed diam urna tempor. Pulvinar vivamus fringilla lacus nec metus bibendum egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra inceptos himenaeos. + +## Third subheading + +Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu aenean sed diam urna tempor. Pulvinar vivamus fringilla lacus nec metus bibendum egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra inceptos himenaeos. diff --git a/src/components/CollisionResolveDialog.vue b/src/components/CollisionResolveDialog.vue index 6bc3312d31d..be77ae57570 100644 --- a/src/components/CollisionResolveDialog.vue +++ b/src/components/CollisionResolveDialog.vue @@ -70,7 +70,9 @@ export default { diff --git a/src/components/Editor/Wrapper.vue b/src/components/Editor/Wrapper.vue index d12e098781d..31b0c4dde73 100644 --- a/src/components/Editor/Wrapper.vue +++ b/src/components/Editor/Wrapper.vue @@ -48,7 +48,7 @@ export default { props: { isResolvingConflict: { type: Boolean, - require: true, + default: false, }, hasConnectionIssue: { type: Boolean, @@ -130,16 +130,14 @@ export default { diff --git a/src/components/Menu/MenuBar.vue b/src/components/Menu/MenuBar.vue index 816b41a80cb..bd4a8df6814 100644 --- a/src/components/Menu/MenuBar.vue +++ b/src/components/Menu/MenuBar.vue @@ -12,7 +12,8 @@ :class="{ 'text-menubar--ready': isReady, 'text-menubar--hide': isHidden, - 'text-menubar--is-workspace': $isRichWorkspace + 'text-menubar--is-workspace': $isRichWorkspace, + 'is-mobile': $isMobile, }"> @@ -227,13 +228,14 @@ export default { --background-blur: blur(10px); position: sticky; top: 0; + bottom: var(--default-grid-baseline); + width: 100%; z-index: 10021; // above modal-header so menubar is always on top background-color: var(--color-main-background-translucent); backdrop-filter: var(--background-blur); max-height: var(--default-clickable-area); // important for mobile so that the buttons are always inside the container border-bottom: 1px solid var(--color-border); - padding-top:3px; - padding-bottom: 3px; + padding-block: var(--default-grid-baseline); visibility: hidden; @@ -241,6 +243,11 @@ export default { justify-content: flex-end; align-items: center; + &.is-mobile { + border-top: 1px solid var(--color-border); + border-bottom: unset; + } + &.text-menubar--ready:not(.text-menubar--hide) { visibility: visible; animation-name: fadeInDown; diff --git a/src/components/Menu/ReadonlyBar.vue b/src/components/Menu/ReadonlyBar.vue index 5b6b250cd47..1445da071a5 100644 --- a/src/components/Menu/ReadonlyBar.vue +++ b/src/components/Menu/ReadonlyBar.vue @@ -55,9 +55,9 @@ export default defineComponent({