Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
140 commits
Select commit Hold shift + click to select a range
f6da894
chore(deps): upgrade dependencies to vue3 and freeze tiptap
max-nextcloud May 19, 2026
16a8720
chore(deps): replace new Vue with createApp
max-nextcloud May 19, 2026
cb31251
chore(upgrade): `<var>.sync` to `v-model:<var>`
max-nextcloud May 19, 2026
0cbcebe
chore(upgrade): fix imports
max-nextcloud May 19, 2026
67ce805
chore(upgrade): Vue.observable to reactive
max-nextcloud May 19, 2026
388b62b
chore(upgrade): from beforeDestroy() to beforeUnmount()
max-nextcloud May 19, 2026
3a686e1
chore(upgrade): key attribute in v-for component
max-nextcloud May 19, 2026
a6f9fac
chore(upgrade): use eslint@10 and @nextcloud/eslint@9
max-nextcloud May 22, 2026
a5c0a26
chore(lint): configure vitest globals
max-nextcloud May 23, 2026
74cbdb6
chore(lint): fix what prettier and eslint can agree upon
max-nextcloud May 23, 2026
0e518d1
chore(lint): let eslint sort the imports
max-nextcloud May 23, 2026
80aa2c0
chore(lint): remove outdated eslint disable lines
max-nextcloud May 23, 2026
d96fc8f
chore(lint): separate type imports
max-nextcloud May 24, 2026
25f668a
chore(lint): use ts extension for local imports
max-nextcloud May 24, 2026
999498d
chore(lint): drop prettier and autolint with eslint
max-nextcloud May 26, 2026
6d078cf
chore(lint): drop unused prop
max-nextcloud May 26, 2026
bc2baea
chore(lint): disable no-boolean-default for Viewer api
max-nextcloud May 27, 2026
e3d6461
chore(type): more event bus events
max-nextcloud May 29, 2026
89a93c2
chore(type): and split editor.js
max-nextcloud May 31, 2026
19c1459
chore(cleanup): do not emit even for parent
max-nextcloud May 31, 2026
facc659
chore(type): add global for `_oc_debug`
max-nextcloud May 31, 2026
b0a2d7f
chore(cleanup): change default for `EDITOR_UPLOAD` to false
max-nextcloud May 31, 2026
d720029
chore(lint): fix some errors
max-nextcloud May 31, 2026
9e2a51a
chore(lint): y-websocket
max-nextcloud Jun 1, 2026
11c96d6
chore(lint) src/services
max-nextcloud Jun 1, 2026
f5396e2
chore(lint) src/plugins
max-nextcloud Jun 1, 2026
62cc69f
chore(lint): src/nodes
max-nextcloud Jun 1, 2026
da87b16
chore(lint) src/marks and src/mixins
max-nextcloud Jun 1, 2026
7c04b6b
chore(lint) src/markdownit
max-nextcloud Jun 1, 2026
05868e7
chore(lint): src/helpers
max-nextcloud Jun 1, 2026
25f258e
chore(lint): src/extensions
max-nextcloud Jun 2, 2026
6ccac28
chore(rename) useTableOfContents -> hasTableOfContents
max-nextcloud Jun 2, 2026
979499f
chore(lint): src/composables
max-nextcloud Jun 2, 2026
6bf8999
chore(import): vitest in spec.ts files
max-nextcloud Jun 2, 2026
3f13031
chore(upgrade): use tsconfig from collectives plus ESNext
max-nextcloud Jun 2, 2026
ec7d39e
chore(upgrade): vue-tsc and fix errors
max-nextcloud Jun 2, 2026
6e932ce
chore(types): EditorReloader to explicitely type exports
max-nextcloud Jun 3, 2026
1656b0b
chore(lint): src/tests
max-nextcloud Jun 3, 2026
3653499
chore(lint): some of src/components
max-nextcloud Jun 3, 2026
1d022d4
chore(tests): drop mock for vue config
max-nextcloud Jun 3, 2026
34b3b1c
chore(tests): fix import
max-nextcloud Jun 3, 2026
54ec9d6
chore(tests): fix fixture syntax
max-nextcloud Jun 3, 2026
af47f4d
chore(lint)
max-nextcloud Jun 4, 2026
1e8b501
chore(lint): src/components/Suggestion
max-nextcloud Jun 4, 2026
8d9e943
chore(lint): src/components/Menu
max-nextcloud Jun 4, 2026
34ac2ae
chore(lint): src/components
max-nextcloud Jun 4, 2026
f9e1904
chore(type): fix vue-tsc
max-nextcloud Jun 4, 2026
7ac52a8
chore(lint): cypress and playwright
max-nextcloud Jun 4, 2026
b80dc60
chore(cleanup): and list emits in Editor.vue
max-nextcloud Jun 4, 2026
6198c49
chore(lint): add missing types and docs for parameters
max-nextcloud Jun 5, 2026
1a1e27d
chore(lint): use logger in src/apis
max-nextcloud Jun 5, 2026
07daeb0
chore(lint): use camel case `clickLink` event
max-nextcloud Jun 5, 2026
c4e7093
chore(lint): showMenuBar->hideMenuBar with default false
max-nextcloud Jun 5, 2026
38de0ae
chore(style): leave out true value for boolean props
max-nextcloud Jun 5, 2026
cb35ca7
chore(cleanup): drop Reader component
max-nextcloud Jun 8, 2026
07c3f6d
chore(rename): Status to SessionStatus
max-nextcloud Jun 8, 2026
67ba22c
chore(rename): Wrapper -> EditorWrapper
max-nextcloud Jun 8, 2026
b279bdc
chore(rename): Editor -> CollaborativeEditor
max-nextcloud Jun 8, 2026
83f4b4c
fix(vue3): use props instead of propsData for tiptap VueRenderer
max-nextcloud Jun 8, 2026
2bb5d54
chore(tests): test list conversion in minimal editor
max-nextcloud Jun 8, 2026
634f19d
chore(tests): use custom editor for Mathematics spec
max-nextcloud Jun 8, 2026
2a34980
chore(cleanup): use testEditor without Placeholder
max-nextcloud Jun 9, 2026
5b76896
chore(types): for Emoji and RichText
max-nextcloud Jun 10, 2026
966f657
chore(tests): create rich editor with testEditor
max-nextcloud Jun 10, 2026
6b5aa31
chore(tests): provide now lives in the `global` option
max-nextcloud Jun 10, 2026
0996051
chore(tests): render stub default slot
max-nextcloud Jun 10, 2026
4e19c7f
chore(test): update sync status spec snapshots
max-nextcloud Jun 10, 2026
0353e31
WIP: Image -> ts
max-nextcloud Jun 22, 2026
a494781
chore(type): markdown extension
max-nextcloud Jun 9, 2026
7ab14a9
fix(image): do not alter node.attrs in toMarkdown function
max-nextcloud Jun 25, 2026
893ed5e
chore(lint): default autofocus to false
max-nextcloud Jun 25, 2026
7067274
chore(js): some npm lint fixes
mejo- Jun 29, 2026
eff778b
chore(MediaHandler): migrate to new filepicker API
mejo- Jun 29, 2026
01f150e
fix(editor): fix mounting vue3 editor elements
mejo- Jun 29, 2026
a274691
fix(menu): call BaseActionEntry.setup() in child components
mejo- Jun 29, 2026
c792e4a
fix(viewer): make sure 'update:loaded' is emitted to viewer
mejo- Jun 29, 2026
dba84c1
fix(EditorReloader): ref not available in setup function yet
mejo- Jun 29, 2026
3e323ac
fix(ViewerView): make new wrapper element invisible to the layout
mejo- Jun 29, 2026
33df303
fix(LinkBubbleView): newHref bound via v-model must be a string
mejo- Jun 29, 2026
5827781
fix(menu): mark components referenced as object as raw
mejo- Jun 29, 2026
30374c6
fix(ViewerComponent): remove unused variable `fileVersion`
mejo- Jun 29, 2026
bd856ef
fix(menu): replace string ref with function ref to get array from v-for
mejo- Jun 29, 2026
ca30585
test(ListConversion): add HardBreak extension
mejo- Jun 29, 2026
51dbb95
fix(CollaborativeEditor): drop hack to make parent component emit
mejo- Jun 29, 2026
8bcab34
fix(AssistantAction): show assistant modal only if desired
mejo- Jun 29, 2026
0962e4e
fix(editor): convert ATTACHMENT_RESOLVER provide/inject to shallowRef()
mejo- Jun 29, 2026
a28f737
fix(vue): use defineAsyncComponent() instead of async static imports
mejo- Jun 29, 2026
f9257d9
fix(CollaborativeEditor): enable attachment upload per default
mejo- Jun 29, 2026
7774a9f
chore(eslint): some more minor linter fixes
mejo- Jun 29, 2026
5ec99ba
test(playwright): use shared CDP session in offline fixture
mejo- Jun 29, 2026
aba210b
fix(ViewerView): keep `beforeDestroy` as Viewer is still Vue 2
mejo- Jun 29, 2026
8ed46c0
fix(suggestions): fix suggestions component with Vue 3
mejo- Jun 29, 2026
6007846
fix(css): make new wrapper elements invisible to the layout
mejo- Jun 29, 2026
4ec9bbc
fix(table): enforce table-add-row button width
mejo- Jun 30, 2026
e3d4271
test(playwright): fix check whether we pass fileId or content
mejo- Jun 30, 2026
54fc818
fix(menu): bring back width toggle and character count
mejo- Jun 30, 2026
07c5737
fix(editor): mark editor component as raw at creation
mejo- Jun 30, 2026
0309e21
fix(DirectEditing): migrate to Vue 3 component event API
mejo- Jun 30, 2026
4004544
fix(DirectEditing): Forward #header slot from DirectEditing
mejo- Jun 30, 2026
3da77b4
fix(Table): fix sorting columns
mejo- Jun 30, 2026
30052dc
fix(SessionList): use `v-model:session` instead of `v-model`
mejo- Jun 30, 2026
48111f6
fix(listeners): Unregister events listeners in beforeUnmount
mejo- Jun 30, 2026
19897b9
chore(css): rename `*-enter` and `*-leave` transition classes to `*-f…
mejo- Jun 30, 2026
55560f1
chore(CollaborativeEditor): remove leftover event unsubscribes
mejo- Jun 30, 2026
5983966
chore: add missing REUSE headers
mejo- Jun 30, 2026
e01d142
fix(createTable): add missing `defineExposed` import
mejo- Jun 30, 2026
49f82c2
fix(api): await component import in createTable
mejo- Jun 30, 2026
b494857
fix(WidthToggle): listen on `update:modelValue`
mejo- Jun 30, 2026
a8eaf25
test(cypress): fix selector for link input field
mejo- Jun 30, 2026
6dba39e
test(cypress): strip trailing newlines in expectMarkdown()
mejo- Jun 30, 2026
6bcd09e
fix(CodeBlock): Fix defaultMode() computed
mejo- Jun 30, 2026
bee67da
chore(test): add code block test to playwright
max-nextcloud Jul 1, 2026
785f073
fix(CodeBlockView): return early if mermaid block without code
mejo- Jul 1, 2026
9a72bad
test(cypress): fix button selector in file picker dialog
mejo- Jul 1, 2026
ddaa20e
fix(CollaborativeEditor): pass conflict reader component as string
mejo- Jul 1, 2026
5e98e76
fix(ToolBarLogic): menuEntryRefs was moved to `data`
mejo- Jul 1, 2026
147dfe3
fix(PlainTableContentEditor): don't use `this.$parent.$emit()`
mejo- Jul 1, 2026
f2f5b87
fix(editor): mark editor component as raw at creation
mejo- Jul 1, 2026
5e161ba
fix(DirectEditing): don't use const for variable that gets altered
mejo- Jul 1, 2026
68beb8d
fix(ImageView): migrate from v-click-outside (vue2) to onClickOutside
mejo- Jul 1, 2026
45b5d03
chore(npm): remove obsolete dependencies vue-template-compiler and vu…
mejo- Jul 1, 2026
3e1c4a4
refactor(filePicker): use our filePicker builder in MediaHandler
mejo- Jul 1, 2026
405bef1
chore(ViewerComponent): don't emit obsolete `update:loaded` event
mejo- Jul 1, 2026
baebdbb
fix(ViewerView): set `inheritAttrs: false` for ViewerView
mejo- Jul 1, 2026
2c21500
fix(DirectEditing): save before closing the editor
mejo- Jul 1, 2026
63a4d0a
chore(lint): various linter fixes after rebasing
mejo- Jul 6, 2026
97eb3ef
chore: Editor.vue got renamed to CollaborativeEditor.vue
mejo- Jul 6, 2026
bbb10b1
chore(TableView): remove obsolete commented out css rule
mejo- Jul 6, 2026
e59e302
fix(createTable): fix return type of async function to be a Promise
mejo- Jul 6, 2026
c016beb
fix(FilesSettings): use event payload in `toggle`
mejo- Jul 6, 2026
cfbbaa2
chore(renovate): drop outdated version limitations
mejo- Jul 6, 2026
4f736bc
chore(deps): add minimum release age of 4 days for external deps
mejo- Jul 6, 2026
a10c329
chore(lint): run tsc before eslint
mejo- Jul 6, 2026
0f40450
chore(debug): drop redundant TextEditorEmbed.debugYjs()
mejo- Jul 6, 2026
78507ca
fix(Markdown): wrap fragment into doc node before serializing
mejo- Jul 6, 2026
e628a68
fix(useLinkFile): catch and handle exception of buildFilePicker
mejo- Jul 6, 2026
f7b7125
fix(DirectEditing): handle rejected/hanging save call in close function
mejo- Jul 6, 2026
06b10e9
chore(ToolBarLogic): no need to sort menuEntryRefs any longer
mejo- Jul 6, 2026
08cf157
fix(filePicker): catch exception when closing file picker
mejo- Jul 6, 2026
297a12b
fix(MenuBar): bring back `remainingEntries` ref used in ToolBarLogic.js
mejo- Jul 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 0 additions & 4 deletions .eslintignore

This file was deleted.

28 changes: 0 additions & 28 deletions .eslintrc.cjs

This file was deleted.

3 changes: 3 additions & 0 deletions .git-blame-ignore-revs
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,6 @@
810eb74a3f5502ef6485efdda7066c6848878bff
0d4ada6304f951cdf28b2d045f7fc56629807c11
eef5dde0838f4e80a420eec19442f9d73533e413

# drop prettier
020464633c2303a1c6b4a817c8a7e35b3c067341
2 changes: 2 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ updates:
day: saturday
time: "03:00"
timezone: Europe/Paris
cooldown:
default-days: 4
open-pull-requests-limit: 10
labels:
- 3. to review
Expand Down
101 changes: 0 additions & 101 deletions .github/workflows/lint-prettier.yml

This file was deleted.

2 changes: 1 addition & 1 deletion cypress.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

import vue from '@vitejs/plugin-vue2'
import vue from '@vitejs/plugin-vue'
import { defineConfig } from 'cypress'
import cypressSplit from 'cypress-split'
import vitePreprocessor from 'cypress-vite'
Expand Down
6 changes: 1 addition & 5 deletions cypress/e2e/Assistant.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,14 +51,11 @@ describe('Assistant', () => {
})
cy.get('.assistant-modal--content .submit-button').click()

// eslint-disable-next-line cypress/no-unnecessary-waiting
cy.wait(2000)

cy.get('.assistant-modal--content button').contains('Get notified').click()

cy.get('.assistant-modal--content button .bell-ring-outline-icon').should(
'be.visible',
)
cy.get('.assistant-modal--content button .bell-ring-outline-icon').should('be.visible')

cy.get('.assistant-modal--content .close-button').click()
cy.getActionEntry('assistant').click()
Expand All @@ -78,7 +75,6 @@ describe('Assistant', () => {
cy.getActionEntry('assistant').click()
cy.get('.action-button').contains('Translate').click()

// eslint-disable-next-line cypress/no-unnecessary-waiting
cy.wait(1000)

cy.get('.assistant-modal--content #input-input').type('Hello World', {
Expand Down
47 changes: 20 additions & 27 deletions cypress/e2e/Links.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@ import { randUser } from '../utils/index.js'
const user = randUser()
const fileName = 'empty.md'

describe('test link marks', function () {
before(function () {
describe('test link marks', function() {
before(function() {
cy.createUser(user)
})

beforeEach(function () {
beforeEach(function() {
cy.login(user)
cy.isolateTest({
sourceFile: fileName,
Expand All @@ -24,7 +24,7 @@ describe('test link marks', function () {
cy.openFile(fileName, { force: true })
})

describe('link bubble', function () {
describe('link bubble', function() {
/**
* Find link and click on it
*
Expand Down Expand Up @@ -134,14 +134,12 @@ describe('test link marks', function () {
cy.insertLine(`[text](${link})`)
cy.getContent().find(`a[href*="${link}"]`).should('not.exist')
clickLink('#')
cy.get('.link-view-bubble__title', { timeout: 10000 }).contains(
'other://protocol',
)
cy.get('.link-view-bubble__title', { timeout: 10000 }).contains('other://protocol')
cy.get('.link-view-bubble a').should('not.exist')
})
})

describe('autolink', function () {
describe('autolink', function() {
it('with protocol to files app and fileId', () => {
cy.getFile(fileName).then(($el) => {
const id = $el.data('cyFilesListRowFileid')
Expand All @@ -167,17 +165,17 @@ describe('test link marks', function () {
})
})

describe('link menu', function () {
describe('link menu', function() {
beforeEach(() => cy.clearContent())
const text = 'some text'

describe('link to website', function () {
describe('link to website', function() {
const url = 'https://example.org/'
// Helper to reduce duplicated code, checking inserting with and without selected text
const checkLinkWebsite = (url, text) => {
cy.getSubmenuEntry('insert-link', 'insert-link-website').click()
cy.getActionSubEntry('insert-link-input')
.find('input[type="text"]')
.click()
.type(`${url}{enter}`)
cy.getContent()
.find(`a[href*="${url}"]`)
Expand All @@ -187,27 +185,26 @@ describe('test link marks', function () {

beforeEach(cy.clearContent)
it('Link website without selection', () => {
cy.getFile(fileName).then(($el) => {
cy.getFile(fileName).then(() => {
checkLinkWebsite(url, url)
})
})

it('Link website with selection', () => {
cy.getFile(fileName).then(($el) => {
cy.getFile(fileName).then(() => {
cy.getContent().type(`${text}{selectAll}`)
checkLinkWebsite(url, text)
})
})
})

describe('link to local file', function () {
describe('link to local file', function() {
let fileId = null
// Helper to reduce duplicated code, checking inserting with and without selected text
const checkLinkFile = (filename, text, isFolder = false) => {
cy.getSubmenuEntry('insert-link', 'insert-link-file').click()
cy.get('.file-picker').within(() => {
cy.get(
`[data-testid="file-list-row"][data-filename="${filename}"]`,
).click()
cy.get(`[data-testid="file-list-row"][data-filename="${filename}"]`).click()
cy.get(isFolder ? '.empty-content__name' : '.file-picker__files')
cy.contains(
'button',
Expand All @@ -221,15 +218,13 @@ describe('test link marks', function () {
.should('have.text', text === undefined ? filename : text)
}

let fileId = null

beforeEach(() => cy.clearContent())

it('without text', () => {
cy.getFileId(fileName).then((id) => {
fileId = id
})
cy.getFile(fileName).then(($el) => {
cy.getFile(fileName).then(() => {
checkLinkFile(fileName)
cy.get('.modal-header__name').should('include.text', fileName)
})
Expand All @@ -238,19 +233,17 @@ describe('test link marks', function () {
cy.getFileId(fileName).then((id) => {
fileId = id
})
cy.getFile(fileName).then(($el) => {
cy.getFile(fileName).then(() => {
cy.getContent().type(`${text}{selectAll}`)
checkLinkFile(fileName, text)
cy.get('.modal-header__name').should('include.text', fileName)
})
})
it('link to directory', () => {
cy.createFolder(`${window.__currentDirectory}/dummy folder`).then(
(folderId) => {
fileId = folderId
},
)
cy.getFile(fileName).then(($el) => {
cy.createFolder(`${window.__currentDirectory}/dummy folder`).then((folderId) => {
fileId = folderId
})
cy.getFile(fileName).then(() => {
cy.getContent().type(`${text}{selectAll}`)
checkLinkFile('dummy folder', text, true)
})
Expand Down
Loading
Loading