diff --git a/.drone.yml b/.drone.yml
index 8599f574b..72f4874ce 100644
--- a/.drone.yml
+++ b/.drone.yml
@@ -1,3 +1,4 @@
+---
kind: pipeline
name: build
@@ -12,29 +13,30 @@ trigger:
services:
- name: api
- image: vikunja/api
+ image: vikunja/api:unstable
environment:
VIKUNJA_SERVICE_TESTINGTOKEN: averyLongSecretToSe33dtheDB
VIKUNJA_LOG_LEVEL: DEBUG
steps:
- - name: restore-cache
- image: meltwater/drone-cache:dev
- pull: true
- environment:
- AWS_ACCESS_KEY_ID:
- from_secret: cache_aws_access_key_id
- AWS_SECRET_ACCESS_KEY:
- from_secret: cache_aws_secret_access_key
- settings:
- restore: true
- bucket: kolaente.dev-drone-dependency-cache
- endpoint: https://s3.fr-par.scw.cloud
- region: fr-par
- path_style: true
- cache_key: '{{ .Repo.Name }}_{{ checksum "yarn.lock" }}_{{ arch }}_{{ os }}'
- mount:
- - '.cache'
+# Disabled until we figure out why it is so slow
+# - name: restore-cache
+# image: meltwater/drone-cache:dev
+# pull: true
+# environment:
+# AWS_ACCESS_KEY_ID:
+# from_secret: cache_aws_access_key_id
+# AWS_SECRET_ACCESS_KEY:
+# from_secret: cache_aws_secret_access_key
+# settings:
+# restore: true
+# bucket: kolaente.dev-drone-dependency-cache
+# endpoint: https://s3.fr-par.scw.cloud
+# region: fr-par
+# path_style: true
+# cache_key: '{{ .Repo.Name }}_{{ checksum "yarn.lock" }}_{{ arch }}_{{ os }}'
+# mount:
+# - '.cache'
- name: dependencies
image: node:16
@@ -44,28 +46,28 @@ steps:
CYPRESS_CACHE_FOLDER: .cache/cypress/
commands:
- yarn --frozen-lockfile --network-timeout 100000
- depends_on:
- - restore-cache
+# depends_on:
+# - restore-cache
- - name: rebuild-cache
- image: meltwater/drone-cache:dev
- pull: true
- environment:
- AWS_ACCESS_KEY_ID:
- from_secret: cache_aws_access_key_id
- AWS_SECRET_ACCESS_KEY:
- from_secret: cache_aws_secret_access_key
- settings:
- rebuild: true
- bucket: kolaente.dev-drone-dependency-cache
- endpoint: https://s3.fr-par.scw.cloud
- region: fr-par
- path_style: true
- cache_key: '{{ .Repo.Name }}_{{ checksum "yarn.lock" }}_{{ arch }}_{{ os }}'
- mount:
- - '.cache'
- depends_on:
- - dependencies
+# - name: rebuild-cache
+# image: meltwater/drone-cache:dev
+# pull: true
+# environment:
+# AWS_ACCESS_KEY_ID:
+# from_secret: cache_aws_access_key_id
+# AWS_SECRET_ACCESS_KEY:
+# from_secret: cache_aws_secret_access_key
+# settings:
+# rebuild: true
+# bucket: kolaente.dev-drone-dependency-cache
+# endpoint: https://s3.fr-par.scw.cloud
+# region: fr-par
+# path_style: true
+# cache_key: '{{ .Repo.Name }}_{{ checksum "yarn.lock" }}_{{ arch }}_{{ os }}'
+# mount:
+# - '.cache'
+# depends_on:
+# - dependencies
- name: lint
image: node:16
@@ -78,25 +80,13 @@ steps:
depends_on:
- dependencies
- # Building in dev mode to avoid the service worker for testing
- - name: build-dev
- image: node:16
- pull: true
- environment:
- YARN_CACHE_FOLDER: .cache/yarn/
- CYPRESS_CACHE_FOLDER: .cache/cypress/
- commands:
- - yarn build:dev
- depends_on:
- - dependencies
-
- name: build-prod
image: node:16
pull: true
environment:
YARN_CACHE_FOLDER: .cache/yarn/
commands:
- - yarn build --dest dist-prod
+ - yarn build
depends_on:
- dependencies
@@ -118,15 +108,15 @@ steps:
CYPRESS_CACHE_FOLDER: .cache/cypress/
CYPRESS_DEFAULT_COMMAND_TIMEOUT: 60000
commands:
- - sed -i 's/localhost/api/g' dist-dev/index.html
- - yarn serve:dist-dev & npx wait-on http://localhost:5000
+ - sed -i 's/localhost/api/g' dist/index.html
+ - yarn serve:dist & npx wait-on http://localhost:5000
- yarn test:frontend --browser chrome
depends_on:
- dependencies
- - build-dev
+ - build-prod
- name: upload-test-results
- image: plugins/s3:1
+ image: plugins/s3
pull: true
settings:
bucket: drone-test-results
@@ -147,6 +137,26 @@ steps:
- failure
- success
+ - name: deploy-preview
+ image: node:16
+ pull: true
+ environment:
+ NETLIFY_AUTH_TOKEN:
+ from_secret: netlify_auth_token
+ NETLIFY_SITE_ID:
+ from_secret: netlify_site_id
+ GITEA_TOKEN:
+ from_secret: gitea_token
+ commands:
+ - shasum -a 384 -c ./scripts/deploy-preview-netlify.js.sha384
+ - node ./scripts/deploy-preview-netlify.js
+ depends_on:
+ - build-prod
+ when:
+ event:
+ include:
+ - pull_request
+
---
kind: pipeline
name: release-latest
@@ -166,23 +176,23 @@ steps:
commands:
- git fetch --tags
- - name: restore-cache
- image: meltwater/drone-cache:dev
- pull: true
- environment:
- AWS_ACCESS_KEY_ID:
- from_secret: cache_aws_access_key_id
- AWS_SECRET_ACCESS_KEY:
- from_secret: cache_aws_secret_access_key
- settings:
- restore: true
- bucket: kolaente.dev-drone-dependency-cache
- endpoint: https://s3.fr-par.scw.cloud
- region: fr-par
- path_style: true
- cache_key: '{{ .Repo.Name }}_{{ checksum "yarn.lock" }}_{{ arch }}_{{ os }}'
- mount:
- - '.cache'
+# - name: restore-cache
+# image: meltwater/drone-cache:dev
+# pull: true
+# environment:
+# AWS_ACCESS_KEY_ID:
+# from_secret: cache_aws_access_key_id
+# AWS_SECRET_ACCESS_KEY:
+# from_secret: cache_aws_secret_access_key
+# settings:
+# restore: true
+# bucket: kolaente.dev-drone-dependency-cache
+# endpoint: https://s3.fr-par.scw.cloud
+# region: fr-par
+# path_style: true
+# cache_key: '{{ .Repo.Name }}_{{ checksum "yarn.lock" }}_{{ arch }}_{{ os }}'
+# mount:
+# - '.cache'
- name: build
image: node:16
@@ -192,12 +202,13 @@ steps:
YARN_CACHE_FOLDER: .cache/yarn/
commands:
- yarn --frozen-lockfile --network-timeout 100000
+ - npx browserslist@latest --update-db
- yarn run lint
- "echo '{\"VERSION\": \"'$(git describe --tags --always --abbrev=10 | sed 's/-/+/' | sed 's/^v//' | sed 's/-g/-/')'\"}' > src/version.json"
- yarn run build
- sed -i 's/http\:\\/\\/localhost\\:3456\\/api\\/v1/\\/api\\/v1/g' dist/index.html # Override the default api url used for developing
- depends_on:
- - restore-cache
+# depends_on:
+# - restore-cache
- name: static
image: kolaente/zip
@@ -209,7 +220,7 @@ steps:
depends_on: [ build ]
- name: release
- image: plugins/s3:1
+ image: plugins/s3
pull: true
settings:
bucket: vikunja-releases
@@ -241,23 +252,23 @@ steps:
commands:
- git fetch --tags
- - name: restore-cache
- image: meltwater/drone-cache:dev
- pull: true
- environment:
- AWS_ACCESS_KEY_ID:
- from_secret: cache_aws_access_key_id
- AWS_SECRET_ACCESS_KEY:
- from_secret: cache_aws_secret_access_key
- settings:
- restore: true
- bucket: kolaente.dev-drone-dependency-cache
- endpoint: https://s3.fr-par.scw.cloud
- region: fr-par
- path_style: true
- cache_key: '{{ .Repo.Name }}_{{ checksum "yarn.lock" }}_{{ arch }}_{{ os }}'
- mount:
- - '.cache'
+# - name: restore-cache
+# image: meltwater/drone-cache:dev
+# pull: true
+# environment:
+# AWS_ACCESS_KEY_ID:
+# from_secret: cache_aws_access_key_id
+# AWS_SECRET_ACCESS_KEY:
+# from_secret: cache_aws_secret_access_key
+# settings:
+# restore: true
+# bucket: kolaente.dev-drone-dependency-cache
+# endpoint: https://s3.fr-par.scw.cloud
+# region: fr-par
+# path_style: true
+# cache_key: '{{ .Repo.Name }}_{{ checksum "yarn.lock" }}_{{ arch }}_{{ os }}'
+# mount:
+# - '.cache'
- name: build
image: node:16
@@ -271,8 +282,8 @@ steps:
- "echo '{\"VERSION\": \"'$(git describe --tags --always --abbrev=10 | sed 's/-/+/' | sed 's/^v//' | sed 's/-g/-/')'\"}' > src/version.json"
- yarn run build
- sed -i 's/http\:\\/\\/localhost\\:3456\\/api\\/v1/\\/api\\/v1/g' dist/index.html # Override the default api url used for developing
- depends_on:
- - restore-cache
+# depends_on:
+# - restore-cache
- name: static
image: kolaente/zip
@@ -284,7 +295,7 @@ steps:
depends_on: [ build ]
- name: release
- image: plugins/s3:1
+ image: plugins/s3
pull: true
settings:
bucket: vikunja-releases
@@ -339,6 +350,9 @@ trigger:
ref:
- refs/heads/main
- "refs/tags/**"
+ event:
+ exclude:
+ - cron
steps:
- name: docker-unstable
@@ -436,6 +450,9 @@ trigger:
ref:
- refs/heads/main
- "refs/tags/**"
+ event:
+ exclude:
+ - cron
steps:
- name: docker-unstable
@@ -482,6 +499,9 @@ trigger:
ref:
- refs/heads/main
- "refs/tags/**"
+ event:
+ exclude:
+ - cron
depends_on:
- docker-amd64-release
@@ -543,6 +563,9 @@ trigger:
ref:
- refs/heads/main
- "refs/tags/**"
+ event:
+ exclude:
+ - cron
depends_on:
- build
@@ -579,7 +602,9 @@ trigger:
branch:
- main
event:
- - push
+ - cron
+ cron:
+ - update_translations
steps:
- name: download
@@ -630,3 +655,8 @@ steps:
environment:
CROWDIN_KEY:
from_secret: crowdin_key
+---
+kind: signature
+hmac: 188ee90100c5fc5922a445e531e7a47453121edddb2a64a182eb23ed2bf602de
+
+...
diff --git a/.editorconfig b/.editorconfig
index 95bef4270..2c1d3b49f 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -19,4 +19,11 @@ indent_size = 2
[*.json]
indent_style = space
-indent_size = 2
\ No newline at end of file
+indent_size = 2
+
+[*.{scss,css}]
+indent_style = space
+indent_size = 2
+
+[.nvmrc]
+insert_final_newline = false
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 3ae9059a6..9ccc7d36b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -26,3 +26,6 @@ stats.html
# Test files
cypress/screenshots
cypress/videos
+
+# Local Netlify folder
+.netlify
diff --git a/.nvmrc b/.nvmrc
new file mode 100644
index 000000000..5edcff036
--- /dev/null
+++ b/.nvmrc
@@ -0,0 +1 @@
+v16
\ No newline at end of file
diff --git a/.vscode.example/extensions.json b/.vscode.example/extensions.json
new file mode 100644
index 000000000..6b2cee9f7
--- /dev/null
+++ b/.vscode.example/extensions.json
@@ -0,0 +1,12 @@
+{
+ "recommendations": [
+ "codezombiech.gitignore",
+ "dbaeumer.vscode-eslint",
+ "editorconfig.editorconfig",
+ "johnsoncodehk.volar",
+ "lokalise.i18n-ally",
+ "mgmcdermott.vscode-language-babel",
+ "mikestead.dotenv",
+ "Syler.sass-indented"
+ ]
+}
\ No newline at end of file
diff --git a/.vscode.example/settings.json b/.vscode.example/settings.json
new file mode 100644
index 000000000..110c8221a
--- /dev/null
+++ b/.vscode.example/settings.json
@@ -0,0 +1,30 @@
+{
+ "eslint.packageManager": "yarn",
+ "editor.formatOnSave": false,
+ "editor.codeActionsOnSave": {
+ "source.fixAll": true
+ },
+ "eslint.format.enable": true,
+ "[javascript]": {
+ "editor.defaultFormatter": "dbaeumer.vscode-eslint"
+ },
+ "[typescript]": {
+ "editor.defaultFormatter": "dbaeumer.vscode-eslint"
+ },
+
+ // https://eslint.vuejs.org/user-guide/#editor-integrations
+ "eslint.validate": [
+ "javascript",
+ "javascriptreact",
+ "vue"
+ ],
+ "vetur.validation.template": false,
+
+ // i18n ally
+ "i18n-ally.localesPaths": [
+ "src/i18n/lang"
+ ],
+ "i18n-ally.sortKeys": true,
+ "i18n-ally.keepFulfilled": true,
+ "i18n-ally.keystyle": "nested",
+}
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
index d73a4fe80..159930f6a 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -24,12 +24,6 @@ RUN \
# Stage 2: copy
FROM nginx
-RUN apt-get update && apt-get install -y apt-utils openssl && \
- mkdir -p /etc/nginx/ssl && \
- openssl genrsa -out /etc/nginx/ssl/dummy.key 2048 && \
- openssl req -new -key /etc/nginx/ssl/dummy.key -out /etc/nginx/ssl/dummy.csr -subj "/C=DE/L=Berlin/O=Vikunja/CN=Vikunja Snakeoil" && \
- openssl x509 -req -days 3650 -in /etc/nginx/ssl/dummy.csr -signkey /etc/nginx/ssl/dummy.key -out /etc/nginx/ssl/dummy.crt
-
COPY nginx.conf /etc/nginx/nginx.conf
COPY run.sh /run.sh
diff --git a/babel.config.js b/babel.config.js
deleted file mode 100644
index d39e57b42..000000000
--- a/babel.config.js
+++ /dev/null
@@ -1,5 +0,0 @@
-module.exports = {
- presets: [
- '@vue/app',
- ],
-}
diff --git a/cypress.json b/cypress.json
index 404249f38..27f12495c 100644
--- a/cypress.json
+++ b/cypress.json
@@ -2,7 +2,7 @@
"baseUrl": "http://localhost:5000",
"env": {
"API_URL": "http://localhost:3456/api/v1",
- "TEST_SECRET": "testingS3cr3et"
+ "TEST_SECRET": "averyLongSecretToSe33dtheDB"
},
"video": false,
"retries": {
diff --git a/cypress/README.md b/cypress/README.md
index 97c6469f1..6dd21922e 100644
--- a/cypress/README.md
+++ b/cypress/README.md
@@ -9,8 +9,8 @@
## Fixtures
-We're using the [test endpoint](https://vikunja.io/docs/config-options/#testingtoken) of the vikunja api to
-seed the database with test data before running the tests.
+We're using the [test endpoint](https://vikunja.io/docs/config-options/#testingtoken) of the vikunja api to
+seed the database with test data before running the tests.
This ensures better reproducability of tests.
## Running The Tests Locally
@@ -22,20 +22,20 @@ It uses the same configuration as the CI.
To use it, run
-```
+```shell
docker-compose up -d
```
Then, once all containers are started, run
-```
-docker-composer run cypress bash
+```shell
+docker-compose run cypress bash
```
to get a shell inside the cypress container.
In that shell you can then execute the tests with
-```
+```shell
yarn test:frontend
```
@@ -43,6 +43,6 @@ yarn test:frontend
To open the Cypress Dashboard and run tests from there, run
-```
+```shell
yarn cypress:open
```
diff --git a/cypress/docker-compose.yml b/cypress/docker-compose.yml
index 1c496de49..98a24edd3 100644
--- a/cypress/docker-compose.yml
+++ b/cypress/docker-compose.yml
@@ -2,10 +2,12 @@ version: '3'
services:
api:
- image: vikunja/api
+ image: vikunja/api:unstable
environment:
VIKUNJA_LOG_LEVEL: DEBUG
VIKUNJA_SERVICE_TESTINGTOKEN: averyLongSecretToSe33dtheDB
+ ports:
+ - 3456:3456
cypress:
image: cypress/browsers:node12.18.3-chrome87-ff82
volumes:
diff --git a/cypress/factories/user.js b/cypress/factories/user.js
index 37fcaaab4..9e133b552 100644
--- a/cypress/factories/user.js
+++ b/cypress/factories/user.js
@@ -11,7 +11,7 @@ export class UserFactory extends Factory {
return {
id: '{increment}',
- username: faker.lorem.word(10) + faker.random.uuid(),
+ username: faker.lorem.word(10) + faker.datatype.uuid(),
password: '$2a$14$dcadBoMBL9jQoOcZK8Fju.cy0Ptx2oZECkKLnaa8ekRoTFe1w7To.', // 1234
status: 0,
created: formatISO(now),
diff --git a/cypress/integration/list/list.spec.js b/cypress/integration/list/list.spec.js
index 8242984e6..864b533b3 100644
--- a/cypress/integration/list/list.spec.js
+++ b/cypress/integration/list/list.spec.js
@@ -38,8 +38,7 @@ describe('Lists', () => {
.contains('Create')
.click()
- cy.wait(1000) // Waiting until the request to create the new list is done
- cy.get('.global-notification')
+ cy.get('.global-notification', { timeout: 1000 }) // Waiting until the request to create the new list is done
.should('contain', 'Success')
cy.url()
.should('contain', '/lists/')
@@ -220,10 +219,10 @@ describe('Lists', () => {
cy.get('.table-view .filter-container .items .button')
.contains('Columns')
.click()
- cy.get('.table-view .filter-container .card .card-content .fancycheckbox .check')
+ cy.get('.table-view .filter-container .card.columns-filter .card-content .fancycheckbox .check')
.contains('Priority')
.click()
- cy.get('.table-view .filter-container .card .card-content .fancycheckbox .check')
+ cy.get('.table-view .filter-container .card.columns-filter .card-content .fancycheckbox .check')
.contains('Done')
.click()
@@ -446,7 +445,7 @@ describe('Lists', () => {
cy.get('.kanban .bucket .tasks .task')
.contains(tasks[0].title)
.first()
- .drag('.kanban .bucket:nth-child(2) .tasks .dropper div')
+ .drag('.kanban .bucket:nth-child(2) .tasks .dropper')
cy.get('.kanban .bucket:nth-child(2) .tasks')
.should('contain', tasks[0].title)
@@ -501,7 +500,7 @@ describe('Lists', () => {
.first()
.click()
- cy.get('.global-notification')
+ cy.get('.global-notification', { timeout: 1000 })
.should('contain', 'Success')
cy.go('back')
cy.get('.kanban .bucket')
diff --git a/cypress/integration/list/namespaces.spec.js b/cypress/integration/list/namespaces.spec.js
index e8c15443e..7d092113a 100644
--- a/cypress/integration/list/namespaces.spec.js
+++ b/cypress/integration/list/namespaces.spec.js
@@ -67,7 +67,7 @@ describe('Namepaces', () => {
.contains('Save')
.click()
- cy.get('.global-notification')
+ cy.get('.global-notification', { timeout: 1000 })
.should('contain', 'Success')
cy.get('.namespace-container .menu.namespaces-lists')
.should('contain', newNamespaceName)
diff --git a/cypress/integration/misc/menu.spec.js b/cypress/integration/misc/menu.spec.js
index 98e228f2f..86e3ab57f 100644
--- a/cypress/integration/misc/menu.spec.js
+++ b/cypress/integration/misc/menu.spec.js
@@ -7,7 +7,7 @@ describe('The Menu', () => {
})
it('Can be hidden on desktop', () => {
- cy.get('a.menu-show-button:visible')
+ cy.get('button.menu-show-button:visible')
.click()
cy.get('.namespace-container')
.should('not.have.class', 'is-active')
@@ -21,7 +21,7 @@ describe('The Menu', () => {
it('Is can be shown on mobile', () => {
cy.viewport('iphone-8')
- cy.get('a.menu-show-button:visible')
+ cy.get('button.menu-show-button:visible')
.click()
cy.get('.namespace-container')
.should('have.class', 'is-active')
diff --git a/cypress/integration/task/task.spec.js b/cypress/integration/task/task.spec.js
index 98664e183..68027e3d8 100644
--- a/cypress/integration/task/task.spec.js
+++ b/cypress/integration/task/task.spec.js
@@ -27,7 +27,7 @@ describe('Task', () => {
it('Should be created new', () => {
cy.visit('/lists/1/list')
- cy.get('input.input[placeholder="Add a new task…"')
+ cy.get('.input[placeholder="Add a new task…"')
.type('New Task')
cy.get('.button')
.contains('Add')
@@ -43,7 +43,7 @@ describe('Task', () => {
cy.visit('/lists/1/list')
cy.get('.list-is-empty-notice')
.should('not.exist')
- cy.get('input.input[placeholder="Add a new task…"')
+ cy.get('.input[placeholder="Add a new task…"')
.type('New Task')
cy.get('.button')
.contains('Add')
@@ -263,8 +263,7 @@ describe('Task', () => {
cy.visit(`/tasks/${tasks[0].id}`)
- cy.get('.task-view .action-buttons .button')
- .contains('Assign this task to a user')
+ cy.get('[data-cy="taskDetail.assign"]')
.click()
cy.get('.task-view .column.assignees .multiselect input')
.type(users[1].username)
@@ -353,7 +352,7 @@ describe('Task', () => {
.first()
.click()
- cy.get('.global-notification')
+ cy.get('.global-notification', { timeout: 4000 })
.should('contain', 'Success')
cy.get('.task-view .details.labels-list .multiselect .input-wrapper span.tag')
.should('exist')
diff --git a/cypress/integration/user/registration.spec.js b/cypress/integration/user/registration.spec.js
index 3e7cf1f54..fc1b0fbde 100644
--- a/cypress/integration/user/registration.spec.js
+++ b/cypress/integration/user/registration.spec.js
@@ -24,8 +24,8 @@ context('Registration', () => {
cy.visit('/register')
cy.get('#username').type(fixture.username)
cy.get('#email').type(fixture.email)
- cy.get('#password1').type(fixture.password)
- cy.get('#password2').type(fixture.password)
+ cy.get('#password').type(fixture.password)
+ cy.get('#passwordValidation').type(fixture.password)
cy.get('#register-submit').click()
cy.url().should('include', '/')
cy.clock(1625656161057) // 13:00
@@ -42,8 +42,8 @@ context('Registration', () => {
cy.visit('/register')
cy.get('#username').type(fixture.username)
cy.get('#email').type(fixture.email)
- cy.get('#password1').type(fixture.password)
- cy.get('#password2').type(fixture.password)
+ cy.get('#password').type(fixture.password)
+ cy.get('#passwordValidation').type(fixture.password)
cy.get('#register-submit').click()
cy.get('div.notification.is-danger').contains('A user with this username already exists.')
})
diff --git a/cypress/integration/user/settings.spec.js b/cypress/integration/user/settings.spec.js
index 36467bae7..29cb1ad03 100644
--- a/cypress/integration/user/settings.spec.js
+++ b/cypress/integration/user/settings.spec.js
@@ -8,11 +8,11 @@ describe('User Settings', () => {
})
it('Changes the user avatar', () => {
- cy.visit('/user/settings')
+ cy.visit('/user/settings/avatar')
cy.get('input[name=avatarProvider][value=upload]')
.click()
- cy.get('input[type=file]')
+ cy.get('input[type=file]', { timeout: 1000 })
.attachFile('image.jpg')
cy.get('.vue-handler-wrapper.vue-handler-wrapper--south .vue-simple-handler.vue-simple-handler--south')
.trigger('mousedown', {which: 1})
@@ -28,9 +28,10 @@ describe('User Settings', () => {
})
it('Updates the name', () => {
- cy.visit('/user/settings')
+ cy.visit('/user/settings/general')
- cy.get('input#newName')
+ cy.get('.general-settings .control input.input')
+ .first()
.type('Lorem Ipsum')
cy.get('.card.general-settings .button.is-primary')
.contains('Save')
diff --git a/cypress/support/factory.js b/cypress/support/factory.js
index 0c50bf8fc..934f2fae9 100644
--- a/cypress/support/factory.js
+++ b/cypress/support/factory.js
@@ -1,5 +1,4 @@
import {seed} from './seed'
-import merge from 'lodash/merge'
/**
* A factory makes it easy to seed the database with data.
@@ -25,7 +24,10 @@ export class Factory {
const data = []
for (let i = 1; i <= count; i++) {
- const entry = merge(this.factory(), override)
+ const entry = {
+ ...this.factory(),
+ ...override,
+ }
for (const e in entry) {
if(typeof entry[e] === 'function') {
entry[e] = entry[e](i)
diff --git a/cypress/support/index.js b/cypress/support/index.js
index 22ec961fa..0c885c654 100644
--- a/cypress/support/index.js
+++ b/cypress/support/index.js
@@ -2,3 +2,10 @@
import './commands'
import 'cypress-file-upload'
import '@4tw/cypress-drag-drop'
+
+// see https://github.com/cypress-io/cypress/issues/702#issuecomment-587127275
+Cypress.on('window:before:load', (win) => {
+ // disable service workers
+ // @ts-ignore
+ delete win.navigator.__proto__.ServiceWorker
+})
\ No newline at end of file
diff --git a/index.html b/index.html
index 016ea547d..c526fa6bd 100644
--- a/index.html
+++ b/index.html
@@ -12,7 +12,6 @@
-
@@ -31,7 +30,10 @@
// It has to be the full url, including the last /api/v1 part and port.
// You can change this if your api is not reachable on the same port as the frontend.
window.API_URL = 'http://localhost:3456/api/v1'
- //
+ // Enable error tracking with sentry. If this is set to true, will send anonymized data to
+ // our sentry instance to notify us of potential problems.
+ window.SENTRY_ENABLED = false
+ window.SENTRY_DSN = 'https://85694a2d757547cbbc90cd4b55c5a18d@o1047380.ingest.sentry.io/6024480'