@plusscommunities/pluss-circles-web-groups 1.6.2-beta.0 → 1.6.2-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1737 -2993
- package/dist/index.js.map +1 -0
- package/package.json +19 -23
- package/.babelrc +0 -3
- package/rollup.config.js +0 -59
- package/src/actions/CirclesActions.js +0 -23
- package/src/actions/index.js +0 -1
- package/src/actions/types.js +0 -5
- package/src/apis/circleActions.js +0 -126
- package/src/apis/index.js +0 -7
- package/src/components/AnalyticsHub.js +0 -284
- package/src/components/FeaturePickerContent.js +0 -47
- package/src/components/PreviewFull.js +0 -29
- package/src/components/PreviewGrid.js +0 -16
- package/src/components/PreviewWidget.js +0 -31
- package/src/components/ViewFull.js +0 -18
- package/src/components/ViewWidget.js +0 -16
- package/src/feature.config.js +0 -120
- package/src/images/full.png +0 -0
- package/src/images/fullNoTitle.png +0 -0
- package/src/images/previewWidget.png +0 -0
- package/src/images/widget.png +0 -0
- package/src/index.js +0 -21
- package/src/reducers/CircleReducer.js +0 -31
- package/src/screens/AddCircle.js +0 -546
- package/src/screens/Circle.js +0 -860
- package/src/screens/Circles.js +0 -570
- package/src/screens/Circles.module.css +0 -95
- package/src/values.config.default.js +0 -34
- package/src/values.config.groups.js +0 -34
- package/src/values.config.js +0 -34
package/package.json
CHANGED
|
@@ -1,51 +1,47 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@plusscommunities/pluss-circles-web-groups",
|
|
3
|
-
"version": "1.6.2-beta.
|
|
3
|
+
"version": "1.6.2-beta.2",
|
|
4
4
|
"description": "Extension package to enable circles on Pluss Communities Platform",
|
|
5
|
+
"main": "./dist/index.js",
|
|
5
6
|
"exports": {
|
|
6
7
|
".": "./dist/index.js"
|
|
7
8
|
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist/"
|
|
11
|
+
],
|
|
8
12
|
"scripts": {
|
|
9
|
-
"build": "
|
|
13
|
+
"build": "rollup -c",
|
|
14
|
+
"prepublishOnly": "(cd .. && npm install) && npm run build",
|
|
10
15
|
"betapatch": "npm version prepatch --preid=beta",
|
|
11
16
|
"patch": "npm version patch",
|
|
12
|
-
"betaupload": "npm
|
|
17
|
+
"betaupload": "npm publish --access public --tag beta",
|
|
13
18
|
"betaupload:p": "npm run betapatch && npm run betaupload",
|
|
14
|
-
"upload": "npm
|
|
19
|
+
"upload": "npm publish --access public",
|
|
15
20
|
"upload:p": "npm run patch && npm run upload",
|
|
16
21
|
"copy:add": "run(){ ext=${1:-default}; test -f src/values.config.$ext.js || cp src/values.config.default.js src/values.config.$ext.js; }; run",
|
|
17
22
|
"copy:get": "echo $npm_package_name",
|
|
18
23
|
"copy:set": "run(){ target='\\@plusscommunities\\/pluss-circles-web'; ext=${1:-default}; [ $ext == 'default' ] && replace=$target || replace=$target'-'$ext; echo 'Setting target to '$replace; test -f src/values.config.$ext.js && cp -f src/values.config.$ext.js src/values.config.js; sed -i'' -e 's/'$target'.*\"/'$replace'\"/g' package.json; }; run",
|
|
19
|
-
"copy:betaupload": "
|
|
20
|
-
"copy:
|
|
24
|
+
"copy:betaupload": "for file in `ls ./src/values.config.*.js`; do dup=`echo $file | sed 's/.*values\\.config\\.\\(.*\\)\\.js/\\1/'`; npm run copy:set $dup; npm run betaupload; done; npm run copy:set;",
|
|
25
|
+
"copy:betaupload:p": "npm run betapatch; npm run copy:betaupload;",
|
|
26
|
+
"copy:upload": "for file in `ls ./src/values.config.*.js`; do dup=`echo $file | sed 's/.*values\\.config\\.\\(.*\\)\\.js/\\1/'`; npm run copy:set $dup; npm run upload; done; npm run copy:set;",
|
|
27
|
+
"copy:upload:p": "npm run patch; npm run copy:upload;"
|
|
21
28
|
},
|
|
22
29
|
"author": "Phillip Suh",
|
|
23
|
-
"license": "ISC",
|
|
24
|
-
"devDependencies": {
|
|
25
|
-
"@babel/cli": "^7.14.3",
|
|
26
|
-
"@babel/core": "^7.14.3",
|
|
27
|
-
"@babel/plugin-transform-runtime": "^7.14.3",
|
|
28
|
-
"@babel/preset-env": "^7.14.2",
|
|
29
|
-
"@babel/preset-react": "^7.13.13",
|
|
30
|
-
"@rollup/plugin-babel": "^5.3.0",
|
|
31
|
-
"@rollup/plugin-image": "^2.0.6",
|
|
32
|
-
"@rollup/plugin-json": "^4.1.0",
|
|
33
|
-
"autoprefixer": "^10.2.6",
|
|
34
|
-
"rollup": "^2.50.1",
|
|
35
|
-
"rollup-plugin-local-resolve": "^1.0.7",
|
|
36
|
-
"rollup-plugin-delete": "^3.0.2",
|
|
37
|
-
"rollup-plugin-styles": "^3.14.1"
|
|
38
|
-
},
|
|
39
30
|
"dependencies": {
|
|
40
31
|
"@babel/runtime": "^7.14.0"
|
|
41
32
|
},
|
|
42
33
|
"peerDependencies": {
|
|
43
34
|
"@plusscommunities/pluss-core-web": "*",
|
|
35
|
+
"@plusscommunities/pluss-icons": "*",
|
|
44
36
|
"lodash": "*",
|
|
45
37
|
"moment": "*",
|
|
46
38
|
"react": "*",
|
|
47
39
|
"react-bootstrap": "*",
|
|
48
|
-
"react-dom": "*"
|
|
40
|
+
"react-dom": "*",
|
|
41
|
+
"react-router": "*",
|
|
42
|
+
"react-router-dom": "*",
|
|
43
|
+
"react-redux": "*",
|
|
44
|
+
"react-fontawesome": "*"
|
|
49
45
|
},
|
|
50
46
|
"keywords": []
|
|
51
47
|
}
|
package/.babelrc
DELETED
package/rollup.config.js
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import styles from "rollup-plugin-styles";
|
|
2
|
-
const autoprefixer = require("autoprefixer");
|
|
3
|
-
import babel from "@rollup/plugin-babel";
|
|
4
|
-
import json from "@rollup/plugin-json";
|
|
5
|
-
import image from "@rollup/plugin-image";
|
|
6
|
-
import resolve from "rollup-plugin-local-resolve";
|
|
7
|
-
import del from "rollup-plugin-delete";
|
|
8
|
-
|
|
9
|
-
const inputs = [{ input: "src/index.js", filename: "index" }];
|
|
10
|
-
|
|
11
|
-
const config = inputs.map((entry, index) => ({
|
|
12
|
-
input: entry.input,
|
|
13
|
-
output: {
|
|
14
|
-
name: "@plusscommunities/pluss-core-web",
|
|
15
|
-
file: `dist/${entry.filename}.js`,
|
|
16
|
-
format: "esm",
|
|
17
|
-
exports: "auto",
|
|
18
|
-
},
|
|
19
|
-
external: [
|
|
20
|
-
"jquery",
|
|
21
|
-
"js-cookie",
|
|
22
|
-
"lodash",
|
|
23
|
-
"moment",
|
|
24
|
-
"react",
|
|
25
|
-
"react/jsx-runtime",
|
|
26
|
-
"react-router",
|
|
27
|
-
"react-csv",
|
|
28
|
-
"react-bootstrap",
|
|
29
|
-
"react-router-dom",
|
|
30
|
-
"react-dropzone",
|
|
31
|
-
"react-lottie",
|
|
32
|
-
"react-redux",
|
|
33
|
-
"react-textarea-autosize",
|
|
34
|
-
"aws-amplify",
|
|
35
|
-
"react-color",
|
|
36
|
-
],
|
|
37
|
-
plugins: [
|
|
38
|
-
index === 0 ? del({ targets: "dist", runOnce: true }) : null,
|
|
39
|
-
resolve({
|
|
40
|
-
extensions: [".js", ".jsx"],
|
|
41
|
-
browser: true,
|
|
42
|
-
}),
|
|
43
|
-
babel({
|
|
44
|
-
exclude: "node_modules/**",
|
|
45
|
-
presets: ["@babel/preset-react", "@babel/preset-env"],
|
|
46
|
-
plugins: ["@babel/transform-runtime"],
|
|
47
|
-
babelHelpers: "runtime",
|
|
48
|
-
}),
|
|
49
|
-
styles({
|
|
50
|
-
postcss: {
|
|
51
|
-
plugins: [autoprefixer()],
|
|
52
|
-
},
|
|
53
|
-
}),
|
|
54
|
-
image(),
|
|
55
|
-
json(),
|
|
56
|
-
].filter(Boolean),
|
|
57
|
-
}));
|
|
58
|
-
|
|
59
|
-
export default config;
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import _ from "lodash";
|
|
2
|
-
import { CIRCLES_LOADED, CIRCLE_UPDATED, CIRCLE_REMOVED } from "./types";
|
|
3
|
-
|
|
4
|
-
export const circlesLoaded = (circles) => {
|
|
5
|
-
return {
|
|
6
|
-
type: CIRCLES_LOADED,
|
|
7
|
-
payload: circles,
|
|
8
|
-
};
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
export const circleUpdated = (circle) => {
|
|
12
|
-
return {
|
|
13
|
-
type: CIRCLE_UPDATED,
|
|
14
|
-
payload: circle,
|
|
15
|
-
};
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
export const circleRemoved = (circleId) => {
|
|
19
|
-
return {
|
|
20
|
-
type: CIRCLE_REMOVED,
|
|
21
|
-
payload: circleId,
|
|
22
|
-
};
|
|
23
|
-
};
|
package/src/actions/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from "./CirclesActions";
|
package/src/actions/types.js
DELETED
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
import _ from "lodash";
|
|
2
|
-
import { values } from "../values.config";
|
|
3
|
-
import { PlussCore } from "../feature.config";
|
|
4
|
-
const { Helper, Session } = PlussCore;
|
|
5
|
-
|
|
6
|
-
export const circleActions = {
|
|
7
|
-
getAll: (site) => {
|
|
8
|
-
return Session.authedFunction({
|
|
9
|
-
method: "GET",
|
|
10
|
-
url: Helper.getUrl(values.serviceKey, "get/all", { site }),
|
|
11
|
-
});
|
|
12
|
-
},
|
|
13
|
-
getFiles: (circleId) => {
|
|
14
|
-
return Session.authedFunction({
|
|
15
|
-
method: "GET",
|
|
16
|
-
url: Helper.getUrl(values.serviceKey, "get/files", { circleId }),
|
|
17
|
-
});
|
|
18
|
-
},
|
|
19
|
-
getImages: (circleId) => {
|
|
20
|
-
return Session.authedFunction({
|
|
21
|
-
method: "GET",
|
|
22
|
-
url: Helper.getUrl(values.serviceKey, "get/images", { circleId }),
|
|
23
|
-
});
|
|
24
|
-
},
|
|
25
|
-
add: (site, title, image, audience, isPublic) => {
|
|
26
|
-
return Session.authedFunction({
|
|
27
|
-
method: "POST",
|
|
28
|
-
url: Helper.getUrl(values.serviceKey, "update/add"),
|
|
29
|
-
data: {
|
|
30
|
-
site,
|
|
31
|
-
title,
|
|
32
|
-
image,
|
|
33
|
-
audience,
|
|
34
|
-
isPublic,
|
|
35
|
-
},
|
|
36
|
-
});
|
|
37
|
-
},
|
|
38
|
-
edit: (circleId, title, image, audience, isPublic) => {
|
|
39
|
-
return Session.authedFunction({
|
|
40
|
-
method: "POST",
|
|
41
|
-
url: Helper.getUrl(values.serviceKey, "update/edit"),
|
|
42
|
-
data: {
|
|
43
|
-
circleId,
|
|
44
|
-
title,
|
|
45
|
-
image,
|
|
46
|
-
audience,
|
|
47
|
-
isPublic,
|
|
48
|
-
},
|
|
49
|
-
});
|
|
50
|
-
},
|
|
51
|
-
delete: (circleId) => {
|
|
52
|
-
return Session.authedFunction({
|
|
53
|
-
method: "POST",
|
|
54
|
-
url: Helper.getUrl(values.serviceKey, "update/delete"),
|
|
55
|
-
data: {
|
|
56
|
-
circleId,
|
|
57
|
-
},
|
|
58
|
-
});
|
|
59
|
-
},
|
|
60
|
-
addAdmin: (circleId, userId) => {
|
|
61
|
-
return Session.authedFunction({
|
|
62
|
-
method: "POST",
|
|
63
|
-
url: Helper.getUrl(values.serviceKey, "update/addadmin"),
|
|
64
|
-
data: {
|
|
65
|
-
circleId,
|
|
66
|
-
userId,
|
|
67
|
-
},
|
|
68
|
-
});
|
|
69
|
-
},
|
|
70
|
-
removeAdmin: (circleId, userId) => {
|
|
71
|
-
return Session.authedFunction({
|
|
72
|
-
method: "POST",
|
|
73
|
-
url: Helper.getUrl(values.serviceKey, "update/removeadmin"),
|
|
74
|
-
data: {
|
|
75
|
-
circleId,
|
|
76
|
-
userId,
|
|
77
|
-
},
|
|
78
|
-
});
|
|
79
|
-
},
|
|
80
|
-
getMessages: async (groupId, limit, minTime, maxTime) => {
|
|
81
|
-
const query = { groupId };
|
|
82
|
-
if (!_.isUndefined(minTime)) {
|
|
83
|
-
query.minTime = minTime;
|
|
84
|
-
}
|
|
85
|
-
if (!_.isUndefined(maxTime)) {
|
|
86
|
-
query.maxTime = maxTime;
|
|
87
|
-
}
|
|
88
|
-
if (limit) {
|
|
89
|
-
query.limit = limit;
|
|
90
|
-
}
|
|
91
|
-
return Session.authedFunction({
|
|
92
|
-
method: "GET",
|
|
93
|
-
url: Helper.getUrl(values.serviceKey, "getMessages", query),
|
|
94
|
-
});
|
|
95
|
-
},
|
|
96
|
-
sendMessage: async (circleId, message) => {
|
|
97
|
-
return Session.authedFunction({
|
|
98
|
-
method: "post",
|
|
99
|
-
url: Helper.getUrl(values.serviceKey, "sendMessage"),
|
|
100
|
-
data: {
|
|
101
|
-
groupId: circleId,
|
|
102
|
-
message,
|
|
103
|
-
},
|
|
104
|
-
});
|
|
105
|
-
},
|
|
106
|
-
deleteMessage: async (messageId, groupId) => {
|
|
107
|
-
return Session.authedFunction({
|
|
108
|
-
method: "POST",
|
|
109
|
-
url: Helper.getUrl(values.serviceKey, "update/deletemessage"),
|
|
110
|
-
data: {
|
|
111
|
-
messageId,
|
|
112
|
-
groupId,
|
|
113
|
-
},
|
|
114
|
-
});
|
|
115
|
-
},
|
|
116
|
-
markAsRead: async (circleId, userId) => {
|
|
117
|
-
return Session.authedFunction({
|
|
118
|
-
method: "post",
|
|
119
|
-
url: Helper.getUrl("groups", "resetunread"),
|
|
120
|
-
data: {
|
|
121
|
-
groupID: circleId,
|
|
122
|
-
userID: userId,
|
|
123
|
-
},
|
|
124
|
-
});
|
|
125
|
-
},
|
|
126
|
-
};
|
package/src/apis/index.js
DELETED
|
@@ -1,284 +0,0 @@
|
|
|
1
|
-
import React, { useState, useEffect } from "react";
|
|
2
|
-
import moment from "moment";
|
|
3
|
-
import { connect } from "react-redux";
|
|
4
|
-
import { analyticsActions } from "../apis";
|
|
5
|
-
import { values } from "../values.config";
|
|
6
|
-
import { PlussCore } from "../feature.config";
|
|
7
|
-
|
|
8
|
-
const { Analytics, Session, Components } = PlussCore;
|
|
9
|
-
|
|
10
|
-
const getInitialState = () => ({
|
|
11
|
-
isLoading: true,
|
|
12
|
-
messages: 0,
|
|
13
|
-
prevMessages: 0,
|
|
14
|
-
staffMessages: 0,
|
|
15
|
-
prevStaffMessages: 0,
|
|
16
|
-
residentMessages: 0,
|
|
17
|
-
prevResidentMessages: 0,
|
|
18
|
-
groupMessages: 0,
|
|
19
|
-
prevGroupMessages: 0,
|
|
20
|
-
privateMessages: 0,
|
|
21
|
-
prevPrivateMessages: 0,
|
|
22
|
-
activeGroups: 0,
|
|
23
|
-
prevActiveGroups: 0,
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
// AnalyticsHub Component
|
|
27
|
-
const AnalyticsHub = ({
|
|
28
|
-
startTime,
|
|
29
|
-
endTime,
|
|
30
|
-
auth,
|
|
31
|
-
prevText,
|
|
32
|
-
dayCount,
|
|
33
|
-
strings,
|
|
34
|
-
}) => {
|
|
35
|
-
const [analyticsData, setAnalyticsData] = useState(getInitialState());
|
|
36
|
-
const [isExportOpen, setIsExportOpen] = useState(false);
|
|
37
|
-
|
|
38
|
-
const hasAccess = Session.validateAccess(
|
|
39
|
-
auth.site,
|
|
40
|
-
values.permissionNewsletter,
|
|
41
|
-
auth,
|
|
42
|
-
);
|
|
43
|
-
if (!hasAccess) {
|
|
44
|
-
return null;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const featureTitle = ((key) => {
|
|
48
|
-
if (!strings || !strings.sideNav || !strings.sideNav[key]) {
|
|
49
|
-
return values.textFeatureTitle;
|
|
50
|
-
}
|
|
51
|
-
return strings.sideNav[key];
|
|
52
|
-
})();
|
|
53
|
-
|
|
54
|
-
const exportColumns = [
|
|
55
|
-
{ label: "Select All", key: "" },
|
|
56
|
-
{ label: "Start Date", key: "startDate" },
|
|
57
|
-
{ label: "End Date", key: "endDate" },
|
|
58
|
-
{ label: "Messages", key: "messages" },
|
|
59
|
-
{ label: "Messages by Staff", key: "staffMessages" },
|
|
60
|
-
{ label: "Messages by Primary Users", key: "residentMessages" },
|
|
61
|
-
{ label: "Group Messages", key: "groupMessages" },
|
|
62
|
-
{ label: "Private Messages", key: "privateMessages" },
|
|
63
|
-
{ label: "Groups with Messages", key: "activeGroups" },
|
|
64
|
-
];
|
|
65
|
-
|
|
66
|
-
useEffect(() => {
|
|
67
|
-
getData();
|
|
68
|
-
}, [startTime, endTime]);
|
|
69
|
-
|
|
70
|
-
const getData = async () => {
|
|
71
|
-
setAnalyticsData(getInitialState());
|
|
72
|
-
// Load analytics data here using startTime and endTime
|
|
73
|
-
const timeDifference = endTime - startTime;
|
|
74
|
-
const [currentStatsResponse, prevStatsResponse] = await Promise.all([
|
|
75
|
-
analyticsActions.getAggregateEntityStats(
|
|
76
|
-
auth.site,
|
|
77
|
-
values.entityKey,
|
|
78
|
-
startTime,
|
|
79
|
-
endTime,
|
|
80
|
-
true,
|
|
81
|
-
),
|
|
82
|
-
analyticsActions.getAggregateEntityStats(
|
|
83
|
-
auth.site,
|
|
84
|
-
values.entityKey,
|
|
85
|
-
startTime - timeDifference,
|
|
86
|
-
startTime,
|
|
87
|
-
true,
|
|
88
|
-
),
|
|
89
|
-
]);
|
|
90
|
-
|
|
91
|
-
const data = {
|
|
92
|
-
messages: Analytics.countActivities(
|
|
93
|
-
currentStatsResponse.data,
|
|
94
|
-
"Message",
|
|
95
|
-
"total",
|
|
96
|
-
),
|
|
97
|
-
prevMessages: Analytics.countActivities(
|
|
98
|
-
prevStatsResponse.data,
|
|
99
|
-
"Message",
|
|
100
|
-
"total",
|
|
101
|
-
),
|
|
102
|
-
staffMessages: Analytics.countActivities(
|
|
103
|
-
currentStatsResponse.data,
|
|
104
|
-
"StaffMessage",
|
|
105
|
-
"total",
|
|
106
|
-
),
|
|
107
|
-
prevStaffMessages: Analytics.countActivities(
|
|
108
|
-
prevStatsResponse.data,
|
|
109
|
-
"StaffMessage",
|
|
110
|
-
"total",
|
|
111
|
-
),
|
|
112
|
-
residentMessages: Analytics.countActivities(
|
|
113
|
-
currentStatsResponse.data,
|
|
114
|
-
"ResidentMessage",
|
|
115
|
-
"total",
|
|
116
|
-
),
|
|
117
|
-
prevResidentMessages: Analytics.countActivities(
|
|
118
|
-
prevStatsResponse.data,
|
|
119
|
-
"ResidentMessage",
|
|
120
|
-
"total",
|
|
121
|
-
),
|
|
122
|
-
groupMessages: Analytics.countActivities(
|
|
123
|
-
currentStatsResponse.data,
|
|
124
|
-
"GroupMessage",
|
|
125
|
-
"total",
|
|
126
|
-
),
|
|
127
|
-
prevGroupMessages: Analytics.countActivities(
|
|
128
|
-
prevStatsResponse.data,
|
|
129
|
-
"GroupMessage",
|
|
130
|
-
"total",
|
|
131
|
-
),
|
|
132
|
-
privateMessages: Analytics.countActivities(
|
|
133
|
-
currentStatsResponse.data,
|
|
134
|
-
"PrivateMessage",
|
|
135
|
-
"total",
|
|
136
|
-
),
|
|
137
|
-
prevPrivateMessages: Analytics.countActivities(
|
|
138
|
-
prevStatsResponse.data,
|
|
139
|
-
"PrivateMessage",
|
|
140
|
-
"total",
|
|
141
|
-
),
|
|
142
|
-
activeGroups: Analytics.countActivities(
|
|
143
|
-
currentStatsResponse.data,
|
|
144
|
-
"GroupMessage",
|
|
145
|
-
"unique",
|
|
146
|
-
),
|
|
147
|
-
prevActiveGroups: Analytics.countActivities(
|
|
148
|
-
prevStatsResponse.data,
|
|
149
|
-
"GroupMessage",
|
|
150
|
-
"unique",
|
|
151
|
-
),
|
|
152
|
-
// uniquePageView: Analytics.countActivities(currentStatsResponse.data, 'UniquePageView', 'uniquearray'),
|
|
153
|
-
// prevUniquePageView: Analytics.countActivities(prevStatsResponse.data, 'UniquePageView', 'uniquearray'),
|
|
154
|
-
isLoading: false,
|
|
155
|
-
};
|
|
156
|
-
setAnalyticsData(data);
|
|
157
|
-
};
|
|
158
|
-
|
|
159
|
-
const isReadyToOpenCSV = () => {
|
|
160
|
-
return !analyticsData.isLoading;
|
|
161
|
-
};
|
|
162
|
-
|
|
163
|
-
const getExportSource = () => {
|
|
164
|
-
return [
|
|
165
|
-
{
|
|
166
|
-
startDate: moment(startTime + 1).format("D-MM-YYYY"),
|
|
167
|
-
endDate: moment(endTime).format("D-MM-YYYY"),
|
|
168
|
-
messages: analyticsData.messages,
|
|
169
|
-
staffMessages: analyticsData.staffMessages,
|
|
170
|
-
residentMessages: analyticsData.residentMessages,
|
|
171
|
-
groupMessages: analyticsData.groupMessages,
|
|
172
|
-
privateMessages: analyticsData.privateMessages,
|
|
173
|
-
activeGroups: analyticsData.activeGroups,
|
|
174
|
-
},
|
|
175
|
-
];
|
|
176
|
-
};
|
|
177
|
-
|
|
178
|
-
const csvPopup = () => {
|
|
179
|
-
if (!isExportOpen) {
|
|
180
|
-
return null;
|
|
181
|
-
}
|
|
182
|
-
const source = getExportSource();
|
|
183
|
-
return (
|
|
184
|
-
<Components.ExportCsvPopup
|
|
185
|
-
onClose={() => {
|
|
186
|
-
setIsExportOpen(false);
|
|
187
|
-
}}
|
|
188
|
-
columns={exportColumns}
|
|
189
|
-
source={source}
|
|
190
|
-
filename={`${values.analyticsKey}analytics_${source[0].startDate}_${source[0].endDate}.csv`}
|
|
191
|
-
/>
|
|
192
|
-
);
|
|
193
|
-
};
|
|
194
|
-
|
|
195
|
-
return (
|
|
196
|
-
<div className="dashboardSection">
|
|
197
|
-
{csvPopup()}
|
|
198
|
-
<div>
|
|
199
|
-
<Components.Text type="h4" className="inlineBlock marginRight-40">
|
|
200
|
-
{featureTitle}
|
|
201
|
-
</Components.Text>
|
|
202
|
-
<Components.Button
|
|
203
|
-
inline
|
|
204
|
-
buttonType="primaryAction"
|
|
205
|
-
onClick={() => {
|
|
206
|
-
if (!isReadyToOpenCSV()) return;
|
|
207
|
-
setIsExportOpen(true);
|
|
208
|
-
}}
|
|
209
|
-
isActive={isReadyToOpenCSV()}
|
|
210
|
-
leftIcon="file-code"
|
|
211
|
-
>
|
|
212
|
-
Export CSV
|
|
213
|
-
</Components.Button>
|
|
214
|
-
</div>
|
|
215
|
-
<div className="analyticsSection dashboardSection_content">
|
|
216
|
-
<Components.StatBox
|
|
217
|
-
title="Groups with Messages"
|
|
218
|
-
icon="fa-user-group"
|
|
219
|
-
value={analyticsData.activeGroups}
|
|
220
|
-
previousValue={analyticsData.prevActiveGroups}
|
|
221
|
-
prevText={prevText}
|
|
222
|
-
viewGraphLink={`/chart?entity=${values.entityKey}&startTime=${startTime}&endTime=${endTime}&key=GroupMessage&countType=unique&dayCount=${dayCount}`}
|
|
223
|
-
isLoading={analyticsData.isLoading}
|
|
224
|
-
/>
|
|
225
|
-
<Components.StatBox
|
|
226
|
-
title="Messages"
|
|
227
|
-
icon="fa-message"
|
|
228
|
-
value={analyticsData.messages}
|
|
229
|
-
previousValue={analyticsData.prevMessages}
|
|
230
|
-
prevText={prevText}
|
|
231
|
-
viewGraphLink={`/chart?entity=${values.entityKey}&startTime=${startTime}&endTime=${endTime}&key=Message&countType=total&dayCount=${dayCount}`}
|
|
232
|
-
isLoading={analyticsData.isLoading}
|
|
233
|
-
/>
|
|
234
|
-
<Components.StatBox
|
|
235
|
-
title="Messages by Staff"
|
|
236
|
-
icon="fa-user-tie"
|
|
237
|
-
value={analyticsData.staffMessages}
|
|
238
|
-
previousValue={analyticsData.prevStaffMessages}
|
|
239
|
-
prevText={prevText}
|
|
240
|
-
viewGraphLink={`/chart?entity=${values.entityKey}&startTime=${startTime}&endTime=${endTime}&key=StaffMessage&countType=total&dayCount=${dayCount}`}
|
|
241
|
-
isLoading={analyticsData.isLoading}
|
|
242
|
-
/>
|
|
243
|
-
<Components.StatBox
|
|
244
|
-
title="Messages by Primary Users"
|
|
245
|
-
icon="fa-users"
|
|
246
|
-
value={analyticsData.residentMessages}
|
|
247
|
-
previousValue={analyticsData.prevResidentMessages}
|
|
248
|
-
prevText={prevText}
|
|
249
|
-
viewGraphLink={`/chart?entity=${values.entityKey}&startTime=${startTime}&endTime=${endTime}&key=ResidentMessage&countType=total&dayCount=${dayCount}`}
|
|
250
|
-
isLoading={analyticsData.isLoading}
|
|
251
|
-
/>
|
|
252
|
-
<Components.StatBox
|
|
253
|
-
title="Group Messages"
|
|
254
|
-
icon="fa-users-rectangle"
|
|
255
|
-
value={analyticsData.groupMessages}
|
|
256
|
-
previousValue={analyticsData.prevGroupMessages}
|
|
257
|
-
prevText={prevText}
|
|
258
|
-
viewGraphLink={`/chart?entity=${values.entityKey}&startTime=${startTime}&endTime=${endTime}&key=GroupMessage&countType=total&dayCount=${dayCount}`}
|
|
259
|
-
isLoading={analyticsData.isLoading}
|
|
260
|
-
/>
|
|
261
|
-
<Components.StatBox
|
|
262
|
-
title="Private Messages"
|
|
263
|
-
icon="fa-people-arrows"
|
|
264
|
-
value={analyticsData.privateMessages}
|
|
265
|
-
previousValue={analyticsData.prevPrivateMessages}
|
|
266
|
-
prevText={prevText}
|
|
267
|
-
viewGraphLink={`/chart?entity=${values.entityKey}&startTime=${startTime}&endTime=${endTime}&key=PrivateMessage&countType=total&dayCount=${dayCount}`}
|
|
268
|
-
isLoading={analyticsData.isLoading}
|
|
269
|
-
/>
|
|
270
|
-
</div>
|
|
271
|
-
</div>
|
|
272
|
-
);
|
|
273
|
-
};
|
|
274
|
-
|
|
275
|
-
const mapStateToProps = (state) => {
|
|
276
|
-
const { auth } = state;
|
|
277
|
-
return {
|
|
278
|
-
auth,
|
|
279
|
-
strings: (state.strings && state.strings.config) || {},
|
|
280
|
-
};
|
|
281
|
-
};
|
|
282
|
-
|
|
283
|
-
const toExport = connect(mapStateToProps, {})(AnalyticsHub);
|
|
284
|
-
export { toExport as AnalyticsHub };
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { PlussCore } from "../feature.config";
|
|
3
|
-
|
|
4
|
-
const { Components, Colours } = PlussCore;
|
|
5
|
-
|
|
6
|
-
export default () => {
|
|
7
|
-
return (
|
|
8
|
-
<div className="fp2_widget_content fp2_widget_content-circles">
|
|
9
|
-
<div className="fp2_widget_content_vListing">
|
|
10
|
-
<div className="fp2_widget_silhouette fp2_widget_silhouette-circle">
|
|
11
|
-
<Components.Icon
|
|
12
|
-
icon={"fa-comments"}
|
|
13
|
-
colour={Colours.hexToRGBAstring(Colours.COLOUR_BRANDING_MAIN, 0.5)}
|
|
14
|
-
/>
|
|
15
|
-
</div>
|
|
16
|
-
<div className="flex-1">
|
|
17
|
-
<div className="fp2_widget_silhouette fp2_widget_silhouette-textLine"></div>
|
|
18
|
-
<div className="fp2_widget_silhouette fp2_widget_silhouette-textLineFull"></div>
|
|
19
|
-
</div>
|
|
20
|
-
</div>
|
|
21
|
-
<div className="fp2_widget_content_vListing">
|
|
22
|
-
<div className="fp2_widget_silhouette fp2_widget_silhouette-circle">
|
|
23
|
-
<Components.Icon
|
|
24
|
-
icon={"fa-comments"}
|
|
25
|
-
colour={Colours.hexToRGBAstring(Colours.COLOUR_BRANDING_MAIN, 0.5)}
|
|
26
|
-
/>
|
|
27
|
-
</div>
|
|
28
|
-
<div className="flex-1">
|
|
29
|
-
<div className="fp2_widget_silhouette fp2_widget_silhouette-textLine"></div>
|
|
30
|
-
<div className="fp2_widget_silhouette fp2_widget_silhouette-textLineFull"></div>
|
|
31
|
-
</div>
|
|
32
|
-
</div>
|
|
33
|
-
<div className="fp2_widget_content_vListing">
|
|
34
|
-
<div className="fp2_widget_silhouette fp2_widget_silhouette-circle">
|
|
35
|
-
<Components.Icon
|
|
36
|
-
icon={"fa-comments"}
|
|
37
|
-
colour={Colours.hexToRGBAstring(Colours.COLOUR_BRANDING_MAIN, 0.5)}
|
|
38
|
-
/>
|
|
39
|
-
</div>
|
|
40
|
-
<div className="flex-1">
|
|
41
|
-
<div className="fp2_widget_silhouette fp2_widget_silhouette-textLine"></div>
|
|
42
|
-
<div className="fp2_widget_silhouette fp2_widget_silhouette-textLineFull"></div>
|
|
43
|
-
</div>
|
|
44
|
-
</div>
|
|
45
|
-
</div>
|
|
46
|
-
);
|
|
47
|
-
};
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import React, { Component } from "react";
|
|
2
|
-
import fullNoTitle from "../images/fullNoTitle.png";
|
|
3
|
-
|
|
4
|
-
class PreviewFull extends Component {
|
|
5
|
-
render() {
|
|
6
|
-
const { backgroundColor, widgetTitle, titleClassName } = this.props;
|
|
7
|
-
return (
|
|
8
|
-
<div style={styles.container}>
|
|
9
|
-
<p className={titleClassName}>{widgetTitle}</p>
|
|
10
|
-
<img
|
|
11
|
-
style={{ ...styles.image, backgroundColor }}
|
|
12
|
-
src={fullNoTitle}
|
|
13
|
-
alt="fullNoTitle"
|
|
14
|
-
/>
|
|
15
|
-
</div>
|
|
16
|
-
);
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const styles = {
|
|
21
|
-
container: {
|
|
22
|
-
position: "relative",
|
|
23
|
-
},
|
|
24
|
-
image: {
|
|
25
|
-
width: "100%",
|
|
26
|
-
},
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
export default PreviewFull;
|