diff --git a/.circleci/config.yml b/.circleci/config.yml index 4e82f32b0b7..24a879b5de2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -111,7 +111,7 @@ jobs: - run: cd client && yarn install --frozen-lockfile - *save_yarn_cache - run: cd client && yarn run eslint - - run: cd client && yarn run prettier-check + - run: cd client && yarn run format-check workflows: version: 2 get_code_and_test: diff --git a/Makefile b/Makefile index 9b5fd1df9b1..3c489106252 100644 --- a/Makefile +++ b/Makefile @@ -178,7 +178,7 @@ client-production-maps: node-deps ## Rebuild client-side artifacts for a product cd client && yarn run build-production-maps client-format: node-deps ## Reformat client code - cd client && yarn run prettier + cd client && yarn run format client-watch: node-deps ## A useful target for parallel development building. See also client-dev-server. cd client && yarn run watch @@ -196,7 +196,7 @@ client-eslint: node-deps # Run client linting cd client && yarn run eslint client-format-check: node-deps # Run client formatting check - cd client && yarn run prettier-check + cd client && yarn run format-check client-lint: client-eslint client-format-check ## ES lint and check format of client diff --git a/client/package.json b/client/package.json index cf7125ad6d5..52a3dec6041 100644 --- a/client/package.json +++ b/client/package.json @@ -41,6 +41,7 @@ "core-js": "^3.21.0", "d3": "3", "date-fns": "^2.28.0", + "date-fns-tz": "^1.3.3", "decode-uri-component": "^0.2.0", "dom-to-image": "^2.6.0", "elkjs": "^0.7.1", @@ -59,7 +60,6 @@ "localforage": "^1.10.0", "markdown-it": "^12.3.2", "markdown-it-regexp": "^0.4.0", - "moment": "2.29.2", "object-hash": "^2.2.0", "popper.js": "^1.16.1", "pretty-bytes": "^5.6.0", @@ -100,15 +100,16 @@ "build": "NODE_ENV=development gulp && webpack && yarn run save-build-hash", "build-production": "NODE_ENV=production gulp && yarn run webpack-production && yarn run save-build-hash", "build-production-maps": "NODE_ENV=production gulp && yarn run webpack-production-maps && yarn run save-build-hash", - "build-stats": "webpack --profile --json=webpack-stats.json", + "build-stats": "NODE_ENV=production webpack --profile --json=webpack-stats.json", "view-stats": "webpack-bundle-analyzer webpack-stats.json ../static/dist/", "webpack-watch": "webpack --watch", "webpack-production": "NODE_ENV=production webpack", "webpack-production-maps": "GXY_BUILD_SOURCEMAPS=1 NODE_ENV=production webpack", "gulp": "gulp", "save-build-hash": "(git rev-parse HEAD 2>/dev/null || echo '') >../static/client_build_hash.txt", - "prettier": "prettier --write 'src/style/scss/**/*.scss' 'src/**/{*.js,*.vue}' '!src/libs/**'", - "prettier-check": "prettier --check 'src/style/scss/**/*.scss' 'src/**/{*.js,*.vue}' '!src/libs/**'", + "format": "prettier --write 'src/style/scss/**/*.scss' 'src/**/{*.js,*.vue}' '!src/libs/**'", + "format-check": "prettier --check 'src/style/scss/**/*.scss' 'src/**/{*.js,*.vue}' '!src/libs/**'", + "prettier": "yarn run format", "test": "yarn run qunit && yarn run jest", "jest": "jest --config tests/jest/jest.config.js", "jest-watch": "jest --config tests/jest/jest.config.js --watch", diff --git a/client/src/components/DatasetInformation/DatasetInformation.test.js b/client/src/components/DatasetInformation/DatasetInformation.test.js index 192c9390a06..5a8ade80420 100644 --- a/client/src/components/DatasetInformation/DatasetInformation.test.js +++ b/client/src/components/DatasetInformation/DatasetInformation.test.js @@ -5,7 +5,8 @@ import { getLocalVue } from "jest/helpers"; import DatasetInformation from "./DatasetInformation"; import datasetResponse from "./testData/datasetResponse"; import flushPromises from "flush-promises"; -import moment from "moment"; +import { parseISO } from "date-fns"; +import { formatInTimeZone } from "date-fns-tz"; const HDA_ID = "FOO_HDA_ID"; @@ -65,8 +66,9 @@ describe("DatasetInformation/DatasetInformation", () => { it("Date should be formatted", async () => { const date = datasetInfoTable.find(".utc-time").text(); - const formated_date = moment.utc(datasetResponse.create_time).format("dddd MMM Do h:mm:ss YYYY [UTC]"); - expect(date).toBe(formated_date); + const parsedDate = parseISO(`${datasetResponse.create_time}Z`); + const formattedDate = `${formatInTimeZone(parsedDate, "Etc/Zulu", "eeee MMM do H:mm:ss yyyy")} UTC`; + expect(date).toBe(formattedDate); }); it("Table should render data accordingly", async () => { diff --git a/client/src/components/RuleBuilder/SavedRulesSelector.vue b/client/src/components/RuleBuilder/SavedRulesSelector.vue index 2acbeba2a39..d4e79dc3d9c 100644 --- a/client/src/components/RuleBuilder/SavedRulesSelector.vue +++ b/client/src/components/RuleBuilder/SavedRulesSelector.vue @@ -15,7 +15,8 @@ @click="$emit('update-rules', session.rule)" v-b-tooltip.hover.right :title="formatPreview(session.rule, index)" - >Saved rule from {{ formatDate(session.dateTime) }} + >Saved rule from + @@ -25,8 +26,8 @@ import Vue from "vue"; import _l from "utils/localization"; import BootstrapVue from "bootstrap-vue"; -import moment from "moment"; import { RULES, MAPPING_TARGETS } from "mvc/rules/rule-definitions"; +import UtcDate from "components/UtcDate"; Vue.use(BootstrapVue); export default { @@ -35,6 +36,9 @@ export default { savedRulesMenu: _l("Recently used rules"), }; }, + components: { + UtcDate, + }, props: { savedRules: { type: Array, @@ -54,9 +58,6 @@ export default { }, }, methods: { - formatDate(dateTime) { - return moment.utc(dateTime).from(moment().utc()); - }, formatPreview(savedRuleJson, index) { let prettyString = ""; let delim = ""; diff --git a/client/src/components/UtcDate.test.js b/client/src/components/UtcDate.test.js new file mode 100644 index 00000000000..5749766922c --- /dev/null +++ b/client/src/components/UtcDate.test.js @@ -0,0 +1,20 @@ +import { shallowMount } from "@vue/test-utils"; +import { getLocalVue } from "jest/helpers"; +import UtcDate from "./UtcDate.vue"; + +describe("UTCDate component", () => { + const localVue = getLocalVue(); + + it("Loads a date in default mode, can format outputs as expected.", () => { + const wrapper = shallowMount(UtcDate, { + propsData: { date: "2015-10-21T16:29:00.000000" }, + localVue, + }); + // expect elapsed time to be 'years ago. + expect(wrapper.text()).toBe("2015-10-21T16:29:00.000Z"); + expect(wrapper.vm.elapsedTime).toContain("years ago"); + expect(wrapper.vm.fullISO).toBe("2015-10-21T16:29:00.000Z"); + expect(wrapper.vm.parsedDate).toEqual(new Date("2015-10-21T16:29:00.000Z")); + expect(wrapper.vm.pretty).toBe("Wednesday Oct 21st 16:29:00 2015 UTC"); + }); +}); diff --git a/client/src/components/UtcDate.vue b/client/src/components/UtcDate.vue index 01202fd832b..d7420b5f169 100644 --- a/client/src/components/UtcDate.vue +++ b/client/src/components/UtcDate.vue @@ -1,8 +1,8 @@