From 6bd0a0ee1f3764e7936af8a18ba374bf726f2f02 Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Tue, 4 Jul 2023 16:00:38 +0300 Subject: [PATCH] update vis --- .../Crm/Resources/metadata/app/jsLibs.json | 12 +- .../crm/src/views/calendar/calendar-page.js | 12 +- .../crm/src/views/calendar/timeline.js | 192 +++------------ .../crm/src/views/scheduler/scheduler.js | 38 +-- frontend/bundle-config.json | 6 +- frontend/libs.json | 12 +- package-lock.json | 227 +++++++++++++++--- package.json | 3 +- 8 files changed, 284 insertions(+), 218 deletions(-) diff --git a/application/Espo/Modules/Crm/Resources/metadata/app/jsLibs.json b/application/Espo/Modules/Crm/Resources/metadata/app/jsLibs.json index 6c184f6f41..031ffd7e83 100644 --- a/application/Espo/Modules/Crm/Resources/metadata/app/jsLibs.json +++ b/application/Espo/Modules/Crm/Resources/metadata/app/jsLibs.json @@ -20,9 +20,15 @@ "exportsAs": "MomentTimezone", "sourceMap": true }, - "vis": { - "path": "client/modules/crm/lib/vis.js", - "devPath": "client/modules/crm/lib/original/vis.js", + "vis-timeline": { + "path": "client/modules/crm/lib/vis-timeline.js", + "devPath": "client/modules/crm/lib/original/vis-timeline.js", + "sourceMap": true + }, + "vis-data": { + "path": "client/modules/crm/lib/vis-data.js", + "devPath": "client/modules/crm/lib/original/vis-data.js", + "aliases": ["vis-data/peer/umd/vis-data.js"], "sourceMap": true } } diff --git a/client/modules/crm/src/views/calendar/calendar-page.js b/client/modules/crm/src/views/calendar/calendar-page.js index 4c907d648c..284d730a1e 100644 --- a/client/modules/crm/src/views/calendar/calendar-page.js +++ b/client/modules/crm/src/views/calendar/calendar-page.js @@ -181,7 +181,7 @@ define('crm:views/calendar/calendar-page', ['view'], function (Dep) { url += '&userId=' + this.options.userId; if (this.options.userName) { - url += '&userName=' + this.getHelper().escapeString(this.options.userName).replace(/\\|\//g,''); + url += '&userName=' + encodeURIComponent(this.options.userName); } } @@ -243,12 +243,18 @@ define('crm:views/calendar/calendar-page', ['view'], function (Dep) { userId: this.options.userId, userName: this.options.userName, el: '#main > .calendar-container', - }, (view) => { + }, view => { + let initial = true; + this.listenTo(view, 'view', (date, mode) => { this.date = date; this.mode = mode; - this.updateUrl(); + if (!initial) { + this.updateUrl(); + } + + initial = false; }); this.listenTo(view, 'change:mode', (mode) => { diff --git a/client/modules/crm/src/views/calendar/timeline.js b/client/modules/crm/src/views/calendar/timeline.js index 4dc409d0ef..63fbf11a81 100644 --- a/client/modules/crm/src/views/calendar/timeline.js +++ b/client/modules/crm/src/views/calendar/timeline.js @@ -27,7 +27,8 @@ ************************************************************************/ import View from 'view'; -import Vis from 'vis'; +import {DataSet} from 'vis-data'; +import {Timeline} from 'vis-timeline'; import moment from 'moment'; import $ from 'jquery'; @@ -49,6 +50,9 @@ class TimelineView extends View { calendarTypeList = ['single', 'shared'] zoomPercentage = 1 + /** @type {Timeline} */ + timeline + events = { /** @this TimelineView */ 'click button[data-action="today"]': function () { @@ -220,79 +224,6 @@ class TimelineView extends View { this.trigger('change:mode', mode); } - /*getModeDataList() { - let list = []; - - this.modeList.forEach(name => { - let o = { - mode: name, - label: this.translate(name, 'modes', 'Calendar'), - labelShort: this.translate(name, 'modes', 'Calendar').substring(0, 2), - }; - - list.push(o); - }); - - if (this.isCustomViewAvailable) { - (this.getPreferences().get('calendarViewDataList') || []).forEach((item) => { - item = Espo.Utils.clone(item); - - item.mode = 'view-' + item.id; - item.label = item.name; - item.labelShort = (item.name || '').substring(0, 2); - - list.push(item); - }); - } - - let currentIndex = -1; - - list.forEach((item, i) => { - if (item.mode === this.mode) { - currentIndex = i; - } - }); - - if (currentIndex >= this.visibleModeListCount) { - let tmp = list[this.visibleModeListCount - 1]; - - list[this.visibleModeListCount - 1] = list[currentIndex]; - list[currentIndex] = tmp; - } - - return list; - }*/ - - /*getVisibleModeDataList() { - let fullList = this.getModeDataList(); - let list = []; - - fullList.forEach((o, i) => { - if (i >= this.visibleModeListCount) { - return; - } - - list.push(o); - }); - - return list; - }*/ - - /*getHiddenModeDataList() { - let fullList = this.getModeDataList(); - let list = []; - - fullList.forEach((o, i) => { - if (i < this.visibleModeListCount) { - return; - } - - list.push(o); - }); - - return list; - }*/ - getCalendarTypeDataList() { let list = []; @@ -375,16 +306,6 @@ class TimelineView extends View { this.getStorage().set('state', key, enabledScopeList); } - /*updateDate() { - if (!this.header) { - return; - } - - let title = this.getTitle(); - - this.$el.find('.date-title h4 span').text(title); - }*/ - getTitle() { let title = ''; @@ -397,6 +318,10 @@ class TimelineView extends View { return title; } + /** + * @param {Object.} o + * @return {Object} + */ convertEvent(o) { let userId = o.userId || this.userList[0].id || this.getUser().id; @@ -591,20 +516,6 @@ class TimelineView extends View { return resultList; } - /*convertTime(d) { - let format = this.getDateTime().internalDateTimeFormat; - let timeZone = this.getDateTime().timeZone; - let string = d.format(format); - - let m; - - m = timeZone ? - moment.tz(string, format, timeZone).utc() : - moment.utc(string, format); - - return m.format(format) + ':00'; - }*/ - afterRender() { if (this.options.containerSelector) { this.$container = $(this.options.containerSelector); @@ -616,13 +527,18 @@ class TimelineView extends View { this.initDates(); this.initGroupsDataSet(); - this.fetchEvents(this.start, this.end, (eventList) => { - let itemsDataSet = new Vis.DataSet(eventList); + this.fetchEvents(this.start, this.end, eventList => { + let itemsDataSet = new DataSet(eventList); - let timeline = this.timeline = new Vis.Timeline($timeline.get(0), itemsDataSet, this.groupsDataSet, { + this.timeline = new Timeline($timeline.get(0), itemsDataSet, this.groupsDataSet, { dataAttributes: 'all', start: this.start.toDate(), end: this.end.toDate(), + xss: { + filterOptions: { + onTag: (tag, html) => html, + }, + }, moment: date => { let m = moment(date); @@ -641,15 +557,15 @@ class TimelineView extends View { add: false, updateTime: false, updateGroup: false, - remove: false + remove: false, }, locales: { - mylocale: { + myLocale: { current: this.translate('current', 'labels', 'Calendar'), - time: this.translate('time', 'labels', 'Calendar') + time: this.translate('time', 'labels', 'Calendar'), } }, - locale: 'mylocale', + locale: 'myLocale', margin: { item: { vertical: 12, @@ -658,7 +574,7 @@ class TimelineView extends View { }, }); - timeline.on('click', (e) => { + this.timeline.on('click', e => { if (this.blockClick) { return; } @@ -682,7 +598,8 @@ class TimelineView extends View { } }); - timeline.on('rangechanged', (e) =>{ + // noinspection SpellCheckingInspection + this.timeline.on('rangechanged', e => { e.skipClick = true; this.blockClick = true; @@ -705,15 +622,15 @@ class TimelineView extends View { }); this.once('remove', () => { - timeline.destroy(); + this.timeline.destroy(); }); }); } createEvent(dateStart, userId) { if (!dateStart) { - let time = (this.timeline.range.end - this.timeline.range.start) / 2 + - this.timeline.range.start; + let time = (this.timeline.getWindow().end - this.timeline.getWindow().start) / 2 + + this.timeline.getWindow().start; dateStart = moment(time) .utc() @@ -789,7 +706,7 @@ class TimelineView extends View { runFetch() { this.fetchEvents(this.start, this.end, eventList => { - let itemsDataSet = new Vis.DataSet(eventList); + let itemsDataSet = new DataSet(eventList); this.timeline.setItems(itemsDataSet); this.triggerView(); @@ -876,22 +793,6 @@ class TimelineView extends View { } } - /*orderUserList(list) { - let userList = []; - - list.forEach(id => { - this.userList.forEach(item => { - if (id === item.id) { - userList.push(item); - } - }); - }); - - this.userList = userList; - - this.storeUserList(); - }*/ - storeUserList() { this.getPreferences().save({ 'sharedCalendarUserList': Espo.Utils.clone(this.userList), @@ -921,21 +822,6 @@ class TimelineView extends View { } } - /*removeSharedCalendarUser(id) { - let index = -1; - - this.userList.forEach((item, i) => { - if (item.id === id) { - index = i; - } - }); - - if (~index) { - this.userList.splice(index, 1); - this.storeUserList(); - } - }*/ - getSharedCalenderUserList() { let list = Espo.Utils.clone(this.getPreferences().get('sharedCalendarUserList')); @@ -984,7 +870,7 @@ class TimelineView extends View { }); }); - this.groupsDataSet = new Vis.DataSet(list); + this.groupsDataSet = new DataSet(list); } getGroupContent(id, name) { @@ -1030,10 +916,6 @@ class TimelineView extends View { .get(0).outerHTML; } - /*initItemsDataSet() { - this.itemsDataSet = new Vis.DataSet(list); - }*/ - fetchEvents(from, to, callback) { if (!this.options.noFetchLoadingMessage) { Espo.Ui.notify(' ... '); @@ -1083,12 +965,6 @@ class TimelineView extends View { }); } - /*removeUser(id) { - this.removeSharedCalendarUser(id); - this.initGroupsDataSet(); - this.timeline.setGroups(this.groupsDataSet); - }*/ - actionShowSharedCalendarOptions() { this.createView('dialog', 'crm:views/calendar/modals/shared-options', { userList: this.userList, @@ -1179,19 +1055,23 @@ class TimelineView extends View { } actionPrevious() { - this.timeline.moveTo(this.timeline.range.start); + let start = this.timeline.getWindow().start; + + this.timeline.moveTo(start); this.triggerView(); } actionNext() { - this.timeline.moveTo(this.timeline.range.end); + let end = this.timeline.getWindow().end; + + this.timeline.moveTo(end); this.triggerView(); } actionToday() { - this.timeline.moveTo(moment()); + this.timeline.moveTo(moment().toDate()); this.triggerView(); } diff --git a/client/modules/crm/src/views/scheduler/scheduler.js b/client/modules/crm/src/views/scheduler/scheduler.js index 84c50f30b7..a86f89d9fa 100644 --- a/client/modules/crm/src/views/scheduler/scheduler.js +++ b/client/modules/crm/src/views/scheduler/scheduler.js @@ -27,7 +27,8 @@ ************************************************************************/ import View from 'view'; -import Vis from 'vis'; +import {DataSet} from 'vis-data'; +import {Timeline} from 'vis-timeline'; import moment from 'moment'; import $ from 'jquery'; @@ -66,8 +67,6 @@ class SchedulerView extends View { this.usersField = this.options.usersField || usersFieldDefault; this.userIdList = []; - this.Vis = Vis; - this.listenTo(this.model, 'change', (m) => { let isChanged = m.hasChanged('isAllDay') || @@ -176,9 +175,10 @@ class SchedulerView extends View { } this.fetch(this.start, this.end, eventList => { - let itemsDataSet = new Vis.DataSet(eventList); + let itemsDataSet = new DataSet(eventList); - let timeline = this.timeline =new Vis.Timeline($timeline.get(0), itemsDataSet, this.groupsDataSet, { + // noinspection SpellCheckingInspection + this.timeline = new Timeline($timeline.get(0), itemsDataSet, this.groupsDataSet, { dataAttributes: 'all', start: this.start.toDate(), end: this.end.toDate(), @@ -191,6 +191,11 @@ class SchedulerView extends View { return m.tz(this.getDateTime().getTimeZone()); }, + xss: { + filterOptions: { + onTag: (tag, html) => html, + }, + }, format: this.getFormatObject(), zoomable: false, moveable: true, @@ -204,12 +209,12 @@ class SchedulerView extends View { }, showCurrentTime: true, locales: { - mylocale: { + myLocale: { current: this.translate('current', 'labels', 'Calendar'), - time: this.translate('time', 'labels', 'Calendar') + time: this.translate('time', 'labels', 'Calendar'), } }, - locale: 'mylocale', + locale: 'myLocale', margin: { item: { vertical: 12, @@ -220,7 +225,8 @@ class SchedulerView extends View { $timeline.css('min-height', ''); - timeline.on('rangechanged', (e) => { + // noinspection SpellCheckingInspection + this.timeline.on('rangechanged', (e) => { e.skipClick = true; this.blockClick = true; @@ -245,7 +251,7 @@ class SchedulerView extends View { let convertedEventList = this.convertEventList(eventList); this.addEvent(convertedEventList); - let itemsDataSet = new this.Vis.DataSet(convertedEventList); + let itemsDataSet = new DataSet(convertedEventList); this.timeline.setItems(itemsDataSet); } @@ -311,7 +317,7 @@ class SchedulerView extends View { runFetch() { this.fetch(this.start, this.end, eventList => { - let itemsDataSet = new this.Vis.DataSet(eventList); + let itemsDataSet = new DataSet(eventList); this.timeline.setItems(itemsDataSet); }); @@ -340,7 +346,7 @@ class SchedulerView extends View { let eventList = []; for (let userId in data) { - let itemList = data[userId] + let itemList = /** @type {Object.} */data[userId] .filter(item => !item.isBusyRange) .concat( data[userId].filter(item => item.isBusyRange) @@ -417,6 +423,10 @@ class SchedulerView extends View { return resultList; } + /** + * @param {Object.} o + * @return {Object} + */ convertEvent(o) { let event; @@ -500,7 +510,7 @@ class SchedulerView extends View { }); }); - this.groupsDataSet = new this.Vis.DataSet(list); + this.groupsDataSet = new DataSet(list); } getGroupContent(id, name) { @@ -518,7 +528,7 @@ class SchedulerView extends View { return $('') .append( - avatarHtml, + $(avatarHtml), $('') .attr('data-id', id) .addClass('group-title') diff --git a/frontend/bundle-config.json b/frontend/bundle-config.json index da0c1ed283..56750593f5 100644 --- a/frontend/bundle-config.json +++ b/frontend/bundle-config.json @@ -105,10 +105,12 @@ "modules/crm/src/**/*.js" ], "dependentOn": [ - "vis" + "vis-data", + "vis-timeline" ], "requires": [ - "vis" + "vis-data", + "vis-timeline" ], "lookupPatterns": [ "modules/crm/src/**/*.js" diff --git a/frontend/libs.json b/frontend/libs.json index 0e74cc5452..f59eab6be0 100644 --- a/frontend/libs.json +++ b/frontend/libs.json @@ -198,9 +198,15 @@ "amdId": "@fullcalendar/moment-timezone" }, { - "src": "node_modules/vis/dist/vis.js", - "dest": "client/modules/crm/lib/vis.js", + "src": "node_modules/vis-timeline/peer/umd/vis-timeline-graph2d.js", + "dest": "client/modules/crm/lib/vis-timeline.js", "minify": true, - "amdId": "vis" + "amdId": "vis-timeline" + }, + { + "src": "node_modules/vis-data/peer/umd/vis-data.js", + "dest": "client/modules/crm/lib/vis-data.js", + "minify": true, + "amdId": "vis-data" } ] diff --git a/package-lock.json b/package-lock.json index a41c1a2885..7062ab63a1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,8 @@ "summernote": "^0.8.18", "timepicker": "^1.11.15", "underscore": "^1.13.1", - "vis": "^4.19.1" + "vis-data": "^7.1.6", + "vis-timeline": "^7.7.2" }, "devDependencies": { "archiver": "^5.3.0", @@ -1917,6 +1918,18 @@ "node": ">=6.9.0" } }, + "node_modules/@egjs/hammerjs": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@egjs/hammerjs/-/hammerjs-2.0.17.tgz", + "integrity": "sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==", + "peer": true, + "dependencies": { + "@types/hammerjs": "^2.0.36" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/@fullcalendar/core": { "version": "6.1.8", "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-6.1.8.tgz", @@ -2108,6 +2121,12 @@ "sifter": "bin/sifter.js" } }, + "node_modules/@types/hammerjs": { + "version": "2.0.41", + "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.41.tgz", + "integrity": "sha512-ewXv/ceBaJprikMcxCmWU1FKyMAQ2X7a9Gtmzw8fcg2kIePI1crERDM818W+XYrxqdBBOdlf2rm137bU+BltCA==", + "peer": true + }, "node_modules/@types/jquery": { "version": "2.0.56", "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-2.0.56.tgz", @@ -2775,6 +2794,12 @@ "node": ">= 6" } }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "peer": true + }, "node_modules/compress-commons": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", @@ -3002,6 +3027,12 @@ "node": ">=10.13" } }, + "node_modules/cssfilter": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", + "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==", + "peer": true + }, "node_modules/csv-parse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-5.3.0.tgz", @@ -3104,11 +3135,6 @@ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.419.tgz", "integrity": "sha512-jdie3RiEgygvDTyS2sgjq71B36q2cDSBfPlwzUyuOrfYTNoYWyBxxjGJV/HAu3A2hB0Y+HesvCVkVAFoCKwCSw==" }, - "node_modules/emitter-component": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/emitter-component/-/emitter-component-1.1.1.tgz", - "integrity": "sha1-Bl4tvtaVm/RwZ57avq95gdEAOrY=" - }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -4573,6 +4599,7 @@ "version": "2.0.8", "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=", + "peer": true, "engines": { "node": ">=0.8.0" } @@ -5194,7 +5221,8 @@ "node_modules/keycharm": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/keycharm/-/keycharm-0.2.0.tgz", - "integrity": "sha1-+m6i5DuQpoAohD0n8gddNajD5vk=" + "integrity": "sha1-+m6i5DuQpoAohD0n8gddNajD5vk=", + "peer": true }, "node_modules/kind-of": { "version": "6.0.3", @@ -6038,6 +6066,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/propagating-hammerjs/-/propagating-hammerjs-1.5.0.tgz", "integrity": "sha512-3PUXWmomwutoZfydC+lJwK1bKCh6sK6jZGB31RUX6+4EXzsbkDZrK4/sVR7gBrvJaEIwpTVyxQUAd29FKkmVdw==", + "peer": true, "dependencies": { "hammerjs": "^2.0.8" } @@ -6988,6 +7017,15 @@ "node": ">= 0.4.0" } }, + "node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/v8flags": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", @@ -7008,17 +7046,56 @@ "node": ">= 0.8" } }, - "node_modules/vis": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/vis/-/vis-4.19.1.tgz", - "integrity": "sha1-XO9OcuHwNypOWrUCUjuIaHseICc=", - "deprecated": "Please consider using https://github.com/visjs", - "dependencies": { - "emitter-component": "^1.1.1", - "hammerjs": "^2.0.8", - "keycharm": "^0.2.0", - "moment": "^2.17.1", - "propagating-hammerjs": "^1.4.6" + "node_modules/vis-data": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/vis-data/-/vis-data-7.1.6.tgz", + "integrity": "sha512-lG7LJdkawlKSXsdcEkxe/zRDyW29a4r7N7PMwxCPxK12/QIdqxJwcMxwjVj9ozdisRhP5TyWDHZwsgjmj0g6Dg==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/visjs" + }, + "peerDependencies": { + "uuid": "^3.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "vis-util": "^5.0.1" + } + }, + "node_modules/vis-timeline": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/vis-timeline/-/vis-timeline-7.7.2.tgz", + "integrity": "sha512-l7hDBFJ0FI6gX4kzsxAONnAacowK3sHWx3uc5jR1DYs/FAsOEZsHDclVNW3+QAwmV3Xvg61U8//ha6hZNw7G1Q==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/visjs" + }, + "peerDependencies": { + "@egjs/hammerjs": "^2.0.0", + "component-emitter": "^1.3.0", + "keycharm": "^0.2.0 || ^0.3.0 || ^0.4.0", + "moment": "^2.24.0", + "propagating-hammerjs": "^1.4.0 || ^2.0.0", + "uuid": "^3.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "vis-data": "^6.3.0 || ^7.0.0", + "vis-util": "^5.0.1", + "xss": "^1.0.0" + } + }, + "node_modules/vis-util": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vis-util/-/vis-util-5.0.3.tgz", + "integrity": "sha512-Wf9STUcFrDzK4/Zr7B6epW2Kvm3ORNWF+WiwEz2dpf5RdWkLUXFSbLcuB88n1W6tCdFwVN+v3V4/Xmn9PeL39g==", + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/visjs" + }, + "peerDependencies": { + "@egjs/hammerjs": "^2.0.0", + "component-emitter": "^1.3.0" } }, "node_modules/which": { @@ -7211,6 +7288,28 @@ } } }, + "node_modules/xss": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.14.tgz", + "integrity": "sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==", + "peer": true, + "dependencies": { + "commander": "^2.20.3", + "cssfilter": "0.0.10" + }, + "bin": { + "xss": "bin/xss" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/xss/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "peer": true + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -8526,6 +8625,15 @@ "to-fast-properties": "^2.0.0" } }, + "@egjs/hammerjs": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@egjs/hammerjs/-/hammerjs-2.0.17.tgz", + "integrity": "sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==", + "peer": true, + "requires": { + "@types/hammerjs": "^2.0.36" + } + }, "@fullcalendar/core": { "version": "6.1.8", "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-6.1.8.tgz", @@ -8671,6 +8779,12 @@ "optimist": "^0.5.2" } }, + "@types/hammerjs": { + "version": "2.0.41", + "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.41.tgz", + "integrity": "sha512-ewXv/ceBaJprikMcxCmWU1FKyMAQ2X7a9Gtmzw8fcg2kIePI1crERDM818W+XYrxqdBBOdlf2rm137bU+BltCA==", + "peer": true + }, "@types/jquery": { "version": "2.0.56", "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-2.0.56.tgz", @@ -9170,6 +9284,12 @@ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "peer": true + }, "compress-commons": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", @@ -9345,6 +9465,12 @@ "coffeescript": "1.12.7" } }, + "cssfilter": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", + "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==", + "peer": true + }, "csv-parse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-5.3.0.tgz", @@ -9428,11 +9554,6 @@ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.419.tgz", "integrity": "sha512-jdie3RiEgygvDTyS2sgjq71B36q2cDSBfPlwzUyuOrfYTNoYWyBxxjGJV/HAu3A2hB0Y+HesvCVkVAFoCKwCSw==" }, - "emitter-component": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/emitter-component/-/emitter-component-1.1.1.tgz", - "integrity": "sha1-Bl4tvtaVm/RwZ57avq95gdEAOrY=" - }, "emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -10536,7 +10657,8 @@ "hammerjs": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", - "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=" + "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=", + "peer": true }, "handlebars": { "version": "4.7.7", @@ -10945,7 +11067,8 @@ "keycharm": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/keycharm/-/keycharm-0.2.0.tgz", - "integrity": "sha1-+m6i5DuQpoAohD0n8gddNajD5vk=" + "integrity": "sha1-+m6i5DuQpoAohD0n8gddNajD5vk=", + "peer": true }, "kind-of": { "version": "6.0.3", @@ -11574,6 +11697,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/propagating-hammerjs/-/propagating-hammerjs-1.5.0.tgz", "integrity": "sha512-3PUXWmomwutoZfydC+lJwK1bKCh6sK6jZGB31RUX6+4EXzsbkDZrK4/sVR7gBrvJaEIwpTVyxQUAd29FKkmVdw==", + "peer": true, "requires": { "hammerjs": "^2.0.8" } @@ -12293,6 +12417,12 @@ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true }, + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "peer": true + }, "v8flags": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", @@ -12307,17 +12437,24 @@ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true }, - "vis": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/vis/-/vis-4.19.1.tgz", - "integrity": "sha1-XO9OcuHwNypOWrUCUjuIaHseICc=", - "requires": { - "emitter-component": "^1.1.1", - "hammerjs": "^2.0.8", - "keycharm": "^0.2.0", - "moment": "^2.17.1", - "propagating-hammerjs": "^1.4.6" - } + "vis-data": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/vis-data/-/vis-data-7.1.6.tgz", + "integrity": "sha512-lG7LJdkawlKSXsdcEkxe/zRDyW29a4r7N7PMwxCPxK12/QIdqxJwcMxwjVj9ozdisRhP5TyWDHZwsgjmj0g6Dg==", + "requires": {} + }, + "vis-timeline": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/vis-timeline/-/vis-timeline-7.7.2.tgz", + "integrity": "sha512-l7hDBFJ0FI6gX4kzsxAONnAacowK3sHWx3uc5jR1DYs/FAsOEZsHDclVNW3+QAwmV3Xvg61U8//ha6hZNw7G1Q==", + "requires": {} + }, + "vis-util": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vis-util/-/vis-util-5.0.3.tgz", + "integrity": "sha512-Wf9STUcFrDzK4/Zr7B6epW2Kvm3ORNWF+WiwEz2dpf5RdWkLUXFSbLcuB88n1W6tCdFwVN+v3V4/Xmn9PeL39g==", + "peer": true, + "requires": {} }, "which": { "version": "1.3.1", @@ -12447,6 +12584,24 @@ "dev": true, "requires": {} }, + "xss": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.14.tgz", + "integrity": "sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==", + "peer": true, + "requires": { + "commander": "^2.20.3", + "cssfilter": "0.0.10" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "peer": true + } + } + }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", diff --git a/package.json b/package.json index 7aafdab746..e97f651ff1 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,8 @@ "summernote": "^0.8.18", "timepicker": "^1.11.15", "underscore": "^1.13.1", - "vis": "^4.19.1" + "vis-data": "^7.1.6", + "vis-timeline": "^7.7.2" }, "engines": { "npm": ">=7",