@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.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: "render",
4410
- value: function render() {
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.props.comments.map(function (c) {
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
- var selectedheaderKeys = selectedHeaders.map(function (h) {
10183
- return h.key;
10251
+
10252
+ _this.setState({
10253
+ columns: columns,
10254
+ selectedHeaders: selectedHeaders
10184
10255
  });
10185
- var selectedSource = source.map(function (i) {
10186
- return ___default['default'].pick(i, selectedheaderKeys);
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
- columns: columns,
10191
- selectedHeaders: selectedHeaders,
10192
- selectedSource: selectedSource
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$state = _this.state,
10199
- saving = _this$state.saving,
10200
- columns = _this$state.columns;
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
- _this.state = {
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 _this$state2 = this.state,
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: selectedSource,
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.renderContent());
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plusscommunities/pluss-core-web",
3
- "version": "1.2.7",
3
+ "version": "1.2.11",
4
4
  "description": "Core extension package for Pluss Communities platform",
5
5
  "main": "dist/index.cjs.js",
6
6
  "scripts": {
@@ -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
- render() {
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.props.comments.map((c) => (
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">