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 @@
- {{ fullDate }}
+ {{ fullISO }}
-
+
{{ elapsedTime }}
@@ -11,7 +11,8 @@