diff --git a/package-lock.json b/package-lock.json index 2f87a8760653c15b2673273b8bb7b5dd795b9693..1da8b2f7a97339102c24eacb37372840ca0f22ec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,7 +40,7 @@ "@vue/cli-plugin-vuex": "~5.0.0", "@vue/cli-service": "~5.0.0", "@vue/test-utils": "^2.0.0-0", - "@vue/vue3-jest": "^27.0.0-alpha.1", + "@vue/vue3-jest": "^27.0.0", "autoprefixer": "^10.4.4", "babel-jest": "^27.0.6", "eslint": "^7.32.0", @@ -4070,14 +4070,15 @@ "license": "MIT" }, "node_modules/@vue/vue3-jest": { - "version": "27.0.0-alpha.4", + "version": "27.0.0", + "resolved": "https://registry.npmjs.org/@vue/vue3-jest/-/vue3-jest-27.0.0.tgz", + "integrity": "sha512-VL61CgZBoQqayXfzlZJHHpZuX4lsT8dmdZMJzADhdAJjKu26JBpypHr/2ppevxItljPiuALQW4MKhhCXZRXnLg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/plugin-transform-modules-commonjs": "^7.2.0", "chalk": "^2.1.0", "convert-source-map": "^1.6.0", - "extract-from-css": "^0.4.4", + "css-tree": "^2.0.1", "source-map": "0.5.6", "tsconfig": "^7.0.0" }, @@ -4098,6 +4099,26 @@ } } }, + "node_modules/@vue/vue3-jest/node_modules/css-tree": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.1.0.tgz", + "integrity": "sha512-PcysZRzToBbrpoUrZ9qfblRIRf8zbEAkU0AIpQFtgkFK0vSbzOmBCvdSAx2Zg7Xx5wiYJKUKk0NMP7kxevie/A==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.27", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@vue/vue3-jest/node_modules/mdn-data": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.27.tgz", + "integrity": "sha512-kwqO0I0jtWr25KcfLm9pia8vLZ8qoAKhWZuZMbneJq3jjBD3gl5nZs8l8Tu3ZBlBAHVQtDur9rdDGyvtfVraHQ==", + "dev": true + }, "node_modules/@vue/vue3-jest/node_modules/source-map": { "version": "0.5.6", "dev": true, @@ -4650,17 +4671,6 @@ "node": ">= 4.0.0" } }, - "node_modules/atob": { - "version": "2.1.2", - "dev": true, - "license": "(MIT OR Apache-2.0)", - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, "node_modules/autoprefixer": { "version": "10.4.4", "dev": true, @@ -5876,17 +5886,6 @@ "semver": "bin/semver" } }, - "node_modules/css": { - "version": "2.2.4", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - } - }, "node_modules/css-declaration-sorter": { "version": "6.2.2", "dev": true, @@ -6077,14 +6076,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/css/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/cssesc": { "version": "3.0.0", "license": "MIT", @@ -6256,14 +6247,6 @@ "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", "dev": true }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, "node_modules/dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", @@ -7636,18 +7619,6 @@ "node": ">=0.10.0" } }, - "node_modules/extract-from-css": { - "version": "0.4.4", - "dev": true, - "license": "MIT", - "dependencies": { - "css": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0", - "npm": ">=2.0.0" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "dev": true, @@ -13277,11 +13248,6 @@ "node": ">=8" } }, - "node_modules/resolve-url": { - "version": "0.2.1", - "dev": true, - "license": "MIT" - }, "node_modules/resolve.exports": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", @@ -13724,18 +13690,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "dev": true, - "license": "MIT", - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, "node_modules/source-map-support": { "version": "0.5.21", "dev": true, @@ -13753,11 +13707,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-url": { - "version": "0.4.1", - "dev": true, - "license": "MIT" - }, "node_modules/sourcemap-codec": { "version": "1.4.8", "license": "MIT" @@ -14620,11 +14569,6 @@ "punycode": "^2.1.0" } }, - "node_modules/urix": { - "version": "0.1.0", - "dev": true, - "license": "MIT" - }, "node_modules/url-parse": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", @@ -18609,17 +18553,35 @@ } }, "@vue/vue3-jest": { - "version": "27.0.0-alpha.4", + "version": "27.0.0", + "resolved": "https://registry.npmjs.org/@vue/vue3-jest/-/vue3-jest-27.0.0.tgz", + "integrity": "sha512-VL61CgZBoQqayXfzlZJHHpZuX4lsT8dmdZMJzADhdAJjKu26JBpypHr/2ppevxItljPiuALQW4MKhhCXZRXnLg==", "dev": true, "requires": { "@babel/plugin-transform-modules-commonjs": "^7.2.0", "chalk": "^2.1.0", "convert-source-map": "^1.6.0", - "extract-from-css": "^0.4.4", + "css-tree": "^2.0.1", "source-map": "0.5.6", "tsconfig": "^7.0.0" }, "dependencies": { + "css-tree": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.1.0.tgz", + "integrity": "sha512-PcysZRzToBbrpoUrZ9qfblRIRf8zbEAkU0AIpQFtgkFK0vSbzOmBCvdSAx2Zg7Xx5wiYJKUKk0NMP7kxevie/A==", + "dev": true, + "requires": { + "mdn-data": "2.0.27", + "source-map-js": "^1.0.1" + } + }, + "mdn-data": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.27.tgz", + "integrity": "sha512-kwqO0I0jtWr25KcfLm9pia8vLZ8qoAKhWZuZMbneJq3jjBD3gl5nZs8l8Tu3ZBlBAHVQtDur9rdDGyvtfVraHQ==", + "dev": true + }, "source-map": { "version": "0.5.6", "dev": true @@ -18985,10 +18947,6 @@ "version": "1.0.0", "dev": true }, - "atob": { - "version": "2.1.2", - "dev": true - }, "autoprefixer": { "version": "10.4.4", "dev": true, @@ -19788,22 +19746,6 @@ } } }, - "css": { - "version": "2.2.4", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "dev": true - } - } - }, "css-declaration-sorter": { "version": "6.2.2", "dev": true, @@ -20031,10 +19973,6 @@ "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", "dev": true }, - "decode-uri-component": { - "version": "0.2.0", - "dev": true - }, "dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", @@ -20924,13 +20862,6 @@ "is-extendable": "^0.1.0" } }, - "extract-from-css": { - "version": "0.4.4", - "dev": true, - "requires": { - "css": "^2.1.0" - } - }, "fast-deep-equal": { "version": "3.1.3", "dev": true @@ -24642,10 +24573,6 @@ "version": "5.0.0", "dev": true }, - "resolve-url": { - "version": "0.2.1", - "dev": true - }, "resolve.exports": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", @@ -24953,17 +24880,6 @@ "source-map-js": { "version": "1.0.2" }, - "source-map-resolve": { - "version": "0.5.3", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, "source-map-support": { "version": "0.5.21", "dev": true, @@ -24978,10 +24894,6 @@ } } }, - "source-map-url": { - "version": "0.4.1", - "dev": true - }, "sourcemap-codec": { "version": "1.4.8" }, @@ -25567,10 +25479,6 @@ "punycode": "^2.1.0" } }, - "urix": { - "version": "0.1.0", - "dev": true - }, "url-parse": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", diff --git a/package.json b/package.json index 97312aebe6f2e7cb32032be5bf4f7416775d6ea9..574bdcba1eb86fdbaad3953478af4c00ec56313a 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "@vue/cli-plugin-vuex": "~5.0.0", "@vue/cli-service": "~5.0.0", "@vue/test-utils": "^2.0.0-0", - "@vue/vue3-jest": "^27.0.0-alpha.1", + "@vue/vue3-jest": "^27.0.0", "autoprefixer": "^10.4.4", "babel-jest": "^27.0.6", "eslint": "^7.32.0", diff --git a/src/components/ChatComponents/ChatMessage.vue b/src/components/ChatComponents/ChatMessage.vue index a918265c9e1b903c673af292938cd064eb631725..25aaf5cc00772c8eb024d837e9cdcfdc7a141ae0 100644 --- a/src/components/ChatComponents/ChatMessage.vue +++ b/src/components/ChatComponents/ChatMessage.vue @@ -56,35 +56,36 @@ export default { : "justify-end"; }, calculateTime() { - var time = this?.message.timestamp; - var date = new Date(time); - //Todo add timing for mm and hh and week of message - var mmOfMessage = String(date.getMinutes()); - var hhOfMessage = String(date.getHours()); - var ddOfMessage = String(date.getDate()).padStart(2, '0'); - var dayOfMessage = date.toLocaleString('default', { weekday: 'short' }); - var monthOfMessage = String(date.getMonth() + 1).padStart(2, '0'); //January is 0! - const shortMonthOfMessage = date.toLocaleString('default', { month: 'short' }); - var yyyyOfMessage = date.getFullYear(); + var time = this?.message.timestamp; + var date = new Date(time); + //Todo add timing for mm and hh and week of message + var mmOfMessage = String(date.getMinutes()); + var hhOfMessage = String(date.getHours()); + var ddOfMessage = String(date.getDate()).padStart(2, "0"); + var dayOfMessage = date.toLocaleString("default", { weekday: "short" }); + var monthOfMessage = String(date.getMonth() + 1).padStart(2, "0"); //January is 0! + const shortMonthOfMessage = date.toLocaleString("default", { + month: "short", + }); + var yyyyOfMessage = date.getFullYear(); - var today = new Date(); - var dd = String(today.getDate()).padStart(2, '0'); - var mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0! - var yyyy = today.getFullYear(); - if(ddOfMessage == dd){ + var today = new Date(); + var dd = String(today.getDate()).padStart(2, "0"); + var mm = String(today.getMonth() + 1).padStart(2, "0"); //January is 0! + var yyyy = today.getFullYear(); + if (ddOfMessage == dd) { return "" + hhOfMessage + ":" + mmOfMessage + ""; + } else if (this.isDateInThisWeek(date)) { + return "" + dayOfMessage + " " + hhOfMessage + ":" + mmOfMessage; + } else if (monthOfMessage == mm) { + return "" + ddOfMessage + " " + hhOfMessage + ":" + mmOfMessage; + } else if (yyyyOfMessage == yyyy) { + return "" + shortMonthOfMessage + " " + ddOfMessage; } - else if (this.isDateInThisWeek(date)){ - return "" +dayOfMessage + " " + hhOfMessage+":" + mmOfMessage; - } - else if (monthOfMessage == mm){ - return "" + ddOfMessage + " " + hhOfMessage + ":" + mmOfMessage; - } - else if (yyyyOfMessage == yyyy){ - return "" + shortMonthOfMessage + " " + ddOfMessage; - } - return shortMonthOfMessage + " " + ddOfMessage + " " + yyyyOfMessage + ""; - + return ( + shortMonthOfMessage + " " + ddOfMessage + " " + yyyyOfMessage + "" + ); + /* Take timestamp and display date when message was sent If message was sent this day show time (HH:MM) (13:00) @@ -93,23 +94,22 @@ export default { If message was sent this year show month and day of the month (MMM DD) (Jan 13) If message was sent more than a year ago show year with date (MMM DD YYYY) (Jan 13 2020) */ - }, isDateInThisWeek(date) { - const todayObj = new Date(); - const todayDate = todayObj.getDate(); - const todayDay = todayObj.getDay(); + const todayObj = new Date(); + const todayDate = todayObj.getDate(); + const todayDay = todayObj.getDay(); - // get first date of week - const firstDayOfWeek = new Date(todayObj.setDate(todayDate - todayDay)); + // get first date of week + const firstDayOfWeek = new Date(todayObj.setDate(todayDate - todayDay)); - // get last date of week - const lastDayOfWeek = new Date(firstDayOfWeek); - lastDayOfWeek.setDate(lastDayOfWeek.getDate() + 6); + // get last date of week + const lastDayOfWeek = new Date(firstDayOfWeek); + lastDayOfWeek.setDate(lastDayOfWeek.getDate() + 6); - // if date is equal or within the first and last dates of the week - return date >= firstDayOfWeek && date <= lastDayOfWeek; -}, - }, + // if date is equal or within the first and last dates of the week + return date >= firstDayOfWeek && date <= lastDayOfWeek; + }, + } }; </script> diff --git a/src/components/TimepickerComponents/DatepickerRange/CalendarComponent.vue b/src/components/TimepickerComponents/DatepickerRange/CalendarComponent.vue index 7ff418c29bec9efc5c40b2d424c1c0751563cd42..3dc900ba723e3ef0f6c600a186d37810540a0f07 100644 --- a/src/components/TimepickerComponents/DatepickerRange/CalendarComponent.vue +++ b/src/components/TimepickerComponents/DatepickerRange/CalendarComponent.vue @@ -98,7 +98,11 @@ export default { start.getMonth() <= this.monthDate.getMonth() && end.getMonth() >= this.monthDate.getMonth() ) { - if ( + if(start.getMonth() === this.monthDate.getMonth() && end.getMonth() === this.monthDate.getMonth()) { + for(let i = start.getDate(); i <= end.getDate(); i++) { + blockedDays.push(i); + } + } else if ( start.getMonth() < this.monthDate.getMonth() && end.getMonth() > this.monthDate.getMonth() ) { @@ -119,6 +123,7 @@ export default { } } } else { + console.log("WHAt WHAT!") // check that day is in this month const day = new Date(blockedDay[0]); if (day.getMonth() !== this.monthDate.getMonth()) return; diff --git a/src/components/TimepickerComponents/DatepickerRange/DatepickerRange.vue b/src/components/TimepickerComponents/DatepickerRange/DatepickerRange.vue index 49fd65dc1249dc57add5e7c73d69a60bca2a1736..9fe015ba1722a593be7a5b281332d77ac5495918 100644 --- a/src/components/TimepickerComponents/DatepickerRange/DatepickerRange.vue +++ b/src/components/TimepickerComponents/DatepickerRange/DatepickerRange.vue @@ -54,7 +54,12 @@ export default { }, blockedDaysRange: { type: Array, - default: () => [], + default: () => [ + [ + new Date(), + new Date(new Date().setDate(new Date().getDate() + 3)), + ] + ], }, messageOnDisplay: String, }, diff --git a/tests/unit/component-tests/time-picker-components-tests/date-range-picker-tests/DateRangePicker.spec.js b/tests/unit/component-tests/time-picker-components-tests/date-range-picker-tests/DateRangePicker.spec.js index 73930c106a23ae30aee5256dbb28d5be1a9477aa..1867c2ddd1b63fbebb7ac405cdb820642f45ee9a 100644 --- a/tests/unit/component-tests/time-picker-components-tests/date-range-picker-tests/DateRangePicker.spec.js +++ b/tests/unit/component-tests/time-picker-components-tests/date-range-picker-tests/DateRangePicker.spec.js @@ -19,4 +19,76 @@ describe("DateRangePicker.vue", () => { it("Is instansiated", () => { expect(wrapper.exists()).toBeTruthy(); }); + + it("Check that calendar is closed", () => { + expect(wrapper.find(".picker").attributes().style).toBe("display: none;"); + }) + + it("Click input to open calender", async () => { + wrapper.find("input").trigger("click"); + // wait a tick + await wrapper.vm.$nextTick(); + expect(wrapper.find(".picker").attributes().style).toBe("display: flex;"); + }) + + it("Select blocked date", async () => { + wrapper.vm.$emit('selectDate', new Date(1651739228545)); + await wrapper.vm.$nextTick(); + // Check if startDate is set + expect(wrapper.vm.startDate).not.toBe(new Date(1651739228545)); + }) + + it("Select valid date", async () => { + await wrapper.vm.selectDate(new Date(1661739228545)); + // wait a tick + await wrapper.vm.$nextTick(); + expect(wrapper.vm.startDate.getTime()).toBe(1661739228545); + }) + + it("Select valid range", async () => { + await wrapper.vm.selectDate(new Date(1661739228545)); + await wrapper.vm.selectDate(new Date(1661939228545)); + + // wait a tick + await wrapper.vm.$nextTick(); + expect(wrapper.vm.startDate.getTime()).toBe(1661739228545); + expect(wrapper.vm.endDate.getTime()).toBe(1661939228545); + + // Click on the complete button to close the calendar + wrapper.find(".buttons").findAll("button")[1].trigger("click"); + await wrapper.vm.$nextTick(); + expect(wrapper.find(".picker").attributes().style).toBe("display: none;"); + }) + + it("Select invalid range", async () => { + // Check that error is not present. + expect(wrapper.find(".error").exists()).not.toBeTruthy(); + + const start = 1652433228545; + const end = 1652933228545; + + await wrapper.vm.selectDate(new Date(start)); + await wrapper.vm.selectDate(new Date(end)); + // Ceck that present is invalid + expect(wrapper.find(".error").exists()).toBeTruthy(); + }) + + it("Check reset button", async () => { + // Check that error is not present. + expect(wrapper.find(".error").exists()).not.toBeTruthy(); + + const start = 1652433228545; + const end = 1652933228545; + + await wrapper.vm.selectDate(new Date(start)); + await wrapper.vm.selectDate(new Date(end)); + // Ceck that present is invalid + expect(wrapper.find(".error").exists()).toBeTruthy(); + + wrapper.find(".buttons").findAll("button")[0].trigger("click"); + await wrapper.vm.$nextTick(); + + expect(wrapper.vm.startDate.getTime()).not.toBe(1652433228545); + expect(wrapper.vm.endDate).toBe(null); + }) })