diff --git a/application/modules/default/controllers/UserController.php b/application/modules/default/controllers/UserController.php index ff1102893..6a9de622a 100644 --- a/application/modules/default/controllers/UserController.php +++ b/application/modules/default/controllers/UserController.php @@ -1,825 +1,829 @@ . **/ class UserController extends Local_Controller_Action_DomainSwitch { protected $_memberId; protected $_userName; /** @var Zend_Db_Table_Row */ protected $_memberSettings; public function init() { parent::init(); if ($this->hasParam('user_name')) { $this->_userName = $this->getParam('user_name'); $this->_userName = urldecode($this->_userName); $modelMember = new Default_Model_Member(); $this->_memberId = $modelMember->fetchActiveUserByUsername($this->_userName); } else { $this->_memberId = (int)$this->getParam('member_id'); } } public function indexAction() { $this->_helper->viewRenderer('aboutme'); $this->aboutmeAction(); } public function aboutmeAction() { $tableMember = new Default_Model_Member(); $tableProject = new Default_Model_Project(); $earnModel = new Default_Model_StatDownload(); $helperUserRole = new Backend_View_Helper_UserRole(); $pageLimit = 500; $projectpage = (int)$this->getParam('projectpage', 1); $this->view->authMember = $this->_authMember; $this->view->member = $tableMember->fetchMemberData($this->_memberId); $this->view->headTitle($this->view->member->username . ' - ' . $this->getHeadTitle(), 'SET'); if (null == $this->view->member) { $this->redirect("/"); } if ($this->view->member->is_deleted == 1 or $this->view->member->is_active == 0) { $this->redirect("/"); } $this->view->mainProject = $this->view->member->findDependentRowset($tableProject, 'MainProject')->current(); $this->view->userProjectCategories = $tableProject->getUserCreatingCategorys($this->_memberId); $this->view->aboutmeUserInfo = $this->getAboutmeUserInfo($this->_memberId,$this->view->member->username); $userRoleName = $helperUserRole->userRole(); if (Default_Model_DbTable_MemberRole::ROLE_NAME_ADMIN == $userRoleName) { $datetime = new DateTime(); $datetime->sub(new DateInterval('P1M')); $month = $datetime->format('Ym'); $amount = $earnModel->getMonthEarn($this->_memberId,$month); if($amount && $amount['amount']) { $this->view->earnInfo = ' Last month I earned $'.number_format($amount['amount'], 2, '.', '').'.'; }else { $this->view->earnInfo=' Last month I earned 0.'; } }else{ $this->view->earnInfo=''; } // ajax load more products if ($this->getParam('projectpage', null)) { $total_records = $tableProject->countAllProjectsForMemberCatFilter($this->_memberId, true, null); $this->view->pageLimit = $pageLimit; $this->view->projectpage = $projectpage; $this->view->total_records = $total_records; // get last project category id $lastproject = $tableProject->getUserActiveProjects($this->_memberId, 1, (($projectpage - 1) * $pageLimit-1)); foreach ($lastproject as $value) { $this->view->lastcatid = $value['project_category_id']; } $this->view->userProducts = $tableProject->getUserActiveProjects($this->_memberId, $pageLimit, ($projectpage - 1) * $pageLimit); $this->_helper->layout->disableLayout(); $this->_helper->viewRenderer('partials/aboutmeProducts'); //$this->forward('showmoreproductsajax', 'user', null, $this->getAllParams()); return; } else { $total_records = $tableProject->countAllProjectsForMemberCatFilter($this->_memberId, true, null); $this->view->pageLimit = $pageLimit; $this->view->projectpage = $projectpage; $this->view->total_records = $total_records; //$this->view->userProducts = $tableProject->fetchAllProjectsForMember($this->_memberId, $pageLimit, ($projectpage - 1) * $pageLimit,true); $this->view->userProducts = $tableProject->getUserActiveProjects($this->_memberId, $pageLimit, ($projectpage - 1) * $pageLimit); $this->view->userFeaturedProducts = $tableProject->fetchAllFeaturedProjectsForMember($this->_memberId); $paginationComments = $tableMember->fetchComments($this->_memberId); if ($paginationComments) { $offset = (int)$this->getParam('page'); $paginationComments->setItemCountPerPage(50); $paginationComments->setCurrentPageNumber($offset); $this->view->comments = $paginationComments; } // favs Currently no paging... $this->view->paramLikePageId = (int)$this->getParam('likepage'); $model = new Default_Model_DbTable_ProjectFollower(); $offset = $this->view->paramLikePageId; $list = $model->fetchLikesForMember($this->_memberId); $list->setItemCountPerPage(1000); $list->setCurrentPageNumber($offset); $this->view->likes = $list; // plings Currently no paging... $plingmodel = new Default_Model_ProjectPlings(); $offset = null; $plist = $plingmodel->fetchPlingsForMember($this->_memberId); $plist->setItemCountPerPage(1000); $plist->setCurrentPageNumber($offset); $this->view->plings = $plist; // plings Currently no paging... $plingmodel = new Default_Model_ProjectPlings(); $offset = null; $pslist = $plingmodel->fetchPlingsForSupporter($this->_memberId); $pslist->setItemCountPerPage(1000); $pslist->setCurrentPageNumber($offset); $this->view->supportersplings = $pslist; // rated $ratemodel = new Default_Model_DbTable_ProjectRating(); $this->view->rated = $ratemodel->getRatedForMember($this->_memberId); $stat = array(); $stat['cntProducts'] = $total_records; if ($this->view->userFeaturedProducts) { $cnt = 0; foreach ($this->view->userFeaturedProducts as $tmp) { $cnt++; } $stat['cntFProducts'] = $cnt; } else { $stat['cntFProducts'] = 0; } $stat['cntComments'] = $paginationComments->getTotalItemCount(); $tblFollower = new Default_Model_DbTable_ProjectFollower(); $stat['cntLikesHeGave'] = $tblFollower->countLikesHeGave($this->_memberId); $stat['cntLikesHeGot'] = $tblFollower->countLikesHeGot($this->_memberId); $tblPling = new Default_Model_DbTable_ProjectPlings(); $stat['cntPlingsHeGave'] = $tblPling->countPlingsHeGave($this->_memberId); $stat['cntPlingsHeGot'] = $tblPling->countPlingsHeGot($this->_memberId); $donationinfo = $tableMember->fetchSupporterDonationInfo($this->_memberId); if ($donationinfo) { $stat['donationIssupporter'] = $donationinfo['issupporter']; $stat['donationMax'] = $donationinfo['active_time_max']; $stat['donationMin'] = $donationinfo['active_time_min']; $stat['donationCnt'] = $donationinfo['cnt']; } // $cntmb = $tableMember->fetchCntSupporters($this->_memberId); // $stat['cntSupporters'] = $cntmb; $stat['userLastActiveTime'] = $tableMember->fetchLastActiveTime($this->_memberId); $userRoleName = $helperUserRole->userRole(); if (Default_Model_DbTable_MemberRole::ROLE_NAME_ADMIN == $userRoleName) { $stat['cntDuplicateSourceurl'] = $tableProject->getCountProjectsDuplicateSourceurl($this->_memberId); } $this->view->stat = $stat; } } public function getAboutmeUserInfo($member_id,$username) { $tableProject = new Default_Model_Project(); $userProjectCategories = $tableProject->getUserCreatingCategorys($member_id); $cnt = sizeof($userProjectCategories ); $userinfo=''; $isAdmin = false; $helperUserRole = new Backend_View_Helper_UserRole(); $userRoleName = $helperUserRole->userRole(); if (Default_Model_DbTable_MemberRole::ROLE_NAME_ADMIN == $userRoleName){ $isAdmin= true; } if($cnt>0) { $userinfo = "Hi, I am ".$username." and I create "; if($cnt==1) { $userinfo = $userinfo.' '.$userProjectCategories[0]['category1'].''; $userinfo = $userinfo.'.'; /* if($isAdmin) { $userinfo = $userinfo.' ('.$userProjectCategories[0]['cnt'].').'; }else{ $userinfo = $userinfo.'.'; }*/ }else if($cnt==2) { $userinfo = $userinfo.' '.$userProjectCategories[0]['category1'].''; /*if($isAdmin) { $userinfo = $userinfo.' ('.$userProjectCategories[0]['cnt'].')'; }*/ $userinfo = $userinfo.' and '.$userProjectCategories[1]['category1'].''; /*if($isAdmin) { $userinfo = $userinfo.'('.$userProjectCategories[1]['cnt'].').'; }else{ $userinfo = $userinfo.'.'; }*/ $userinfo = $userinfo.'.'; }else if($cnt==3) { $userinfo = $userinfo.' '.$userProjectCategories[0]['category1'].''; /*if($isAdmin) { $userinfo = $userinfo.' ('.$userProjectCategories[0]['cnt'].')'; }*/ $userinfo = $userinfo.', '.$userProjectCategories[1]['category1'].''; /* if($isAdmin) { $userinfo = $userinfo.' ('.$userProjectCategories[1]['cnt'].')'; }*/ $userinfo = $userinfo.' and '.$userProjectCategories[2]['category1'].''; /*if($isAdmin) { $userinfo = $userinfo.' ('.$userProjectCategories[2]['cnt'].').'; }*/ /*else{ $userinfo = $userinfo.'.'; }*/ $userinfo = $userinfo.'.'; }else if($cnt>3) { $userinfo = $userinfo.' '.$userProjectCategories[0]['category1'].''; /*if($isAdmin) { $userinfo = $userinfo.' ('.$userProjectCategories[0]['cnt'].')'; }*/ $userinfo = $userinfo.', '.$userProjectCategories[1]['category1'].''; /*if($isAdmin) { $userinfo = $userinfo.' ('.$userProjectCategories[1]['cnt'].')'; }*/ $userinfo = $userinfo.', '.$userProjectCategories[2]['category1'].''; /*if($isAdmin) { $userinfo = $userinfo.' ('.$userProjectCategories[2]['cnt'].')'; }*/ $userinfo = $userinfo.' and more.'; } } return $userinfo; } public function avatarAction() { $this->_helper->layout->disableLayout(); $size = (int)$this->getParam("size", 200); $width = (int)$this->getParam("width", ($size / 2)); $this->view->size = (int)$size / 2; $emailHash = $this->getParam("emailhash", null); if ($emailHash) { $memberTable = new Default_Model_Member(); $member = $memberTable->findMemberForMailHash($emailHash); if ($member) { $helperImage = new Default_View_Helper_Image(); $imgUrl = $helperImage->Image($member['profile_image_url'], array('width' => $width, 'height' => $width)); $this->view->avatar = $imgUrl; $this->redirect($imgUrl); return; } } $this->view->avatar = ""; $helperImage = new Default_View_Helper_Image(); $imgUrl = $helperImage->Image("default-profile.png", array('width' => $width, 'height' => $width)); $this->redirect($imgUrl); } public function aboutAction() { $modelMember = new Default_Model_Member(); $this->view->member = $modelMember->fetchMember($this->_memberId)->toArray(); $this->view->currentPageOffset = (int)$this->getParam('page'); } public function showmoreproductsajaxAction() { $this->_helper->layout->disableLayout(); $tableProject = new Default_Model_Project(); $pageLimit = 21; $page = (int)$this->getParam('page', 1); $total_records = $tableProject->countAllProjectsForMemberCatFilter($this->_memberId, true, null); $this->view->pageLimit = $pageLimit; $this->view->page = $page; $this->view->total_records = $total_records; $this->view->userProducts = $tableProject->fetchAllProjectsForMember($this->_memberId, $pageLimit, ($page - 1) * $pageLimit, true); $this->_helper->viewRenderer('/partials/aboutmeProducts'); } public function userdataajaxAction() { $this->_helper->layout()->disableLayout(); $this->_helper->viewRenderer->setNoRender(true); $resultArray = array(); header('Access-Control-Allow-Origin: *'); $this->getResponse()->setHeader('Access-Control-Allow-Origin', '*')->setHeader('Access-Control-Allow-Credentials', 'true') ->setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS') ->setHeader('Access-Control-Allow-Headers', 'origin, content-type, accept') ; $userid = $this->getParam('id'); $modelMember = new Default_Model_Member(); $user = $modelMember->find($userid)->current(); if (Zend_Auth::getInstance()->hasIdentity()) { $auth = Zend_Auth::getInstance(); $user = $auth->getStorage()->read(); $resultArray['member_id'] = $user->member_id; $resultArray['username'] = $user->username; $resultArray['mail'] = $user->mail; $resultArray['avatar'] = $user->profile_image_url; } else if (null != $userid && null != $user) { $resultArray['member_id'] = $user['member_id']; $resultArray['username'] = $user['username']; $resultArray['mail'] = $user['mail']; $resultArray['avatar'] = $user['profile_image_url']; } else { $resultArray['member_id'] = null; $resultArray['username'] = null; $resultArray['mail'] = null; $resultArray['avatar'] = null; } $resultAll = array(); $resultAll['status'] = "success"; $resultAll['data'] = $resultArray; $this->_helper->json($resultAll); } public function followsAction() { $this->redirect($this->_helper->url('follows', 'member', null, $this->getAllParams())); } public function followAction() { $this->_helper->layout->disableLayout(); $this->view->authMember = $this->_authMember; $this->view->member_id = $this->_memberId; if ($this->_memberId == $this->_authMember->member_id) { return; } $memberFollowTable = new Default_Model_DbTable_MemberFollower(); $newVals = array('member_id' => $this->_memberId, 'follower_id' => (int)$this->_authMember->member_id); $where = $memberFollowTable->select()->where('member_id = ?', $this->_memberId) ->where('follower_id = ?', $this->_authMember->member_id, 'INTEGER') ; $result = $memberFollowTable->fetchRow($where); if (null === $result) { $memberFollowTable->createRow($newVals)->save(); } } public function unfollowAction() { $this->_helper->layout->disableLayout(); $this->_helper->viewRenderer('follow'); $memberFollowTable = new Default_Model_DbTable_MemberFollower(); $memberFollowTable->delete('member_id=' . $this->_memberId . ' AND follower_id=' . $this->_authMember->member_id); $this->view->authMember = $this->_authMember; $this->view->member_id = $this->_memberId; } public function newsAction() { $this->productsAction(); $this->render('products'); } public function productsAction() { $pageLimit = 25; $page = (int)$this->getParam('page', 1); //create ppload download hash: secret + collection_id + expire-timestamp $salt = PPLOAD_DOWNLOAD_SECRET; $timestamp = time() + 3600; // one hour valid $hash = md5($salt . $timestamp); // order isn't important at all... just do the same when verifying $this->view->download_hash = $hash; $this->view->download_timestamp = $timestamp; $this->view->member_id = null; if (null != $this->_authMember && null != $this->_authMember->member_id) { $this->view->member_id = $this->_authMember->member_id; } $modelProject = new Default_Model_Project(); $userProjects = $modelProject->fetchAllProjectsForMember($this->_authMember->member_id, $pageLimit, ($page - 1) * $pageLimit); $paginator = Local_Paginator::factory($userProjects); $paginator->setItemCountPerPage($pageLimit); $paginator->setCurrentPageNumber($page); $paginator->setTotalItemCount($modelProject->countAllProjectsForMember($this->_authMember->member_id)); $this->view->products = $paginator; $modelMember = new Default_Model_Member(); $this->view->member = $modelMember->fetchMemberData($this->_authMember->member_id); } public function activitiesAction() { $modelInfo = new Default_Model_Info(); $this->view->member = $this->_authMember; $this->view->comments = $modelInfo->getLastCommentsForUsersProjects($this->_authMember->member_id); $this->view->votes = $modelInfo->getLastVotesForUsersProjects($this->_authMember->member_id); $this->view->donations = $modelInfo->getLastDonationsForUsersProjects($this->_authMember->member_id); } public function settingsAction() { $this->_helper->layout()->setLayout('settings'); } public function reportAction() { $this->_helper->layout->disableLayout(); $this->_helper->viewRenderer('product/add'); $this->forward('report', 'product', null, $this->getAllParams()); } public function paymentsAction() { $this->view->headScript()->setFile(''); $this->view->headLink()->setStylesheet(''); $member_id = $this->_authMember->member_id; $this->view->member = $this->_authMember; $tableMember = new Default_Model_Member(); $this->view->hits = $tableMember->fetchPlingedProjects($member_id); } public function incomeAction() { $this->view->member = $this->_authMember; $tableMember = new Default_Model_Member(); $modelPlings = new Default_Model_Pling(); $this->view->donations = $modelPlings->fetchRecentDonationsForUser($this->_authMember->member_id); } public function tooltipAction() { $this->_helper->layout->disableLayout(); $info = new Default_Model_Info(); $data = $info->getTooptipForMember($this->_memberId); $this->_helper->json(array('status' => 'ok', 'data' => $data)); } public function shareAction() { $this->_helper->layout->disableLayout(); $modelProduct = new Default_Model_Member(); $memberInfo = $modelProduct->fetchMemberData($this->_memberId); $form = new Default_Form_ProjectShare(); $form->setAction('/member/' . $this->_memberId . '/share/'); // $helperBaseUrl = new Default_View_Helper_BaseUrl(); // $helperServerUrl = new Zend_View_Helper_ServerUrl(); $helpMemberUrl = new Default_View_Helper_BuildMemberUrl(); $this->view->permaLink = $helpMemberUrl->buildMemberUrl($memberInfo->username); // $this->view->permaLink = $helperServerUrl->serverUrl() . $helperBaseUrl->baseUrl() . '/member/' . $this->_memberId . '/'; if ($this->_request->isGet()) { $this->view->form = $form; $this->renderScript('product/share.phtml'); return; } if (false === $form->isValid($_POST)) { // form not valid $this->view->form = $form; $dummy = $this->view->render('product/share.phtml'); $this->_helper->json(array('status' => 'ok', 'message' => $dummy)); return; } $values = $form->getValues(); if (empty($memberInfo->firstname) and empty($memberInfo->lastname)) { $username = $memberInfo->username; } else { $username = $memberInfo->firstname . ' ' . $memberInfo->lastname; } $shareMail = new Default_Plugin_SendMail('tpl_social_mail_user'); $shareMail->setTemplateVar('sender', $values['sender_mail']); $shareMail->setTemplateVar('username', $username); $shareMail->setTemplateVar('permalink', $this->view->permaLink); $shareMail->setTemplateVar('permalinktext', 'View user\'s page'); $shareMail->setReceiverMail($values['mail']); $shareMail->send(); $this->_helper->json(array('status' => 'ok', 'redirect' => $this->view->permaLink)); } public function plingsAction() { $tableMember = new Default_Model_Member(); $this->view->view_member = $tableMember->fetchMemberData($this->_memberId); $paypalValidStatusTable = new Default_Model_DbTable_PaypalValidStatus(); $paypalValidStatus = $paypalValidStatusTable->find($this->view->view_member->paypal_valid_status)->current(); $this->view->paypal_valid_status = $paypalValidStatus; //backdoor for admins $helperUserRole = new Backend_View_Helper_UserRole(); $userRoleName = $helperUserRole->userRole(); if (Default_Model_DbTable_MemberRole::ROLE_NAME_ADMIN == $userRoleName) { $this->view->member = $this->view->view_member; } else { $this->view->member = $this->_authMember; } } public function plingsoldAction() { $tableMember = new Default_Model_Member(); $this->view->view_member = $tableMember->fetchMemberData($this->_memberId); $paypalValidStatusTable = new Default_Model_DbTable_PaypalValidStatus(); $paypalValidStatus = $paypalValidStatusTable->find($this->view->view_member->paypal_valid_status)->current(); $this->view->paypal_valid_status = $paypalValidStatus; //backdoor for admins $helperUserRole = new Backend_View_Helper_UserRole(); $userRoleName = $helperUserRole->userRole(); if (Default_Model_DbTable_MemberRole::ROLE_NAME_ADMIN == $userRoleName) { $this->view->member = $this->view->view_member; } else { $this->view->member = $this->_authMember; } } public function plingsajaxAction() { $this->_helper->layout->disableLayout(); $tableMember = new Default_Model_Member(); $this->view->view_member = $tableMember->fetchMemberData($this->_memberId); $paypalValidStatusTable = new Default_Model_DbTable_PaypalValidStatus(); $paypalValidStatus = $paypalValidStatusTable->find($this->view->view_member->paypal_valid_status)->current(); $this->view->paypal_valid_status = $paypalValidStatus; //backdoor for admins $helperUserRole = new Backend_View_Helper_UserRole(); $userRoleName = $helperUserRole->userRole(); if (Default_Model_DbTable_MemberRole::ROLE_NAME_ADMIN == $userRoleName) { $this->view->member = $this->view->view_member; } else { $this->view->member = $this->_authMember; } $year = null; if($this->hasParam('year')) { $year = $this->getParam('year'); } $this->view->year = $year; $this->_helper->viewRenderer('/plingsajax'); } public function plingsmonthajaxAction() { $this->_helper->layout->disableLayout(); $tableMember = new Default_Model_Member(); $this->view->view_member = $tableMember->fetchMemberData($this->_memberId); $paypalValidStatusTable = new Default_Model_DbTable_PaypalValidStatus(); $paypalValidStatus = $paypalValidStatusTable->find($this->view->view_member->paypal_valid_status)->current(); $this->view->paypal_valid_status = $paypalValidStatus; //backdoor for admins $helperUserRole = new Backend_View_Helper_UserRole(); $userRoleName = $helperUserRole->userRole(); if (Default_Model_DbTable_MemberRole::ROLE_NAME_ADMIN == $userRoleName) { $this->view->member = $this->view->view_member; } else { $this->view->member = $this->_authMember; } $yearmonth = null; if($this->hasParam('yearmonth')) { $yearmonth = $this->getParam('yearmonth'); } $this->view->yearmonth = $yearmonth; $this->_helper->viewRenderer('/plingsmonthajax'); } public function downloadhistoryAction() { $tableMember = new Default_Model_Member(); $this->view->view_member = $tableMember->fetchMemberData($this->_memberId); //backdore for admins $helperUserRole = new Backend_View_Helper_UserRole(); $userRoleName = $helperUserRole->userRole(); if (Default_Model_DbTable_MemberRole::ROLE_NAME_ADMIN == $userRoleName) { $this->view->member = $this->view->view_member; } else { $this->view->member = $this->_authMember; } if ($this->view->member) { $this->view->paramPageId = (int)$this->getParam('page'); //TODO do really sql paging instead of Zend_Paginator $dhistory = new Default_Model_DbTable_MemberDownloadHistory(); $offset = $this->view->paramPageId; $list = $dhistory->getDownloadhistory($this->view->member->member_id); $list->setItemCountPerPage(250); $list->setCurrentPageNumber($offset); $this->view->downloadhistory = $list; } else { $this->view->downloadhistory = array(); } } public function likesAction() { $tableMember = new Default_Model_Member(); $this->view->view_member = $tableMember->fetchMemberData($this->_memberId); //backdore for admins $helperUserRole = new Backend_View_Helper_UserRole(); $userRoleName = $helperUserRole->userRole(); if (Default_Model_DbTable_MemberRole::ROLE_NAME_ADMIN == $userRoleName) { $this->view->member = $this->view->view_member; } else { $this->view->member = $this->_authMember; } if ($this->view->member) { $this->view->paramPageId = (int)$this->getParam('page'); $model = new Default_Model_DbTable_ProjectFollower(); $offset = $this->view->paramPageId; $list = $model->fetchLikesForMember($this->view->member->member_id); $list->setItemCountPerPage(250); $list->setCurrentPageNumber($offset); $this->view->likes = $list; } else { $this->view->likes = array(); } } public function payoutAction() { $tableMember = new Default_Model_Member(); $this->view->view_member = $tableMember->fetchMemberData($this->_memberId); - //backdore for admins + $paypalValidStatusTable = new Default_Model_DbTable_PaypalValidStatus(); + $paypalValidStatus = $paypalValidStatusTable->find($this->view->view_member->paypal_valid_status)->current(); + $this->view->paypal_valid_status = $paypalValidStatus; + + //backdoor for admins $helperUserRole = new Backend_View_Helper_UserRole(); $userRoleName = $helperUserRole->userRole(); if (Default_Model_DbTable_MemberRole::ROLE_NAME_ADMIN == $userRoleName) { $this->view->member = $this->view->view_member; } else { $this->view->member = $this->_authMember; } } /** * @return Default_Form_Settings * @throws Zend_Form_Exception */ private function formPassword() { $form = new Default_Form_Settings(); $form->setMethod("POST")->setAttrib("id", "settingsPasswordForm")->setAction('/member/' . $this->_memberId . '/changepass'); $passOld = $form->createElement('password', 'passwordOld')->setLabel('Enter old Password:')->setRequired(true) ->removeDecorator('HtmlTag')->addValidator(new Local_Validate_OldPasswordConfirm())->setDecorators(array( 'ViewHelper', 'Label', 'Errors', array( 'ViewScript', array( 'viewScript' => 'settings/viewscripts/flatui_input.phtml', 'placement' => false ) ) )) ; $pass1 = $form->createElement('password', 'password1')->setLabel('Enter new Password:')->setRequired(true) ->addValidator(new Zend_Validate_NotEmpty(Zend_Validate_NotEmpty::STRING))->removeDecorator('HtmlTag') ->setDecorators(array( 'ViewHelper', 'Label', 'Errors', array( 'ViewScript', array( 'viewScript' => 'settings/viewscripts/flatui_input.phtml', 'placement' => false ) ) )) ; $pass2 = $form->createElement('password', 'password2')->setLabel('Re-enter new Password:')->setRequired(true) ->addValidator(new Zend_Validate_NotEmpty(Zend_Validate_NotEmpty::STRING))->removeDecorator('HtmlTag') ->setDecorators(array( 'ViewHelper', 'Label', 'Errors', array( 'ViewScript', array( 'viewScript' => 'settings/viewscripts/flatui_input.phtml', 'placement' => false ) ) )) ; $passValid = new Local_Validate_PasswordConfirm($pass2->getValue()); $pass1->addValidator($passValid); $form->addElement($passOld)->addElement($pass1)->addElement($pass2); return $form; } private function fetchMemberId() { if (false === Zend_Auth::getInstance()->hasIdentity()) { return null; } $auth = Zend_Auth::getInstance()->getIdentity(); if ($this->_userName == $auth->username) { return $auth->member_id; } if (Default_Model_DbTable_Member::ROLE_ID_ADMIN == $auth->roleId) { return $this->_memberId; } } } \ No newline at end of file diff --git a/application/modules/default/views/scripts/partials/header/template_react.phtml b/application/modules/default/views/scripts/partials/header/template_react.phtml index f2d76cdfd..2792774ac 100755 --- a/application/modules/default/views/scripts/partials/header/template_react.phtml +++ b/application/modules/default/views/scripts/partials/header/template_react.phtml @@ -1,247 +1,247 @@ . **/ $helperBuildBaseUrl = new Default_View_Helper_BuildBaseUrl(); //$baseurl = Zend_Registry::get('config')->settings->client->default->baseurl; $baseurl = $helperBuildBaseUrl->buildBaserUrl(); $sname = Zend_Registry::get('store_host'); $store_config = Zend_Registry::get('store_config'); $getAuthUser = new Default_View_Helper_GetAuthUser(); $helperBuildMemberUrl = new Default_View_Helper_BuildMemberUrl(); $helperImage = new Default_View_Helper_Image(); $auth = Zend_Auth::getInstance(); $member = $getAuthUser->getAuthUser(); $serverUrl = $this->serverUrl(); $store_order = $store_config->order; $store_name = $store_config->name; $is_show_title = $store_config->is_show_title; $last_char_store_order = substr($store_order, -1); $helperFetchCategory = new Default_View_Helper_CatTitle(); $cat_title = $helperFetchCategory->catTitle($this->cat_id); $cat_title_length = strlen($cat_title); //check logo-width: $logoWidth = (int)$this->template['header-logo']['width']; $cat_title_left = $logoWidth+60; $tabs_left = (int)$this->template['header-nav-tabs']['absolute-left']; $tabs_left += $cat_title_length*10; $filter = new Local_Filter_Url_Encrypt(); //$thisurl = $helperBuildBaseUrl->buildBaserUrl(); $thisurl = "/"; if(isset($_GET['url'])) { $thisurl = $_GET['url']; } $url_logout = "/logout?redirect=".$filter->filter($thisurl); ?> render('partials/header/metaheader_react.phtml'); ?>
hasIdentity() && empty($member->username)) { $helperEncryptUrl = new Default_View_Helper_EncryptUrl(); $redirectString = '/redirect/' . $helperEncryptUrl->EncryptUrl(Zend_Controller_Front::getInstance()->getRequest()->getScheme() . '://' . Zend_Controller_Front::getInstance()->getRequest()->getHttpHost().$_SERVER["REQUEST_URI"]); ?>
cat_id) ? $this->cat_id : 'all' ?>/order/latest"> */?>
inlineScript()->appendScript( ' $(document).ready(function(){ MenuHover.setup(); Popuppanel.setup(); LoginContainer.update(); PlingsRedirect.setup(); }); '); diff --git a/application/modules/default/views/scripts/user/partials/userHeader.phtml b/application/modules/default/views/scripts/user/partials/userHeader.phtml index d026d09ea..bafbba9ac 100644 --- a/application/modules/default/views/scripts/user/partials/userHeader.phtml +++ b/application/modules/default/views/scripts/user/partials/userHeader.phtml @@ -1,111 +1,111 @@ . **/ $helperMember = new Default_View_Helper_BuildMemberUrl(); $helperBase = new Default_View_Helper_BuildBaseUrl(); ?>
\ No newline at end of file diff --git a/application/modules/default/views/scripts/user/payout.phtml b/application/modules/default/views/scripts/user/payout.phtml new file mode 100644 index 000000000..42bdd8d27 --- /dev/null +++ b/application/modules/default/views/scripts/user/payout.phtml @@ -0,0 +1,279 @@ +. + **/ + +$this->tab = 'payout'; +$this->countDownloadsOverall = 0; + +$currentDate = date("Ym",time()); +$currentYear = date("Y",time()); + +$modelDownload = new Default_Model_StatDownload(); +$downloadYears = $modelDownload->getUserDownloadYears($this->member->member_id); +#$this->countDownloadsOverall = count($this->downloads); +?> + + +
+ render('user/partials/userHeader_top.phtml'); ?> +
+
+ +
+ + render('user/partials/userHeader.phtml'); ?> + +
+

translate('Payout') ?>

+ view_member; + if($member->pling_excluded == 1) { + echo "


This account has been excluded from receiving plings, due to various misuses.

"; + } + ?> +
+ + +
+ +
+
+ view_member; + if($member->paypal_valid_status > 100) { + $status = $this->paypal_valid_status; + if($status->color == 'red') { + echo ''; + } + if($status->color == 'yellow') { + echo ''; + } + if($status->color == 'blue') { + echo ''; + } + if($status->color == 'green') { + echo ''; + } + } + ?> +
+ + pling_excluded == 0 || (Zend_Auth::getInstance()->hasIdentity() AND Zend_Auth::getInstance()->getIdentity()->roleName == 'admin')) { + echo ""; + ?> +
+
+ +
+
+ +
+ +
+
+
+ + \ No newline at end of file diff --git a/httpdocs/theme/react/app-header/app.js b/httpdocs/theme/react/app-header/app.js index f2c71e032..2fef4bf77 100644 --- a/httpdocs/theme/react/app-header/app.js +++ b/httpdocs/theme/react/app-header/app.js @@ -1,407 +1,407 @@ class SiteHeader extends React.Component { constructor(props){ super(props); this.state = { baseUrl:window.json_baseurl, searchBaseUrl:window.json_searchbaseurl, cat_title:window.json_cat_title, hasIdentity:window.json_hasIdentity, is_show_title:window.json_is_show_title, redirectString:window.json_redirectString, serverUrl:window.json_serverUrl, serverUri:window.json_serverUri, store:{ sName:window.json_sname, name:window.json_store_name, order:window.json_store_order, last_char_store_order:window.last_char_store_order, }, user:window.json_member, logo:window.json_logoWidth, cat_title_left:window.json_cat_title_left, tabs_left:window.tabs_left, template:window.json_template, status:"", url_logout:window.json_logouturl }; this.updateDimensions = this.updateDimensions.bind(this); } componentWillMount() { this.updateDimensions(); } componentDidMount() { window.addEventListener("resize", this.updateDimensions); window.addEventListener("orientationchange",this.updateDimensions); } updateDimensions(){ const width = window.innerWidth; let device; if (width >= 910){ device = "large"; } else if (width < 910 && width >= 610){ device = "mid"; } else if (width < 610){ device = "tablet"; } this.setState({device:device}); } render(){ let userMenuDisplay, loginMenuDisplay, siteHeaderTopRightCssClass; if (this.state.user){ userMenuDisplay = ( ); siteHeaderTopRightCssClass = "w-user"; } else { loginMenuDisplay = ( ); } let logoLink = this.state.serverUrl; if (this.state.serverUri.indexOf('/s/') > -1){ logoLink += "/s/" + this.state.store.name; } let siteHeaderStoreNameDisplay; if (this.state.is_show_title === "1"){ siteHeaderStoreNameDisplay = ( ); } let HeaderDisplay; if (this.state.device !== "tablet"){ HeaderDisplay = ( ); } else { HeaderDisplay = ( ) } let templateHeaderStyle; if (this.state.template){ templateHeaderStyle = { "backgroundImage":this.state.template.header['background-image'], "backgroundColor":this.state.template.header['background-color'], "height":this.state.template.header['height'] } } return ( ) } } class SiteHeaderSearchForm extends React.Component { constructor(props){ super(props); this.state = { searchText:'' }; this.onSearchTextChange = this.onSearchTextChange.bind(this); this.onSearchFormSubmit = this.onSearchFormSubmit.bind(this); } onSearchTextChange(e){ this.setState({searchText:e.target.value}); } onSearchFormSubmit(e){ e.preventDefault(); window.location.href = this.props.searchBaseUrl + this.state.searchText; } render(){ return (
) } } class SiteHeaderLoginMenu extends React.Component { constructor(props){ super(props); this.state = {}; } render(){ let registerButtonCssClass, loginButtonCssClass; if (window.location.href.indexOf('/register') > -1){ registerButtonCssClass = "active"; } if (window.location.href.indexOf('/login') > -1){ loginButtonCssClass = "active"; } const menuItemCssClass = { "borderColor":this.props.template['header-nav-tabs']['border-color'], "backgroundColor":this.props.template['header-nav-tabs']['background-color'] } //
  • Register
  • return ( ) } } class SiteHeaderUserMenu extends React.Component { constructor(props){ super(props); this.state = {}; this.handleClick = this.handleClick.bind(this); } componentWillMount() { document.addEventListener('mousedown',this.handleClick, false); } componentWillUnmount() { document.removeEventListener('mousedown',this.handleClick, false); } handleClick(e){ let dropdownClass = ""; if (this.node.contains(e.target)){ if (this.state.dropdownClass === "open"){ if (e.target.className === "profile-menu-toggle" || e.target.className === "profile-menu-image" ||  e.target.className === "profile-menu-username"){ dropdownClass = ""; } else { dropdownClass = "open"; } } else { dropdownClass = "open"; } } this.setState({dropdownClass:dropdownClass}); } render(){ return ( ) } } class MobileSiteHeader extends React.Component { constructor(props){ super(props); this.state = { status:"switch" }; this.showMobileUserMenu = this.showMobileUserMenu.bind(this); this.showMobileSearchForm = this.showMobileSearchForm.bind(this); this.showMobileSwitchMenu = this.showMobileSwitchMenu.bind(this); } showMobileUserMenu(){ this.setState({status:"user"}); } showMobileSearchForm(){ this.setState({status:"search"}); } showMobileSwitchMenu(){ this.setState({status:"switch"}); } render(){ const menuItemCssClass = { "borderColor":this.props.template['header-nav-tabs']['border-color'], "backgroundColor":this.props.template['header-nav-tabs']['background-color'] } const closeMenuElementDisplay = ( ); let mobileMenuDisplay; if (this.state.status === "switch"){ mobileMenuDisplay = ( ); } else if (this.state.status === "user"){ mobileMenuDisplay = (
    {closeMenuElementDisplay}
    ) } else if (this.state.status === "search"){ mobileMenuDisplay = (
    {closeMenuElementDisplay}
    ) } let logoElementCssClass = this.props.store.name; if (this.state.status !== "switch"){ logoElementCssClass += " mini-version"; } return(
    {mobileMenuDisplay}
    ); } } class MobileUserContainer extends React.Component { constructor(props){ super(props); this.state = {}; } render(){ let userDisplay; if (this.props.user){ userDisplay = ( ); } else { userDisplay = ( ); } return (
    {userDisplay}
    ) } } ReactDOM.render( , document.getElementById('site-header-container') ); diff --git a/httpdocs/theme/react/header.js b/httpdocs/theme/react/header.js index 685550898..fcf8a9751 100644 --- a/httpdocs/theme/react/header.js +++ b/httpdocs/theme/react/header.js @@ -1,567 +1,567 @@ "use strict"; window.appHelpers = function () { function getEnv(domain) { var env; var lastDotSplit = this.splitByLastDot(domain); if (lastDotSplit.indexOf('/') > -1) { lastDotSplit = lastDotSplit.split('/')[0]; } if (lastDotSplit === 'com' || lastDotSplit === 'org') { env = 'live'; } else { env = 'test'; } return env; } function splitByLastDot(text) { var index = text.lastIndexOf('.'); return text.slice(index + 1); } return { getEnv: getEnv, splitByLastDot: splitByLastDot }; }(); "use strict"; function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } var SiteHeader = /*#__PURE__*/ function (_React$Component) { _inherits(SiteHeader, _React$Component); function SiteHeader(props) { var _this; _classCallCheck(this, SiteHeader); _this = _possibleConstructorReturn(this, _getPrototypeOf(SiteHeader).call(this, props)); _this.state = { baseUrl: window.json_baseurl, searchBaseUrl: window.json_searchbaseurl, cat_title: window.json_cat_title, hasIdentity: window.json_hasIdentity, is_show_title: window.json_is_show_title, redirectString: window.json_redirectString, serverUrl: window.json_serverUrl, serverUri: window.json_serverUri, store: { sName: window.json_sname, name: window.json_store_name, order: window.json_store_order, last_char_store_order: window.last_char_store_order }, user: window.json_member, logo: window.json_logoWidth, cat_title_left: window.json_cat_title_left, tabs_left: window.tabs_left, template: window.json_template, status: "", url_logout: window.json_logouturl }; _this.updateDimensions = _this.updateDimensions.bind(_assertThisInitialized(_this)); return _this; } _createClass(SiteHeader, [{ key: "componentWillMount", value: function componentWillMount() { this.updateDimensions(); } }, { key: "componentDidMount", value: function componentDidMount() { window.addEventListener("resize", this.updateDimensions); window.addEventListener("orientationchange", this.updateDimensions); } }, { key: "updateDimensions", value: function updateDimensions() { var width = window.innerWidth; var device; if (width >= 910) { device = "large"; } else if (width < 910 && width >= 610) { device = "mid"; } else if (width < 610) { device = "tablet"; } this.setState({ device: device }); } }, { key: "render", value: function render() { var userMenuDisplay, loginMenuDisplay, siteHeaderTopRightCssClass; if (this.state.user) { userMenuDisplay = React.createElement(SiteHeaderUserMenu, { serverUrl: this.state.serverUrl, baseUrl: this.state.baseUrl, user: this.state.user }); siteHeaderTopRightCssClass = "w-user"; } else { loginMenuDisplay = React.createElement(SiteHeaderLoginMenu, { baseUrl: this.state.baseUrl, redirectString: this.state.redirectString, template: this.state.template }); } var logoLink = this.state.serverUrl; if (this.state.serverUri.indexOf('/s/') > -1) { logoLink += "/s/" + this.state.store.name; } var siteHeaderStoreNameDisplay; if (this.state.is_show_title === "1") { siteHeaderStoreNameDisplay = React.createElement("div", { id: "site-header-store-name-container" }, React.createElement("a", { href: logoLink }, this.state.store.name)); } var HeaderDisplay; if (this.state.device !== "tablet") { HeaderDisplay = React.createElement("section", { id: "site-header-wrapper", style: { "paddingLeft": this.state.template['header-logo']['width'] } }, React.createElement("div", { id: "siter-header-left" }, React.createElement("div", { id: "site-header-logo-container", style: this.state.template['header-logo'] }, React.createElement("a", { href: logoLink }, React.createElement("img", { src: this.state.template['header-logo']['image-src'] }))), siteHeaderStoreNameDisplay), React.createElement("div", { id: "site-header-right" }, React.createElement("div", { id: "site-header-right-top", className: siteHeaderTopRightCssClass }, React.createElement(SiteHeaderSearchForm, { baseUrl: this.state.baseUrl, searchBaseUrl: this.state.searchBaseUrl }), userMenuDisplay), React.createElement("div", { id: "site-header-right-bottom" }, loginMenuDisplay))); } else { HeaderDisplay = React.createElement(MobileSiteHeader, { logoLink: logoLink, template: this.state.template, user: this.state.user, baseUrl: this.state.baseUrl, searchBaseUrl: this.state.searchBaseUrl, serverUrl: this.state.serverUrl, store: this.state.store, redirectString: this.state.redirectString }); } var templateHeaderStyle; if (this.state.template) { templateHeaderStyle = { "backgroundImage": this.state.template.header['background-image'], "backgroundColor": this.state.template.header['background-color'], "height": this.state.template.header['height'] }; } return React.createElement("section", { id: "site-header", style: templateHeaderStyle }, HeaderDisplay); } }]); return SiteHeader; }(React.Component); var SiteHeaderSearchForm = /*#__PURE__*/ function (_React$Component2) { _inherits(SiteHeaderSearchForm, _React$Component2); function SiteHeaderSearchForm(props) { var _this2; _classCallCheck(this, SiteHeaderSearchForm); _this2 = _possibleConstructorReturn(this, _getPrototypeOf(SiteHeaderSearchForm).call(this, props)); _this2.state = { searchText: '' }; _this2.onSearchTextChange = _this2.onSearchTextChange.bind(_assertThisInitialized(_this2)); _this2.onSearchFormSubmit = _this2.onSearchFormSubmit.bind(_assertThisInitialized(_this2)); return _this2; } _createClass(SiteHeaderSearchForm, [{ key: "onSearchTextChange", value: function onSearchTextChange(e) { this.setState({ searchText: e.target.value }); } }, { key: "onSearchFormSubmit", value: function onSearchFormSubmit(e) { e.preventDefault(); window.location.href = this.props.searchBaseUrl + this.state.searchText; } }, { key: "render", value: function render() { return React.createElement("div", { id: "site-header-search-form" }, React.createElement("form", { id: "search-form", onSubmit: this.onSearchFormSubmit }, React.createElement("input", { onChange: this.onSearchTextChange, value: this.state.searchText, type: "text", name: "projectSearchText" }), React.createElement("a", { onClick: this.onSearchFormSubmit }))); } }]); return SiteHeaderSearchForm; }(React.Component); var SiteHeaderLoginMenu = /*#__PURE__*/ function (_React$Component3) { _inherits(SiteHeaderLoginMenu, _React$Component3); function SiteHeaderLoginMenu(props) { var _this3; _classCallCheck(this, SiteHeaderLoginMenu); _this3 = _possibleConstructorReturn(this, _getPrototypeOf(SiteHeaderLoginMenu).call(this, props)); _this3.state = {}; return _this3; } _createClass(SiteHeaderLoginMenu, [{ key: "render", value: function render() { var registerButtonCssClass, loginButtonCssClass; if (window.location.href.indexOf('/register') > -1) { registerButtonCssClass = "active"; } if (window.location.href.indexOf('/login') > -1) { loginButtonCssClass = "active"; } var menuItemCssClass = { "borderColor": this.props.template['header-nav-tabs']['border-color'], "backgroundColor": this.props.template['header-nav-tabs']['background-color'] //
  • Register
  • }; return React.createElement("div", { id: "site-header-login-menu" }, React.createElement("ul", null, React.createElement("li", { style: menuItemCssClass, className: loginButtonCssClass }, React.createElement("a", { href: this.props.baseUrl + "/login" + this.props.redirectString }, "Sign in")))); } }]); return SiteHeaderLoginMenu; }(React.Component); var SiteHeaderUserMenu = /*#__PURE__*/ function (_React$Component4) { _inherits(SiteHeaderUserMenu, _React$Component4); function SiteHeaderUserMenu(props) { var _this4; _classCallCheck(this, SiteHeaderUserMenu); _this4 = _possibleConstructorReturn(this, _getPrototypeOf(SiteHeaderUserMenu).call(this, props)); _this4.state = {}; _this4.handleClick = _this4.handleClick.bind(_assertThisInitialized(_this4)); return _this4; } _createClass(SiteHeaderUserMenu, [{ key: "componentWillMount", value: function componentWillMount() { document.addEventListener('mousedown', this.handleClick, false); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { document.removeEventListener('mousedown', this.handleClick, false); } }, { key: "handleClick", value: function handleClick(e) { var dropdownClass = ""; if (this.node.contains(e.target)) { if (this.state.dropdownClass === "open") { if (e.target.className === "profile-menu-toggle" || e.target.className === "profile-menu-image" || e.target.className === "profile-menu-username") { dropdownClass = ""; } else { dropdownClass = "open"; } } else { dropdownClass = "open"; } } this.setState({ dropdownClass: dropdownClass }); } }, { key: "render", value: function render() { var _this5 = this; return React.createElement("ul", { id: "site-header-user-menu-container" }, React.createElement("li", { ref: function ref(node) { return _this5.node = node; }, id: "user-menu-toggle", className: this.state.dropdownClass }, React.createElement("a", { className: "profile-menu-toggle" }, React.createElement("img", { className: "profile-menu-image", src: window.json_member_avatar }), React.createElement("span", { className: "profile-menu-username" }, this.props.user.username)), React.createElement("ul", { id: "user-profile-menu" }, React.createElement("div", { className: "dropdown-header" }), React.createElement("li", null, React.createElement("a", { href: window.json_baseurl + "product/add" }, "Add Product")), React.createElement("li", null, React.createElement("a", { href: window.json_baseurl + "u/" + this.props.user.username + "/products" }, "Products")), React.createElement("li", null, React.createElement("a", { - href: window.json_baseurl + "u/" + this.props.user.username + "/plings" - }, "Plings")), React.createElement("li", null, React.createElement("a", { + href: window.json_baseurl + "u/" + this.props.user.username + "/payout" + }, "Payout")), React.createElement("li", null, React.createElement("a", { href: window.json_baseurl + "settings" }, "Settings")), React.createElement("li", null, React.createElement("a", { href: window.json_logouturl }, "Logout"))))); } }]); return SiteHeaderUserMenu; }(React.Component); var MobileSiteHeader = /*#__PURE__*/ function (_React$Component5) { _inherits(MobileSiteHeader, _React$Component5); function MobileSiteHeader(props) { var _this6; _classCallCheck(this, MobileSiteHeader); _this6 = _possibleConstructorReturn(this, _getPrototypeOf(MobileSiteHeader).call(this, props)); _this6.state = { status: "switch" }; _this6.showMobileUserMenu = _this6.showMobileUserMenu.bind(_assertThisInitialized(_this6)); _this6.showMobileSearchForm = _this6.showMobileSearchForm.bind(_assertThisInitialized(_this6)); _this6.showMobileSwitchMenu = _this6.showMobileSwitchMenu.bind(_assertThisInitialized(_this6)); return _this6; } _createClass(MobileSiteHeader, [{ key: "showMobileUserMenu", value: function showMobileUserMenu() { this.setState({ status: "user" }); } }, { key: "showMobileSearchForm", value: function showMobileSearchForm() { this.setState({ status: "search" }); } }, { key: "showMobileSwitchMenu", value: function showMobileSwitchMenu() { this.setState({ status: "switch" }); } }, { key: "render", value: function render() { var menuItemCssClass = { "borderColor": this.props.template['header-nav-tabs']['border-color'], "backgroundColor": this.props.template['header-nav-tabs']['background-color'] }; var closeMenuElementDisplay = React.createElement("a", { className: "menu-item", onClick: this.showMobileSwitchMenu }, React.createElement("span", { className: "glyphicon glyphicon-remove" })); var mobileMenuDisplay; if (this.state.status === "switch") { mobileMenuDisplay = React.createElement("div", { id: "switch-menu" }, React.createElement("a", { className: "menu-item", onClick: this.showMobileSearchForm, id: "user-menu-switch" }, React.createElement("span", { className: "glyphicon glyphicon-search" })), React.createElement("a", { className: "menu-item", onClick: this.showMobileUserMenu, id: "search-menu-switch" }, React.createElement("span", { className: "glyphicon glyphicon-option-horizontal" }))); } else if (this.state.status === "user") { mobileMenuDisplay = React.createElement("div", { id: "mobile-user-menu" }, React.createElement("div", { className: "menu-content-wrapper" }, React.createElement(MobileUserContainer, { user: this.props.user, baseUrl: this.props.baseUrl, serverUrl: this.state.serverUrl, template: this.props.template, redirectString: this.props.redirectString })), closeMenuElementDisplay); } else if (this.state.status === "search") { mobileMenuDisplay = React.createElement("div", { id: "mobile-search-menu" }, React.createElement("div", { className: "menu-content-wrapper" }, React.createElement(SiteHeaderSearchForm, { baseUrl: this.props.baseUrl, searchBaseUrl: this.props.searchBaseUrl })), closeMenuElementDisplay); } var logoElementCssClass = this.props.store.name; if (this.state.status !== "switch") { logoElementCssClass += " mini-version"; } return React.createElement("section", { id: "mobile-site-header" }, React.createElement("div", { id: "mobile-site-header-logo", className: logoElementCssClass }, React.createElement("a", { href: this.props.logoLink }, React.createElement("img", { src: this.props.template['header-logo']['image-src'] }))), React.createElement("div", { id: "mobile-site-header-menus-container" }, mobileMenuDisplay)); } }]); return MobileSiteHeader; }(React.Component); var MobileUserContainer = /*#__PURE__*/ function (_React$Component6) { _inherits(MobileUserContainer, _React$Component6); function MobileUserContainer(props) { var _this7; _classCallCheck(this, MobileUserContainer); _this7 = _possibleConstructorReturn(this, _getPrototypeOf(MobileUserContainer).call(this, props)); _this7.state = {}; return _this7; } _createClass(MobileUserContainer, [{ key: "render", value: function render() { var userDisplay; if (this.props.user) { userDisplay = React.createElement(SiteHeaderUserMenu, { serverUrl: this.state.serverUrl, baseUrl: this.state.baseUrl, user: this.props.user }); } else { userDisplay = React.createElement(SiteHeaderLoginMenu, { user: this.props.user, baseUrl: this.props.baseUrl, template: this.props.template, redirectString: this.props.redirectString }); } return React.createElement("div", { id: "mobile-user-container" }, userDisplay); } }]); return MobileUserContainer; }(React.Component); ReactDOM.render(React.createElement(SiteHeader, null), document.getElementById('site-header-container')); diff --git a/httpdocs/theme/react/src/metaheader.js b/httpdocs/theme/react/src/metaheader.js index e469d7249..92af53ad6 100644 --- a/httpdocs/theme/react/src/metaheader.js +++ b/httpdocs/theme/react/src/metaheader.js @@ -1,1773 +1,1773 @@ //import '@babel/polyfill'; import "core-js/shim"; import "regenerator-runtime/runtime"; import '@webcomponents/custom-elements' import React from 'react'; import ReactDOM from 'react-dom'; // Use this object for config data instead of window.domains, // window.baseUrl, window.etc... so don't set variables in global scope. // Please see initConfig() let config = {}; async function initConfig(target,url_afterlogin) { // API https://www.opendesktop.org/home/metamenujs should send // JSON data with CORS. // Please see config-dummy.php. // Also this API call sends cookie of www.opendesktop.org/cc // by fetch() with option "credentials: 'include'", so // www.opendesktop.org/cc possible detect user session. // Can we consider if include user information into JSON data of // API response instead of cookie set each external site? let url = `https://www.opendesktop.org/home/metamenubundlejs?target=${target}`; if (location.hostname.endsWith('cc')) { url = `https://www.opendesktop.cc/home/metamenubundlejs?target=${target}`; } else if (location.hostname.endsWith('localhost')) { url = `http://localhost:${location.port}/config-dummy.php`; } else if (location.hostname.endsWith('pling.local')) { url = `http://pling.local/home/metamenubundlejs?target=${target}`; } if(url_afterlogin) { url = url+`&url=${url_afterlogin}`; } try { const response = await fetch(url, { mode: 'cors', credentials: 'include' }); if (!response.ok) { throw new Error('Network response error'); } config = await response.json(); return true; } catch (error) { console.error(error); return false; } } window.appHelpers = function () { function generateMenuGroupsArray(domains) { let menuGroups = []; domains.forEach(function (domain, index) { if (menuGroups.indexOf(domain.menugroup) === -1) { menuGroups.push(domain.menugroup); } }); return menuGroups; } function getDeviceFromWidth(width) { let device; if (width >= 910) { device = "large"; } else if (width < 910 && width >= 610) { device = "mid"; } else if (width < 610) { device = "tablet"; } return device; } function generatePopupLinks() { let pLink = {}; pLink.plingListUrl = "/#plingList", pLink.ocsapiContentUrl = "/#ocsapiContent", pLink.aboutContentUrl = "/#aboutContent", pLink.linkTarget = "_blank"; if (window.location.hostname.indexOf('opendesktop') === -1 || window.location.hostname === "git.opendesktop.org" || window.location.hostname === "git.opendesktop.cc" || window.location.hostname === "forum.opendesktop.org" || window.location.hostname === "forum.opendesktop.cc" || window.location.hostname === "my.opendesktop.org" || window.location.hostname === "my.opendesktop.cc") { pLink.plingListUrl = "/plings"; pLink.ocsapiContentUrl = "/partials/ocsapicontent.phtml"; pLink.aboutContentUrl = "/partials/about.phtml"; pLink.linkTarget = ""; } return pLink; } function getPopupUrl(key, isExternal, baseUrl) { let url = baseUrl; return url; } return { generateMenuGroupsArray, getDeviceFromWidth, generatePopupLinks, getPopupUrl }; }(); class MetaHeader extends React.Component { constructor(props){ super(props); this.state = { domains:config.domains, baseUrl:config.baseUrl, blogUrl:config.blogUrl, forumUrl:config.forumUrl, loginUrl:config.loginUrl, logoutUrl:config.logoutUrl, gitlabUrl:config.gitlabUrl, sName:config.sName, isExternal:config.isExternal, user:config.user, showModal:false, modalUrl:'', metamenuTheme:config.metamenuTheme, isAdmin:config.json_isAdmin }; this.initMetaHeader = this.initMetaHeader.bind(this); this.updateDimensions = this.updateDimensions.bind(this); this.onSwitchStyle = this.onSwitchStyle.bind(this); //this.getUser = this.getUser.bind(this); } componentWillMount() { this.updateDimensions(); } componentDidMount() { this.initMetaHeader(); //this.initMetamenuTheme(); } componentWillUnmount(){ window.removeEventListener("resize", this.updateDimensions); window.removeEventListener("orientationchange",this.updateDimensions); } initMetaHeader(){ window.addEventListener("resize", this.updateDimensions); window.addEventListener("orientationchange",this.updateDimensions); //this.getUser(); } fetchMetaheaderThemeSettings(){ let url = 'https://www.opendesktop.org/membersetting/getsettings'; if (location.hostname.endsWith('cc') || location.hostname.endsWith('local')) { url = 'https://www.opendesktop.cc/membersetting/getsettings'; } fetch(url,{ mode: 'cors', credentials: 'include' }) .then(response => response.json()) .then(data => { const results = data.results; if(results.length>0) { const theme = results.filter(r => r.member_setting_item_id == 1); if(theme.length>0 && theme[0].value==1) { this.setState({metamenuTheme:'metamenu-theme-dark'}); } } }); } // change metamenu class onSwitchStyle(evt){ let url = 'https://www.opendesktop.org/membersetting/setsettings/itemid/1/itemvalue/'; if (location.hostname.endsWith('cc') || location.hostname.endsWith('local')) { url = 'https://www.opendesktop.cc/membersetting/setsettings/itemid/1/itemvalue/'; } url = url +(evt.target.checked?'1':'0'); const isChecked = evt.target.checked; fetch(url,{ mode: 'cors', credentials: 'include' }) .then(response => response.json()) .then(data => { this.setState({metamenuTheme:`${isChecked?'metamenu-theme-dark':''}`}); }); } getUser(){ const decodedCookie = decodeURIComponent(document.cookie); let ocs_data = decodedCookie.split('ocs_data=')[1]; if (ocs_data){ if (ocs_data.indexOf(';') > -1){ ocs_data = ocs_data.split(';')[0]; } const user = JSON.parse(ocs_data); this.setState({user:user}); } } updateDimensions(){ const width = window.innerWidth; let device; if (width >= 1015){ device = "large"; } else if (width < 1015 && width >= 730){ device = "mid"; } else if (width < 730){ device = "tablet"; } this.setState({device:device}); } render(){ let domainsMenuDisplay; if (this.state.device === "tablet"){ domainsMenuDisplay = ( ) } else { domainsMenuDisplay = ( ) } const metamenuCls = `metamenu ${this.state.metamenuTheme}`; let paraChecked = false; if(this.state.metamenuTheme){ paraChecked=true; } return ( ) } } class DomainsMenu extends React.Component { constructor(props){ super(props); this.state = { }; } render(){ let moreMenuItemDisplay, adminsDropDownMenuDisplay, myOpendesktopMenuDisplay; if (this.props.device !== "large"){ moreMenuItemDisplay = ( ) } return ( ) } } class DomainsDropDownMenu extends React.Component { constructor(props){ super(props); this.state = {}; this.handleClick = this.handleClick.bind(this); } componentDidMount() { let menuGroups = []; this.props.domains.forEach(function(domain,index){ if (menuGroups.indexOf(domain.menugroup) === -1){ menuGroups.push(domain.menugroup); } }); this.setState({menuGroups:menuGroups}); } componentWillMount() { document.addEventListener('mousedown',this.handleClick, false); } componentWillUnmount() { document.removeEventListener('mousedown',this.handleClick, false); } handleClick(e){ let dropdownClass = ""; if (this.node.contains(e.target)){ if (this.state.dropdownClass === "open"){ if (e.target.className === "domains-menu-link-item"){ dropdownClass = ""; } else { dropdownClass = "open"; } } else { dropdownClass = "open"; } } this.setState({dropdownClass:dropdownClass}); } render(){ let menuGroupsDisplayLeft, menuGroupsDisplayRight; if (this.state.menuGroups){ menuGroupsDisplayLeft = this.state.menuGroups.slice(0,2).map((mg,i) => ( )); menuGroupsDisplayRight = this.state.menuGroups.slice(2).map((mg,i) => ( )); } return (
  • this.node = node} id="domains-dropdown-menu" className={this.state.dropdownClass}> Store Listings
      • {menuGroupsDisplayLeft}
      • {menuGroupsDisplayRight}
  • ); } } class DiscussionBoardsDropDownMenu extends React.Component { constructor(props){ super(props); this.state = {}; this.handleClick = this.handleClick.bind(this); } componentWillMount() { document.addEventListener('mousedown',this.handleClick, false); } componentWillUnmount() { document.removeEventListener('mousedown',this.handleClick, false); } handleClick(e){ let dropdownClass = ""; if (this.node.contains(e.target)){ if (this.state.dropdownClass === "open"){ if (e.target.className === "discussion-menu-link-item"){ dropdownClass = ""; } else { dropdownClass = "open"; } } else { dropdownClass = "open"; } } this.setState({dropdownClass:dropdownClass}); } render(){ return (
  • this.node = node} id="discussion-boards" className={this.state.dropdownClass}> Discussion Boards
  • ); } } class DevelopmentDropDownMenu extends React.Component { constructor(props){ super(props); this.state = {}; this.state = { gitlabLink:config.gitlabUrl+"/dashboard/issues?assignee_id=" }; this.handleClick = this.handleClick.bind(this); } componentWillMount() { document.addEventListener('mousedown',this.handleClick, false); } componentWillUnmount() { document.removeEventListener('mousedown',this.handleClick, false); } componentDidMount() { /*const self = this; const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { const res = JSON.parse(this.response); const gitlabLink = self.state.gitlabLink + res[0].id; self.setState({gitlabLink:gitlabLink,loading:false}); } }; xhttp.open("GET", config.gitlabUrl+"/api/v4/users?username="+this.props.user.username, true); xhttp.send();*/ } handleClick(e){ let dropdownClass = ""; if (this.node.contains(e.target)){ if (this.state.dropdownClass === "open"){ if (e.target.className === "admins-menu-link-item"){ dropdownClass = ""; } else { dropdownClass = "open"; } } else { dropdownClass = "open"; } } this.setState({dropdownClass:dropdownClass}); } render(){ let issuesMenuItem; if (this.props.isAdmin){ issuesMenuItem = (
  • Issues
  • ) } let gitfaqLinkItem; if (config.isExternal === false){ gitfaqLinkItem = (
  • Git FAQ
  • ); } else { gitfaqLinkItem = (
  • Git FAQ
  • ); } return (
  • this.node = node} id="admins-dropdown-menu" className={this.state.dropdownClass}> Development
    • Projects
    • {issuesMenuItem} {gitfaqLinkItem}
  • ) } } class MoreDropDownMenu extends React.Component { constructor(props){ super(props); this.state = {}; this.handleClick = this.handleClick.bind(this); } componentWillMount() { document.addEventListener('mousedown',this.handleClick, false); } componentWillUnmount() { document.removeEventListener('mousedown',this.handleClick, false); } handleClick(e){ let dropdownClass = ""; if (this.node.contains(e.target)){ if (this.state.dropdownClass === "open"){ if (e.target.className === "more-menu-link-item"){ dropdownClass = ""; } else { dropdownClass = "open"; } } else { dropdownClass = "open"; } } this.setState({dropdownClass:dropdownClass}); } render(){ let faqLinkItem, apiLinkItem, aboutLinkItem; if (config.isExternal === false){ faqLinkItem = (
  • FAQ
  • ); apiLinkItem = (
  • API
  • ); aboutLinkItem = (
  • About
  • ); } else { faqLinkItem = (
  • FAQ
  • ); apiLinkItem = (
  • API
  • ); aboutLinkItem = (
  • About
  • ); } return(
  • this.node = node} id="more-dropdown-menu" className={this.state.dropdownClass}> More
  • ) } } class DomainsMenuGroup extends React.Component { constructor(props){ super(props); this.state = {}; this.filterDomainsByMenuGroup = this.filterDomainsByMenuGroup.bind(this); } filterDomainsByMenuGroup(domain){ if (domain.menugroup === this.props.menuGroup){ return domain; } } render(){ const domainsDisplay = this.props.domains.filter(this.filterDomainsByMenuGroup).map((domain,index) => { let domainPrefix = ""; if (domain.menuhref.indexOf('https://') === -1 && domain.menuhref.indexOf('http://') === -1){ domainPrefix += "http://"; } return (
  • {domain.name}
  • ); }); return (
  • {this.props.menuGroup}
      {domainsDisplay}
  • ) } } function SwitchItem(props){ return(
    ) } class UserMenu extends React.Component { constructor(props){ super(props); this.state = {}; } render(){ let userDropdownDisplay, userAppsContextDisplay, developmentAppMenuDisplay; if (this.props.user && this.props.user.member_id){ userDropdownDisplay = ( ); userAppsContextDisplay = ( ); developmentAppMenuDisplay = ( ); } else { userDropdownDisplay = (
  • Login
  • ) } let userMenuContainerDisplay; if (this.props.device === "large"){ let faqLinkItem, apiLinkItem, aboutLinkItem; if (config.isExternal === false){ faqLinkItem = (
  • FAQ
  • ); apiLinkItem = (
  • API
  • ); aboutLinkItem = (
  • About
  • ); } else { faqLinkItem = (
  • FAQ
  • ); apiLinkItem = (
  • API
  • ); aboutLinkItem = (
  • About
  • ); } let switchItem; if (this.props.user && this.props.user.member_id && this.props.isAdmin){ switchItem =(
  • ); } userMenuContainerDisplay = (
    • Community
    • Support
    • Blog
    • {faqLinkItem} {apiLinkItem} {aboutLinkItem} {switchItem} {developmentAppMenuDisplay} {userAppsContextDisplay} {userDropdownDisplay}
    ); } else { userMenuContainerDisplay = (
      {developmentAppMenuDisplay} {userAppsContextDisplay} {userDropdownDisplay}
    ); } return (
    {userMenuContainerDisplay}
    ) } } class UserContextMenuContainer extends React.Component { constructor(props){ super(props); this.state = { gitlabLink:props.gitlabUrl+"/dashboard/issues?assignee_id=" }; this.handleClick = this.handleClick.bind(this); } componentWillMount() { document.addEventListener('mousedown',this.handleClick, false); } componentWillUnmount() { document.removeEventListener('mousedown',this.handleClick, false); } componentDidMount() { const self = this; const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { const res = JSON.parse(this.response); const gitlabLink = self.state.gitlabLink + res[0].id; //const gitlabLink = self.state.gitlabLink; self.setState({gitlabLink:gitlabLink,loading:false}); } }; xhttp.open("GET", config.gitlabUrl+"/api/v4/users?username="+this.props.user.username, true); xhttp.send(); } handleClick(e){ let dropdownClass = ""; if (this.node.contains(e.target)){ if (this.state.dropdownClass === "open"){ if (e.target.className === "th-icon" || e.target.className === "btn btn-default dropdown-toggle"){ dropdownClass = ""; } else { dropdownClass = "open"; } } else { dropdownClass = "open"; } } this.setState({dropdownClass:dropdownClass}); } render(){ /* // BU CODE */ const urlEnding = config.baseUrl.split('opendesktop.')[1]; let contextMenuDisplay; if (this.props.isAdmin){ contextMenuDisplay = ( ); } else { contextMenuDisplay = ( ); } return (
  • this.node = node} id="user-context-menu-container">
    {contextMenuDisplay}
  • ) } } class DevelopmentAppMenu extends React.Component { constructor(props){ super(props); this.state = {}; this.handleClick = this.handleClick.bind(this); } componentWillMount() { document.addEventListener('mousedown',this.handleClick, false); } componentWillUnmount() { document.removeEventListener('mousedown',this.handleClick, false); } componentDidMount() { } handleClick(e){ let dropdownClass = ""; if (this.node.contains(e.target)){ if (this.state.dropdownClass === "open"){ if (e.target.className === "th-icon" || e.target.className === "btn btn-default dropdown-toggle"){ dropdownClass = ""; } else { dropdownClass = "open"; } } else { dropdownClass = "open"; } } this.setState({dropdownClass:dropdownClass}); } render(){ return (
  • this.node = node} id="development-app-menu-container">
  • ) } } class UserLoginMenuContainerVersionTwo extends React.Component { constructor(props){ super(props); this.state = {}; this.handleClick = this.handleClick.bind(this); } componentWillMount() { document.addEventListener('mousedown',this.handleClick, false); } componentWillUnmount() { document.removeEventListener('mousedown',this.handleClick, false); } handleClick(e){ let dropdownClass = ""; if (this.node.contains(e.target)){ if (this.state.dropdownClass === "open"){ if (e.target.className === "th-icon" || e.target.className === "btn btn-default dropdown-toggle"){ dropdownClass = ""; } else { dropdownClass = "open"; } } else { dropdownClass = "open"; } } this.setState({dropdownClass:dropdownClass},function(){ if (dropdownClass === "open"){ $('body').addClass('drawer-open'); } else { $('body').removeClass('drawer-open'); } }); } render(){ return (
  • this.node = node}>
  • ) } } class UserLoginMenuContainer extends React.Component { constructor(props){ super(props); this.state = {}; this.handleClick = this.handleClick.bind(this); } componentWillMount() { document.addEventListener('mousedown',this.handleClick, false); } componentWillUnmount() { document.removeEventListener('mousedown',this.handleClick, false); } handleClick(e){ let dropdownClass = ""; if (this.node.contains(e.target)){ if (this.state.dropdownClass === "open"){ if (e.target.className === "th-icon" || e.target.className === "btn btn-default dropdown-toggle"){ dropdownClass = ""; } else { dropdownClass = "open"; } } else { dropdownClass = "open"; } } this.setState({dropdownClass:dropdownClass}); } render(){ return (
  • this.node = node}>
  • ) } } class UserTabs extends React.Component { constructor(props){ super(props); this.state = { currentTab:'comments', searchPhrase:'' }; this.onTabMenuItemClick = this.onTabMenuItemClick.bind(this); this.onUserSearchInputChange = this.onUserSearchInputChange.bind(this); this.getUsersAutocompleteList = this.getUsersAutocompleteList.bind(this); this.selectUserFromAutocompleteList = this.selectUserFromAutocompleteList.bind(this); } onTabMenuItemClick(val){ this.setState({currentTab:val}); } onUserSearchInputChange(e){ const searchPhrase = e.target.value; this.setState({searchPhrase:e.target.value},function(){ let showUserList; if (searchPhrase.length > 2){ showUserList = true; } else { showUserList = false; } this.setState({showUserList:showUserList,selectedUser:''},function(){ this.getUsersAutocompleteList(searchPhrase); }); }); } getUsersAutocompleteList(searchPhrase){ const self = this; const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { const res = JSON.parse(this.response); self.setState({usersList:res,showUserList:true}); } }; xhttp.open("GET", "https://www.opendesktop.cc/home/searchmember?username="+searchPhrase, true); xhttp.send(); } selectUserFromAutocompleteList(user){ this.setState({selectedUser:user,searchPhrase:user.username,showUserList:false}); } render(){ let usersAutocompleteList; if (this.state.usersList && this.state.showUserList){ const users = this.state.usersList.map((u,index) => (
  • this.selectUserFromAutocompleteList(u)} key={index}> {u.username}
  • )); usersAutocompleteList = (
      {users}
    ); } let tabContentDisplay; if (this.state.currentTab === 'comments'){ tabContentDisplay = ( ); } else if (this.state.currentTab === 'search'){ if (this.state.selectedUser){ tabContentDisplay = ( ); } else { tabContentDisplay = (

    search user

    ); } } return( ); } } class UserCommentsTab extends React.Component { constructor(props){ super(props); this.state = { loading:true }; this.getUserOdComments = this.getUserOdComments.bind(this); this.getUserForumComments = this.getUserForumComments.bind(this); } componentDidMount() { this.setState({odComments:[],forumComments:[],loading:true},function(){ this.getUserOdComments(); }); } getUserOdComments(){ const user = this.props.user; const self = this; const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { const res = JSON.parse(this.response); self.setState({odComments:res.commentsOpendeskop,loading:false},function(){ self.getUserForumComments(); }); } }; xhttp.open("GET", "home/memberjson?member_id="+user.member_id, true); xhttp.send(); } getUserForumComments(){ const user = this.props.user; const self = this; const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { const res = JSON.parse(this.response); self.setState({forumComments:res.user_actions,loading:false}); } }; xhttp.open("GET", "https://forum.opendesktop.cc/user_actions.json?offset=0&username=" + user.username + "&filter=5", true); xhttp.send(); } render(){ let contentDisplay; if (!this.state.loading){ let odCommentsDisplay, forumCommentsDisplay; if (this.state.odComments.length > 0){ odCommentsDisplay = ( ); } if (this.state.forumComments.length > 0){ forumCommentsDisplay = ( ); } contentDisplay = (
    {odCommentsDisplay} {forumCommentsDisplay}
    ) } else { contentDisplay = (
    loading
    ); } return(
    {contentDisplay}
    ) } } class UserSearchTab extends React.Component { constructor(props){ super(props); this.state = { loading:true }; this.getUserOdComments = this.getUserOdComments.bind(this); this.getUserForumComments = this.getUserForumComments.bind(this); } componentDidMount() { this.setState({odComments:[],forumComments:[],loading:true},function(){ this.getUserOdComments(); }); } getUserOdComments(){ const user = this.props.user; const self = this; const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { const res = JSON.parse(this.response); self.setState({odComments:res.commentsOpendeskop,loading:false},function(){ self.getUserForumComments(); }); } else { console.log('what happends here'); console.log(this); } }; xhttp.open("GET", "home/memberjson?member_id="+user.member_id, true); xhttp.send(); } getUserForumComments(){ const user = this.props.user; const self = this; const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { console.log('this '); if (this.readyState == 4 && this.status == 200) { const res = JSON.parse(this.response); self.setState({forumComments:res.user_actions,loading:false}); } }; xhttp.open("GET", "https://forum.opendesktop.cc/user_actions.json?offset=0&username=" + user.username + "&filter=5", true); xhttp.send(); } render(){ let contentDisplay; if (!this.state.loading){ let odCommentsDisplay, forumCommentsDisplay; if (this.state.odComments.length > 0){ odCommentsDisplay = ( ); } if (this.state.forumComments.length > 0){ forumCommentsDisplay = ( ); } contentDisplay = (
    {odCommentsDisplay} {forumCommentsDisplay}
    ) } else { contentDisplay = (
    loading
    ); } return(
    {contentDisplay}
    ) } } class UserCommentsTabThreadsContainer extends React.Component { constructor(props){ super(props); this.state = {}; } componentDidMount() { let siteInfo; if (this.props.type === 'od'){ siteInfo = { address:'openDesktop.org', url:'https://www.opendesktop.org' } } else if (this.props.type === 'forum'){ siteInfo = { address:'forum', url:'https://forum.opendesktop.org' } } let threads = []; this.props.comments.forEach(function(c,index){ if (threads.indexOf(c.title) === -1){ const thread = { title:c.title, id:c.project_id } threads.push(thread) } }); this.setState({siteInfo:siteInfo,comments:this.props.comments,threads:threads}); } render(){ const t = this.state.siteInfo; const comments = this.state.comments; const user = this.props.user; let headerDisplay, threadsDisplay, threadCommentsDisplay; if (this.state.threads){ threadsDisplay = this.state.threads.map((tr,index) => ( )); headerDisplay = (

    Discussion on {this.state.siteInfo.address}

    {this.state.comments.length} comments

    {threadsDisplay}
    ); } return (
    {headerDisplay}
    {threadCommentsDisplay}
    ) } } class UserCommentsTabThread extends React.Component { constructor(props){ super(props); this.state = {}; this.filterCommentsByThread = this.filterCommentsByThread.bind(this); } filterCommentsByThread(comment){ if (comment.title === this.props.thread.title){ return comment; } } render(){ let commentsDisplay; if (this.props.comments){ const user = this.props.user; commentsDisplay = this.props.comments.filter(this.filterCommentsByThread).map((c,index) => ( )); } return (
    {commentsDisplay}
    ); } } class UserCommentsTabThreadCommentItem extends React.Component { constructor(props){ super(props); this.state = {}; } render(){ const c = this.props.comment; const user = this.props.user; let repliedUsernameDisplay; if (c.p_comment_member_id){ repliedUsernameDisplay = (

    {c.p_username}

    ) } let userImage = user.avatar; if (this.props.uType === 'search'){ userImage = user.profile_image_url; } return (

    {user.username}

    {repliedUsernameDisplay}

    {c.comment_created_at}

    ) } } /** MOBILE SPECIFIC **/ class MobileLeftMenu extends React.Component { constructor(props){ super(props); this.state = { overlayClass:"" }; this.toggleLeftSideOverlay = this.toggleLeftSideOverlay.bind(this); this.handleClick = this.handleClick.bind(this); } componentWillMount() { window.addEventListener('mousedown',this.handleClick, false); window.addEventListener('touchend', this.handleClick, false); } componentWillUnmount() { window.removeEventListener('mousedown',this.handleClick, false); window.addEventListener('touchend', this.handleClick, false); } toggleLeftSideOverlay(){ let overlayClass = "open"; if (this.state.overlayClass === "open") { overlayClass = ""; } this.setState({overlayClass:overlayClass}); } handleClick(e){ let overlayClass = ""; if (this.node.contains(e.target)){ if (this.state.overlayClass === "open"){ if (e.target.id === "left-side-overlay" || e.target.id === "menu-toggle-item"){ overlayClass = ""; } else { overlayClass = "open"; } } else { overlayClass = "open"; } } const self = this; setTimeout(function () { console.log('time out'); self.setState({overlayClass:overlayClass}); }, 200); } render(){ return (
    this.node = node} id="metaheader-left-mobile" className={this.state.overlayClass}>
    ); } } class MobileLeftSidePanel extends React.Component { constructor(props){ super(props); this.state = {}; } componentDidMount() { let menuGroups = []; this.props.domains.forEach(function(domain,index){ if (menuGroups.indexOf(domain.menugroup) === -1){ menuGroups.push(domain.menugroup); } }); this.setState({menuGroups:menuGroups}); } render(){ let panelMenuGroupsDisplay; if (this.state.menuGroups){ panelMenuGroupsDisplay = this.state.menuGroups.map((mg,i) => ( )); } let faqLinkItem, apiLinkItem, aboutLinkItem; if (config.isExternal === false){ faqLinkItem = (
  • FAQ
  • ); apiLinkItem = (
  • API
  • ); aboutLinkItem = (
  • About
  • ); } else { faqLinkItem = (
  • FAQ
  • ); apiLinkItem = (
  • API
  • ); aboutLinkItem = (
  • About
  • ); } return (
    ) } } customElements.define('opendesktop-metaheader', class extends HTMLElement { constructor() { super(); this.buildComponent(); } async buildComponent() { const stylesheetElement = document.createElement('link'); stylesheetElement.rel = 'stylesheet'; stylesheetElement.href = 'https://www.opendesktop.org/theme/react/assets/css/metaheader.css'; if (location.hostname.endsWith('cc')) { stylesheetElement.href = 'https://www.opendesktop.cc/theme/react/assets/css/metaheader.css'; } else if (location.hostname.endsWith('localhost')) { stylesheetElement.href = 'https://www.opendesktop.cc/theme/react/assets/css/metaheader.css'; }else if (location.hostname.endsWith('local')) { stylesheetElement.href = '/theme/react/assets/css/metaheader.css'; } else{ stylesheetElement.href = 'https://www.opendesktop.org/theme/react/assets/css/metaheader.css'; } this.appendChild(stylesheetElement); await initConfig(this.getAttribute('config-target'),window.location.href); const metaheaderElement = document.createElement('div'); metaheaderElement.id = 'metaheader'; ReactDOM.render(React.createElement(MetaHeader, null), metaheaderElement); // Component must be capsule within Shadow DOM, and don't hack // context/scope of external sites. /* this.attachShadow({mode: 'open'}); this.shadowRoot.appendChild(stylesheetElement); this.shadowRoot.appendChild(metaheaderElement); */ // However, make this as Light DOM for now, because current // implementation is not real component design yet. // Need solve event handling, scoped CSS. this.appendChild(metaheaderElement); } }); diff --git a/httpdocs/theme/react/src/metaheader/DevelopmentAppMenu.js b/httpdocs/theme/react/src/metaheader/DevelopmentAppMenu.js index 8353820f0..2500e3d87 100644 --- a/httpdocs/theme/react/src/metaheader/DevelopmentAppMenu.js +++ b/httpdocs/theme/react/src/metaheader/DevelopmentAppMenu.js @@ -1,118 +1,118 @@ import React from 'react'; class DevelopmentAppMenu extends React.Component { constructor(props){ super(props); this.state = { gitlabLink:this.props.gitlabUrl+"/dashboard/issues?assignee_id=" }; this.handleClick = this.handleClick.bind(this); } componentWillMount() { //document.addEventListener('mousedown',this.handleClick, false); document.addEventListener('click',this.handleClick, false); } componentWillUnmount() { document.removeEventListener('click',this.handleClick, false); } componentDidMount() { const self = this; const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState === 4 && this.status === 200) { const res = JSON.parse(this.response); const gitlabLink = self.state.gitlabLink + res[0].id; self.setState({gitlabLink:gitlabLink,loading:false}); } }; xhttp.open("GET", this.props.gitlabUrl+"/api/v4/users?username="+this.props.user.username, true); xhttp.send(); } handleClick(e){ let dropdownClass = ""; if (this.node.contains(e.target)){ if(e.target.className === "btn btn-default dropdown-toggle" || e.target.className === "th-icon") { // only btn click open dropdown if (this.state.dropdownClass === "open"){ dropdownClass = ""; }else{ dropdownClass = "open"; } }else{ dropdownClass = ""; } // if (this.state.dropdownClass === "open"){ // if (e.target.className === "th-icon" || e.target.className === "btn btn-default dropdown-toggle"){ // dropdownClass = ""; // } else { // dropdownClass = "open"; // } // } else { // dropdownClass = "open"; // } } this.setState({dropdownClass:dropdownClass}); } render(){ const urlEnding = this.props.baseUrl.split('opendesktop.')[1]; return (
  • this.node = node} id="development-app-menu-container">
  • ) } } export default DevelopmentAppMenu;