From a016d71d270ecf1f929a315ec4bc5ae642cfbb29 Mon Sep 17 00:00:00 2001 From: Fabian Kromer Date: Wed, 18 Dec 2024 17:19:42 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20new=20setting=20to=20enable=20OIDC?= =?UTF-8?q?=20auto=20login=20=F0=9F=90=9B=20trying=20to=20fix=20issue=20#2?= =?UTF-8?q?16=20-=20incorrect=20dates=20saved?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- imports/api/projects/server/publications.js | 2 +- .../components/oidccomponent.js | 1 - .../details/components/detailtimetable.js | 12 +++--- imports/ui/pages/signIn.js | 14 ++++++- imports/ui/pages/track/components/calendar.js | 8 ++-- .../ui/pages/track/components/weektable.js | 20 +++++----- imports/ui/pages/track/tracktime.js | 12 +++--- imports/utils/oidc/oidc_client.js | 5 ++- imports/utils/oidc/oidc_helper.js | 19 +++++++++- package-lock.json | 37 ++++++++++--------- package.json | 8 ++-- 11 files changed, 83 insertions(+), 55 deletions(-) diff --git a/imports/api/projects/server/publications.js b/imports/api/projects/server/publications.js index fd90d2f1..6fd2ec44 100644 --- a/imports/api/projects/server/publications.js +++ b/imports/api/projects/server/publications.js @@ -166,7 +166,7 @@ Meteor.publish('projectStats', async function projectStats(projectId) { .isBetween(beforePreviousMonthStart, beforePreviousMonthEnd)) { beforePreviousMonthHours += Number.parseFloat(timecard.hours) } - if (project.rates[timecard.userId]) { + if (project?.rates && project.rates[timecard.userId]) { totalRevenue += Number.parseFloat(timecard.hours) * Number.parseFloat(project.rates[timecard.userId]) } else { diff --git a/imports/ui/pages/administration/components/oidccomponent.js b/imports/ui/pages/administration/components/oidccomponent.js index a1f252c2..b67d02eb 100644 --- a/imports/ui/pages/administration/components/oidccomponent.js +++ b/imports/ui/pages/administration/components/oidccomponent.js @@ -15,7 +15,6 @@ Template.oidccomponent.events({ event.preventDefault() const configuration = { service: 'oidc', - loginStyle: 'popup', } for (const element of templateInstance.$('.js-setting-input')) { const { name } = element diff --git a/imports/ui/pages/details/components/detailtimetable.js b/imports/ui/pages/details/components/detailtimetable.js index a011eaca..7497d023 100644 --- a/imports/ui/pages/details/components/detailtimetable.js +++ b/imports/ui/pages/details/components/detailtimetable.js @@ -67,8 +67,8 @@ function detailedDataTableMapper(entry, forExport) { mapping.push(entry.state) } if (getGlobalSetting('useStartTime')) { - mapping.push(dayjs.utc(entry.date).local().format('HH:mm')) - mapping.push(dayjs.utc(entry.date).local().add(entry.hours, 'hour').format('HH:mm')) + mapping.push(dayjs.utc(entry.date).local().format('HH:mm')) // Ensure consistent timezone usage + mapping.push(dayjs.utc(entry.date).local().add(entry.hours, 'hour').format('HH:mm')) // Ensure consistent timezone usage } mapping.push(Number(timeInUserUnit(entry.hours))) if (getGlobalSetting('showRateInDetails')) { @@ -113,8 +113,8 @@ Template.detailtimetable.onCreated(function workingtimetableCreated() { } if (this.data?.period.get() === 'custom') { subscriptionParameters.dates = { - startDate: getUserSetting('customStartDate') ? getUserSetting('customStartDate') : dayjs.utc().startOf('month').toDate(), - endDate: getUserSetting('customEndDate') ? getUserSetting('customEndDate') : dayjs.utc().toDate(), + startDate: getUserSetting('customStartDate') ? getUserSetting('customStartDate') : dayjs.utc().startOf('month').toDate(), // Ensure consistent timezone usage + endDate: getUserSetting('customEndDate') ? getUserSetting('customEndDate') : dayjs.utc().toDate(), // Ensure consistent timezone usage } } this.detailedEntriesPeriodCountHandle = this.subscribe('getDetailedTimeEntriesForPeriodCount', subscriptionParameters) @@ -133,8 +133,8 @@ Template.detailtimetable.onCreated(function workingtimetableCreated() { customer: this.data?.customer.get(), period: this.data?.period.get(), dates: { - startDate: getUserSetting('customStartDate') ? getUserSetting('customStartDate') : dayjs.utc().startOf('month').toDate(), - endDate: getUserSetting('customEndDate') ? getUserSetting('customEndDate') : dayjs.utc().toDate(), + startDate: getUserSetting('customStartDate') ? getUserSetting('customStartDate') : dayjs.utc().startOf('month').toDate(), // Ensure consistent timezone usage + endDate: getUserSetting('customEndDate') ? getUserSetting('customEndDate') : dayjs.utc().toDate(), // Ensure consistent timezone usage }, userId: this.data?.resource.get(), limit: this.data?.limit.get(), diff --git a/imports/ui/pages/signIn.js b/imports/ui/pages/signIn.js index dae0dae9..b42e87ba 100644 --- a/imports/ui/pages/signIn.js +++ b/imports/ui/pages/signIn.js @@ -1,6 +1,7 @@ import { FlowRouter } from 'meteor/ostrio:flow-router-extra' import { validateEmail, getGlobalSetting } from '../../utils/frontend_helpers' -import { isOidcConfigured, disableDefaultLoginForm } from '../../utils/oidc/oidc_helper' +import { isOidcConfigured, disableDefaultLoginForm, isAutoLoginEnabled } from '../../utils/oidc/oidc_helper' +import { oidcReady } from '../../utils/oidc/oidc_client' import { t } from '../../utils/i18n.js' import './signIn.html' @@ -81,3 +82,14 @@ Template.signIn.events({ FlowRouter.go('register', {}, { email: templateInstance.$('#at-field-email').val() }) }, }) + +Template.signIn.onRendered(function signInRendered() { + const templateInstance = this + this.autorun(() => { + if(oidcReady.get() && isAutoLoginEnabled()) { + Meteor.loginWithOidc((error) => { + handleLoginResult(error, templateInstance) + }) + } + }) +}) diff --git a/imports/ui/pages/track/components/calendar.js b/imports/ui/pages/track/components/calendar.js index 3fced562..7d8135cd 100644 --- a/imports/ui/pages/track/components/calendar.js +++ b/imports/ui/pages/track/components/calendar.js @@ -14,8 +14,8 @@ import { getHolidays } from '../../../../utils/holiday.js' Template.calendar.onCreated(function calendarCreated() { dayjs.extend(utc) this.subscribe('myprojects', {}) - this.startDate = new ReactiveVar(dayjs.utc().startOf('month').toDate()) - this.endDate = new ReactiveVar(dayjs.utc().endOf('month').toDate()) + this.startDate = new ReactiveVar(dayjs.utc().startOf('month').toDate()) // Ensure consistent timezone usage + this.endDate = new ReactiveVar(dayjs.utc().endOf('month').toDate()) // Ensure consistent timezone usage this.tcid = new ReactiveVar() this.selectedProjectId = new ReactiveVar() this.selectedDate = new ReactiveVar() @@ -42,7 +42,7 @@ Template.calendar.onRendered(() => { droppable: true, aspectRatio: 2, height: 'auto', - timeZone: 'UTC', + timeZone: 'UTC', // Ensure consistent timezone usage firstDay: getUserSetting('startOfWeek'), themeSystem: 'bootstrap', events: (fetchInfo, successCallback) => { @@ -119,7 +119,7 @@ Template.calendar.onRendered(() => { new bootstrap.Modal($('#edit-tc-entry-modal')[0], { focus: false }).show() }, datesSet: (dateInfo) => { - FlowRouter.setQueryParams({ date: dayjs(dateInfo.view.currentStart).format('YYYY-MM-DD') }) + FlowRouter.setQueryParams({ date: dayjs.utc(dateInfo.view.currentStart).format('YYYY-MM-DD') }) // Ensure consistent timezone usage }, }) templateInstance.calendar.render() diff --git a/imports/ui/pages/track/components/weektable.js b/imports/ui/pages/track/components/weektable.js index b60e61b2..9ce3a981 100644 --- a/imports/ui/pages/track/components/weektable.js +++ b/imports/ui/pages/track/components/weektable.js @@ -34,14 +34,14 @@ Template.weektable.onCreated(function weekTableCreated() { this.totalForWeekPerDay = new ReactiveVar([]) this.autorun(() => { if (this.subscriptionsReady()) { - this.startDate.set(dayjs().startOf('day').isoWeekday(getUserSetting('startOfWeek'))) - this.endDate.set(dayjs().endOf('day').isoWeekday(getUserSetting('startOfWeek')).add(6, 'day')) + this.startDate.set(dayjs.utc().startOf('day').isoWeekday(getUserSetting('startOfWeek'))) // Ensure consistent timezone usage + this.endDate.set(dayjs.utc().endOf('day').isoWeekday(getUserSetting('startOfWeek')).add(6, 'day')) // Ensure consistent timezone usage } }) this.autorun(() => { if (FlowRouter.getQueryParam('date')) { - this.startDate.set(dayjs.utc(FlowRouter.getQueryParam('date')).isoWeekday(getUserSetting('startOfWeek')), 'YYYY-MM-DD') - this.endDate.set(dayjs.utc(FlowRouter.getQueryParam('date')).isoWeekday(getUserSetting('startOfWeek')).add(6, 'day'), 'YYYY-MM-DD') + this.startDate.set(dayjs.utc(FlowRouter.getQueryParam('date')).isoWeekday(getUserSetting('startOfWeek')), 'YYYY-MM-DD') // Ensure consistent timezone usage + this.endDate.set(dayjs.utc(FlowRouter.getQueryParam('date')).isoWeekday(getUserSetting('startOfWeek')).add(6, 'day'), 'YYYY-MM-DD') // Ensure consistent timezone usage } }) this.autorun(async () => { @@ -77,7 +77,7 @@ Template.weektable.helpers({ endDate() { return Template.instance().endDate }, getTotalForDay(day) { for (const element of Template.instance().totalForWeekPerDay.get()) { - if (dayjs.utc(new Date(element._id.date)).format(getGlobalSetting('weekviewDateFormat')) === day) { + if (dayjs.utc(new Date(element._id.date)).format(getGlobalSetting('weekviewDateFormat')) === day) { // Ensure consistent timezone usage return element.totalForDate !== 0 ? timeInUserUnit(element.totalForDate) : false } } @@ -93,7 +93,7 @@ Template.weektable.helpers({ } return false }, - isTodayClass: (weekday) => (dayjs.utc(weekday, getGlobalSetting('weekviewDateFormat')).isSame(dayjs.utc(), 'day') ? 'text-primary' : ''), + isTodayClass: (weekday) => (dayjs.utc(weekday, getGlobalSetting('weekviewDateFormat')).isSame(dayjs.utc(), 'day') ? 'text-primary' : ''), // Ensure consistent timezone usage }) Template.weektable.events({ @@ -107,7 +107,7 @@ Template.weektable.events({ }, 'click .js-today': (event, templateInstance) => { event.preventDefault() - FlowRouter.setQueryParams({ date: dayjs.utc().isoWeekday(getUserSetting('startOfWeek')).format('YYYY-MM-DD') }) + FlowRouter.setQueryParams({ date: dayjs.utc().isoWeekday(getUserSetting('startOfWeek')).format('YYYY-MM-DD') }) // Ensure consistent timezone usage }, 'keyup .js-hours': (event, templateInstance) => { if (event.keyCode === 13) { @@ -137,7 +137,7 @@ Template.weektable.events({ hours /= 60 } const projectId = $(element).data('project-id') - const date = dayjs.utc(startDate.add(Number(templateInstance.$(element).data('week-day')), 'day').format('YYYY-MM-DD')).toDate() + const date = dayjs.utc(startDate.add(Number(templateInstance.$(element).data('week-day')), 'day').format('YYYY-MM-DD')).toDate() // Ensure consistent timezone usage const existingElement = weekArray .findIndex((arrayElement) => arrayElement.projectId === projectId && arrayElement.task === task && dayjs(arrayElement.date).isSame(dayjs(date))) @@ -291,7 +291,7 @@ Template.weektablerow.helpers({ getHoursForDay(day, task) { if (task.entries && getGlobalSetting('weekviewDateFormat') && i18nReady.get()) { const entryForDay = task.entries - .filter((entry) => dayjs.utc(entry.date).format(getGlobalSetting('weekviewDateFormat')) === dayjs.utc(day, getGlobalSetting('weekviewDateFormat')).format(getGlobalSetting('weekviewDateFormat'))) + .filter((entry) => dayjs.utc(entry.date).format(getGlobalSetting('weekviewDateFormat')) === dayjs.utc(day, getGlobalSetting('weekviewDateFormat')).format(getGlobalSetting('weekviewDateFormat'))) // Ensure consistent timezone usage .reduce(((total, element) => total + element.hours), 0) return entryForDay !== 0 ? timeInUserUnit(entryForDay) : '' } @@ -312,7 +312,7 @@ Template.weektablerow.helpers({ if (!Meteor.loggingIn() && Meteor.user() && Meteor.user().profile) { Template.instance().methodTimeEntries.get().concat(Template.instance().tempTimeEntries.get()).forEach((element) => { if (element.entries) { - total += element.entries.filter((entry) => dayjs.utc(entry.date).format(getGlobalSetting('weekviewDateFormat')) === dayjs.utc(day, getGlobalSetting('weekviewDateFormat')).format(getGlobalSetting('weekviewDateFormat'))) + total += element.entries.filter((entry) => dayjs.utc(entry.date).format(getGlobalSetting('weekviewDateFormat')) === dayjs.utc(day, getGlobalSetting('weekviewDateFormat')).format(getGlobalSetting('weekviewDateFormat'))) // Ensure consistent timezone usage .reduce((tempTotal, current) => tempTotal + Number(current.hours), 0) } }) diff --git a/imports/ui/pages/track/tracktime.js b/imports/ui/pages/track/tracktime.js index ce0db6e5..4d8ffe90 100644 --- a/imports/ui/pages/track/tracktime.js +++ b/imports/ui/pages/track/tracktime.js @@ -77,7 +77,7 @@ Template.tracktime.onCreated(function tracktimeCreated() { dayjs.extend(utc) dayjs.extend(customParseFormat) dayjs.extend(duration) - this.date = new ReactiveVar(dayjs().toDate()) + this.date = new ReactiveVar(dayjs.utc().toDate()) // Ensure consistent timezone usage this.projectId = new ReactiveVar() this.tcid = new ReactiveVar() this.totalTime = new ReactiveVar(0) @@ -99,7 +99,7 @@ Template.tracktime.onCreated(function tracktimeCreated() { this.date.set(this.data?.dateArg.get()) } else if (!(this.data?.dateArg && this.data?.dateArg.get()) && !(this.data?.tcid && this.data?.tcid.get()) && FlowRouter.getQueryParam('date')) { - this.date.set(dayjs(FlowRouter.getQueryParam('date'), 'YYYY-MM-DD').toDate()) + this.date.set(dayjs.utc(FlowRouter.getQueryParam('date'), 'YYYY-MM-DD').toDate()) // Ensure consistent timezone usage } if (this.data?.projectIdArg && this.data?.projectIdArg.get()) { this.projectId.set(this.data?.projectIdArg.get()) @@ -111,12 +111,12 @@ Template.tracktime.onCreated(function tracktimeCreated() { if (this.subscriptionsReady()) { this.time_entry.set(Timecards.findOne(this.tcid.get())) this.date.set(Timecards.findOne({ _id: this.tcid.get() }) - ? dayjs.utc(Timecards.findOne({ _id: this.tcid.get() }).date).toDate() + ? dayjs.utc(Timecards.findOne({ _id: this.tcid.get() }).date).toDate() // Ensure consistent timezone usage : dayjs().toDate()) this.projectId.set(Timecards.findOne({ _id: this.tcid.get() }) ? Timecards.findOne({ _id: this.tcid.get() }).projectId : '') } } else { - handle = this.subscribe('myTimecardsForDate', { date: dayjs(this.date.get()).format('YYYY-MM-DD') }) + handle = this.subscribe('myTimecardsForDate', { date: dayjs.utc(this.date.get()).format('YYYY-MM-DD') }) // Ensure consistent timezone usage if (handle.ready()) { Timecards.find().forEach((timecard) => { this.subscribe('publicProjectName', timecard.projectId) @@ -203,7 +203,7 @@ Template.tracktime.events({ const localDate = dayjs(templateInstance.$('.js-date').val()).toDate() let date = dayjs.utc(templateInstance.$('.js-date').val(), getGlobalSetting('dateformatVerbose')).isValid() ? dayjs.utc(templateInstance.$('.js-date').val(), getGlobalSetting('dateformatVerbose')).toDate() - : dayjs.utc(`${localDate.getFullYear()}-${localDate.getMonth() + 1}-${localDate.getDate()}`).toDate() + : dayjs.utc(`${localDate.getFullYear()}-${localDate.getMonth() + 1}-${localDate.getDate()}`).toDate() // Ensure consistent timezone usage if (getGlobalSetting('useStartTime') && !templateInstance.tcid?.get()) { if ($('#startTime').val()) { date = dayjs.utc(date.setHours($('#startTime').val().split(':')[0], $('#startTime').val().split(':')[1])).toDate() @@ -404,7 +404,7 @@ function isEditMode() { } Template.tracktime.helpers({ date: () => (Template.instance().tcid && Template.instance().tcid.get() - ? dayjs.utc(Template.instance().date.get()).format(getGlobalSetting('dateformatVerbose')) + ? dayjs.utc(Template.instance().date.get()).format(getGlobalSetting('dateformatVerbose')) // Ensure consistent timezone usage : dayjs(Template.instance().date.get()).format(getGlobalSetting('dateformatVerbose'))), projectId: () => Template.instance().projectId.get(), reactiveProjectId: () => Template.instance().projectId, diff --git a/imports/utils/oidc/oidc_client.js b/imports/utils/oidc/oidc_client.js index 95ea851c..ec20568f 100644 --- a/imports/utils/oidc/oidc_client.js +++ b/imports/utils/oidc/oidc_client.js @@ -4,7 +4,7 @@ import { Random } from 'meteor/random' import { ServiceConfiguration } from 'meteor/service-configuration' const SERVICE_NAME = 'oidc' - +const oidcReady = new ReactiveVar(false) function registerOidc() { Accounts.oauth.registerService(SERVICE_NAME) @@ -66,5 +66,6 @@ function registerOidc() { popupOptions, }) } + oidcReady.set(true) } -export { registerOidc } +export { registerOidc, oidcReady } diff --git a/imports/utils/oidc/oidc_helper.js b/imports/utils/oidc/oidc_helper.js index 2683cfc2..017ff7f0 100644 --- a/imports/utils/oidc/oidc_helper.js +++ b/imports/utils/oidc/oidc_helper.js @@ -7,6 +7,9 @@ const oidcFields = [ { property: 'disableDefaultLoginForm', label: 'Disable Default Login Form', type: 'checkbox', value: false, }, + { + property: 'autoInitiateLogin', label: 'Automatically initiate login', type: 'checkbox', value: false, + }, { property: 'clientId', label: 'Client ID', type: 'text', value: '', }, @@ -31,6 +34,9 @@ const oidcFields = [ { property: 'requestPermissions', label: 'Request Permissions', type: 'text', value: '"openid", "profile", "email"', }, + { + property: 'loginStyle', label: 'Login style (popup or redirect)', type: 'text', value: 'popup', + }, ] function isOidcConfigured() { @@ -39,7 +45,16 @@ function isOidcConfigured() { } return false } - +function isAutoLoginEnabled() { + if (!getGlobalSetting('enableOpenIDConnect')) { + return false + } + const configuration = ServiceConfiguration.configurations.findOne({ service: SERVICE_NAME }) + if (configuration === undefined) { + return false + } + return configuration.autoInitiateLogin +} function disableDefaultLoginForm() { if (!getGlobalSetting('enableOpenIDConnect')) { return false @@ -61,5 +76,5 @@ function getOidcConfiguration(name) { return '' } export { - oidcFields, isOidcConfigured, disableDefaultLoginForm, getOidcConfiguration, + oidcFields, isOidcConfigured, disableDefaultLoginForm, getOidcConfiguration, isAutoLoginEnabled } diff --git a/package-lock.json b/package-lock.json index d53ae479..3ad766eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "titra", - "version": "0.99.21", + "version": "0.99.26", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "titra", - "version": "0.99.21", + "version": "0.99.26", "dependencies": { "@babel/runtime": "^7.26.0", "@dashboardcode/bsmultiselect": "^1.1.18", @@ -21,7 +21,7 @@ "bootstrap": "^5.3.3", "cl-editor": "^2.3.0", "content-type": "^1.0.5", - "date-holidays": "^3.23.13", + "date-holidays": "^3.23.14", "dayjs": "^1.11.13", "dayjs-precise-range": "^1.0.1", "docker-names": "^1.2.1", @@ -29,7 +29,7 @@ "frappe-charts": "1.6.2", "frappe-datatable": "^1.17.16", "frappe-gantt": "^0.6.1", - "hotkeys-js": "^3.13.7", + "hotkeys-js": "^3.13.9", "is-dark": "^1.0.4", "jquery": "3.7.1", "jquery-serializejson": "^3.2.1", @@ -37,7 +37,7 @@ "math-expression-evaluator": "^2.0.6", "meteor-node-stubs": "^1.2.12", "namedavatar": "^1.2.0", - "node-emoji": "^2.1.3", + "node-emoji": "^2.2.0", "quill-delta-to-html": "^0.12.1", "randomcolor": "^0.6.2", "raw-body": "^3.0.0", @@ -1108,12 +1108,12 @@ } }, "node_modules/date-holidays": { - "version": "3.23.13", - "resolved": "https://registry.npmjs.org/date-holidays/-/date-holidays-3.23.13.tgz", - "integrity": "sha512-nH+49imIxbn2LsCrOIcY5cNMS7fw0J6fqy/AZ5u8BM34uM68/92dVJ8EoaCUPsZHKlK4gkLkhkBoPMbQdpWPDA==", + "version": "3.23.14", + "resolved": "https://registry.npmjs.org/date-holidays/-/date-holidays-3.23.14.tgz", + "integrity": "sha512-KSYj5VkprA81ojdVkoyIBn9uHYPs9LAZt/iUiYBpICJ2/HkWI/OV9pfYl+MqZSBRtS0aLU3RE0Rc6heTuzcM3Q==", "license": "(ISC AND CC-BY-3.0)", "dependencies": { - "date-holidays-parser": "^3.4.4", + "date-holidays-parser": "^3.4.6", "js-yaml": "^4.1.0", "lodash": "^4.17.21", "prepin": "^1.0.3" @@ -1126,9 +1126,9 @@ } }, "node_modules/date-holidays-parser": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/date-holidays-parser/-/date-holidays-parser-3.4.5.tgz", - "integrity": "sha512-2mapfhWeqFUTc89X47/YXXrfu/mjjbl0Np+K6zfWmH6EREMm5okotibX/5zevdL43da1XMKezQKJ5Q+ZPFbSvw==", + "version": "3.4.6", + "resolved": "https://registry.npmjs.org/date-holidays-parser/-/date-holidays-parser-3.4.6.tgz", + "integrity": "sha512-qTuO7061IOyOAafjuKJIld4pBe5BhjdKyAayUgoYBaB+7aFnsdraeDLBS0WJpCALcw/RqyG8emoFuSgirW+c7w==", "license": "ISC", "dependencies": { "astronomia": "^4.1.1", @@ -2391,9 +2391,9 @@ } }, "node_modules/hotkeys-js": { - "version": "3.13.7", - "resolved": "https://registry.npmjs.org/hotkeys-js/-/hotkeys-js-3.13.7.tgz", - "integrity": "sha512-ygFIdTqqwG4fFP7kkiYlvayZppeIQX2aPpirsngkv1xM1lP0piDY5QEh68nQnIKvz64hfocxhBaD/uK3sSK1yQ==", + "version": "3.13.9", + "resolved": "https://registry.npmjs.org/hotkeys-js/-/hotkeys-js-3.13.9.tgz", + "integrity": "sha512-3TRCj9u9KUH6cKo25w4KIdBfdBfNRjfUwrljCLDC2XhmPDG0SjAZFcFZekpUZFmXzfYoGhFDcdx2gX/vUVtztQ==", "license": "MIT", "funding": { "url": "https://jaywcjlove.github.io/#/sponsor" @@ -4459,9 +4459,9 @@ "license": "MIT" }, "node_modules/node-emoji": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", - "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", "license": "MIT", "dependencies": { "@sindresorhus/is": "^4.6.0", @@ -4817,6 +4817,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" diff --git a/package.json b/package.json index eb919cf0..ee0a7700 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "titra", - "version": "0.99.26", + "version": "0.99.27", "private": true, "scripts": { "start": "meteor run" @@ -19,7 +19,7 @@ "bootstrap": "^5.3.3", "cl-editor": "^2.3.0", "content-type": "^1.0.5", - "date-holidays": "^3.23.13", + "date-holidays": "^3.23.14", "dayjs": "^1.11.13", "dayjs-precise-range": "^1.0.1", "docker-names": "^1.2.1", @@ -27,7 +27,7 @@ "frappe-charts": "1.6.2", "frappe-datatable": "^1.17.16", "frappe-gantt": "^0.6.1", - "hotkeys-js": "^3.13.7", + "hotkeys-js": "^3.13.9", "is-dark": "^1.0.4", "jquery": "3.7.1", "jquery-serializejson": "^3.2.1", @@ -35,7 +35,7 @@ "math-expression-evaluator": "^2.0.6", "meteor-node-stubs": "^1.2.12", "namedavatar": "^1.2.0", - "node-emoji": "^2.1.3", + "node-emoji": "^2.2.0", "quill-delta-to-html": "^0.12.1", "randomcolor": "^0.6.2", "raw-body": "^3.0.0",