[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [ocs-webserver] /: update
From: siyuan dong <null () kde ! org>
Date: 2018-09-12 15:29:57
Message-ID: E1g075Z-0007xU-Ju () code ! kde ! org
[Download RAW message or body]
Git commit e4573ef990165dfbb95f2ee65ef96d7528c3ba66 by siyuan dong.
Committed on 12/09/2018 at 15:29.
Pushed by siyuandong into branch 'master'.
update
M +11 -2 application/modules/backend/views/scripts/user/index.phtml
M +8 -12 application/modules/default/controllers/ExploreController.php
M +1 -1 application/modules/default/controllers/OauthController.php
M +3 -2 application/modules/default/controllers/PasswordController.php
M +20 -48 application/modules/default/controllers/ProductController.php
M +7 -9 application/modules/default/controllers/ProductcommentController.php
M +16 -3 application/modules/default/controllers/UserController.php
M +15 -0 application/modules/default/forms/Product.php
M +13 -9 application/modules/default/forms/Register.php
M +121 -2 application/modules/default/models/DbTable/ProjectRating.php
M +23 -2 application/modules/default/models/Member.php
M +1 -1 application/modules/default/models/OAuth/Github.php
M +2 -2 application/modules/default/models/OAuth/Ocs.php
M +218 -49 application/modules/default/models/Ocs/Ident.php
M +54 -0 application/modules/default/models/Project.php
M +49 -0 application/modules/default/models/Tags.php
A +109 -0 application/modules/default/views/helpers/FetchMetaheaderMenuJson.php
A +36 -0 application/modules/default/views/helpers/IsProjectFeatured.php
A +36 -0 application/modules/default/views/helpers/IsProjectOriginal.php
M +1 -1 application/modules/default/views/layout/layout_appimagehub.phtml
M +3 -1 application/modules/default/views/layout/layout_appimagehub_home.phtml
M +35 -129 application/modules/default/views/scripts/partials/header/metaheader_react.phtml
M +24 -12 application/modules/default/views/scripts/product/add.phtml
M +19 -4 application/modules/default/views/scripts/product/index.phtml
M +2 -1 application/modules/default/views/scripts/product/partials/productMoreProductsWidgetV1.phtml
M +18 -0 application/modules/default/views/scripts/user/aboutme.phtml
M +1 -1 httpdocs/theme/flatui/css/stylesheet.css
M +1 -1 httpdocs/theme/flatui/js/script.js
M +5 -5 httpdocs/theme/flatui/less/stylesheet.less
M +84 -27 httpdocs/theme/react/all.js
A +17 -0 httpdocs/theme/react/app-metaheader/_app-helpers.js
A +281 -0 httpdocs/theme/react/app-metaheader/app.js
M +22 -1 httpdocs/theme/react/app/__product-helpers.js
M +7 -3 httpdocs/theme/react/app/_explore.js
M +54 -23 httpdocs/theme/react/app/_product-page.js
M +1 -1 httpdocs/theme/react/assets/css/style.css
M +1 -1 httpdocs/theme/react/assets/css/style.css.map
A +- -- httpdocs/theme/react/assets/img/logo-discourse.png
A +- -- httpdocs/theme/react/assets/img/logo-gitlab.png
A +- -- httpdocs/theme/react/assets/img/logo-opencode.png
A +- -- httpdocs/theme/react/assets/img/logo-opendesktop.png
M +594 -28 httpdocs/theme/react/assets/less/style.less
A +508 -0 httpdocs/theme/react/metaheader.js
https://commits.kde.org/ocs-webserver/e4573ef990165dfbb95f2ee65ef96d7528c3ba66
diff --git a/application/modules/backend/views/scripts/user/index.phtml \
b/application/modules/backend/views/scripts/user/index.phtml index e79bc599..8192847f 100644
--- a/application/modules/backend/views/scripts/user/index.phtml
+++ b/application/modules/backend/views/scripts/user/index.phtml
@@ -341,8 +341,17 @@
data: {'c': elementRecord},
url: '/backend/user/export/',
type: 'post',
- error: function () {
- alert("<span class='error'>Service is temporarily unavailable. Our engineers are \
working quickly to resolve this issue. <br/>Find out why you may have encountered this error.</span>"); + \
error: function (jqXHR, textStatus, errorThrown) { + console.log(jqXHR);
+ console.log("-------");
+ console.log(textStatus);
+ console.log("-------");
+ console.log(errorThrown);
+ if (jqXHR.responseText) {
+ $('#dialog-form').empty().html(jqXHR.responseText).dialog('open');
+ } else {
+ alert("<span class='error'>Service is temporarily unavailable. Our engineers are \
working quickly to resolve this issue. <br/>Find out why you may have encountered this error.</span>"); + \
} return false;
},
success: function (results) {
diff --git a/application/modules/default/controllers/ExploreController.php \
b/application/modules/default/controllers/ExploreController.php index 1f55e678..0935ecfc 100644
--- a/application/modules/default/controllers/ExploreController.php
+++ b/application/modules/default/controllers/ExploreController.php
@@ -138,17 +138,11 @@ class ExploreController extends Local_Controller_Action_DomainSwitch
$filter['order'] = preg_replace('/[^-a-zA-Z0-9_]/', '', $this->getParam('ord', \
self::DEFAULT_ORDER));
$page = (int)$this->getParam('page', 1);
- if ($this->hasParam('new') && $this->getParam("new") == 1) {
- $pageLimit = 1000;
- }else{
- $pageLimit = 10;
- }
-
- $requestedElements = $this->fetchRequestedElements($filter, $pageLimit, ($page - 1) * \
$pageLimit);
-
- $storeConfig = Zend_Registry::isRegistered('store_config') ? Zend_Registry::get('store_config') \
: null;
- if($storeConfig->layout_explore && $storeConfig->isRenderReact()){
+ $storeConfig = Zend_Registry::isRegistered('store_config') ? Zend_Registry::get('store_config') \
: null; + if($storeConfig->layout_explore && $storeConfig->isRenderReact()){
+ $pageLimit = 50;
+ $requestedElements = $this->fetchRequestedElements($filter, $pageLimit, ($page - 1) * \
$pageLimit);
$this->view->productsJson =Zend_Json::encode($requestedElements['elements']);
$this->view->filtersJson = Zend_Json::encode($filter);
$this->view->cat_idJson = Zend_Json::encode($inputCatId);
@@ -159,8 +153,10 @@ class ExploreController extends Local_Controller_Action_DomainSwitch
$this->view->commentsJson = Zend_Json::encode($comments);
$modelCategory = new Default_Model_ProjectCategory();
$this->view->categoriesJson = Zend_Json::encode($modelCategory->fetchTreeForView());
- $this->_helper->viewRenderer('index-react');
-
+ $this->_helper->viewRenderer('index-react');
+ }else{
+ $pageLimit = 10;
+ $requestedElements = $this->fetchRequestedElements($filter, $pageLimit, ($page - 1) * \
$pageLimit); }
$paginator = Local_Paginator::factory($requestedElements['elements']);
diff --git a/application/modules/default/controllers/OauthController.php \
b/application/modules/default/controllers/OauthController.php index 56b6368b..2a48964f 100644
--- a/application/modules/default/controllers/OauthController.php
+++ b/application/modules/default/controllers/OauthController.php
@@ -126,7 +126,7 @@ class OAuthController extends Zend_Controller_Action
//New Github-User was created, now let him set a password
$this->redirect('/password/setpassword');
- return;
+ return;
}
Zend_Registry::get('logger')->info(__METHOD__ . ' - registration from social provider \
successful - member_id: '
diff --git a/application/modules/default/controllers/PasswordController.php \
b/application/modules/default/controllers/PasswordController.php index e75e54d6..7cd97af9 100644
--- a/application/modules/default/controllers/PasswordController.php
+++ b/application/modules/default/controllers/PasswordController.php
@@ -250,8 +250,9 @@ class PasswordController extends Local_Controller_Action_DomainSwitch
$this->_helper->flashMessenger->addMessage('<p class="text-error">Your password is \
changed.</p>'); $this->redirect($this->_helper->url('login', 'authorization'));
}
-
- public function setpasswordAction()
+
+
+ public function setpasswordAction()
{
$debugMsg = "";
$this->view->assign('action', '/password/setpassword');
diff --git a/application/modules/default/controllers/ProductController.php \
b/application/modules/default/controllers/ProductController.php index d8429f02..319ba379 100644
--- a/application/modules/default/controllers/ProductController.php
+++ b/application/modules/default/controllers/ProductController.php
@@ -79,54 +79,7 @@ class ProductController extends Local_Controller_Action_DomainSwitch
$this->_helper->viewRenderer('/partials/pploadajax');
}
- // public function indexNewAction(){
- // // for David react ================ page detail ==============
- // if (!empty($this->_collectionId)) {
- // $modelProduct = new Default_Model_Project();
- // $productInfo = $modelProduct->fetchProductForCollectionId($this->_collectionId);
- // $this->_projectId = $productInfo->project_id;
- // }
-
-
- // if (empty($this->_projectId)) {
- // $this->redirect('/explore');
- // }
-
- // $this->view->paramPageId = (int)$this->getParam('page');
- // $this->view->member_id = null;
- // if(null != $this->_authMember && null != $this->_authMember->member_id) {
- // $this->view->member_id = $this->_authMember->member_id;
- // }
-
- // $this->initJsonForReact();
- // // $this->fetchDataForIndexView();
-
- // $this->view->cat_id = $this->view->product->project_category_id;
-
- // //create ppload download hash: secret + collection_id + expire-timestamp
- // $salt = PPLOAD_DOWNLOAD_SECRET;
- // $collectionID = $this->view->product->ppload_collection_id;
- // $timestamp = time() + 3600; // one hour valid
- // $hash = md5($salt . $collectionID . $timestamp); // order isn't important at all... just \
do the same when verifying
-
- // $this->view->download_hash = $hash;
- // $this->view->download_timestamp = $timestamp;
-
- // $helperUserIsOwner = new Default_View_Helper_UserIsOwner();
- // $helperIsProjectActive = new Default_View_Helper_IsProjectActive();
- // if ((false === \
$helperIsProjectActive->isProjectActive($this->view->product->project_status))
- // AND (false === $helperUserIsOwner->UserIsOwner($this->view->product->member_id))
- // ) {
- // throw new Zend_Controller_Action_Exception('This page does not exist', 404);
- // }
-
- // if (APPLICATION_ENV != 'searchbotenv') {
- // $tablePageViews = new Default_Model_DbTable_StatPageViews();
- // $tablePageViews->savePageView($this->_projectId, $this->getRequest()->getClientIp(),
- // $this->_authMember->member_id);
- // }
-
- // }
+
public function initJsonForReact(){
$modelProduct = new Default_Model_Project();
@@ -371,6 +324,9 @@ class ProductController extends Local_Controller_Action_DomainSwitch
$modelTags->processTagsUser($newProject->project_id, null, \
Default_Model_Tags::TAG_TYPE_PROJECT); }
+ if($values['is_original']){
+ $modelTags->processTagProductOriginal($newProject->project_id,$values['is_original']);
+ }
//set license, if needed
$licenseTag = $form->getElement('license_tag_id')->getValue();
@@ -563,6 +519,11 @@ class ProductController extends Local_Controller_Action_DomainSwitch
}
$form->getElement('license_tag_id')->setValue($licenseTag);
+ $is_original = $modelTags->isProuductOriginal($projectData->project_id);
+ if($is_original){
+ $form->getElement('is_original')->checked= true;
+ }
+
$this->view->form = $form;
return;
@@ -627,6 +588,9 @@ class ProductController extends Local_Controller_Action_DomainSwitch
// $modelTags->processTags($this->_projectId, implode(',',$values['tags']), \
Default_Model_Tags::TAG_TYPE_PROJECT); // }
+
+ $modelTags->processTagProductOriginal($this->_projectId,$values['is_original']);
+
if($values['tagsuser']) {
$modelTags->processTagsUser($this->_projectId,implode(',',$values['tagsuser']), \
Default_Model_Tags::TAG_TYPE_PROJECT); }else
@@ -1369,6 +1333,14 @@ class ProductController extends Local_Controller_Action_DomainSwitch
$this->forward('products', 'user', 'default');
}
+ public function loadratingsAction()
+ {
+ $this->_helper->layout->disableLayout();
+ $tableProjectRatings = new Default_Model_DbTable_ProjectRating();
+ $ratings = $tableProjectRatings->fetchRating($this->_projectId);
+ $this->_helper->json($ratings);
+ }
+
public function followAction()
{
$this->_helper->layout()->disableLayout();
diff --git a/application/modules/default/controllers/ProductcommentController.php \
b/application/modules/default/controllers/ProductcommentController.php index 07ca8e2d..3bc25738 100644
--- a/application/modules/default/controllers/ProductcommentController.php
+++ b/application/modules/default/controllers/ProductcommentController.php
@@ -177,13 +177,11 @@ class ProductcommentController extends Local_Controller_Action_DomainSwitch
if ($msg != '' && strlen($msg)>0) {
- $data = array();
- $data['comment_target_id'] = (int)$this->getParam('p');
- $data['comment_parent_id'] = (int)$this->getParam('i');
- $data['comment_member_id'] = (int)$this->_authMember->member_id;
- $data['comment_text'] = Default_Model_HtmlPurify::purify($this->getParam('msg'));
-
-
+ // $data = array();
+ // $data['comment_target_id'] = (int)$this->getParam('p');
+ // $data['comment_parent_id'] = (int)$this->getParam('i');
+ // $data['comment_member_id'] = (int)$this->_authMember->member_id;
+ // $data['comment_text'] = Default_Model_HtmlPurify::purify($this->getParam('msg'));
$voteup = (int)$this->getParam('v');
@@ -202,13 +200,13 @@ class ProductcommentController extends Local_Controller_Action_DomainSwitch
if($this->view->product){
//Send a notification to the owner
- $this->sendNotificationToOwner($this->view->product, $data['comment_text']);
+ $this->sendNotificationToOwner($this->view->product, \
Default_Model_HtmlPurify::purify($this->getParam('msg')));
}
}
- $this->_helper->json(array('status' => $status, 'message' => $message, 'data' => ''));
+ $this->_helper->json(array('status' => $status, 'message' => $message, 'data' => \
'','laplace_score' =>$this->view->product->laplace_score)); } else {
$this->_helper->json(array('status' => 'error', 'message' => 'Only registered members with \
an active supporting can vote!', 'data' => '')); }
diff --git a/application/modules/default/controllers/UserController.php \
b/application/modules/default/controllers/UserController.php index 3ad82aff..fd0976d8 100644
--- a/application/modules/default/controllers/UserController.php
+++ b/application/modules/default/controllers/UserController.php
@@ -91,9 +91,6 @@ class UserController extends Local_Controller_Action_DomainSwitch
$this->view->followedProducts = $tableMember->fetchFollowedProjects($this->_memberId, null);
$this->view->hits = $tableMember->fetchProjectsSupported($this->_memberId);
-
-
-
*/
// ajax load more products
if ($this->getParam('projectpage', null)) {
@@ -120,6 +117,10 @@ class UserController extends Local_Controller_Action_DomainSwitch
$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');
@@ -159,6 +160,18 @@ class UserController extends Local_Controller_Action_DomainSwitch
$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();
// $cntpv = 0;
diff --git a/application/modules/default/forms/Product.php \
b/application/modules/default/forms/Product.php index 745b8a4a..f3f001d1 100644
--- a/application/modules/default/forms/Product.php
+++ b/application/modules/default/forms/Product.php
@@ -72,6 +72,8 @@ class Default_Form_Product extends Zend_Form
->addElement($this->getSubmitElement())
->addElement($this->getCancelElement())
->addElement($this->getLicenseIdElement())
+ ->addElement($this->getIsOriginal())
+
//->addElement($this->getCCAttribution())
//->addElement($this->getCCComercial())
//->addElement($this->getCCDerivateWorks())
@@ -576,6 +578,19 @@ class Default_Form_Product extends Zend_Form
return $this->createElement('checkbox', 'cc_license');
}
+
+ private function getIsOriginal()
+ {
+ $element = new Zend_Form_Element_Checkbox('is_original');
+ return $element
+ ->setOptions(array(
+ 'label' =>' Product original ',
+ 'use_hidden_element' => false,
+ 'checked_value' => 1,
+ 'unchecked_value' => 0
+ ));
+ }
+
private function getTagElement()
{
$element = new Zend_Form_Element_Multiselect('tags', array('registerInArrayValidator' => \
false));
diff --git a/application/modules/default/forms/Register.php \
b/application/modules/default/forms/Register.php index a16ca1ba..fced9fb9 100644
--- a/application/modules/default/forms/Register.php
+++ b/application/modules/default/forms/Register.php
@@ -114,14 +114,6 @@ class Default_Form_Register extends Zend_Form
$passValid = new Local_Validate_PasswordConfirm($pass2->getValue());
$pass1->addValidator($passValid, true);
- $this->addPrefixPath('Cgsmith\\Form\\Element', APPLICATION_LIB . '/Cgsmith/Form/Element', \
Zend_Form::ELEMENT);
- $this->addElementPrefixPath('Cgsmith\\Validate\\', APPLICATION_LIB . '/Cgsmith/Validate/', \
Zend_Form_Element::VALIDATE);
-
- $captcha = $this->createElement('recaptcha', 'g-recaptcha-response', array(
- 'siteKey' => Zend_Registry::get('config')->recaptcha->sitekey,
- 'secretKey' => Zend_Registry::get('config')->recaptcha->secretkey,
- ));
-
$submit = $this->createElement('button', 'login');
$submit->setLabel('Register');
$submit->setDecorators(array('ViewHelper'));
@@ -132,9 +124,21 @@ class Default_Form_Register extends Zend_Form
->addElement($mail)
->addElement($pass1)
->addElement($pass2)
- ->addElement($captcha)
->addElement($submit)
;
+
+ if (APPLICATION_ENV == 'development') {
+ return;
+ }
+
+ $this->addPrefixPath('Cgsmith\\Form\\Element', APPLICATION_LIB . '/Cgsmith/Form/Element', \
Zend_Form::ELEMENT); + $this->addElementPrefixPath('Cgsmith\\Validate\\', APPLICATION_LIB . \
'/Cgsmith/Validate/', Zend_Form_Element::VALIDATE); + $captcha = $this->createElement('recaptcha', \
'g-recaptcha-response', array( + 'siteKey' => \
Zend_Registry::get('config')->recaptcha->sitekey, + 'secretKey' => \
Zend_Registry::get('config')->recaptcha->secretkey, + ));
+
+ $this->addElement($captcha);
}
}
\ No newline at end of file
diff --git a/application/modules/default/models/DbTable/ProjectRating.php \
b/application/modules/default/models/DbTable/ProjectRating.php index 4471fc8c..96fc145a 100644
--- a/application/modules/default/models/DbTable/ProjectRating.php
+++ b/application/modules/default/models/DbTable/ProjectRating.php
@@ -28,7 +28,7 @@ class Default_Model_DbTable_ProjectRating extends Local_Model_Table
protected $_keyColumnsForRow = array('rating_id');
protected $_key = 'rating_id';
-
+
/**
* @param int $project_id
@@ -104,6 +104,124 @@ class Default_Model_DbTable_ProjectRating extends Local_Model_Table
return $result;
}
+
+ /**
+ * @param int $projectId
+ * @param int $member_id
+ * @param int $userRating
+ * @param int|null $msg comment
+ */
+ public function rateForProject($projectId, $member_id, $userRating, $msg )
+ {
+ $userLikeIt = $userRating == 1 ? 1 : 0;
+ $userDislikeIt = $userRating == 2 ? 1 : 0;
+ $sql = 'select rating_id,comment_id from project_rating where project_id='.$projectId.' and \
rating_active=1 and user_like='.$userLikeIt.' and user_dislike='.$userDislikeIt.' and \
member_id='.$member_id; + $result = $this->getAdapter()->fetchRow($sql);
+ $is_upvote=$userRating == 1 ? true : false;
+ $is_exist = (($result!=null) && ($result['rating_id']!=null))?true:false;
+ $modelComments = new Default_Model_ProjectComments();
+
+ // Zend_Registry::get('logger')->info($msg);
+ if($is_exist){
+ // this do cancel old rating . remove rating & deactive
+ $rating_id = $result['rating_id'];
+ $comment_id = $result['comment_id'];
+ $this->update(array('rating_active' => 0), 'rating_id=' . $rating_id);
+ $modelComments->deactiveComment($comment_id);
+ if($is_upvote){
+ $this->rateUpdateProject($projectId,1);
+ }else{
+ $this->rateUpdateProject($projectId,2);
+ }
+ }else{
+ // this do first rating or change from - to + or + to -
+ // first comment
+ $data = array();
+ $data['comment_target_id'] =$projectId;
+ $data['comment_member_id'] =$member_id;
+ $data['comment_parent_id'] = 0;
+ $data['comment_text'] = $msg;
+ $tableReplies = new Default_Model_ProjectComments();
+ $result = $tableReplies->save($data);
+ $comment_id = $result->comment_id;
+
+ // get old rating
+ $sql = 'select rating_id,comment_id,user_like from project_rating where \
project_id='.$projectId.' and rating_active=1 and member_id='.$member_id; + $result = \
$this->getAdapter()->fetchRow($sql); + if($result!=null && \
$result['rating_id']!=null){ + $this->update(array('rating_active' => 0), 'rating_id=' . \
$result['rating_id']); + $modelComments->deactiveComment($result['comment_id']);
+ }
+
+ $this->save(array(
+ 'project_id' => $projectId,
+ 'member_id' => $member_id,
+ 'user_like' => $userLikeIt,
+ 'user_dislike' => $userDislikeIt,
+ 'rating_active' => 1,
+ 'comment_id' => $comment_id
+ ));
+
+ // deal with project table ratings
+ if(($result!=null) && ($result['rating_id']!=null)){
+ if($is_upvote){
+ $this->rateUpdateProject($projectId,5);
+ }else{
+ $this->rateUpdateProject($projectId,6);
+ }
+ }else{
+ // first time rating
+ if($is_upvote){
+ $this->rateUpdateProject($projectId,3);
+ }else{
+ $this->rateUpdateProject($projectId,4);
+ }
+ }
+
+ }
+
+
+ }
+
+ private function rateUpdateProject($projectId,$action)
+ {
+ // $action ==1 => $project->count_likes - 1
+ // $action ==2 => $project->count_dislikes - 1
+ // $action ==3 => $project->count_likes + 1
+ // $action ==4 => $project->count_dislikes + 1
+ // $action ==5 => $project->count_likes+1 and $project->count_dislikes - 1
+ // $action ==6 => $project->count_likes-1 and $project->count_dislikes +1
+ $projectTable = new Default_Model_Project();
+ $project = $projectTable->fetchProductInfo($projectId);
+ if($action==1)
+ {
+ $numLikes = (int)$project->count_likes - 1;
+ $updatearray = array('count_likes' => $numLikes);
+ }else if($action==2)
+ {
+ $numLikes = (int)$project->count_dislikes - 1;
+ $updatearray = array('count_dislikes' => $numLikes);
+ }else if($action==3)
+ {
+ $numLikes = (int)$project->count_likes +1;
+ $updatearray = array('count_likes' => $numLikes);
+ }else if($action==4)
+ {
+ $numLikes = (int)$project->count_dislikes +1;
+ $updatearray = array('count_dislikes' => $numLikes);
+ }else if($action==5)
+ {
+ $numdisLikes = (int)$project->count_dislikes -1;
+ $numLikes = (int)$project->count_likes +1;
+ $updatearray = array('count_dislikes' => $numdisLikes,'count_likes' => $numLikes);
+ }else if($action==6)
+ {
+ $numdisLikes = (int)$project->count_dislikes +1;
+ $numLikes = (int)$project->count_likes -1;
+ $updatearray = array('count_dislikes' => $numdisLikes,'count_likes' => $numLikes);
+ }
+ $projectTable->update($updatearray, 'project_id = ' . $projectId);
+ }
/**
* @param int $projectId
@@ -111,8 +229,9 @@ class Default_Model_DbTable_ProjectRating extends Local_Model_Table
* @param int $userRating
* @param int|null $msg comment
* @TODO: revise this, double check against specification. the source code seems to be too \
complicated. + @note: replaced by above code
*/
- public function rateForProject($projectId, $member_id, $userRating, $msg )
+ public function rateForProject_($projectId, $member_id, $userRating, $msg )
{
$userLikeIt = $userRating == 1 ? 1 : 0;
diff --git a/application/modules/default/models/Member.php \
b/application/modules/default/models/Member.php index 98dd9c47..78950eae 100644
--- a/application/modules/default/models/Member.php
+++ b/application/modules/default/models/Member.php
@@ -286,7 +286,7 @@ class Default_Model_Member extends Default_Model_DbTable_Member
}
$sql = '
- SELECT m.*, `member_email`.`email_address` AS `mail`, \
IF(ISNULL(`member_email`.`email_checked`),0,1) AS `mail_checked`, `mei`.`external_id` + \
SELECT m.*, `member_email`.`email_address` AS `mail`, IF(ISNULL(`member_email`.`email_checked`),0,1) AS \
`mail_checked`, `member_email`.`email_address`, `mei`.`external_id` FROM `member` AS `m`
JOIN `member_email` ON `m`.`member_id` = `member_email`.`email_member_id` AND \
`member_email`.`email_primary` = 1
LEFT JOIN `member_external_id` AS `mei` ON `mei`.`member_id` = `m`.`member_id`
@@ -319,9 +319,10 @@ class Default_Model_Member extends Default_Model_DbTable_Member
}
$sql = "
- SELECT `m`.*, `member_email`.`email_address` AS `mail`, \
IF(ISNULL(`member_email`.`email_checked`),0,1) AS `mail_checked` + SELECT `m`.*, \
`member_email`.`email_address` AS `mail`, IF(ISNULL(`member_email`.`email_checked`),0,1) AS \
`mail_checked`, `member_email`.`email_address`, `mei`.`external_id` FROM `member` AS `m`
JOIN `member_email` ON `m`.`member_id` = `member_email`.`email_member_id` AND \
`member_email`.`email_primary` = 1 + LEFT JOIN `member_external_id` AS `mei` ON \
`mei`.`member_id` = `m`.`member_id` WHERE `m`.`member_id` = :memberId";
if ($onlyActive) {
@@ -1019,6 +1020,26 @@ class Default_Model_Member extends Default_Model_DbTable_Member
return $login . '_' . $result['counter'];
}
+ /**
+ * @param int $member_id
+ * @param string $email
+ *
+ * @return bool
+ * @throws Zend_Db_Statement_Exception
+ */
+ public function setActive($member_id, $email)
+ {
+ $sql = "
+ UPDATE `member`
+ STRAIGHT_JOIN `member_email` ON `member`.`member_id` = `member_email`.`email_member_id` \
AND `member_email`.`email_checked` IS NULL AND `member`.`is_deleted` = 0 AND \
`member_email`.`email_deleted` = 0 + SET `member`.`mail_checked` = 1, `member`.`is_active` = \
1, `member`.`changed_at` = NOW(), `member_email`.`email_checked` = NOW() + WHERE \
`member`.`member_id` = :memberId AND `member_email`.`email_address` = :mailAddress; + ";
+ $stmnt = $this->_db->query($sql, array('memberId' => $member_id, 'mailAddress' => $email));
+
+ return $stmnt->rowCount() > 0 ? true : false;
+ }
+
/**
* @param int $member_id
*
diff --git a/application/modules/default/models/OAuth/Github.php \
b/application/modules/default/models/OAuth/Github.php index 386f6642..7d149df5 100644
--- a/application/modules/default/models/OAuth/Github.php
+++ b/application/modules/default/models/OAuth/Github.php
@@ -498,7 +498,7 @@ class Default_Model_OAuth_Github implements Default_Model_OAuth_Interface
*/
public function registerLocal()
{
- $userInfo = $this->getUserInfo();
+ $userInfo = $this->getUserInfo();
$usermail = $this->getUserEmail();
$userInfo['email'] = $usermail['email'];
$userInfo['verified'] = $usermail['verified'] ? 1 : 0;
diff --git a/application/modules/default/models/OAuth/Ocs.php \
b/application/modules/default/models/OAuth/Ocs.php index d73a1bf9..612121d1 100644
--- a/application/modules/default/models/OAuth/Ocs.php
+++ b/application/modules/default/models/OAuth/Ocs.php
@@ -34,7 +34,7 @@ class Default_Model_OAuth_Ocs implements Default_Model_OAuth_Interface
protected $config;
/** @var Zend_Session_Namespace $session */
protected $session;
- /** @var Zend_Db_Table_Row_Abstract */
+ /** @var array */
protected $memberData;
/** @var string */
protected $access_token;
@@ -405,7 +405,7 @@ class Default_Model_OAuth_Ocs implements Default_Model_OAuth_Interface
'mail' => $userEmail
));
Zend_Registry::get('logger')->info(__METHOD__ . ' - ResultSet: ' . print_r($resultSet, true));
- Zend_Registry::get('logger')->info(__METHOD__ . ' - sql take seconds: ' . \
$this->_db->getProfiler()->getLastQueryProfile() + Zend_Registry::get('logger')->info(__METHOD__ . \
' - seconds: ' . $this->_db->getProfiler()->getLastQueryProfile()
\
->getElapsedSecs()) ;
$this->_db->getProfiler()->setEnabled(false);
diff --git a/application/modules/default/models/Ocs/Ident.php \
b/application/modules/default/models/Ocs/Ident.php index ce16e8d5..f87203ec 100644
--- a/application/modules/default/models/Ocs/Ident.php
+++ b/application/modules/default/models/Ocs/Ident.php
@@ -51,6 +51,7 @@ class Default_Model_Ocs_Ident
/**
* @param int $member_id
*
+ * @return bool
* @throws Zend_Exception
* @throws Zend_Ldap_Exception
*/
@@ -58,13 +59,32 @@ class Default_Model_Ocs_Ident
{
$connection = $this->getServerConnection();
$member_data = $this->getMemberData($member_id);
- $username = strtolower($member_data['username']);
- $entry = $this->getEntry($member_data, $connection);
+
+ try {
+ $entry = $this->getEntry($member_data, $connection);
+ } catch (Exception $e) {
+ $this->errMessages[] = "Failed.";
+ Zend_Registry::get('logger')->err(__METHOD__ . ' - ' . $e->getMessage());
+
+ return false;
+ }
+ if (empty($entry)) {
+ $this->errMessages[] = "Failed.";
+ Zend_Registry::get('logger')->err(__METHOD__ . ' - ldap entry for member does not exists. \
Going to create it.'); +
+ return false;
+ }
+
$oldUidAttribute = Zend_Ldap_Attribute::getAttribute($entry, 'email');
- Zend_Ldap_Attribute::removeFromAttribute($entry, 'uid', $oldUidAttribute[0]);
+ Zend_Ldap_Attribute::removeFromAttribute($entry, 'uid', $oldUidAttribute);
+ Zend_Ldap_Attribute::removeFromAttribute($entry, 'email', $oldUidAttribute);
Zend_Ldap_Attribute::setAttribute($entry, 'email', $member_data['email_address']);
Zend_Ldap_Attribute::setAttribute($entry, 'uid', $member_data['email_address'], true);
- $connection->update("cn={$username},{$this->baseDn}", $entry);
+ $dn = $entry['dn'];
+ $connection->update($dn, $entry);
+ $connection->getLastError($this->errCode, $this->errMessages);
+
+ return true;
}
/**
@@ -113,6 +133,35 @@ class Default_Model_Ocs_Ident
return $result;
}
+ /**
+ * @param array $member_data
+ *
+ * @param Zend_Ldap $ldap
+ *
+ * @return array
+ * @throws Default_Model_Ocs_Exception
+ * @throws Zend_Ldap_Exception
+ */
+ public function getEntry($member_data, $ldap)
+ {
+ if (empty($member_data)) {
+ throw new Default_Model_Ocs_Exception('given member_data empty');
+ }
+
+ $filter = "(uidNumber={$member_data['member_id']})";
+ $entries = $ldap->searchEntries($filter, $this->baseDn);
+
+ if (count($entries) > 1) {
+ throw new Default_Model_Ocs_Exception('found member_id more than once. member_id: ' . \
$member_data['member_id']); + }
+
+ if (count($entries) == 1) {
+ return $entries[0];
+ }
+
+ return array();
+ }
+
/**
* @param array $member_data
* @param Zend_Ldap $ldap
@@ -120,7 +169,7 @@ class Default_Model_Ocs_Ident
* @return mixed
* @throws Zend_Ldap_Exception
*/
- private function getEntry($member_data, $ldap)
+ public function getEntryByDN($member_data, $ldap)
{
$username = strtolower($member_data['username']);
$entry = $ldap->getEntry("cn={$username},{$this->baseDn}");
@@ -131,6 +180,7 @@ class Default_Model_Ocs_Ident
/**
* @param int $member_id
*
+ * @return bool
* @throws Zend_Exception
* @throws Zend_Ldap_Exception
*/
@@ -138,26 +188,73 @@ class Default_Model_Ocs_Ident
{
$connection = $this->getServerConnection();
$member_data = $this->getMemberData($member_id);
- $entry = $this->getEntry($member_data, $connection);
+ try {
+ $entry = $this->getEntry($member_data, $connection);
+ } catch (Exception $e) {
+ $this->errMessages[] = "Failed.";
+ Zend_Registry::get('logger')->err(__METHOD__ . ' - ' . $e->getMessage());
+
+ return false;
+ }
+
if (empty($entry)) {
- Zend_Registry::get('logger')->info(__METHOD__ . ' - ldap entry for member does not exists. \
Going to create it.');
- $this->createUser($member_id);
+ $this->errMessages[] = "Failed.";
+ Zend_Registry::get('logger')->err(__METHOD__ . ' - ldap entry for member does not exists. \
member_id:' . $member_id);
- return;
+ return false;
}
+ Zend_Ldap_Attribute::removeFromAttribute($entry, 'userPassword', \
Zend_Ldap_Attribute::getAttribute($entry, 'userPassword'));
$password = '{MD5}' . base64_encode(pack("H*", $member_data['password']));
Zend_Ldap_Attribute::setAttribute($entry, 'userPassword', $password);
- //Zend_Ldap_Attribute::setPassword($entry,
- // 'newPa$$w0rd',
- // Zend_Ldap_Attribute::PASSWORD_HASH_MD5);
- $username = strtolower($member_data['username']);
- $connection->update("cn={$username},{$this->baseDn}", $entry);
+
+ $connection->update($entry['dn'], $entry);
+ $connection->getLastError($this->errCode, $this->errMessages);
+
+ return true;
+ }
+
+ /**
+ * @param int $member_id
+ *
+ * @return bool
+ * @throws Zend_Exception
+ * @throws Zend_Ldap_Exception
+ */
+ public function updateUser($member_id)
+ {
+ $connection = $this->getServerConnection();
+ $member_data = $this->getMemberData($member_id);
+ try {
+ $oldEntry = $this->getEntry($member_data, $connection);
+ } catch (Exception $e) {
+ $this->errMessages[] = "Failed.";
+ Zend_Registry::get('logger')->err(__METHOD__ . ' - ' . $e->getMessage());
+
+ return false;
+ }
+ if (empty($oldEntry)) {
+ $this->errMessages[] = "user missing. Going to create one.";
+ Zend_Registry::get('logger')->info(__METHOD__ . ' - ldap entry for member does not exists. \
Going to create it.'); +
+ return $this->createUser($member_id);
+ }
+ if (strtolower($member_data['username']) != Zend_Ldap_Attribute::getAttribute($oldEntry, 'cn')) \
{ + $this->errMessages[] = "Fail. username changed. user should be deleted first and than user \
create."; +
+ return false;
+ }
+
+ $entry = $this->updateIdentEntry($member_data, $oldEntry);
+ $connection->update($oldEntry['dn'], $entry);
$connection->getLastError($this->errCode, $this->errMessages);
+
+ return true;
}
/**
* @param int $member_id
*
+ * @return bool
* @throws Zend_Ldap_Exception
* @throws Zend_Exception
*/
@@ -167,13 +264,27 @@ class Default_Model_Ocs_Ident
$member_data = $this->getMemberData($member_id);
//Only create, if user do not exisits
- $entry = $this->getEntry($member_data, $connection);
- if (empty($entry)) {
- $entry = $this->createIdentEntry($member_data);
- $username = strtolower($member_data['username']);
- $connection->add("cn={$username},{$this->baseDn}", $entry);
- $connection->getLastError($this->errCode, $this->errMessages);
+ try {
+ $entry = $this->getEntry($member_data, $connection);
+ } catch (Exception $e) {
+ $this->errMessages[] = "Failed.";
+ Zend_Registry::get('logger')->err(__METHOD__ . ' - ' . $e->getMessage());
+
+ return false;
}
+ if (false === empty($entry)) {
+ $this->errMessages[] = "user already exists.";
+ Zend_Registry::get('logger')->err(__METHOD__ . ' - ldap entry for member does not exists. \
Going to create it.'); +
+ return false;
+ }
+
+ $entry = $this->createIdentEntry($member_data);
+ $username = strtolower($member_data['username']);
+ $connection->add("cn={$username},{$this->baseDn}", $entry);
+ $connection->getLastError($this->errCode, $this->errMessages);
+
+ return true;
}
/**
@@ -208,25 +319,44 @@ class Default_Model_Ocs_Ident
return $entry;
}
- /**
- * @param int $member_id
- *
- * @return bool
- * @throws Zend_Exception
- * @throws Zend_Ldap_Exception
- */
- public function updateUser($member_id)
+ private function updateIdentEntry($member_data, $oldEntry)
{
- $connection = $this->getServerConnection();
- $member_data = $this->getMemberData($member_id);
- $username = strtolower($member_data['username']);
- if (false === $connection->exists("cn={$username},{$this->baseDn}")) {
- $connection->getLastError($this->errCode, $this->errMessages);
- return false;
+ $entry = $oldEntry;
+ Zend_Ldap_Attribute::removeFromAttribute($entry, 'uidNumber', \
Zend_Ldap_Attribute::getAttribute($oldEntry, 'uidNumber')); + \
Zend_Ldap_Attribute::setAttribute($entry, 'uidNumber', $member_data['member_id']); +
+ Zend_Ldap_Attribute::removeFromAttribute($entry, 'memberUid', \
Zend_Ldap_Attribute::getAttribute($oldEntry, 'memberUid')); + \
Zend_Ldap_Attribute::setAttribute($entry, 'memberUid', $member_data['external_id']); +
+ Zend_Ldap_Attribute::removeFromAttribute($entry, 'gidNumber', \
Zend_Ldap_Attribute::getAttribute($oldEntry, 'gidNumber')); + \
Zend_Ldap_Attribute::setAttribute($entry, 'gidNumber', $member_data['role_id']); +
+ Zend_Ldap_Attribute::removeFromAttribute($entry, 'email', \
Zend_Ldap_Attribute::getAttribute($oldEntry, 'email')); + \
Zend_Ldap_Attribute::setAttribute($entry, 'email', $member_data['email_address']); +
+ Zend_Ldap_Attribute::removeFromAttribute($entry, 'cn', \
Zend_Ldap_Attribute::getAttribute($oldEntry, 'cn')); + Zend_Ldap_Attribute::setAttribute($entry, \
'cn', $member_data['username']); +
+ Zend_Ldap_Attribute::removeFromAttribute($entry, 'uid', \
Zend_Ldap_Attribute::getAttribute($oldEntry, 'uid')); + Zend_Ldap_Attribute::setAttribute($entry, \
'uid', $member_data['username']); +
+ Zend_Ldap_Attribute::removeFromAttribute($entry, 'uid', \
Zend_Ldap_Attribute::getAttribute($oldEntry, 'uid')); + Zend_Ldap_Attribute::setAttribute($entry, \
'uid', $member_data['email']); +
+ Zend_Ldap_Attribute::removeFromAttribute($entry, 'userPassword', \
Zend_Ldap_Attribute::getAttribute($oldEntry, 'userPassword')); + $password = '{MD5}' . \
base64_encode(pack("H*", $member_data['password'])); + Zend_Ldap_Attribute::setAttribute($entry, \
'userPassword', $password); +
+ if (false === empty(trim($member_data['firstname']))) {
+ Zend_Ldap_Attribute::removeFromAttribute($entry, 'gn', \
Zend_Ldap_Attribute::getAttribute($oldEntry, 'gn')); + \
Zend_Ldap_Attribute::setAttribute($entry, 'gn', $member_data['firstname']); }
- $entry = $this->createIdentEntry($member_data);
- $connection->update("cn={$username},{$this->baseDn}", $entry);
- $connection->getLastError($this->errCode, $this->errMessages);
+ if (false === empty(trim($member_data['lastname']))) {
+ Zend_Ldap_Attribute::removeFromAttribute($entry, 'sn', \
Zend_Ldap_Attribute::getAttribute($oldEntry, 'sn')); + \
Zend_Ldap_Attribute::setAttribute($entry, 'sn', $member_data['lastname']); + }
+
+ return $entry;
}
/**
@@ -243,13 +373,15 @@ class Default_Model_Ocs_Ident
}
$connection = $this->getServerConnection();
$member_data = $this->getMemberData($member_id, false);
- $username = strtolower($member_data['username']);
- if (false === $connection->exists("cn={$username},{$this->baseDn}")) {
- $connection->getLastError($this->errCode, $this->errMessages);
+ try {
+ $entry = $this->getEntry($member_data, $connection);
+ } catch (Exception $e) {
+ $this->errMessages[] = "Failed.";
+ Zend_Registry::get('logger')->err(__METHOD__ . ' - ' . $e->getMessage());
return false;
}
- $connection->delete("cn={$username},{$this->baseDn}");
+ $connection->delete($entry['dn']);
$connection->getLastError($this->errCode, $this->errMessages);
return true;
@@ -282,6 +414,7 @@ class Default_Model_Ocs_Ident
*
* @return array
* @throws Zend_Ldap_Exception
+ * @throws Default_Model_Ocs_Exception
*/
public function createUserInLdap($member_data)
{
@@ -289,35 +422,71 @@ class Default_Model_Ocs_Ident
$connection = $this->getServerConnection();
$username = strtolower($member_data['username']);
$dn = "cn={$username},{$this->baseDn}";
- if ($connection->exists($dn)) {
+ if ($this->userExists($member_data['member_id'])) {
$connection->getLastError($this->errCode, $this->errMessages);
+ if (empty($this->errCode)) {
+ $this->errCode = 999;
+ $this->errMessages[] = "user already exists.";
+ }
return array();
}
+
$connection->add($dn, $entry);
$connection->getLastError($this->errCode, $this->errMessages);
return $entry;
}
+ /**
+ * @param int $member_id
+ *
+ * @return mixed
+ * @throws Default_Model_Ocs_Exception
+ * @throws Zend_Ldap_Exception
+ */
+ public function userExists($member_id)
+ {
+ if (empty($member_id)) {
+ throw new Default_Model_Ocs_Exception('given $member_id empty');
+ }
+
+ $ldap = $this->getServerConnection();
+ $filter = "(uidNumber={$member_id})";
+ $entries = $ldap->searchEntries($filter, $this->baseDn);
+
+ if (count($entries) > 1) {
+ throw new Default_Model_Ocs_Exception('found member_id more than once');
+ }
+
+ if (count($entries) == 1) {
+ return true;
+ }
+
+ return false;
+ }
+
/**
* @param array $member_data
*
* @return array
+ * @throws Zend_Exception
* @throws Zend_Ldap_Exception
*/
public function updateUserInLdap($member_data)
{
- $entry = $this->createIdentEntry($member_data);
+ $newEntry = $this->createIdentEntry($member_data);
$connection = $this->getServerConnection();
- $username = strtolower($member_data['username']);
- $dn = "cn={$username},{$this->baseDn}";
- if (false == $connection->exists($dn)) {
- $connection->getLastError($this->errCode, $this->errMessages);
+ try {
+ $entry = $this->getEntry($member_data, $connection);
+ } catch (Exception $e) {
+ $this->errMessages[] = "Failed.";
+ Zend_Registry::get('logger')->err(__METHOD__ . ' - ' . $e->getMessage());
- return array();
+ return false;
}
- $connection->update($dn, $entry);
+ $dn = $entry['dn'];
+ $connection->update($dn, $newEntry);
$connection->getLastError($this->errCode, $this->errMessages);
return $entry;
diff --git a/application/modules/default/models/Project.php \
b/application/modules/default/models/Project.php index 47ef3c03..a030fd0b 100644
--- a/application/modules/default/models/Project.php
+++ b/application/modules/default/models/Project.php
@@ -249,6 +249,8 @@ class Default_Model_Project extends Default_Model_DbTable_Project
return $this->generateRowSet($q->query()->fetchAll());
}
+
+
/**
* @param array $data
*
@@ -928,6 +930,17 @@ class Default_Model_Project extends Default_Model_DbTable_Project
return (int)$result['count_active_members'];
}
+ public function isProjectFeatured($project_id)
+ {
+ $sql_object= "SELECT project_id FROM project where project_id= :project_id and status = 100 \
and type_id = 1 and featured = 1"; + $r = $this->getAdapter()->fetchRow($sql_object, \
array('project_id' => $project_id)); + if($r){
+ return true;
+ }else
+ {
+ return false;
+ }
+ }
/**
* @return mixed
*/
@@ -1448,6 +1461,47 @@ class Default_Model_Project extends Default_Model_DbTable_Project
}
}
+ public function fetchAllFeaturedProjectsForMember($member_id, $limit = null, $offset = null)
+ {
+ // for member me page
+ $sql = "
+ SELECT
+ p.project_id,
+ p.title,
+ p.created_at as project_created_at,
+ p.changed_at as project_changed_at,
+ p.count_likes,
+ p.count_dislikes,
+ p.laplace_score,
+ p.member_id,
+ p.cat_title as catTitle,
+ p.image_small,
+ (select count(1) from project_plings l where p.project_id = l.project_id and \
l.is_deleted = 0 and l.is_active = 1 ) countplings + FROM stat_projects p
+ where p.status =100
+ and featured = 1
+ and p.member_id = :member_id
+ order by p.changed_at DESC
+ ";
+
+ if (isset($limit)) {
+ $sql = $sql.' limit '.$limit;
+ }
+
+ if (isset($offset)) {
+ $sql = $sql.' offset '.$offset;
+ }
+
+ $result = $this->_db->fetchAll($sql, array('member_id' => $member_id));
+ if ($result) {
+ return $this->generateRowClass($result);
+ } else {
+ return null;
+ }
+ }
+
+
+
}
\ No newline at end of file
diff --git a/application/modules/default/models/Tags.php b/application/modules/default/models/Tags.php
index c2a743cf..93de603c 100644
--- a/application/modules/default/models/Tags.php
+++ b/application/modules/default/models/Tags.php
@@ -36,6 +36,9 @@ class Default_Model_Tags
const TAG_ARCHITECTURE_GROUPID = 9;
const TAG_GHNS_EXCLUDED_GROUPID = 10;
+ const TAG_PRODUCT_ORIGINAL_GROUPID = 11;
+ const TAG_PRODUCT_ORIGINAL_ID = 2451;
+
/**
* Default_Model_Tags constructor.
*/
@@ -393,6 +396,52 @@ class Default_Model_Tags
$this->deassignTagsUser($object_id, $tags, $tag_type);
}
+ public function isProuductOriginal($project_id)
+ {
+ $sql_object= "select tag_item_id from tag_object WHERE tag_id = :tag_id and \
tag_object_id=:tag_object_id and tag_group_id=:tag_group_id + and \
tag_type_id = :tag_type_id and is_deleted = 0"; + $r = \
$this->getAdapter()->fetchRow($sql_object, array('tag_id' => self::TAG_PRODUCT_ORIGINAL_ID, + \
'tag_object_id' =>$project_id, + \
'tag_group_id' => self::TAG_PRODUCT_ORIGINAL_GROUPID, + \
'tag_type_id' => self::TAG_TYPE_PROJECT + \
)); + if($r){
+ return true;
+ }else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * @param int $object_id
+ * @param string $value
+ */
+ public function processTagProductOriginal($object_id, $is_original)
+ {
+ $sql_object= "select tag_item_id from tag_object WHERE tag_id = :tag_id and \
tag_object_id=:tag_object_id and tag_group_id=:tag_group_id + and \
tag_type_id = :tag_type_id and is_deleted = 0"; + $r = \
$this->getAdapter()->fetchRow($sql_object, array('tag_id' => self::TAG_PRODUCT_ORIGINAL_ID, + \
'tag_object_id' =>$object_id, + \
'tag_group_id' => self::TAG_PRODUCT_ORIGINAL_GROUPID, + \
'tag_type_id' => self::TAG_TYPE_PROJECT + \
)); +
+ if($is_original=='1')
+ {
+ if(!$r){
+ $sql = "INSERT IGNORE INTO tag_object (tag_id, tag_type_id, tag_object_id, \
tag_group_id) VALUES (:tag_id, :tag_type_id, :tag_object_id, :tag_group_id)"; + \
$this->getAdapter()->query($sql, array('tag_id' => self::TAG_PRODUCT_ORIGINAL_ID, 'tag_type_id' => \
self::TAG_TYPE_PROJECT , 'tag_object_id' => $object_id, 'tag_group_id' => \
self::TAG_PRODUCT_ORIGINAL_GROUPID)); + }
+ }else{
+
+ if($r){
+ $sql = "UPDATE tag_object set tag_changed = NOW() , is_deleted = 1 WHERE \
tag_item_id = :tagItemId"; + $this->getAdapter()->query($sql, array('tagItemId' => \
$r['tag_item_id'])); + }
+ }
+
+ }
/**
* @param int $object_id
diff --git a/application/modules/default/views/helpers/FetchMetaheaderMenuJson.php \
b/application/modules/default/views/helpers/FetchMetaheaderMenuJson.php new file mode 100755
index 00000000..5f3b8c55
--- /dev/null
+++ b/application/modules/default/views/helpers/FetchMetaheaderMenuJson.php
@@ -0,0 +1,109 @@
+<?php
+/**
+ * ocs-webserver
+ *
+ * Copyright 2016 by pling GmbH.
+ *
+ * This file is part of ocs-webserver.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+class Default_View_Helper_FetchMetaheaderMenuJson extends Zend_View_Helper_Abstract
+{
+
+ public function fetchMetaheaderMenuJson()
+ {
+
+ $sname = Zend_Registry::get('store_host');
+ /** @var Zend_Cache_Core $cache */
+ $cache = Zend_Registry::get('cache');
+ $cacheName = __FUNCTION__ . md5($sname);
+
+ if (false == ($domainobjects = $cache->load($cacheName))) {
+ $tbl = new Default_Model_DbTable_ConfigStore();
+ $result = $tbl->fetchDomainObjects();
+ // sort Desktop manuelly to the front
+ $arrayDesktop = array();
+ $arrayRest = array();
+
+ foreach ($result as $obj) {
+ $o = $obj['order'];
+ $curOrder = floor($obj['order']/1000);
+ if($curOrder<10 or $curOrder>50) continue;
+ $obj['calcOrder'] = $curOrder;
+
+ $tmp = array();
+ $tmp['order'] = $obj['order'];
+ $tmp['calcOrder'] = $obj['calcOrder'];
+ $tmp['host'] = $obj['host'];
+ $tmp['name'] = $obj['name'];
+
+ if($curOrder==30) {
+ // Desktop set calcOrder = 9 manuelly put desktop in front
+ $tmp['calcOrder'] = 9;
+ $arrayDesktop[] = $tmp;
+ }else{
+ $arrayRest[] = $tmp;
+ }
+ }
+ $domainobjects = array_merge($arrayDesktop, $arrayRest);
+
+
+ $baseurl = Zend_Registry::get('config')->settings->client->default->baseurl;
+ // set group name manully
+ foreach ($domainobjects as &$obj) {
+
+ if($sname == $obj['host']){
+ $obj['menuactive'] = 1;
+ }else{
+ $obj['menuactive'] = 0;
+ }
+
+ $order = $obj['order'];
+ // z.b 150001 ende ==1 go real link otherwise /s/$name
+ $last_char_check = substr($order, -1);
+ if($last_char_check=='1')
+ {
+ $obj['menuhref'] = $obj['host'];
+ }else{
+ $obj['menuhref'] = $baseurl.'/s/'.$obj['name'];
+ }
+
+ switch ($obj['calcOrder']) {
+ case 9:
+ $obj['menugroup']='Desktops';
+ break;
+ case 10:
+ $obj['menugroup']='Applications';
+ break;
+ case 20:
+ $obj['menugroup']='Addons';
+ break;
+ case 40:
+ $obj['menugroup']='Artwork';
+ break;
+ case 50:
+ $obj['menugroup']='Other';
+ break;
+ }
+
+ }
+
+ $cache->save($domainobjects, $cacheName, array(), 28800);
+ }
+ return Zend_Json::encode($domainobjects);
+ }
+
+}
\ No newline at end of file
diff --git a/application/modules/default/views/helpers/IsProjectFeatured.php \
b/application/modules/default/views/helpers/IsProjectFeatured.php new file mode 100755
index 00000000..e6fe6e07
--- /dev/null
+++ b/application/modules/default/views/helpers/IsProjectFeatured.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * ocs-webserver
+ *
+ * Copyright 2016 by pling GmbH.
+ *
+ * This file is part of ocs-webserver.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+class Default_View_Helper_IsProjectFeatured extends Zend_View_Helper_Abstract
+{
+
+ /**
+ * @param int $project_id
+ * @return bool
+ */
+ public function isProjectFeatured($project_id)
+ {
+ $tableProject = new Default_Model_Project();
+ return $tableProject->isProjectFeatured($project_id);
+ }
+
+}
\ No newline at end of file
diff --git a/application/modules/default/views/helpers/IsProjectOriginal.php \
b/application/modules/default/views/helpers/IsProjectOriginal.php new file mode 100755
index 00000000..859afd26
--- /dev/null
+++ b/application/modules/default/views/helpers/IsProjectOriginal.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * ocs-webserver
+ *
+ * Copyright 2016 by pling GmbH.
+ *
+ * This file is part of ocs-webserver.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+class Default_View_Helper_IsProjectOriginal extends Zend_View_Helper_Abstract
+{
+
+ /**
+ * @param int $project_id
+ * @return bool
+ */
+ public function isProjectOriginal($project_id)
+ {
+ $model = new Default_Model_Tags();
+ return $model->isProuductOriginal($project_id);
+ }
+
+}
\ No newline at end of file
diff --git a/application/modules/default/views/layout/layout_appimagehub.phtml \
b/application/modules/default/views/layout/layout_appimagehub.phtml index bc48afbf..07fd6c35 100755
--- a/application/modules/default/views/layout/layout_appimagehub.phtml
+++ b/application/modules/default/views/layout/layout_appimagehub.phtml
@@ -72,7 +72,7 @@
</head>
<body>
-<?php echo $this->render('partials/header/template.phtml'); ?>
+<?php echo $this->render('partials/header/template_react.phtml'); ?>
<?php echo $this->render('partials/flashMessage.phtml'); ?>
<?php echo $this->layout()->content; ?>
<?php echo $this->render('partials/footer/template.phtml'); ?>
diff --git a/application/modules/default/views/layout/layout_appimagehub_home.phtml \
b/application/modules/default/views/layout/layout_appimagehub_home.phtml index 89750a93..addc13c7 100755
--- a/application/modules/default/views/layout/layout_appimagehub_home.phtml
+++ b/application/modules/default/views/layout/layout_appimagehub_home.phtml
@@ -54,6 +54,8 @@
<script src="/theme/flatui/js/lib/jquery-3.2.1.min.js" ></script>
<script src="/theme/flatui/js/lib/bootstrap.min.js" ></script>
<script type="text/javascript" \
src="/theme/flatui/js/lib/tooltipster/dist/js/tooltipster.bundle.min.js"></script> + <script \
src="/theme/flatui/js/lib/moment.min.js"></script> + <script type="text/javascript" \
src="/tools/fancybox2.1.4/jquery.fancybox.pack.js?v=2.1.4"></script>
<script type="text/javascript" src="/theme/react/lib/react/react.js"></script>
<script type="text/javascript" src="/theme/react/lib/react-dom/react-dom.js"></script>
<script type="text/javascript" src="/theme/react/lib/redux/redux.min.js"></script>
@@ -65,7 +67,7 @@
</head>
<body>
-<?php echo $this->render('partials/header/template.phtml'); ?>
+<?php echo $this->render('partials/header/template_react.phtml'); ?>
<?php echo $this->render('partials/flashMessage.phtml'); ?>
<?php echo $this->layout()->content; ?>
<?php echo $this->render('partials/footer/template.phtml'); ?>
diff --git a/application/modules/default/views/scripts/partials/header/metaheader_react.phtml \
b/application/modules/default/views/scripts/partials/header/metaheader_react.phtml index \
52c171b3..49d9c0ce 100755
--- a/application/modules/default/views/scripts/partials/header/metaheader_react.phtml
+++ b/application/modules/default/views/scripts/partials/header/metaheader_react.phtml
@@ -25,140 +25,46 @@
$baseurl = Zend_Registry::get('config')->settings->client->default->baseurl;
$url_forum = Zend_Registry::get('config')->settings->client->default->url_forum;
$url_blog = Zend_Registry::get('config')->settings->client->default->url_blog;
+
+$sname = Zend_Registry::get('store_host');
+$json_menu = $this->fetchMetaheaderMenuJson();
$loginMember = $this->getAuthUser();
-$username = $loginMember->username;
-$profile_image_url = $loginMember->profile_image_url;
+if($loginMember->member_id)
+{
+ $json_user = Zend_Json::encode($loginMember);
+ $username = $loginMember->username;
+ $profile_image_url = $loginMember->profile_image_url;
+ $loginUrl = null;
+}else{
+ $json_user = Zend_Json::encode(null);
+ $username = null;
+ $profile_image_url = null;
+ $serverUrl = $this->serverUrl();
+ $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"]); + \
$loginUrl = $serverUrl.'/login'.(strpos($_SERVER["REQUEST_URI"], 'login')?'':$redirectString); +}
?>
<style>
-
- .nav-divider-pling{
- color:#E2E2E2;
- }
- .nav-pills > li + li {
- margin-left: 10px;
- }
- .dropdown-menu > li > a{
- font-size: 12px;
- }
- .metamenu .dropdown:hover .dropdown-menu {
- margin-left: -16px;
- }
- .metamenu .dropdown-menu li{
- width: 100%;
- }
-
- .metamenu ul.dropdown-menu li span{ color:#999; }
- .metamenu ul.dropdown-menu li.active span{ color:#eee; }
+ .nav-divider-pling{color:#E2E2E2;}
+ .nav-pills > li + li {margin-left: 10px;}
+ .dropdown-menu > li > a{font-size: 12px;}
+ .metamenu .dropdown:hover .dropdown-menu {margin-left: -16px;}
+ .metamenu .dropdown-menu li {width: 100%;}
+ .metamenu ul.dropdown-menu li span{ color:#999; }
+ .metamenu ul.dropdown-menu li.active span{ color:#eee; }
</style>
- <div class="small metamenu" >
- <?php
- $domainshelper = new Default_View_Helper_FetchDomains();
- $this->domainobjects = $domainshelper->fetchDomainObjects();
- $sname = Zend_Registry::get('store_host');
-
- echo '<ul class="nav nav-pills meta-nav-top left">';
- $i = 0;
-
- echo '<li>test</li><li class="" style="background-color:#eee; -moz-border-radius: 5px; \
border-radius: 5px; "><a href="http://'.$baseurl.'"><img src="/images/system/ocs-logo-rounded-16x16.png" \
class="logo"/> openDesktop.org :</a> </li>';
-
- $preOrder = 0;
- $curOrder = 0;
- foreach ($this->domainobjects as $obj) {
- $o = $obj['order'];
- //$curOrder = floor($obj['order']/1000);
- //if($curOrder<10 or $curOrder>50) continue;
- $curOrder = $obj['calcOrder'];
- $host =$obj['host'];
- $name =$obj['name'];
- if($curOrder!= $preOrder) $i=0;
-
- if($curOrder > $preOrder && $preOrder !=0){
- echo '</ul></li>';
- }
- if($i==0 && $preOrder !=0) echo '<li class="nav-divider-pling"> • </li>';
-
- if($curOrder ==9 && $i ==0){
- // Desktops
- echo '<li class="dropdown"><a href="#">Desktops</a><ul class="dropdown-menu">';
- }else if($curOrder==10 && $i==0){
- // applications
- echo '<li class="dropdown"><a href="#">Applications</a><ul class="dropdown-menu">';
- }else if($curOrder ==20 && $i ==0){
- // artworks
- echo '<li class="dropdown"><a href="#">Addons</a><ul class="dropdown-menu">';
- }/*else if($curOrder ==30 && $i ==0){
- // artworks
- echo '<li class="dropdown"><a href="#">Desktops</a><ul class="dropdown-menu">';
- }*/
- else if($curOrder ==40 && $i ==0){
- // multimedia
- echo '<li class="dropdown"><a href="#">Artwork</a><ul class="dropdown-menu">';
- }
- else if($curOrder ==50 && $i ==0){
- // multimedia
- echo '<li class="dropdown"><a href="#">Other</a><ul class="dropdown-menu">';
- }
- if($sname == $host )
- {
- echo '<li class="active">';
- }else
- {
- echo '<li>';
- }
- /*
- $keyword = $obj['meta_keywords'];
-
- if($keyword!='')
- {
- $keyword = ' - '.$keyword;
- }
- */
- // z.b 150001 ende ==1 go real link otherwise /s/$name
- $last_char_check = substr($o, -1);
-
- echo '<a href="http://' . ($last_char_check=='1'?$host:$baseurl.'/s/'.$name) . '">'. \
$name .'</a> </li>';
-
- //$preOrder = floor($obj['order']/1000);
- $preOrder =$obj['calcOrder'];
- $i++;
- }
- echo '</ul></li>';
- echo '</ul>';
+ <div id="metaheader"></div>
- ?>
+ <script>
+ var domains = <?=$json_menu?>;
+ var user = <?= $json_user ?>;
+ var baseUrl = "<?=$baseurl?>";
+ var blogUrl = "<?=$url_blog?>";
+ var loginUrl = "<?=$loginUrl?>";
+ var sName = "<?=$sname?>";
+ </script>
- <ul class="nav nav-pills meta-nav-top right" style="margin-right: 30px;">
- <li><a href="/community" > Community </a> </li>
- <li><a href="<?=$url_forum?>" target="_blank"> Forum</a> </li>
- <li><a href="<?=$url_blog?>" target="_blank"> Blog</a> </li>
- <li><a id="plingList" href="/plings" class="popuppanel"> What are Plings? </a> </li>
- <li><a id="ocsapiContent" href="/partials/ocsapicontent.phtml" class="popuppanel"> API \
</a> </li>
- <li> <a id="aboutContent" href="/partials/about.phtml" class="popuppanel">About </a> \
</li>
- <li id="user-dropdown-container">
- <div class="dropdown" id="user-dropdown">
- <button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" \
data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
- User
- <span class="caret"></span>
- </button>
- <ul class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenu1">
- <li id="user-info-menu-item">
- <div id="user-info-section">
- <div class="user-avatar">
- <div class="no-avatar-user-letter">U</div>
- </div>
- <div class="user-details">
- details
- </div>
- </div>
- </li>
- <li id="main-seperator" role="separator" class="divider"></li>
- <li><a href="#">Another action</a></li>
- <li><a href="#">Something else here</a></li>
- <li><a href="#">Separated link</a></li>
- </ul>
- </div>
- </li>
- </ul>
- </div>
+ <script type="text/javascript" src="/theme/react/metaheader.js"></script>
diff --git a/application/modules/default/views/scripts/product/add.phtml \
b/application/modules/default/views/scripts/product/add.phtml index 31e50e7b..3cf2d59d 100644
--- a/application/modules/default/views/scripts/product/add.phtml
+++ b/application/modules/default/views/scripts/product/add.phtml
@@ -123,6 +123,12 @@ $this->inlineScript()->appendScript('
section.body {
width: 100% !important;
}
+
+ #is_original-element
+ {
+ width: 25px;
+ float: left;
+ }
</style>
<main class="user-admin-page">
@@ -224,14 +230,15 @@ $this->inlineScript()->appendScript('
<?= $this->form->project_sub_subcategory_id ?>
<?= $this->form->description ?>
<?= $this->form->version ?>
- <?= $this->form->image_small ?>
- <?= $this->form->image_small_upload ?>
- <?php //$this->form->image_big ?>
- <?php //$this->form->image_big_upload ?>
- <?= $this->form->gallery ?>
- <?= $this->form->embed_code ?>
<?= $this->form->source_url ?>
+
+ <div class="form-group">
+ <div class="col-sm-12 margin-top-15">
+ <?= $this->form->is_original ?> Check this box, if this is your own \
original work and not based on something else + </div>
+ </div>
+
<?= $this->form->license_tag_id ?>
<?php
if($this->project_id)
@@ -246,19 +253,24 @@ $this->inlineScript()->appendScript('
<label class="form-label"> System Auto Tags</label>
</div>
<div class="col-sm-12">
- <?php
-
- echo $tagscat ;
- ?>
+ <?php echo $tagscat ; ?>
</div>
</div>
<?php
- }}
- ?>
+ }
+ }
+ ?>
<?= $this->form->tagsuser ?>
+ <?= $this->form->image_small ?>
+ <?= $this->form->image_small_upload ?>
+ <?php //$this->form->image_big ?>
+ <?php //$this->form->image_big_upload ?>
+ <?= $this->form->gallery ?>
+ <?= $this->form->embed_code ?>
+
<?= $this->form->link_1 ?>
<?= $this->form->facebook_code ?>
<?= $this->form->twitter_code ?>
diff --git a/application/modules/default/views/scripts/product/index.phtml \
b/application/modules/default/views/scripts/product/index.phtml index 55ec676d..a7614980 100644
--- a/application/modules/default/views/scripts/product/index.phtml
+++ b/application/modules/default/views/scripts/product/index.phtml
@@ -85,6 +85,8 @@ $this->likes = $tableProjectFollower->fetchLikesForProject($this->product->proje
$projectplings = new Default_Model_ProjectPlings();
$this->projectplings = $projectplings->fetchPlingsForProject($this->product->project_id);
+
+$tagmodel = new Default_Model_Tags();
?>
<!-- facebook -->
@@ -277,7 +279,8 @@ $this->projectplings = $projectplings->fetchPlingsForProject($this->product->pro
array('width' => 85, 'height' => 85, 'crop' => 'crop')); ?>"/>
</div>
<div style="margin-left: 95px">
- <p style="margin-bottom: 0px">
+
+ <div>
<?php if (false === empty($this->product->link_1)): ?><a
href="<?php echo $this->product->link_1; ?>"
target="_NEW"
@@ -287,6 +290,18 @@ $this->projectplings = $projectplings->fetchPlingsForProject($this->product->pro
<?php else : ?>
<?= $this->product->title; ?>
<?php endif; ?>
+
+ <?php
+ if($this->product->featured=='1'){
+ ?>
+ <span class=" label label-info right" style="font-size: \
13px;padding: .2em .6em .3em;"> Featured</span> + <?php }?>
+
+ <?php if($this->isProjectOriginal($this->product->project_id)){?>
+ <span class=" label label-info right" style="font-size: \
13px;padding: .2em .6em .3em;"> Original</span> + <?php }?> \
+
+ </div>
<p class="product_category" style="margin-bottom: 5px"> \
@@ -296,7 +311,7 @@ $this->projectplings = $projectplings->fetchPlingsForProject($this->product->pro
<?php
echo '<span class="topics">';
- $tagmodel = new Default_Model_Tags();
+
$tagsuser = $tagmodel->getTagsUser($this->product->project_id, \
Default_Model_Tags::TAG_TYPE_PROJECT); echo \
'<span class="topicslink">'; if(false === empty($tagsuser))
@@ -837,7 +852,7 @@ $this->projectplings = $projectplings->fetchPlingsForProject($this->product->pro
<div>
<?php
- $this->moreProducts = $tableProject->fetchMoreProjects($this->product, 8);
+ $this->moreProducts = $tableProject->fetchMoreProjects($this->product, 6);
$this->moreProductsTitle = 'More ' . $this->product->cat_title . ' from ' . \
$this->product->username;
if (count($this->moreProducts) > 0) {
@@ -847,7 +862,7 @@ $this->projectplings = $projectplings->fetchPlingsForProject($this->product->pro
<div>
<?php
- $this->moreProducts = \
$tableProject->fetchMoreProjectsOfOtherUsr($this->product, 8); + \
$this->moreProducts = $tableProject->fetchMoreProjectsOfOtherUsr($this->product, 6);
$this->moreProductsTitle = 'Other ' . $this->product->cat_title;
if (count($this->moreProducts) > 0) {
diff --git a/application/modules/default/views/scripts/product/partials/productMoreProductsWidgetV1.phtml \
b/application/modules/default/views/scripts/product/partials/productMoreProductsWidgetV1.phtml index \
a9912df2..639311cd 100644
--- a/application/modules/default/views/scripts/product/partials/productMoreProductsWidgetV1.phtml
+++ b/application/modules/default/views/scripts/product/partials/productMoreProductsWidgetV1.phtml
@@ -54,7 +54,7 @@ $helpBuildProductUrl = new Default_View_Helper_BuildProductUrl();
<a
href="<?= $helpBuildProductUrl->buildProductUrl($product->project_id) ?>"
title="<?= $product->title ?>">
- <img src="<?= $helpImage->Image($product->image_small, array('width' => 80, \
'height' => 80)); ?>" + <img src="<?= $helpImage->Image($product->image_small, \
array('width' => 200, 'height' => 200)); ?>" alt="product">
</a>
<!-- /product thumbnail -->
@@ -66,3 +66,4 @@ $helpBuildProductUrl = new Default_View_Helper_BuildProductUrl();
</div>
</div>
+
diff --git a/application/modules/default/views/scripts/user/aboutme.phtml \
b/application/modules/default/views/scripts/user/aboutme.phtml index c2f77428..06d4eadc 100644
--- a/application/modules/default/views/scripts/user/aboutme.phtml
+++ b/application/modules/default/views/scripts/user/aboutme.phtml
@@ -251,6 +251,11 @@ $isSupporter = $this->stat['donationIssupporter'];
<a href="#user-aboutme" data-toggle="tab" role="tab" \
aria-controls="user-aboutme" >
Products<?=($this->stat['cntProducts']>0?' \
('.$this->stat['cntProducts'].') ':'')?> </a>
+ </li>
+ <li role="presentation">
+ <a href="#user-featuredproducts" data-toggle="tab" role="tab" \
aria-controls="user-featuredproducts" > + \
Featured<?=($this->stat['cntFProducts']>0?' ('.$this->stat['cntFProducts'].') ':'')?> + \
</a> </li>
<?php /*
<li>
@@ -322,6 +327,19 @@ $isSupporter = $this->stat['donationIssupporter'];
</div>
<?php } ?>
</div>
+
+ <div role="tabpanel" class="tab-pane active" id="user-featuredproducts">
+ <?php
+ if($this->userFeaturedProducts)
+ {
+ $this->userProducts = $this->userFeaturedProducts;
+ }
+ if ($this->userProducts) { ?>
+ <div class="my-products-list" id="my-products-list"> \
+ <?php echo \
$this->render('user/partials/aboutme-products.phtml'); ?> + \
</div> + <?php } ?>
+ </div>
<?php /*
<div role="tabpanel" class="tab-pane " id="user-supports">
diff --git a/httpdocs/theme/flatui/css/stylesheet.css b/httpdocs/theme/flatui/css/stylesheet.css
index fad5af49..34723d5f 100644
--- a/httpdocs/theme/flatui/css/stylesheet.css
+++ b/httpdocs/theme/flatui/css/stylesheet.css
@@ -1 +1 @@
-.bg_sheet{background-image:url(../img/bg_sheet.png)}.bg_sheet_statistics{background-image:url(../img/stat \
istics_sheet.png)}.unstyled_list{list-style-type:none;padding:0;margin:0}.hand-with-coin{display:inline-bl \
ock;background-image:url(../img/new/button/hand-w-coin.png);height:61px;width:61px}.hand-with-coin.v-2{bac \
kground-image:url(../img/new/button/hand-w-coin-2.png)}@font-face{font-family:'Open \
Sans';font-style:normal;font-weight:300;src:local('Open Sans \
Light'),local('OpenSans-Light'),url(../css/fonts/open-sans-v15-latin-300.woff2) \
format('woff2'),url(../css/fonts/open-sans-v15-latin-300.woff) \
format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:local('Open Sans \
Regular'),local('OpenSans-Regular'),url(../css/fonts/open-sans-v15-latin-regular.woff2) \
format('woff2'),url(../css/fonts/open-sans-v15-latin-regular.woff) \
format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:600;src:local('Open Sans \
SemiBold'),local('OpenSans-SemiBold'),url(../css/fonts/open-sans-v15-latin-600.woff2) \
format('woff2'),url(../css/fonts/open-sans-v15-latin-600.woff) \
format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:700;src:local('Open Sans \
Bold'),local('OpenSans-Bold'),url(../css/fonts/open-sans-v15-latin-700.woff2) \
format('woff2'),url(../css/fonts/open-sans-v15-latin-700.woff) \
format('woff')}body{color:#32353d;overflow-y:scroll;font-size:1.5em;line-height:1.231;color:#4e4e4e;font-family:'Open \
Sans',sans-serif;font-size:medium}footer,header,main,section{width:100%;float:left}footer \
section.wrapper,header section.wrapper,main section.wrapper,section \
section.wrapper{margin-left:auto;margin-right:auto;width:95%;float:none;height:auto}a{text-decoration:none;color:#2673b0;-webkit-transition:all \
.2s ease-out;-moz-transition:all .2s ease-out;-ms-transition:all .2s ease-out;-o-transition:all .2s \
ease-out}a:hover{text-decoration:none}a:focus{outline:0}button::-moz-focus-inner{border:0}button,input,sel \
ect,textarea{font-family:Lato,sans-serif;font-size:14px}h1{font-size:32px;font-weight:900}h3{font-size:24p \
x;font-weight:700;margin-bottom:4px;margin-top:2px}h5{font-size:16px;font-weight:500;text-transform:uppercase}@media \
(max-width:1200px) and (min-width:992px){footer section.wrapper,header section.wrapper,main \
section.wrapper{width:95%;margin-left:2.5%;margin-right:2.5%}}.btn{background:#bdc3c7 none repeat scroll \
0 0;border:medium none;border-radius:6px;box-shadow:none;color:#fff;line-height:22px;padding:9px 12px \
10px;text-decoration:none;text-shadow:none;-webkit-transition:all .2 ease-out;-moz-transition:all .2 \
ease-out;-ms-transition:all .2 ease-out;-o-transition:all .2 \
ease-out}.btn.btn-large{font-size:17px;line-height:20px;padding:12px 18px \
13px}.btn.btn-native{background-color:#2673b0;color:#fff}.btn.btn-pling-red{background-color:#e84310}.btn. \
btn-pling-green{background-color:green}.btn.btn-purple{background:#9b59b6;padding:10px \
35px}.btn.btn-file-dropzone{font-size:10px;padding:8px 10px \
10px;line-height:10px}.btn.btn-file-action{font-size:12px;padding:8px 10px \
10px;line-height:16px;margin-left:5px}.pling-danger{background:#C9302C none repeat scroll 0 \
0}.standard-form input{height:41px}.standard-form input,.standard-form select,.standard-form \
textarea{border:1px solid \
#bdc3c7;padding:0;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-webkit-background-cl \
ip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.standard-form \
.field{margin-bottom:15px}.icon-facebook,.icon-google,.icon-twitter{width:40px;height:40px;cursor:pointer; \
display:inline-block;background-image:url(../img/bg_sheet.png)}.icon-facebook{background-position:0 \
-105px}.icon-twitter{background-position:-40px \
-105px}.lightblue{color:#2673b0}.small{font-size:12px}.large{font-size:18px}.relative{position:relative}.a \
bsolute{position:absolute}.light{font-weight:300}.lightgrey{color:#95a5a6}.center{text-align:center}i.myfa \
v{color:#8e44ad}h1.page-title{color:#34495e;font-weight:700;font-size:32px}.modal{overflow-y:hidden}.right \
{float:right}.left{float:left}em.icon{display:inline-block;background-image:url(../img/bg_sheet.png)}em.icon.info-icon{width:31px;height:30px;background-position:-289px \
-64px}.margin-bottom-10{margin-bottom:10px}.margin-top-15{margin-top:15px}.full-width{width:100%!important \
}.progress{height:8px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-background-clip \
:padding-box;-moz-background-clip:padding;background-clip:padding-box;margin-bottom:0}.opendesktopwidgetpa \
ger{display:flex;justify-content:right;align-items:center;justify-content:flex-end}.opendesktopwidgetpager \
ul.opendesktopwidgetpager{display:inline-block;padding-left:0;margin:20px \
0;border-radius:4px}.opendesktopwidgetpager \
ul.opendesktopwidgetpager>li{display:inline}.opendesktopwidgetpager \
ul.opendesktopwidgetpager>li>span{cursor:pointer;position:relative;float:left;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px \
solid #ddd;padding:5px 10px;font-size:12px}.opendesktopwidgetpager \
ul.opendesktopwidgetpager>.active>span{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.metamenu{width:100%;background-color:#fff;height:15px}.metamenu \
a#toggleStoreBtn{float:left;margin-left:20px;text-decoration:none}.metamenu \
a.home-link{float:left}.metamenu a.home-link img.logo{width:16px;height:16px}.meta-nav-top>li>a{padding:0 \
5px;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-ms-transition:all .2s \
ease-out;-o-transition:all .2s ease-out}.meta-nav-top>li>a#ocs-stores \
img{width:16px;height:16px}ul.meta-nav-top{list-style:none}ul.meta-nav-top \
li{float:left}ul.meta-nav-top-right{margin:0;margin-right:30px;float:right}ul.meta-nav-top-right \
li{padding:0 10px}ul.meta-nav-top-left{float:left}#toggleStoreContainer{z-index:1000;display:none;width:60%;height:200px;top:12px;left:190px}#toggleStoreContainer \
a{display:block;font-size:16px}#toggleStoreContainer a:hover{color:#6a7686}#toggleStoreContainer \
b{text-decoration:underline;text-align:center;padding-left:20px;font-size:18px;cursor:default}#toggleStoreContainer \
ul{list-style:none;padding:0;padding-top:10px;padding-left:30px}#toggleStoreContainer ul \
li{font-size:14px}#toggleStoreContainer ul li:hover{background-color:transparent}header \
nav{border-bottom:transparent}header#page_header{color:#6a7686;height:auto;font-size:10pt;font-weight:400;width:100%;font-family:Arial,sans-serif}header#page_header \
nav#nav-top{margin-left:130px;width:84%}header \
.dropdown-header{width:175px;height:12px;background-image:url(../img/bg_sheet.png);background-position:-385px \
0}header a{color:#fff}header .pull-left,header .pull-right{padding:0}header ul{margin-bottom:0}header \
ul.menu-icon{float:right;display:none}header ul \
li{list-style:none;display:inline-block;margin:0;cursor:pointer;position:relative;height:40px;line-height:40px;float:left}header \
ul li a{float:left;display:block;height:inherit;line-height:inherit;padding:0 20px}header ul \
li.profile-menu-container{padding-top:0;padding-left:40px}header ul li.profile-menu-container \
.header-profile-image{top:50%;left:10px;height:30px;width:30px;margin-top:-15px}header ul \
li.profile-menu-container .header-profile-image \
.supporter-badge{position:absolute;left:0;bottom:0;background:#EE6E09;text-align:center;border-radius:30px \
30px 30px 30px;color:#fff;padding:5px 10px;font-size:12px}header ul li.profile-menu-container \
.header-profile-image \
img{height:30px;width:30px;float:left;-webkit-border-radius:999px;-moz-border-radius:999px;border-radius:9 \
99px;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}header \
ul li.profile-menu-container>a{display:block}header ul li \
ul{width:165px;margin-left:0;position:absolute;left:-9999px;top:45px;border:none;font-size:14px;color:#7f8 \
c8d;font-weight:400;padding:0;z-index:10000;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius \
:5px;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}header \
ul li ul.active{left:0;top:40px}header ul li ul \
li{text-align:left;display:block;width:100%;background:#ecf0f1;margin:0;padding:0;height:40px;border-bottom:1px \
solid #d6d7d9}header ul li ul li.first,header ul li ul li:first-of-type{-webkit-border-radius:5px 5px 0 \
0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 \
0;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}header ul \
li ul li:last-of-type{-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 \
5px 5px;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}header \
ul li ul li a{color:#6a7686;text-align:left;height:40px;line-height:40px}header \
.container{margin-left:auto;margin-right:auto;float:none;height:auto;width:100%;background-color:#e2e2e2}header \
.container.header{margin-left:auto;margin-right:auto;float:none;width:100%}header .container.header \
section.container{background-color:transparent}header .container.header \
section.container.backLink{background-color:#729ECD!important;height:30px}header .container.header \
section.container.backLink h4 a:hover{color:#1d1d1d}header .container.header section.container \
section.wrapper{height:40px;padding-left:80px;position:relative}header .container.header \
section.container+section.container{background-color:transparent;padding-left:0}header .container.header \
section.container+section.container>section.wrapper{padding-left:242px;height:50px}header \
.container.header nav{border-bottom:transparent}header .container.header nav \
#search{height:25px;padding:0;margin:6.5px 15px;line-height:25px;position:relative}header \
.container.header nav #search input.content-search{width:16em;height:25px;padding:0;border:1px solid \
#fff;margin-bottom:-1px;padding-right:30px;text-indent:5px;color:#6a7686;float:left;border-radius:6px;box-shadow:none}header \
.container.header nav #search \
div.icon-search-input{top:2px;right:0;width:25px;height:25px;background-image:url(/theme/flatui/img/icon-search-input-2.png);background-position:center \
center;position:absolute;cursor:pointer}header .container.header \
ul.menu-nav-tabs{bottom:0;display:inline-table;list-style-type:none;margin:0;padding:0;position:absolute;z \
-index:999}.pling-nav-tabs-a{border:0;position:relative;color:#777;font-size:13px;transition:color \
0s;bottom:-1px;border-bottom-width:2px;border-bottom-style:solid;border-bottom-color:transparent;background-color:transparent}.pling-nav-tabs \
ul.nav-tabs>li{background-color:transparent;margin-bottom:0}.pling-nav-tabs \
ul.nav-tabs>li>a{border:0;position:relative;color:#777;font-size:13px;transition:color \
0s;bottom:-1px;border-bottom-width:2px;border-bottom-style:solid;border-bottom-color:transparent;background-color:transparent}.pling-nav-tabs \
ul.nav-tabs>li>a:hover{border:0;position:relative;color:#777;font-size:13px;transition:color \
0s;bottom:-1px;border-bottom-width:2px;border-bottom-style:solid;border-bottom-color:transparent;background-color:transparent;color:#2673b0}.pling-nav-tabs \
ul.nav-tabs>li>a:hover svg{fill:#2673b0}.pling-nav-tabs \
ul.nav-tabs>li>a:focus{border:0;position:relative;color:#777;font-size:13px;transition:color \
0s;bottom:-1px;border-bottom-width:2px;border-bottom-style:solid;border-bottom-color:transparent;background-color:transparent}.pling-nav-tabs \
ul.nav-tabs>li svg{fill:#777}.pling-nav-tabs \
ul.nav-tabs>li.active>a{border:0;position:relative;color:#777;font-size:13px;transition:color \
0s;bottom:-1px;border-bottom-width:2px;border-bottom-style:solid;border-bottom-color:transparent;backgroun \
d-color:transparent;color:#2673b0;border-bottom-color:#2673b0;font-weight:700}.pling-nav-tabs \
ul.nav-tabs>li.active>a:hover{border:0;position:relative;color:#777;font-size:13px;transition:color \
0s;bottom:-1px;border-bottom-width:2px;border-bottom-style:solid;border-bottom-color:transparent;backgroun \
d-color:transparent;color:#2673b0;border-bottom-color:#2673b0;font-weight:700}.pling-nav-tabs \
ul.nav-tabs>li.active>a:focus{border:0;position:relative;color:#777;font-size:13px;transition:color \
0s;bottom:-1px;border-bottom-width:2px;border-bottom-style:solid;border-bottom-color:transparent;backgroun \
d-color:transparent;color:#2673b0;border-bottom-color:#2673b0;font-weight:700}.pling-nav-tabs \
ul.nav-tabs>li.active svg{fill:#2673b0}footer{width:100%;float:left;padding:12px 0;border-bottom:5px \
solid #2673b0;border-top:1px solid #a9a9a9;background-color:#dcdcdc;font-size:9pt}footer \
h3{font-weight:400}footer h3#footer-heading{font-size:1.3em;margin:0}footer nav#footer-nav \
ul{margin-top:1em;list-style:none;padding:0;margin-right:1em;float:left;width:auto;margin-bottom:.2em}footer \
nav#footer-nav ul li{display:inline-block;margin-right:0;font-size:1em}footer nav#footer-nav ul li \
a{color:#666;font-weight:400}footer nav#footer-nav ul li+li{margin-left:10px}footer \
h3#footer-social-heading{color:#666;font-size:1em;margin:0 0 .4em 0}footer \
#footer-social{float:right}footer #footer-social a{width:30px;display:block;float:left}footer \
#footer-social a+a{margin-left:2px}footer section.wrapper .pull-left{padding:0}footer section.wrapper \
.pull-right{padding:0}body.home-page main section.wrapper .container{padding:150px \
0;height:auto;float:none;max-width:95%;width:95%}body.home-page main section.wrapper#intro \
.container{padding-bottom:50px}body.home-page main section.wrapper#intro .container \
article{text-align:center;width:100%}body.home-page main section.wrapper#intro .container \
article>*{margin-bottom:40px}body.home-page main section.wrapper#intro .container article \
h2{font-size:40px;font-weight:700;margin-bottom:20px}body.home-page main section.wrapper#intro .container \
article h3{font-size:30px;font-weight:700;margin-top:2px}body.home-page main section.wrapper#intro \
.container article p{margin-bottom:0;text-align:center}body.home-page main \
section#cat-list{border-top:1px solid #cdd7dd}body.home-page main \
.card-wrapper{position:relative;max-width:960px;margin:auto;margin-bottom:2rem;background:#fff}body.home-page \
main .card-wrapper .card-item{position:absolute;padding:1rem;width:31.4%;border:1px solid \
gray;border-radius:7px}body.home-page main .card-wrapper .card-item .category \
a.title{font-size:14pt;font-weight:600;min-height:30px;line-height:30px;padding-right:30px}body.home-page \
main .card-wrapper .card-item .category a.title span.label{padding:2px 3px}body.home-page main \
.card-wrapper .card-item div \
a.title{font-size:11pt;min-height:20px;line-height:20px;padding-right:5px}body.home-page main \
.card-wrapper .card-item div a.title \
span.label{font-size:7pt;font-weight:300;vertical-align:top;margin-left:5px;padding:1px \
3px}.card-item{border:1px solid gray}.card-item .category>a.title{color:#444}.card-item \
div>a.title{color:#6a6a6a}#indeximages{line-height:0;-webkit-column-count:20;-webkit-column-gap:0;-moz-column-count:20;-moz-column-gap:0;column-count:20;column-gap:0}#indeximages \
img{width:100%!important;height:auto!important;opacity:1}@media \
(max-width:1920px){#indeximages{-moz-column-count:20;-webkit-column-count:20;column-count:20}}@media \
(max-width:1200px){#indeximages{-moz-column-count:15;-webkit-column-count:4;column-count:4}}@media \
(max-width:1000px){#indeximages{-moz-column-count:12;-webkit-column-count:3;column-count:3}}@media \
(max-width:800px){#indeximages{-moz-column-count:9;-webkit-column-count:2;column-count:2}}@media \
(max-width:400px){#indeximages{-moz-column-count:7;-webkit-column-count:1;column-count:1}}#products-wrappe \
r{padding-top:20px}.explore-products{padding-left:30px;padding-right:30px;margin-top:-10px}.explore-products \
.product-list{width:100%;float:left;padding:0 10px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 \
0 5px 5px;border-radius:0 0 5px \
5px;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.explore-products \
.product-list .explore-product{padding:10px 0;font-size:12px;border-top:1px solid #ccc}.explore-products \
.product-list .explore-product .rownum{font-size:12px;float:left}.explore-products .product-list \
.explore-product .explore-product-imgcolumn{padding-left:5px;padding-right:5px}.explore-products \
.product-list .explore-product \
.imageContainer{height:167px;display:flex;justify-content:center;align-items:center}.explore-products \
.product-list .explore-product .explore-product-image{max-width:95%;max-height:167px}.explore-products \
.product-list .explore-product .contentLeft{float:left;padding-right:0;width:270px}.explore-products \
.product-list .explore-product .contentLeft img{max-width:167px;max-height:167px}.explore-products \
.product-list .explore-product .contentLeft div.productimg{width:167px;height:167px}.explore-products \
.product-list .explore-product .explore-product-details{padding-left:20px}.explore-products .product-list \
.explore-product .explore-product-details \
h3{font-size:24px;font-weight:700;color:#2673b0}.explore-products .product-list .explore-product \
.explore-product-details h3 span.version{font-size:smaller;padding-left:20px}.explore-products \
.product-list .explore-product .explore-product-details \
.title{display:block;margin-bottom:8px}.explore-products .product-list .explore-product \
.explore-product-details .title .username{padding-left:20px}.explore-products .product-list \
.explore-product .explore-product-details .description{display:block;margin-bottom:8px}.explore-products \
.product-list .explore-product .explore-product-details \
.packagetypes{display:block;float:left}.explore-products .product-list .explore-product \
.explore-product-details .packagetypes .packagetypeos{width:100px;float:left}.explore-products \
.product-list .explore-product .explore-product-details \
.productInfo{clear:left;padding-top:5px}.explore-products .product-list .explore-product \
.explore-product-details .productInfo span.cntSupporters{padding-right:20px}.explore-products \
.product-list .explore-product .explore-product-plings{padding:0}.explore-products .product-list \
.explore-product .explore-product-plings .rating{width:50%}.explore-products .product-list \
.explore-product .explore-product-plings \
.progress{margin-bottom:10px;padding:3px;opacity:0;margin-bottom:0;height:12px;opacity:1;background-color:transparent;box-shadow:none;padding:2px}.explore-products \
.product-list .explore-product .explore-product-plings .progress \
.bar{width:4px;max-width:100%;height:14px;background-color:#2673b0;-webkit-border-radius:5px;-moz-border-r \
adius:5px;border-radius:5px;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;-webkit-box-shadow:inset \
0 6px 0 rgba(255,255,255,.2);-moz-box-shadow:inset 0 6px 0 rgba(255,255,255,.2);box-shadow:inset 0 6px 0 \
rgba(255,255,255,.2)}.explore-products .product-list .explore-product .explore-product-plings .progress \
.bar.no-goal{width:50%;opacity:0}.explore-products .product-list .explore-product .explore-product-plings \
\ No newline at end of file
+.bg_sheet{background-image:url(../img/bg_sheet.png)}.bg_sheet_statistics{background-image:url(../img/stat \
istics_sheet.png)}.unstyled_list{list-style-type:none;padding:0;margin:0}.hand-with-coin{display:inline-bl \
ock;background-image:url(../img/new/button/hand-w-coin.png);height:61px;width:61px}.hand-with-coin.v-2{bac \
kground-image:url(../img/new/button/hand-w-coin-2.png)}@font-face{font-family:'Open \
Sans';font-style:normal;font-weight:300;src:local('Open Sans \
Light'),local('OpenSans-Light'),url(../css/fonts/open-sans-v15-latin-300.woff2) \
format('woff2'),url(../css/fonts/open-sans-v15-latin-300.woff) \
format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:local('Open Sans \
Regular'),local('OpenSans-Regular'),url(../css/fonts/open-sans-v15-latin-regular.woff2) \
format('woff2'),url(../css/fonts/open-sans-v15-latin-regular.woff) \
format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:600;src:local('Open Sans \
SemiBold'),local('OpenSans-SemiBold'),url(../css/fonts/open-sans-v15-latin-600.woff2) \
format('woff2'),url(../css/fonts/open-sans-v15-latin-600.woff) \
format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:700;src:local('Open Sans \
Bold'),local('OpenSans-Bold'),url(../css/fonts/open-sans-v15-latin-700.woff2) \
format('woff2'),url(../css/fonts/open-sans-v15-latin-700.woff) \
format('woff')}body{color:#32353d;overflow-y:scroll;font-size:1.5em;line-height:1.231;color:#4e4e4e;font-family:'Open \
Sans',sans-serif;font-size:medium}footer,header,main,section{width:100%;float:left}footer \
section.wrapper,header section.wrapper,main section.wrapper,section \
section.wrapper{margin-left:auto;margin-right:auto;width:95%;float:none;height:auto}a{text-decoration:none;color:#2673b0;-webkit-transition:all \
.2s ease-out;-moz-transition:all .2s ease-out;-ms-transition:all .2s ease-out;-o-transition:all .2s \
ease-out}a:hover{text-decoration:none}a:focus{outline:0}button::-moz-focus-inner{border:0}button,input,sel \
ect,textarea{font-family:Lato,sans-serif;font-size:14px}h1{font-size:32px;font-weight:900}h3{font-size:24p \
x;font-weight:700;margin-bottom:4px;margin-top:2px}h5{font-size:16px;font-weight:500;text-transform:uppercase}@media \
(max-width:1200px) and (min-width:992px){footer section.wrapper,header section.wrapper,main \
section.wrapper{width:95%;margin-left:2.5%;margin-right:2.5%}}.btn{background:#bdc3c7 none repeat scroll \
0 0;border:medium none;border-radius:6px;box-shadow:none;color:#fff;line-height:22px;padding:9px 12px \
10px;text-decoration:none;text-shadow:none;-webkit-transition:all .2 ease-out;-moz-transition:all .2 \
ease-out;-ms-transition:all .2 ease-out;-o-transition:all .2 \
ease-out}.btn.btn-large{font-size:17px;line-height:20px;padding:12px 18px \
13px}.btn.btn-native{background-color:#2673b0;color:#fff}.btn.btn-pling-red{background-color:#e84310}.btn. \
btn-pling-green{background-color:green}.btn.btn-purple{background:#9b59b6;padding:10px \
35px}.btn.btn-file-dropzone{font-size:10px;padding:8px 10px \
10px;line-height:10px}.btn.btn-file-action{font-size:12px;padding:8px 10px \
10px;line-height:16px;margin-left:5px}.pling-danger{background:#C9302C none repeat scroll 0 \
0}.standard-form input{height:41px}.standard-form input,.standard-form select,.standard-form \
textarea{border:1px solid \
#bdc3c7;padding:0;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-webkit-background-cl \
ip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.standard-form \
.field{margin-bottom:15px}.icon-facebook,.icon-google,.icon-twitter{width:40px;height:40px;cursor:pointer; \
display:inline-block;background-image:url(../img/bg_sheet.png)}.icon-facebook{background-position:0 \
-105px}.icon-twitter{background-position:-40px \
-105px}.lightblue{color:#2673b0}.small{font-size:12px}.large{font-size:18px}.relative{position:relative}.a \
bsolute{position:absolute}.light{font-weight:300}.lightgrey{color:#95a5a6}.center{text-align:center}i.myfa \
v{color:#8e44ad}h1.page-title{color:#34495e;font-weight:700;font-size:32px}.modal{overflow-y:hidden}.right \
{float:right}.left{float:left}em.icon{display:inline-block;background-image:url(../img/bg_sheet.png)}em.icon.info-icon{width:31px;height:30px;background-position:-289px \
-64px}.margin-bottom-10{margin-bottom:10px}.margin-top-15{margin-top:15px}.full-width{width:100%!important \
}.progress{height:8px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-background-clip \
:padding-box;-moz-background-clip:padding;background-clip:padding-box;margin-bottom:0}.opendesktopwidgetpa \
ger{display:flex;justify-content:right;align-items:center;justify-content:flex-end}.opendesktopwidgetpager \
ul.opendesktopwidgetpager{display:inline-block;padding-left:0;margin:20px \
0;border-radius:4px}.opendesktopwidgetpager \
ul.opendesktopwidgetpager>li{display:inline}.opendesktopwidgetpager \
ul.opendesktopwidgetpager>li>span{cursor:pointer;position:relative;float:left;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px \
solid #ddd;padding:5px 10px;font-size:12px}.opendesktopwidgetpager \
ul.opendesktopwidgetpager>.active>span{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.metamenu{width:100%;background-color:#fff;height:15px}.metamenu \
a#toggleStoreBtn{float:left;margin-left:20px;text-decoration:none}.metamenu \
a.home-link{float:left}.metamenu a.home-link img.logo{width:16px;height:16px}.meta-nav-top>li>a{padding:0 \
5px;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-ms-transition:all .2s \
ease-out;-o-transition:all .2s ease-out}.meta-nav-top>li>a#ocs-stores \
img{width:16px;height:16px}ul.meta-nav-top{list-style:none}ul.meta-nav-top \
li{float:left}ul.meta-nav-top-right{margin:0;margin-right:30px;float:right}ul.meta-nav-top-right \
li{padding:0 10px}ul.meta-nav-top-left{float:left}#toggleStoreContainer{z-index:1000;display:none;width:60%;height:200px;top:12px;left:190px}#toggleStoreContainer \
a{display:block;font-size:16px}#toggleStoreContainer a:hover{color:#6a7686}#toggleStoreContainer \
b{text-decoration:underline;text-align:center;padding-left:20px;font-size:18px;cursor:default}#toggleStoreContainer \
ul{list-style:none;padding:0;padding-top:10px;padding-left:30px}#toggleStoreContainer ul \
li{font-size:14px}#toggleStoreContainer ul li:hover{background-color:transparent}header \
nav{border-bottom:transparent}header#page_header{color:#6a7686;height:auto;font-size:10pt;font-weight:400;width:100%;font-family:Arial,sans-serif}header#page_header \
nav#nav-top{margin-left:130px;width:84%}header \
.dropdown-header{width:175px;height:12px;background-image:url(../img/bg_sheet.png);background-position:-385px \
0}header a{color:#fff}header .pull-left,header .pull-right{padding:0}header ul{margin-bottom:0}header \
ul.menu-icon{float:right;display:none}header ul \
li{list-style:none;display:inline-block;margin:0;cursor:pointer;position:relative;height:40px;line-height:40px;float:left}header \
ul li a{float:left;display:block;height:inherit;line-height:inherit;padding:0 20px}header ul \
li.profile-menu-container{padding-top:0;padding-left:40px}header ul li.profile-menu-container \
.header-profile-image{top:50%;left:10px;height:30px;width:30px;margin-top:-15px}header ul \
li.profile-menu-container .header-profile-image \
.supporter-badge{position:absolute;left:0;bottom:0;background:#EE6E09;text-align:center;border-radius:30px \
30px 30px 30px;color:#fff;padding:5px 10px;font-size:12px}header ul li.profile-menu-container \
.header-profile-image \
img{height:30px;width:30px;float:left;-webkit-border-radius:999px;-moz-border-radius:999px;border-radius:9 \
99px;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}header \
ul li.profile-menu-container>a{display:block}header ul li \
ul{width:165px;margin-left:0;position:absolute;left:-9999px;top:45px;border:none;font-size:14px;color:#7f8 \
c8d;font-weight:400;padding:0;z-index:10000;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius \
:5px;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}header \
ul li ul.active{left:0;top:40px}header ul li ul \
li{text-align:left;display:block;width:100%;background:#ecf0f1;margin:0;padding:0;height:40px;border-bottom:1px \
solid #d6d7d9}header ul li ul li.first,header ul li ul li:first-of-type{-webkit-border-radius:5px 5px 0 \
0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 \
0;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}header ul \
li ul li:last-of-type{-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 \
5px 5px;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}header \
ul li ul li a{color:#6a7686;text-align:left;height:40px;line-height:40px}header \
.container{margin-left:auto;margin-right:auto;float:none;height:auto;width:100%;background-color:#e2e2e2}header \
.container.header{margin-left:auto;margin-right:auto;float:none;width:100%}header .container.header \
section.container{background-color:transparent}header .container.header \
section.container.backLink{background-color:#729ECD!important;height:30px}header .container.header \
section.container.backLink h4 a:hover{color:#1d1d1d}header .container.header section.container \
section.wrapper{height:40px;padding-left:80px;position:relative}header .container.header \
section.container+section.container{background-color:transparent;padding-left:0}header .container.header \
section.container+section.container>section.wrapper{padding-left:242px;height:50px}header \
.container.header nav{border-bottom:transparent}header .container.header nav \
#search{height:25px;padding:0;margin:6.5px 15px;line-height:25px;position:relative}header \
.container.header nav #search input.content-search{width:16em;height:25px;padding:0;border:1px solid \
#fff;margin-bottom:-1px;padding-right:30px;text-indent:5px;color:#6a7686;float:left;border-radius:6px;box-shadow:none}header \
.container.header nav #search \
div.icon-search-input{top:2px;right:0;width:25px;height:25px;background-image:url(/theme/flatui/img/icon-search-input-2.png);background-position:center \
center;position:absolute;cursor:pointer}header .container.header \
ul.menu-nav-tabs{bottom:0;display:inline-table;list-style-type:none;margin:0;padding:0;position:absolute;z \
-index:999}.pling-nav-tabs-a{border:0;position:relative;color:#777;font-size:13px;transition:color \
0s;bottom:-1px;border-bottom-width:2px;border-bottom-style:solid;border-bottom-color:transparent;background-color:transparent}.pling-nav-tabs \
ul.nav-tabs>li{background-color:transparent;margin-bottom:0}.pling-nav-tabs \
ul.nav-tabs>li>a{border:0;position:relative;color:#777;font-size:13px;transition:color \
0s;bottom:-1px;border-bottom-width:2px;border-bottom-style:solid;border-bottom-color:transparent;background-color:transparent}.pling-nav-tabs \
ul.nav-tabs>li>a:hover{border:0;position:relative;color:#777;font-size:13px;transition:color \
0s;bottom:-1px;border-bottom-width:2px;border-bottom-style:solid;border-bottom-color:transparent;background-color:transparent;color:#2673b0}.pling-nav-tabs \
ul.nav-tabs>li>a:hover svg{fill:#2673b0}.pling-nav-tabs \
ul.nav-tabs>li>a:focus{border:0;position:relative;color:#777;font-size:13px;transition:color \
0s;bottom:-1px;border-bottom-width:2px;border-bottom-style:solid;border-bottom-color:transparent;background-color:transparent}.pling-nav-tabs \
ul.nav-tabs>li svg{fill:#777}.pling-nav-tabs \
ul.nav-tabs>li.active>a{border:0;position:relative;color:#777;font-size:13px;transition:color \
0s;bottom:-1px;border-bottom-width:2px;border-bottom-style:solid;border-bottom-color:transparent;backgroun \
d-color:transparent;color:#2673b0;border-bottom-color:#2673b0;font-weight:700}.pling-nav-tabs \
ul.nav-tabs>li.active>a:hover{border:0;position:relative;color:#777;font-size:13px;transition:color \
0s;bottom:-1px;border-bottom-width:2px;border-bottom-style:solid;border-bottom-color:transparent;backgroun \
d-color:transparent;color:#2673b0;border-bottom-color:#2673b0;font-weight:700}.pling-nav-tabs \
ul.nav-tabs>li.active>a:focus{border:0;position:relative;color:#777;font-size:13px;transition:color \
0s;bottom:-1px;border-bottom-width:2px;border-bottom-style:solid;border-bottom-color:transparent;backgroun \
d-color:transparent;color:#2673b0;border-bottom-color:#2673b0;font-weight:700}.pling-nav-tabs \
ul.nav-tabs>li.active svg{fill:#2673b0}footer{width:100%;float:left;padding:12px 0;border-bottom:5px \
solid #2673b0;border-top:1px solid #a9a9a9;background-color:#dcdcdc;font-size:9pt}footer \
h3{font-weight:400}footer h3#footer-heading{font-size:1.3em;margin:0}footer nav#footer-nav \
ul{margin-top:1em;list-style:none;padding:0;margin-right:1em;float:left;width:auto;margin-bottom:.2em}footer \
nav#footer-nav ul li{display:inline-block;margin-right:0;font-size:1em}footer nav#footer-nav ul li \
a{color:#666;font-weight:400}footer nav#footer-nav ul li+li{margin-left:10px}footer \
h3#footer-social-heading{color:#666;font-size:1em;margin:0 0 .4em 0}footer \
#footer-social{float:right}footer #footer-social a{width:30px;display:block;float:left}footer \
#footer-social a+a{margin-left:2px}footer section.wrapper .pull-left{padding:0}footer section.wrapper \
.pull-right{padding:0}body.home-page main section.wrapper .container{padding:150px \
0;height:auto;float:none;max-width:95%;width:95%}body.home-page main section.wrapper#intro \
.container{padding-bottom:50px}body.home-page main section.wrapper#intro .container \
article{text-align:center;width:100%}body.home-page main section.wrapper#intro .container \
article>*{margin-bottom:40px}body.home-page main section.wrapper#intro .container article \
h2{font-size:40px;font-weight:700;margin-bottom:20px}body.home-page main section.wrapper#intro .container \
article h3{font-size:30px;font-weight:700;margin-top:2px}body.home-page main section.wrapper#intro \
.container article p{margin-bottom:0;text-align:center}body.home-page main \
section#cat-list{border-top:1px solid #cdd7dd}body.home-page main \
.card-wrapper{position:relative;max-width:960px;margin:auto;margin-bottom:2rem;background:#fff}body.home-page \
main .card-wrapper .card-item{position:absolute;padding:1rem;width:31.4%;border:1px solid \
gray;border-radius:7px}body.home-page main .card-wrapper .card-item .category \
a.title{font-size:14pt;font-weight:600;min-height:30px;line-height:30px;padding-right:30px}body.home-page \
main .card-wrapper .card-item .category a.title span.label{padding:2px 3px}body.home-page main \
.card-wrapper .card-item div \
a.title{font-size:11pt;min-height:20px;line-height:20px;padding-right:5px}body.home-page main \
.card-wrapper .card-item div a.title \
span.label{font-size:7pt;font-weight:300;vertical-align:top;margin-left:5px;padding:1px \
3px}.card-item{border:1px solid gray}.card-item .category>a.title{color:#444}.card-item \
div>a.title{color:#6a6a6a}#indeximages{line-height:0;-webkit-column-count:20;-webkit-column-gap:0;-moz-column-count:20;-moz-column-gap:0;column-count:20;column-gap:0}#indeximages \
img{width:100%!important;height:auto!important;opacity:1}@media \
(max-width:1920px){#indeximages{-moz-column-count:20;-webkit-column-count:20;column-count:20}}@media \
(max-width:1200px){#indeximages{-moz-column-count:15;-webkit-column-count:4;column-count:4}}@media \
(max-width:1000px){#indeximages{-moz-column-count:12;-webkit-column-count:3;column-count:3}}@media \
(max-width:800px){#indeximages{-moz-column-count:9;-webkit-column-count:2;column-count:2}}@media \
(max-width:400px){#indeximages{-moz-column-count:7;-webkit-column-count:1;column-count:1}}#products-wrappe \
r{padding-top:20px}.explore-products{padding-left:30px;padding-right:30px;margin-top:-10px}.explore-products \
.product-list{width:100%;float:left;padding:0 10px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 \
0 5px 5px;border-radius:0 0 5px \
5px;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.explore-products \
.product-list .explore-product{padding:10px 0;font-size:12px;border-top:1px solid #ccc}.explore-products \
.product-list .explore-product .rownum{font-size:12px;float:left}.explore-products .product-list \
.explore-product .explore-product-imgcolumn{padding-left:5px;padding-right:5px}.explore-products \
.product-list .explore-product \
.imageContainer{height:167px;display:flex;justify-content:center;align-items:center}.explore-products \
.product-list .explore-product .explore-product-image{max-width:95%;max-height:167px}.explore-products \
.product-list .explore-product .contentLeft{float:left;padding-right:0;width:270px}.explore-products \
.product-list .explore-product .contentLeft img{max-width:167px;max-height:167px}.explore-products \
.product-list .explore-product .contentLeft div.productimg{width:167px;height:167px}.explore-products \
.product-list .explore-product .explore-product-details{padding-left:20px}.explore-products .product-list \
.explore-product .explore-product-details \
h3{font-size:24px;font-weight:700;color:#2673b0}.explore-products .product-list .explore-product \
.explore-product-details h3 span.version{font-size:smaller;padding-left:20px}.explore-products \
.product-list .explore-product .explore-product-details \
.title{display:block;margin-bottom:8px}.explore-products .product-list .explore-product \
.explore-product-details .title .username{padding-left:20px}.explore-products .product-list \
.explore-product .explore-product-details .description{display:block;margin-bottom:8px}.explore-products \
.product-list .explore-product .explore-product-details \
.packagetypes{display:block;float:left}.explore-products .product-list .explore-product \
.explore-product-details .packagetypes .packagetypeos{width:100px;float:left}.explore-products \
.product-list .explore-product .explore-product-details \
.productInfo{clear:left;padding-top:5px}.explore-products .product-list .explore-product \
.explore-product-details .productInfo span.cntSupporters{padding-right:20px}.explore-products \
.product-list .explore-product .explore-product-plings{padding:0}.explore-products .product-list \
.explore-product .explore-product-plings .rating{width:50%}.explore-products .product-list \
.explore-product .explore-product-plings \
.progress{margin-bottom:10px;padding:3px;opacity:0;margin-bottom:0;height:12px;opacity:1;background-color:transparent;box-shadow:none;padding:2px}.explore-products \
.product-list .explore-product .explore-product-plings .progress \
.bar{width:4px;max-width:100%;height:14px;background-color:#2673b0;-webkit-border-radius:5px;-moz-border-r \
adius:5px;border-radius:5px;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;-webkit-box-shadow:inset \
0 6px 0 rgba(255,255,255,.2);-moz-box-shadow:inset 0 6px 0 rgba(255,255,255,.2);box-shadow:inset 0 6px 0 \
rgba(255,255,255,.2)}.explore-products .product-list .explore-product .explore-product-plings .progress \
.bar.no-goal{width:50%;opacity:0}.explore-products .product-list .explore-product .explore-product-plings \
\ No newline at end of file
diff --git a/httpdocs/theme/flatui/js/script.js b/httpdocs/theme/flatui/js/script.js
index 8d7e023d..c0ff1890 100644
--- a/httpdocs/theme/flatui/js/script.js
+++ b/httpdocs/theme/flatui/js/script.js
@@ -891,7 +891,7 @@ var PartialsReview = (function () {
} else {
$('#review-product-modal').find('input#voteup').val(2);
$('#review-product-modal').find('#votelabel').empty()
- .append('<a class="btn btn-danger active" style="line-height: 10px;"><span \
class="fa fa-minus"></span></a> Add Comment (min. 5 char): '); + .append('<a \
class="btn btn-danger active" style="line-height: 10px;"><span class="fa fa-minus"></span></a> Add \
Comment (min. 5 char) <span style="font-size:10px; display:block"> Please explain the reason for downvote \
to help the creator to make it better </span> ');
$('#review-product-modal').find('#commenttext').val('-');
$('#review-product-modal').find('#commenttext').removeAttr("disabled");
$('#review-product-modal').find(':submit').removeAttr("disabled").css("display", \
"block");
diff --git a/httpdocs/theme/flatui/less/stylesheet.less b/httpdocs/theme/flatui/less/stylesheet.less
index 2fca6877..2ec2556c 100644
--- a/httpdocs/theme/flatui/less/stylesheet.less
+++ b/httpdocs/theme/flatui/less/stylesheet.less
@@ -2431,17 +2431,17 @@ span.page-views {
.product-row {
.product-thumbnail {
- width: 42px;
- height: 42px;
- margin: 10px;
+ width: 75px;
+ height: 77px;
+ margin: 7px;
padding: 10px;
position: relative;
img {
border-radius: 5px;
border: 1px solid #b2b2b2;
- height: 50px;
- width: 50px;
+ height: 75px;
+ width: 75px;
}
}
}
diff --git a/httpdocs/theme/react/all.js b/httpdocs/theme/react/all.js
index 9024eba7..2e1cb6cd 100644
--- a/httpdocs/theme/react/all.js
+++ b/httpdocs/theme/react/all.js
@@ -269,6 +269,26 @@ window.productHelpers = function () {
return userRating;
}
+ function calculateProductLaplaceScore(ratings) {
+ let laplace_score = 0;
+ let upvotes = 0;
+ let downvotes = 0;
+ ratings.forEach(function (rating, index) {
+ console.log(rating.active);
+ if (rating.rating_active === "1") {
+ console.log(rating.user_like);
+ if (rating.user_like === "1") {
+ upvotes += 1;
+ } else if (rating.user_like === "0") {
+ downvotes += 1;
+ }
+ }
+ });
+ laplace_score = Math.round((upvotes + 6) / (upvotes + downvotes + 12), 2) * 100;
+ console.log(laplace_score);
+ return laplace_score;
+ }
+
return {
getNumberOfProducts,
generatePaginationObject,
@@ -276,7 +296,8 @@ window.productHelpers = function () {
getActiveRatingsNumber,
getFilesSummary,
checkIfLikedByUser,
- getLoggedUserRatingOnProduct
+ getLoggedUserRatingOnProduct,
+ calculateProductLaplaceScore
};
}();
class ProductGroupScrollWrapper extends React.Component {
@@ -1217,15 +1238,19 @@ class Pagination extends React.Component {
}
componentDidMount() {
- const itemsPerPage = 1000;
+ console.log('paginstion - component did mount');
+ console.log(store.getState());
+ const itemsPerPage = 50;
const numPages = Math.ceil(this.props.pagination.totalcount / itemsPerPage);
const pagination = productHelpers.generatePaginationObject(numPages, window.location.pathname, \
this.props.currentCategoy, this.props.filters.order, this.props.pagination.page);
- this.setState({ pagination: pagination });
+ this.setState({ pagination: pagination }, function () {
+ console.log(pagination);
+ });
}
render() {
let paginationDisplay;
- if (this.state.pagination && this.props.pagination.totalcount > 1000) {
+ if (this.state.pagination && this.props.pagination.totalcount > 50) {
const pagination = this.state.pagination.map((pi, index) => {
let numberDisplay;
@@ -2189,20 +2214,29 @@ class ProductViewHeaderRatings extends React.Component {
});
}
- onRatingFormResponse(response, val) {
+ onRatingFormResponse(modalResponse, val) {
const self = this;
- jQuery.ajax({
- data: {},
- url: '/p/' + this.props.product.project_id + '/loadratings/',
- method: 'get',
- error: function (jqXHR, textStatus, errorThrown) {
- self.setState({ errorMsg: textStatus + " " + errorThrown });
- $('#ratings-form-modal').modal('hide');
- },
- success: function (response) {
- store.dispatch(setProductRatings(response));
- $('#ratings-form-modal').modal('hide');
- }
+ this.setState({ errorMsg: '' }, function () {
+ jQuery.ajax({
+ data: {},
+ url: '/p/' + this.props.product.project_id + '/loadratings/',
+ method: 'get',
+ error: function (jqXHR, textStatus, errorThrown) {
+ self.setState({ errorMsg: textStatus + " " + errorThrown });
+ $('#ratings-form-modal').modal('hide');
+ },
+ success: function (response) {
+ console.log('on rating form response');
+ console.log(response);
+ // const laplace_score = productHelpers.calculateProductLaplaceScore(response);
+ store.dispatch(setProductRatings(response));
+ if (modalResponse.status !== "ok") self.setState({ errorMsg: modalResponse.status + " - " + \
modalResponse.message }); + self.setState({ laplace_score: modalResponse.laplace_score }, \
function () { + console.log(this.state.laplace_score);
+ });
+ $('#ratings-form-modal').modal('hide');
+ }
+ });
});
}
@@ -2220,10 +2254,7 @@ class ProductViewHeaderRatings extends React.Component {
});
}
- let ratingsBarCss;
- if (this.props.product.laplace_score < 50) {
- ratingsBarCss = 'red';
- }
+ console.log(this.state.laplace_score);
return React.createElement(
'div',
@@ -2240,7 +2271,7 @@ class ProductViewHeaderRatings extends React.Component {
React.createElement(
'div',
{ className: 'ratings-bar-holder' },
- React.createElement('div', { className: ratingsBarCss + " ratings-bar", style: { "width": \
this.state.laplace_score + "%" } }), + React.createElement('div', { className: 'green \
ratings-bar', style: { "width": this.state.laplace_score + "%" } }),
React.createElement('div', { className: 'ratings-bar-empty', style: { "width": 100 - \
this.state.laplace_score + "%" } }) ),
React.createElement(
@@ -2253,7 +2284,11 @@ class ProductViewHeaderRatings extends React.Component {
)
),
ratingsFormModalDisplay,
- this.state.errorMsg
+ React.createElement(
+ 'p',
+ { className: 'ratings-bar-error-msg-container' },
+ this.state.errorMsg
+ )
);
}
}
@@ -2265,6 +2300,7 @@ class RatingsFormModal extends React.Component {
action: this.props.action
};
this.submitRatingForm = this.submitRatingForm.bind(this);
+ this.onTextAreaInputChange = this.onTextAreaInputChange.bind(this);
}
componentDidMount() {
@@ -2279,6 +2315,10 @@ class RatingsFormModal extends React.Component {
});
}
+ onTextAreaInputChange(e) {
+ this.setState({ text: e.target.value });
+ }
+
submitRatingForm() {
this.setState({ loading: true }, function () {
const self = this;
@@ -2289,6 +2329,8 @@ class RatingsFormModal extends React.Component {
v = '2';
}
+ console.log(this.state.text);
+
jQuery.ajax({
data: {
p: this.props.product.project_id,
@@ -2303,7 +2345,7 @@ class RatingsFormModal extends React.Component {
method: 'post',
error: function () {
const msg = "Service is temporarily unavailable. Our engineers are working quickly to resolve \
this issue. <br/>Find out why you may have encountered this error.";
- this.setState({ msg: msg });
+ self.setState({ msg: msg });
},
success: function (response) {
self.props.onRatingFormResponse(response, v);
@@ -2338,7 +2380,7 @@ class RatingsFormModal extends React.Component {
'Close'
);
} else if (this.state.text) {
- textAreaDisplay = React.createElement('textarea', { defaultValue: this.state.text, className: \
'form-control' }); + textAreaDisplay = React.createElement('textarea', { onChange: \
this.onTextAreaInputChange, defaultValue: this.state.text, className: 'form-control' }); if \
(this.state.loading !== true) {
if (this.state.msg) {
@@ -2794,7 +2836,7 @@ class ProductViewContent extends React.Component {
files: this.props.product.r_files
});
} else if (this.props.tab === 'ratings') {
- currentTabDisplay = React.createElement(ProductViewRatingsTab, {
+ currentTabDisplay = React.createElement(ProductViewRatingsTabWrapper, {
ratings: this.props.product.r_ratings
});
} else if (this.props.tab === 'favs') {
@@ -3334,7 +3376,7 @@ class ProductViewRatingsTab extends React.Component {
}
render() {
-
+ console.log(this.props);
const ratingsLikes = this.props.ratings.filter(this.filterLikes);
const ratingsDislikes = this.props.ratings.filter(this.filterDislikes);
const ratingsActive = this.props.ratings.filter(this.filterActive);
@@ -3422,6 +3464,21 @@ class ProductViewRatingsTab extends React.Component {
}
}
+const mapStateToProductViewRatingsTabProps = state => {
+ const ratings = state.product.r_ratings;
+ return {
+ ratings
+ };
+};
+
+const mapDispatchToProductViewRatingsTabProps = dispatch => {
+ return {
+ dispatch
+ };
+};
+
+const ProductViewRatingsTabWrapper = ReactRedux.connect(mapStateToProductViewRatingsTabProps, \
mapDispatchToProductViewRatingsTabProps)(ProductViewRatingsTab); +
class RatingItem extends React.Component {
constructor(props) {
super(props);
diff --git a/httpdocs/theme/react/app-metaheader/_app-helpers.js \
b/httpdocs/theme/react/app-metaheader/_app-helpers.js new file mode 100644
index 00000000..59d1b65a
--- /dev/null
+++ b/httpdocs/theme/react/app-metaheader/_app-helpers.js
@@ -0,0 +1,17 @@
+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;
+ }
+
+ return {
+ generateMenuGroupsArray
+ }
+
+}());
diff --git a/httpdocs/theme/react/app-metaheader/app.js b/httpdocs/theme/react/app-metaheader/app.js
new file mode 100644
index 00000000..68f72131
--- /dev/null
+++ b/httpdocs/theme/react/app-metaheader/app.js
@@ -0,0 +1,281 @@
+class MetaHeader extends React.Component {
+ constructor(props){
+ super(props);
+ this.state = {
+ baseUrl:baseUrl,
+ blogUrl:blogUrl,
+ loginUrl:loginUrl,
+ domains:domains,
+ user:user,
+ sName:sName,
+ loading:false
+ };
+ }
+
+ componentDidMount() {
+ console.log(this.state);
+ }
+
+ render(){
+
+ return (
+ <nav id="metaheader-nav" className="metaheader">
+ <div className="metamenu">
+ <DomainsMenu
+ domains={this.state.domains}
+ baseUrl={this.state.baseUrl}
+ sName={this.state.sName}
+ />
+ <UserMenu
+ user={this.state.user}
+ blogUrl={this.state.blogUrl}
+ loginUrl={this.state.loginUrl}
+ />
+ </div>
+ </nav>
+ )
+ }
+}
+
+class DomainsMenu extends React.Component {
+ constructor(props){
+ super(props);
+ this.state = {};
+ }
+
+ componentDidMount() {
+ const menuGroups = appHelpers.generateMenuGroupsArray(this.props.domains);
+ this.setState({menuGroups:menuGroups});
+ }
+
+ render(){
+ let menuGroupsDisplayLeft, menuGroupsDisplayRight;
+ if (this.state.menuGroups){
+ menuGroupsDisplayLeft = this.state.menuGroups.slice(0,2).map((mg,i) => (
+ <DomainsMenuGroup
+ key={i}
+ domains={this.props.domains}
+ menuGroup={mg}
+ sName={this.props.sName}
+ />
+ ));
+ menuGroupsDisplayRight = this.state.menuGroups.slice(2).map((mg,i) => (
+ <DomainsMenuGroup
+ key={i}
+ domains={this.props.domains}
+ menuGroup={mg}
+ sName={this.props.sName}
+ />
+ ));
+ }
+ return (
+ <ul className="metaheader-menu left" id="domains-menu">
+ <li className="active">
+ <a href={"http://"+this.props.baseUrl}>
+ <img src="/images/system/ocs-logo-rounded-16x16.png" className="logo"/>
+ openDesktop.org :
+ </a>
+ </li>
+ <li id="domains-dropdown-menu" className="dropdown">
+ <a id="dropdownMenu3"
+ data-toggle="dropdown"
+ aria-haspopup="true"
+ aria-expanded="true">Themes & Apps</a>
+ <ul className="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenu3">
+ <li className="submenu-container">
+ <ul>
+ {menuGroupsDisplayLeft}
+ </ul>
+ </li>
+ <li className="submenu-container">
+ <ul>
+ {menuGroupsDisplayRight}
+ </ul>
+ </li>
+ </ul>
+ </li>
+ <li id="discussion-boards" className="dropdown">
+ <a id="dropdownMenu4"
+ data-toggle="dropdown"
+ aria-haspopup="true"
+ aria-expanded="true">Discussion Boards</a>
+ <ul className="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenu4">
+ <li><a href="https://forum.opendesktop.org/c/general">General</a></li>
+ <li><a href="https://forum.opendesktop.org/c/themes-and-apps">Themes & Apps</a></li>
+ <li><a>Coding</a></li>
+ </ul>
+ </li>
+ </ul>
+ )
+ }
+}
+
+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) \
=> ( + <li key={index}>
+ <a href={"http://" + domain.menuhref}>{domain.name}</a>
+ </li>
+ ));
+
+ return (
+ <li>
+ <a href="#"><b>{this.props.menuGroup}</b></a>
+ <ul className="domains-sub-menu">
+ {domainsDisplay}
+ </ul>
+ </li>
+ )
+ }
+}
+
+class UserMenu extends React.Component {
+ constructor(props){
+ super(props);
+ this.state = {};
+ }
+
+ render(){
+ let userDropdownDisplay;
+ if (this.props.user){
+ userDropdownDisplay = (
+ <UserLoginMenuContainer
+ user={this.props.user}
+ />
+ );
+ } else {
+ userDropdownDisplay = (
+ <li id="user-login-container"><a href={this.props.loginUrl} className="btn \
btn-metaheader">Login</a></li> + )
+ }
+
+ return (
+ <div id="user-menu-container" className="right">
+ <ul className="metaheader-menu" id="user-menu">
+ <li><a href="/community">Community</a></li>
+ <li><a href={this.props.blogUrl} target="_blank">Blog</a></li>
+ <li><a id="plingList" className="popuppanel" href="/plings">What are Plings?</a></li>
+ <li><a id="ocsapiContent" className="popuppanel" \
href="/partials/ocsapicontent.phtml">API</a></li> + <li><a id="aboutContent" \
className="popuppanel" href="/partials/about.phtml" >About</a></li> + \
<UserContextMenuContainer/> + {userDropdownDisplay}
+ </ul>
+ </div>
+ )
+ }
+}
+
+class UserContextMenuContainer extends React.Component {
+ constructor(props){
+ super(props);
+ this.state = {};
+ }
+
+ render(){
+ return (
+ <li id="user-context-menu-container">
+ <div className="user-dropdown">
+ <button
+ className="btn btn-default dropdown-toggle"
+ type="button"
+ id="dropdownMenu2"
+ data-toggle="dropdown"
+ aria-haspopup="true"
+ aria-expanded="true">
+ <span className="glyphicon glyphicon-th"></span>
+ </button>
+ <ul className="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenu2">
+ <li id="opendesktop-link-item">
+ <a href="http://www.opendesktop.org">
+ <div className="icon"></div>
+ <span>Themes <br/> & Apps</span>
+ </a>
+ </li>
+ <li id="discourse-link-item">
+ <a href="http://discourse.opendesktop.org/">
+ <div className="icon"></div>
+ <span>Discussion <br/> Boards</span>
+ </a>
+ </li>
+ <li id="opencode-link-item">
+ <a href="https://www.opencode.net/">
+ <div className="icon"></div>
+ <span>Coding <br/> Tools</span>
+ </a>
+ </li>
+ </ul>
+ </div>
+ </li>
+ )
+ }
+}
+
+class UserLoginMenuContainer extends React.Component {
+ constructor(props){
+ super(props);
+ this.state = {};
+ }
+
+ render(){
+ return (
+ <li id="user-login-menu-container">
+ <div className="user-dropdown">
+ <button
+ className="btn btn-default dropdown-toggle"
+ type="button"
+ id="userLoginDropdown"
+ data-toggle="dropdown"
+ aria-haspopup="true"
+ aria-expanded="true">
+ <img src={this.props.user.profile_image_url}/>
+ </button>
+ <ul className="dropdown-menu dropdown-menu-right" aria-labelledby="userLoginDropdown">
+ <li id="user-info-menu-item">
+ <div id="user-info-section">
+ <div className="user-avatar">
+ <div className="no-avatar-user-letter">
+ <img src={this.props.user.profile_image_url}/>
+ <a className="change-profile-pic">
+ Change
+ </a>
+ </div>
+ </div>
+ <div className="user-details">
+ <ul>
+ <li><b>{this.props.user.username}</b></li>
+ <li>{this.props.user.mail}</li>
+ <li></li>
+ <li><a>Profile</a> - <a>Privacy</a></li>
+ <li><button className="btn btn-default btn-metaheader">Account</button></li>
+ </ul>
+ </div>
+ </div>
+ </li>
+ <li id="main-seperator" role="separator" className="divider"></li>
+ <li className="buttons">
+ <button className="btn btn-default btn-metaheader">Add Account</button>
+ <button className="btn btn-default pull-right btn-metaheader"><a href="/register">Sign \
Up</a></button> + </li>
+ </ul>
+ </div>
+ </li>
+ )
+ }
+}
+
+ReactDOM.render(
+ <MetaHeader />,
+ document.getElementById('metaheader')
+);
diff --git a/httpdocs/theme/react/app/__product-helpers.js \
b/httpdocs/theme/react/app/__product-helpers.js index b80fa0ce..0554d690 100644
--- a/httpdocs/theme/react/app/__product-helpers.js
+++ b/httpdocs/theme/react/app/__product-helpers.js
@@ -123,6 +123,26 @@ window.productHelpers = (function(){
return userRating;
}
+ function calculateProductLaplaceScore(ratings){
+ let laplace_score = 0;
+ let upvotes = 0;
+ let downvotes = 0;
+ ratings.forEach(function(rating,index){
+ console.log(rating.active);
+ if (rating.rating_active === "1"){
+ console.log(rating.user_like);
+ if (rating.user_like === "1"){
+ upvotes += 1;
+ } else if (rating.user_like === "0") {
+ downvotes += 1;
+ }
+ }
+ });
+ laplace_score = (Math.round(((upvotes + 6) / ((upvotes + downvotes) + 12)),2) * 100);
+ console.log(laplace_score);
+ return laplace_score;
+ }
+
return {
getNumberOfProducts,
generatePaginationObject,
@@ -130,6 +150,7 @@ window.productHelpers = (function(){
getActiveRatingsNumber,
getFilesSummary,
checkIfLikedByUser,
- getLoggedUserRatingOnProduct
+ getLoggedUserRatingOnProduct,
+ calculateProductLaplaceScore
}
}());
diff --git a/httpdocs/theme/react/app/_explore.js b/httpdocs/theme/react/app/_explore.js
index e3ef8603..d84950c1 100644
--- a/httpdocs/theme/react/app/_explore.js
+++ b/httpdocs/theme/react/app/_explore.js
@@ -260,15 +260,19 @@ class Pagination extends React.Component {
}
componentDidMount() {
- const itemsPerPage = 1000;
+ console.log('paginstion - component did mount');
+ console.log(store.getState());
+ const itemsPerPage = 50;
const numPages = Math.ceil(this.props.pagination.totalcount / itemsPerPage);
const pagination = \
productHelpers.generatePaginationObject(numPages,window.location.pathname,this.props.currentCategoy,this.props.filters.order, \
this.props.pagination.page);
- this.setState({pagination:pagination});
+ this.setState({pagination:pagination},function(){
+ console.log(pagination);
+ });
}
render(){
let paginationDisplay;
- if (this.state.pagination && this.props.pagination.totalcount > 1000){
+ if (this.state.pagination && this.props.pagination.totalcount > 50){
const pagination = this.state.pagination.map((pi,index) => {
let numberDisplay;
diff --git a/httpdocs/theme/react/app/_product-page.js b/httpdocs/theme/react/app/_product-page.js
index d2e4cfb0..5e876a0c 100644
--- a/httpdocs/theme/react/app/_product-page.js
+++ b/httpdocs/theme/react/app/_product-page.js
@@ -264,20 +264,29 @@ class ProductViewHeaderRatings extends React.Component {
});
}
- onRatingFormResponse(response,val){
+ onRatingFormResponse(modalResponse,val){
const self = this;
- jQuery.ajax({
- data:{},
- url:'/p/'+this.props.product.project_id+'/loadratings/',
- method:'get',
- error:function(jqXHR,textStatus,errorThrown){
- self.setState({errorMsg:textStatus + " " + errorThrown});
- $('#ratings-form-modal').modal('hide');
- },
- success: function(response){
- store.dispatch(setProductRatings(response));
- $('#ratings-form-modal').modal('hide');
- }
+ this.setState({errorMsg:''},function(){
+ jQuery.ajax({
+ data:{},
+ url:'/p/'+this.props.product.project_id+'/loadratings/',
+ method:'get',
+ error:function(jqXHR,textStatus,errorThrown){
+ self.setState({errorMsg:textStatus + " " + errorThrown});
+ $('#ratings-form-modal').modal('hide');
+ },
+ success: function(response){
+ console.log('on rating form response');
+ console.log(response);
+ // const laplace_score = productHelpers.calculateProductLaplaceScore(response);
+ store.dispatch(setProductRatings(response));
+ if (modalResponse.status !== "ok") self.setState({errorMsg:modalResponse.status + " - " + \
modalResponse.message}); + self.setState({laplace_score:modalResponse.laplace_score},function(){
+ console.log(this.state.laplace_score);
+ });
+ $('#ratings-form-modal').modal('hide');
+ }
+ });
});
}
@@ -297,11 +306,8 @@ class ProductViewHeaderRatings extends React.Component {
);
}
- let ratingsBarCss;
- if (this.props.product.laplace_score < 50){
- ratingsBarCss = 'red';
- }
+ console.log(this.state.laplace_score);
return (
<div className="ratings-bar-container">
@@ -309,14 +315,14 @@ class ProductViewHeaderRatings extends React.Component {
<i className="material-icons">remove</i>
</div>
<div className="ratings-bar-holder">
- <div className={ratingsBarCss + " ratings-bar"} style={{"width":this.state.laplace_score + \
"%"}}></div> + <div className="green ratings-bar" style={{"width":this.state.laplace_score + \
"%"}}></div>
<div className="ratings-bar-empty" style={{"width":(100 - this.state.laplace_score) + \
"%"}}></div> </div>
<div className="ratings-bar-right" onClick={() => this.onRatingBtnClick('plus')}>
<i className="material-icons">add</i>
</div>
{ratingsFormModalDisplay}
- {this.state.errorMsg}
+ <p className="ratings-bar-error-msg-container">{this.state.errorMsg}</p>
</div>
)
}
@@ -329,6 +335,7 @@ class RatingsFormModal extends React.Component {
action:this.props.action
};
this.submitRatingForm = this.submitRatingForm.bind(this);
+ this.onTextAreaInputChange = this.onTextAreaInputChange.bind(this);
}
componentDidMount() {
@@ -343,6 +350,10 @@ class RatingsFormModal extends React.Component {
});
}
+ onTextAreaInputChange(e){
+ this.setState({text:e.target.value});
+ }
+
submitRatingForm(){
this.setState({loading:true},function(){
const self = this;
@@ -353,6 +364,8 @@ class RatingsFormModal extends React.Component {
v = '2';
}
+ console.log(this.state.text);
+
jQuery.ajax({
data:{
p:this.props.product.project_id,
@@ -367,7 +380,7 @@ class RatingsFormModal extends React.Component {
method:'post',
error: function(){
const msg = "Service is temporarily unavailable. Our engineers are working quickly to resolve \
this issue. <br/>Find out why you may have encountered this error.";
- this.setState({msg:msg});
+ self.setState({msg:msg});
},
success: function(response){
self.props.onRatingFormResponse(response,v);
@@ -395,7 +408,7 @@ class RatingsFormModal extends React.Component {
);
} else if (this.state.text) {
textAreaDisplay = (
- <textarea defaultValue={this.state.text} className="form-control"></textarea>
+ <textarea onChange={this.onTextAreaInputChange} defaultValue={this.state.text} \
className="form-control"></textarea> );
if (this.state.loading !== true){
@@ -754,7 +767,7 @@ class ProductViewContent extends React.Component {
)
} else if (this.props.tab === 'ratings'){
currentTabDisplay = (
- <ProductViewRatingsTab
+ <ProductViewRatingsTabWrapper
ratings={this.props.product.r_ratings}
/>
);
@@ -1154,7 +1167,7 @@ class ProductViewRatingsTab extends React.Component {
}
render(){
-
+ console.log(this.props);
const ratingsLikes = this.props.ratings.filter(this.filterLikes);
const ratingsDislikes = this.props.ratings.filter(this.filterDislikes);
const ratingsActive = this.props.ratings.filter(this.filterActive);
@@ -1206,6 +1219,24 @@ class ProductViewRatingsTab extends React.Component {
}
}
+const mapStateToProductViewRatingsTabProps = (state) => {
+ const ratings = state.product.r_ratings;
+ return {
+ ratings
+ }
+}
+
+const mapDispatchToProductViewRatingsTabProps = (dispatch) => {
+ return {
+ dispatch
+ }
+}
+
+const ProductViewRatingsTabWrapper = ReactRedux.connect(
+ mapStateToProductViewRatingsTabProps,
+ mapDispatchToProductViewRatingsTabProps
+)(ProductViewRatingsTab);
+
class RatingItem extends React.Component {
constructor(props){
super(props);
diff --git a/httpdocs/theme/react/assets/css/style.css b/httpdocs/theme/react/assets/css/style.css
index 4debc219..d8b00d25 100644
--- a/httpdocs/theme/react/assets/css/style.css
+++ b/httpdocs/theme/react/assets/css/style.css
@@ -1 +1 @@
-header div.container.header{height:110px}#user-dropdown \
.dropdown-menu{width:300px;padding-top:0;overflow:hidden}#user-dropdown .dropdown-menu \
#user-info-section{height:100px;padding:10px 20px;background:#f8f8f8}#user-dropdown .dropdown-menu \
#user-info-section .user-avatar{width:40%;height:80px;width:80px;float:left}#user-dropdown .dropdown-menu \
#user-info-section .user-avatar \
.no-avatar-user-letter{border-radius:100%;height:100%;width:100%;background-color:#c1c1c1;text-align:center;line-height:80px;font-size:50px;color:white}#user-dropdown \
.dropdown-menu #user-info-section .user-details{width:175px;padding-left:20px;float:left}#user-dropdown \
.dropdown-menu #main-seperator{margin-top:0}#main-header{background:#4a86cf;width:100%;height:70px;padding-left:275px;position:relative}#main-header \
.logo-header{background-image:none;display:block;height:100px;left:6px;position:absolute;top:-10px;width:265px;z-index:999;overflow:hidden}#main-header \
.user-menu-container{float:right;padding:15px;height:70px;width:auto}#main-header .user-menu-container \
ul{float:right;width:auto;padding:0;margin:0}#main-header #nav-top #nav-left{padding:15px}#main-header \
#nav-top #nav-left form#search{padding:7px;margin-right:7px}#main-header #nav-top #nav-left form#search \
input.content-search{border-radius:10px;border:1px solid #ccc;height:26px;padding:0 \
8px}.products-showcase .products-container \
.square{width:14.28571%;position:relative;float:left;margin-bottom:15px}.products-showcase \
.products-container .square:after{content:"";display:block;padding-bottom:120%}.products-showcase \
.products-container .content{position:absolute;width:100%;height:100%;padding:0 6px}.products-showcase \
.products-container .content a{display:block;width:100%;height:100%;position:relative}.products-showcase \
.products-container .content \
.product-wrapper{position:relative;width:100%;height:100%;background-color:white}.products-showcase \
.products-container .content \
.product-image-container{position:absolute;height:100%;width:100%;overflow:hidden;padding-bottom:60px}.products-showcase \
.products-container .content .product-image-container \
figure{width:100%;height:100%;position:relative}.products-showcase .products-container .content \
.product-image-container figure \
span{position:absolute;bottom:5px;left:0;font-weight:500;color:#636363;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;line-height:1.2;font-weight:500 \
!important;width:100%;padding:0 10px;text-align:center}.products-showcase .products-container .content \
.product-image-container figure \
img{position:absolute;top:50%;left:50%;width:110px;height:110px;margin:-55px 0 0 \
-55px;border-radius:100%}.products-showcase .products-container .content .product-image-container figure \
img.squared{border-radius:0}.products-showcase .products-container .content .product-image-container \
figure img.full{position:relative;width:100%;height:100%;margin:0;border-radius:0;top:0;left:0}.products-showcase \
.products-container .content .product-image-container figure img.padded{border-radius:0;border:10px solid \
white}.products-showcase .products-container .content .product-image-container figure \
img.rounded-corners{border-radius:20%}.products-showcase .products-container .content \
.product-image-container figure img.very-rounded-corners{border-radius:40%}.products-showcase \
.products-container .content .product-info{width:100%;height:60px;color:white;padding:14px \
16px;position:absolute;bottom:0;left:0;background-color:rgba(0,0,0,0.38)}.products-showcase \
.products-container .content .product-info \
span{width:100%;float:left;overflow:hidden;text-overflow:ellipsis;line-height:1.2;font-weight:500 \
!important}.products-showcase .products-container .content .product-info \
span.product-info-title{font-size:90%}.products-showcase .products-container .content .product-info \
span.product-info-description{font-size:70%;height:30px;line-height:15px;overflow:hidden;text-overflow:ell \
ipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.products-showcase \
.products-container .content \
.product-info.music-image{padding-right:40px;padding-left:40px;padding-top:20px;text-align:center}.products-showcase \
.products-container .content .product-info.music-image \
.material-icons{position:absolute;top:18px}.products-showcase .products-container .content \
.product-info.music-image .material-icons.left-icon{left:10px}.products-showcase .products-container \
.content .product-info.music-image .material-icons.right-icon{right:10px}.products-showcase \
.products-container .content:hover .product-wrapper{background-color:#c1c1c1}.explore-products-container \
.product-group-scroll-wrapper .product-group-scroll-loading-container{width:100%;float:left;padding:20px \
0}.explore-products-container .product-group-scroll-wrapper .product-group-scroll-loading-container \
.icon-wrapper{display:table;margin:0 auto}.explore-products-container \
#pagination-container{text-align:center}.explore-products-container #pagination-container \
.wrapper{margin:0 auto;display:table;width:auto}.explore-products-container #pagination-container \
.wrapper ul{padding:0;margin:0;list-style-type:none}.explore-products-container #pagination-container \
.wrapper ul li{float:left;width:auto;margin-right:5px}.explore-products-container #pagination-container \
.wrapper ul li a{font-size:18px}.explore-products-container #pagination-container .wrapper ul li a \
.num-wrap{display:block;float:left}.explore-products-container #pagination-container .wrapper ul li a \
.num-wrap span,.explore-products-container #pagination-container .wrapper ul li a .num-wrap \
i{display:block;float:left}.explore-products-container #pagination-container .wrapper ul li \
a.active{font-weight:500;text-decoration:underline}.explore-top-bar{margin-bottom:20px;border-bottom:2px \
solid #ccc;float:left;width:100%}.explore-top-bar .item{padding:5px 10px;border-bottom:2px solid \
transparent;font-size:14px;margin-bottom:-2px;float:left;cursor:pointer}.explore-top-bar \
.item.active{border-bottom-color:#2673b0}.explore-top-bar \
.item:hover{border-bottom-color:#368ed3}.cards{width:100%;float:left}.cards \
.user-card-item{width:16.6666%;padding:0 5px;float:left}.cards .user-card-item .card-content{border:5px \
solid #ccc;border-radius:10px;padding:5px;font-size:15px;float:left;height:auto;text-align:center}.cards \
.user-card-item .card-content .user-avatar{padding-bottom:5px;margin-bottom:5px}.cards .user-card-item \
.card-content .user-avatar img{max-width:100%;height:auto;border-radius:100%}.cards .user-card-item \
.card-content span{display:block;width:100%;float:left}.cards .user-card-item .card-content span \
i{font-size:20px}.cards .user-card-item .card-content span \
img{width:23px;height:23px;display:table;margin:0 auto;margin-bottom:4px}.modal .modal-dialog \
.modal-content .modal-header{height:70px}.modal .modal-dialog .modal-content .modal-header \
.action-icon-container{position:absolute;left:15px;top:15px;height:40px;width:40px;text-align:center;font-size:40px;line-height:35px;border:1px \
solid;border-radius:5px}.modal .modal-dialog .modal-content .modal-header \
.action-icon-container.minus{color:#fff;background-color:#c9302c;border-color:#ac2925}.modal \
.modal-dialog .modal-content .modal-header \
.action-icon-container.plus{color:#fff;background-color:#449d44;border-color:#398439;line-height:40px}.modal \
.modal-dialog .modal-content .modal-header \
.modal-title{text-transform:initial;padding-left:50px;height:40px;line-height:32px}.modal .modal-dialog \
.modal-content .modal-header .close{position:absolute;top:15px;right:15px}.modal .modal-dialog \
.modal-content .modal-footer{text-align:center}.modal .modal-dialog .modal-content .modal-footer \
.glyphicon{display:table;margin:0 auto;float:none}table thead tr th,table tbody tr th,table thead tr \
td,table tbody tr td{text-align:left !important;font-size:13px !important;font-weight:500 \
!important;padding:12px 8px !important}#app-root{font-family:Source Sans Pro,Source \
Sans,sans-serif;font-size:13pt;font-weight:400;line-height:1.8}#app-root .container{width:100% \
!important;padding:0 10%}#app-root .row{margin-left:-6px;margin-right:-6px}#app-root \
*{font-weight:300}#app-root .mdl-button{text-transform:capitalize !important;font-size:14px \
!important;font-weight:500 !important;font-family:Source Sans Pro,Source Sans,sans-serif \
!important}#app-root .mdl-button#become-a-supporter{width:100%;font-size:20px \
!important;text-transform:none !important;padding-top:15px;padding-bottom:15px;height:auto \
!important;border-radius:8px !important;line-height:1}#app-root .section{padding:20px 0}#app-root \
.section .section-header{position:relative}#app-root .section .section-header \
.actions{position:absolute;top:5px;right:0}#app-root .section h1,#app-root .section h2,#app-root .section \
h3,#app-root .section h4,#app-root .section h5,#app-root .section \
h6{width:100%;margin-top:0;font-weight:300;color:black !important}#app-root .section \
h1{width:100%;margin-top:0;font-weight:300;color:black \
!important;font-size:24px;margin-bottom:15px}#app-root .section \
h2{padding-bottom:0;font-size:40px;margin-bottom:1em}#app-root .section \
h3{font-size:28px;margin-bottom:10px;height:40px}#app-root #homepage .actions \
.mdl-button+.mdl-button{margin-left:3px}#app-root #homepage \
#introduction{padding-top:60px;margin-bottom:30px}#app-root #homepage #introduction \
p{max-width:700px;font-size:14pt;line-height:1.4;margin-bottom:45px}#app-root #homepage #introduction \
.mdl-button img{height:20px;margin-right:5px;margin-top:-3px}#explore-page{padding:20px}#explore-page \
.main-content-container{width:100%;float:left;padding-left:270px;padding-right:70px;position:relative}#explore-page \
.right-sidebar-container{display:none}#explore-page .right-sidebar-container \
.ers-section{float:left;width:100%;padding:10px}#explore-page .right-sidebar-container .ers-section \
h3{font-size:20px;font-weight:500}#explore-page .right-sidebar-container .ers-section \
img#download-app{max-width:100%}#explore-page .right-sidebar-container .ers-section \
.sidebar-feed-container{background:rgba(0,0,0,0.03);padding:10px;overflow:auto}#explore-page \
.right-sidebar-container .ers-section .sidebar-feed-container \
ul{padding:0;margin:0;list-style-type:none}#explore-page .right-sidebar-container .ers-section \
.sidebar-feed-container ol{margin:0;padding-left:25px;background-color:white}#explore-page \
.right-sidebar-container .ers-section .sidebar-feed-container ol li{padding-left:40px \
!important;position:relative}#explore-page .right-sidebar-container .ers-section .sidebar-feed-container \
ol li img{position:absolute;top:5px;left:5px;width:30px;height:30px}#explore-page \
.right-sidebar-container .ers-section .sidebar-feed-container ol li>a{display:block}#explore-page \
.right-sidebar-container .ers-section .sidebar-feed-container ol li \
span.cat-name{font-size:12px}#explore-page .right-sidebar-container .ers-section .sidebar-feed-container \
ul,#explore-page .right-sidebar-container .ers-section .sidebar-feed-container ol{border:1px solid \
#ccc}#explore-page .right-sidebar-container .ers-section .sidebar-feed-container ul li,#explore-page \
.right-sidebar-container .ers-section .sidebar-feed-container ol \
li{padding:5px;background-color:white}#explore-page .right-sidebar-container .ers-section \
.sidebar-feed-container ul li .cm-userinfo,#explore-page .right-sidebar-container .ers-section \
.sidebar-feed-container ol li \
.cm-userinfo{background:rgba(0,0,0,0.03);float:right;width:48px;text-align:center;padding:3px}#explore-page \
.right-sidebar-container .ers-section .sidebar-feed-container ul li .cm-userinfo img,#explore-page \
.right-sidebar-container .ers-section .sidebar-feed-container ol li .cm-userinfo \
img{width:42px;height:42px;border-radius:100%}#explore-page .right-sidebar-container .ers-section \
.sidebar-feed-container ul li .cm-userinfo .username,#explore-page .right-sidebar-container .ers-section \
.sidebar-feed-container ol li .cm-userinfo \
.username{display:block;text-align:center;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}#explore-page \
.right-sidebar-container .ers-section .sidebar-feed-container ul li .title,#explore-page \
.right-sidebar-container .ers-section .sidebar-feed-container ol li .title,#explore-page \
.right-sidebar-container .ers-section .sidebar-feed-container ul li .info-row,#explore-page \
.right-sidebar-container .ers-section .sidebar-feed-container ol li \
.info-row{display:block;width:100%}#explore-page .right-sidebar-container .ers-section \
.sidebar-feed-container ul li .title,#explore-page .right-sidebar-container .ers-section \
.sidebar-feed-container ol li .title{font-size:15px}#explore-page .right-sidebar-container .ers-section \
.sidebar-feed-container ul li .content,#explore-page .right-sidebar-container .ers-section \
.sidebar-feed-container ol li .content{font-size:13px;line-height:1}#explore-page \
.right-sidebar-container .ers-section .sidebar-feed-container ul li .info-row,#explore-page \
.right-sidebar-container .ers-section .sidebar-feed-container ol li .info-row{overflow:auto}#explore-page \
.right-sidebar-container .ers-section .sidebar-feed-container ul li .info-row span,#explore-page \
.right-sidebar-container .ers-section .sidebar-feed-container ol li .info-row \
span{float:left;display:inline-block;font-size:12px}#explore-page .right-sidebar-container .ers-section \
.sidebar-feed-container ul li .info-row span.comment-counter,#explore-page .right-sidebar-container \
.ers-section .sidebar-feed-container ol li .info-row span.comment-counter{float:right}#explore-page \
.right-sidebar-container .ers-section .sidebar-feed-container ul li+li,#explore-page \
.right-sidebar-container .ers-section .sidebar-feed-container ol li+li{border-top:1px solid \
#ccc}#explore-page .right-sidebar-container .ers-section .sidebar-feed-container \
.supporter-list-wrapper{border:1px solid \
#ccc;background-color:white;padding:10px;float:left;width:100%}#explore-page .right-sidebar-container \
.ers-section .sidebar-feed-container .supporter-list-wrapper \
.supporter-item{float:left;padding:3px;height:31px;width:31px}#explore-page .right-sidebar-container \
.ers-section .sidebar-feed-container .supporter-list-wrapper .supporter-item \
a{display:block;width:100%;height:100%;float:left}#explore-page .right-sidebar-container .ers-section \
.sidebar-feed-container .supporter-list-wrapper .supporter-item a \
img{width:25px;height:25px;float:left}#explore-page .right-sidebar-container .ers-section \
.sidebar-feed-container#top-products-container small{margin-top:-10px;display:block}#explore-page \
.left-sidebar-container{position:absolute;top:0;left:0;width:270px;padding:0 30px 0 15px}#explore-page \
.left-sidebar-container aside.explore-left-sidebar{background:rgba(0,0,0,0.03);padding:15px \
0;overflow:auto}#explore-page .left-sidebar-container aside.explore-left-sidebar ul{margin:0;padding:0 \
10px;list-style-type:none;float:left;width:100%}#explore-page .left-sidebar-container \
aside.explore-left-sidebar ul li{float:left;width:100%}#explore-page .left-sidebar-container \
aside.explore-left-sidebar ul li a{width:100%;float:left;height:25px;padding:0 \
5px;background-color:transparent;-webkit-transition:all .2s ease-out;-moz-transition:all .2s \
ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}#explore-page .left-sidebar-container \
aside.explore-left-sidebar ul li a span{display:block;width:auto;float:left}#explore-page \
.left-sidebar-container aside.explore-left-sidebar ul li a span.product-counter{float:right}#explore-page \
.left-sidebar-container aside.explore-left-sidebar ul li a:hover,#explore-page .left-sidebar-container \
aside.explore-left-sidebar ul li a.active{background-color:#60bcff;color:white}#explore-page \
.left-sidebar-container aside.explore-left-sidebar ul li ul{border-left:2px solid #ccc;padding:15px 0 0 \
15px}#explore-page .main-content{padding-left:15px;padding-right:0}#explore-page .main-content \
.explore-page-category-title h2{margin-top:0}#explore-page .main-content .explore-page-category-title \
small{font-weight:500;font-size:17px}#product-page{position:relative}#product-page .container{padding:0 \
20%}#product-page #product-download-section{text-align:center;overflow:hidden;height:0;background:rgba(0,0,0,0.5);z-index:1000;-webkit-transition:all \
.5s ease-out;-moz-transition:all .5s ease-out;-o-transition:all .5s ease-out;transition:all .5s \
ease-out}#product-page #product-download-section #files-tab{display:table;margin:20px auto}#product-page \
#product-view-header{background-color:#f7f7f7;padding-bottom:15px}#product-page #product-view-header \
.container .section{padding-left:150px;position:relative}#product-page #product-view-header \
.image-container{position:absolute;left:0;width:140px}#product-page #product-view-header .image-container \
img{position:absolute;top:0;left:0;height:100%;width:100%}#product-page #product-view-header \
.image-container:after{content:"";display:block;padding-bottom:100%}#product-page #product-view-header \
.details-container{width:100%;position:relative}#product-page #product-view-header .details-container \
.info-row{width:100%;float:left;margin-bottom:15px}#product-page #product-view-header .details-container \
.info-row>a{height:30px;display:block;float:left;position:relative}#product-page #product-view-header \
.details-container .info-row>a \
span{display:block;float:left;height:30px;font-size:15px;font-weight:500}#product-page \
#product-view-header .details-container .info-row>a+a{margin-left:10px}#product-page #product-view-header \
.details-container .info-row a.user{padding-left:40px}#product-page #product-view-header \
.details-container .info-row a.user \
span.avatar{width:30px;height:30px;border-radius:100%;display:block;overflow:hidden;position:absolute;left:0;top:0;border:1px \
solid #ccc}#product-page #product-view-header .details-container .info-row a.user span.avatar \
img{width:100%;height:100%;float:left}#product-page #product-view-header .details-container .info-row \
a.user span.username{display:block}#product-page #product-view-header .details-container .info-row \
.product-tags .mdl-chip{height:30px !important;line-height:30px !important;margin:0;margin-top:0 \
!important;margin-left:10px;float:left;display:block;box-shadow:1px 1px 2px rgba(0,0,0,0.5)}#product-page \
#product-view-header .details-container .info-row .product-tags .mdl-chip span{font-weight:500 \
!important;color:#2773b0;margin-right:5px}#product-page #product-view-header .details-container \
\ No newline at end of file
+#metaheader{float:left;width:100%;height:42px}#metaheader \
#metaheader-nav{width:100%;float:left}#metaheader #metaheader-nav .btn-metaheader{padding:0 12px \
!important;border-radius:2px !important;color:white !important;font-size:12px !important;height:30px \
!important;line-height:30px !important;font-weight:bold;border:1px solid \
#3079ed;background:-webkit-linear-gradient(top, #4387fd, #4683ea)}#metaheader #metaheader-nav \
ul.metaheader-menu{padding:0;margin:0;list-style-type:none}#metaheader #metaheader-nav \
ul.metaheader-menu>li{float:left;padding:9px 5px}#metaheader #metaheader-nav \
ul.metaheader-menu>li>a{color:#6a7686;border-radius:5px;padding:5px}#metaheader #metaheader-nav \
ul.metaheader-menu>li>a:active,#metaheader #metaheader-nav \
ul.metaheader-menu>li>a:hover{background-color:#eee}#metaheader #metaheader-nav \
ul.metaheader-menu>li.active>a{background-color:#eee}#metaheader #metaheader-nav \
ul.metaheader-menu>li.active>a img{margin-right:5px}#metaheader #metaheader-nav ul.metaheader-menu>li \
.dropdown-menu::before{content:"";position:absolute;right:356px;top:-8px;width:0;height:0;border-style:solid;border-width:0 \
8.5px 8.5px;border-color:transparent transparent #b7bcc4 \
transparent;border-bottom-color:#fff;border-style:dashed dashed solid;z-index:1}#metaheader \
#metaheader-nav ul.metaheader-menu#domains-menu{margin-left:10px}#metaheader #metaheader-nav \
ul.metaheader-menu#domains-menu>li{padding-left:0}#metaheader #metaheader-nav \
ul.metaheader-menu#domains-menu>li>a{margin:0 10px 0 5px}#metaheader #metaheader-nav \
ul.metaheader-menu#domains-menu>li::after{content:"•";color:#E2E2E2}#metaheader #metaheader-nav \
ul.metaheader-menu#domains-menu>li:last-of-type::after{content:""}#metaheader #metaheader-nav \
ul.metaheader-menu#domains-menu>li.dropdown>ul.dropdown-menu{margin-left:0;margin-top:-9px}#metaheader \
#metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu{position:relative;cursor:pointer;height:60px;z-index:1000}#metaheader \
#metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu:hover \
.dropdown-menu{display:block}#metaheader #metaheader-nav \
ul.metaheader-menu#domains-menu>li#domains-dropdown-menu \
.dropdown-menu{width:400px;top:60px;right:-250px}#metaheader #metaheader-nav \
ul.metaheader-menu#domains-menu>li#domains-dropdown-menu .dropdown-menu::before{right:356px}#metaheader \
#metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu .dropdown-menu \
.submenu-container{width:50%;float:left;height:auto}#metaheader #metaheader-nav \
ul.metaheader-menu#domains-menu>li#domains-dropdown-menu .dropdown-menu .submenu-container \
ul{list-style-type:none;padding:0;margin:0}#metaheader #metaheader-nav \
ul.metaheader-menu#domains-menu>li#domains-dropdown-menu .dropdown-menu .submenu-container ul li \
a{padding:3px 20px;font-size:12px;color:black}#metaheader #metaheader-nav \
ul.metaheader-menu#domains-menu>li#domains-dropdown-menu .dropdown-menu .submenu-container ul li \
ul{margin-bottom:10px}#metaheader #metaheader-nav \
ul.metaheader-menu#domains-menu>li#domains-dropdown-menu .dropdown-menu .submenu-container ul li ul li \
a{padding:3px 30px}#metaheader #metaheader-nav ul.metaheader-menu#domains-menu>li#domains-dropdown-menu \
.dropdown-menu .submenu-container ul li ul li:hover{background-color:#eee}#metaheader #metaheader-nav \
ul.metaheader-menu#domains-menu>li#discussion-boards{position:relative;cursor:pointer;height:60px;z-index:1000}#metaheader \
#metaheader-nav ul.metaheader-menu#domains-menu>li#discussion-boards \
.dropdown-menu{width:200px;top:60px;right:-43px}#metaheader #metaheader-nav \
ul.metaheader-menu#domains-menu>li#discussion-boards .dropdown-menu::before{right:156px}#metaheader \
#metaheader-nav ul.metaheader-menu#user-menu{margin-right:10px}#metaheader #metaheader-nav \
ul.metaheader-menu#user-menu>li#user-login-container{padding:5px}#metaheader #metaheader-nav \
.user-dropdown{position:relative}#metaheader #metaheader-nav .user-dropdown \
.dropdown-toggle{padding:0;background-color:white;color:#6a7686}#metaheader #metaheader-nav \
.user-dropdown .dropdown-toggle:active{background-color:white;box-shadow:none;outline:none}#metaheader \
#metaheader-nav .user-dropdown .dropdown-toggle \
.glyphicon{font-size:16px;top:1px;font-style:normal;font-weight:100;margin:0 5px}#metaheader \
#metaheader-nav .user-dropdown \
.dropdown-menu{border-radius:0;padding:0;width:320px;top:40px;background:#fff;border:1px solid \
#ccc;border-color:rgba(0,0,0,0.2);color:#000;box-shadow:0 2px 10px rgba(0,0,0,0.2)}#metaheader \
#metaheader-nav .user-dropdown \
.dropdown-menu::before{content:"";position:absolute;right:6px;top:-8px;width:0;height:0;border-style:solid;border-width:0 \
8.5px 8.5px;border-color:transparent transparent #b7bcc4 \
transparent;border-bottom-color:#fff;border-style:dashed dashed solid;z-index:1}#metaheader \
#metaheader-nav .user-dropdown .dropdown-menu li{float:left}#metaheader #metaheader-nav \
#user-context-menu-container .user-dropdown .dropdown-menu{padding:23px 28px;right:-42px}#metaheader \
#metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu::before{right:45px}#metaheader \
#metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu \
li{height:auto;width:86px;border:1px solid white;margin:5px 0}#metaheader #metaheader-nav \
#user-context-menu-container .user-dropdown .dropdown-menu li \
a{display:block;width:100%;padding:0;height:auto;float:left}#metaheader #metaheader-nav \
#user-context-menu-container .user-dropdown .dropdown-menu li a .icon{width:55px;height:55px;margin:10px \
auto;background-size:50px;background-position:center center;background-repeat:no-repeat}#metaheader \
#metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li a \
span{float:left;width:100%;text-align:center;display:block;color:rgba(0,0,0,0.87);font-size:13px}#metaheader \
#metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li \
a:active{background-color:white}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown \
.dropdown-menu li#opendesktop-link-item a \
.icon{background-image:url('../img/logo-opendesktop.png')}#metaheader #metaheader-nav \
#user-context-menu-container .user-dropdown .dropdown-menu li#discourse-link-item a \
.icon{background-image:url('../img/logo-discourse.png');background-size:58px}#metaheader #metaheader-nav \
#user-context-menu-container .user-dropdown .dropdown-menu li#gitlab-link-item a \
.icon{background-image:url(../img/logo-gitlab.png)}#metaheader #metaheader-nav \
#user-context-menu-container .user-dropdown .dropdown-menu li#opencode-link-item a \
.icon{background-image:url(../img/logo-opencode.png);background-size:45px}#metaheader #metaheader-nav \
#user-context-menu-container .user-dropdown .dropdown-menu li:hover{border:1px solid #e5e5e5}#metaheader \
#metaheader-nav #user-context-menu-container .user-dropdown .dropdown-menu li:hover \
a{background-color:white}#metaheader #metaheader-nav #user-context-menu-container .user-dropdown \
.dropdown-menu li:active a{background-color:white}#metaheader #metaheader-nav #user-login-menu-container \
.user-dropdown .dropdown-toggle img{height:32px;width:32px;border-radius:100%;margin-top:-4px}#metaheader \
#metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu \
#user-info-section{height:auto;padding:20px;background:white;float:left}#metaheader #metaheader-nav \
#user-login-menu-container .user-dropdown .dropdown-menu #user-info-section \
.user-avatar{height:96px;width:96px;float:left;border-radius:100%;overflow:hidden}#metaheader \
#metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu #user-info-section .user-avatar \
.no-avatar-user-letter{border-radius:100%;height:100%;width:100%;background-color:#c1c1c1;text-align:cente \
r;line-height:80px;font-size:50px;color:white;overflow:hidden;position:relative}#metaheader \
#metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu #user-info-section .user-avatar \
.no-avatar-user-letter img{width:100%}#metaheader #metaheader-nav #user-login-menu-container \
.user-dropdown .dropdown-menu #user-info-section .user-avatar .no-avatar-user-letter \
.change-profile-pic{width:100%;position:absolute;bottom:0;font-size:9px;height:26px;left:0;background-colo \
r:rgba(0,0,0,0.4);line-height:30px;color:white;cursor:pointer;font-weight:bold}#metaheader \
#metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu #user-info-section \
.user-details{width:175px;padding-left:20px;float:left;margin-top:-4px}#metaheader #metaheader-nav \
#user-login-menu-container .user-dropdown .dropdown-menu #user-info-section .user-details \
ul{padding:0;margin:0;list-style-type:none;float:left;width:100%}#metaheader #metaheader-nav \
#user-login-menu-container .user-dropdown .dropdown-menu #user-info-section .user-details ul \
li{width:100%;float:left;height:auto;line-height:15px;font-size:13px;min-height:8px;color:#6a7686}#metaheader \
#metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu #user-info-section .user-details \
ul li a{color:#36c}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu \
#user-info-section .user-details ul li b{color:black}#metaheader #metaheader-nav \
#user-login-menu-container .user-dropdown .dropdown-menu #user-info-section .user-details ul li \
button{margin-top:16px}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown \
.dropdown-menu #main-seperator{margin-top:0;margin-bottom:0;background-color:#ccc}#metaheader \
#metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu li.buttons{padding:10px \
20px;background-color:#f5f5f5}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown \
.dropdown-menu li.buttons .btn{border-radius:2px;padding:0 \
16px;font-size:12px;height:30px;font-weight:normal;color:#666 !important;background:#f8f8f8;border:1px \
solid #c6c6c6}#metaheader #metaheader-nav #user-login-menu-container .user-dropdown .dropdown-menu \
li.buttons .btn:hover{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px \
rgba(0,0,0,0.1);border-color:#c6c6c6;color:#222;background-color:#fff;background-image:-webkit-gradient(linear, \
left top, left bottom, from(#fff), to(#f8f8f8));background-image:-webkit-linear-gradient(top, #fff, \
#f8f8f8);background-image:linear-gradient(top, #fff, #f8f8f8)}header \
div.container.header{height:110px}.small.metamenu{width:100%;background-color:#fff;height:auto;float:left} \
.small.metamenu>ul.left{margin-left:5px}.small.metamenu>ul>li{margin-top:10px}.metaheader-menu-item{margin:5px \
0;margin-top:0 !important;margin-bottom:0 !important}.metaheader-menu-item \
#user-dropdown{margin-bottom:2px;position:relative;margin:5px \
0;height:32px;width:32px;padding:0}.metaheader-menu-item #user-dropdown \
.dropdown-toggle{padding:0;background-color:white;color:#6a7686;-webkit-transition:all .2s \
ease-out;-moz-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s \
ease-out;height:32px;width:32px;overflow:hidden}.metaheader-menu-item #user-dropdown .dropdown-toggle \
.glyphicon{font-size:16px;top:3px;font-style:normal;font-weight:100}.metaheader-menu-item #user-dropdown \
.dropdown-toggle img{width:100%;height:100%;border-radius:100%}.metaheader-menu-item #user-dropdown \
.dropdown-toggle:active{box-shadow:none;outline:none}.metaheader-menu-item #user-dropdown \
.dropdown-menu{border-radius:0;padding:0;width:320px;top:50px;background:#fff;border:1px solid \
#ccc;border-color:rgba(0,0,0,0.2);color:#000;-webkit-box-shadow:0 2px 10px rgba(0,0,0,0.2);box-shadow:0 \
2px 10px rgba(0,0,0,0.2)}.metaheader-menu-item #user-dropdown .dropdown-menu \
.btn-blue{border-radius:2px;padding:0 \
12px;font-size:12px;height:30px;background:#4d90fe;font-weight:bold;border:1px solid \
#3079ed}.metaheader-menu-item #user-dropdown .dropdown-menu \
.btn-blue:hover{background:#357ae8;border-color:#2f5bb7;color:white;box-shadow:0 1px 1px \
rgba(0,0,0,0.2)}.metaheader-menu-item #user-dropdown \
.dropdown-menu::before{content:"";position:absolute;right:6px;top:-8px;width:0;height:0;border-style:solid;border-width:0 \
8.5px 8.5px;border-color:transparent transparent #b7bcc4 \
transparent;border-bottom-color:#fff;border-style:dashed dashed \
solid;z-index:1}.metaheader-menu-item#user-signin-button{padding-top:6px}.metaheader-menu-item#user-signin-button \
a{padding:0;font-size:13px;display:block;height:30px;line-height:30px;color:white}.metaheader-menu-item#user-signin-button \
a .btn-blue{padding:0 \
12px;border-radius:2px;font-size:12px;height:30px;background:#4d90fe;font-weight:bold;border:1px solid \
#3079ed;background:-webkit-linear-gradient(top, #4387fd, \
#4683ea)}.metaheader-menu-item#user-signin-button a \
.btn-blue:hover{color:white}#main-header{background:#4a86cf;width:100%;height:70px;padding-left:275px;position:relative}#main-header \
.logo-header{background-image:none;display:block;height:100px;left:6px;position:absolute;top:-10px;width:265px;z-index:999;overflow:hidden}#main-header \
.user-menu-container{float:right;padding:15px;height:70px;width:auto}#main-header .user-menu-container \
ul{float:right;width:auto;padding:0;margin:0}#main-header #nav-top #nav-left{padding:15px}#main-header \
#nav-top #nav-left form#search{padding:7px;margin-right:7px}#main-header #nav-top #nav-left form#search \
input.content-search{border-radius:10px;border:1px solid #ccc;height:26px;padding:0 \
8px}.products-showcase .products-container \
.square{width:14.28571%;position:relative;float:left;margin-bottom:15px}.products-showcase \
.products-container .square:after{content:"";display:block;padding-bottom:120%}.products-showcase \
.products-container .content{position:absolute;width:100%;height:100%;padding:0 6px}.products-showcase \
.products-container .content a{display:block;width:100%;height:100%;position:relative}.products-showcase \
.products-container .content \
.product-wrapper{position:relative;width:100%;height:100%;background-color:white}.products-showcase \
.products-container .content \
.product-image-container{position:absolute;height:100%;width:100%;overflow:hidden;padding-bottom:60px}.products-showcase \
.products-container .content .product-image-container \
figure{width:100%;height:100%;position:relative}.products-showcase .products-container .content \
.product-image-container figure \
span{position:absolute;bottom:5px;left:0;font-weight:500;color:#636363;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;line-height:1.2;font-weight:500 \
!important;width:100%;padding:0 10px;text-align:center}.products-showcase .products-container .content \
.product-image-container figure \
img{position:absolute;top:50%;left:50%;width:110px;height:110px;margin:-55px 0 0 \
-55px;border-radius:100%}.products-showcase .products-container .content .product-image-container figure \
img.squared{border-radius:0}.products-showcase .products-container .content .product-image-container \
figure img.full{position:relative;width:100%;height:100%;margin:0;border-radius:0;top:0;left:0}.products-showcase \
.products-container .content .product-image-container figure img.padded{border-radius:0;border:10px solid \
white}.products-showcase .products-container .content .product-image-container figure \
img.rounded-corners{border-radius:20%}.products-showcase .products-container .content \
.product-image-container figure img.very-rounded-corners{border-radius:40%}.products-showcase \
.products-container .content .product-info{width:100%;height:60px;color:white;padding:14px \
16px;position:absolute;bottom:0;left:0;background-color:rgba(0,0,0,0.38)}.products-showcase \
.products-container .content .product-info \
span{width:100%;float:left;overflow:hidden;text-overflow:ellipsis;line-height:1.2;font-weight:500 \
!important}.products-showcase .products-container .content .product-info \
span.product-info-title{font-size:90%}.products-showcase .products-container .content .product-info \
span.product-info-description{font-size:70%;height:30px;line-height:15px;overflow:hidden;text-overflow:ell \
ipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.products-showcase \
.products-container .content \
.product-info.music-image{padding-right:40px;padding-left:40px;padding-top:20px;text-align:center}.products-showcase \
.products-container .content .product-info.music-image \
.material-icons{position:absolute;top:18px}.products-showcase .products-container .content \
.product-info.music-image .material-icons.left-icon{left:10px}.products-showcase .products-container \
.content .product-info.music-image .material-icons.right-icon{right:10px}.products-showcase \
.products-container .content:hover .product-wrapper{background-color:#c1c1c1}.explore-products-container \
.product-group-scroll-wrapper .product-group-scroll-loading-container{width:100%;float:left;padding:20px \
0}.explore-products-container .product-group-scroll-wrapper .product-group-scroll-loading-container \
.icon-wrapper{display:table;margin:0 auto}.explore-products-container \
#pagination-container{text-align:center}.explore-products-container #pagination-container \
.wrapper{margin:0 auto;display:table;width:auto}.explore-products-container #pagination-container \
.wrapper ul{padding:0;margin:0;list-style-type:none}.explore-products-container #pagination-container \
.wrapper ul li{float:left;width:auto;margin-right:5px}.explore-products-container #pagination-container \
.wrapper ul li a{font-size:18px}.explore-products-container #pagination-container .wrapper ul li a \
.num-wrap{display:block;float:left}.explore-products-container #pagination-container .wrapper ul li a \
.num-wrap span,.explore-products-container #pagination-container .wrapper ul li a .num-wrap \
i{display:block;float:left}.explore-products-container #pagination-container .wrapper ul li \
a.active{font-weight:500;text-decoration:underline}.explore-top-bar{margin-bottom:20px;border-bottom:2px \
solid #ccc;float:left;width:100%}.explore-top-bar .item{padding:5px 10px;border-bottom:2px solid \
transparent;font-size:14px;margin-bottom:-2px;float:left;cursor:pointer}.explore-top-bar \
.item.active{border-bottom-color:#2673b0}.explore-top-bar \
\ No newline at end of file
diff --git a/httpdocs/theme/react/assets/css/style.css.map \
b/httpdocs/theme/react/assets/css/style.css.map index 92a702bf..e2a81440 100644
--- a/httpdocs/theme/react/assets/css/style.css.map
+++ b/httpdocs/theme/react/assets/css/style.css.map
@@ -1 +1 @@
-{"version":3,"sources":["style.less","/Users/davidnelband/Sites/git/ocs-webserver/httpdocs/theme/react/as \
sets/less/elements.less"],"names":[],"mappings":"AAGA,MAEE,IAAG,UAAU,QACX,aAIJ,cAEE,gBACE,WAAA,CACA,aAAA,C \
ACA,gBALJ,cAEE,eAKE,oBACE,YAAA,CACA,iBAAA,CACA,mBAVN,cAEE,eAKE,mBAKE,cACE,SAAA,CACA,WAAA,CACA,UAAA,CACA,WA \
hBR,cAEE,eAKE,mBAKE,aAME,wBACE,kBAAA,CACA,WAAA,CACA,UAAA,CACA,wBAAA,CACA,iBAAA,CACA,gBAAA,CACA,cAAA,CACA,Y \
A1BV,cAEE,eAKE,mBAsBE,eACE,WAAA,CACA,iBAAA,CACA,WAhCR,cAEE,eAkCE,iBACE,aAKN,aACE,kBAAA,CACA,UAAA,CACA,WAAA \
,CACA,kBAAA,CACA,kBALF,YAOE,cACE,qBAAA,CACA,aAAA,CACA,YAAA,CACA,QAAA,CACA,iBAAA,CACA,SAAA,CACA,WAAA,CACA,W \
AAA,CACA,gBAhBJ,YAmBE,sBACE,WAAA,CACA,YAAA,CACA,WAAA,CACA,WAvBJ,YAmBE,qBAME,IACE,WAAA,CACA,UAAA,CACA,SAAA, \
CACA,SA7BN,YAyCE,SAEE,WACE,aA5CN,YAyCE,SAEE,UAGE,KAAI,QACF,WAAA,CACA,iBAhDR,YAyCE,SAEE,UAGE,KAAI,OAIF,MAAK \
,gBACH,kBAAA,CACA,qBAAA,CACA,WAAA,CACA,cAOV,kBAEE,oBAEE,SACE,eAAA,CACA,iBAAA,CACA,UAAA,CACA,mBARN,kBAEE,oB \
ASE,QAAO,OACL,QAAS,EAAT,CACA,aAAA,CACA,oBAdN,kBAEE,oBAgBE,UACE,iBAAA,CACA,UAAA,CACA,WAAA,CACA,cAtBN,kBAEE, \
oBAgBE,SAME,GACE,aAAA,CACA,UAAA,CACA,WAAA,CACA,kBA5BR,kBAEE,oBAgBE,SAaE,kBACE,iBAAA,CACA,UAAA,CACA,WAAA,CA \
CA,uBAnCR,kBAEE,oBAgBE,SAoBE,0BACE,iBAAA,CACA,WAAA,CACA,UAAA,CACA,eAAA,CACA,oBA3CR,kBAEE,oBAgBE,SAoBE,yBAO \
E,QACE,UAAA,CACA,WAAA,CACA,kBAhDV,kBAEE,oBAgBE,SAoBE,yBAOE,OAKE,MACE,iBAAA,CACA,UAAA,CACA,MAAA,CACA,eAAA,C \
ACA,aAAA,CACA,eAAA,CACA,kBAAA,CACA,sBAAA,CACA,eAAA,CACA,eAAA,YACA,UAAA,CACA,cAAA,CACA,kBA/DZ,kBAEE,oBAgBE, \
SAoBE,yBAOE,OAqBE,KACE,iBAAA,CACA,OAAA,CACA,QAAA,CACA,WAAA,CACA,YAAA,CACA,sBAAA,CACA,mBAGA,kBA1EV,oBAgBE,S \
AoBE,yBAOE,OAqBE,IAUG,SACC,gBAGF,kBA9EV,oBAgBE,SAoBE,yBAOE,OAqBE,IAcG,MACC,iBAAA,CACA,UAAA,CACA,WAAA,CACA, \
QAAA,CACA,eAAA,CACA,KAAA,CACA,OAGF,kBAxFV,oBAgBE,SAoBE,yBAOE,OAqBE,IAwBG,QACC,eAAA,CACA,wBAGF,kBA7FV,oBAgB \
E,SAoBE,yBAOE,OAqBE,IA6BG,iBACC,kBAGF,kBAjGV,oBAgBE,SAoBE,yBAOE,OAqBE,IAiCG,sBACC,kBApGd,kBAEE,oBAgBE,SAyF \
E,eACE,UAAA,CACA,WAAA,CACA,WAAA,CACA,iBAAA,CACA,iBAAA,CACA,QAAA,CACA,MAAA,CACA,kCAnHR,kBAEE,oBAgBE,SAyFE,c \
AUE,MACE,UAAA,CACA,UAAA,CACA,eAAA,CAEA,sBAAA,CACA,eAAA,CACA,eAAA,YAEA,kBA5HR,oBAgBE,SAyFE,cAUE,KASG,oBACC, \
cAGF,kBAhIR,oBAgBE,SAyFE,cAUE,KAaG,0BACC,aAAA,CACA,WAAA,CACA,gBAAA,CACA,eAAA,CACA,sBAAA,CACA,mBAAA,CACA,oB \
AAA,CACA,4BAIJ,kBA5IN,oBAgBE,SAyFE,cAmCG,aACC,kBAAA,CACA,iBAAA,CACA,gBAAA,CACA,kBAJF,kBA5IN,oBAgBE,SAyFE,c \
AmCG,YAMC,iBACE,iBAAA,CACA,SAEA,kBAtJV,oBAgBE,SAyFE,cAmCG,YAMC,gBAIG,WACC,UAIF,kBA3JV,oBAgBE,SAyFE,cAmCG,Y \
AMC,gBASG,YACC,WAMR,kBAlKJ,oBAgBE,SAkJG,MACC,kBACE,yBAOV,2BAUE,8BACE,yCACE,UAAA,CACA,UAAA,CACA,eAdN,2BAUE, \
8BACE,wCAKE,eACE,aAAA,CACA,cAlBR,2BAuBE,uBACE,kBAxBJ,2BAuBE,sBAGE,UACE,aAAA,CACA,aAAA,CACA,WA7BN,2BAuBE,sB \
AGE,SAKE,IACE,SAAA,CACA,QAAA,CACA,qBAlCR,2BAuBE,sBAGE,SAKE,GAKE,IACE,UAAA,CACA,UAAA,CACA,iBAvCV,2BAuBE,sBA \
GE,SAKE,GAKE,GAKE,GACE,eA1CZ,2BAuBE,sBAGE,SAKE,GAKE,GAKE,EAGE,WACE,aAAA,CACA,WA9Cd,2BAuBE,sBAGE,SAKE,GAKE, \
GAKE,EAGE,UAIE,MAhDd,2BAuBE,sBAGE,SAKE,GAKE,GAKE,EAGE,UAIQ,GACJ,aAAA,CACA,WAIJ,2BA/BV,sBAGE,SAKE,GAKE,GAKE \
,EAaG,QACC,eAAA,CACA,0BASd,iBACE,kBAAA,CACA,4BAAA,CACA,UAAA,CACA,WAJF,gBAME,OACE,gBAAA,CACA,mCAAA,CACA,cAA \
A,CACA,kBAAA,CACA,UAAA,CACA,eAEA,gBARF,MAQG,QACC,4BAGF,gBAZF,MAYG,OACC,4BAKN,OACE,UAAA,CACA,WAFF,MAIE,iBAC \
E,cAAA,CACA,aAAA,CACA,WAPJ,MAIE,gBAKE,eACE,qBAAA,CACA,kBAAA,CACA,WAAA,CACA,cAAA,CACA,UAAA,CACA,WAAA,CACA,k \
BAhBN,MAIE,gBAKE,cASE,cACE,kBAAA,CACA,kBApBR,MAIE,gBAKE,cASE,aAIE,KACE,cAAA,CACA,WAAA,CACA,mBAzBV,MAIE,gBA \
KE,cAoBE,MACE,aAAA,CACA,UAAA,CACA,WAhCR,MAIE,gBAKE,cAoBE,KAKE,GACE,eAnCV,MAIE,gBAKE,cAoBE,KASE,KACE,UAAA,C \
ACA,WAAA,CACA,aAAA,CACA,aAAA,CACA,kBAOV,MACE,cACE,eACE,eACE,YAJR,MACE,cACE,eACE,cAGE,wBACE,iBAAA,CACA,SAAA \
,CACA,QAAA,CACA,WAAA,CACA,UAAA,CACA,iBAAA,CACA,cAAA,CACA,gBAAA,CACA,gBAAA,CACA,kBAEA,MAjBR,cACE,eACE,cAGE, \
uBAYG,OACC,UAAA,CACA,wBAAA,CACA,qBAGF,MAvBR,cACE,eACE,cAGE,uBAkBG,MACC,UAAA,CACA,wBAAA,CACA,oBAAA,CACA,iBA \
5BZ,MACE,cACE,eACE,cA6BE,cACE,sBAAA,CACA,iBAAA,CACA,WAAA,CACA,iBApCV,MACE,cACE,eACE,cAoCE,QACE,iBAAA,CACA, \
QAAA,CACA,WA1CV,MACE,cACE,eA2CE,eACE,kBA9CR,MACE,cACE,eA2CE,cAGE,YACE,aAAA,CACA,aAAA,CACA,WAOV,KACE,MACE,G \
ACE,IAHN,KACS,MACL,GACE,IAHN,KACE,MACE,GACM,IAHV,KACS,MACL,GACM,IACF,eAAA,YACA,cAAA,YACA,eAAA,YACA,gBAAA,Y \
AMR,UACE,kDAAA,CACA,cAAA,CACA,eAAA,CACA,gBAJF,SAME,YACE,UAAA,YACA,cARJ,SAWE,MACE,gBAAA,CACA,kBAbJ,SAgBE,GA \
CE,gBAjBJ,SAoBE,aACE,yBAAA,YACA,cAAA,YACA,eAAA,YACA,kDAAA,YAEA,SANF,YAMG,oBACC,UAAA,CACA,cAAA,YACA,mBAAA,Y \
ACA,gBAAA,CACA,mBAAA,CACA,WAAA,YACA,iBAAA,YACA,cAlCN,SAsCE,UACE,eAvCJ,SAsCE,SAIE,iBACE,kBA3CN,SAsCE,SAIE,g \
BAGE,UACE,iBAAA,CACA,OAAA,CACA,QAhDR,SAsCE,SAeE,IArDJ,SAsCE,SAeM,IArDR,SAsCE,SAeU,IArDZ,SAsCE,SAec,IArDhB, \
SAsCE,SAekB,IArDpB,SAsCE,SA4qCD,CA7pCuB,GAClB,UAAA,CACA,YAAA,CACA,eAAA,CACA,WAAA,YAzDN,SAsCE,SAuBE,IACE,UA \
AA,CACA,YAAA,CACA,eAAA,CACA,WAAA,YACA,cAAA,CACA,mBAnEN,SAsCE,SAgCE,IACE,gBAAA,CACA,cAAA,CACA,kBAzEN,SAsCE, \
SAsCE,IACE,cAAA,CACA,kBAAA,CACA,YA/EN,SAwFE,UAEE,SACE,YAAY,aACV,gBA5FR,SAwFE,UAQE,eACE,gBAAA,CACA,mBAlGN,S \
AwFE,UAQE,cAIE,GACE,eAAA,CACA,cAAA,CACA,eAAA,CACA,mBAxGR,SAwFE,UAQE,cAWE,YACE,KACE,WAAA,CACA,gBAAA,CACA,gB \
ASV,cACE,aADF,aAEE,yBAEE,UAAA,CACA,UAAA,CACA,kBAAA,CACA,kBAAA,CACA,kBARJ,aAWE,0BAGE,aAdJ,aAWE,yBAKE,cACE,U \
AAA,CACA,UAAA,CACA,aAnBN,aAWE,yBAKE,aAKE,IACE,cAAA,CACA,gBAvBR,aAWE,yBAKE,aAUE,IAAG,cACD,eA3BR,aAWE,yBAKE, \
aAcE,yBACE,2BAAA,CACA,YAAA,CACA,cAjCR,aAWE,yBAKE,aAcE,wBAKE,IACE,SAAA,CACA,QAAA,CACA,qBAtCV,aAWE,yBAKE,aAc \
E,wBAWE,IACE,QAAA,CACA,iBAAA,CACA,uBA5CV,aAWE,yBAKE,aAcE,wBAWE,GAKE,IACE,iBAAA,YACA,kBAhDZ,aAWE,yBAKE,aAcE \
,wBAWE,GAKE,GAIE,KACE,iBAAA,CACA,OAAA,CACA,QAAA,CACA,UAAA,CACA,YAvDd,aAWE,yBAKE,aAcE,wBAWE,GAKE,GAYE,GACE, \
cA3Dd,aAWE,yBAKE,aAcE,wBAWE,GAKE,GAgBE,KAAI,UACF,eA/Dd,aAWE,yBAKE,aAcE,wBAsCE,IApER,aAWE,yBAKE,aAcE,wBAsCM \
,IACF,sBArEV,aAWE,yBAKE,aAcE,wBAsCE,GAGE,IAvEV,aAWE,yBAKE,aAcE,wBAsCM,GAGF,IACE,WAAA,CACA,uBAzEZ,aAWE,yBAK \
E,aAcE,wBAsCE,GAGE,GAIE,cA3EZ,aAWE,yBAKE,aAcE,wBAsCM,GAGF,GAIE,cACE,2BAAA,CACA,WAAA,CACA,UAAA,CACA,iBAAA,C \
ACA,YAhFd,aAWE,yBAKE,aAcE,wBAsCE,GAGE,GAIE,aAOE,KAlFd,aAWE,yBAKE,aAcE,wBAsCM,GAGF,GAIE,aAOE,KACE,UAAA,CACA \
,WAAA,CACA,mBArFhB,aAWE,yBAKE,aAcE,wBAsCE,GAGE,GAIE,aAaE,WAxFd,aAWE,yBAKE,aAcE,wBAsCM,GAGF,GAIE,aAaE,WACE, \
aAAA,CACA,iBAAA,CACA,eAAA,CACA,kBAAA,CACA,uBA7FhB,aAWE,yBAKE,aAcE,wBAsCE,GAGE,GA0BE,QAjGZ,aAWE,yBAKE,aAcE, \
wBAsCM,GAGF,GA0BE,QAjGZ,aAWE,yBAKE,aAcE,wBAsCE,GAGE,GA0BU,WAjGpB,aAWE,yBAKE,aAcE,wBAsCM,GAGF,GA0BU,WACN,aA \
AA,CACA,WAnGd,aAWE,yBAKE,aAcE,wBAsCE,GAGE,GA+BE,QAtGZ,aAWE,yBAKE,aAcE,wBAsCM,GAGF,GA+BE,QACE,eAvGd,aAWE,yB \
AKE,aAcE,wBAsCE,GAGE,GAmCE,UA1GZ,aAWE,yBAKE,aAcE,wBAsCM,GAGF,GAmCE,UACE,cAAA,CACA,cA5Gd,aAWE,yBAKE,aAcE,wB \
AsCE,GAGE,GAwCE,WA/GZ,aAWE,yBAKE,aAcE,wBAsCM,GAGF,GAwCE,WACE,cAhHd,aAWE,yBAKE,aAcE,wBAsCE,GAGE,GAwCE,UAGE, \
MAlHd,aAWE,yBAKE,aAcE,wBAsCM,GAGF,GAwCE,UAGE,MACE,UAAA,CACA,oBAAA,CACA,eAEA,aA5Gd,yBAKE,aAcE,wBAsCE,GAGE,G \
AwCE,UAGE,KAKG,iBAAD,aA5Gd,yBAKE,aAcE,wBAsCM,GAGF,GAwCE,UAGE,KAKG,iBACC,YAxHlB,aAWE,yBAKE,aAcE,wBAsCE,GA0D \
E,GAAG,IA9Hb,aAWE,yBAKE,aAcE,wBAsCM,GA0DF,GAAG,IACD,0BA/HZ,aAWE,yBAKE,aAcE,wBAqGE,yBACE,qBAAA,CACA,sBAAA,C \
ACA,YAAA,CACA,UAAA,CACA,WAxIV,aAWE,yBAKE,aAcE,wBAqGE,wBAOE,iBACE,UAAA,CACA,WAAA,CACA,WAAA,CACA,WA9IZ,aAWE, \
yBAKE,aAcE,wBAqGE,wBAOE,gBAME,GACE,aAAA,CACA,UAAA,CACA,WAAA,CACA,WApJd,aAWE,yBAKE,aAcE,wBAqGE,wBAOE,gBAME, \
EAME,KACE,UAAA,CACA,WAAA,CACA,WAMR,aApJN,yBAKE,aAcE,wBAiIG,uBACC,OACE,gBAAA,CACA,cAlKZ,aAyKE,yBACE,iBAAA,C \
ACA,KAAA,CACA,MAAA,CACA,WAAA,CACA,sBA9KJ,aAyKE,wBAOE,MAAK,sBACH,2BAAA,CACA,cAAA,CACA,cAnLN,aAyKE,wBAOE,MAA \
K,qBAMH,IACE,QAAA,CACA,cAAA,CACA,oBAAA,CACA,UAAA,CACA,WA3LR,aAyKE,wBAOE,MAAK,qBAMH,GAOE,IACE,UAAA,CACA,WA/ \
LV,aAyKE,wBAOE,MAAK,qBAMH,GAOE,GAIE,GACE,UAAA,CACA,UAAA,CACA,WAAA,CACA,aAAA,CACA,4BAAA,CCvsBR,mCAAA,CACA,g \
CAAA,CACA,8BAAA,CACA,4BD8fJ,aAyKE,wBAOE,MAAK,qBAMH,GAOE,GAIE,EAQE,MACE,aAAA,CACA,UAAA,CACA,WAEA,aArCZ,wBAO \
E,MAAK,qBAMH,GAOE,GAIE,EAQE,KAKG,iBACC,YAIJ,aA1CV,wBAOE,MAAK,qBAMH,GAOE,GAIE,EAkBG,OACD,aA3CV,wBAOE,MAAK,q \
BAMH,GAOE,GAIE,EAmBG,QACC,wBAAA,CACA,YAtNd,aAyKE,wBAOE,MAAK,qBAMH,GAOE,GA6BE,IACE,0BAAA,CACA,sBA5NZ,aAmOE, \
eACE,iBAAA,CACA,gBArOJ,aAmOE,cAIE,6BACE,IACE,aAzOR,aAmOE,cAIE,6BAIE,OACE,eAAA,CACA,eAOR,cACE,kBADF,aAGE,YA \
CE,cAJJ,aAOE,2BACE,iBAAA,CACA,eAAA,CACA,QAAA,CACA,0BAAA,CACA,YAAA,CCjwBA,mCAAA,CACA,gCAAA,CACA,8BAAA,CACA, \
4BDkvBJ,aAOE,0BAQE,YACE,aAAA,CACA,iBAjBN,aAqBE,sBACE,wBAAA,CACA,oBAvBJ,aAqBE,qBAIE,WACE,UACE,kBAAA,CACA,kB \
A5BR,aAqBE,qBAWE,kBACE,iBAAA,CACA,MAAA,CACA,YAnCN,aAqBE,qBAWE,iBAKE,KACE,iBAAA,CACA,KAAA,CACA,MAAA,CACA,WA \
AA,CACA,WA1CR,aAqBE,qBAyBE,iBAAgB,OACd,QAAQ,EAAR,CACA,aAAA,CACA,oBAjDN,aAqBE,qBA+BE,oBACE,UAAA,CACA,kBAtDN \
,aAqBE,qBA+BE,mBAIE,WACE,UAAA,CACA,UAAA,CACA,mBA3DR,aAqBE,qBA+BE,mBAIE,UAKE,GACE,WAAA,CACA,aAAA,CACA,UAAA, \
CACA,kBAjEV,aAqBE,qBA+BE,mBAIE,UAKE,EAME,MACE,aAAA,CACA,UAAA,CACA,WAAA,CACA,cAAA,CACA,gBAxEZ,aAqBE,qBA+BE, \
mBAIE,UAoBE,EAAI,GACF,iBA7EV,aAqBE,qBA+BE,mBAIE,UAwBE,EAAC,MAEC,kBAlFV,aAqBE,qBA+BE,mBAIE,UAwBE,EAAC,KAIC, \
KAAI,QACF,UAAA,CACA,WAAA,CACA,kBAAA,CACA,aAAA,CACA,eAAA,CACA,iBAAA,CACA,MAAA,CACA,KAAA,CACA,sBA7FZ,aAqBE,q \
BA+BE,mBAIE,UAwBE,EAAC,KAIC,KAAI,OAWF,KACE,UAAA,CACA,WAAA,CACA,WAlGd,aAqBE,qBA+BE,mBAIE,UAwBE,EAAC,KAsBC,K \
AAI,UACF,cAvGZ,aAqBE,qBA+BE,mBAIE,UAmDE,cAEE,WACE,WAAA,YACA,gBAAA,YACA,QAAA,CACA,YAAA,YACA,gBAAA,CACA,UAAA \
,CACA,aAAA,CACA,uCArHZ,aAqBE,qBA+BE,mBAIE,UAmDE,cAEE,UAUE,MACE,eAAA,YACA,aAAA,CACA,iBA1Hd,aAqBE,qBA+BE,mBA \
4EE,iCACE,iBAAA,CACA,QAAA,CACA,QAnIR,aAqBE,qBA+BE,mBA4EE,gCAKE,kBACE,YAtIV,aAqBE,qBA+BE,mBA4EE,gCAKE,iBAGE \
,wBACE,iBAAA,CACA,QAAA,CACA,OAAA,CACA,WAAA,CACA,cAAA,CACA,gBAAA,CACA,gBAGF,aA7HR,qBA+BE,mBA4EE,gCAKE,iBAaG \
,cACC,OACE,MACE,YArJhB,aAqBE,qBA+BE,mBA4EE,gCA2BE,QACE,WAAA,CACA,UAAA,CACA,UAAA,CACA,iBAAA,CACA,WAAA,CACA, \
iBAAA,CACA,KAAA,CACA,QAnKV,aAqBE,qBA+BE,mBA4EE,gCA2BE,OAUE,GACE,cAAA,CACA,aAAA,CC55BR,mCAAA,CACA,gCAAA,CAC \
A,8BAAA,CACA,4BDkvBJ,aAqBE,qBA+BE,mBA4EE,gCA2BE,OAgBE,MACE,iBAAA,CACA,MAAA,CACA,KAAA,CACA,UAAA,CACA,WAAA,C \
ACA,iBAAA,CACA,eAAA,CACA,cAAA,CACA,eAAA,YACA,eAGF,aAnKR,qBA+BE,mBA4EE,gCA2BE,OA6BG,MAEC,GACE,cA3Ld,aAqBE,q \
BA+BE,mBA4EE,gCAgEE,wBACE,WAAA,CACA,UAAA,CACA,UAAA,CACA,cAAA,CACA,iBAAA,CACA,QAAA,CACA,QAvMV,aAqBE,qBA+BE, \
mBA4EE,gCAgEE,uBASE,mBACE,iBAAA,CACA,MAAA,CACA,KAAA,CACA,WAAA,CACA,qBAAA,CACA,yBAAA,CACA,oBAAA,CACA,kBAAA, \
CACA,sBAAA,CACA,UAAA,CACA,cAAA,CCz8BR,mCAAA,CACA,gCAAA,CACA,8BAAA,CACA,4BDy8BQ,aAlMV,qBA+BE,mBA4EE,gCAgEE, \
uBASE,kBAcG,OACC,wBAAA,CACA,YAGF,aAvMV,qBA+BE,mBA4EE,gCAgEE,uBASE,kBAmBG,QACC,WAAA,CACA,kBAAA,CACA,kBAAA,C \
ACA,wBAAA,CACA,yBAjOd,aAqBE,qBA+BE,mBA4EE,gCAgEE,uBAqCE,oBACE,iBAAA,CACA,KAAA,CACA,OAAA,CACA,WAAA,CACA,qBA \
AA,CACA,yBAAA,CACA,oBAAA,CACA,kBAAA,CACA,sBAAA,CACA,UAAA,CACA,cAAA,CCr+BR,mCAAA,CACA,gCAAA,CACA,8BAAA,CACA \
,4BDq+BQ,aA9NV,qBA+BE,mBA4EE,gCAgEE,uBAqCE,mBAcG,OACC,wBAAA,CACA,YAGF,aAnOV,qBA+BE,mBA4EE,gCAgEE,uBAqCE,mB \
AmBG,QACC,WAAA,CACA,kBAAA,CACA,wBAAA,CACA,kBAAA,CACA,yBA7Pd,aAqBE,qBA+BE,mBA4EE,gCAgEE,uBAiEE,qBACE,UAAA,C \
ACA,YAnQZ,aAqBE,qBA+BE,mBA4EE,gCAgEE,uBAiEE,oBAIE,cACE,WAAA,CACA,SAAA,CACA,UAAA,CACA,wBAAA,CACA,gCAEA,aAvP \
Z,qBA+BE,mBA4EE,gCAgEE,uBAiEE,oBAIE,aAOG,KACC,yBA7QhB,aAqBE,qBA+BE,mBA4EE,gCAgEE,uBAiEE,oBAgBE,oBACE,SAAA, \
CACA,WAAA,CACA,UAAA,CACA,wBAAA,CACA,6BAtRd,aA8RE,gCACE,kBACE,UAAA,CACA,iBAAA,CACA,aAlSN,aA8RE,gCACE,iBAKE, \
UACE,UAAA,CACA,YAAA,CACA,eAAA,CACA,SAAA,CACA,kBAzSR,aA8RE,gCACE,iBAaE,gBACE,WAAA,CACA,aAAA,CACA,WAAA,CACA, \
cAAA,CACA,UAAA,CACA,sCAAA,CACA,iBAAA,CACA,kBAAA,CACA,wBAAA,CACA,OAAA,CACA,iBAEA,aA3BN,gCACE,iBAaE,eAaG,YAC \
C,iBAAA,CACA,WAFF,aA3BN,gCACE,iBAaE,eAaG,WAGC,GACE,iBAAA,CACA,aAAA,CACA,OAAA,CACA,MAAA,CACA,cAAA,CACA,gBAA \
A,CACA,cAIJ,aAzCN,gCACE,iBAaE,eA2BG,aACC,iBAAA,CACA,YAFF,aAzCN,gCACE,iBAaE,eA2BG,YAGC,GACE,iBAAA,CACA,aAAA \
,CACA,OAAA,CACA,MAAA,CACA,cAAA,CACA,gBAAA,CACA,cAjVZ,aA8RE,gCACE,iBAwDE,wBACE,iBAAA,CACA,KAAA,CACA,MAAA,CA \
CA,YAAA,CChlCJ,mCAAA,CACA,gCAAA,CACA,8BAAA,CACA,4BDkvBJ,aA8RE,gCACE,iBAwDE,uBAOE,eACE,UAAA,CACA,YAAA,CACA, \
WAAA,CACA,iBAAA,CACA,cAAA,CACA,eApWV,aA8RE,gCACE,iBAwDE,uBAOE,cAQE,GACE,aAAA,CACA,aAAA,CACA,UAAA,CACA,cAAA \
,CACA,gBA3WZ,aAkXE,2BACE,cAAA,CACA,KAAA,CACA,MAAA,CACA,UAAA,CACA,WAAA,CACA,2BAAA,CACA,YAAA,CACA,qBA1XJ,aAk \
XE,0BAUE,iBACE,iBAAA,CACA,KAAA,CACA,OAAA,CACA,UAAA,CACA,WAAA,CACA,cAAA,CACA,cAnYN,aAkXE,0BAUE,gBASE,GACE,c \
AAA,CACA,YAvYR,aAkXE,0BAyBE,6BACE,UAAA,CACA,WAAA,CACA,cAAA,CACA,kBA/YN,aAkXE,0BAyBE,4BAME,uBACE,WAAA,CACA, \
UAAA,CACA,iBAAA,CACA,YAAA,CACA,MAAA,CACA,MAvZR,aAkXE,0BAyBE,4BAME,sBAQE,KACE,WAAA,CACA,UAAA,CACA,aAAA,CACA \
,cA7ZV,aAkXE,0BAyBE,4BAME,sBAQE,IAME,QACE,UAAA,CACA,YAjaZ,aAkXE,0BAyBE,4BAME,sBAoBE,aACE,cAAA,CACA,UAAA,CA \
CA,WAAA,CACA,eAAA,CACA,aAAA,CACA,cA3aV,aAkXE,0BAyBE,4BAoCE,gBACE,iBAAA,CACA,OAAA,CACA,gBAAA,CACA,aAAA,CACA \
,WAAA,CACA,cAAA,CACA,UAAA,CACA,sCAAA,CACA,iBAAA,CACA,kBAAA,CACA,wBAAA,CACA,aA3bR,aAkXE,0BAyBE,4BAoCE,eAcE, \
GACE,iBAAA,CACA,aAAA,CACA,OAAA,CACA,MAAA,CACA,cAAA,CACA,gBAAA,CACA,cAGF,aArFN,0BAyBE,4BAoCE,eAwBG,YACC,UAG \
F,aAzFN,0BAyBE,4BAoCE,eA4BG,aACC,WA5cV,aAkXE,0BA+FE,8BACE,iBAAA,CACA,QAAA,CACA,MAAA,CACA,UAAA,CACA,YAAA,CA \
CA,YAAA,CACA,iCAxdN,aAkXE,0BA+FE,6BASE,wBC/sCF,mCAAA,CACA,gCAAA,CACA,8BAAA,CACA,4BDkvBJ,aAkXE,0BA+FE,6BAaE \
,UACE,UAAA,CACA,YAAA,CACA,eAAA,CACA,iBAAA,CACA,UAneR,aAkXE,0BA+FE,6BAqBE,iBACE,YAAA,CACA,WAAA,CACA,cAAA,CA \
CA,UAAA,CACA,eAAA,CACA,iBAAA,CACA,eA7eR,aAkXE,0BA+FE,6BAqBE,gBASE,KA/eR,aAkXE,0BA+FE,6BAqBE,gBASS,QACL,eAA \
A,CACA,gBAAA,CACA,aAAA,CACA,WAAA,CACA,aAAA,CACA,4BAAA,CC1uCN,mCAAA,CACA,gCAAA,CACA,8BAAA,CACA,4BDkvBJ,aAkX \
E,0BA+FE,6BAqBE,gBAmBE,QACE,aAAA,CACA,oBAGF,aA5IN,0BA+FE,6BAqBE,gBAwBG,MACC,KADF,aA5IN,0BA+FE,6BAqBE,gBAwB \
G,MACQ,QACL,sBAIJ,aAlJN,0BA+FE,6BAqBE,gBA8BG,OACC,KADF,aAlJN,0BA+FE,6BAqBE,gBA8BG,OACQ,QACL,uBAtgBZ,aA6gBE \
,iCACE,mBAAA,CACA,UAAA,CACA,WAhhBJ,aA6gBE,gCASE,aACE,uBACE,mBAxhBR,aA6gBE,gCASE,aACE,sBAEE,eAAe,gBACb,iBA1 \
hBV,aAgiBE,6BACE,mBAAA,CACA,UAAA,CACA,WAniBJ,aAgiBE,4BAKE,iBACE,iBAAA,CACA,mBAviBN,aAgiBE,4BAKE,gBAIE,mBAC \
E,iBAAA,CACA,KAAA,CACA,QA5iBR,aAgiBE,4BAgBE,wBAEE,UACE,mBAnjBR,aAgiBE,4BAgBE,wBAME,OAAM,gBACJ,WAAA,CACA,cA \
xjBR,aAgiBE,4BAgBE,wBAME,OAAM,eAIJ,KAAI,WACF,kBA3jBV,aAkkBE,eACI,WAAA,CACA,UAAA,CACA,WArkBN,aAkkBE,cAKI,IA \
CE,mBAxkBR,aAkkBE,cASI,eACE,UAAA,CACA,iBAAA,CACA,iBAAA,CACA,UAAA,CACA,kBAAA,CACA,cAAA,CACA,gBAllBR,aAkkBE, \
cASI,cASE,sBACE,UAAA,CACA,iBAAA,CACA,MAAA,CACA,KAAA,CACA,YAzlBV,aAkkBE,cASI,cASE,qBAOE,uBACE,WAAA,CACA,iBA \
AA,CACA,QAAA,CACA,MAAA,CACA,aAAA,CACA,UAAA,CACA,WAAA,CACA,wBAAA,CACA,iBAAA,CACA,gBAAA,CACA,mBAtmBZ,aAkkBE, \
cASI,cASE,qBAqBE,qBACE,WAAA,CACA,iBAAA,CACA,QAAA,CACA,OAAA,CACA,aAAA,CACA,UAAA,CACA,WAAA,CACA,qBAAA,CACA,i \
BAAA,CACA,gBAAA,CACA,mBApnBZ,aAkkBE,cASI,cASE,qBAmCE,KACE,UAAA,CACA,WAAA,CACA,mBA1nBZ,aAkkBE,cASI,cAmDE,uB \
ACE,UAAA,CACA,UAAA,CACA,eAAA,CACA,mBAloBV,aAkkBE,cASI,cAmDE,sBAME,sBApoBV,aAkkBE,cASI,cAmDE,sBAMwB,oBACpB, \
WAroBZ,aAkkBE,cASI,cAmDE,sBAUE,sBACE,8BAzoBZ,aAkkBE,cASI,cAmDE,sBAUE,qBAGE,EAAC,kBACC,gBA5oBd,aAkkBE,cASI, \
cAmDE,sBAUE,qBAOE,KAAI,oBACF,iBAAA,CACA,aAAA,CACA,OAAA,CACA,MAQd,QAA2B,uBAAuB,kBAChD,SACE,YACE,cAIJ,aACE,Y \
ACE,gBAAA,YAGJ,kBACE,oBACE,SACE,iBAMR,QAA2B,uBAAuB,kBAChD,kBACE,oBACE,SACE,gBAIN,aACE,YACE,gBAAA,aAKN,QAA2 \
B,uBAAwB,kBACjD,kBACE,oBACE,SACE,UAIN,aACE,YACE,eAcN,QAA2B,uBAAwB,kBACjD,kBACE,oBACE,SACE,UAIN,aACE,YACE,e \
A2BN,QAA0B,sBAAuB,iBAC/C,SACE,YACE,aAGJ,aACE,YACE,aAAA,CACA,aAGJ,kBACE,oBACE,SACE,gBA4BR,QAA0B,iBACxB,SACE \
,YACE,aAGJ,kBACE,oBACE,SACE,UAIN,2BACE,mBACE,oBACE,SACE,YAoBV,QAA0B,iBACxB,SACE,YACE,aAGJ,kBACE,oBACE,SACE,WAKN,aACE,yBACE,UAAA,CACA,WAHJ,aAME,0BACE,UAAA,CACA"}
\ No newline at end of file
+{"version":3,"sources":["style.less","/Users/davidnelband/Sites/git/ocs-webserver/httpdocs/theme/react/as \
sets/less/elements.less"],"names":[],"mappings":"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"} \ No newline at end of \
file
diff --git a/httpdocs/theme/react/assets/img/logo-discourse.png \
b/httpdocs/theme/react/assets/img/logo-discourse.png new file mode 100644
index 00000000..294f991e
Binary files /dev/null and b/httpdocs/theme/react/assets/img/logo-discourse.png differ
diff --git a/httpdocs/theme/react/assets/img/logo-gitlab.png \
b/httpdocs/theme/react/assets/img/logo-gitlab.png new file mode 100644
index 00000000..e07de524
Binary files /dev/null and b/httpdocs/theme/react/assets/img/logo-gitlab.png differ
diff --git a/httpdocs/theme/react/assets/img/logo-opencode.png \
b/httpdocs/theme/react/assets/img/logo-opencode.png new file mode 100644
index 00000000..b8a0625d
Binary files /dev/null and b/httpdocs/theme/react/assets/img/logo-opencode.png differ
diff --git a/httpdocs/theme/react/assets/img/logo-opendesktop.png \
b/httpdocs/theme/react/assets/img/logo-opendesktop.png new file mode 100644
index 00000000..26bc6aad
Binary files /dev/null and b/httpdocs/theme/react/assets/img/logo-opendesktop.png differ
diff --git a/httpdocs/theme/react/assets/less/style.less b/httpdocs/theme/react/assets/less/style.less
index 72a6f120..f2644894 100644
--- a/httpdocs/theme/react/assets/less/style.less
+++ b/httpdocs/theme/react/assets/less/style.less
@@ -2,6 +2,474 @@ out: ../css/style.css, sourcemap: true, compress: true
@import "elements.less";
+#metaheader {
+ float: left;
+ width: 100%;
+ height: 42px;
+
+ #metaheader-nav {
+ width: 100%;
+ float: left;
+
+ .btn-metaheader {
+ padding: 0 12px !important;
+ border-radius: 2px !important;
+ color: white !important;
+ font-size: 12px !important;
+ height: 30px !important;
+ line-height: 30px !important;
+ font-weight: bold;
+ border: 1px solid #3079ed;
+ background: -webkit-linear-gradient(top, #4387fd, #4683ea);
+ }
+
+ ul.metaheader-menu {
+ padding: 0;
+ margin: 0;
+ list-style-type: none;
+
+ > li {
+ float: left;
+ padding: 9px 5px;
+
+ > a {
+ color: #6a7686;
+ border-radius: 5px;
+ padding: 5px;
+
+ &:active,
+ &:hover {
+ background-color: #eee;
+ }
+ }
+
+ &.active {
+
+ > a {
+ background-color: #eee;
+
+ img {
+ margin-right: 5px;
+ }
+ }
+ }
+
+ .dropdown-menu {
+ &::before {
+ content: "";
+ position: absolute;
+ right: 356px;
+ top: -8px;
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 8.5px 8.5px;
+ border-color: transparent transparent #b7bcc4 transparent;
+ border-bottom-color: #fff;
+ border-style: dashed dashed solid;
+ z-index: 1;
+ }
+ }
+ }
+
+ &#domains-menu {
+ margin-left: 10px;
+
+ > li {
+ padding-left: 0;
+
+ > a {
+ margin: 0 10px 0 5px;
+ }
+
+ &::after {
+ content: "•";
+ color: #E2E2E2;
+ }
+
+ &:last-of-type {
+
+ &::after {
+ content: "";
+ }
+ }
+
+ &.dropdown {
+
+ > ul.dropdown-menu {
+ margin-left: 0;
+ margin-top: -9px;
+ }
+ }
+
+ &#domains-dropdown-menu {
+ position: relative;
+ cursor: pointer;
+ height: 60px;
+ z-index: 1000;
+
+ &:hover {
+ .dropdown-menu {
+ display: block;
+ }
+ }
+
+ .dropdown-menu {
+ width: 400px;
+ top: 60px;
+ right: -250px;
+
+ &::before {
+ right: 356px;
+ }
+
+ .submenu-container {
+ width: 50%;
+ float: left;
+ height: auto;
+ ul {
+ list-style-type: none;
+ padding: 0;
+ margin: 0;
+
+ li {
+ a {
+ padding: 3px 20px;
+ font-size: 12px;
+ color: black;
+ }
+ ul {
+ margin-bottom: 10px;
+ li {
+ a {
+ padding: 3px 30px;
+ }
+ &:hover {
+ background-color: #eee;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ &#discussion-boards {
+ position: relative;
+ cursor: pointer;
+ height: 60px;
+ z-index: 1000;
+
+ .dropdown-menu {
+ width: 200px;
+ top: 60px;
+ right: -43px;
+
+ &::before {
+ right: 156px;
+ }
+ }
+ }
+ }
+ }
+
+ &#user-menu {
+ margin-right: 10px;
+
+ > li {
+
+ &#user-login-container {
+ padding: 5px;
+ }
+ }
+ }
+ }
+
+ .user-dropdown {
+ position: relative;
+
+ .dropdown-toggle {
+ padding: 0;
+ background-color: white;
+ color: #6a7686;
+
+ &:active {
+ background-color: white;
+ box-shadow: none;
+ outline: none;
+ }
+
+ .glyphicon {
+ font-size: 16px;
+ top: 1px;
+ font-style: normal;
+ font-weight: 100;
+ margin: 0 5px;
+ }
+ }
+
+ .dropdown-menu {
+ border-radius: 0;
+ padding: 0;
+ width: 320px;
+ top: 40px;
+ background: #fff;
+ border: 1px solid #ccc;
+ border-color: rgba(0,0,0,0.2);
+ color: #000;
+ box-shadow: 0 2px 10px rgba(0,0,0,0.2);
+
+ &::before {
+ content: "";
+ position: absolute;
+ right: 6px;
+ top: -8px;
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 8.5px 8.5px;
+ border-color: transparent transparent #b7bcc4 transparent;
+ border-bottom-color: #fff;
+ border-style: dashed dashed solid;
+ z-index: 1;
+ }
+
+ li {
+ float: left;
+ }
+ }
+ }
+
+ #user-context-menu-container {
+
+ .user-dropdown {
+
+ .dropdown-menu {
+ padding: 23px 28px;
+ right: -42px;
+
+ &::before {
+ right: 45px;
+ }
+
+ li {
+ height: auto;
+ width: 86px;
+ border: 1px solid white;
+ margin: 5px 0;
+
+ a {
+ display: block;
+ width: 100%;
+ padding: 0;
+ height: auto;
+ float: left;
+
+ .icon {
+ width: 55px;
+ height: 55px;
+ margin: 10px auto;
+ background-size: 50px;
+ background-position: center center;
+ background-repeat: no-repeat;
+ }
+
+ span {
+ float: left;
+ width: 100%;
+ text-align: center;
+ display: block;
+ color:rgba(0,0,0,0.87);
+ font-size: 13px;
+ }
+
+ &:active {
+ background-color: white;
+ }
+ }
+
+ &#opendesktop-link-item {
+ a {
+ .icon {
+ background-image: url('../img/logo-opendesktop.png');
+ }
+ }
+ }
+
+ &#discourse-link-item {
+ a {
+ .icon {
+ background-image: url('../img/logo-discourse.png');
+ background-size: 58px;
+ }
+ }
+ }
+
+ &#gitlab-link-item {
+ a {
+ .icon {
+ background-image: url(../img/logo-gitlab.png);
+ }
+ }
+ }
+
+ &#opencode-link-item {
+ a {
+ .icon {
+ background-image: url(../img/logo-opencode.png);
+ background-size: 45px;
+ }
+ }
+ }
+
+ &:hover {
+ border:1px solid #e5e5e5;
+ a {
+ background-color: white;
+ }
+ }
+
+ &:active {
+ a {
+ background-color: white;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ #user-login-menu-container {
+ .user-dropdown {
+ .dropdown-toggle {
+ img {
+ height: 32px;
+ width: 32px;
+ border-radius: 100%;
+ margin-top: -4px;
+ }
+ }
+ .dropdown-menu {
+ #user-info-section {
+ height: auto;
+ padding: 20px;
+ background: white;
+ float: left;
+
+ .user-avatar {
+ height: 96px;
+ width: 96px;
+ float: left;
+ border-radius: 100%;
+ overflow: hidden;
+
+ .no-avatar-user-letter {
+ border-radius: 100%;
+ height: 100%;
+ width: 100%;
+ background-color: #c1c1c1;
+ text-align: center;
+ line-height: 80px;
+ font-size: 50px;
+ color: white;
+ overflow: hidden;
+ position: relative;
+
+ img {
+ width: 100%;
+ }
+
+ .change-profile-pic {
+ width: 100%;
+ position: absolute;
+ bottom: 0;
+ font-size: 9px;
+ height: 26px;
+ left: 0;
+ background-color: rgba(0,0,0,0.4);
+ line-height: 30px;
+ color: white;
+ cursor: pointer;
+ font-weight: bold;
+ }
+ }
+ }
+ .user-details {
+ width: 175px;
+ padding-left: 20px;
+ float: left;
+ margin-top: -4px;
+
+ ul {
+ padding: 0;
+ margin: 0;
+ list-style-type: none;
+ float: left;
+ width: 100%;
+
+ li {
+ width: 100%;
+ float: left;
+ height: auto;
+ line-height: 15px;
+ font-size: 13px;
+ min-height: 8px;
+ color: #6a7686;
+
+ a {
+ color: #36c;
+ }
+
+ b {
+ color: black;
+ }
+
+ button {
+ margin-top: 16px;
+ }
+ }
+ }
+ }
+ }
+ #main-seperator {
+ margin-top: 0;
+ margin-bottom: 0;
+ background-color: #ccc;
+ }
+ li.buttons {
+ padding: 10px 20px;
+ background-color: #f5f5f5;
+
+ .btn {
+ border-radius: 2px;
+ padding: 0 16px;
+ font-size: 12px;
+ height: 30px;
+ font-weight: normal;
+ color: #666 !important;
+ background: #f8f8f8;
+ border: 1px solid #c6c6c6;
+
+ &:hover {
+ -webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.1);
+ box-shadow: 0 1px 1px rgba(0,0,0,0.1);
+ border-color: #c6c6c6;
+ color: #222;
+ background-color: #fff;
+ background-image: -webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));
+ background-image: -webkit-linear-gradient(top,#fff,#f8f8f8);
+ background-image: -webkit-linear-gradient(top,#fff,#f8f8f8);
+ background-image: linear-gradient(top,#fff,#f8f8f8);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
header {
div.container.header {
@@ -9,44 +477,142 @@ header {
}
}
-#user-dropdown {
+.small.metamenu {
+ width: 100%;
+ background-color: #fff;
+ height: auto;
+ float: left;
- .dropdown-menu {
- width: 300px;
- padding-top: 0;
- overflow: hidden;
+ > ul {
+ &.left {
+ margin-left: 5px;
+ }
+ > li {
+ margin-top: 10px;
+ }
+ }
+}
- #user-info-section {
- height: 100px;
- padding: 10px 20px;
- background: #f8f8f8;
+.metaheader-menu-item {
+ margin: 5px 0;
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
- .user-avatar {
- width: 40%;
- height: 80px;
- width: 80px;
- float: left;
+ #user-dropdown {
+ margin-bottom: 2px;
+ position: relative;
+ margin: 5px 0;
+ height: 32px;
+ width: 32px;
+ padding: 0;
- .no-avatar-user-letter {
- border-radius: 100%;
- height: 100%;
- width: 100%;
- background-color: #c1c1c1;
- text-align: center;
- line-height: 80px;
- font-size: 50px;
+ .dropdown-toggle {
+ padding: 0;
+ background-color: white;
+ color: #6a7686;
+ .transition();
+ height: 32px;
+ width: 32px;
+ overflow: hidden;
+
+ .glyphicon {
+ font-size: 16px;
+ top: 3px;
+ font-style: normal;
+ font-weight: 100;
+ }
+
+ img {
+ width: 100%;
+ height: 100%;
+ border-radius: 100%;
+ }
+
+ &:active {
+ box-shadow: none;
+ outline: none;
+ }
+
+ }
+
+ .dropdown-menu {
+ border-radius: 0;
+ padding: 0;
+ width: 320px;
+ top: 50px;
+ background: #fff;
+ border: 1px solid #ccc;
+ border-color: rgba(0,0,0,.2);
+ color: #000;
+ -webkit-box-shadow: 0 2px 10px rgba(0,0,0,.2);
+ box-shadow: 0 2px 10px rgba(0,0,0,.2);
+
+ .btn-blue {
+ border-radius: 2px;
+ padding: 0 12px;
+ font-size: 12px;
+ height: 30px;
+ background: #4d90fe;
+ font-weight: bold;
+ border: 1px solid #3079ed;
+
+ &:hover {
+ background: #357ae8;
+ border-color: #2f5bb7;
color: white;
+ box-shadow: 0 1px 1px rgba(0,0,0,0.2);
}
}
- .user-details {
- width: 175px;
- padding-left: 20px;
- float: left;
+
+
+ &::before {
+ content: "";
+ position: absolute;
+ right: 6px;
+ top: -8px;
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 8.5px 8.5px;
+ border-color: transparent transparent #b7bcc4 transparent;
+ border-bottom-color: #fff;
+ border-style: dashed dashed solid;
+ z-index: 1;
}
}
- #main-seperator {
- margin-top: 0;
+ }
+
+ &#user-context-dropdown-container {
+
+ }
+
+ &#user-signin-button {
+ padding-top: 6px;
+
+ a {
+ padding: 0;
+ font-size: 13px;
+ display: block;
+ height: 30px;
+ line-height: 30px;
+ color: white;
+
+ .btn-blue {
+ padding: 0 12px;
+ border-radius: 2px;
+ font-size: 12px;
+ height: 30px;
+ background: #4d90fe;
+ font-weight: bold;
+ border: 1px solid #3079ed;
+ background: -webkit-linear-gradient(top,#4387fd,#4683ea);
+
+ &:hover {
+ color: white;
+ }
+
+ }
}
}
}
diff --git a/httpdocs/theme/react/metaheader.js b/httpdocs/theme/react/metaheader.js
new file mode 100644
index 00000000..2b65df81
--- /dev/null
+++ b/httpdocs/theme/react/metaheader.js
@@ -0,0 +1,508 @@
+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;
+ }
+
+ return {
+ generateMenuGroupsArray
+ };
+}();
+class MetaHeader extends React.Component {
+ constructor(props) {
+ super(props);
+ this.state = {
+ baseUrl: baseUrl,
+ blogUrl: blogUrl,
+ loginUrl: loginUrl,
+ domains: domains,
+ user: user,
+ sName: sName,
+ loading: false
+ };
+ }
+
+ componentDidMount() {
+ console.log(this.state);
+ }
+
+ render() {
+
+ return React.createElement(
+ "nav",
+ { id: "metaheader-nav", className: "metaheader" },
+ React.createElement(
+ "div",
+ { className: "metamenu" },
+ React.createElement(DomainsMenu, {
+ domains: this.state.domains,
+ baseUrl: this.state.baseUrl,
+ sName: this.state.sName
+ }),
+ React.createElement(UserMenu, {
+ user: this.state.user,
+ blogUrl: this.state.blogUrl,
+ loginUrl: this.state.loginUrl
+ })
+ )
+ );
+ }
+}
+
+class DomainsMenu extends React.Component {
+ constructor(props) {
+ super(props);
+ this.state = {};
+ }
+
+ componentDidMount() {
+ const menuGroups = appHelpers.generateMenuGroupsArray(this.props.domains);
+ this.setState({ menuGroups: menuGroups });
+ }
+
+ render() {
+ let menuGroupsDisplayLeft, menuGroupsDisplayRight;
+ if (this.state.menuGroups) {
+ menuGroupsDisplayLeft = this.state.menuGroups.slice(0, 2).map((mg, i) => \
React.createElement(DomainsMenuGroup, { + key: i,
+ domains: this.props.domains,
+ menuGroup: mg,
+ sName: this.props.sName
+ }));
+ menuGroupsDisplayRight = this.state.menuGroups.slice(2).map((mg, i) => \
React.createElement(DomainsMenuGroup, { + key: i,
+ domains: this.props.domains,
+ menuGroup: mg,
+ sName: this.props.sName
+ }));
+ }
+ return React.createElement(
+ "ul",
+ { className: "metaheader-menu left", id: "domains-menu" },
+ React.createElement(
+ "li",
+ { className: "active" },
+ React.createElement(
+ "a",
+ { href: "http://" + this.props.baseUrl },
+ React.createElement("img", { src: "/images/system/ocs-logo-rounded-16x16.png", className: \
"logo" }), + "openDesktop.org :"
+ )
+ ),
+ React.createElement(
+ "li",
+ { id: "domains-dropdown-menu", className: "dropdown" },
+ React.createElement(
+ "a",
+ { id: "dropdownMenu3",
+ "data-toggle": "dropdown",
+ "aria-haspopup": "true",
+ "aria-expanded": "true" },
+ "Themes & Apps"
+ ),
+ React.createElement(
+ "ul",
+ { className: "dropdown-menu dropdown-menu-right", "aria-labelledby": "dropdownMenu3" },
+ React.createElement(
+ "li",
+ { className: "submenu-container" },
+ React.createElement(
+ "ul",
+ null,
+ menuGroupsDisplayLeft
+ )
+ ),
+ React.createElement(
+ "li",
+ { className: "submenu-container" },
+ React.createElement(
+ "ul",
+ null,
+ menuGroupsDisplayRight
+ )
+ )
+ )
+ ),
+ React.createElement(
+ "li",
+ { id: "discussion-boards", className: "dropdown" },
+ React.createElement(
+ "a",
+ { id: "dropdownMenu4",
+ "data-toggle": "dropdown",
+ "aria-haspopup": "true",
+ "aria-expanded": "true" },
+ "Discussion Boards"
+ ),
+ React.createElement(
+ "ul",
+ { className: "dropdown-menu dropdown-menu-right", "aria-labelledby": "dropdownMenu4" },
+ React.createElement(
+ "li",
+ null,
+ React.createElement(
+ "a",
+ { href: "https://forum.opendesktop.org/c/general" },
+ "General"
+ )
+ ),
+ React.createElement(
+ "li",
+ null,
+ React.createElement(
+ "a",
+ { href: "https://forum.opendesktop.org/c/themes-and-apps" },
+ "Themes & Apps"
+ )
+ ),
+ React.createElement(
+ "li",
+ null,
+ React.createElement(
+ "a",
+ null,
+ "Coding"
+ )
+ )
+ )
+ )
+ );
+ }
+}
+
+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) \
=> React.createElement( + "li",
+ { key: index },
+ React.createElement(
+ "a",
+ { href: "http://" + domain.menuhref },
+ domain.name
+ )
+ ));
+
+ return React.createElement(
+ "li",
+ null,
+ React.createElement(
+ "a",
+ { href: "#" },
+ React.createElement(
+ "b",
+ null,
+ this.props.menuGroup
+ )
+ ),
+ React.createElement(
+ "ul",
+ { className: "domains-sub-menu" },
+ domainsDisplay
+ )
+ );
+ }
+}
+
+class UserMenu extends React.Component {
+ constructor(props) {
+ super(props);
+ this.state = {};
+ }
+
+ render() {
+ let userDropdownDisplay;
+ if (this.props.user) {
+ userDropdownDisplay = React.createElement(UserLoginMenuContainer, {
+ user: this.props.user
+ });
+ } else {
+ userDropdownDisplay = React.createElement(
+ "li",
+ { id: "user-login-container" },
+ React.createElement(
+ "a",
+ { href: this.props.loginUrl, className: "btn btn-metaheader" },
+ "Login"
+ )
+ );
+ }
+
+ return React.createElement(
+ "div",
+ { id: "user-menu-container", className: "right" },
+ React.createElement(
+ "ul",
+ { className: "metaheader-menu", id: "user-menu" },
+ React.createElement(
+ "li",
+ null,
+ React.createElement(
+ "a",
+ { href: "/community" },
+ "Community"
+ )
+ ),
+ React.createElement(
+ "li",
+ null,
+ React.createElement(
+ "a",
+ { href: this.props.blogUrl, target: "_blank" },
+ "Blog"
+ )
+ ),
+ React.createElement(
+ "li",
+ null,
+ React.createElement(
+ "a",
+ { id: "plingList", className: "popuppanel", href: "/plings" },
+ "What are Plings?"
+ )
+ ),
+ React.createElement(
+ "li",
+ null,
+ React.createElement(
+ "a",
+ { id: "ocsapiContent", className: "popuppanel", href: "/partials/ocsapicontent.phtml" },
+ "API"
+ )
+ ),
+ React.createElement(
+ "li",
+ null,
+ React.createElement(
+ "a",
+ { id: "aboutContent", className: "popuppanel", href: "/partials/about.phtml" },
+ "About"
+ )
+ ),
+ React.createElement(UserContextMenuContainer, null),
+ userDropdownDisplay
+ )
+ );
+ }
+}
+
+class UserContextMenuContainer extends React.Component {
+ constructor(props) {
+ super(props);
+ this.state = {};
+ }
+
+ render() {
+ return React.createElement(
+ "li",
+ { id: "user-context-menu-container" },
+ React.createElement(
+ "div",
+ { className: "user-dropdown" },
+ React.createElement(
+ "button",
+ {
+ className: "btn btn-default dropdown-toggle",
+ type: "button",
+ id: "dropdownMenu2",
+ "data-toggle": "dropdown",
+ "aria-haspopup": "true",
+ "aria-expanded": "true" },
+ React.createElement("span", { className: "glyphicon glyphicon-th" })
+ ),
+ React.createElement(
+ "ul",
+ { className: "dropdown-menu dropdown-menu-right", "aria-labelledby": "dropdownMenu2" },
+ React.createElement(
+ "li",
+ { id: "opendesktop-link-item" },
+ React.createElement(
+ "a",
+ { href: "http://www.opendesktop.org" },
+ React.createElement("div", { className: "icon" }),
+ React.createElement(
+ "span",
+ null,
+ "Themes ",
+ React.createElement("br", null),
+ " & Apps"
+ )
+ )
+ ),
+ React.createElement(
+ "li",
+ { id: "discourse-link-item" },
+ React.createElement(
+ "a",
+ { href: "http://discourse.opendesktop.org/" },
+ React.createElement("div", { className: "icon" }),
+ React.createElement(
+ "span",
+ null,
+ "Discussion ",
+ React.createElement("br", null),
+ " Boards"
+ )
+ )
+ ),
+ React.createElement(
+ "li",
+ { id: "opencode-link-item" },
+ React.createElement(
+ "a",
+ { href: "https://www.opencode.net/" },
+ React.createElement("div", { className: "icon" }),
+ React.createElement(
+ "span",
+ null,
+ "Coding ",
+ React.createElement("br", null),
+ " Tools"
+ )
+ )
+ )
+ )
+ )
+ );
+ }
+}
+
+class UserLoginMenuContainer extends React.Component {
+ constructor(props) {
+ super(props);
+ this.state = {};
+ }
+
+ render() {
+ return React.createElement(
+ "li",
+ { id: "user-login-menu-container" },
+ React.createElement(
+ "div",
+ { className: "user-dropdown" },
+ React.createElement(
+ "button",
+ {
+ className: "btn btn-default dropdown-toggle",
+ type: "button",
+ id: "userLoginDropdown",
+ "data-toggle": "dropdown",
+ "aria-haspopup": "true",
+ "aria-expanded": "true" },
+ React.createElement("img", { src: this.props.user.profile_image_url })
+ ),
+ React.createElement(
+ "ul",
+ { className: "dropdown-menu dropdown-menu-right", "aria-labelledby": "userLoginDropdown" },
+ React.createElement(
+ "li",
+ { id: "user-info-menu-item" },
+ React.createElement(
+ "div",
+ { id: "user-info-section" },
+ React.createElement(
+ "div",
+ { className: "user-avatar" },
+ React.createElement(
+ "div",
+ { className: "no-avatar-user-letter" },
+ React.createElement("img", { src: this.props.user.profile_image_url }),
+ React.createElement(
+ "a",
+ { className: "change-profile-pic" },
+ "Change"
+ )
+ )
+ ),
+ React.createElement(
+ "div",
+ { className: "user-details" },
+ React.createElement(
+ "ul",
+ null,
+ React.createElement(
+ "li",
+ null,
+ React.createElement(
+ "b",
+ null,
+ this.props.user.username
+ )
+ ),
+ React.createElement(
+ "li",
+ null,
+ this.props.user.mail
+ ),
+ React.createElement("li", null),
+ React.createElement(
+ "li",
+ null,
+ React.createElement(
+ "a",
+ null,
+ "Profile"
+ ),
+ " - ",
+ React.createElement(
+ "a",
+ null,
+ "Privacy"
+ )
+ ),
+ React.createElement(
+ "li",
+ null,
+ React.createElement(
+ "button",
+ { className: "btn btn-default btn-metaheader" },
+ "Account"
+ )
+ )
+ )
+ )
+ )
+ ),
+ React.createElement("li", { id: "main-seperator", role: "separator", className: "divider" }),
+ React.createElement(
+ "li",
+ { className: "buttons" },
+ React.createElement(
+ "button",
+ { className: "btn btn-default btn-metaheader" },
+ "Add Account"
+ ),
+ React.createElement(
+ "button",
+ { className: "btn btn-default pull-right btn-metaheader" },
+ React.createElement(
+ "a",
+ { href: "/register" },
+ "Sign Up"
+ )
+ )
+ )
+ )
+ )
+ );
+ }
+}
+
+ReactDOM.render(React.createElement(MetaHeader, null), document.getElementById('metaheader'));
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic