@plusscommunities/pluss-circles-web-groups 1.5.6 → 1.5.7-beta.1

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
@@ -356,6 +356,35 @@
356
356
  }
357
357
 
358
358
  return deleteMessage;
359
+ }(),
360
+ markAsRead: function () {
361
+ var _markAsRead = _asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee4(circleId, userId) {
362
+ return _regeneratorRuntime__default['default'].wrap(function _callee4$(_context4) {
363
+ while (1) {
364
+ switch (_context4.prev = _context4.next) {
365
+ case 0:
366
+ return _context4.abrupt("return", Session$4.authedFunction({
367
+ method: 'post',
368
+ url: Helper$3.getUrl('notifications', 'resetunread'),
369
+ data: {
370
+ groupID: circleId,
371
+ userID: userId
372
+ }
373
+ }));
374
+
375
+ case 1:
376
+ case "end":
377
+ return _context4.stop();
378
+ }
379
+ }
380
+ }, _callee4);
381
+ }));
382
+
383
+ function markAsRead(_x9, _x10) {
384
+ return _markAsRead.apply(this, arguments);
385
+ }
386
+
387
+ return markAsRead;
359
388
  }()
360
389
  };
361
390
 
@@ -398,7 +427,7 @@
398
427
 
399
428
  case 3:
400
429
  res = _context.sent;
401
- console.log('getData', res.data);
430
+ console.log("getData", res.data);
402
431
 
403
432
  _this.props.circlesLoaded(res.data);
404
433
 
@@ -412,7 +441,7 @@
412
441
  case 9:
413
442
  _context.prev = 9;
414
443
  _context.t0 = _context["catch"](0);
415
- console.error('getData', _context.t0);
444
+ console.error("getData", _context.t0);
416
445
 
417
446
  _this.setState({
418
447
  loadingAll: false
@@ -427,6 +456,12 @@
427
456
  })));
428
457
  });
429
458
 
459
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "selectUnreadFilter", function (showUnreadOnly) {
460
+ _this.setState({
461
+ showUnreadOnly: showUnreadOnly
462
+ });
463
+ });
464
+
430
465
  _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "canAddNew", function () {
431
466
  var auth = _this.props.auth;
432
467
  return Session$3.validateAccess(auth.site, values.permission, auth);
@@ -494,9 +529,15 @@
494
529
  });
495
530
  });
496
531
 
532
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "selectSort", function (sortType) {
533
+ _this.setState({
534
+ sortBy: sortType
535
+ });
536
+ });
537
+
497
538
  _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "onHandleChange", function (event) {
498
539
  var stateChange = {};
499
- stateChange[event.target.getAttribute('id')] = event.target.value;
540
+ stateChange[event.target.getAttribute("id")] = event.target.value;
500
541
 
501
542
  _this.setState(stateChange);
502
543
  });
@@ -508,14 +549,14 @@
508
549
  circleActions.delete(circle.Id).then(function (res) {
509
550
  _this.getData();
510
551
  }).catch(function (res) {
511
- alert('Something went wrong with the request. Please try again.');
552
+ alert("Something went wrong with the request. Please try again.");
512
553
  });
513
554
  }
514
555
  });
515
556
 
516
557
  _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "getTypeFilterText", function (type) {
517
- if (type === 'private') {
518
- return 'Private Message';
558
+ if (type === "private") {
559
+ return "Private Message";
519
560
  }
520
561
 
521
562
  return ___default['default'].capitalize(values.entityName);
@@ -525,14 +566,17 @@
525
566
  if (circle.IsPrivate) {
526
567
  return "PM: ".concat(circle.Audience.map(function (user) {
527
568
  return user.displayName;
528
- }).join(', '));
569
+ }).join(", "));
529
570
  }
530
571
 
531
572
  return circle.Title;
532
573
  });
533
574
 
534
575
  _this.state = {
535
- userSearch: ''
576
+ userSearch: "",
577
+ sortBy: "newest",
578
+ showUnreadOnly: false,
579
+ pollingInterval: null
536
580
  };
537
581
  return _this;
538
582
  }
@@ -540,27 +584,77 @@
540
584
  _createClass__default['default'](Circles, [{
541
585
  key: "componentDidMount",
542
586
  value: function componentDidMount() {
543
- this.getData();
587
+ var _this2 = this;
588
+
589
+ this.getData(); // Poll for updates every 10 seconds
590
+
591
+ this.pollingInterval = setInterval(function () {
592
+ _this2.getData();
593
+ }, 10000);
594
+ }
595
+ }, {
596
+ key: "componentWillUnmount",
597
+ value: function componentWillUnmount() {
598
+ if (this.pollingInterval) {
599
+ clearInterval(this.pollingInterval);
600
+ }
601
+ }
602
+ }, {
603
+ key: "isCircleUnread",
604
+ value: function isCircleUnread(circle) {
605
+ var userId = this.props.user.Id;
606
+
607
+ if (!circle.Unread || !circle.Unread[userId]) {
608
+ return false;
609
+ }
610
+
611
+ return circle.Unread[userId] > 0;
612
+ }
613
+ }, {
614
+ key: "getUnreadCount",
615
+ value: function getUnreadCount(circle) {
616
+ var userId = this.props.user.Id;
617
+
618
+ if (!circle.Unread || !circle.Unread[userId]) {
619
+ return 0;
620
+ }
621
+
622
+ return circle.Unread[userId];
544
623
  }
545
624
  }, {
546
625
  key: "getCircles",
547
626
  value: function getCircles() {
548
- var _this2 = this;
627
+ var _this3 = this;
549
628
 
550
629
  var result = this.props.circles;
551
630
 
552
631
  if (this.state.selectedTypeFilter) {
553
632
  result = ___default['default'].filter(result, function (circle) {
554
- return _this2.state.selectedTypeFilter === 'circle' ? !circle.IsPrivate : circle.IsPrivate;
633
+ return _this3.state.selectedTypeFilter === "circle" ? !circle.IsPrivate : circle.IsPrivate;
555
634
  });
556
635
  }
557
636
 
558
637
  if (this.state.selectedUserFilter) {
559
638
  result = ___default['default'].filter(result, function (circle) {
560
639
  return ___default['default'].some(circle.Audience, function (user) {
561
- return user.userId === _this2.state.selectedUserFilter.userId;
640
+ return user.userId === _this3.state.selectedUserFilter.userId;
562
641
  });
563
642
  });
643
+ } // Apply sorting
644
+
645
+
646
+ result = ___default['default'].sortBy(result, function (circle) {
647
+ return moment__default['default'](circle.Changed).valueOf();
648
+ });
649
+
650
+ if (this.state.sortBy === "newest") {
651
+ result.reverse();
652
+
653
+ if (this.state.showUnreadOnly) {
654
+ result = ___default['default'].filter(result, function (circle) {
655
+ return _this3.isCircleUnread(circle);
656
+ });
657
+ }
564
658
  }
565
659
 
566
660
  return result;
@@ -568,7 +662,7 @@
568
662
  }, {
569
663
  key: "getUsers",
570
664
  value: function getUsers() {
571
- var _this3 = this;
665
+ var _this4 = this;
572
666
 
573
667
  var users = [];
574
668
  this.props.circles.forEach(function (circle) {
@@ -578,10 +672,10 @@
578
672
  });
579
673
  users = ___default['default'].sortBy(___default['default'].uniqBy(users, function (user) {
580
674
  return user.userId;
581
- }), 'displayName');
675
+ }), "displayName");
582
676
  return ___default['default'].filter(users, function (u) {
583
- if (!___default['default'].isEmpty(_this3.state.userSearch)) {
584
- return (u.displayName || '').toLowerCase().indexOf(_this3.state.userSearch.toLowerCase()) > -1;
677
+ if (!___default['default'].isEmpty(_this4.state.userSearch)) {
678
+ return (u.displayName || "").toLowerCase().indexOf(_this4.state.userSearch.toLowerCase()) > -1;
585
679
  }
586
680
 
587
681
  return true;
@@ -590,7 +684,7 @@
590
684
  }, {
591
685
  key: "validateCircleAdmin",
592
686
  value: function validateCircleAdmin(circle, onlyCreator) {
593
- var _this4 = this;
687
+ var _this5 = this;
594
688
 
595
689
  if (Session$3.validateAccess(this.props.auth.site, values.permission, this.props.auth)) {
596
690
  return true;
@@ -601,13 +695,13 @@
601
695
  }
602
696
 
603
697
  return ___default['default'].some(circle.Audience, function (user) {
604
- return user.userId === _this4.props.user.Id && user.isAdmin;
698
+ return user.userId === _this5.props.user.Id && user.isAdmin;
605
699
  });
606
700
  }
607
701
  }, {
608
702
  key: "renderRow",
609
703
  value: function renderRow(circle) {
610
- var _this5 = this;
704
+ var _this6 = this;
611
705
 
612
706
  return /*#__PURE__*/React__default['default'].createElement("tr", {
613
707
  key: circle.Id
@@ -615,7 +709,7 @@
615
709
  className: "table-TitleColumn"
616
710
  }, /*#__PURE__*/React__default['default'].createElement(reactRouterDom.Link, {
617
711
  to: "/".concat(values.featureKey, "/").concat(values.entityKey, "/").concat(circle.Id)
618
- }, this.getTitle(circle))), /*#__PURE__*/React__default['default'].createElement("td", null, moment__default['default'](circle.Changed).local().format('D MMM YYYY')), /*#__PURE__*/React__default['default'].createElement("td", null, circle.Audience.map(function (user) {
712
+ }, this.getTitle(circle))), /*#__PURE__*/React__default['default'].createElement("td", null, moment__default['default'](circle.Changed).local().format("D MMM YYYY")), /*#__PURE__*/React__default['default'].createElement("td", null, circle.Audience.map(function (user) {
619
713
  return /*#__PURE__*/React__default['default'].createElement(Components$4.ProfilePic, {
620
714
  size: 30,
621
715
  image: user.profilePic,
@@ -626,8 +720,8 @@
626
720
  className: "table-options"
627
721
  }, /*#__PURE__*/React__default['default'].createElement("div", {
628
722
  style: {
629
- display: 'flex',
630
- alignItems: 'center'
723
+ display: "flex",
724
+ alignItems: "center"
631
725
  }
632
726
  }, this.validateCircleAdmin(circle) && !circle.IsPrivate && /*#__PURE__*/React__default['default'].createElement(reactRouterDom.Link, {
633
727
  to: "/".concat(values.featureKey, "/edit/").concat(circle.Id)
@@ -636,19 +730,19 @@
636
730
  fontSize: 20,
637
731
  padding: 5,
638
732
  marginLeft: 12,
639
- cursor: 'pointer'
733
+ cursor: "pointer"
640
734
  },
641
735
  name: "pencil"
642
736
  })), this.validateCircleAdmin(circle, true) && !circle.IsPrivate && /*#__PURE__*/React__default['default'].createElement("a", {
643
737
  onClick: function onClick() {
644
- _this5.removeCircle(circle);
738
+ _this6.removeCircle(circle);
645
739
  }
646
740
  }, /*#__PURE__*/React__default['default'].createElement(FontAwesome__default['default'], {
647
741
  style: {
648
742
  fontSize: 20,
649
743
  padding: 5,
650
744
  marginLeft: 12,
651
- cursor: 'pointer'
745
+ cursor: "pointer"
652
746
  },
653
747
  name: "minus-circle"
654
748
  })))));
@@ -656,11 +750,21 @@
656
750
  }, {
657
751
  key: "renderFilters",
658
752
  value: function renderFilters() {
753
+ var _this7 = this;
754
+
659
755
  var userFilter = /*#__PURE__*/React__default['default'].createElement(Components$4.Tag, {
660
756
  className: "marginRight-10",
661
757
  onClick: this.openUserFilter,
662
758
  text: "User"
663
759
  });
760
+ var unreadFilter = /*#__PURE__*/React__default['default'].createElement(Components$4.Tag, {
761
+ className: "marginRight-10",
762
+ onClick: function onClick() {
763
+ return _this7.selectUnreadFilter(!_this7.state.showUnreadOnly);
764
+ },
765
+ leftIcon: this.state.showUnreadOnly ? "check" : null,
766
+ text: "Unread Only"
767
+ });
664
768
  var typeFilter = /*#__PURE__*/React__default['default'].createElement(Components$4.Tag, {
665
769
  className: "marginRight-10",
666
770
  onClick: this.openTypeFilter,
@@ -695,12 +799,28 @@
695
799
  }, /*#__PURE__*/React__default['default'].createElement(Components$4.Text, {
696
800
  type: "h5",
697
801
  className: "marginRight-20"
698
- }, "Filter by"), userFilter, typeFilter);
802
+ }, "Filter by"), userFilter, unreadFilter, typeFilter, /*#__PURE__*/React__default['default'].createElement(Components$4.Text, {
803
+ type: "h5",
804
+ className: "marginRight-20 marginLeft-20"
805
+ }, "Sort by:"), /*#__PURE__*/React__default['default'].createElement(Components$4.Tag, {
806
+ className: "marginRight-10",
807
+ onClick: function onClick() {
808
+ return _this7.selectSort("newest");
809
+ },
810
+ leftIcon: this.state.sortBy === "newest" ? "check" : null,
811
+ text: "Newest first"
812
+ }), /*#__PURE__*/React__default['default'].createElement(Components$4.Tag, {
813
+ onClick: function onClick() {
814
+ return _this7.selectSort("oldest");
815
+ },
816
+ leftIcon: this.state.sortBy === "oldest" ? "check" : null,
817
+ text: "Oldest first"
818
+ }));
699
819
  }
700
820
  }, {
701
821
  key: "renderUserFilterPopup",
702
822
  value: function renderUserFilterPopup() {
703
- var _this6 = this;
823
+ var _this8 = this;
704
824
 
705
825
  if (!this.state.userFilterOpen) {
706
826
  return null;
@@ -720,7 +840,7 @@
720
840
  placeholder: "Enter name",
721
841
  value: this.state.userSearch,
722
842
  onChange: function onChange(e) {
723
- return _this6.onHandleChange(e);
843
+ return _this8.onHandleChange(e);
724
844
  },
725
845
  alwaysShowLabel: true
726
846
  }), this.getUsers().map(function (user) {
@@ -728,7 +848,7 @@
728
848
  key: user.userId,
729
849
  user: user,
730
850
  onClick: function onClick() {
731
- _this6.selectUserFilter(user);
851
+ _this8.selectUserFilter(user);
732
852
  }
733
853
  });
734
854
  }));
@@ -736,7 +856,7 @@
736
856
  }, {
737
857
  key: "renderTypeFilterPopup",
738
858
  value: function renderTypeFilterPopup() {
739
- var _this7 = this;
859
+ var _this9 = this;
740
860
 
741
861
  if (!this.state.typeFilterOpen) {
742
862
  return null;
@@ -750,13 +870,13 @@
750
870
  onClose: this.closeTypeFilter
751
871
  }, /*#__PURE__*/React__default['default'].createElement(Components$4.Tag, {
752
872
  onClick: function onClick() {
753
- _this7.selectTypeFilter('circle');
873
+ _this9.selectTypeFilter("circle");
754
874
  },
755
875
  text: ___default['default'].capitalize(values.entityName),
756
876
  className: "marginRight-10"
757
877
  }), /*#__PURE__*/React__default['default'].createElement(Components$4.Tag, {
758
878
  onClick: function onClick() {
759
- _this7.selectTypeFilter('private');
879
+ _this9.selectTypeFilter("private");
760
880
  },
761
881
  text: "Private Message"
762
882
  }));
@@ -764,7 +884,7 @@
764
884
  }, {
765
885
  key: "render",
766
886
  value: function render() {
767
- var _this8 = this;
887
+ var _this10 = this;
768
888
 
769
889
  return /*#__PURE__*/React__default['default'].createElement("div", null, this.renderTypeFilterPopup(), this.renderUserFilterPopup(), /*#__PURE__*/React__default['default'].createElement(Components$4.Header, null, this.canAddNew() && /*#__PURE__*/React__default['default'].createElement(Components$4.AddButton, {
770
890
  onClick: this.onAddNew,
@@ -781,14 +901,14 @@
781
901
  condensed: true,
782
902
  hover: true,
783
903
  style: {
784
- minWidth: '100%'
904
+ minWidth: "100%"
785
905
  }
786
906
  }, /*#__PURE__*/React__default['default'].createElement("thead", null, /*#__PURE__*/React__default['default'].createElement("tr", null, /*#__PURE__*/React__default['default'].createElement("th", null, "Title"), /*#__PURE__*/React__default['default'].createElement("th", null, "Last updated"), /*#__PURE__*/React__default['default'].createElement("th", null, "Members"), /*#__PURE__*/React__default['default'].createElement("th", {
787
907
  style: {
788
908
  width: 50
789
909
  }
790
910
  }))), /*#__PURE__*/React__default['default'].createElement("tbody", null, this.getCircles().map(function (circle) {
791
- return _this8.renderRow(circle);
911
+ return _this10.renderRow(circle);
792
912
  })))));
793
913
  }
794
914
  }]);
@@ -1752,6 +1872,32 @@
1752
1872
  });
1753
1873
  });
1754
1874
 
1875
+ _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "markCircleAsRead", /*#__PURE__*/_asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee5() {
1876
+ return _regeneratorRuntime__default['default'].wrap(function _callee5$(_context5) {
1877
+ while (1) {
1878
+ switch (_context5.prev = _context5.next) {
1879
+ case 0:
1880
+ _context5.prev = 0;
1881
+ _context5.next = 3;
1882
+ return circleActions.markAsRead(_this.state.circleId, _this.props.user.Id);
1883
+
1884
+ case 3:
1885
+ _context5.next = 8;
1886
+ break;
1887
+
1888
+ case 5:
1889
+ _context5.prev = 5;
1890
+ _context5.t0 = _context5["catch"](0);
1891
+ console.error("Failed to mark circle as read:", _context5.t0);
1892
+
1893
+ case 8:
1894
+ case "end":
1895
+ return _context5.stop();
1896
+ }
1897
+ }
1898
+ }, _callee5, null, [[0, 5]]);
1899
+ })));
1900
+
1755
1901
  _defineProperty__default['default'](_assertThisInitialized__default['default'](_this), "sendMessage", function () {
1756
1902
  var message = {
1757
1903
  _id: Helper.randomString(),
@@ -1836,6 +1982,7 @@
1836
1982
  _createClass__default['default'](Circle, [{
1837
1983
  key: "componentDidMount",
1838
1984
  value: function componentDidMount() {
1985
+ this.markCircleAsRead();
1839
1986
  this.checkGetData();
1840
1987
  this.connect();
1841
1988
  this.props.setNavData({
@@ -1972,8 +2119,8 @@
1972
2119
  display: this.state.imageInputShowing ? "block" : "none"
1973
2120
  }
1974
2121
  }, /*#__PURE__*/React__default['default'].createElement(Components$2.ImageInput, {
1975
- ref: function ref(_ref5) {
1976
- _this5.imageInput = _ref5;
2122
+ ref: function ref(_ref6) {
2123
+ _this5.imageInput = _ref6;
1977
2124
  },
1978
2125
  multiple: true,
1979
2126
  limit: 10,
@@ -1987,8 +2134,8 @@
1987
2134
  display: this.state.fileInputShowing ? "block" : "none"
1988
2135
  }
1989
2136
  }, /*#__PURE__*/React__default['default'].createElement(Components$2.FileInput, {
1990
- ref: function ref(_ref6) {
1991
- _this5.fileInput = _ref6;
2137
+ ref: function ref(_ref7) {
2138
+ _this5.fileInput = _ref7;
1992
2139
  },
1993
2140
  multiple: true,
1994
2141
  limit: 10,
@@ -2282,8 +2429,8 @@
2282
2429
  }, /*#__PURE__*/React__default['default'].createElement("div", {
2283
2430
  className: "chat_newMessage"
2284
2431
  }, this.renderChatInput()), this.renderReplyTo(), /*#__PURE__*/React__default['default'].createElement("div", {
2285
- ref: function ref(_ref7) {
2286
- return _this8.chat = _ref7;
2432
+ ref: function ref(_ref8) {
2433
+ return _this8.chat = _ref8;
2287
2434
  },
2288
2435
  className: "chat_messages"
2289
2436
  }, ___default['default'].isEmpty(this.state.messages) && !___default['default'].isEmpty(this.state.messageDate) && this.renderEmptyDate(), this.state.messages.map(function (m) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plusscommunities/pluss-circles-web-groups",
3
- "version": "1.5.6",
3
+ "version": "1.5.7-beta.1",
4
4
  "description": "Extension package to enable circles on Pluss Communities Platform",
5
5
  "main": "dist/index.cjs.js",
6
6
  "scripts": {
@@ -13,7 +13,7 @@
13
13
  "upload:p": "npm run patch && npm run upload",
14
14
  "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",
15
15
  "copy:get": "echo $npm_package_name",
16
- "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",
16
+ "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",
17
17
  "copy:betaupload": "npm run betapatch; 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;",
18
18
  "copy:upload": "npm run patch; 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;"
19
19
  },
@@ -113,4 +113,14 @@ export const circleActions = {
113
113
  },
114
114
  });
115
115
  },
116
+ markAsRead: async (circleId, userId) => {
117
+ return Session.authedFunction({
118
+ method: 'post',
119
+ url: Helper.getUrl('notifications', 'resetunread'),
120
+ data: {
121
+ groupID: circleId,
122
+ userID: userId,
123
+ },
124
+ });
125
+ },
116
126
  };
@@ -37,6 +37,7 @@ class Circle extends Component {
37
37
  }
38
38
 
39
39
  componentDidMount() {
40
+ this.markCircleAsRead();
40
41
  this.checkGetData();
41
42
  this.connect();
42
43
  this.props.setNavData({ hideSideMenu: true });
@@ -332,6 +333,14 @@ class Circle extends Component {
332
333
  });
333
334
  };
334
335
 
336
+
337
+ markCircleAsRead = async () => {
338
+ try {
339
+ await circleActions.markAsRead(this.state.circleId, this.props.user.Id);
340
+ } catch (error) {
341
+ console.error("Failed to mark circle as read:", error);
342
+ }
343
+ };
335
344
  sendMessage = () => {
336
345
  const message = {
337
346
  _id: Helper.randomString(),