From 9f40175eade3d071a02696ca7042199bfc5042ce Mon Sep 17 00:00:00 2001 From: Philippe Logel Date: Sat, 13 Apr 2024 16:23:43 +0000 Subject: [PATCH 01/16] session photos introduction : to delete the thumbnail route --- .../Session/VIEWSessionController.php | 5 ++++- src/EcclesiaCRM/dto/Photo.php | 3 ++- src/EcclesiaCRM/model/EcclesiaCRM/Family.php | 16 ++++++++++++++++ src/EcclesiaCRM/model/EcclesiaCRM/Person.php | 16 ++++++++++++++++ src/EcclesiaCRM/model/EcclesiaCRM/User.php | 5 +++++ 5 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/EcclesiaCRM/VIEWControllers/Session/VIEWSessionController.php b/src/EcclesiaCRM/VIEWControllers/Session/VIEWSessionController.php index 25de4b2fb..26c67f5aa 100644 --- a/src/EcclesiaCRM/VIEWControllers/Session/VIEWSessionController.php +++ b/src/EcclesiaCRM/VIEWControllers/Session/VIEWSessionController.php @@ -107,9 +107,12 @@ public function renderLogout(ServerRequestInterface $request, ResponseInterface unset($_SESSION['ControllerAdminUserSecret']); unset($_SESSION['ControllerAdminUserToken']); } + + if (isset($_SESSION['photos'])) { + unset($_SESSION['photos']); + } if (!is_null($currentUser)) { - $currentUser->setShowPledges($_SESSION['sshowPledges']); $currentUser->setShowPayments($_SESSION['sshowPayments']); $currentUser->setDefaultFY($_SESSION['idefaultFY']); diff --git a/src/EcclesiaCRM/dto/Photo.php b/src/EcclesiaCRM/dto/Photo.php index 22bf246d3..ecbcd2f76 100644 --- a/src/EcclesiaCRM/dto/Photo.php +++ b/src/EcclesiaCRM/dto/Photo.php @@ -14,6 +14,7 @@ class Photo { private $photoThumbURI; private $photoContentType; private $remotesEnabled; + private $thumbnailContentType; public static $validExtensions = ["png", "jpeg", "jpg"]; public function __construct($photoType,$id) { @@ -103,7 +104,7 @@ private function convertToPNG() { $image = $this->getGDImage($this->getPhotoURI()); $this->delete(); $targetPath = SystemURLs::getImagesRoot() . "/" . $this->photoType . "/" . $this->id.".png"; - imagepng($image,$targetPath); + imagepng($image,$targetPath, 3); $this->setURIs($targetPath); } diff --git a/src/EcclesiaCRM/model/EcclesiaCRM/Family.php b/src/EcclesiaCRM/model/EcclesiaCRM/Family.php index 472b96a8d..f3d5601e7 100644 --- a/src/EcclesiaCRM/model/EcclesiaCRM/Family.php +++ b/src/EcclesiaCRM/model/EcclesiaCRM/Family.php @@ -328,6 +328,22 @@ public function getPhoto() return $this->photo; } + // 'initials-image direct-chat-img' + public function getJPGPhotoDatas($width = '50', $heigth = '50', $class = 'user-image initials-image'): string + { + if (isset($_SESSION['photos']['families'][$this->getId()])) { + return $_SESSION['photos']['families'][$this->getId()]; + } + + // usefull for base 64 + $photo = $this->getPhoto(); + $datas = base64_encode($photo->getThumbnailBytes()); + + $_SESSION['photos']['families'][$this->getId()] = ''; + + return $_SESSION['photos']['families'][$this->getId()]; + } + public function deletePhoto() { if (SessionUser::getUser()->isAddRecordsEnabled() || SessionUser::getUser()->getPerson()->getFamily()->getId() == $this->getId() ) { diff --git a/src/EcclesiaCRM/model/EcclesiaCRM/Person.php b/src/EcclesiaCRM/model/EcclesiaCRM/Person.php index 4a81f39d5..60559461d 100644 --- a/src/EcclesiaCRM/model/EcclesiaCRM/Person.php +++ b/src/EcclesiaCRM/model/EcclesiaCRM/Person.php @@ -565,6 +565,22 @@ public function getLatLng() ); } + // 'initials-image direct-chat-img' + public function getJPGPhotoDatas($width = '50', $heigth = '50', $class = 'user-image initials-image'): string + { + if (isset($_SESSION['photos']['persons'][$this->getId()])) { + return $_SESSION['photos']['persons'][$this->getId()]; + } + + // usefull for base 64 + $photo = $this->getPhoto(); + $datas = base64_encode($photo->getThumbnailBytes()); + + $_SESSION['photos']['persons'][$this->getId()] = ''; + + return $_SESSION['photos']['persons'][$this->getId()]; + } + public function deletePhoto() { if (SessionUser::getUser()->isAddRecordsEnabled() || SessionUser::getUser()->getPersonId() == $this->getId() ) { diff --git a/src/EcclesiaCRM/model/EcclesiaCRM/User.php b/src/EcclesiaCRM/model/EcclesiaCRM/User.php index d5ad3d5f7..ec6cb3599 100644 --- a/src/EcclesiaCRM/model/EcclesiaCRM/User.php +++ b/src/EcclesiaCRM/model/EcclesiaCRM/User.php @@ -1056,6 +1056,11 @@ public function LoginPhaseActivations($takeControl = false) $_SESSION['sshowPledges'] = $this->getShowPledges(); $_SESSION['sshowPayments'] = $this->getShowPayments(); + $_SESSION['photos'] = [ + 'persons' => [], + 'families' => [] + ]; + // set the jwt token // we create the token and secret, only when login in not as ControllerAdminUserId if (!isset($_SESSION['ControllerAdminUserId'])) { From 2150b9b1b930da36b7538729bcced13ce1ba8b03 Mon Sep 17 00:00:00 2001 From: Philippe Logel Date: Sat, 13 Apr 2024 16:24:28 +0000 Subject: [PATCH 02/16] Add image to group --- .../APIControllers/PeopleGroupController.php | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/EcclesiaCRM/APIControllers/PeopleGroupController.php b/src/EcclesiaCRM/APIControllers/PeopleGroupController.php index 51de5fa85..cb24f9349 100644 --- a/src/EcclesiaCRM/APIControllers/PeopleGroupController.php +++ b/src/EcclesiaCRM/APIControllers/PeopleGroupController.php @@ -10,6 +10,7 @@ namespace EcclesiaCRM\APIControllers; +use EcclesiaCRM\Base\FamilyQuery; use Psr\Container\ContainerInterface; use Slim\Http\Response; use Slim\Http\ServerRequest; @@ -397,19 +398,21 @@ public function groupMembers (ServerRequest $request, Response $response, array } $groupID = $args['groupID']; - $members = Person2group2roleP2g2rQuery::create() + $membersArray = Person2group2roleP2g2rQuery::create() ->joinWithPerson() ->usePersonQuery() ->filterByDateDeactivated(null)// GDRP, when a person is completely deactivated ->endUse() - ->findByGroupId($groupID); + ->findByGroupId($groupID)->toArray(); - // we loop to find the information in the family to add adresses etc ... this is now unusefull, the address is created automatically - foreach ($members as $member) + // we loop to find the information in the family to add adresses etc ... this is now unusefull, the address is created automatically + $res = []; + + foreach ($membersArray as $member) { - $p = $member->getPerson(); - $fam = $p->getFamily(); + $fam = FamilyQuery::create()->findOneById($member['PersonId']); + $per = PersonQuery::create()->findOneById($member['PersonId']); // Philippe Logel : this is usefull when a person don't have a family : ie not an address if (!is_null($fam) @@ -420,16 +423,18 @@ public function groupMembers (ServerRequest $request, Response $response, array && !is_null($fam->getZip()) ) { - $p->setAddress1 ($fam->getAddress1()); - $p->setAddress2 ($fam->getAddress2()); - - $p->setCity($fam->getCity()); - $p->setState($fam->getState()); - $p->setZip($fam->getZip()); + $member['Person']['Address1']= $fam->getAddress1(); + $member['Person']['Address2']= $fam->getAddress2(); + $member['Person']['City']= $fam->getCity(); + $member['Person']['State']= $fam->getState(); + $member['Person']['Zip']= $fam->getZip(); + $member['Person']['img']= $per->getJPGPhotoDatas(); + + $res[] = $member; } } - return $response->write($members->toJSON()); + return $response->withJson(['Person2group2roleP2g2rs' => $res]); } public function groupEvents (ServerRequest $request, Response $response, array $args): Response { From 9e6192ff78769df39c218532301d217919847250 Mon Sep 17 00:00:00 2001 From: Philippe Logel Date: Sat, 13 Apr 2024 16:25:04 +0000 Subject: [PATCH 03/16] Add image to sunday group --- src/EcclesiaCRM/APIControllers/SundaySchoolController.php | 5 +++++ src/skin/js/sundayschool/SundaySchoolClassView.js | 6 ++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/EcclesiaCRM/APIControllers/SundaySchoolController.php b/src/EcclesiaCRM/APIControllers/SundaySchoolController.php index 0e88ac51a..e84a68cff 100644 --- a/src/EcclesiaCRM/APIControllers/SundaySchoolController.php +++ b/src/EcclesiaCRM/APIControllers/SundaySchoolController.php @@ -10,6 +10,7 @@ namespace EcclesiaCRM\APIControllers; +use EcclesiaCRM\Base\PersonQuery; use Psr\Container\ContainerInterface; use Slim\Http\Response; use Slim\Http\ServerRequest; @@ -38,6 +39,10 @@ public function getallstudentsForGroup (ServerRequest $request, Response $respon $children['inCart']=0; } + $per = PersonQuery::create()->findOneById($children['kidId']); + + $children['img'] = $per->getJPGPhotoDatas(50,50); + $result[] = $children; } diff --git a/src/skin/js/sundayschool/SundaySchoolClassView.js b/src/skin/js/sundayschool/SundaySchoolClassView.js index c165165fe..8cb473936 100644 --- a/src/skin/js/sundayschool/SundaySchoolClassView.js +++ b/src/skin/js/sundayschool/SundaySchoolClassView.js @@ -59,8 +59,7 @@ $(function() { ' ' + '
'; - res += ' User Image'; + res += data.teachers[i].img; if (data.teachersProps[i][data.teachers[i]['per_ID']] != false) { res += '

' + data.teachersProps[i][data.teachers[i]['per_ID']] + '

'; @@ -384,8 +383,7 @@ $(function() { return '' + '' + ' ' + ' diff --git a/src/v2/templates/people/personview.php b/src/v2/templates/people/personview.php index 89c93d65f..d44b44f49 100644 --- a/src/v2/templates/people/personview.php +++ b/src/v2/templates/people/personview.php @@ -800,9 +800,7 @@ class="fas fa-cloud"> ?> From 37dfa4daad34963b792adfd281f7a3990d8ca393 Mon Sep 17 00:00:00 2001 From: Philippe Logel Date: Sat, 13 Apr 2024 16:36:13 +0000 Subject: [PATCH 10/16] pastoral care update --- src/Images/Family.png | Bin 0 -> 26741 bytes src/Images/Person.png | Bin 0 -> 26155 bytes .../js/pastoralcare/PastoralCareDashboard.js | 12 ++++++------ 3 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 src/Images/Family.png create mode 100644 src/Images/Person.png diff --git a/src/Images/Family.png b/src/Images/Family.png new file mode 100644 index 0000000000000000000000000000000000000000..9cc0c02433b07fb6be4acfd711bf32d687cdd13f GIT binary patch literal 26741 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 literal 0 HcmV?d00001 diff --git a/src/skin/js/pastoralcare/PastoralCareDashboard.js b/src/skin/js/pastoralcare/PastoralCareDashboard.js index a3941dc80..74e92e242 100644 --- a/src/skin/js/pastoralcare/PastoralCareDashboard.js +++ b/src/skin/js/pastoralcare/PastoralCareDashboard.js @@ -18,7 +18,7 @@ $(function() { if (window.CRM.bThumbnailIconPresence) { res += 'User Image '; } - return res + ' '+ data + ''; + return res + ' '+ data + ''; } }, { @@ -94,7 +94,7 @@ $(function() { if (window.CRM.bThumbnailIconPresence) { res += 'User Image '; } - return res + ' '+ data + ""; + return res + ' '+ data + ""; } }, { @@ -151,7 +151,7 @@ $(function() { if (window.CRM.bThumbnailIconPresence) { res += 'User Image '; } - return res + ' '+ data + ""; + return res + ' '+ data + ""; } }, { @@ -200,7 +200,7 @@ $(function() { if (window.CRM.bThumbnailIconPresence) { res += 'User Image '; } - return res + ' '+ data + ""; + return res + ' '+ data + ""; } }, { @@ -257,7 +257,7 @@ $(function() { if (window.CRM.bThumbnailIconPresence) { res += 'User Image '; } - return res + ' '+ data + ""; + return res + ' '+ data + ""; } }, { @@ -314,7 +314,7 @@ $(function() { if (window.CRM.bThumbnailIconPresence) { res += 'User Image '; } - return res + ' '+ data + ""; + return res + ' '+ data + ""; } }, { From 79ed29fb9039ee419059d23b38df610f9a1c5f20 Mon Sep 17 00:00:00 2001 From: Philippe Logel Date: Sat, 13 Apr 2024 17:06:40 +0000 Subject: [PATCH 11/16] checkin update --- src/EcclesiaCRM/APIControllers/PeopleAttendeesController.php | 1 + src/skin/js/event/Checkin.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/EcclesiaCRM/APIControllers/PeopleAttendeesController.php b/src/EcclesiaCRM/APIControllers/PeopleAttendeesController.php index a00125566..a30077ce6 100644 --- a/src/EcclesiaCRM/APIControllers/PeopleAttendeesController.php +++ b/src/EcclesiaCRM/APIControllers/PeopleAttendeesController.php @@ -314,6 +314,7 @@ public function attendeesEvent(ServerRequest $request, Response $response, array $item['isCheckinDate'] = (!is_null($per->getCheckinDate())) ? "checked" : ""; $item['checkoutDate'] = (!empty($per->getCheckoutDate())) ? OutputUtils::FormatDate($per->getCheckoutDate()->format("Y-m-d H:i:s"), 1) : ""; $item['isCheckoutDate'] = (!is_null($per->getCheckoutDate())) ? "checked" : ""; + $item['img'] = $checkedInPerson->getJPGPhotoDatas(); if (is_null($checkedInPerson)) {// we have to avoid pure user and not persons continue; diff --git a/src/skin/js/event/Checkin.js b/src/skin/js/event/Checkin.js index d417de5ff..904b9b1ca 100644 --- a/src/skin/js/event/Checkin.js +++ b/src/skin/js/event/Checkin.js @@ -256,7 +256,7 @@ $(function() { title: i18next.t('Photo'), data: 'Id', render: function (data, type, full, meta) { - return ''; + return full.img; } }, { From cbcc26fc348b1b8f4949b1452878b9a69c7646c1 Mon Sep 17 00:00:00 2001 From: Philippe Logel Date: Sat, 13 Apr 2024 17:07:34 +0000 Subject: [PATCH 12/16] code cleanup --- src/Include/Header.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/Include/Header.php b/src/Include/Header.php index 6ca10da45..01f3bd707 100644 --- a/src/Include/Header.php +++ b/src/Include/Header.php @@ -36,7 +36,6 @@ require_once 'Header-Security.php'; // Top level menu index counter -$MenuFirst = 1; ?> @@ -63,9 +62,6 @@ class="sidebar-mini layout-navbar-fixed layout-fixed getPersonId() . '/thumbnail'; - $MenuFirst = 1; ?>
' - + ' User Image' + + full.img + ' ' + ' ' + full.firstName + '' From 7e6092d6f09b463a8fd19fc5e99e97f1a2ccfcd3 Mon Sep 17 00:00:00 2001 From: Philippe Logel Date: Sat, 13 Apr 2024 16:25:28 +0000 Subject: [PATCH 04/16] Add image to group js code --- src/skin/js/group/GroupView.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/skin/js/group/GroupView.js b/src/skin/js/group/GroupView.js index f76834696..a033c1e1d 100644 --- a/src/skin/js/group/GroupView.js +++ b/src/skin/js/group/GroupView.js @@ -382,7 +382,7 @@ function initDataTable() { title: i18next.t('Name'), data: 'PersonId', render: function (data, type, full, meta) { - return '   ' + full.Person.FirstName + " " + full.Person.LastName + ''; + return full.Person.img + '   ' + full.Person.FirstName + " " + full.Person.LastName + ''; } }, { From d68ba8436893598e27d1a80875c53548ac8c3b36 Mon Sep 17 00:00:00 2001 From: Philippe Logel Date: Sat, 13 Apr 2024 16:27:37 +0000 Subject: [PATCH 05/16] search engine update : for images --- src/EcclesiaCRM/APIControllers/SearchController.php | 1 - src/EcclesiaCRM/Search/AddressSearchRes.php | 2 +- src/EcclesiaCRM/Search/DepositSearchRes.php | 2 +- src/EcclesiaCRM/Search/FamilyCustomSearchRes.php | 5 ++--- src/EcclesiaCRM/Search/FamilyPastoralCareSearchRes.php | 4 ++-- src/EcclesiaCRM/Search/FamilyPropsSearchRes.php | 4 ++-- src/EcclesiaCRM/Search/FamilySearchRes.php | 4 ++-- src/EcclesiaCRM/Search/GroupPropsSearchRes.php | 2 +- src/EcclesiaCRM/Search/GroupSearchRes.php | 2 +- src/EcclesiaCRM/Search/PaymentSearchRes.php | 2 +- src/EcclesiaCRM/Search/PersonAssignToGroupSearchRes.php | 4 ++-- src/EcclesiaCRM/Search/PersonCustomSearchRes.php | 4 ++-- src/EcclesiaCRM/Search/PersonGroupManagerSearchRes.php | 4 ++-- src/EcclesiaCRM/Search/PersonPastoralCareSearchRes.php | 4 ++-- src/EcclesiaCRM/Search/PersonPropsSearchRes.php | 4 ++-- src/EcclesiaCRM/Search/PersonSearchRes.php | 4 ++-- src/EcclesiaCRM/Search/PersonVolunteerOpportunitySearch.php | 5 ++--- src/EcclesiaCRM/Search/PledgeSearchRes.php | 2 +- src/EcclesiaCRM/Search/SearchRes.php | 2 -- 19 files changed, 28 insertions(+), 33 deletions(-) diff --git a/src/EcclesiaCRM/APIControllers/SearchController.php b/src/EcclesiaCRM/APIControllers/SearchController.php index 6b52b9e56..bfcc8ff6c 100644 --- a/src/EcclesiaCRM/APIControllers/SearchController.php +++ b/src/EcclesiaCRM/APIControllers/SearchController.php @@ -10,7 +10,6 @@ namespace EcclesiaCRM\APIControllers; -use EcclesiaCRM\Utils\LoggerUtils; use EcclesiaCRM\VolunteerOpportunityQuery; use Psr\Container\ContainerInterface; use Slim\Http\Response; diff --git a/src/EcclesiaCRM/Search/AddressSearchRes.php b/src/EcclesiaCRM/Search/AddressSearchRes.php index f852ac0e0..f83642d1c 100644 --- a/src/EcclesiaCRM/Search/AddressSearchRes.php +++ b/src/EcclesiaCRM/Search/AddressSearchRes.php @@ -157,7 +157,7 @@ public function buildSearch(string $qry) } } } - } catch (Exception $e) { + } catch (\Exception $e) { LoggerUtils::getAppLogger()->warn($e->getMessage()); } } diff --git a/src/EcclesiaCRM/Search/DepositSearchRes.php b/src/EcclesiaCRM/Search/DepositSearchRes.php index a42a497c6..9ce140103 100644 --- a/src/EcclesiaCRM/Search/DepositSearchRes.php +++ b/src/EcclesiaCRM/Search/DepositSearchRes.php @@ -100,7 +100,7 @@ public function buildSearch(string $qry) array_push($this->results, $elt); } } - } catch (Exception $e) { + } catch (\Exception $e) { LoggerUtils::getAppLogger()->warn($e->getMessage()); } } diff --git a/src/EcclesiaCRM/Search/FamilyCustomSearchRes.php b/src/EcclesiaCRM/Search/FamilyCustomSearchRes.php index 58df4da0c..d29bb62c3 100644 --- a/src/EcclesiaCRM/Search/FamilyCustomSearchRes.php +++ b/src/EcclesiaCRM/Search/FamilyCustomSearchRes.php @@ -4,7 +4,6 @@ use EcclesiaCRM\dto\Cart; use EcclesiaCRM\dto\SystemURLs; -use EcclesiaCRM\Person2group2roleP2g2rQuery; use EcclesiaCRM\Search\BaseSearchRes; use EcclesiaCRM\Base\FamilyCustomMasterQuery; use EcclesiaCRM\Base\FamilyCustomQuery; @@ -129,7 +128,7 @@ public function buildSearch(string $qry) $elt = [ "id" => $fam->getFamily()->getId(), - "img" =>'', + "img" => $fam->getFamily()->getJPGPhotoDatas(), "searchresult" => _("Family").' : '.$fam->getFamily()->getName().''." "._("Members")." :
".$globalMembers, "address" => (!SessionUser::getUser()->isSeePrivacyDataEnabled())?_('Private Data'):$fam->getFamily()->getFamilyString(SystemConfig::getBooleanValue("bSearchIncludeFamilyHOH")), "type" => _($this->getGlobalSearchType()), @@ -147,7 +146,7 @@ public function buildSearch(string $qry) } } } - } catch (Exception $e) { + } catch (\Exception $e) { LoggerUtils::getAppLogger()->warn($e->getMessage()); } } diff --git a/src/EcclesiaCRM/Search/FamilyPastoralCareSearchRes.php b/src/EcclesiaCRM/Search/FamilyPastoralCareSearchRes.php index e4d3d8877..7dc228cb2 100644 --- a/src/EcclesiaCRM/Search/FamilyPastoralCareSearchRes.php +++ b/src/EcclesiaCRM/Search/FamilyPastoralCareSearchRes.php @@ -121,7 +121,7 @@ public function buildSearch(string $qry) $elt = [ "id" => $care->getFamily()->getId(), - "img" => '', + "img" => $care->getFamily()->getJPGPhotoDatas(), "searchresult" => _("Family Pastoral Care") . ' : ' . $care->getFamily()->getName() . '' . " " . _("Members") . " :
" . $globalMembers, "address" => (!SessionUser::getUser()->isSeePrivacyDataEnabled()) ? _('Private Data') : $care->getFamily()->getFamilyString(SystemConfig::getBooleanValue("bSearchIncludeFamilyHOH")), "type" => " " . _($this->getGlobalSearchType()), @@ -138,7 +138,7 @@ public function buildSearch(string $qry) array_push($this->results, $elt); } } - } catch (Exception $e) { + } catch (\Exception $e) { LoggerUtils::getAppLogger()->warn($e->getMessage()); } } diff --git a/src/EcclesiaCRM/Search/FamilyPropsSearchRes.php b/src/EcclesiaCRM/Search/FamilyPropsSearchRes.php index 5001f8ee1..dfc64c0e2 100644 --- a/src/EcclesiaCRM/Search/FamilyPropsSearchRes.php +++ b/src/EcclesiaCRM/Search/FamilyPropsSearchRes.php @@ -133,7 +133,7 @@ public function buildSearch(string $qry) $elt = [ "id" => $family->getId(), - "img" => '', + "img" => $family->getJPGPhotoDatas(), "searchresult" => _("Family") . ' : ' . $family->getName() . '' . " " . _("Members") . " :
" . $globalMembers, "address" => (!SessionUser::getUser()->isSeePrivacyDataEnabled()) ? _('Private Data') : $family->getFamilyString(SystemConfig::getBooleanValue("bSearchIncludeFamilyHOH")), "type" => _($this->getGlobalSearchType()), @@ -150,7 +150,7 @@ public function buildSearch(string $qry) array_push($this->results, $elt); } } - } catch (Exception $e) { + } catch (\Exception $e) { LoggerUtils::getAppLogger()->warn($e->getMessage()); } } diff --git a/src/EcclesiaCRM/Search/FamilySearchRes.php b/src/EcclesiaCRM/Search/FamilySearchRes.php index 7e7a86e1a..8e20f4b45 100644 --- a/src/EcclesiaCRM/Search/FamilySearchRes.php +++ b/src/EcclesiaCRM/Search/FamilySearchRes.php @@ -162,7 +162,7 @@ public function buildSearch(string $qry) } elseif ( $isGlobalSearch ) { $elt = [ "id" => $family->getId(), - "img" => '', + "img" => $family->getJPGPhotoDatas(), "searchresult" => _("Family") . ' : ' . $family->getName() . '' . " " . _("Members") . " :
" . $globalMembers, "address" => (!SessionUser::getUser()->isSeePrivacyDataEnabled()) ? _('Private Data') : $family->getFamilyString(SystemConfig::getBooleanValue("bSearchIncludeFamilyHOH")), "type" => (mb_strtolower($qry) == mb_strtolower(_('single')) || mb_strtolower($qry) == mb_strtolower(_('singles'))) ? _("Singles") : _($this->getGlobalSearchType()), @@ -180,7 +180,7 @@ public function buildSearch(string $qry) } } } - } catch (Exception $e) { + } catch (\Exception $e) { LoggerUtils::getAppLogger()->warn($e->getMessage()); } } diff --git a/src/EcclesiaCRM/Search/GroupPropsSearchRes.php b/src/EcclesiaCRM/Search/GroupPropsSearchRes.php index f6664b1e4..bc205ad3a 100644 --- a/src/EcclesiaCRM/Search/GroupPropsSearchRes.php +++ b/src/EcclesiaCRM/Search/GroupPropsSearchRes.php @@ -138,7 +138,7 @@ public function buildSearch(string $qry) array_push($this->results, $elt); } } - } catch (Exception $e) { + } catch (\Exception $e) { LoggerUtils::getAppLogger()->warn($e->getMessage()); } } diff --git a/src/EcclesiaCRM/Search/GroupSearchRes.php b/src/EcclesiaCRM/Search/GroupSearchRes.php index 90d7ebcbf..257207ca9 100644 --- a/src/EcclesiaCRM/Search/GroupSearchRes.php +++ b/src/EcclesiaCRM/Search/GroupSearchRes.php @@ -139,7 +139,7 @@ public function buildSearch(string $qry) array_push($this->results, $elt); } } - } catch (Exception $e) { + } catch (\Exception $e) { LoggerUtils::getAppLogger()->warn($e->getMessage()); } } diff --git a/src/EcclesiaCRM/Search/PaymentSearchRes.php b/src/EcclesiaCRM/Search/PaymentSearchRes.php index 14665cc95..1cc7d0b03 100644 --- a/src/EcclesiaCRM/Search/PaymentSearchRes.php +++ b/src/EcclesiaCRM/Search/PaymentSearchRes.php @@ -66,7 +66,7 @@ public function buildSearch(string $qry) array_push($this->results, $elt); } } - } catch (Exception $e) { + } catch (\Exception $e) { LoggerUtils::getAppLogger()->warn($e->getMessage()); } } diff --git a/src/EcclesiaCRM/Search/PersonAssignToGroupSearchRes.php b/src/EcclesiaCRM/Search/PersonAssignToGroupSearchRes.php index 5dd6d668d..f765b8eb3 100644 --- a/src/EcclesiaCRM/Search/PersonAssignToGroupSearchRes.php +++ b/src/EcclesiaCRM/Search/PersonAssignToGroupSearchRes.php @@ -132,7 +132,7 @@ public function buildSearch(string $qry) $elt = [ "id" => $per->getPerson()->getId(), - "img" => '', + "img" => $per->getPerson()->getJPGPhotoDatas(), "searchresult" => '' . OutputUtils::FormatFullName($per->getPerson()->getTitle(), $per->getPerson()->getFirstName(), $per->getPerson()->getMiddleName(), $per->getPerson()->getLastName(), $per->getPerson()->getSuffix(), 3) . ' ('.$per->getgroupName().')', "address" => (!SessionUser::getUser()->isSeePrivacyDataEnabled()) ? _('Private Data') : $address, @@ -150,7 +150,7 @@ public function buildSearch(string $qry) array_push($this->results, $elt); } } - } catch (Exception $e) { + } catch (\Exception $e) { LoggerUtils::getAppLogger()->warn($e->getMessage()); } } diff --git a/src/EcclesiaCRM/Search/PersonCustomSearchRes.php b/src/EcclesiaCRM/Search/PersonCustomSearchRes.php index 06403c7d5..8800bcd1f 100644 --- a/src/EcclesiaCRM/Search/PersonCustomSearchRes.php +++ b/src/EcclesiaCRM/Search/PersonCustomSearchRes.php @@ -128,7 +128,7 @@ public function buildSearch(string $qry) $elt = [ "id" => $per->getPerson()->getId(), - "img" => '', + "img" => $per->getJPGPhotoDatas(), "searchresult" => '' . OutputUtils::FormatFullName($per->getPerson()->getTitle(), $per->getPerson()->getFirstName(), $per->getPerson()->getMiddleName(), $per->getPerson()->getLastName(), $per->getPerson()->getSuffix(), 3) . '', "address" => (!SessionUser::getUser()->isSeePrivacyDataEnabled()) ? _('Private Data') : $address, "type" => " " . _($this->getGlobalSearchType()), @@ -147,7 +147,7 @@ public function buildSearch(string $qry) } } } - } catch (Exception $e) { + } catch (\Exception $e) { LoggerUtils::getAppLogger()->warn($e->getMessage()); } } diff --git a/src/EcclesiaCRM/Search/PersonGroupManagerSearchRes.php b/src/EcclesiaCRM/Search/PersonGroupManagerSearchRes.php index 770364bfa..9831430bc 100644 --- a/src/EcclesiaCRM/Search/PersonGroupManagerSearchRes.php +++ b/src/EcclesiaCRM/Search/PersonGroupManagerSearchRes.php @@ -134,7 +134,7 @@ public function buildSearch(string $qry) $elt = [ "id" => $per->getPerson()->getId(), - "img" => '', + "img" => $per->getPerson()->getJPGPhotoDatas(), "searchresult" => _("Group")." : ". ''.$per->getGroup()->getName().'' ." (".'' . OutputUtils::FormatFullName($per->getPerson()->getTitle(), $per->getPerson()->getFirstName(), $per->getPerson()->getMiddleName(), $per->getPerson()->getLastName(), $per->getPerson()->getSuffix(), 3) . ''.")", "address" => (!SessionUser::getUser()->isSeePrivacyDataEnabled()) ? _('Private Data') : $address, @@ -153,7 +153,7 @@ public function buildSearch(string $qry) array_push($this->results, $elt); } } - } catch (Exception $e) { + } catch (\Exception $e) { LoggerUtils::getAppLogger()->warn($e->getMessage()); } } diff --git a/src/EcclesiaCRM/Search/PersonPastoralCareSearchRes.php b/src/EcclesiaCRM/Search/PersonPastoralCareSearchRes.php index 3536cedbd..6ebdfde4a 100644 --- a/src/EcclesiaCRM/Search/PersonPastoralCareSearchRes.php +++ b/src/EcclesiaCRM/Search/PersonPastoralCareSearchRes.php @@ -126,7 +126,7 @@ public function buildSearch(string $qry) $elt = [ "id" => $per->getId(), - "img" => '', + "img" => $per->getJPGPhotoDatas(), "searchresult" => ''.OutputUtils::FormatFullName($per->getTitle(), $per->getFirstName(), $per->getMiddleName(), $per->getLastName(), $per->getSuffix(), 3).'', "address" => (!SessionUser::getUser()->isSeePrivacyDataEnabled())?_('Private Data'):$address, "type" => " "._($this->getGlobalSearchType()), @@ -143,7 +143,7 @@ public function buildSearch(string $qry) array_push($this->results, $elt); } } - } catch (Exception $e) { + } catch (\Exception $e) { LoggerUtils::getAppLogger()->warn($e->getMessage()); } } diff --git a/src/EcclesiaCRM/Search/PersonPropsSearchRes.php b/src/EcclesiaCRM/Search/PersonPropsSearchRes.php index c2e104a78..3eedb513a 100644 --- a/src/EcclesiaCRM/Search/PersonPropsSearchRes.php +++ b/src/EcclesiaCRM/Search/PersonPropsSearchRes.php @@ -141,7 +141,7 @@ public function buildSearch(string $qry) $elt = [ "id" => $per->getId(), - "img" => '', + "img" => $per->getJPGPhotoDatas(), "searchresult" => ''.OutputUtils::FormatFullName($per->getTitle(), $per->getFirstName(), $per->getMiddleName(), $per->getLastName(), $per->getSuffix(), 3).'', "address" => (!SessionUser::getUser()->isSeePrivacyDataEnabled())?_('Private Data'):$address, "type" => " "._($this->getGlobalSearchType()), @@ -158,7 +158,7 @@ public function buildSearch(string $qry) array_push($this->results, $elt); } } - } catch (Exception $e) { + } catch (\Exception $e) { LoggerUtils::getAppLogger()->warn($e->getMessage()); } } diff --git a/src/EcclesiaCRM/Search/PersonSearchRes.php b/src/EcclesiaCRM/Search/PersonSearchRes.php index 670376737..7ad70030d 100644 --- a/src/EcclesiaCRM/Search/PersonSearchRes.php +++ b/src/EcclesiaCRM/Search/PersonSearchRes.php @@ -329,8 +329,8 @@ public function buildSearch(string $qry) } else { $elt = [ 'id' => $person->getId(), + "img" => $person->getJPGPhotoDatas(), 'searchresult' => '' . OutputUtils::FormatFullName($person->getTitle(), $person->getFirstName(), $person->getMiddleName(), $person->getLastName(), $person->getSuffix(), 3) . '', - 'img' => '', 'address' => (!SessionUser::getUser()->isSeePrivacyDataEnabled()) ? _('Private Data') : $address, 'type' => _($this->getGlobalSearchType()), 'realType' => $this->getGlobalSearchType(), @@ -372,7 +372,7 @@ public function buildSearch(string $qry) } } } - } catch (Exception $e) { + } catch (\Exception $e) { LoggerUtils::getAppLogger()->warn($e->getMessage()); } } diff --git a/src/EcclesiaCRM/Search/PersonVolunteerOpportunitySearch.php b/src/EcclesiaCRM/Search/PersonVolunteerOpportunitySearch.php index 9da47e98f..8eac20735 100644 --- a/src/EcclesiaCRM/Search/PersonVolunteerOpportunitySearch.php +++ b/src/EcclesiaCRM/Search/PersonVolunteerOpportunitySearch.php @@ -120,8 +120,7 @@ public function buildSearch(string $qry) $elt = [ "id" => $per->getId(), - "img" => '', - "searchresult" => ''.OutputUtils::FormatFullName($per->getTitle(), $per->getFirstName(), $per->getMiddleName(), $per->getLastName(), $per->getSuffix(), 3).' ('.$per->getOpportunityName().")", + "img" => $per->getJPGPhotoDatas(), "address" => (!SessionUser::getUser()->isSeePrivacyDataEnabled())?_('Private Data'):$address, "type" => " "._($this->getGlobalSearchType()), "realType" => $this->getGlobalSearchType(), @@ -137,7 +136,7 @@ public function buildSearch(string $qry) array_push($this->results, $elt); } } - } catch (Exception $e) { + } catch (\Exception $e) { LoggerUtils::getAppLogger()->warn($e->getMessage()); } } diff --git a/src/EcclesiaCRM/Search/PledgeSearchRes.php b/src/EcclesiaCRM/Search/PledgeSearchRes.php index 3de4d1779..9c955651e 100644 --- a/src/EcclesiaCRM/Search/PledgeSearchRes.php +++ b/src/EcclesiaCRM/Search/PledgeSearchRes.php @@ -98,7 +98,7 @@ public function buildSearch(string $qry) array_push($this->results, $elt); } } - } catch (Exception $e) { + } catch (\Exception $e) { LoggerUtils::getAppLogger()->warn($e->getMessage()); } } diff --git a/src/EcclesiaCRM/Search/SearchRes.php b/src/EcclesiaCRM/Search/SearchRes.php index f0ff697f9..8ec2793c2 100644 --- a/src/EcclesiaCRM/Search/SearchRes.php +++ b/src/EcclesiaCRM/Search/SearchRes.php @@ -2,8 +2,6 @@ namespace EcclesiaCRM\Search; -use EcclesiaCRM\Utils\LoggerUtils; - class SearchRes implements \JsonSerializable { protected $name; protected $array; From 3e3c3c20a79e2ed2a768cc717edece095c7a5907 Mon Sep 17 00:00:00 2001 From: Philippe Logel Date: Sat, 13 Apr 2024 16:28:37 +0000 Subject: [PATCH 06/16] Dashboard images : families and persons update --- .../Synchronize/FamilyDashboardItem.php | 63 +- .../Synchronize/PersonDashboardItem.php | 46 +- src/skin/js/CRMJSOM.js | 3219 ++++++++--------- 3 files changed, 1668 insertions(+), 1660 deletions(-) diff --git a/src/EcclesiaCRM/Synchronize/FamilyDashboardItem.php b/src/EcclesiaCRM/Synchronize/FamilyDashboardItem.php index dfcf8d433..08e3fda8e 100644 --- a/src/EcclesiaCRM/Synchronize/FamilyDashboardItem.php +++ b/src/EcclesiaCRM/Synchronize/FamilyDashboardItem.php @@ -4,10 +4,7 @@ use EcclesiaCRM\Synchronize\DashboardItemInterface; use EcclesiaCRM\FamilyQuery; -use EcclesiaCRM\SessionUser; use Propel\Runtime\ActiveQuery\Criteria; -use EcclesiaCRM\Map\PersonTableMap; -use EcclesiaCRM\Map\FamilyTableMap; use EcclesiaCRM\Service\PastoralCareService; class FamilyDashboardItem implements DashboardItemInterface { @@ -44,27 +41,27 @@ private static function getCountFamilies() * @param int $limit * @return array|\EcclesiaCRM\Family[]|mixed|\Propel\Runtime\ActiveRecord\ActiveRecordInterface[]|\Propel\Runtime\Collection\ObjectCollection */ - private static function getUpdatedFamilies($limit = 6) { + private static function getUpdatedFamilies($limit = 6) : array { $families = FamilyQuery::create() ->filterByDateDeactivated(null) ->filterByDateLastEdited(null, Criteria::NOT_EQUAL) ->orderByDateLastEdited('DESC') ->limit($limit) - ->select(array("Id","Name","Address1","DateEntered","DateLastEdited")) - ->find()->toArray(); - - if (!SessionUser::getUser()->isSeePrivacyDataEnabled()) { - $res = []; - - foreach ($families as $family) { - $family["Address1"] = gettext("Private Data"); - $res[] = $family; - } - - return $res; + ->find(); + + $res = []; + foreach ($families as $family) { + $res[] = [ + 'Id' => $family->getId(), + 'Name' => $family->getName(), + 'Address1' => $family->getAddress(), + 'DateEntered' => (!is_null($family->getDateEntered())?$family->getDateEntered()->format('Y-m-d h:i'):''), + 'DateLastEdited' => (!is_null($family->getDateLastEdited())?$family->getDateLastEdited()->format('Y-m-d h:i'):''), + 'img' => $family->getJPGPhotoDatas() + ]; } - return $families; + return $res; } /** @@ -72,32 +69,32 @@ private static function getUpdatedFamilies($limit = 6) { * @param int $limit * @return array|\EcclesiaCRM\Family[]|mixed|\Propel\Runtime\ActiveRecord\ActiveRecordInterface[]|\Propel\Runtime\Collection\ObjectCollection */ - private static function getLatestFamilies($limit = 6) { + private static function getLatestFamilies($limit = 6) : array { $families = FamilyQuery::create() ->filterByDateDeactivated(null) ->orderByDateEntered('DESC') ->limit($limit) - ->select(array("Id","Name","Address1","DateEntered","DateLastEdited")) - ->find()->toArray(); - - - if (!SessionUser::getUser()->isSeePrivacyDataEnabled()) { - $res = []; - - foreach ($families as $family) { - $family["Address1"] = gettext("Private Data"); - $res[] = $family; - } - - return $res; + ->find(); + + + $res = []; + foreach ($families as $family) { + $res[] = [ + 'Id' => $family->getId(), + 'Name' => $family->getName(), + 'Address1' => $family->getAddress(), + 'DateEntered' => (!is_null($family->getDateEntered())?$family->getDateEntered()->format('Y-m-d h:i'):''), + 'DateLastEdited' => (!is_null($family->getDateLastEdited())?$family->getDateLastEdited()->format('Y-m-d h:i'):''), + 'img' => $family->getJPGPhotoDatas() + ]; } - return $families; + return $res; } public static function shouldInclude($PageName) { return $PageName == "/v2/dashboard" || $PageName == "/menu"|| $PageName == "/v2/people/dashboard"; // this ID would be found on all pages. } -} +} \ No newline at end of file diff --git a/src/EcclesiaCRM/Synchronize/PersonDashboardItem.php b/src/EcclesiaCRM/Synchronize/PersonDashboardItem.php index 95f2789e3..60a702eb1 100644 --- a/src/EcclesiaCRM/Synchronize/PersonDashboardItem.php +++ b/src/EcclesiaCRM/Synchronize/PersonDashboardItem.php @@ -14,8 +14,8 @@ public static function getDashboardItemName() { public static function getDashboardItemValue() { $data = ['personCount' => self::getMembersCount(), - 'LatestPersons' => self::getLatestMembers()->toArray(), - 'UpdatedPerson' => self::getUpdatedMembers()->toArray()]; + 'LatestPersons' => self::getLatestMembers(), + 'UpdatedPerson' => self::getUpdatedMembers()]; return $data; } @@ -25,7 +25,7 @@ public static function getDashboardItemValue() { * @param int $limit * @return array|\EcclesiaCRM\Person[]|mixed|\Propel\Runtime\ActiveRecord\ActiveRecordInterface[]|\Propel\Runtime\Collection\ObjectCollection */ - public static function getMembersCount() + public static function getMembersCount() : int { return PersonQuery::Create('per') ->filterByDateDeactivated(null) @@ -40,15 +40,30 @@ public static function getMembersCount() * @param int $limit * @return array|\EcclesiaCRM\Person[]|mixed|\Propel\Runtime\ActiveRecord\ActiveRecordInterface[]|\Propel\Runtime\Collection\ObjectCollection */ - public static function getUpdatedMembers($limit = 6) + public static function getUpdatedMembers($limit = 6) : array { - return PersonQuery::create() + $persons = PersonQuery::create() ->filterByDateDeactivated(null)// GDRP, when a person is completely deactivated ->leftJoinWithFamily() ->where('Family.DateDeactivated is null') ->orderByDateLastEdited('DESC') ->limit($limit) ->find(); + + $res = []; + foreach ($persons as $person) { + $res[] = [ + 'Id' => $person->getId(), + 'LastName' => $person->getLastName(), + 'FirstName' => $person->getFirstName(), + 'Address1' => $person->getAddress(), + 'DateEntered' => (!is_null($person->getDateEntered())?$person->getDateEntered()->format('Y-m-d h:i'):''), + 'DateLastEdited' => (!is_null($person->getDateLastEdited())?$person->getDateLastEdited()->format('Y-m-d h:i'):''), + 'img' => $person->getJPGPhotoDatas() + ]; + } + + return $res; } /** @@ -56,9 +71,9 @@ public static function getUpdatedMembers($limit = 6) * @param int $limit * @return array|\EcclesiaCRM\Person[]|mixed|\Propel\Runtime\ActiveRecord\ActiveRecordInterface[]|\Propel\Runtime\Collection\ObjectCollection */ - public static function getLatestMembers($limit = 6) + public static function getLatestMembers($limit = 6) : array { - return PersonQuery::create() + $persons = PersonQuery::create() ->filterByDateDeactivated(null)// GDRP, when a person is completely deactivated ->leftJoinWithFamily() ->where('Family.DateDeactivated is null') @@ -66,6 +81,21 @@ public static function getLatestMembers($limit = 6) ->orderByDateEntered('DESC') ->limit($limit) ->find(); + + $res = []; + foreach ($persons as $person) { + $res[] = [ + 'Id' => $person->getId(), + 'LastName' => $person->getLastName(), + 'FirstName' => $person->getFirstName(), + 'Address1' => $person->getAddress(), + 'DateEntered' => (!is_null($person->getDateEntered())?$person->getDateEntered()->format('Y-m-d h:i'):''), + 'DateLastEdited' => (!is_null($person->getDateLastEdited())?$person->getDateLastEdited()->format('Y-m-d h:i'):''), + 'img' => $person->getJPGPhotoDatas() + ]; + } + + return $res; } public static function getPersonStats() @@ -169,4 +199,4 @@ public static function shouldInclude($PageName) { return $PageName=="/v2/dashboard" || $PageName=="/menu" || $PageName == "/v2/people/dashboard"; // this ID would be found on all pages. } -} +} \ No newline at end of file diff --git a/src/skin/js/CRMJSOM.js b/src/skin/js/CRMJSOM.js index 893b1a3e3..b73106449 100644 --- a/src/skin/js/CRMJSOM.js +++ b/src/skin/js/CRMJSOM.js @@ -2,1769 +2,1750 @@ * EcclesiaCRM JavaScript Object Model Initialization Script */ - window.CRM.APIRequest = function (options, callback) { - if (!options.method) { - options.method = "GET" - } - - if (!options.ContentType) { - options.ContentType = "application/json; charset=utf-8"; - } - - fetch(window.CRM.root + "/api/" + options.path, { - method: options.method, - headers: { - 'Content-Type': options.ContentType, - 'Authorization': 'Bearer ' + window.CRM.jwtToken, - }, - body: options.data - }) - .then(res => res.json()) - .then(data => { - // enter you logic when the fetch is successful - if (callback) { - callback(data); - } - }) - .catch(error => { - // enter your logic for when there is an error (ex. error toast) - console.log(error) - }); - } - - window.CRM.DisplayErrorMessage = function(endpoint, error) { - if (window.CRM.sLogLevel > 100) - return; - if (endpoint.indexOf("/api/dashboard") !== -1) {// we are in the case, we're logout - location.reload(); - return; - } - - message = "

" + i18next.t("Error making API Call to") + ": " + endpoint + - "

" + i18next.t("Error text") + ": " + i18next.t(error.message); - if (error.trace) - { - message += "

" + i18next.t("Stack Trace") + ":
"+JSON.stringify(error.trace, undefined, 2)+"
"; - } - bootbox.alert({ - title: i18next.t("ERROR"), - message: message - }); - }; - - window.CRM.DisplayAlert = function(title,message,callback) { - return bootbox.alert({ - title: title, - message:message, - callback: function () { - if (callback) { - callback() - } - } +window.CRM.APIRequest = function (options, callback) { + if (!options.method) { + options.method = "GET" + } + + if (!options.ContentType) { + options.ContentType = "application/json; charset=utf-8"; + } + + fetch(window.CRM.root + "/api/" + options.path, { + method: options.method, + headers: { + 'Content-Type': options.ContentType, + 'Authorization': 'Bearer ' + window.CRM.jwtToken, + }, + body: options.data + }) + .then(res => res.json()) + .then(data => { + // enter you logic when the fetch is successful + if (callback) { + callback(data); + } + }) + .catch(error => { + // enter your logic for when there is an error (ex. error toast) + console.log(error) }); - } - - window.CRM.DisplayNormalAlert = function(title,message,callback) { - alert(title + "\n\n" + message); - } +} + +window.CRM.DisplayErrorMessage = function(endpoint, error) { +if (window.CRM.sLogLevel > 100) + return; +if (endpoint.indexOf("/api/dashboard") !== -1) {// we are in the case, we're logout + location.reload(); + return; +} + +message = "

" + i18next.t("Error making API Call to") + ": " + endpoint + + "

" + i18next.t("Error text") + ": " + i18next.t(error.message); +if (error.trace) +{ + message += "

" + i18next.t("Stack Trace") + ":
"+JSON.stringify(error.trace, undefined, 2)+"
"; +} +bootbox.alert({ + title: i18next.t("ERROR"), + message: message +}); +}; + +window.CRM.DisplayAlert = function(title,message,callback) { +return bootbox.alert({ + title: title, + message:message, + callback: function () { + if (callback) { + callback() + } + } +}); +} - window.CRM.renderMailchimpLists = function () { +window.CRM.DisplayNormalAlert = function(title,message,callback) { +alert(title + "\n\n" + message); +} - window.CRM.APIRequest({ - method: 'GET', - path: 'mailchimp/lists' - },function(data) { +window.CRM.renderMailchimpLists = function () { - if (data.isActive) { - var len = data.MailChimpLists.length; + window.CRM.APIRequest({ + method: 'GET', + path: 'mailchimp/lists' + },function(data) { - // now we empty the menubar lists - $(".lists_class_menu").removeClass("hidden"); + if (data.isActive) { + var len = data.MailChimpLists.length; - var real_listMenu = $(".lists_class_menu").find (".nav-treeview"); + // now we empty the menubar lists + $(".lists_class_menu").removeClass("hidden"); - real_listMenu.html(""); - var listItems = ""; + var real_listMenu = $(".lists_class_menu").find (".nav-treeview"); - for (i=0;i

'+ list.name + '

' - + ''; - } + for (i=0;i

'+ list.name + '

' + + ''; + } - if ( data.firstLoaded == true ) { - window.CRM.notify('fas fa-info-circle',i18next.t("Mailchimp"), i18next.t("All the lists are now loaded in EcclesiaCRM.
If you want to manage them, click this notification !"), window.CRM.root + '/v2/mailchimp/dashboard' ,'success',"top",50000); - } - } + real_listMenu.html(listItems); - }); + if ( data.firstLoaded == true ) { + window.CRM.notify('fas fa-info-circle',i18next.t("Mailchimp"), i18next.t("All the lists are now loaded in EcclesiaCRM.
If you want to manage them, click this notification !"), window.CRM.root + '/v2/mailchimp/dashboard' ,'success',"top",50000); + } } - window.CRM.showGlobalMessage = function (message, alertClass) { - $("#globalMessageText").text(message); - $("#globalMessageAlert").removeClass("alert-danger"); - $("#globalMessageAlert").removeClass("alert-warning"); - $("#globalMessageAlert").removeClass("alert-info"); - $("#globalMessageAlert").removeClass("alert-success"); - $("#globalMessageAlert").addClass("alert-"+alertClass); - $("#globalMessage").show("slow"); + }); +} + +window.CRM.showGlobalMessage = function (message, alertClass) { + $("#globalMessageText").text(message); + $("#globalMessageAlert").removeClass("alert-danger"); + $("#globalMessageAlert").removeClass("alert-warning"); + $("#globalMessageAlert").removeClass("alert-info"); + $("#globalMessageAlert").removeClass("alert-success"); + $("#globalMessageAlert").addClass("alert-"+alertClass); + $("#globalMessage").show("slow"); +} + +window.CRM.dialogLoadingFunction = function (message) { +window.CRM.dialogLoading = bootbox.dialog({ message: '
' + message + '
' }); +} + +window.CRM.closeDialogLoadingFunction = function () { +if (window.CRM.dialogLoading != null) { + window.CRM.dialogLoading.modal('hide'); +} +} + +window.CRM.notify = function(icon,title,message,link,type,place,delay,target,horizontal) { + if (type == 'success') { + type='bg-success'; + } else if (type == 'warning') { + type='bg-warning'; + } else if (type == 'info') { + type='bg-lightblue'; + } else if (type == 'error') { + type='bg-red'; + } + + if (horizontal === undefined) { + horizontal = 'Right'; + } + + if (link != null) { + message = message + ' '; + } + + $(document).Toasts('create', { + position: place+horizontal, + title: ' ' + title, + body: message, + delay: delay, + type: type, + autohide: true, + animation:true, + class:type + }) +} + +window.CRM.VerifyThenLoadAPIContent = async function(url) { +const error = i18next.t("There was a problem retrieving the requested object"); + +try { + const response = await fetch(url, { + method: 'HEAD' + }); + + if (response.ok) { + console.log('Promise resolved and HTTP status is successful'); + } else { + // Custom message for failed HTTP codes + if (response.status === 200) window.open(url); + else if (response.status === 404) window.CRM.DisplayErrorMessage(url, {message: error}); + else if (response.status === 500) window.CRM.DisplayErrorMessage(url, {message: error}); + // For any other server error + throw new Error(response.status); + } +} catch (error) { + console.error('Fetch VerifyThenLoadAPIContent', error); +} +} + +window.CRM.cart={ +'empty' : function (callback) +{ + window.CRM.APIRequest({ + method: "DELETE", + path: "cart/" + },function (data) { + if (callback) + { + callback(data); } - - window.CRM.dialogLoadingFunction = function (message) { - window.CRM.dialogLoading = bootbox.dialog({ message: '
' + message + '
' }); - } - - window.CRM.closeDialogLoadingFunction = function () { - if (window.CRM.dialogLoading != null) { - window.CRM.dialogLoading.modal('hide'); - } - } - - window.CRM.notify = function(icon,title,message,link,type,place,delay,target,horizontal) { - if (type == 'success') { - type='bg-success'; - } else if (type == 'warning') { - type='bg-warning'; - } else if (type == 'info') { - type='bg-lightblue'; - } else if (type == 'error') { - type='bg-red'; + window.CRM.cart.refresh(); + // we update the cart button + if (data.PeopleCart !== undefined && data.FamiliesCart != undefined && data.GroupsCart != undefined) + window.CRM.cart.updatePage(data.PeopleCart,data.FamiliesCart, data.GroupsCart); + }); +}, +'emptyCart': function () { + window.CRM.cart.empty(function(data){ + window.CRM.cart.refresh(); + + if (window.CRM.dataTableList) { + window.CRM.dataTableList.ajax.reload(); + window.CRM.dataTableList.ajax.reload(); + } else if (data.cartPeople) {// this part should be written like this, the code will crash at this point without this test and crash the js code + console.log(data.cartPeople); + + if (data.cartPeople.length > 0) { + $(data.cartPeople).each(function(index,data){ + personButton = $("a[data-cartpersonid='" + data + "']"); + $(personButton).addClass("AddToPeopleCart"); + $(personButton).removeClass("RemoveFromPeopleCart"); + $('span i:nth-child(2)',personButton).removeClass("fa-times"); + $('span i:nth-child(2)',personButton).addClass("fa-cart-plus"); + }); + } else { + location.reload(); + } } + }); +}, +'emptyCartToEvent' : function () { + window.CRM.cart.emptytoEvent(function(data){ + window.CRM.cart.refresh(); + location.href = window.CRM.root + '/v2/calendar/events/list'; + }); +}, +'emptyCartToGroup' : function () { + // I have to do this because EventGroup isn't yet present when you load the page the first time + $(document).on('change','#PopupGroupID',function () { + var e = document.getElementById("PopupGroupID"); - if (horizontal === undefined) { - horizontal = 'Right'; - } + if (e.selectedIndex > 0) { + var option = e.options[e.selectedIndex]; + var GroupID = option.value; - if (link != null) { - message = message + ' '; + window.CRM.APIRequest({ + path:"groups/"+GroupID+"/roles", + method:"GET" + },function(data) { + var ListOptions = data.ListOptions; + $("#GroupRole").empty(); + var elt = document.getElementById("GroupRole"); + if (elt != null) { + var len = ListOptions.length; + + // We add the none option + var option = document.createElement("option"); + option.text = i18next.t("None"); + option.value = 0; + option.title = ""; + elt.appendChild(option); + + for (i=0; i ' + title, - body: message, - delay: delay, - type: type, - autohide: true, - animation:true, - class:type - }) + const BootboxContentCartTogroup = () => { + var frm_str = '
' + +'' + +'' + +'' + +'' + +'' + +'
'+i18next.t('Select the method to add to a group')+' ' + +'
' + +'
' + +'
' + +'

'+i18next.t('Select the group to which you would like to add your cart')+':

' + +' ' + +' ' + +' ' + +' ' + +' ' + +' ' + +' ' + +' ' + +' ' + +' ' + +'
'+i18next.t('Select Group')+':' + +' ' + +'
 
'+i18next.t('Select Role')+':' + +' ' + +'
' + +'
' + +'
' + +'
' + +'

' + +' ' + +' ' + +' ' + +' ' + +' ' + +'
'+ i18next.t('Group Name') + ':
' + +'

' + +'
'; + + var object = $('
').html(frm_str).contents(); + + return object } - window.CRM.VerifyThenLoadAPIContent = async function(url) { - const error = i18next.t("There was a problem retrieving the requested object"); - - try { - const response = await fetch(url, { - method: 'HEAD' - }); - - if (response.ok) { - console.log('Promise resolved and HTTP status is successful'); - } else { - // Custom message for failed HTTP codes - if (response.status === 200) window.open(url); - else if (response.status === 404) window.CRM.DisplayErrorMessage(url, {message: error}); - else if (response.status === 500) window.CRM.DisplayErrorMessage(url, {message: error}); - // For any other server error - throw new Error(response.status); + var modal = bootbox.dialog({ + message: BootboxContentCartTogroup(), + title: i18next.t("Add Cart to Group"), + buttons: [ + { + label: i18next.t("Save"), + className: "btn btn-primary pull-left", + callback: function() { + var e = document.getElementById("GroupSelector"); + if (e.selectedIndex == 0) { + var e = document.getElementById("PopupGroupID"); + + if (e.selectedIndex > 0) { + var option = e.options[e.selectedIndex]; + var GroupID = option.value; + + var e = document.getElementById("GroupRole"); + var option = e.options[e.selectedIndex]; + var RoleID = option.value; + + window.CRM.APIRequest({ + method: 'POST', + path: 'cart/emptyToGroup', + data: JSON.stringify({"groupID":GroupID,"groupRoleID":RoleID}) + },function(data) { + window.CRM.cart.refresh(); + location.href = window.CRM.root + '/v2/group/' + GroupID + '/view'; + }); + + return true + } else { + var box = bootbox.dialog({title: ""+i18next.t("Error")+"",message : i18next.t("You have to select one group and a group role if you want")}); + + setTimeout(function() { + // be careful not to call box.hide() here, which will invoke jQuery's hide method + box.modal('hide'); + }, 3000); + + return false; + } + } else { + + var newGroupName = document.getElementById("GroupName").value; + + if (newGroupName) { + window.CRM.APIRequest({ + method: 'POST', + path: 'cart/emptyToNewGroup', //call the groups api handler located at window.CRM.root + data: JSON.stringify({'groupName':newGroupName}), // stringify the object we created earlier, and add it to the data payload + },function (data) { //yippie, we got something good back from the server + window.CRM.cart.refresh(); + location.href = window.CRM.root + '/v2/group/'+data.Id+'/view'; + }); + + return true; + } else { + var box = bootbox.dialog({title: ""+i18next.t("Error")+"",message : i18next.t("You have to set a Group Name")}); + + setTimeout(function() { + // be careful not to call box.hide() here, which will invoke jQuery's hide method + box.modal('hide'); + }, 3000); + + return false; + } + } + } + }, + { + label: i18next.t("Close"), + className: "btn btn-default pull-left", + callback: function() { + console.log("just do something on close"); + } + } + ], + show: false, + onEscape: function() { + modal.modal("hide"); } - } catch (error) { - console.error('Fetch VerifyThenLoadAPIContent', error); - } - } - - window.CRM.cart={ - 'empty' : function (callback) - { - window.CRM.APIRequest({ - method: "DELETE", - path: "cart/" - },function (data) { - if (callback) - { - callback(data); - } - window.CRM.cart.refresh(); - // we update the cart button - if (data.PeopleCart !== undefined && data.FamiliesCart != undefined && data.GroupsCart != undefined) - window.CRM.cart.updatePage(data.PeopleCart,data.FamiliesCart, data.GroupsCart); - }); - }, - 'emptyCart': function () { - window.CRM.cart.empty(function(data){ - window.CRM.cart.refresh(); - - if (window.CRM.dataTableList) { - window.CRM.dataTableList.ajax.reload(); - window.CRM.dataTableList.ajax.reload(); - } else if (data.cartPeople) {// this part should be written like this, the code will crash at this point without this test and crash the js code - console.log(data.cartPeople); - - if (data.cartPeople.length > 0) { - $(data.cartPeople).each(function(index,data){ - personButton = $("a[data-cartpersonid='" + data + "']"); - $(personButton).addClass("AddToPeopleCart"); - $(personButton).removeClass("RemoveFromPeopleCart"); - $('span i:nth-child(2)',personButton).removeClass("fa-times"); - $('span i:nth-child(2)',personButton).addClass("fa-cart-plus"); - }); - } else { - location.reload(); - } - } - }); - }, - 'emptyCartToEvent' : function () { - window.CRM.cart.emptytoEvent(function(data){ - window.CRM.cart.refresh(); - location.href = window.CRM.root + '/v2/calendar/events/list'; - }); - }, - 'emptyCartToGroup' : function () { - // I have to do this because EventGroup isn't yet present when you load the page the first time - $(document).on('change','#PopupGroupID',function () { - var e = document.getElementById("PopupGroupID"); - - if (e.selectedIndex > 0) { - var option = e.options[e.selectedIndex]; - var GroupID = option.value; - - window.CRM.APIRequest({ - path:"groups/"+GroupID+"/roles", - method:"GET" - },function(data) { - var ListOptions = data.ListOptions; - $("#GroupRole").empty(); - var elt = document.getElementById("GroupRole"); - if (elt != null) { - var len = ListOptions.length; - - // We add the none option - var option = document.createElement("option"); - option.text = i18next.t("None"); - option.value = 0; - option.title = ""; - elt.appendChild(option); - - for (i=0; i { - var frm_str = '' - +'' - +'' - +'' - +'' - +'' - +'
'+i18next.t('Select the method to add to a group')+' ' - +'
' - +'
' - +'
' - +'

'+i18next.t('Select the group to which you would like to add your cart')+':

' - +' ' - +' ' - +' ' - +' ' - +' ' - +' ' - +' ' - +' ' - +' ' - +' ' - +'
'+i18next.t('Select Group')+':' - +' ' - +'
 
'+i18next.t('Select Role')+':' - +' ' - +'
' - +'
' - +'
' - +'
' - +'

' - +' ' - +' ' - +' ' - +' ' - +' ' - +'
'+ i18next.t('Group Name') + ':
' - +'

' - +'
'; - - var object = $('
').html(frm_str).contents(); - - return object - } - - var modal = bootbox.dialog({ - message: BootboxContentCartTogroup(), - title: i18next.t("Add Cart to Group"), - buttons: [ - { - label: i18next.t("Save"), - className: "btn btn-primary pull-left", - callback: function() { - var e = document.getElementById("GroupSelector"); - if (e.selectedIndex == 0) { - var e = document.getElementById("PopupGroupID"); - - if (e.selectedIndex > 0) { - var option = e.options[e.selectedIndex]; - var GroupID = option.value; - - var e = document.getElementById("GroupRole"); - var option = e.options[e.selectedIndex]; - var RoleID = option.value; - - window.CRM.APIRequest({ - method: 'POST', - path: 'cart/emptyToGroup', - data: JSON.stringify({"groupID":GroupID,"groupRoleID":RoleID}) - },function(data) { - window.CRM.cart.refresh(); - location.href = window.CRM.root + '/v2/group/' + GroupID + '/view'; - }); - - return true - } else { - var box = bootbox.dialog({title: ""+i18next.t("Error")+"",message : i18next.t("You have to select one group and a group role if you want")}); - - setTimeout(function() { - // be careful not to call box.hide() here, which will invoke jQuery's hide method - box.modal('hide'); - }, 3000); - - return false; - } - } else { - - var newGroupName = document.getElementById("GroupName").value; - - if (newGroupName) { - window.CRM.APIRequest({ - method: 'POST', - path: 'cart/emptyToNewGroup', //call the groups api handler located at window.CRM.root - data: JSON.stringify({'groupName':newGroupName}), // stringify the object we created earlier, and add it to the data payload - },function (data) { //yippie, we got something good back from the server - window.CRM.cart.refresh(); - location.href = window.CRM.root + '/v2/group/'+data.Id+'/view'; - }); - - return true; - } else { - var box = bootbox.dialog({title: ""+i18next.t("Error")+"",message : i18next.t("You have to set a Group Name")}); + }); - setTimeout(function() { - // be careful not to call box.hide() here, which will invoke jQuery's hide method - box.modal('hide'); - }, 3000); + modal.modal("show"); - return false; - } - } - } - }, - { - label: i18next.t("Close"), - className: "btn btn-default pull-left", - callback: function() { - console.log("just do something on close"); - } - } - ], - show: false, - onEscape: function() { - modal.modal("hide"); - } - }); - - modal.modal("show"); - - // I have to do this because EventGroup isn't yet present when you load the page the first time - $(document).on('change','#GroupSelector',function () { - var e = document.getElementById("GroupSelector"); - if (e.selectedIndex == 0) { - $("#GroupCreation").hide(); - $("#GroupSelect").show(); - } else { - $("#GroupSelect").hide(); - $("#GroupCreation").show(); - } - }); + // I have to do this because EventGroup isn't yet present when you load the page the first time + $(document).on('change','#GroupSelector',function () { + var e = document.getElementById("GroupSelector"); + if (e.selectedIndex == 0) { + $("#GroupCreation").hide(); + $("#GroupSelect").show(); + } else { + $("#GroupSelect").hide(); + $("#GroupCreation").show(); + } + }); - // we hide by default the GroupCreation - $("#GroupCreation").hide(); - - const addGroups = () => { - window.CRM.APIRequest({ - path:"groups/", - method:"GET" - },function(data) { - var Groups = data.Groups; - var elt = document.getElementById("PopupGroupID"); - if (elt != null) { - var len = Groups.length; - - // We add the none option - var option = document.createElement("option"); - option.text = i18next.t("None"); - option.value = 0; - option.title = ""; - elt.appendChild(option); - - for (i=0; i { + window.CRM.APIRequest({ + path:"groups/", + method:"GET" + },function(data) { + var Groups = data.Groups; + var elt = document.getElementById("PopupGroupID"); + if (elt != null) { + var len = Groups.length; + + // We add the none option + var option = document.createElement("option"); + option.text = i18next.t("None"); + option.value = 0; + option.title = ""; + elt.appendChild(option); + + for (i=0; i', - buttons: { - addEvent: { - label: i18next.t('Create First A New Event'), - className: 'btn-info', - callback: function() { - location.href = window.CRM.root + '/v2/calendar'; - } - }, - cancel: { - label: i18next.t('Cancel'), - className: 'btn-danger' - }, - confirm: { - label: i18next.t('Add to Event'), - className: 'btn btn-primary', - callback: function() { - var e = document.getElementById("eventChosen"); - var EventID = e.options[e.selectedIndex].value; - - window.CRM.APIRequest({ - method: 'POST', - path: 'cart/emptyToEvent', - data: JSON.stringify({"eventID":EventID}) - },function(data) { - if(callback) - { - callback(data); - } - }); - } - } + callback(data); + } + }); + }); +}, +'emptytoFamily' : function () +{ + +}, +'emptytoEvent' : function (callback) +{ + window.CRM.APIRequest({ + method: 'GET', + path: 'events/names', + },function(eventNames) { + var lenType = eventNames.length; + var options = new Array(); + + var boxOptions ={ + title: i18next.t('Select the event to which you would like to add your cart'), + message: ''; + window.CRM.APIRequest({ + method: 'POST', + path: 'cart/emptyToEvent', + data: JSON.stringify({"eventID":EventID}) + },function(data) { + if(callback) + { + callback(data); + } + }); + } + } + } + }; - bootbox.dialog(boxOptions).show(); - }); - }, - 'addPerson' : function (Persons, callback) + boxOptions.message +='
'+i18next.t('You can add the content of the cart to the selected event below
- OR -
Create first an event and add them after.')+'

'; + boxOptions.message +='\ +
'; + + bootbox.dialog(boxOptions).show(); + }); +}, +'addPerson' : function (Persons, callback) +{ + window.CRM.APIRequest({ + method: 'POST', + path: 'cart/', + data: JSON.stringify({"Persons":Persons}) + },function(data) { + window.CRM.cart.refresh(); + if(callback) + { + callback(data); + } + }); +}, +'intersectPerson' : function (Persons, callback) +{ + window.CRM.APIRequest({ + method: 'POST', + path: 'cart/interectPerson', + data: JSON.stringify({"Persons":Persons}) + },function(data) { + window.CRM.cart.refresh(); + if(callback) + { + callback(data); + } + }); +}, +'removePerson' : function (Persons, callback) +{ + window.CRM.APIRequest({ + method: 'DELETE', + path:'cart/', + data: JSON.stringify({"Persons":Persons}) + },function(data) { + window.CRM.cart.refresh(); + if(callback) + { + callback(data); + } + }); +}, +'addFamily' : function (FamilyID, callback) +{ + window.CRM.APIRequest({ + method: 'POST', + path:'cart/', + data: JSON.stringify({"Family":FamilyID}) + },function(data) { + window.CRM.cart.refresh(); + if(callback) { - window.CRM.APIRequest({ + callback(data); + } + }); +}, +'addFamilies' : function (Families, callback) + { + window.CRM.APIRequest({ method: 'POST', - path: 'cart/', - data: JSON.stringify({"Persons":Persons}) - },function(data) { + path:'cart/', + data: JSON.stringify({"Families":Families}) + },function(data) { window.CRM.cart.refresh(); if(callback) { - callback(data); + callback(data); } - }); - }, - 'intersectPerson' : function (Persons, callback) + }); +}, +'removeFamily' : function (FamilyID, callback) +{ + window.CRM.APIRequest({ + method: 'POST', + path:'cart/', + data: JSON.stringify({"removeFamily":FamilyID}) + },function(data) { + window.CRM.cart.refresh(); + if(callback) { - window.CRM.APIRequest({ + callback(data); + } + }); +}, +'removeFamilies' : function (Families, callback) + { + window.CRM.APIRequest({ method: 'POST', - path: 'cart/interectPerson', - data: JSON.stringify({"Persons":Persons}) - },function(data) { - window.CRM.cart.refresh(); - if(callback) - { - callback(data); - } - }); - }, - 'removePerson' : function (Persons, callback) - { - window.CRM.APIRequest({ - method: 'DELETE', path:'cart/', - data: JSON.stringify({"Persons":Persons}) - },function(data) { + data: JSON.stringify({"removeFamilies":Families}) + },function(data) { window.CRM.cart.refresh(); if(callback) { - callback(data); - } - }); - }, - 'addFamily' : function (FamilyID, callback) - { - window.CRM.APIRequest({ - method: 'POST', - path:'cart/', - data: JSON.stringify({"Family":FamilyID}) - },function(data) { - window.CRM.cart.refresh(); - if(callback) - { - callback(data); - } - }); - }, - 'addFamilies' : function (Families, callback) - { - window.CRM.APIRequest({ - method: 'POST', - path:'cart/', - data: JSON.stringify({"Families":Families}) - },function(data) { - window.CRM.cart.refresh(); - if(callback) - { - callback(data); - } - }); - }, - 'removeFamily' : function (FamilyID, callback) - { - window.CRM.APIRequest({ - method: 'POST', - path:'cart/', - data: JSON.stringify({"removeFamily":FamilyID}) - },function(data) { - window.CRM.cart.refresh(); - if(callback) - { callback(data); - } - }); - }, - 'removeFamilies' : function (Families, callback) - { - window.CRM.APIRequest({ - method: 'POST', - path:'cart/', - data: JSON.stringify({"removeFamilies":Families}) - },function(data) { - window.CRM.cart.refresh(); - if(callback) - { - callback(data); - } - }); - }, - 'addGroup' : function (GroupID, callback) + } + }); +}, +'addGroup' : function (GroupID, callback) +{ + window.CRM.APIRequest({ + method: 'POST', + path: 'cart/', + data: JSON.stringify({"Group": GroupID}) + },function(data) { + window.CRM.cart.refresh(); + if(callback) { - window.CRM.APIRequest({ + callback(data); + } + + }); +}, +'addGroups' : function (Groups, callback) + { + window.CRM.APIRequest({ method: 'POST', path: 'cart/', - data: JSON.stringify({"Group": GroupID}) - },function(data) { - window.CRM.cart.refresh(); - if(callback) - { + data: JSON.stringify({"Groups": Groups}) + },function(data) { + window.CRM.cart.refresh(); + if(callback) + { callback(data); - } - - }); - }, - 'addGroups' : function (Groups, callback) - { - window.CRM.APIRequest({ - method: 'POST', - path: 'cart/', - data: JSON.stringify({"Groups": Groups}) - },function(data) { - window.CRM.cart.refresh(); - if(callback) - { - callback(data); - } + } - }); - }, - 'removeGroup' : function (GroupID, callback) + }); + }, +'removeGroup' : function (GroupID, callback) +{ + window.CRM.APIRequest({ + method: 'POST', + path: 'cart/removeGroup', + data: JSON.stringify({"Group":GroupID}) + },function(data) { + window.CRM.cart.refresh(); + if(callback) { - window.CRM.APIRequest({ - method: 'POST', - path: 'cart/removeGroup', - data: JSON.stringify({"Group":GroupID}) - },function(data) { - window.CRM.cart.refresh(); - if(callback) - { - callback(data); - } - - }); - }, - 'removeGroups' : function (Groups, callback) { - window.CRM.APIRequest({ - method: 'POST', - path: 'cart/removeGroups', - data: JSON.stringify({"Groups":Groups}) - },function(data) { - window.CRM.cart.refresh(); - if(callback) - { - callback(data); - } + callback(data); + } - }); - }, - 'addStudentGroup' : function (GroupID, callback) - { - window.CRM.APIRequest({ + }); +}, +'removeGroups' : function (Groups, callback) { + window.CRM.APIRequest({ method: 'POST', - path: 'cart/', - data: JSON.stringify({"studentGroup":GroupID}) - },function(data) { - window.CRM.cart.refresh(); - if(callback) - { + path: 'cart/removeGroups', + data: JSON.stringify({"Groups":Groups}) + },function(data) { + window.CRM.cart.refresh(); + if(callback) + { callback(data); - } - - }); - }, - 'addAllStudents' : function (callback) - { - window.CRM.APIRequest({ - method: 'POST', - path: 'cart/addAllStudents', - },function(data) { - window.CRM.cart.refresh(); - if(callback) - { - callback(data); - } + } - }); - }, - 'removeStudentGroup' : function (GroupID, callback) + }); +}, +'addStudentGroup' : function (GroupID, callback) +{ + window.CRM.APIRequest({ + method: 'POST', + path: 'cart/', + data: JSON.stringify({"studentGroup":GroupID}) + },function(data) { + window.CRM.cart.refresh(); + if(callback) { - window.CRM.APIRequest({ + callback(data); + } + + }); +}, +'addAllStudents' : function (callback) + { + window.CRM.APIRequest({ method: 'POST', - path: 'cart/removeStudentGroup', - data: JSON.stringify({"Group":GroupID}) - },function(data) { - window.CRM.cart.refresh(); - if(callback) - { + path: 'cart/addAllStudents', + },function(data) { + window.CRM.cart.refresh(); + if(callback) + { callback(data); - } + } - }); - }, - 'removeAllStudents' : function (callback) + }); +}, +'removeStudentGroup' : function (GroupID, callback) +{ + window.CRM.APIRequest({ + method: 'POST', + path: 'cart/removeStudentGroup', + data: JSON.stringify({"Group":GroupID}) + },function(data) { + window.CRM.cart.refresh(); + if(callback) { - window.CRM.APIRequest({ - method: 'POST', - path: 'cart/removeAllStudents', - },function(data) { - window.CRM.cart.refresh(); - if(callback) - { - callback(data); - } + callback(data); + } - }); - }, - 'addTeacherGroup' : function (GroupID, callback) - { - window.CRM.APIRequest({ + }); +}, +'removeAllStudents' : function (callback) +{ + window.CRM.APIRequest({ method: 'POST', - path: 'cart/', - data: JSON.stringify({"teacherGroup":GroupID}) - },function(data) { - window.CRM.cart.refresh(); - if(callback) - { + path: 'cart/removeAllStudents', + },function(data) { + window.CRM.cart.refresh(); + if(callback) + { callback(data); - } - - }); - }, - 'addAllTeachers' : function (callback) - { - window.CRM.APIRequest({ - method: 'POST', - path: 'cart/addAllTeachers', - },function(data) { - window.CRM.cart.refresh(); - if(callback) - { - callback(data); - } + } - }); - }, - 'removeTeacherGroup' : function (GroupID, callback) + }); +}, +'addTeacherGroup' : function (GroupID, callback) +{ + window.CRM.APIRequest({ + method: 'POST', + path: 'cart/', + data: JSON.stringify({"teacherGroup":GroupID}) + },function(data) { + window.CRM.cart.refresh(); + if(callback) { - window.CRM.APIRequest({ - method: 'POST', - path: 'cart/removeTeacherGroup', - data: JSON.stringify({"Group":GroupID}) - },function(data) { - window.CRM.cart.refresh(); - if(callback) - { - callback(data); - } - - }); - }, - 'removeAllTeachers' : function (callback) - { - window.CRM.APIRequest({ - method: 'POST', - path: 'cart/removeAllTeachers', - },function(data) { - window.CRM.cart.refresh(); - if(callback) - { - callback(data); - } - - }); - }, - 'updateLocalePage' : function () { - // broadcaster - $.event.trigger({ - type: "updateLocalePageMessage" - }); - }, - 'refresh' : function () { - window.CRM.APIRequest({ - method: 'POST', - path:"register/isRegisterRequired" - },function(data) { - if (data.Register) { - window.CRM.notify('fa fa-info-circle',i18next.t("Register")+".",i18next.t("Register your software to EcclesiaCRM team.") + "
" + i18next.t("Simply click this") + " " + i18next.t("to register your software") + ".", null, "warning","top",10000,'_blank',"Left"); - } - }); - - window.CRM.APIRequest({ - method: 'POST', - path:"systemupgrade/isUpdateRequired" - },function(data) { - if (data.Upgrade) { - window.CRM.notify('fa fa-info-circle',i18next.t("New Release")+".",i18next.t("Installed version")+" : "+data.installedVersion+' '+i18next.t("New One")+" : "+data.latestVersion.name+'
'+i18next.t("To upgrade simply click this Notification")+"", window.CRM.root+'/UpgradeCRM.php',"info","bottom",60000,'_blank'); - } - }); + callback(data); + } - if (window.CRM.PageName.indexOf("v2/users/change/password") !== -1 && window.CRM.showCart) {// the first time it's unusefull - return; + }); +}, +'addAllTeachers' : function (callback) + { + window.CRM.APIRequest({ + method: 'POST', + path: 'cart/addAllTeachers', + },function(data) { + window.CRM.cart.refresh(); + if(callback) + { + callback(data); } - if (window.CRM.showCart == false)// in this cas all the broadcast system is deactivated - return; + }); +}, +'removeTeacherGroup' : function (GroupID, callback) +{ + window.CRM.APIRequest({ + method: 'POST', + path: 'cart/removeTeacherGroup', + data: JSON.stringify({"Group":GroupID}) + },function(data) { + window.CRM.cart.refresh(); + if(callback) + { + callback(data); + } - window.CRM.APIRequest({ - method: 'GET', - path:"cart/" - },function(data) { - window.CRM.cart.updatePage(data.PeopleCart,data.FamiliesCart, data.GroupsCart); - //window.scrollTo(0, 0); - $("#iconCount").text(data.PeopleCart.length); - - var cartDropdownMenu; - if (data.PeopleCart.length > 0) { - cartDropdownMenu = '\ - ' + }); +}, +'removeAllTeachers' : function (callback) + { + window.CRM.APIRequest({ + method: 'POST', + path: 'cart/removeAllTeachers', + },function(data) { + window.CRM.cart.refresh(); + if(callback) + { + callback(data); } - else { - cartDropdownMenu = '\ - ' + i18next.t("Your Cart is Empty" ) + ''; - } - $("#cart-dropdown-menu").html(cartDropdownMenu); - $("#CartBlock") - .animate({'left':(-10)+'px'},30) - .animate({'left':(+10)+'px'},30) - .animate({'left':(0)+'px'},30); - }); - }, - 'updatePage' : function (cartPeople, familiesCart, groupsCart){ - - // broadcaster - $.event.trigger({ - type: "updateCartMessage", - people:cartPeople, - families:familiesCart, - groups:groupsCart - }); + }); +}, +'updateLocalePage' : function () { + // broadcaster + $.event.trigger({ + type: "updateLocalePageMessage" + }); +}, +'refresh' : function () { + window.CRM.APIRequest({ + method: 'POST', + path:"register/isRegisterRequired" + },function(data) { + if (data.Register) { + window.CRM.notify('fa fa-info-circle',i18next.t("Register")+".",i18next.t("Register your software to EcclesiaCRM team.") + "
" + i18next.t("Simply click this") + " " + i18next.t("to register your software") + ".", null, "warning","top",10000,'_blank',"Left"); } - } + }); - window.CRM.register = function () { - const BootboxContentRegister = (data) => { - var frm_str = '
' - + '
' - + ' ' + i18next.t('If you need to make changes to registration data, go to ') + ''+ i18next.t('Admin->Edit General Settings') + '' - + '
' - + '
' - + '
' - + '
' - + i18next.t('Please register your copy of EcclesiaCRM by checking over this information and pressing the Send button.') - + ' ' - + i18next.t('This information is used only to track the usage of this software.') - + '
' - + '
' - + i18next.t('Church Name') + ':' + data.ChurchName + '
' - + i18next.t('Version') + ':' + data.InstalledVersion + '
' - + i18next.t('Address') + ':' + data.ChurchAddress + '
' - + i18next.t('City') + ':' + data.ChurchCity + '
' - + i18next.t('State') + ':' + data.ChurchState + '
' - + i18next.t('Zip') + ':' + data.ChurchZip + '
' - + i18next.t('Country') + ':' + data.ChurchCountry + '
' - + i18next.t('Church Email') + ':' + data.ChurchEmail + '
' - + 'EcclesiaCRM ' + i18next.t('Base URL') + ':' + data.EcclesiaCRMURL + '
' - + '
' + i18next.t('Message') - + '' - + '' - + '
' - + '
'; - - var object = $('
').html(frm_str).contents(); - - return object; - } + window.CRM.APIRequest({ + method: 'POST', + path:"systemupgrade/isUpdateRequired" + },function(data) { + if (data.Upgrade) { + window.CRM.notify('fa fa-info-circle',i18next.t("New Release")+".",i18next.t("Installed version")+" : "+data.installedVersion+' '+i18next.t("New One")+" : "+data.latestVersion.name+'
'+i18next.t("To upgrade simply click this Notification")+"", window.CRM.root+'/UpgradeCRM.php',"info","bottom",60000,'_blank'); + } + }); - window.CRM.APIRequest({ - method: 'POST', - path:"register/getRegistredDatas" - },function(data) { - var modal = bootbox.dialog({ - message: BootboxContentRegister(data), - title: i18next.t("Software Registration"), - size: 'large', - buttons: [ - { - label: i18next.t("Send"), - className: "btn btn-primary pull-left", - callback: function() { - window.CRM.APIRequest({ - method: 'POST', - path: 'register', - data: JSON.stringify({ "emailmessage": $("#registeremailmessage").val(), EcclesiaCRMURL: $("input[name=EcclesiaCRMURL]").val() }) - }, function (data) { - window.CRM.DisplayAlert("EcclesiaCRM",i18next.t('Your software is now registered. Thank you !'), function (){ - location.reload(); - }); - }); - } - }, - { - label: i18next.t("Cancel"), - className: "btn btn-default pull-left", - callback: function() { - console.log("just do something on close"); - } - } - ], - show: false, - onEscape: function() { - modal.modal("hide"); - } - }); + if (window.CRM.PageName.indexOf("v2/users/change/password") !== -1 && window.CRM.showCart) {// the first time it's unusefull + return; + } - modal.modal("show"); - }); + if (window.CRM.showCart == false)// in this cas all the broadcast system is deactivated + return; + + window.CRM.APIRequest({ + method: 'GET', + path:"cart/" + },function(data) { + window.CRM.cart.updatePage(data.PeopleCart,data.FamiliesCart, data.GroupsCart); + //window.scrollTo(0, 0); + $("#iconCount").text(data.PeopleCart.length); + + var cartDropdownMenu; + if (data.PeopleCart.length > 0) { + cartDropdownMenu = '\ + ' } + else { + cartDropdownMenu = '\ + ' + i18next.t("Your Cart is Empty" ) + ''; - window.CRM.kiosks = { - assignmentTypes: { - "1":"Event Attendance", - "2":"Self Registration", - "3":"Self Checkin", - "4":"General Attendance" - }, - reload: function(id) - { - window.CRM.APIRequest({ - "path":"kiosks/"+id+"/reloadKiosk", - "method":"POST" - },function(data){ - //todo: tell the user the kiosk was reloaded..? maybe nothing... - }) - }, - enableRegistration: function(callback) { - return window.CRM.APIRequest({ - "path":"kiosks/allowRegistration", - "method":"POST" - }, callback) - }, - accept: function (id) - { - window.CRM.APIRequest({ - "path":"kiosks/"+id+"/acceptKiosk", - "method":"POST" - },function(data){ - window.CRM.kioskDataTable.ajax.reload() - }) - }, - identify: function (id) - { - window.CRM.APIRequest({ - "path":"kiosks/"+id+"/identifyKiosk", - "method":"POST" - },function(data){ - //do nothing... - window.CRM.kioskDataTable.ajax.reload(); - }) - }, - delete: function (id) - { - window.CRM.APIRequest({ - "path":"kiosks/"+id, - "method":"DELETE" - },function(data){ - //do nothing... - window.CRM.kioskDataTable.ajax.reload(); - }) - }, - setAssignment: function (id,assignmentId) - { - assignmentSplit = assignmentId.split("-"); - if(assignmentSplit.length > 0) - { - assignmentType = assignmentSplit[0]; - eventId = assignmentSplit[1]; - } - else - { - assignmentType = assignmentId; + } + $("#cart-dropdown-menu").html(cartDropdownMenu); + $("#CartBlock") + .animate({'left':(-10)+'px'},30) + .animate({'left':(+10)+'px'},30) + .animate({'left':(0)+'px'},30); + }); +}, +'updatePage' : function (cartPeople, familiesCart, groupsCart){ + + // broadcaster + $.event.trigger({ + type: "updateCartMessage", + people:cartPeople, + families:familiesCart, + groups:groupsCart + }); +} +} + +window.CRM.register = function () { + const BootboxContentRegister = (data) => { + var frm_str = '
' + + '
' + + ' ' + i18next.t('If you need to make changes to registration data, go to ') + ''+ i18next.t('Admin->Edit General Settings') + '' + + '
' + + '
' + + '
' + + '
' + + i18next.t('Please register your copy of EcclesiaCRM by checking over this information and pressing the Send button.') + + ' ' + + i18next.t('This information is used only to track the usage of this software.') + + '
' + + '
' + + i18next.t('Church Name') + ':' + data.ChurchName + '
' + + i18next.t('Version') + ':' + data.InstalledVersion + '
' + + i18next.t('Address') + ':' + data.ChurchAddress + '
' + + i18next.t('City') + ':' + data.ChurchCity + '
' + + i18next.t('State') + ':' + data.ChurchState + '
' + + i18next.t('Zip') + ':' + data.ChurchZip + '
' + + i18next.t('Country') + ':' + data.ChurchCountry + '
' + + i18next.t('Church Email') + ':' + data.ChurchEmail + '
' + + 'EcclesiaCRM ' + i18next.t('Base URL') + ':' + data.EcclesiaCRMURL + '
' + + '
' + i18next.t('Message') + + '' + + '' + + '
' + + '
'; + + var object = $('
').html(frm_str).contents(); + + return object; + } + + window.CRM.APIRequest({ + method: 'POST', + path:"register/getRegistredDatas" + },function(data) { + var modal = bootbox.dialog({ + message: BootboxContentRegister(data), + title: i18next.t("Software Registration"), + size: 'large', + buttons: [ + { + label: i18next.t("Send"), + className: "btn btn-primary pull-left", + callback: function() { + window.CRM.APIRequest({ + method: 'POST', + path: 'register', + data: JSON.stringify({ "emailmessage": $("#registeremailmessage").val(), EcclesiaCRMURL: $("input[name=EcclesiaCRMURL]").val() }) + }, function (data) { + window.CRM.DisplayAlert("EcclesiaCRM",i18next.t('Your software is now registered. Thank you !'), function (){ + location.reload(); + }); + }); + } + }, + { + label: i18next.t("Cancel"), + className: "btn btn-default pull-left", + callback: function() { + console.log("just do something on close"); + } + } + ], + show: false, + onEscape: function() { + modal.modal("hide"); } + }); - window.CRM.APIRequest({ - "path":"kiosks/"+id+"/setAssignment", - "method":"POST", - "data":JSON.stringify({"assignmentType":assignmentType,"eventId":eventId}) - },function(data){ - window.CRM.kioskDataTable.ajax.reload(); - }) - } + modal.modal("show"); + }); +} + +window.CRM.kiosks = { + assignmentTypes: { + "1":"Event Attendance", + "2":"Self Registration", + "3":"Self Checkin", + "4":"General Attendance" + }, + reload: function(id) + { + window.CRM.APIRequest({ + "path":"kiosks/"+id+"/reloadKiosk", + "method":"POST" + },function(data){ + //todo: tell the user the kiosk was reloaded..? maybe nothing... + }) + }, + enableRegistration: function(callback) { + return window.CRM.APIRequest({ + "path":"kiosks/allowRegistration", + "method":"POST" + }, callback) + }, + accept: function (id) + { + window.CRM.APIRequest({ + "path":"kiosks/"+id+"/acceptKiosk", + "method":"POST" + },function(data){ + window.CRM.kioskDataTable.ajax.reload() + }) + }, + identify: function (id) + { + window.CRM.APIRequest({ + "path":"kiosks/"+id+"/identifyKiosk", + "method":"POST" + },function(data){ + //do nothing... + window.CRM.kioskDataTable.ajax.reload(); + }) + }, + delete: function (id) + { + window.CRM.APIRequest({ + "path":"kiosks/"+id, + "method":"DELETE" + },function(data){ + //do nothing... + window.CRM.kioskDataTable.ajax.reload(); + }) + }, + setAssignment: function (id,assignmentId) + { + assignmentSplit = assignmentId.split("-"); + if(assignmentSplit.length > 0) + { + assignmentType = assignmentSplit[0]; + eventId = assignmentSplit[1]; + } + else + { + assignmentType = assignmentId; } - window.CRM.events = { - getFutureEventes: function() - { - //this could probably be done better, as this option may present a race condition by - //populating a window variable with future events that future elements may rely on - window.CRM.APIRequest({ - "path":"events/notDone" - },function(data){ - window.CRM.events.futureEventsLoaded = true; - window.CRM.events.futureEvents=data.Events; - }); - } + window.CRM.APIRequest({ + "path":"kiosks/"+id+"/setAssignment", + "method":"POST", + "data":JSON.stringify({"assignmentType":assignmentType,"eventId":eventId}) + },function(data){ + window.CRM.kioskDataTable.ajax.reload(); + }) + } +} + +window.CRM.events = { + getFutureEventes: function() + { + //this could probably be done better, as this option may present a race condition by + //populating a window variable with future events that future elements may rely on + window.CRM.APIRequest({ + "path":"events/notDone" + },function(data){ + window.CRM.events.futureEventsLoaded = true; + window.CRM.events.futureEvents=data.Events; + }); + } +}; + +window.CRM.groups = { +'get': function(callback) { + return window.CRM.APIRequest({ + path:"groups/", + method:"GET" + },callback); +}, +'defaultGroup': function (callback) { + var res = window.CRM.APIRequest({ + path:"groups/defaultGroup", + method:"GET" + },function(data) { + callback(data); + }); +}, +'getRoles': function(GroupID, callback) { + return window.CRM.APIRequest({ + path:"groups/"+GroupID+"/roles", + method:"GET" + }, callback); +}, +'selectTypes': { + 'Group': 1, + 'Role': 2, +}, +'promptSelection': function(selectOptions,selectionCallback) { + var options ={ + message: ''; + bootbox.dialog(options).init(initFunction).show(); - // this will ensure that image and table can be focused Philippe Logel - $(document).on('focusin', function(e) {e.stopImmediatePropagation();}); + // this will ensure that image and table can be focused Philippe Logel + $(document).on('focusin', function(e) {e.stopImmediatePropagation();}); + + window.CRM.groups.get(function(rdata){ + groupsList = $.map(rdata.Groups, function (item) { + var o = { + text: item.Name, + id: item.Id + }; + return o; + }); + $groupSelect2 = $("#targetGroupSelection").select2({ + data: groupsList + }); - window.CRM.groups.get(function(rdata){ - groupsList = $.map(rdata.Groups, function (item) { + $groupSelect2.on("select2:select", function (e) { + var targetGroupId = $("#targetGroupSelection option:selected").val(); + $parent = $("#targetRoleSelection").parent(); + $("#targetRoleSelection").empty(); + window.CRM.groups.getRoles(targetGroupId, function(rdata){ + rolesList = $.map(rdata.ListOptions, function (item) { var o = { - text: item.Name, - id: item.Id + text: i18next.t(item.OptionName),// this is for the Teacher and Student role + id: item.OptionId }; return o; }); - $groupSelect2 = $("#targetGroupSelection").select2({ - data: groupsList - }); - - $groupSelect2.on("select2:select", function (e) { - var targetGroupId = $("#targetGroupSelection option:selected").val(); - $parent = $("#targetRoleSelection").parent(); - $("#targetRoleSelection").empty(); - window.CRM.groups.getRoles(targetGroupId, function(rdata){ - rolesList = $.map(rdata.ListOptions, function (item) { - var o = { - text: i18next.t(item.OptionName),// this is for the Teacher and Student role - id: item.OptionId - }; - return o; - }); - $("#targetRoleSelection").select2({ - data:rolesList - }) - }) - }); - }); - }, - 'addPerson' : function(GroupID,PersonID,RoleID, callback) { - params = { - method: 'POST', // define the type of HTTP verb we want to use (POST for our form) - path:'groups/' + GroupID + '/addperson/'+PersonID - }; - if (RoleID) - { - params.data = JSON.stringify({ - RoleID: RoleID - }); - } - return window.CRM.APIRequest(params, callback); - }, - 'removePerson' : function(GroupID,PersonID, callback) { - return window.CRM.APIRequest({ - method: 'DELETE', // define the type of HTTP verb we want to use (POST for our form) - path:'groups/' + GroupID + '/removeperson/' + PersonID, - }, callback); + $("#targetRoleSelection").select2({ + data:rolesList + }) + }) + }); + }); +}, +'addPerson' : function(GroupID,PersonID,RoleID, callback) { + params = { + method: 'POST', // define the type of HTTP verb we want to use (POST for our form) + path:'groups/' + GroupID + '/addperson/'+PersonID + }; + if (RoleID) + { + params.data = JSON.stringify({ + RoleID: RoleID + }); + } + return window.CRM.APIRequest(params, callback); +}, +'removePerson' : function(GroupID,PersonID, callback) { + return window.CRM.APIRequest({ + method: 'DELETE', // define the type of HTTP verb we want to use (POST for our form) + path:'groups/' + GroupID + '/removeperson/' + PersonID, + }, callback); +}, +'addGroup' : function(callbackM){ + bootbox.prompt({ + title: i18next.t("Add A Group Name"), + value: i18next.t("Default Name Group"), + onEscape: true, + closeButton: true, + buttons: { + confirm: { + label: i18next.t('Yes'), + className: 'btn-primary' }, - 'addGroup' : function(callbackM){ - bootbox.prompt({ - title: i18next.t("Add A Group Name"), - value: i18next.t("Default Name Group"), - onEscape: true, - closeButton: true, - buttons: { - confirm: { - label: i18next.t('Yes'), - className: 'btn-primary' - }, - cancel: { - label: i18next.t('No'), - className: 'btn-danger' - } - }, - callback: function (result) - { - if (result) - { - var newGroup = {'groupName': result}; - - window.CRM.APIRequest({ - method: "POST", - url: window.CRM.root + "/api/groups/", //call the groups api handler located at window.CRM.root - data: JSON.stringify(newGroup) // stringify the object we created earlier, and add it to the data payload - }, function (data) { //yippie, we got something good back from the server - window.CRM.cart.refresh(); - if(callbackM) - { - callbackM(data); - } - }); - } - } - }); + cancel: { + label: i18next.t('No'), + className: 'btn-danger' } - }; + }, + callback: function (result) + { + if (result) + { + var newGroup = {'groupName': result}; - window.CRM.system = { - 'runTimerJobs' : function () { window.CRM.APIRequest({ - method: 'POST', - path: 'timerjobs/run' - },function(data) { + method: "POST", + url: window.CRM.root + "/api/groups/", //call the groups api handler located at window.CRM.root + data: JSON.stringify(newGroup) // stringify the object we created earlier, and add it to the data payload + }, function (data) { //yippie, we got something good back from the server + window.CRM.cart.refresh(); + if(callbackM) + { + callbackM(data); + } }); } - }; - - window.CRM.tools = { - 'getLinkMapFromAddress' : function(address) { - if (window.CRM.sMapExternalProvider == "AppleMaps") { - return '' + address + ''; - } else if (window.CRM.sMapExternalProvider == "GoogleMaps") { - return '' + address + ''; - } else if (window.CRM.sMapExternalProvider == "BingMaps") { - return '' + address + ''; - } - } - }; - - window.CRM.synchronize = { - renderers: { - EventsCounters: function (data) { - if (document.getElementById('BirthdateNumber') != null) { - document.getElementById('BirthdateNumber').innerText = data.Birthdays; - document.getElementById('AnniversaryNumber').innerText = data.Anniversaries; - document.getElementById('EventsNumber').innerText = data.Events.count; - - var alarmLen = data.Events.alarms.length; - if (alarmLen > 0) { - for (i = 0; i < alarmLen; i++) { - if (data.Events.alarms[i].diplayAlarm) { - window.CRM.notify('far fa-bell',i18next.t("Calendar Event")+".",data.Events.alarms[i].summary + "
", null, "error","top",10000,'_blank',"Left"); - } - } - } - } - }, - FamilyCount: function (data) { - var dashBoardFamReal = document.getElementById('realFamilyCNT'); - var dashBoardSingleP = document.getElementById('singleCNT'); - - if (dashBoardFamReal != undefined && dashBoardSingleP != undefined) { // we have to test if we are on the dashboard or not - dashBoardFamReal.innerText = data.familyCount[1]; - dashBoardSingleP.innerText = data.familyCount[2]; - - var latestFamiliesTable = document.getElementById('latestFamiliesDashboardItem'); - if (latestFamiliesTable != undefined) { - latestFamiliesTable = $('#latestFamiliesDashboardItem').DataTable({ - retrieve: true, - responsive: true, - paging: false, - ordering: false, - searching: false, - scrollX: false, - info: false, - 'columns': [ - { - data: 'Name', - render: function (data, type, row, meta) { - if (window.CRM.bThumbnailIconPresence) { - return 'User Image ' + data + ''; - } else { - return '' + data + ''; - } - } - }, - { - data: 'Address1', - render: function (data, type, row, meta) { - return data.replace(/\\(.)/mg, "$1");// we strip the slashes - } - }, - { - data: 'DateEntered', - render: function (data, type, row, meta) { - if (window.CRM.timeEnglish == true) { - return moment(data).format(window.CRM.datePickerformat.toUpperCase() + ' hh:mm a'); - } else { - return moment(data).format(window.CRM.datePickerformat.toUpperCase() + ' HH:mm'); - } - } - } - ] - }); - latestFamiliesTable.clear(); - latestFamiliesTable.rows.add(data.LatestFamilies); - latestFamiliesTable.draw(true); - } - - var updatedFamiliesTable = document.getElementById('updatedFamiliesDashboardItem'); - if (updatedFamiliesTable != undefined) { - updatedFamiliesTable = $('#updatedFamiliesDashboardItem').DataTable({ - retrieve: true, - responsive: true, - paging: false, - ordering: false, - searching: false, - scrollX: false, - info: false, - 'columns': [ - { - data: 'Name', - render: function (data, type, row, meta) { - if (window.CRM.bThumbnailIconPresence) { - return 'User Image ' + data + ''; - } else { - return '' + data + ''; - } - } - }, - { - data: 'Address1', - render: function (data, type, row, meta) { - return data.replace(/\\(.)/mg, "$1");// we strip the slashes - } - }, - { - data: 'DateLastEdited', - render: function (data, type, row, meta) { - if (window.CRM.timeEnglish == true) { - return moment(data).format(window.CRM.datePickerformat.toUpperCase() + ' hh:mm a'); - } else { - return moment(data).format(window.CRM.datePickerformat.toUpperCase() + ' HH:mm'); - } - } - } - ] - }); - updatedFamiliesTable.clear(); - updatedFamiliesTable.rows.add(data.UpdatedFamilies); - updatedFamiliesTable.draw(true); + } + }); +} +}; + +window.CRM.system = { +'runTimerJobs' : function () { + window.CRM.APIRequest({ + method: 'POST', + path: 'timerjobs/run' + },function(data) { + }); +} +}; + +window.CRM.tools = { +'getLinkMapFromAddress' : function(address) { + if (window.CRM.sMapExternalProvider == "AppleMaps") { + return '' + address + ''; + } else if (window.CRM.sMapExternalProvider == "GoogleMaps") { + return '' + address + ''; + } else if (window.CRM.sMapExternalProvider == "BingMaps") { + return '' + address + ''; + } +} +}; + +window.CRM.synchronize = { +renderers: { + EventsCounters: function (data) { + if (document.getElementById('BirthdateNumber') != null) { + document.getElementById('BirthdateNumber').innerText = data.Birthdays; + document.getElementById('AnniversaryNumber').innerText = data.Anniversaries; + document.getElementById('EventsNumber').innerText = data.Events.count; + + var alarmLen = data.Events.alarms.length; + if (alarmLen > 0) { + for (i = 0; i < alarmLen; i++) { + if (data.Events.alarms[i].diplayAlarm) { + window.CRM.notify('far fa-bell',i18next.t("Calendar Event")+".",data.Events.alarms[i].summary + "
", null, "error","top",10000,'_blank',"Left"); + } } - } - }, - PersonCount: function (data) { - var dashBoardPeopleStats = document.getElementById('peopleStatsDashboard'); - if (dashBoardPeopleStats != undefined) { - dashBoardPeopleStats.innerText = data.personCount; - - var latestPersonsTable = document.getElementById('latestPersonsDashboardItem'); - if (latestPersonsTable != undefined) { - latestPersonsTable = $('#latestPersonsDashboardItem').DataTable({ - retrieve: true, - responsive: true, - paging: false, - ordering: false, - searching: false, - scrollX: false, - info: false, - 'columns': [ - { - data: 'LastName', - render: function (data, type, row, meta) { - if (window.CRM.bThumbnailIconPresence) { - return 'User Image ' + data + ' ' + row.FirstName + ''; - } else { - return '' + data + ' ' + row.FirstName + ''; - } - } - }, - { - data: 'Address1', - render: function (data, type, row, meta) { - if (data === null) { - return ''; - } - return data.replace(/\\(.)/mg, "$1");// we strip the slashes - } - }, - { - data: 'DateLastEdited', - render: function (data, type, row, meta) { - if (data === null) { - data = row.DateEntered; - } - if (window.CRM.timeEnglish == true) { - return moment(data).format(window.CRM.datePickerformat.toUpperCase() + ' hh:mm a'); - } else { - return moment(data).format(window.CRM.datePickerformat.toUpperCase() + ' HH:mm'); - } + } + } + }, + FamilyCount: function (data) { + var dashBoardFamReal = document.getElementById('realFamilyCNT'); + var dashBoardSingleP = document.getElementById('singleCNT'); + + if (dashBoardFamReal != undefined && dashBoardSingleP != undefined) { // we have to test if we are on the dashboard or not + dashBoardFamReal.innerText = data.familyCount[1]; + dashBoardSingleP.innerText = data.familyCount[2]; + + var latestFamiliesTable = document.getElementById('latestFamiliesDashboardItem'); + if (latestFamiliesTable != undefined) { + latestFamiliesTable = $('#latestFamiliesDashboardItem').DataTable({ + retrieve: true, + responsive: true, + paging: false, + ordering: false, + searching: false, + scrollX: false, + info: false, + 'columns': [ + { + data: 'Name', + render: function (data, type, row, meta) { + return row.img + ' ' + data + ''; + } + }, + { + data: 'Address1', + render: function (data, type, row, meta) { + return data.replace(/\\(.)/mg, "$1");// we strip the slashes + } + }, + { + data: 'DateEntered', + render: function (data, type, row, meta) { + if (window.CRM.timeEnglish == true) { + return moment(data).format(window.CRM.datePickerformat.toUpperCase() + ' hh:mm a'); + } else { + return moment(data).format(window.CRM.datePickerformat.toUpperCase() + ' HH:mm'); } } - ] - }); - latestPersonsTable.clear(); - latestPersonsTable.rows.add(data.LatestPersons); - latestPersonsTable.draw(true); - } + } + ] + }); + latestFamiliesTable.clear(); + latestFamiliesTable.rows.add(data.LatestFamilies); + latestFamiliesTable.draw(true); + } - var updatedPersonsTable = document.getElementById('updatedPersonsDashboardItem'); - if (updatedPersonsTable != undefined) { - updatedPersonsTable = $('#updatedPersonsDashboardItem').DataTable({ - retrieve: true, - responsive: true, - paging: false, - ordering: false, - searching: false, - scrollX: false, - info: false, - 'columns': [ - { - data: 'LastName', - render: function (data, type, row, meta) { - if (window.CRM.bThumbnailIconPresence) { - return 'User Image ' + data + ' ' + row.FirstName + ''; - } else { - return '' + data + ' ' + row.FirstName + ''; - } - } - }, - { - data: 'Address1', - render: function (data, type, row, meta) { - if (data === null) { - return ''; - } - return data.replace(/\\(.)/mg, "$1");// we strip the slashes - } - }, - { - data: 'DateLastEdited', - render: function (data, type, row, meta) { - if (data === null) { - data = row.DateEntered; - } - if (window.CRM.timeEnglish == true) { - return moment(data).format(window.CRM.datePickerformat.toUpperCase() + ' hh:mm a'); - } else { - return moment(data).format(window.CRM.datePickerformat.toUpperCase() + ' HH:mm'); - } + var updatedFamiliesTable = document.getElementById('updatedFamiliesDashboardItem'); + if (updatedFamiliesTable != undefined) { + updatedFamiliesTable = $('#updatedFamiliesDashboardItem').DataTable({ + retrieve: true, + responsive: true, + paging: false, + ordering: false, + searching: false, + scrollX: false, + info: false, + 'columns': [ + { + data: 'Name', + render: function (data, type, row, meta) { + return row.img + ' ' + data + ''; + } + }, + { + data: 'Address1', + render: function (data, type, row, meta) { + return data.replace(/\\(.)/mg, "$1");// we strip the slashes + } + }, + { + data: 'DateLastEdited', + render: function (data, type, row, meta) { + if (window.CRM.timeEnglish == true) { + return moment(data).format(window.CRM.datePickerformat.toUpperCase() + ' hh:mm a'); + } else { + return moment(data).format(window.CRM.datePickerformat.toUpperCase() + ' HH:mm'); } } - ] - }); - updatedPersonsTable.clear(); - updatedPersonsTable.rows.add(data.UpdatedPerson); - updatedPersonsTable.draw(true); - } + } + ] + }); + updatedFamiliesTable.clear(); + updatedFamiliesTable.rows.add(data.UpdatedFamilies); + updatedFamiliesTable.draw(true); } - }, - CalendarDisplay: function (data) { - var calendarView = document.getElementById('calendar'); - - if (calendarView && window.CRM.calendar != null) { - if (window.CRM.calendarSignature != data) { - window.CRM.calendarSignature = data; - window.CRM.addAllCalendars(); - } - - window.CRM.calendar.refetchEvents() - } - }, - EDriveDisplay: function(data) { - var edriveView = document.getElementById('edrive-table'); + } + }, + PersonCount: function (data) { + var dashBoardPeopleStats = document.getElementById('peopleStatsDashboard'); + if (dashBoardPeopleStats != undefined) { + dashBoardPeopleStats.innerText = data.personCount; + + var latestPersonsTable = document.getElementById('latestPersonsDashboardItem'); + if (latestPersonsTable != undefined) { + latestPersonsTable = $('#latestPersonsDashboardItem').DataTable({ + retrieve: true, + responsive: true, + paging: false, + ordering: false, + searching: false, + scrollX: false, + info: false, + 'columns': [ + { + data: 'LastName', + render: function (data, type, row, meta) { + return row.img + ' ' + data + ' ' + row.FirstName + ''; + } + }, + { + data: 'Address1', + render: function (data, type, row, meta) { + if (data === null) { + return ''; + } + return data.replace(/\\(.)/mg, "$1");// we strip the slashes + } + }, + { + data: 'DateEntered', + render: function (data, type, row, meta) { + if (window.CRM.timeEnglish == true) { + return moment(data).format(window.CRM.datePickerformat.toUpperCase() + ' hh:mm a'); + } else { + return moment(data).format(window.CRM.datePickerformat.toUpperCase() + ' HH:mm'); + } + } + } + ] + }); + latestPersonsTable.clear(); + latestPersonsTable.rows.add(data.LatestPersons); + latestPersonsTable.draw(true); + } - if (edriveView) { - window.CRM.reloadEDriveTable(); + var updatedPersonsTable = document.getElementById('updatedPersonsDashboardItem'); + if (updatedPersonsTable != undefined) { + updatedPersonsTable = $('#updatedPersonsDashboardItem').DataTable({ + retrieve: true, + responsive: true, + paging: false, + ordering: false, + searching: false, + scrollX: false, + info: false, + 'columns': [ + { + data: 'LastName', + render: function (data, type, row, meta) { + return row.img + ' ' + data + ' ' + row.FirstName + ''; + } + }, + { + data: 'Address1', + render: function (data, type, row, meta) { + if (data === null) { + return ''; + } + return data.replace(/\\(.)/mg, "$1");// we strip the slashes + } + }, + { + data: 'DateLastEdited', + render: function (data, type, row, meta) { + if (data === null) { + data = row.DateEntered; + } + if (window.CRM.timeEnglish == true) { + return moment(data).format(window.CRM.datePickerformat.toUpperCase() + ' hh:mm a'); + } else { + return moment(data).format(window.CRM.datePickerformat.toUpperCase() + ' HH:mm'); + } + } + } + ] + }); + updatedPersonsTable.clear(); + updatedPersonsTable.rows.add(data.UpdatedPerson); + updatedPersonsTable.draw(true); + } + } + }, + CalendarDisplay: function (data) { + var calendarView = document.getElementById('calendar'); + + if (calendarView && window.CRM.calendar != null) { + if (window.CRM.calendarSignature != data) { + window.CRM.calendarSignature = data; + window.CRM.addAllCalendars(); } - }, - GroupsDisplay: function (data) { - var dashBoardStatsSundaySchool = document.getElementById('groupStatsSundaySchool'); - if (dashBoardStatsSundaySchool) {// We have to check if we are on the dashboard menu - dashBoardStatsSundaySchool.innerText = data.sundaySchoolClasses; - } - var dashBoardStatsSundaySchoolKids = document.getElementById('groupStatsSundaySchoolKids'); - if (dashBoardStatsSundaySchoolKids) {// We have to check if we are on the dashboard menu - dashBoardStatsSundaySchoolKids.innerText = data.sundaySchoolkids; - } + window.CRM.calendar.refetchEvents() + } + }, + EDriveDisplay: function(data) { + var edriveView = document.getElementById('edrive-table'); - var dashBoardGroupsCountDashboard = document.getElementById('groupsCountDashboard'); + if (edriveView) { + window.CRM.reloadEDriveTable(); + } + }, + GroupsDisplay: function (data) { + var dashBoardStatsSundaySchool = document.getElementById('groupStatsSundaySchool'); + if (dashBoardStatsSundaySchool) {// We have to check if we are on the dashboard menu + dashBoardStatsSundaySchool.innerText = data.sundaySchoolClasses; + } - if (dashBoardGroupsCountDashboard) {// We have to check if we are on the dashboard menu - dashBoardGroupsCountDashboard.innerText = data.groups; - } - }, - SundaySchoolDisplay :function(data) { - var sundaySchoolClassesDasBoard = document.getElementById('sundaySchoolClassesDasBoard'); + var dashBoardStatsSundaySchoolKids = document.getElementById('groupStatsSundaySchoolKids'); + if (dashBoardStatsSundaySchoolKids) {// We have to check if we are on the dashboard menu + dashBoardStatsSundaySchoolKids.innerText = data.sundaySchoolkids; + } - if (sundaySchoolClassesDasBoard) { - sundaySchoolClassesDasBoard.innerText = data.sundaySchoolClasses; - } + var dashBoardGroupsCountDashboard = document.getElementById('groupsCountDashboard'); - var sundaySchoolTeachersCNTDasBoard = document.getElementById('sundaySchoolTeachersCNTDasBoard'); + if (dashBoardGroupsCountDashboard) {// We have to check if we are on the dashboard menu + dashBoardGroupsCountDashboard.innerText = data.groups; + } + }, + SundaySchoolDisplay :function(data) { + var sundaySchoolClassesDasBoard = document.getElementById('sundaySchoolClassesDasBoard'); - if (sundaySchoolTeachersCNTDasBoard) { - sundaySchoolTeachersCNTDasBoard.innerText = data.teachersCNT; - } + if (sundaySchoolClassesDasBoard) { + sundaySchoolClassesDasBoard.innerText = data.sundaySchoolClasses; + } - var sundaySchoolKidsCNTDasBoard = document.getElementById('sundaySchoolKidsCNTDasBoard'); + var sundaySchoolTeachersCNTDasBoard = document.getElementById('sundaySchoolTeachersCNTDasBoard'); - if (sundaySchoolKidsCNTDasBoard) { - sundaySchoolKidsCNTDasBoard.innerText = data.kidsCNT; - } + if (sundaySchoolTeachersCNTDasBoard) { + sundaySchoolTeachersCNTDasBoard.innerText = data.teachersCNT; + } - var sundaySchoolFamiliesCNTDasBoard = document.getElementById('sundaySchoolFamiliesCNTDasBoard'); + var sundaySchoolKidsCNTDasBoard = document.getElementById('sundaySchoolKidsCNTDasBoard'); - if (sundaySchoolFamiliesCNTDasBoard) { - sundaySchoolFamiliesCNTDasBoard.innerText = data.SundaySchoolFamiliesCNT; - } + if (sundaySchoolKidsCNTDasBoard) { + sundaySchoolKidsCNTDasBoard.innerText = data.kidsCNT; + } - var sundaySchoolMaleKidsCNTDasBoard = document.getElementById('sundaySchoolMaleKidsCNTDasBoard'); + var sundaySchoolFamiliesCNTDasBoard = document.getElementById('sundaySchoolFamiliesCNTDasBoard'); - if (sundaySchoolMaleKidsCNTDasBoard) { - sundaySchoolMaleKidsCNTDasBoard.innerText = data.maleKidsCNT; - } + if (sundaySchoolFamiliesCNTDasBoard) { + sundaySchoolFamiliesCNTDasBoard.innerText = data.SundaySchoolFamiliesCNT; + } - var sundaySchoolFemaleKidsCNTDasBoard = document.getElementById('sundaySchoolFemaleKidsCNTDasBoard'); + var sundaySchoolMaleKidsCNTDasBoard = document.getElementById('sundaySchoolMaleKidsCNTDasBoard'); - if (sundaySchoolFemaleKidsCNTDasBoard) { - sundaySchoolFemaleKidsCNTDasBoard.innerText = data.femaleKidsCNT; - } + if (sundaySchoolMaleKidsCNTDasBoard) { + sundaySchoolMaleKidsCNTDasBoard.innerText = data.maleKidsCNT; + } - var sundaySchoolEmailLinkDasBoard = document.getElementById('sEmailLink'); + var sundaySchoolFemaleKidsCNTDasBoard = document.getElementById('sundaySchoolFemaleKidsCNTDasBoard'); - if (sundaySchoolEmailLinkDasBoard) { - $('#sEmailLink').attr('href', 'mailto:' + data.emailLink); - } + if (sundaySchoolFemaleKidsCNTDasBoard) { + sundaySchoolFemaleKidsCNTDasBoard.innerText = data.femaleKidsCNT; + } - var sundaySchoolEmailLinkBCCDasBoard = document.getElementById('sEmailLinkBCC'); + var sundaySchoolEmailLinkDasBoard = document.getElementById('sEmailLink'); - if (sundaySchoolEmailLinkBCCDasBoard) { - $('#sEmailLinkBCC').attr('href', 'mailto:?bcc=' + data.emailLink); - } + if (sundaySchoolEmailLinkDasBoard) { + $('#sEmailLink').attr('href', 'mailto:' + data.emailLink); + } - var sundaySchoolDropDownMailDasBoard = document.getElementById('dropDownMail'); + var sundaySchoolEmailLinkBCCDasBoard = document.getElementById('sEmailLinkBCC'); - if (sundaySchoolDropDownMailDasBoard) { - $('#dropDownMail').html(data.dropDown.allNormal); - } + if (sundaySchoolEmailLinkBCCDasBoard) { + $('#sEmailLinkBCC').attr('href', 'mailto:?bcc=' + data.emailLink); + } - var sundaySchoolDropDownBCCMailDasBoard = document.getElementById('dropDownMailBCC'); + var sundaySchoolDropDownMailDasBoard = document.getElementById('dropDownMail'); - if (sundaySchoolDropDownBCCMailDasBoard) { - $('#dropDownMailBCC').html(data.dropDown.allNormalBCC); - } - }, - MailchimpDisplay:function (data) { - if (data.isActive) { - var len = data.MailChimpLists.length; + if (sundaySchoolDropDownMailDasBoard) { + $('#dropDownMail').html(data.dropDown.allNormal); + } - // now we empty the menubar lists - $(".lists_class_menu").removeClass("hidden"); - var real_listMenu = $(".lists_class_menu").find (".nav-treeview"); + var sundaySchoolDropDownBCCMailDasBoard = document.getElementById('dropDownMailBCC'); - real_listMenu.html(""); - var listItems = ""; + if (sundaySchoolDropDownBCCMailDasBoard) { + $('#dropDownMailBCC').html(data.dropDown.allNormalBCC); + } + }, + MailchimpDisplay:function (data) { + if (data.isActive) { + var len = data.MailChimpLists.length; - for (i = 0; i < len; i++) { - var list = data.MailChimpLists[i]; + // now we empty the menubar lists + $(".lists_class_menu").removeClass("hidden"); + var real_listMenu = $(".lists_class_menu").find (".nav-treeview"); - listItems += ''; - } + real_listMenu.html(""); + var listItems = ""; - real_listMenu.html(listItems); - } - }, - EventAttendeesDisplay: function (data) { - if (window.CRM.attendeesPresences == false) { - window.CRM.notify('fa fa-info-circle', - "" + data.EventCountAttend + " " + i18next.t("Attendees Checked In") + ".", - "
" + i18next.t("More info") + ' ' + '', - null, "warning", "bottom", - Math.min(window.CRM.iDashboardPageServiceIntervalTime * 1000, window.CRM.timeOut), - '_blank', - "Right"); - window.CRM.attendeesPresences = true; - } - } - }, - refresh: function () { - if (window.CRM.PageName.indexOf("v2/users/change/password") !== -1) { - return; - } - window.CRM.APIRequest({ - method: 'POST', - path: 'synchronize/page?currentpagename=' + window.CRM.PageName.replace(window.CRM.root,''), - },function (data) { - if (data[0].timeOut) { - window.location.replace(window.CRM.root+'/session/Lock'); - } else { - for (var key in data[1]) { - try { - window.CRM.synchronize.renderers[key](data[1][key]); - } catch (e) { - console.log(e); - } - } - } - }); - } - } + for (i = 0; i < len; i++) { + var list = data.MailChimpLists[i]; - /* - function : ElementListener - element : id or class (ie : '.myclass' or '#myid') - type : 'click' - callback : the function to target - */ - window.CRM.ElementListener = function(element, type, callback) { - // this is pure vanillia code ;-) - document.querySelectorAll(element).forEach(el=>{ - el.addEventListener(type, (event) => { - callback(event); - }); - }); - } + listItems += ''; + } - $(document).ajaxError(function (evt, xhr, settings,errortext) { - if(errortext !== "abort") { - try { - var CRMResponse = JSON.parse(xhr.responseText); - window.CRM.DisplayErrorMessage(settings.url, CRMResponse); - } catch(err) { - window.CRM.DisplayErrorMessage(settings.url,{"message":errortext}); - } + real_listMenu.html(listItems); + } + }, + EventAttendeesDisplay: function (data) { + if (window.CRM.attendeesPresences == false) { + window.CRM.notify('fa fa-info-circle', + "" + data.EventCountAttend + " " + i18next.t("Attendees Checked In") + ".", + "
" + i18next.t("More info") + ' ' + '', + null, "warning", "bottom", + Math.min(window.CRM.iDashboardPageServiceIntervalTime * 1000, window.CRM.timeOut), + '_blank', + "Right"); + window.CRM.attendeesPresences = true; + } + } +}, +refresh: function () { + if (window.CRM.PageName.indexOf("v2/users/change/password") !== -1) { + return; + } + window.CRM.APIRequest({ + method: 'POST', + path: 'synchronize/page?currentpagename=' + window.CRM.PageName.replace(window.CRM.root,''), + },function (data) { + if (data[0].timeOut) { + window.location.replace(window.CRM.root+'/session/Lock'); + } else { + for (var key in data[1]) { + try { + window.CRM.synchronize.renderers[key](data[1][key]); + } catch (e) { + console.log(e); + } } - }); - - const LimitTextSize = (theTextArea, size) => { - if (theTextArea.value.length > size) { - theTextArea.value = theTextArea.value.substr(0, size); - } } + }); +} +} - const popUp = (URL) => { - var day = new Date(); - var id = day.getTime(); - eval("page" + id + " = window.open(URL, '" + id + "', 'toolbar=0,scrollbars=yes,location=0,statusbar=0,menubar=0,resizable=yes,width=600,height=400,left = 100,top = 50');"); - } +/* + function : ElementListener + element : id or class (ie : '.myclass' or '#myid') + type : 'click' + callback : the function to target +*/ +window.CRM.ElementListener = function(element, type, callback) { + // this is pure vanillia code ;-) + document.querySelectorAll(element).forEach(el=>{ + el.addEventListener(type, (event) => { + callback(event); + }); + }); +} + +$(document).ajaxError(function (evt, xhr, settings,errortext) { +if(errortext !== "abort") { + try { + var CRMResponse = JSON.parse(xhr.responseText); + window.CRM.DisplayErrorMessage(settings.url, CRMResponse); + } catch(err) { + window.CRM.DisplayErrorMessage(settings.url,{"message":errortext}); + } +} +}); + +const LimitTextSize = (theTextArea, size) => { + if (theTextArea.value.length > size) { + theTextArea.value = theTextArea.value.substr(0, size); + } +} + +const popUp = (URL) => { + var day = new Date(); + var id = day.getTime(); + eval("page" + id + " = window.open(URL, '" + id + "', 'toolbar=0,scrollbars=yes,location=0,statusbar=0,menubar=0,resizable=yes,width=600,height=400,left = 100,top = 50');"); +} \ No newline at end of file From 10e9aafd3e86f826280bff2a90f8e8fe23a5cfef Mon Sep 17 00:00:00 2001 From: Philippe Logel Date: Sat, 13 Apr 2024 16:29:34 +0000 Subject: [PATCH 07/16] SundaySchoolServive : update include images --- src/EcclesiaCRM/Service/SundaySchoolService.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/EcclesiaCRM/Service/SundaySchoolService.php b/src/EcclesiaCRM/Service/SundaySchoolService.php index fa3d13f34..2c6797ef0 100644 --- a/src/EcclesiaCRM/Service/SundaySchoolService.php +++ b/src/EcclesiaCRM/Service/SundaySchoolService.php @@ -2,6 +2,7 @@ namespace EcclesiaCRM\Service; +use EcclesiaCRM\Base\PersonQuery; use Propel\Runtime\Propel; class SundaySchoolService @@ -77,6 +78,10 @@ public function getClassByRole($groupId, $role) $members = []; while ($row = $statement->fetch(\PDO::FETCH_BOTH)) { + $per = PersonQuery::create()->findOneById($row['per_ID']); + $img = $per->getJPGPhotoDatas(); + $row['img'] = $img; + array_push($members, $row); } From e492ba6f3e9b5de5cbbbe6cd195565f521664357 Mon Sep 17 00:00:00 2001 From: Philippe Logel Date: Sat, 13 Apr 2024 16:30:18 +0000 Subject: [PATCH 08/16] pastoral care update : for images --- .../js/pastoralcare/PastoralCareDashboard.js | 20 +-- .../pastoralcare/pastoralcarefamily.php | 107 ++++++++-------- .../pastoralcare/pastoralcareperson.php | 114 ++++++++++-------- 3 files changed, 128 insertions(+), 113 deletions(-) diff --git a/src/skin/js/pastoralcare/PastoralCareDashboard.js b/src/skin/js/pastoralcare/PastoralCareDashboard.js index 58bbbf0f2..a3941dc80 100644 --- a/src/skin/js/pastoralcare/PastoralCareDashboard.js +++ b/src/skin/js/pastoralcare/PastoralCareDashboard.js @@ -16,9 +16,9 @@ $(function() { render: function(data, type, full, meta) { res = ''; if (window.CRM.bThumbnailIconPresence) { - res += 'User Image '; + res += 'User Image '; } - return res + ''+ data + ''; + return res + ' '+ data + ''; } }, { @@ -92,9 +92,9 @@ $(function() { render: function(data, type, full, meta) { res = ''; if (window.CRM.bThumbnailIconPresence) { - res += 'User Image '; + res += 'User Image '; } - return res + ''+ data + ""; + return res + ' '+ data + ""; } }, { @@ -151,7 +151,7 @@ $(function() { if (window.CRM.bThumbnailIconPresence) { res += 'User Image '; } - return res + ''+ data + ""; + return res + ' '+ data + ""; } }, { @@ -200,7 +200,7 @@ $(function() { if (window.CRM.bThumbnailIconPresence) { res += 'User Image '; } - return res + ''+ data + ""; + return res + ' '+ data + ""; } }, { @@ -255,9 +255,9 @@ $(function() { render: function(data, type, full, meta) { res = ''; if (window.CRM.bThumbnailIconPresence) { - res += 'User Image '; + res += 'User Image '; } - return res + ''+ data + ""; + return res + ' '+ data + ""; } }, { @@ -312,9 +312,9 @@ $(function() { render: function(data, type, full, meta) { res = ''; if (window.CRM.bThumbnailIconPresence) { - res += 'User Image '; + res += 'User Image '; } - return res + ''+ data + ""; + return res + ' '+ data + ""; } }, { diff --git a/src/v2/templates/pastoralcare/pastoralcarefamily.php b/src/v2/templates/pastoralcare/pastoralcarefamily.php index 42170aa2d..bbe21cbb5 100644 --- a/src/v2/templates/pastoralcare/pastoralcarefamily.php +++ b/src/v2/templates/pastoralcare/pastoralcarefamily.php @@ -253,61 +253,10 @@ class="fas fa-sticky-note">getPerson()->getFullN
- - -
- getActivatedPeople()) > 1) { ?> -
-

- -

- - - - - - - - - getActivatedPeople() as $person) { - ?> - - - - - - -
- - getFullName() ?> - - getFamilyRoleName(); - $labelColor = 'label-default'; - if ($famRole == _('Head of Household')) { - } elseif ($famRole == _('Spouse')) { - $labelColor = 'label-info'; - } elseif ($famRole == _('Child')) { - $labelColor = 'label-warning'; - } - ?> - -
- - -
-
-
+
count() > 0) { ?> @@ -390,6 +339,60 @@ class="fas fa-clock"> getDate()->format($sDateFormatLo onclick="javascript:document.location='/v2/pastoralcare/membersList';">
+
+ +
+
+

+
+ +
+
+ +
+ getActivatedPeople()) > 1) { ?> + + + + + + + + + getActivatedPeople() as $person) { + ?> + + + + + + +
+ getJPGPhotoDatas() ?> + getFullName() ?> + + getFamilyRoleName(); + $labelColor = 'label-default'; + if ($famRole == _('Head of Household')) { + } elseif ($famRole == _('Spouse')) { + $labelColor = 'label-info'; + } elseif ($famRole == _('Child')) { + $labelColor = 'label-warning'; + } + ?> + +
+ + +
+
diff --git a/src/v2/templates/pastoralcare/pastoralcareperson.php b/src/v2/templates/pastoralcare/pastoralcareperson.php index 2138eaa40..f9afb9c4d 100644 --- a/src/v2/templates/pastoralcare/pastoralcareperson.php +++ b/src/v2/templates/pastoralcare/pastoralcareperson.php @@ -14,6 +14,7 @@ use EcclesiaCRM\Utils\OutputUtils; use EcclesiaCRM\dto\ChurchMetaData; use EcclesiaCRM\dto\SystemURLs; +use EcclesiaCRM\Utils\InputUtils; require $sRootDocument . '/Include/Header.php'; ?> @@ -381,61 +382,12 @@ class="fas fa-child"> } ?> - - - getActivatedPeople()) > 1) { ?> -
-
-

- -

- - - - - - - - - getActivatedPeople() as $person) { - if ($person->getId() == $currentPersonID) continue; - ?> - - - - - - -
- - getFullName() ?> - - getFamilyRoleName(); - $labelColor = 'label-default'; - if ($famRole == _('Head of Household')) { - } elseif ($famRole == _('Spouse')) { - $labelColor = 'label-info'; - } elseif ($famRole == _('Child')) { - $labelColor = 'label-warning'; - } - ?> - -
-
- + -
+
count() > 0) { ?> @@ -516,6 +468,66 @@ class="user-link">getFullName() ?> name="Cancel" onclick="javascript:document.location='/v2/pastoralcare/membersList';">
+
+
+
+ +
+
+

+
+ +
+
+ +
+ + getActivatedPeople()) > 1) { ?> + + + + + + + + + getActivatedPeople() as $person) { + if ($person->getId() == $currentPersonID) continue; + ?> + + + + + + +
+ getJPGPhotoDatas() ?> + getFullName() ?> + + getFamilyRoleName(); + $labelColor = 'label-default'; + if ($famRole == _('Head of Household')) { + } elseif ($famRole == _('Spouse')) { + $labelColor = 'label-info'; + } elseif ($famRole == _('Child')) { + $labelColor = 'label-warning'; + } + ?> + +
+ + + + +
+
From e2516d25f367ede556df5005d96574851705b82c Mon Sep 17 00:00:00 2001 From: Philippe Logel Date: Sat, 13 Apr 2024 16:30:41 +0000 Subject: [PATCH 09/16] personview + familyview update --- src/v2/templates/people/familyview.php | 5 +---- src/v2/templates/people/personview.php | 4 +--- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/v2/templates/people/familyview.php b/src/v2/templates/people/familyview.php index c70147388..2d378b3f8 100644 --- a/src/v2/templates/people/familyview.php +++ b/src/v2/templates/people/familyview.php @@ -348,10 +348,7 @@ class="far fa-trash-alt"> ?>
- + getJPGPhotoDatas() ?> getFullName() ?>
- + getJPGPhotoDatas() ?> getFullName() ?>