Compare commits

...

21 Commits

Author SHA1 Message Date
d1025c3982
chore: group return parameter
Some checks failed
continuous-integration/drone/pr Build is failing
2023-04-26 18:40:32 +02:00
781cf66e81
chore: make fuzzy matching a paramater 2023-04-26 18:40:32 +02:00
a207e26a0e
fix: make type singular 2023-04-26 18:40:31 +02:00
5c8d1b7cfd
chore(i18n): clarify translation string 2023-04-26 18:40:31 +02:00
162c020ea4
chore: use startsWith for prefix matching 2023-04-26 18:40:31 +02:00
09c9e97b35
fix: clarify user search setting 2023-04-26 18:40:31 +02:00
2671a746b1
chore: remove user margin from the component 2023-04-26 18:40:31 +02:00
8b22dd07c9
chore: remove user margin from the component 2023-04-26 18:40:31 +02:00
e9b4e4e6bb
feat(quick add magic): allow fuzzy matching of assignees when the api results are unambigous 2023-04-26 18:40:31 +02:00
4b051a668e
fix: ensure all matched quick add magic parts are correctly removed from the task 2023-04-26 18:40:31 +02:00
28ba9edf8c
fix: lint 2023-04-26 18:40:31 +02:00
571bc5c61d
feat(assignees): show user avatar in search results 2023-04-26 18:40:31 +02:00
19e00299bb
feat: show initial list of users when opening the assignees view 2023-04-26 18:40:31 +02:00
25a8ae8f6c
chore: clarify users when can still be found even if they disabled it 2023-04-26 18:40:30 +02:00
fb85bd6216
fix(quick add magic): cleanup all assignee properties 2023-04-26 18:40:30 +02:00
9af98c82ea
fix(quick add magic): use the project user service to find assignees for quick add magic 2023-04-26 18:40:30 +02:00
f6266214c9
fix(quick add magic): don't replace the prefix in every occurrence when it is present in the matched part 2023-04-26 18:40:30 +02:00
5df4f39d95 chore(deps): update dependency vite to v4.3.3
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-04-26 15:04:55 +00:00
7ec5a70ccb chore(deps): update dependency sass to v1.62.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-04-26 10:05:07 +00:00
72fcab6e78 chore(deps): update dependency @types/node to v18.16.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-04-26 09:04:23 +00:00
292c90425e
fix: lint
All checks were successful
continuous-integration/drone/push Build is passing
2023-04-26 10:19:49 +02:00
11 changed files with 147 additions and 114 deletions

View File

@ -101,7 +101,7 @@
"@types/is-touch-device": "1.0.0",
"@types/lodash.debounce": "4.0.7",
"@types/marked": "4.0.8",
"@types/node": "18.16.0",
"@types/node": "18.16.1",
"@types/postcss-preset-env": "7.7.0",
"@types/sortablejs": "1.15.1",
"@typescript-eslint/eslint-plugin": "5.59.1",
@ -130,10 +130,10 @@
"postcss-preset-env": "8.3.2",
"rollup": "3.21.0",
"rollup-plugin-visualizer": "5.9.0",
"sass": "1.62.0",
"sass": "1.62.1",
"start-server-and-test": "2.0.0",
"typescript": "5.0.4",
"vite": "4.3.2",
"vite": "4.3.3",
"vite-plugin-inject-preload": "1.3.1",
"vite-plugin-pwa": "0.14.7",
"vite-svg-loader": "4.0.0",

View File

@ -148,7 +148,7 @@ devDependencies:
version: 0.16.1(histoire@0.16.1)
'@histoire/plugin-vue':
specifier: 0.16.1
version: 0.16.1(histoire@0.16.1)(vite@4.3.2)(vue@3.2.47)
version: 0.16.1(histoire@0.16.1)(vite@4.3.3)(vue@3.2.47)
'@rushstack/eslint-patch':
specifier: 1.2.0
version: 1.2.0
@ -171,8 +171,8 @@ devDependencies:
specifier: 4.0.8
version: 4.0.8
'@types/node':
specifier: 18.16.0
version: 18.16.0
specifier: 18.16.1
version: 18.16.1
'@types/postcss-preset-env':
specifier: 7.7.0
version: 7.7.0
@ -187,10 +187,10 @@ devDependencies:
version: 5.59.1(eslint@8.39.0)(typescript@5.0.4)
'@vitejs/plugin-legacy':
specifier: 4.0.3
version: 4.0.3(terser@5.10.0)(vite@4.3.2)
version: 4.0.3(terser@5.10.0)(vite@4.3.3)
'@vitejs/plugin-vue':
specifier: 4.2.0
version: 4.2.0(vite@4.3.2)(vue@3.2.47)
version: 4.2.0(vite@4.3.3)(vue@3.2.47)
'@vue/eslint-config-typescript':
specifier: 11.0.3
version: 11.0.3(eslint-plugin-vue@9.11.0)(eslint@8.39.0)(typescript@5.0.4)
@ -199,7 +199,7 @@ devDependencies:
version: 2.3.2(vue@3.2.47)
'@vue/tsconfig':
specifier: 0.1.3
version: 0.1.3(@types/node@18.16.0)
version: 0.1.3(@types/node@18.16.1)
autoprefixer:
specifier: 10.4.14
version: 10.4.14(postcss@8.4.23)
@ -232,10 +232,10 @@ devDependencies:
version: 9.9.2
histoire:
specifier: 0.16.1
version: 0.16.1(@types/node@18.16.0)(sass@1.62.0)(terser@5.10.0)(vite@4.3.2)
version: 0.16.1(@types/node@18.16.1)(sass@1.62.1)(terser@5.10.0)(vite@4.3.3)
netlify-cli:
specifier: 14.2.1
version: 14.2.1(@types/node@18.16.0)
version: 14.2.1(@types/node@18.16.1)
postcss:
specifier: 8.4.23
version: 8.4.23
@ -258,8 +258,8 @@ devDependencies:
specifier: 5.9.0
version: 5.9.0(rollup@3.21.0)
sass:
specifier: 1.62.0
version: 1.62.0
specifier: 1.62.1
version: 1.62.1
start-server-and-test:
specifier: 2.0.0
version: 2.0.0
@ -267,20 +267,20 @@ devDependencies:
specifier: 5.0.4
version: 5.0.4
vite:
specifier: 4.3.2
version: 4.3.2(@types/node@18.16.0)(sass@1.62.0)(terser@5.10.0)
specifier: 4.3.3
version: 4.3.3(@types/node@18.16.1)(sass@1.62.1)(terser@5.10.0)
vite-plugin-inject-preload:
specifier: 1.3.1
version: 1.3.1(vite@4.3.2)
version: 1.3.1(vite@4.3.3)
vite-plugin-pwa:
specifier: 0.14.7
version: 0.14.7(vite@4.3.2)(workbox-build@6.5.4)(workbox-window@6.5.4)
version: 0.14.7(vite@4.3.3)(workbox-build@6.5.4)(workbox-window@6.5.4)
vite-svg-loader:
specifier: 4.0.0
version: 4.0.0
vitest:
specifier: 0.30.1
version: 0.30.1(happy-dom@9.9.2)(sass@1.62.0)(terser@5.10.0)
version: 0.30.1(happy-dom@9.9.2)(sass@1.62.1)(terser@5.10.0)
vue-tsc:
specifier: 1.4.4
version: 1.4.4(typescript@5.0.4)
@ -2378,11 +2378,11 @@ packages:
'@hapi/hoek': 9.2.1
dev: true
/@histoire/app@0.16.1(vite@4.3.2):
/@histoire/app@0.16.1(vite@4.3.3):
resolution: {integrity: sha512-13komnhVk1Pk0wMmkJKDPWT8RKpA5HfAbeeXSHAq29pvFP9Faq+dAa62g1wqOpoyJD5C7SkI0OPI3eJwJHgTiQ==}
dependencies:
'@histoire/controls': 0.16.1(vite@4.3.2)
'@histoire/shared': 0.16.1(vite@4.3.2)
'@histoire/controls': 0.16.1(vite@4.3.3)
'@histoire/shared': 0.16.1(vite@4.3.3)
'@histoire/vendors': 0.16.0
'@types/flexsearch': 0.7.3
flexsearch: 0.7.21
@ -2391,7 +2391,7 @@ packages:
- vite
dev: true
/@histoire/controls@0.16.1(vite@4.3.2):
/@histoire/controls@0.16.1(vite@4.3.3):
resolution: {integrity: sha512-Ot/J/LPzUexn+fLrJrWu3jUakx9aVSJWKnriiJSmEodAxJq+4mrprX3xS0bnzieud19pJc3mzC/MSD94urTbHA==}
dependencies:
'@codemirror/commands': 6.1.3
@ -2401,7 +2401,7 @@ packages:
'@codemirror/state': 6.2.0
'@codemirror/theme-one-dark': 6.1.0
'@codemirror/view': 6.7.2
'@histoire/shared': 0.16.1(vite@4.3.2)
'@histoire/shared': 0.16.1(vite@4.3.3)
'@histoire/vendors': 0.16.0
transitivePeerDependencies:
- vite
@ -2415,7 +2415,7 @@ packages:
capture-website: 2.4.1
defu: 6.1.1
fs-extra: 10.1.0
histoire: 0.16.1(@types/node@18.16.0)(sass@1.62.0)(terser@5.10.0)(vite@4.3.2)
histoire: 0.16.1(@types/node@18.16.1)(sass@1.62.1)(terser@5.10.0)(vite@4.3.3)
pathe: 0.2.0
transitivePeerDependencies:
- bufferutil
@ -2424,18 +2424,18 @@ packages:
- utf-8-validate
dev: true
/@histoire/plugin-vue@0.16.1(histoire@0.16.1)(vite@4.3.2)(vue@3.2.47):
/@histoire/plugin-vue@0.16.1(histoire@0.16.1)(vite@4.3.3)(vue@3.2.47):
resolution: {integrity: sha512-K7ZZl5tA8PWHjQsWFmFX3xa4HlRs+S8+nxym1Smh4dudQ6XSVwdF+gsPQ+RE4zwf6YQ8HDPsvOobI31dz6F4Tg==}
peerDependencies:
histoire: ^0.16.1
vue: ^3.2.47
dependencies:
'@histoire/controls': 0.16.1(vite@4.3.2)
'@histoire/shared': 0.16.1(vite@4.3.2)
'@histoire/controls': 0.16.1(vite@4.3.3)
'@histoire/shared': 0.16.1(vite@4.3.3)
'@histoire/vendors': 0.16.0
change-case: 4.1.2
globby: 13.1.2
histoire: 0.16.1(@types/node@18.16.0)(sass@1.62.0)(terser@5.10.0)(vite@4.3.2)
histoire: 0.16.1(@types/node@18.16.1)(sass@1.62.1)(terser@5.10.0)(vite@4.3.3)
launch-editor: 2.6.0
pathe: 0.2.0
vue: 3.2.47
@ -2443,7 +2443,7 @@ packages:
- vite
dev: true
/@histoire/shared@0.16.1(vite@4.3.2):
/@histoire/shared@0.16.1(vite@4.3.3):
resolution: {integrity: sha512-bcySHGC6kcZ1U9OZUcBQCROTBygTZ9T9MlqfeGtBtJWXGdmHPZ/64elZOY36O8gUAMF89Q08EIVe5cIQ0SJ3Uw==}
peerDependencies:
vite: ^2.9.0 || ^3.0.0 || ^4.0.0
@ -2454,7 +2454,7 @@ packages:
chokidar: 3.5.3
pathe: 0.2.0
picocolors: 1.0.0
vite: 4.3.2(@types/node@18.16.0)(sass@1.62.0)(terser@5.10.0)
vite: 4.3.3(@types/node@18.16.1)(sass@1.62.1)(terser@5.10.0)
dev: true
/@histoire/vendors@0.16.0:
@ -2617,7 +2617,7 @@ packages:
dependencies:
'@types/istanbul-lib-coverage': 2.0.4
'@types/istanbul-reports': 3.0.1
'@types/node': 18.16.0
'@types/node': 18.16.1
'@types/yargs': 16.0.4
chalk: 4.1.2
dev: true
@ -2742,7 +2742,7 @@ packages:
yargs: 17.6.0
dev: true
/@netlify/build@29.9.2(@types/node@18.16.0):
/@netlify/build@29.9.2(@types/node@18.16.1):
resolution: {integrity: sha512-wNMOF/XUJuCDkeeTK+baX3OfNCqbTHANA0cGwSM/5k6N/HQCZ49y52z8ryC+SsQukoKufxyzl92OTtFmEe3aTA==}
engines: {node: ^14.16.0 || >=16.0.0}
hasBin: true
@ -2796,7 +2796,7 @@ packages:
supports-color: 9.2.1
terminal-link: 3.0.0
tmp-promise: 3.0.3
ts-node: 10.8.1(@types/node@18.16.0)(typescript@5.0.4)
ts-node: 10.8.1(@types/node@18.16.1)(typescript@5.0.4)
typescript: 5.0.4
uuid: 8.3.2
yargs: 17.6.0
@ -3796,7 +3796,7 @@ packages:
/@types/decompress@4.2.4:
resolution: {integrity: sha512-/C8kTMRTNiNuWGl5nEyKbPiMv6HA+0RbEXzFhFBEzASM6+oa4tJro9b8nj7eRlOFfuLdzUU+DS/GPDlvvzMOhA==}
dependencies:
'@types/node': 18.16.0
'@types/node': 18.16.1
dev: true
/@types/dompurify@3.0.2:
@ -3810,7 +3810,7 @@ packages:
dependencies:
'@types/decompress': 4.2.4
'@types/got': 8.3.6
'@types/node': 18.16.0
'@types/node': 18.16.1
dev: true
/@types/estree@0.0.39:
@ -3841,20 +3841,20 @@ packages:
/@types/fs-extra@9.0.13:
resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==}
dependencies:
'@types/node': 18.16.0
'@types/node': 18.16.1
dev: true
/@types/glob@7.2.0:
resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==}
dependencies:
'@types/minimatch': 3.0.5
'@types/node': 18.16.0
'@types/node': 18.16.1
dev: true
/@types/got@8.3.6:
resolution: {integrity: sha512-nvLlj+831dhdm4LR2Ly+HTpdLyBaMynoOr6wpIxS19d/bPeHQxFU5XQ6Gp6ohBpxvCWZM1uHQIC2+ySRH1rGrQ==}
dependencies:
'@types/node': 18.16.0
'@types/node': 18.16.1
dev: true
/@types/har-format@1.2.10:
@ -3868,7 +3868,7 @@ packages:
/@types/http-proxy@1.17.8:
resolution: {integrity: sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==}
dependencies:
'@types/node': 18.16.0
'@types/node': 18.16.1
dev: true
/@types/is-touch-device@1.0.0:
@ -3898,7 +3898,7 @@ packages:
/@types/keyv@3.1.3:
resolution: {integrity: sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==}
dependencies:
'@types/node': 18.16.0
'@types/node': 18.16.1
dev: true
/@types/linkify-it@3.0.2:
@ -3940,7 +3940,7 @@ packages:
/@types/node-fetch@2.5.12:
resolution: {integrity: sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw==}
dependencies:
'@types/node': 18.16.0
'@types/node': 18.16.1
form-data: 3.0.1
dev: true
@ -3948,8 +3948,8 @@ packages:
resolution: {integrity: sha512-zCoCEMA+IPpsRkyCFBqew5vGb7r8RSiB3uwdu/map7uwLAfu1MTazW26/pUDWoNnF88vJz4W3U56i5gtXNqxGg==}
dev: true
/@types/node@18.16.0:
resolution: {integrity: sha512-BsAaKhB+7X+H4GnSjGhJG9Qi8Tw+inU9nJDwmD5CgOmBLEI6ArdhikpLX7DjbjDRDTbqZzU2LSQNZg8WGPiSZQ==}
/@types/node@18.16.1:
resolution: {integrity: sha512-DZxSZWXxFfOlx7k7Rv4LAyiMroaxa3Ly/7OOzZO8cBNho0YzAi4qlbrx8W27JGqG57IgR/6J7r+nOJWw6kcvZA==}
dev: true
/@types/normalize-package-data@2.4.1:
@ -3966,13 +3966,13 @@ packages:
/@types/resolve@1.17.1:
resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==}
dependencies:
'@types/node': 18.16.0
'@types/node': 18.16.1
dev: true
/@types/responselike@1.0.0:
resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==}
dependencies:
'@types/node': 18.16.0
'@types/node': 18.16.1
dev: true
/@types/retry@0.12.1:
@ -4022,7 +4022,7 @@ packages:
resolution: {integrity: sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==}
requiresBuild: true
dependencies:
'@types/node': 18.16.0
'@types/node': 18.16.1
dev: true
optional: true
@ -4176,7 +4176,7 @@ packages:
- supports-color
dev: true
/@vitejs/plugin-legacy@4.0.3(terser@5.10.0)(vite@4.3.2):
/@vitejs/plugin-legacy@4.0.3(terser@5.10.0)(vite@4.3.3):
resolution: {integrity: sha512-RqDQOSEmFSNL42vITkNp8HE8Ak1yjGgaav4B6BGcZ8/URK0wikzwSyhNRirHDkp+snflEEk7iPZXTXUYA9exbg==}
engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies:
@ -4191,19 +4191,19 @@ packages:
regenerator-runtime: 0.13.11
systemjs: 6.14.0
terser: 5.10.0(acorn@7.4.1)
vite: 4.3.2(@types/node@18.16.0)(sass@1.62.0)(terser@5.10.0)
vite: 4.3.3(@types/node@18.16.1)(sass@1.62.1)(terser@5.10.0)
transitivePeerDependencies:
- supports-color
dev: true
/@vitejs/plugin-vue@4.2.0(vite@4.3.2)(vue@3.2.47):
/@vitejs/plugin-vue@4.2.0(vite@4.3.3)(vue@3.2.47):
resolution: {integrity: sha512-hYaXFvEKEwyTmwHq2ft7GGeLBvyYLwTM3E5R1jpvzxg9gO4m5PQcTVvj1wEPKoPL8PAt+KAlxo3gyJWnmwzaWQ==}
engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies:
vite: ^4.0.0
vue: ^3.2.25
dependencies:
vite: 4.3.2(@types/node@18.16.0)(sass@1.62.0)(terser@5.10.0)
vite: 4.3.3(@types/node@18.16.1)(sass@1.62.1)(terser@5.10.0)
vue: 3.2.47
dev: true
@ -4461,7 +4461,7 @@ packages:
'@vue/server-renderer': 3.2.47(vue@3.2.47)
dev: true
/@vue/tsconfig@0.1.3(@types/node@18.16.0):
/@vue/tsconfig@0.1.3(@types/node@18.16.1):
resolution: {integrity: sha512-kQVsh8yyWPvHpb8gIc9l/HIDiiVUy1amynLNpCy8p+FoCiZXCo6fQos5/097MmnNZc9AtseDsCrfkhqCrJ8Olg==}
peerDependencies:
'@types/node': '*'
@ -4469,7 +4469,7 @@ packages:
'@types/node':
optional: true
dependencies:
'@types/node': 18.16.0
'@types/node': 18.16.1
dev: true
/@vueuse/core@10.1.0(vue@3.2.47):
@ -8577,16 +8577,16 @@ packages:
engines: {node: '>=12.0.0'}
dev: false
/histoire@0.16.1(@types/node@18.16.0)(sass@1.62.0)(terser@5.10.0)(vite@4.3.2):
/histoire@0.16.1(@types/node@18.16.1)(sass@1.62.1)(terser@5.10.0)(vite@4.3.3):
resolution: {integrity: sha512-TIzJ0Wqe8epfTYMd7yuS0Zcuy86ysJ5t4p6qt0zjHAinoNgEH2M9biHtuKQzd96/QuUy3oc2dcXiFLFSZGdSyw==}
hasBin: true
peerDependencies:
vite: ^2.9.0 || ^3.0.0 || ^4.0.0
dependencies:
'@akryum/tinypool': 0.3.1
'@histoire/app': 0.16.1(vite@4.3.2)
'@histoire/controls': 0.16.1(vite@4.3.2)
'@histoire/shared': 0.16.1(vite@4.3.2)
'@histoire/app': 0.16.1(vite@4.3.3)
'@histoire/controls': 0.16.1(vite@4.3.3)
'@histoire/shared': 0.16.1(vite@4.3.3)
'@histoire/vendors': 0.16.0
'@types/flexsearch': 0.7.3
'@types/markdown-it': 12.2.3
@ -8613,8 +8613,8 @@ packages:
sade: 1.8.1
shiki-es: 0.2.0
sirv: 2.0.2
vite: 4.3.2(@types/node@18.16.0)(sass@1.62.0)(terser@5.10.0)
vite-node: 0.28.4(@types/node@18.16.0)(sass@1.62.0)(terser@5.10.0)
vite: 4.3.3(@types/node@18.16.1)(sass@1.62.1)(terser@5.10.0)
vite-node: 0.28.4(@types/node@18.16.1)(sass@1.62.1)(terser@5.10.0)
transitivePeerDependencies:
- '@types/node'
- bufferutil
@ -9447,7 +9447,7 @@ packages:
resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==}
engines: {node: '>= 10.13.0'}
dependencies:
'@types/node': 18.16.0
'@types/node': 18.16.1
merge-stream: 2.0.0
supports-color: 7.2.0
dev: true
@ -10594,7 +10594,7 @@ packages:
resolution: {integrity: sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==}
dev: true
/netlify-cli@14.2.1(@types/node@18.16.0):
/netlify-cli@14.2.1(@types/node@18.16.1):
resolution: {integrity: sha512-DssanJ2npzYMCf7zV0KZnETN/CYrKFPvflp6s2fb8RpiIlcO6H1CtUDDIdAsqi9/gwBRiynS+L6LGVCJgmA9iw==}
engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true
@ -10602,7 +10602,7 @@ packages:
dependencies:
'@bugsnag/js': 7.20.0
'@fastify/static': 6.6.1
'@netlify/build': 29.9.2(@types/node@18.16.0)
'@netlify/build': 29.9.2(@types/node@18.16.1)
'@netlify/build-info': 7.0.0-pre-20230418.0
'@netlify/config': 20.3.7
'@netlify/edge-bundler': 8.13.2
@ -12786,8 +12786,8 @@ packages:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
dev: true
/sass@1.62.0:
resolution: {integrity: sha512-Q4USplo4pLYgCi+XlipZCWUQz5pkg/ruSSgJ0WRDSb/+3z9tXUOkQ7QPYn4XrhZKYAK4HlpaQecRwKLJX6+DBg==}
/sass@1.62.1:
resolution: {integrity: sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A==}
engines: {node: '>=14.0.0'}
hasBin: true
dependencies:
@ -13869,7 +13869,7 @@ packages:
resolution: {integrity: sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==}
dev: true
/ts-node@10.8.1(@types/node@18.16.0)(typescript@5.0.4):
/ts-node@10.8.1(@types/node@18.16.1)(typescript@5.0.4):
resolution: {integrity: sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g==}
hasBin: true
peerDependencies:
@ -13888,7 +13888,7 @@ packages:
'@tsconfig/node12': 1.0.9
'@tsconfig/node14': 1.0.1
'@tsconfig/node16': 1.0.2
'@types/node': 18.16.0
'@types/node': 18.16.1
acorn: 8.8.2
acorn-walk: 8.2.0
arg: 4.1.3
@ -14333,7 +14333,7 @@ packages:
extsprintf: 1.3.0
dev: true
/vite-node@0.28.4(@types/node@18.16.0)(sass@1.62.0)(terser@5.10.0):
/vite-node@0.28.4(@types/node@18.16.1)(sass@1.62.1)(terser@5.10.0):
resolution: {integrity: sha512-KM0Q0uSG/xHHKOJvVHc5xDBabgt0l70y7/lWTR7Q0pR5/MrYxadT+y32cJOE65FfjGmJgxpVEEY+69btJgcXOQ==}
engines: {node: '>=v14.16.0'}
hasBin: true
@ -14345,7 +14345,7 @@ packages:
picocolors: 1.0.0
source-map: 0.6.1
source-map-support: 0.5.21
vite: 4.3.2(@types/node@18.16.0)(sass@1.62.0)(terser@5.10.0)
vite: 4.3.3(@types/node@18.16.1)(sass@1.62.1)(terser@5.10.0)
transitivePeerDependencies:
- '@types/node'
- less
@ -14356,7 +14356,7 @@ packages:
- terser
dev: true
/vite-node@0.30.1(@types/node@18.16.0)(sass@1.62.0)(terser@5.10.0):
/vite-node@0.30.1(@types/node@18.16.1)(sass@1.62.1)(terser@5.10.0):
resolution: {integrity: sha512-vTikpU/J7e6LU/8iM3dzBo8ZhEiKZEKRznEMm+mJh95XhWaPrJQraT/QsT2NWmuEf+zgAoMe64PKT7hfZ1Njmg==}
engines: {node: '>=v14.18.0'}
hasBin: true
@ -14366,7 +14366,7 @@ packages:
mlly: 1.2.0
pathe: 1.1.0
picocolors: 1.0.0
vite: 4.3.2(@types/node@18.16.0)(sass@1.62.0)(terser@5.10.0)
vite: 4.3.3(@types/node@18.16.1)(sass@1.62.1)(terser@5.10.0)
transitivePeerDependencies:
- '@types/node'
- less
@ -14377,17 +14377,17 @@ packages:
- terser
dev: true
/vite-plugin-inject-preload@1.3.1(vite@4.3.2):
/vite-plugin-inject-preload@1.3.1(vite@4.3.3):
resolution: {integrity: sha512-ESLexLaTl7hThHXaabGz902A+Xgu9tTONZKUT0LRCdqtRlcXbuB3gFjIsmVmZvozr+eS9ntutZfrakCFb9ocCA==}
engines: {node: '>=14.18.0'}
peerDependencies:
vite: ^3.0.0 || ^4.0.0
dependencies:
mime-types: 2.1.35
vite: 4.3.2(@types/node@18.16.0)(sass@1.62.0)(terser@5.10.0)
vite: 4.3.3(@types/node@18.16.1)(sass@1.62.1)(terser@5.10.0)
dev: true
/vite-plugin-pwa@0.14.7(vite@4.3.2)(workbox-build@6.5.4)(workbox-window@6.5.4):
/vite-plugin-pwa@0.14.7(vite@4.3.3)(workbox-build@6.5.4)(workbox-window@6.5.4):
resolution: {integrity: sha512-dNJaf0fYOWncmjxv9HiSa2xrSjipjff7IkYE5oIUJ2x5HKu3cXgA8LRgzOwTc5MhwyFYRSU0xyN0Phbx3NsQYw==}
peerDependencies:
vite: ^3.1.0 || ^4.0.0
@ -14399,7 +14399,7 @@ packages:
fast-glob: 3.2.12
pretty-bytes: 6.0.0
rollup: 3.21.0
vite: 4.3.2(@types/node@18.16.0)(sass@1.62.0)(terser@5.10.0)
vite: 4.3.3(@types/node@18.16.1)(sass@1.62.1)(terser@5.10.0)
workbox-build: 6.5.4(acorn@7.4.1)
workbox-window: 6.5.4
transitivePeerDependencies:
@ -14413,8 +14413,8 @@ packages:
svgo: 3.0.2
dev: true
/vite@4.3.2(@types/node@18.16.0)(sass@1.62.0)(terser@5.10.0):
resolution: {integrity: sha512-9R53Mf+TBoXCYejcL+qFbZde+eZveQLDYd9XgULILLC1a5ZwPaqgmdVpL8/uvw2BM/1TzetWjglwm+3RO+xTyw==}
/vite@4.3.3(@types/node@18.16.1)(sass@1.62.1)(terser@5.10.0):
resolution: {integrity: sha512-MwFlLBO4udZXd+VBcezo3u8mC77YQk+ik+fbc0GZWGgzfbPP+8Kf0fldhARqvSYmtIWoAJ5BXPClUbMTlqFxrA==}
engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true
peerDependencies:
@ -14438,17 +14438,17 @@ packages:
terser:
optional: true
dependencies:
'@types/node': 18.16.0
'@types/node': 18.16.1
esbuild: 0.17.18
postcss: 8.4.23
rollup: 3.21.0
sass: 1.62.0
sass: 1.62.1
terser: 5.10.0(acorn@7.4.1)
optionalDependencies:
fsevents: 2.3.2
dev: true
/vitest@0.30.1(happy-dom@9.9.2)(sass@1.62.0)(terser@5.10.0):
/vitest@0.30.1(happy-dom@9.9.2)(sass@1.62.1)(terser@5.10.0):
resolution: {integrity: sha512-y35WTrSTlTxfMLttgQk4rHcaDkbHQwDP++SNwPb+7H8yb13Q3cu2EixrtHzF27iZ8v0XCciSsLg00RkPAzB/aA==}
engines: {node: '>=v14.18.0'}
hasBin: true
@ -14481,7 +14481,7 @@ packages:
dependencies:
'@types/chai': 4.3.4
'@types/chai-subset': 1.3.3
'@types/node': 18.16.0
'@types/node': 18.16.1
'@vitest/expect': 0.30.1
'@vitest/runner': 0.30.1
'@vitest/snapshot': 0.30.1
@ -14503,8 +14503,8 @@ packages:
strip-literal: 1.0.1
tinybench: 2.4.0
tinypool: 0.4.0
vite: 4.3.2(@types/node@18.16.0)(sass@1.62.0)(terser@5.10.0)
vite-node: 0.30.1(@types/node@18.16.0)(sass@1.62.0)(terser@5.10.0)
vite: 4.3.3(@types/node@18.16.1)(sass@1.62.1)(terser@5.10.0)
vite-node: 0.30.1(@types/node@18.16.1)(sass@1.62.1)(terser@5.10.0)
why-is-node-running: 2.2.2
transitivePeerDependencies:
- less

View File

@ -48,7 +48,6 @@ const displayName = computed(() => getDisplayName(props.user))
<style lang="scss" scoped>
.user {
margin: .5rem;
display: flex;
justify-items: center;

View File

@ -20,7 +20,8 @@
:user="n.notification.doer"
:show-username="false"
:avatar-size="16"
v-if="n.notification.doer"/>
v-if="n.notification.doer"
/>
<div class="detail">
<div>
<span class="has-text-weight-bold mr-1" v-if="n.notification.doer">

View File

@ -12,12 +12,15 @@
>
<template #tag="{item: user}">
<span class="assignee">
<user :avatar-size="32" :show-username="false" :user="user"/>
<user :avatar-size="32" :show-username="false" :user="user" class="m-2"/>
<BaseButton @click="removeAssignee(user)" class="remove-assignee" v-if="!disabled">
<icon icon="times"/>
</BaseButton>
</span>
</template>
<template #searchResult="{option: user}">
<user :avatar-size="24" :show-username="true" :user="user"/>
</template>
</Multiselect>
</template>
@ -104,11 +107,6 @@ async function removeAssignee(user: IUser) {
}
async function findUser(query: string) {
if (query === '') {
foundUsers.value = []
return
}
const response = await projectUserService.getAll({projectId: props.projectId}, {s: query}) as IUser[]
// Filter the results to not include users who are already assigned

View File

@ -56,6 +56,7 @@
:key="task.id + 'assignee' + a.id + i"
:show-username="false"
:user="a"
class="m-2"
/>
<!-- FIXME: use popup -->

View File

@ -78,8 +78,8 @@
"savedSuccess": "The settings were successfully updated.",
"emailReminders": "Send me reminders for tasks via Email",
"overdueReminders": "Send me a summary of my undone overdue tasks every day",
"discoverableByName": "Let other users find me when they search for my name",
"discoverableByEmail": "Let other users find me when they search for my full email",
"discoverableByName": "Allow other users to add me as a member to teams or projects when they search for my name",
"discoverableByEmail": "Allow other users to add me as a member to teams or projects when they search for my full email",
"playSoundWhenDone": "Play a sound when marking tasks as done",
"weekStart": "Week starts on",
"weekStartSunday": "Sunday",

View File

@ -691,6 +691,14 @@ describe('Parse Task Text', () => {
expect(result.assignees).toHaveLength(1)
expect(result.assignees[0]).toBe('today')
})
it('should recognize an email address', () => {
const text = 'Lorem Ipsum @email@example.com'
const result = parseTaskText(text)
expect(result.text).toBe('Lorem Ipsum @email@example.com')
expect(result.assignees).toHaveLength(1)
expect(result.assignees[0]).toBe('email@example.com')
})
})
describe('Recurring Dates', () => {

View File

@ -109,7 +109,9 @@ const getItemsFromPrefix = (text: string, prefix: string): string[] => {
return
}
p = p.replace(prefix, '')
if (p.startsWith(prefix)) {
p = p.substring(1)
}
let itemText
if (p.charAt(0) === '\'') {
@ -120,8 +122,8 @@ const getItemsFromPrefix = (text: string, prefix: string): string[] => {
// Only until the next space
itemText = p.split(' ')[0]
}
if(itemText !== '') {
if (itemText !== '') {
items.push(itemText)
}
})
@ -278,13 +280,16 @@ const getRepeats = (text: string): repeatParsedResult => {
export const cleanupItemText = (text: string, items: string[], prefix: string): string => {
items.forEach(l => {
if (l === '') {
return
}
text = text
.replace(`${prefix}'${l}' `, '')
.replace(`${prefix}'${l}'`, '')
.replace(`${prefix}"${l}" `, '')
.replace(`${prefix}"${l}"`, '')
.replace(`${prefix}${l} `, '')
.replace(`${prefix}${l}`, '')
.replace(new RegExp(`\\${prefix}'${l}' `, 'ig'), '')
.replace(new RegExp(`\\${prefix}'${l}'`, 'ig'), '')
.replace(new RegExp(`\\${prefix}"${l}" `, 'ig'), '')
.replace(new RegExp(`\\${prefix}"${l}"`, 'ig'), '')
.replace(new RegExp(`\\${prefix}${l} `, 'ig'), '')
.replace(new RegExp(`\\${prefix}${l}`, 'ig'), '')
})
return text
}

View File

@ -5,7 +5,6 @@ import router from '@/router'
import TaskService from '@/services/task'
import TaskAssigneeService from '@/services/taskAssignee'
import LabelTaskService from '@/services/labelTask'
import UserService from '@/services/user'
import {playPop} from '@/helpers/playPop'
import {getQuickAddMagicMode} from '@/helpers/quickAddMagicMode'
@ -29,12 +28,21 @@ import {useProjectStore} from '@/stores/projects'
import {useAttachmentStore} from '@/stores/attachments'
import {useKanbanStore} from '@/stores/kanban'
import {useBaseStore} from '@/stores/base'
import ProjectUserService from '@/services/projectUsers'
interface MatchedAssignee extends IUser {
match: string,
}
// IDEA: maybe use a small fuzzy search here to prevent errors
function findPropertyByValue(object, key, value) {
return Object.values(object).find(
(l) => l[key]?.toLowerCase() === value.toLowerCase(),
)
function findPropertyByValue(object, key, value, fuzzy: boolean = false) {
return Object.values(object).find(l => {
if (fuzzy) {
return l[key]?.toLowerCase().includes(value.toLowerCase())
}
return l[key]?.toLowerCase() === value.toLowerCase()
})
}
// Check if the user exists in the search results
@ -42,9 +50,19 @@ function validateUser(
users: IUser[],
query: IUser['username'] | IUser['name'] | IUser['email'],
) {
return findPropertyByValue(users, 'username', query) ||
if (users.length === 1) {
return (
findPropertyByValue(users, 'username', query, true) ||
findPropertyByValue(users, 'name', query, true) ||
findPropertyByValue(users, 'email', query, true)
)
}
return (
findPropertyByValue(users, 'username', query) ||
findPropertyByValue(users, 'name', query) ||
findPropertyByValue(users, 'email', query)
)
}
// Check if the label exists
@ -63,14 +81,18 @@ async function addLabelToTask(task: ITask, label: ILabel) {
return response
}
async function findAssignees(parsedTaskAssignees: string[]): Promise<IUser[]> {
async function findAssignees(parsedTaskAssignees: string[], projectId: number): Promise<MatchedAssignee[]> {
if (parsedTaskAssignees.length <= 0) {
return []
}
const userService = new UserService()
const userService = new ProjectUserService()
const assignees = parsedTaskAssignees.map(async a => {
const users = await userService.getAll({}, {s: a})
const users = (await userService.getAll({projectId}, {s: a}))
.map(u => ({
...u,
match: a,
}))
return validateUser(users, a)
})
@ -388,15 +410,15 @@ export const useTaskStore = defineStore('task', () => {
cancel()
throw new Error('NO_PROJECT')
}
const assignees = await findAssignees(parsedTask.assignees)
const assignees = await findAssignees(parsedTask.assignees, foundProjectId)
// Only clean up those assignees from the task title which actually exist
let cleanedTitle = parsedTask.text
if (assignees.length > 0) {
const assigneePrefix = PREFIXES[quickAddMagicMode]?.assignee
if (assigneePrefix) {
cleanedTitle = cleanupItemText(cleanedTitle, assignees.map(a => a.username), assigneePrefix)
cleanedTitle = cleanupItemText(cleanedTitle, assignees.map(a => a.match), assigneePrefix)
}
}

View File

@ -201,7 +201,6 @@ import {RIGHTS as Rights} from '@/constants/rights'
import {useTitle} from '@/composables/useTitle'
import {success} from '@/message'
import {getDisplayName} from '@/models/user'
import {useAuthStore} from '@/stores/auth'
import type {ITeam} from '@/modelTypes/ITeam'