diff --git a/.meteor/release b/.meteor/release index 22462328..66dd7b66 100644 --- a/.meteor/release +++ b/.meteor/release @@ -1 +1 @@ -METEOR@2.7.2 +METEOR@2.7.3 diff --git a/.meteor/versions b/.meteor/versions index 1b15d076..0b91b81d 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -89,7 +89,7 @@ templating-compiler@1.4.1 templating-runtime@1.5.0 templating-tools@1.2.2 tracker@1.2.0 -tunguska:reactive-aggregate@1.3.7 +tunguska:reactive-aggregate@1.3.8 ui@1.0.13 underscore@1.0.10 url@1.3.2 diff --git a/imports/ui/components/allprojectschart.js b/imports/ui/components/allprojectschart.js index ed128999..7b18474f 100644 --- a/imports/ui/components/allprojectschart.js +++ b/imports/ui/components/allprojectschart.js @@ -128,7 +128,7 @@ Template.allprojectschart.onRendered(() => { colors: ['#009688', '#455A64', '#e4e4e4'], height: 230, data: { - labels: templateInstance.topTasks.get().map((task) => task._id), + labels: templateInstance.topTasks.get().map((task) => $('').text(task._id).html()), datasets: [{ values: templateInstance.topTasks.get().map((task) => task.count), }], diff --git a/imports/ui/components/dailytimetable.js b/imports/ui/components/dailytimetable.js index ebcfc8fd..fa53db81 100644 --- a/imports/ui/components/dailytimetable.js +++ b/imports/ui/components/dailytimetable.js @@ -11,6 +11,7 @@ import { numberWithUserPrecision, getUserSetting, getUserTimeUnitVerbose, + addToolTipToTableCell, } from '../../utils/frontend_helpers' import { i18nReady, t } from '../../utils/i18n.js' import { dailyTimecardMapper } from '../../utils/server_method_helpers' @@ -68,8 +69,18 @@ Template.dailytimetable.onRendered(() => { width: 1, compareValue: (cell, keyword) => [dayjs(cell, getGlobalSetting('dateformat')).toDate(), dayjs(keyword, getGlobalSetting('dateformat')).toDate()], }, - { name: t('globals.project'), editable: false, width: 2 }, - { name: t('globals.resource'), editable: false, width: 2 }, + { + name: t('globals.project'), + editable: false, + width: 2, + format: addToolTipToTableCell, + }, + { + name: t('globals.resource'), + editable: false, + width: 2, + format: addToolTipToTableCell, + }, { name: getUserTimeUnitVerbose(), editable: false, diff --git a/imports/ui/components/detailtimetable.js b/imports/ui/components/detailtimetable.js index e4d46c0d..2996eeb8 100644 --- a/imports/ui/components/detailtimetable.js +++ b/imports/ui/components/detailtimetable.js @@ -36,7 +36,7 @@ function detailedDataTableMapper(entry) { const project = Projects.findOne({ _id: entry.projectId }) const mapping = [project ? project.name : '', dayjs.utc(entry.date).format(getGlobalSetting('dateformat')), - entry.task, + entry.task.replace(/^=/, '='), projectUsers.findOne() ? projectUsers.findOne().users.find((elem) => elem._id === entry.userId)?.profile?.name : ''] if (getGlobalSetting('showCustomFieldsInDetails')) { if (CustomFields.find({ classname: 'time_entry' }).count() > 0) { diff --git a/imports/ui/components/periodtimetable.js b/imports/ui/components/periodtimetable.js index 9989a45c..aaa05120 100644 --- a/imports/ui/components/periodtimetable.js +++ b/imports/ui/components/periodtimetable.js @@ -11,6 +11,7 @@ import { numberWithUserPrecision, getUserSetting, getUserTimeUnitVerbose, + addToolTipToTableCell, } from '../../utils/frontend_helpers.js' import { totalHoursForPeriodMapper } from '../../utils/server_method_helpers.js' @@ -61,8 +62,8 @@ Template.periodtimetable.onRendered(() => { .map((key) => key[1])) } const columns = [ - { name: t('globals.project'), editable: false }, - { name: t('globals.resource'), editable: false }, + { name: t('globals.project'), editable: false, format: addToolTipToTableCell }, + { name: t('globals.resource'), editable: false, format: addToolTipToTableCell }, { name: getUserTimeUnitVerbose(), editable: false, diff --git a/imports/ui/components/projectAccessRights.js b/imports/ui/components/projectAccessRights.js index ff266783..86b0b4d3 100644 --- a/imports/ui/components/projectAccessRights.js +++ b/imports/ui/components/projectAccessRights.js @@ -2,7 +2,7 @@ import { FlowRouter } from 'meteor/ostrio:flow-router-extra' import './projectAccessRights.html' import { t, i18nReady } from '../../utils/i18n.js' import { - validateEmail, getGlobalSetting, showToast, + validateEmail, getGlobalSetting, showToast, addToolTipToTableCell, } from '../../utils/frontend_helpers' import Projects from '../../api/projects/projects.js' @@ -28,6 +28,7 @@ Template.projectAccessRights.onRendered(() => { name: t('globals.name'), editable: false, focusable: false, + format: addToolTipToTableCell, }, { name: t('project.access_rights'), editable: false, diff --git a/imports/ui/components/projectchart.js b/imports/ui/components/projectchart.js index d714f567..d43d43b0 100644 --- a/imports/ui/components/projectchart.js +++ b/imports/ui/components/projectchart.js @@ -200,7 +200,7 @@ Template.projectchart.onRendered(() => { colors: [Projects.findOne({ _id: templateInstance.data.projectId }).color || '#009688', '#66c0b8', '#e4e4e4'], height: 230, data: { - labels: templateInstance.topTasks.get().map((task) => task._id), + labels: templateInstance.topTasks.get().map((task) => $('').text(task._id).html()), datasets: [{ values: templateInstance.topTasks.get().map((task) => task.count), }], diff --git a/imports/ui/pages/dashboard.js b/imports/ui/pages/dashboard.js index 71b7c126..e296485e 100644 --- a/imports/ui/pages/dashboard.js +++ b/imports/ui/pages/dashboard.js @@ -10,6 +10,7 @@ import { getGlobalSetting, timeInUserUnit, getUserTimeUnitVerbose, + addToolTipToTableCell, } from '../../utils/frontend_helpers' import './dashboard.html' import Timecards from '../../api/timecards/timecards' @@ -126,7 +127,7 @@ Template.dashboard.onRendered(() => { const precision = getUserSetting('precision') for (const timecard of Timecards.find({}, { sort: { date: 1 } }).fetch()) { taskmap.set( - timecard.task.replace(/(:\S*:)/g, emojify), + $('').text(timecard.task.replace(/(:\S*:)/g, emojify)).html(), taskmap.get(timecard.task.replace(/(:\S*:)/g, emojify)) ? Number(Number(taskmap.get(timecard.task.replace(/(:\S*:)/g, emojify))) + Number(timeInUnitHelper(timecard.hours))) : Number(timeInUnitHelper(timecard.hours)), diff --git a/imports/utils/frontend_helpers.js b/imports/utils/frontend_helpers.js index 3179a278..99604740 100644 --- a/imports/utils/frontend_helpers.js +++ b/imports/utils/frontend_helpers.js @@ -18,7 +18,8 @@ function getUserSetting(field) { function addToolTipToTableCell(value) { if (value) { - return `${value}` + const sanitizedValue = $('
').text(value).html() + return `${sanitizedValue}` } return '' } diff --git a/imports/utils/server_method_helpers.js b/imports/utils/server_method_helpers.js index 6283c9da..06e8b377 100644 --- a/imports/utils/server_method_helpers.js +++ b/imports/utils/server_method_helpers.js @@ -67,7 +67,8 @@ function totalHoursForPeriodMapper(entry) { } return { projectId: Projects.findOne({ _id: entry._id.projectId }).name, - userId: projectUsers.findOne().users.find((elem) => elem._id === entry._id.userId)?.profile?.name, + userId: projectUsers + .findOne().users.find((elem) => elem._id === entry._id.userId)?.profile?.name, totalHours, } } diff --git a/package-lock.json b/package-lock.json index baa85d6d..b43d76c6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -793,9 +793,9 @@ } }, "dayjs": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.2.tgz", - "integrity": "sha512-F4LXf1OeU9hrSYRPTTj/6FbO4HTjPKXvEIC1P2kcnFurViINCVk3ZV0xAS3XVx9MkMsXbbqlK6hjseaYbgKEHw==" + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.3.tgz", + "integrity": "sha512-xxwlswWOlGhzgQ4TKzASQkUhqERI3egRNqgV4ScR8wlANA/A9tZ7miXa44vTTKEq5l7vWoL5G57bG3zA+Kow0A==" }, "dayjs-precise-range": { "version": "1.0.1", @@ -962,9 +962,9 @@ "dev": true }, "eslint": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.16.0.tgz", - "integrity": "sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.17.0.tgz", + "integrity": "sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw==", "dev": true, "requires": { "@eslint/eslintrc": "^1.3.0", @@ -1397,7 +1397,7 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "file-entry-cache": { @@ -1485,7 +1485,7 @@ "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", "dev": true }, "gauge": { @@ -1657,7 +1657,7 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, "inflight": { @@ -1830,7 +1830,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "jalaali-js": { @@ -1877,7 +1877,7 @@ "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, "json5": { @@ -2829,7 +2829,7 @@ "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, "node-addon-api": { diff --git a/package.json b/package.json index df2a25b1..552ad569 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "titra", - "version": "0.76.1", + "version": "0.77.0", "private": true, "scripts": { "start": "meteor run" @@ -19,7 +19,7 @@ "bootstrap": "^5.1.3", "content-type": "^1.0.4", "date-holidays": "^3.16.0", - "dayjs": "^1.11.2", + "dayjs": "^1.11.3", "dayjs-precise-range": "^1.0.1", "docker-names": "^1.2.1", "file-saver": "^2.0.5", @@ -46,7 +46,7 @@ "devDependencies": { "@babel/core": "^7.18.2", "@babel/eslint-parser": "^7.18.2", - "eslint": "^8.16.0", + "eslint": "^8.17.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-import-resolver-meteor": "^0.4.0", "eslint-plugin-i18next": "^5.2.1",