@plusscommunities/pluss-core-web 1.2.7 → 1.2.11
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.cjs.js +218 -33
- package/dist/index.esm.js +218 -33
- package/dist/index.umd.js +218 -33
- package/package.json +1 -1
- package/src/components/AudienceSelector.js +2 -1
- package/src/components/Comment.js +10 -1
- package/src/components/CommentSection.js +55 -2
- package/src/components/ExportCsvPopup.js +108 -8
- package/src/components/Text.js +1 -1
- package/src/helper/helper.js +0 -7
- package/src/helper/index.js +2 -0
- package/src/helper/site/getSiteSettingFromState.js +10 -0
- package/src/helper/strings/getFirstName.js +10 -0
package/dist/index.umd.js
CHANGED
|
@@ -666,6 +666,14 @@
|
|
|
666
666
|
return ['mov', 'mp4'].includes(extension);
|
|
667
667
|
};
|
|
668
668
|
|
|
669
|
+
var getFirstName = function getFirstName(string) {
|
|
670
|
+
if (___default['default'].isEmpty(string)) {
|
|
671
|
+
return '';
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
return string.split(' ')[0];
|
|
675
|
+
};
|
|
676
|
+
|
|
669
677
|
var isEmail = function isEmail(email) {
|
|
670
678
|
if (___default['default'].isEmpty(email)) return false;
|
|
671
679
|
var atpos = email.indexOf('@');
|
|
@@ -742,6 +750,14 @@
|
|
|
742
750
|
}));
|
|
743
751
|
};
|
|
744
752
|
|
|
753
|
+
var getSiteSettingFromState = function getSiteSettingFromState(state, key, defaultValue) {
|
|
754
|
+
if (state && state.auth && state.auth.siteSettings && !___default['default'].isUndefined(state.auth.siteSettings[key])) {
|
|
755
|
+
return state.auth.siteSettings[key];
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
return defaultValue || null;
|
|
759
|
+
};
|
|
760
|
+
|
|
745
761
|
var readJSONFromStorage = function readJSONFromStorage(storage, key, fallback) {
|
|
746
762
|
var value = storage.getItem(key);
|
|
747
763
|
|
|
@@ -814,12 +830,6 @@
|
|
|
814
830
|
// }
|
|
815
831
|
// return string.charAt(0).toUpperCase() + string.slice(1);
|
|
816
832
|
// };
|
|
817
|
-
// export const getFirstName = (string) => {
|
|
818
|
-
// if (_.isEmpty(string)) {
|
|
819
|
-
// return '';
|
|
820
|
-
// }
|
|
821
|
-
// return string.split(' ')[0];
|
|
822
|
-
// };
|
|
823
833
|
// export const get300 = (url) => {
|
|
824
834
|
// if (!url) {
|
|
825
835
|
// return url;
|
|
@@ -1541,6 +1551,7 @@
|
|
|
1541
1551
|
getFileName: getFileName,
|
|
1542
1552
|
getThumb300: getThumb300,
|
|
1543
1553
|
isVideo: isVideo,
|
|
1554
|
+
getFirstName: getFirstName,
|
|
1544
1555
|
isEmail: isEmail,
|
|
1545
1556
|
isUrl: isUrl,
|
|
1546
1557
|
randomString: randomString,
|
|
@@ -1548,6 +1559,7 @@
|
|
|
1548
1559
|
onlyAlphanumeric: onlyAlphanumeric,
|
|
1549
1560
|
getSiteName: getSiteName,
|
|
1550
1561
|
getSiteNameFromRoles: getSiteNameFromRoles,
|
|
1562
|
+
getSiteSettingFromState: getSiteSettingFromState,
|
|
1551
1563
|
readJSONFromStorage: readJSONFromStorage,
|
|
1552
1564
|
setLocalStorage: setLocalStorage,
|
|
1553
1565
|
getTimepickerTime: getTimepickerTime,
|
|
@@ -4317,10 +4329,10 @@
|
|
|
4317
4329
|
}, {
|
|
4318
4330
|
key: "render",
|
|
4319
4331
|
value: function render() {
|
|
4320
|
-
return /*#__PURE__*/React__default['default'].createElement("p", {
|
|
4332
|
+
return /*#__PURE__*/React__default['default'].createElement("p", _extends__default['default']({}, this.props, {
|
|
4321
4333
|
className: "text-".concat(this.props.type).concat(this.getClassName()),
|
|
4322
4334
|
style: this.props.style
|
|
4323
|
-
}, this.props.children);
|
|
4335
|
+
}), this.props.children);
|
|
4324
4336
|
}
|
|
4325
4337
|
}]);
|
|
4326
4338
|
|
|
@@ -4406,8 +4418,8 @@
|
|
|
4406
4418
|
}
|
|
4407
4419
|
|
|
4408
4420
|
_createClass__default['default'](Comment, [{
|
|
4409
|
-
key: "
|
|
4410
|
-
value: function
|
|
4421
|
+
key: "renderComment",
|
|
4422
|
+
value: function renderComment() {
|
|
4411
4423
|
var comment = this.props.comment;
|
|
4412
4424
|
return /*#__PURE__*/React__default['default'].createElement("div", {
|
|
4413
4425
|
key: comment.Id,
|
|
@@ -4426,6 +4438,11 @@
|
|
|
4426
4438
|
className: "comment_time"
|
|
4427
4439
|
}, moment__default['default'].utc(comment.Timestamp).local().format('D MMM YYYY • h:mma'))));
|
|
4428
4440
|
}
|
|
4441
|
+
}, {
|
|
4442
|
+
key: "render",
|
|
4443
|
+
value: function render() {
|
|
4444
|
+
return /*#__PURE__*/React__default['default'].createElement("div", null, this.renderComment(), this.props.bottomContent);
|
|
4445
|
+
}
|
|
4429
4446
|
}]);
|
|
4430
4447
|
|
|
4431
4448
|
return Comment;
|
|
@@ -4476,6 +4493,58 @@
|
|
|
4476
4493
|
}, _callee);
|
|
4477
4494
|
})));
|
|
4478
4495
|
|
|
4496
|
+
_defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "getComments", function () {
|
|
4497
|
+
if (!_this.props.onlyParents) {
|
|
4498
|
+
return _this.props.comments;
|
|
4499
|
+
}
|
|
4500
|
+
|
|
4501
|
+
return ___default['default'].filter(_this.props.comments, function (c) {
|
|
4502
|
+
return !c.ParentId;
|
|
4503
|
+
});
|
|
4504
|
+
});
|
|
4505
|
+
|
|
4506
|
+
_defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "renderReplyText", function (c) {
|
|
4507
|
+
if (!_this.props.onOpenThread) {
|
|
4508
|
+
return null;
|
|
4509
|
+
}
|
|
4510
|
+
|
|
4511
|
+
var threadComments = ___default['default'].filter(_this.props.comments, function (innerC) {
|
|
4512
|
+
return innerC.ParentId === c.Id;
|
|
4513
|
+
});
|
|
4514
|
+
|
|
4515
|
+
if (___default['default'].isEmpty(threadComments)) {
|
|
4516
|
+
return /*#__PURE__*/React__default['default'].createElement("div", {
|
|
4517
|
+
className: "comment_reply"
|
|
4518
|
+
}, /*#__PURE__*/React__default['default'].createElement(Text, {
|
|
4519
|
+
className: "comment_reply_button",
|
|
4520
|
+
type: "button",
|
|
4521
|
+
onClick: function onClick() {
|
|
4522
|
+
_this.props.onOpenThread(c);
|
|
4523
|
+
}
|
|
4524
|
+
}, "Reply to ".concat(getFirstName(c.User ? c.User.displayName : 'comment'))));
|
|
4525
|
+
}
|
|
4526
|
+
|
|
4527
|
+
var profilePics = ___default['default'].take(___default['default'].uniqBy(threadComments, function (c) {
|
|
4528
|
+
return c.UserId;
|
|
4529
|
+
}), 3);
|
|
4530
|
+
|
|
4531
|
+
return /*#__PURE__*/React__default['default'].createElement("div", {
|
|
4532
|
+
className: "comment_reply comment_reply-hasReplies"
|
|
4533
|
+
}, profilePics.map(function (c) {
|
|
4534
|
+
return /*#__PURE__*/React__default['default'].createElement(ProfilePic, {
|
|
4535
|
+
className: "comment_reply_profilePic",
|
|
4536
|
+
size: 20,
|
|
4537
|
+
image: c.User.profilePic
|
|
4538
|
+
});
|
|
4539
|
+
}), /*#__PURE__*/React__default['default'].createElement(Text, {
|
|
4540
|
+
className: "comment_reply_button",
|
|
4541
|
+
type: "button",
|
|
4542
|
+
onClick: function onClick() {
|
|
4543
|
+
_this.props.onOpenThread(c);
|
|
4544
|
+
}
|
|
4545
|
+
}, "".concat(threadComments.length, " repl").concat(getPluralOptions(threadComments.length, 'y', 'ies'))));
|
|
4546
|
+
});
|
|
4547
|
+
|
|
4479
4548
|
_this.state = {
|
|
4480
4549
|
commentInput: ''
|
|
4481
4550
|
};
|
|
@@ -4492,10 +4561,11 @@
|
|
|
4492
4561
|
className: "marginBottom-16"
|
|
4493
4562
|
}, "Comments"), /*#__PURE__*/React__default['default'].createElement("div", {
|
|
4494
4563
|
className: "commentSection"
|
|
4495
|
-
}, this.
|
|
4564
|
+
}, this.getComments().map(function (c) {
|
|
4496
4565
|
return /*#__PURE__*/React__default['default'].createElement(Comment, {
|
|
4497
4566
|
key: c.Id,
|
|
4498
|
-
comment: c
|
|
4567
|
+
comment: c,
|
|
4568
|
+
bottomContent: _this2.renderReplyText(c)
|
|
4499
4569
|
});
|
|
4500
4570
|
})), /*#__PURE__*/React__default['default'].createElement("div", {
|
|
4501
4571
|
className: "commentReply"
|
|
@@ -8989,7 +9059,7 @@
|
|
|
8989
9059
|
Category = _this$state2.Category,
|
|
8990
9060
|
Tag = _this$state2.Tag,
|
|
8991
9061
|
Type = _this$state2.Type;
|
|
8992
|
-
if (AudienceType === 'Custom') return AudienceTagList;
|
|
9062
|
+
if (AudienceType === 'Custom') return AudienceTagList || [];
|
|
8993
9063
|
if (AudienceType === 'Category') return Category;
|
|
8994
9064
|
if (AudienceType === 'UserTags') return Tag;
|
|
8995
9065
|
return Type;
|
|
@@ -9049,7 +9119,8 @@
|
|
|
9049
9119
|
Type: '',
|
|
9050
9120
|
Category: '',
|
|
9051
9121
|
includeList: [],
|
|
9052
|
-
excludeList: []
|
|
9122
|
+
excludeList: [],
|
|
9123
|
+
AudienceTagList: []
|
|
9053
9124
|
});
|
|
9054
9125
|
setTimeout(this.onChangeSelection, 50);
|
|
9055
9126
|
}
|
|
@@ -10162,8 +10233,6 @@
|
|
|
10162
10233
|
});
|
|
10163
10234
|
|
|
10164
10235
|
_defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onToggleColumn", function (key) {
|
|
10165
|
-
var source = _this.props.source;
|
|
10166
|
-
|
|
10167
10236
|
var columns = ___default['default'].cloneDeep(_this.state.columns);
|
|
10168
10237
|
|
|
10169
10238
|
var column = columns.find(function (c) {
|
|
@@ -10179,25 +10248,132 @@
|
|
|
10179
10248
|
var selectedHeaders = columns.filter(function (c) {
|
|
10180
10249
|
return c.key && c.selected;
|
|
10181
10250
|
});
|
|
10182
|
-
|
|
10183
|
-
|
|
10251
|
+
|
|
10252
|
+
_this.setState({
|
|
10253
|
+
columns: columns,
|
|
10254
|
+
selectedHeaders: selectedHeaders
|
|
10184
10255
|
});
|
|
10185
|
-
|
|
10186
|
-
|
|
10256
|
+
}
|
|
10257
|
+
});
|
|
10258
|
+
|
|
10259
|
+
_defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onToggleStartDateFilter", function () {
|
|
10260
|
+
var filterDateStartVisible = _this.state.filterDateStartVisible;
|
|
10261
|
+
|
|
10262
|
+
if (filterDateStartVisible) {
|
|
10263
|
+
setTimeout(function () {
|
|
10264
|
+
return _this.setState({
|
|
10265
|
+
filterDateStartVisible: false
|
|
10266
|
+
});
|
|
10267
|
+
}, 200);
|
|
10268
|
+
} else {
|
|
10269
|
+
_this.setState({
|
|
10270
|
+
filterDateStartVisible: true
|
|
10271
|
+
});
|
|
10272
|
+
}
|
|
10273
|
+
});
|
|
10274
|
+
|
|
10275
|
+
_defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onToggleEndDateFilter", function () {
|
|
10276
|
+
var filterDateEndVisible = _this.state.filterDateEndVisible;
|
|
10277
|
+
|
|
10278
|
+
if (filterDateEndVisible) {
|
|
10279
|
+
setTimeout(function () {
|
|
10280
|
+
return _this.setState({
|
|
10281
|
+
filterDateEndVisible: false
|
|
10282
|
+
});
|
|
10283
|
+
}, 200);
|
|
10284
|
+
} else {
|
|
10285
|
+
_this.setState({
|
|
10286
|
+
filterDateEndVisible: true
|
|
10187
10287
|
});
|
|
10288
|
+
}
|
|
10289
|
+
});
|
|
10290
|
+
|
|
10291
|
+
_defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onDateFilterStartChanged", function (date) {
|
|
10292
|
+
var filterDateEnd = _this.state.filterDateEnd;
|
|
10293
|
+
var start = moment__default['default'](date);
|
|
10188
10294
|
|
|
10295
|
+
if (start.isSameOrBefore(filterDateEnd)) {
|
|
10189
10296
|
_this.setState({
|
|
10190
|
-
|
|
10191
|
-
|
|
10192
|
-
|
|
10297
|
+
filterDateStart: start.startOf('day'),
|
|
10298
|
+
filterDateStartVisible: false
|
|
10299
|
+
});
|
|
10300
|
+
}
|
|
10301
|
+
});
|
|
10302
|
+
|
|
10303
|
+
_defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onDateFilterEndChanged", function (date) {
|
|
10304
|
+
var filterDateStart = _this.state.filterDateStart;
|
|
10305
|
+
var end = moment__default['default'](date);
|
|
10306
|
+
|
|
10307
|
+
if (end.isSameOrAfter(filterDateStart)) {
|
|
10308
|
+
_this.setState({
|
|
10309
|
+
filterDateEnd: end.endOf('day'),
|
|
10310
|
+
filterDateEndVisible: false
|
|
10193
10311
|
});
|
|
10194
10312
|
}
|
|
10195
10313
|
});
|
|
10196
10314
|
|
|
10315
|
+
_defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "getSelectedSource", function () {
|
|
10316
|
+
var source = _this.props.source;
|
|
10317
|
+
var selectedHeaders = _this.state.selectedHeaders;
|
|
10318
|
+
var result = source; // apply timestamp filter
|
|
10319
|
+
|
|
10320
|
+
if (_this.props.timestampFilter) {
|
|
10321
|
+
var _this$state = _this.state,
|
|
10322
|
+
filterDateStart = _this$state.filterDateStart,
|
|
10323
|
+
filterDateEnd = _this$state.filterDateEnd;
|
|
10324
|
+
var filterKey = _this.props.timestampFilter.filterKey;
|
|
10325
|
+
var minDate = filterDateStart.valueOf();
|
|
10326
|
+
var maxDate = filterDateEnd.valueOf();
|
|
10327
|
+
result = ___default['default'].filter(source, function (item) {
|
|
10328
|
+
return item[filterKey] >= minDate && item[filterKey] <= maxDate;
|
|
10329
|
+
});
|
|
10330
|
+
} // map result to columns
|
|
10331
|
+
|
|
10332
|
+
|
|
10333
|
+
var selectedheaderKeys = selectedHeaders.map(function (h) {
|
|
10334
|
+
return h.key;
|
|
10335
|
+
});
|
|
10336
|
+
return result.map(function (i) {
|
|
10337
|
+
return ___default['default'].pick(i, selectedheaderKeys);
|
|
10338
|
+
});
|
|
10339
|
+
});
|
|
10340
|
+
|
|
10341
|
+
_defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "renderTimestampFilter", function () {
|
|
10342
|
+
if (!_this.props.timestampFilter) {
|
|
10343
|
+
return null;
|
|
10344
|
+
}
|
|
10345
|
+
|
|
10346
|
+
return /*#__PURE__*/React__default['default'].createElement("div", null, /*#__PURE__*/React__default['default'].createElement(GenericInput, {
|
|
10347
|
+
id: "dateStart",
|
|
10348
|
+
label: "Start Date",
|
|
10349
|
+
alwaysShowLabel: true,
|
|
10350
|
+
placeholder: 'Select start date',
|
|
10351
|
+
value: _this.state.filterDateStart.format('DD/MM/YYYY'),
|
|
10352
|
+
onClick: _this.onToggleStartDateFilter,
|
|
10353
|
+
readOnly: true
|
|
10354
|
+
}), _this.state.filterDateStartVisible ? /*#__PURE__*/React__default['default'].createElement(DatePicker, {
|
|
10355
|
+
hideTop: true,
|
|
10356
|
+
selectedDate: _this.state.filterDateStart,
|
|
10357
|
+
selectDate: _this.onDateFilterStartChanged
|
|
10358
|
+
}) : null, /*#__PURE__*/React__default['default'].createElement(GenericInput, {
|
|
10359
|
+
id: "dateEnd",
|
|
10360
|
+
label: "End Date",
|
|
10361
|
+
alwaysShowLabel: true,
|
|
10362
|
+
placeholder: 'Select end date',
|
|
10363
|
+
value: _this.state.filterDateEnd.format('DD/MM/YYYY'),
|
|
10364
|
+
onClick: _this.onToggleEndDateFilter,
|
|
10365
|
+
readOnly: true
|
|
10366
|
+
}), _this.state.filterDateEndVisible ? /*#__PURE__*/React__default['default'].createElement(DatePicker, {
|
|
10367
|
+
hideTop: true,
|
|
10368
|
+
selectedDate: _this.state.filterDateEnd,
|
|
10369
|
+
selectDate: _this.onDateFilterEndChanged
|
|
10370
|
+
}) : null);
|
|
10371
|
+
});
|
|
10372
|
+
|
|
10197
10373
|
_defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "renderContent", function () {
|
|
10198
|
-
var _this$
|
|
10199
|
-
saving = _this$
|
|
10200
|
-
columns = _this$
|
|
10374
|
+
var _this$state2 = _this.state,
|
|
10375
|
+
saving = _this$state2.saving,
|
|
10376
|
+
columns = _this$state2.columns;
|
|
10201
10377
|
|
|
10202
10378
|
if (saving) {
|
|
10203
10379
|
return /*#__PURE__*/React__default['default'].createElement("div", {
|
|
@@ -10232,27 +10408,35 @@
|
|
|
10232
10408
|
}));
|
|
10233
10409
|
});
|
|
10234
10410
|
|
|
10235
|
-
|
|
10411
|
+
var state = {
|
|
10236
10412
|
columns: props.columns,
|
|
10413
|
+
selectedHeaders: props.columns.filter(function (c) {
|
|
10414
|
+
return c.key && c.selected;
|
|
10415
|
+
}),
|
|
10237
10416
|
selectedSource: [],
|
|
10238
10417
|
saving: false
|
|
10239
10418
|
};
|
|
10419
|
+
|
|
10420
|
+
if (props.timestampFilter) {
|
|
10421
|
+
state.filterDateStart = props.timestampFilter.startDate;
|
|
10422
|
+
state.filterDateEnd = props.timestampFilter.endDate;
|
|
10423
|
+
}
|
|
10424
|
+
|
|
10425
|
+
_this.state = state;
|
|
10240
10426
|
return _this;
|
|
10241
10427
|
}
|
|
10242
10428
|
|
|
10243
10429
|
_createClass__default['default'](ExportCsvPopup, [{
|
|
10244
10430
|
key: "render",
|
|
10245
10431
|
value: function render() {
|
|
10246
|
-
var
|
|
10247
|
-
selectedHeaders = _this$state2.selectedHeaders,
|
|
10248
|
-
selectedSource = _this$state2.selectedSource;
|
|
10432
|
+
var selectedHeaders = this.state.selectedHeaders;
|
|
10249
10433
|
var filename = this.props.filename;
|
|
10250
10434
|
var buttons = [{
|
|
10251
10435
|
type: 'primary',
|
|
10252
10436
|
isActive: this.canSave(),
|
|
10253
10437
|
text: /*#__PURE__*/React__default['default'].createElement(reactCsv.CSVLink, {
|
|
10254
10438
|
headers: selectedHeaders,
|
|
10255
|
-
data:
|
|
10439
|
+
data: this.getSelectedSource(),
|
|
10256
10440
|
style: {
|
|
10257
10441
|
textDecoration: 'none',
|
|
10258
10442
|
color: '#fff'
|
|
@@ -10268,7 +10452,6 @@
|
|
|
10268
10452
|
}];
|
|
10269
10453
|
return /*#__PURE__*/React__default['default'].createElement(Popup, {
|
|
10270
10454
|
title: "Confirm Export",
|
|
10271
|
-
subtitle: "Select which columns to include in the export",
|
|
10272
10455
|
boxClasses: "flex flex-column",
|
|
10273
10456
|
innerClasses: "flex flex-column fillSpace flex-1",
|
|
10274
10457
|
minWidth: 500,
|
|
@@ -10278,7 +10461,9 @@
|
|
|
10278
10461
|
hasPadding: true,
|
|
10279
10462
|
onClose: this.onClose,
|
|
10280
10463
|
buttons: buttons
|
|
10281
|
-
}, this.
|
|
10464
|
+
}, this.renderTimestampFilter(), /*#__PURE__*/React__default['default'].createElement(Text, {
|
|
10465
|
+
type: "bodyLarge"
|
|
10466
|
+
}, "Select which columns to include in the export"), this.renderContent());
|
|
10282
10467
|
}
|
|
10283
10468
|
}]);
|
|
10284
10469
|
|
package/package.json
CHANGED
|
@@ -75,7 +75,7 @@ class AudienceSelector extends Component {
|
|
|
75
75
|
|
|
76
76
|
getAudienceTypeSelection() {
|
|
77
77
|
const { AudienceType, AudienceTagList, Category, Tag, Type } = this.state;
|
|
78
|
-
if (AudienceType === 'Custom') return AudienceTagList;
|
|
78
|
+
if (AudienceType === 'Custom') return AudienceTagList || [];
|
|
79
79
|
if (AudienceType === 'Category') return Category;
|
|
80
80
|
if (AudienceType === 'UserTags') return Tag;
|
|
81
81
|
return Type;
|
|
@@ -135,6 +135,7 @@ class AudienceSelector extends Component {
|
|
|
135
135
|
Category: '',
|
|
136
136
|
includeList: [],
|
|
137
137
|
excludeList: [],
|
|
138
|
+
AudienceTagList: [],
|
|
138
139
|
});
|
|
139
140
|
setTimeout(this.onChangeSelection, 50);
|
|
140
141
|
}
|
|
@@ -4,7 +4,7 @@ import { toParagraphed } from '../helper';
|
|
|
4
4
|
import { ProfilePic } from './ProfilePic';
|
|
5
5
|
|
|
6
6
|
class Comment extends Component {
|
|
7
|
-
|
|
7
|
+
renderComment() {
|
|
8
8
|
const { comment } = this.props;
|
|
9
9
|
return (
|
|
10
10
|
<div key={comment.Id} className="comment">
|
|
@@ -17,6 +17,15 @@ class Comment extends Component {
|
|
|
17
17
|
</div>
|
|
18
18
|
);
|
|
19
19
|
}
|
|
20
|
+
|
|
21
|
+
render() {
|
|
22
|
+
return (
|
|
23
|
+
<div>
|
|
24
|
+
{this.renderComment()}
|
|
25
|
+
{this.props.bottomContent}
|
|
26
|
+
</div>
|
|
27
|
+
);
|
|
28
|
+
}
|
|
20
29
|
}
|
|
21
30
|
|
|
22
31
|
export { Comment };
|
|
@@ -4,6 +4,8 @@ import _ from 'lodash';
|
|
|
4
4
|
import Textarea from 'react-textarea-autosize';
|
|
5
5
|
import { Text } from './Text';
|
|
6
6
|
import { Comment } from './Comment';
|
|
7
|
+
import { getFirstName, getPluralOptions } from '../helper';
|
|
8
|
+
import { ProfilePic } from './ProfilePic';
|
|
7
9
|
|
|
8
10
|
class CommentSection extends Component {
|
|
9
11
|
constructor(props) {
|
|
@@ -26,6 +28,57 @@ class CommentSection extends Component {
|
|
|
26
28
|
this.props.onAddComment(commentInput);
|
|
27
29
|
};
|
|
28
30
|
|
|
31
|
+
getComments = () => {
|
|
32
|
+
if (!this.props.onlyParents) {
|
|
33
|
+
return this.props.comments;
|
|
34
|
+
}
|
|
35
|
+
return _.filter(this.props.comments, (c) => {
|
|
36
|
+
return !c.ParentId;
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
renderReplyText = (c) => {
|
|
41
|
+
if (!this.props.onOpenThread) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const threadComments = _.filter(this.props.comments, (innerC) => {
|
|
46
|
+
return innerC.ParentId === c.Id;
|
|
47
|
+
});
|
|
48
|
+
if (_.isEmpty(threadComments)) {
|
|
49
|
+
return (
|
|
50
|
+
<div className="comment_reply">
|
|
51
|
+
<Text
|
|
52
|
+
className="comment_reply_button"
|
|
53
|
+
type="button"
|
|
54
|
+
onClick={() => {
|
|
55
|
+
this.props.onOpenThread(c);
|
|
56
|
+
}}
|
|
57
|
+
>{`Reply to ${getFirstName(c.User ? c.User.displayName : 'comment')}`}</Text>
|
|
58
|
+
</div>
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const profilePics = _.take(
|
|
63
|
+
_.uniqBy(threadComments, (c) => c.UserId),
|
|
64
|
+
3,
|
|
65
|
+
);
|
|
66
|
+
return (
|
|
67
|
+
<div className="comment_reply comment_reply-hasReplies">
|
|
68
|
+
{profilePics.map((c) => {
|
|
69
|
+
return <ProfilePic className="comment_reply_profilePic" size={20} image={c.User.profilePic} />;
|
|
70
|
+
})}
|
|
71
|
+
<Text
|
|
72
|
+
className="comment_reply_button"
|
|
73
|
+
type="button"
|
|
74
|
+
onClick={() => {
|
|
75
|
+
this.props.onOpenThread(c);
|
|
76
|
+
}}
|
|
77
|
+
>{`${threadComments.length} repl${getPluralOptions(threadComments.length, 'y', 'ies')}`}</Text>
|
|
78
|
+
</div>
|
|
79
|
+
);
|
|
80
|
+
};
|
|
81
|
+
|
|
29
82
|
render() {
|
|
30
83
|
return (
|
|
31
84
|
<div>
|
|
@@ -35,8 +88,8 @@ class CommentSection extends Component {
|
|
|
35
88
|
</Text>
|
|
36
89
|
)}
|
|
37
90
|
<div className="commentSection">
|
|
38
|
-
{this.
|
|
39
|
-
<Comment key={c.Id} comment={c} />
|
|
91
|
+
{this.getComments().map((c) => (
|
|
92
|
+
<Comment key={c.Id} comment={c} bottomContent={this.renderReplyText(c)} />
|
|
40
93
|
))}
|
|
41
94
|
</div>
|
|
42
95
|
<div className="commentReply">
|