diff --git a/application/modules/backend/controllers/ProjectController.php b/application/modules/backend/controllers/ProjectController.php index 7cce9a205..a4bf8416c 100644 --- a/application/modules/backend/controllers/ProjectController.php +++ b/application/modules/backend/controllers/ProjectController.php @@ -1,376 +1,398 @@ . **/ class Backend_ProjectController extends Local_Controller_Action_Backend { const RESULT_OK = "OK"; const RESULT_ERROR = "ERROR"; const DATA_ID_NAME = 'project_id'; const PARAM_FEATURED = 'featured'; const PARAM_APPROVED = 'ghns_excluded'; const PARAM_PLING_EXCLUDED = 'pling_excluded'; const PARAM_PRODUCT_DANGEROUS = 'product_dangerous'; + const PARAM_PRODUCT_DEPRECATED = 'product_deprecated'; + const PARAM_MSG ='msg'; /** @var Default_Model_Project */ protected $_model; protected $_modelName = 'Default_Model_Project'; protected $_pageTitle = 'Manage Products'; public function init() { $this->_model = new $this->_modelName(); $this->view->pageTitle = $this->_pageTitle; parent::init(); } public function indexAction() { } public function listAction() { $startIndex = (int)$this->getParam('jtStartIndex'); $pageSize = (int)$this->getParam('jtPageSize'); $sorting = $this->getParam('jtSorting'); $filter['title'] = $this->getParam('filter_title'); $filter['project_id'] = $this->getParam('filter_project_id'); $filter['member_id'] = $this->getParam('filter_member_id'); $filter['claimable'] = $this->getParam('filter_claimable'); $filter['type_id'][1] = $this->getParam('filter_project_page'); $filter['type_id'][2] = $this->getParam('filter_personal_page'); $filter['type_id'][3] = $this->getParam('filter_updates'); $select = $this->_model->select()->order($sorting)->limit($pageSize, $startIndex); $metadata = $this->_model->info(Zend_Db_Table_Abstract::METADATA); foreach ($filter as $key => $value) { if (is_array($value)) { $list = ''; foreach ($value as $element) { if (isset($element)) { $list = $list . ',' . $element; } } if (empty($list)) { continue; } $list = substr($list, 1); $select->where("{$key} in ({$list})"); continue; } if (false === empty($value)) { $data_type = $metadata[$key]['DATA_TYPE']; if (($data_type == 'varchar') OR ($data_type == 'text')) { $select->where("{$key} like ?", '%' . $value . '%'); } else { $select->where("{$key} = ?", $value); } } } $auth = Zend_Auth::getInstance(); if ($auth->hasIdentity()) { $identity = $auth->getIdentity(); $roleName = $identity->roleName; switch ($roleName) { case Default_Plugin_AclRules::ROLENAME_STAFF: $select->where('status >= ?', Default_Model_DbTable_Project::PROJECT_ILLEGAL); break; } } $reports = $this->_model->fetchAll($select); $reportsAll = $this->_model->fetchAll($select->limit(null, null)->reset('columns') ->columns(array('countAll' => new Zend_Db_Expr('count(*)')))); $jTableResult = array(); $jTableResult['Result'] = self::RESULT_OK; $jTableResult['Records'] = $reports->toArray(); $jTableResult['TotalRecordCount'] = $reportsAll->current()->countAll; $this->_helper->json($jTableResult); } public function createAction() { $jTableResult = array(); try { $newRow = $this->_model->createRow($this->getAllParams()); $result = $newRow->save(); $jTableResult['Result'] = self::RESULT_OK; $jTableResult['Record'] = $newRow->toArray(); } catch (Exception $e) { Zend_Registry::get('logger')->err(__METHOD__ . ' - ' . print_r($e, true)); $translate = Zend_Registry::get('Zend_Translate'); $jTableResult['Result'] = self::RESULT_ERROR; $jTableResult['Message'] = $translate->_('Error while processing data.'); } $this->_helper->json($jTableResult); } public function updateAction() { $jTableResult = array(); try { $filterInput = new Zend_Filter_Input(array( '*' => 'StringTrim', 'project_id' => 'digits', 'member_id' => 'digits', 'project_category_id' => 'digits', 'status' => 'digits', 'pid' => 'digits', 'type_id' => 'digits', 'creator_id' => 'digits', 'validated' => 'digits', 'featured' => 'digits', 'amount' => 'digits', 'spam_checked' => 'digits', 'claimable' => 'digits', 'claimed_by_member' => 'digits', ), array('*' => array()), $this->getAllParams()); $record = $this->_model->save($filterInput->getEscaped()); $jTableResult = array(); $jTableResult['Result'] = self::RESULT_OK; $jTableResult['Record'] = $record->toArray(); } catch (Exception $e) { Zend_Registry::get('logger')->err(__METHOD__ . ' - ' . print_r($e, true)); $translate = Zend_Registry::get('Zend_Translate'); $jTableResult['Result'] = self::RESULT_ERROR; $jTableResult['Message'] = $translate->_('Error while processing data.'); } $this->_helper->json($jTableResult); } public function deleteAction() { $identity = Zend_Auth::getInstance()->getIdentity(); $dataId = (int)$this->getParam(self::DATA_ID_NAME, null); $this->_model->setDeleted($identity->member_id, $dataId); $product = $this->_model->find($dataId)->current(); Default_Model_ActivityLog::logActivity($dataId, $dataId, $identity->member_id, Default_Model_ActivityLog::BACKEND_PROJECT_DELETE, $product); // this will delete the product and request the ppload for deleting associated files $command = new Backend_Commands_DeleteProductExtended($product); $command->doCommand(); $jTableResult = array(); $jTableResult['Result'] = self::RESULT_OK; $this->_helper->json($jTableResult); } public function togglestatusAction() { $jTableResult = array(); try { $projectId = (int)$this->getParam('project_id'); $record = $this->_model->find($projectId)->current(); $record->status = ($record->status ? 0 : 10); $record->save(); $jTableResult = array(); $jTableResult['Result'] = self::RESULT_OK; $jTableResult['Record'] = $record->toArray(); } catch (Exception $e) { Zend_Registry::get('logger')->err(__METHOD__ . ' - ' . print_r($e, true)); $translate = Zend_Registry::get('Zend_Translate'); $jTableResult['Result'] = self::RESULT_ERROR; $jTableResult['Message'] = $translate->_('Error while processing data.'); } $this->_helper->json($jTableResult); } public function dospamcheckedAction() { $id = (int)$this->getParam(self::DATA_ID_NAME); $product = $this->_model->fetchRow(array('project_id = ?' => $id)); if (empty($product)) { $jsonResult = array(); $jsonResult['Result'] = self::RESULT_ERROR; $this->_helper->json($jsonResult); } $checked = (int)$this->getParam('checked'); $sql = "UPDATE project SET spam_checked = :spam_checked, changed_at = :changed_at WHERE project_id = :project_id"; $this->_model->getAdapter() ->query($sql, array('spam_checked' => $checked, 'changed_at' => $product->changed_at, 'project_id' => $id)) ; $jsonResult = array(); $jsonResult['Result'] = self::RESULT_OK; $jsonResult['spam_checked'] = $checked; $this->_helper->json($jsonResult); } public function dofeatureAction() { $projectId = (int)$this->getParam(self::DATA_ID_NAME, null); $product = $this->_model->find($projectId)->current(); $featured = (int)$this->getParam(self::PARAM_FEATURED, null); $sql = "UPDATE project SET featured = :featured, changed_at = :changed_at WHERE project_id = :project_id"; $this->_model->getAdapter() ->query($sql, array('featured' => $featured, 'changed_at' => $product->changed_at, 'project_id' => $projectId)) ; $auth = Zend_Auth::getInstance(); $identity = $auth->getIdentity(); Default_Model_ActivityLog::logActivity($projectId, $projectId, $identity->member_id, Default_Model_ActivityLog::BACKEND_PROJECT_FEATURE, $product); $jTableResult = array(); $jTableResult['Result'] = self::RESULT_OK; $this->_helper->json($jTableResult); } public function doghnsexcludeAction() { $projectId = (int)$this->getParam(self::DATA_ID_NAME, null); $product = $this->_model->find($projectId)->current(); $ghns_excluded = (int)$this->getParam(self::PARAM_APPROVED, null); $tableTags = new Default_Model_Tags(); $tableTags->saveGhnsExcludedTagForProject($projectId, $ghns_excluded); /** ronald 20180611 now as tag $sql = "UPDATE project SET ghns_excluded = :ghns_excluded WHERE project_id = :project_id"; $this->_model->getAdapter()->query($sql, array('ghns_excluded' => $ghns_excluded, 'project_id' => $projectId)); */ $auth = Zend_Auth::getInstance(); $identity = $auth->getIdentity(); Default_Model_ActivityLog::logActivity($projectId, $projectId, $identity->member_id, Default_Model_ActivityLog::BACKEND_PROJECT_GHNS_EXCLUDED, $product); $moderationModel = new Default_Model_ProjectModeration(); $note =$this->getParam(self::PARAM_MSG, null); $moderationModel->createModeration($projectId ,Default_Model_ProjectModeration::M_TYPE_GET_HOT_NEW_STUFF_EXCLUDED ,$ghns_excluded ,$identity->member_id ,$note ); $jTableResult = array(); $jTableResult['Result'] = self::RESULT_OK; $this->_helper->json($jTableResult); } public function doexcludeAction() { $projectId = (int)$this->getParam(self::DATA_ID_NAME, null); $product = $this->_model->find($projectId)->current(); $exclude = (int)$this->getParam(self::PARAM_PLING_EXCLUDED, null); $sql = "UPDATE project SET pling_excluded = :exclude WHERE project_id = :project_id"; $this->_model->getAdapter()->query($sql, array('exclude' => $exclude, 'project_id' => $projectId)); $auth = Zend_Auth::getInstance(); $identity = $auth->getIdentity(); Default_Model_ActivityLog::logActivity($projectId, $projectId, $identity->member_id, Default_Model_ActivityLog::BACKEND_PROJECT_PLING_EXCLUDED, $product); $jTableResult = array(); $jTableResult['Result'] = self::RESULT_OK; $this->_helper->json($jTableResult); } - + public function dodeprecatedAction() + { + $projectId = (int)$this->getParam(self::DATA_ID_NAME, null); + $product = $this->_model->find($projectId)->current(); + $deprecated = (int)$this->getParam(self::PARAM_PRODUCT_DEPRECATED, null); + + $tableTags = new Default_Model_Tags(); + $tableTags->saveDeprecatedModeratorTagForProject($projectId, $deprecated); + + $auth = Zend_Auth::getInstance(); + $identity = $auth->getIdentity(); + Default_Model_ActivityLog::logActivity($projectId, $projectId, $identity->member_id, + Default_Model_ActivityLog::BACKEND_PROJECT_DEPREACTED, $product); + + + $jTableResult = array(); + $jTableResult['Result'] = self::RESULT_OK; + + $this->_helper->json($jTableResult); + } + public function dodangerousAction() { $projectId = (int)$this->getParam(self::DATA_ID_NAME, null); $product = $this->_model->find($projectId)->current(); $dangerous = (int)$this->getParam(self::PARAM_PRODUCT_DANGEROUS, null); $tableTags = new Default_Model_Tags(); $tableTags->saveDangerosuTagForProject($projectId, $dangerous); $auth = Zend_Auth::getInstance(); $identity = $auth->getIdentity(); Default_Model_ActivityLog::logActivity($projectId, $projectId, $identity->member_id, Default_Model_ActivityLog::BACKEND_PROJECT_DANGEROUS, $product); $jTableResult = array(); $jTableResult['Result'] = self::RESULT_OK; $this->_helper->json($jTableResult); } public function changecatAction() { $projectId = (int)$this->getParam(self::DATA_ID_NAME, null); $catId = (int)$this->getParam('project_category_id', null); $product = $this->_model->find($projectId)->current(); $sql = "UPDATE project SET project_category_id = :cat_id, changed_at = :changed_at WHERE project_id = :project_id"; $this->_model->getAdapter() ->query($sql, array('cat_id' => $catId, 'changed_at' => $product->changed_at, 'project_id' => $projectId)) ; $identity = Zend_Auth::getInstance()->getIdentity(); Default_Model_ActivityLog::logActivity($projectId, $projectId, $identity->member_id, Default_Model_ActivityLog::BACKEND_PROJECT_CAT_CHANGE, $product); $jTableResult = array(); $jTableResult['Result'] = self::RESULT_OK; $this->_helper->json($jTableResult); } } \ No newline at end of file diff --git a/application/modules/default/Bootstrap.php b/application/modules/default/Bootstrap.php index a2765de15..83b14a479 100644 --- a/application/modules/default/Bootstrap.php +++ b/application/modules/default/Bootstrap.php @@ -1,1142 +1,1147 @@ . **/ class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { /** * @return Zend_Application_Module_Autoloader * @throws Zend_Loader_Exception */ protected function _initAutoload() { $autoloader = new Zend_Application_Module_Autoloader(array( 'namespace' => 'Default', 'basePath' => realpath(dirname(__FILE__)), )); $autoloader->addResourceType('formelements', 'forms/elements', 'Form_Element'); $autoloader->addResourceType('formvalidators', 'forms/validators', 'Form_Validator'); return $autoloader; } /** * @throws Zend_Exception * @throws Zend_Session_Exception */ protected function _initSessionManagement() { $session = $this->bootstrap('session'); $domain = Local_Tools_ParseDomain::get_domain($_SERVER['HTTP_HOST']); Zend_Session::setOptions(array('cookie_domain' => $domain)); Zend_Session::start(); $config = $this->getOption('settings')['session']; $session_namespace = new Zend_Session_Namespace($config['auth']['name']); Zend_Auth::getInstance()->setStorage(new Zend_Auth_Storage_Session($session_namespace->getNamespace())); } protected function _initConfig() { /** $config Zend_Config */ $config = $this->getApplication()->getApplicationConfig(); Zend_Registry::set('config', $config); return $config; } /** * @return mixed|null|Zend_Cache_Core|Zend_Cache_Frontend * @throws Zend_Cache_Exception * @throws Zend_Exception */ protected function _initCache() { if (Zend_Registry::isRegistered('cache')) { return Zend_Registry::get('cache'); } $cache = null; $options = $this->getOption('settings'); if (true == $options['cache']['enabled']) { $cache = Zend_Cache::factory($options['cache']['frontend']['type'], $options['cache']['backend']['type'], $options['cache']['frontend']['options'], $options['cache']['backend']['options']); } else { // Fallback settings for some (maybe development) environments which have no cache management installed. if (false === is_writeable(APPLICATION_CACHE)) { error_log('directory for cache files does not exists or not writable: ' . APPLICATION_CACHE); throw new Zend_Application_Bootstrap_Exception('directory for cache files does not exists or not writable: ' . APPLICATION_CACHE); } $frontendOptions = array( 'lifetime' => 600, 'automatic_serialization' => true, 'cache_id_prefix' => $options['cache']['frontend']['options']['cache_id_prefix'], 'cache' => true ); $backendOptions = array( 'cache_dir' => APPLICATION_CACHE, 'file_locking' => true, 'read_control' => true, 'read_control_type' => 'crc32', 'hashed_directory_level' => 1, 'hashed_directory_perm' => 0700, 'file_name_prefix' => $options['cache']['frontend']['options']['cache_id_prefix'], 'cache_file_perm' => 0700 ); $cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions); } Zend_Registry::set('cache', $cache); Zend_Locale::setCache($cache); Zend_Locale_Data::setCache($cache); Zend_Currency::setCache($cache); Zend_Translate::setCache($cache); Zend_Translate_Adapter::setCache($cache); Zend_Db_Table_Abstract::setDefaultMetadataCache($cache); Zend_Paginator::setCache($cache); return $cache; } /** * @throws Zend_Application_Bootstrap_Exception */ protected function _initViewConfig() { $view = $this->bootstrap('view')->getResource('view'); $view->addHelperPath(APPLICATION_PATH . '/modules/default/views/helpers', 'Default_View_Helper_'); $view->addHelperPath(APPLICATION_LIB . '/Zend/View/Helper', 'Zend_View_Helper_'); $options = $this->getOptions(); $docType = $options['resources']['view']['doctype'] ? $options['resources']['view']['doctype'] : 'XHTML1_TRANSITIONAL'; $view->doctype($docType); } /** * @throws Zend_Locale_Exception */ protected function _initLocale() { $configResources = $this->getOption('resources'); Zend_Locale::setDefault($configResources['locale']['default']); Zend_Registry::set($configResources['locale']['registry_key'], $configResources['locale']['default']); } /** * @return Zend_Translate * @throws Zend_Application_Resource_Exception * @throws Zend_Form_Exception * @throws Zend_Session_Exception * @throws Zend_Translate_Exception * @throws Zend_Validate_Exception */ protected function _initTranslate() { $options = $this->getOption('resources'); $options = $options['translate']; if (!isset($options['data'])) { throw new Zend_Application_Resource_Exception('not found the file'); } $adapter = isset($options['adapter']) ? $options['adapter'] : Zend_Translate::AN_ARRAY; $session = new Zend_Session_Namespace('aa'); if ($session->locale) { $locale = $session->locale; } else { $locale = isset($options['locale']) ? $options['locale'] : null; } $data = ''; if (isset($options['data'][$locale])) { $data = $options['data'][$locale]; } $translateOptions = isset($options['options']) ? $options['options'] : array(); $translate = new Zend_Translate($adapter, $data, $locale, $translateOptions); Zend_Form::setDefaultTranslator($translate); Zend_Validate_Abstract::setDefaultTranslator($translate); Zend_Registry::set('Zend_Translate', $translate); return $translate; } /** * @throws Zend_Application_Bootstrap_Exception */ protected function _initDbAdapter() { $db = $this->bootstrap('db')->getResource('db'); Zend_Registry::set('db', $db); Zend_Db_Table::setDefaultAdapter($db); Zend_Db_Table_Abstract::setDefaultAdapter($db); } /** * @throws Zend_Application_Bootstrap_Exception */ protected function _initLogger() { /** @var Zend_Log $logger */ $logger = $this->getPluginResource('log')->getLog(); $logger->registerErrorHandler(); Zend_Registry::set('logger', $logger); } protected function _initGlobals() { Zend_Paginator::setDefaultScrollingStyle('Elastic'); Zend_View_Helper_PaginationControl::setDefaultViewPartial('paginationControl.phtml'); Zend_Filter::addDefaultNamespaces('Local_Filter'); $version = $this->getOption('version'); defined('APPLICATION_VERSION') || define('APPLICATION_VERSION', $version); } /** * @return Default_Plugin_AclRules|false|mixed * @throws Zend_Cache_Exception */ protected function _initAclRules() { /** @var Zend_Cache_Core $appCache */ $appCache = $this->getResource('cache'); if (false == ($aclRules = $appCache->load('AclRules'))) { $aclRules = new Default_Plugin_AclRules(); Zend_Registry::set('acl', $aclRules); $appCache->save($aclRules, 'AclRules', array('AclRules'), 14400); } return $aclRules; } /** * @throws Zend_Application_Bootstrap_Exception * @throws Zend_Loader_PluginLoader_Exception */ protected function _initPlugins() { /** @var $front Zend_Controller_Front */ $front = $this->bootstrap('frontController')->getResource('frontController'); $aclRules = $this->bootstrap('aclRules')->getResource('aclRules'); $front->unregisterPlugin('Zend_Controller_Plugin_ErrorHandler'); $front->registerPlugin(new Default_Plugin_ErrorHandler()); $front->registerPlugin(new Default_Plugin_Stats()); $front->registerPlugin(new Default_Plugin_RememberMe(Zend_Auth::getInstance())); $front->registerPlugin(new Default_Plugin_SignOn(Zend_Auth::getInstance())); $front->registerPlugin(new Default_Plugin_Acl(Zend_Auth::getInstance(), $aclRules)); $loader = new Zend_Loader_PluginLoader(); $loader->addPrefixPath('Zend_View_Helper', APPLICATION_LIB . '/Zend/View/Helper/') ->addPrefixPath('Zend_Form_Element', APPLICATION_LIB . '/Zend/Form/Element') ->addPrefixPath('Default_View_Helper', APPLICATION_PATH . '/modules/default/views/helpers') ->addPrefixPath('Default_Form_Helper', APPLICATION_PATH . '/modules/default/forms/helpers') ->addPrefixPath('Default_Form_Element', APPLICATION_PATH . '/modules/default/forms/elements') ->addPrefixPath('Default_Form_Decorator', APPLICATION_PATH . '/modules/default/forms/decorators') ->addPrefixPath('Default_Form_Validator', APPLICATION_PATH . '/modules/default/forms/validators'); } protected function _initThirdParty() { $appConfig = $this->getResource('config'); $imageConfig = $appConfig->images; defined('IMAGES_UPLOAD_PATH') || define('IMAGES_UPLOAD_PATH', $imageConfig->upload->path); defined('IMAGES_MEDIA_SERVER') || define('IMAGES_MEDIA_SERVER', $imageConfig->media->server); $videoConfig = $appConfig->videos; defined('VIDEOS_UPLOAD_PATH') || define('VIDEOS_UPLOAD_PATH', $videoConfig->upload->path); defined('VIDEOS_MEDIA_SERVER') || define('VIDEOS_MEDIA_SERVER', $videoConfig->media->server); $comicConfig = $appConfig->comics; defined('COMICS_MEDIA_SERVER') || define('COMICS_MEDIA_SERVER', $comicConfig->media->server); // fileserver $configFileserver = $appConfig->settings->server->files; defined('PPLOAD_API_URI') || define('PPLOAD_API_URI', $configFileserver->api->uri); defined('PPLOAD_CLIENT_ID') || define('PPLOAD_CLIENT_ID', $configFileserver->api->client_id); defined('PPLOAD_SECRET') || define('PPLOAD_SECRET', $configFileserver->api->client_secret); defined('PPLOAD_HOST') || define('PPLOAD_HOST', $configFileserver->host); defined('PPLOAD_DOWNLOAD_SECRET') || define('PPLOAD_DOWNLOAD_SECRET', $configFileserver->download_secret); } /** * @return false|mixed|Zend_Controller_Router_Rewrite * @throws Zend_Application_Bootstrap_Exception * @throws Zend_Cache_Exception * @throws Zend_Controller_Exception * @throws Zend_Exception */ protected function _initRouter() { $this->bootstrap('frontController'); /** @var $front Zend_Controller_Front */ $front = $this->getResource('frontController'); /** @var Zend_Cache_Core $cache */ $cache = Zend_Registry::get('cache'); if (($router = $cache->load('ProjectRouter'))) { $front->setRouter($router); return $router; } /** @var $router Zend_Controller_Router_Rewrite */ $router = $front->getRouter(); /** RSS Feed */ $router->addRoute('rdf_store', new Zend_Controller_Router_Route('/content.rdf', array( 'module' => 'default', 'controller' => 'rss', 'action' => 'rdf' ))); $router->addRoute('rdf_events_hive', new Zend_Controller_Router_Route_Regex('.*-events.rss', array( 'module' => 'default', 'controller' => 'rss', 'action' => 'rss' ))); $router->addRoute('rdf_store_hive', new Zend_Controller_Router_Route_Regex('.*-content.rdf', array( 'module' => 'default', 'controller' => 'rss', 'action' => 'rdf' ))); $router->addRoute('rdf_store_hive_rss', new Zend_Controller_Router_Route_Regex('rss/.*-content.rdf', array( 'module' => 'default', 'controller' => 'rss', 'action' => 'rdf' ))); /** new store dependent routing rules */ //$router->addRoute('store_general', new Zend_Controller_Router_Route('/s/:domain_store_id/:controller/:action/*', array( // 'module' => 'default', // 'controller' => 'explore', // 'action' => 'index' //))); $router->addRoute('store_home', new Zend_Controller_Router_Route('/s/:domain_store_id/', array( 'module' => 'default', 'controller' => 'home', 'action' => 'index' ))); $router->addRoute('store_browse', new Zend_Controller_Router_Route('/s/:domain_store_id/browse/*', array( 'module' => 'default', 'controller' => 'explore', 'action' => 'index' ))); $router->addRoute('store_product_add', new Zend_Controller_Router_Route('/s/:domain_store_id/product/add', array( 'module' => 'default', 'controller' => 'product', 'action' => 'add' ))); $router->addRoute('store_settings', new Zend_Controller_Router_Route('/s/:domain_store_id/settings', array( 'module' => 'default', 'controller' => 'settings', 'action' => 'index' ))); $router->addRoute('store_pling_box_show', new Zend_Controller_Router_Route('/s/:domain_store_id/supporterbox/:memberid', array( 'module' => 'default', 'controller' => 'plingbox', 'action' => 'index' ))); $router->addRoute('store_pling_box_show', new Zend_Controller_Router_Route('/s/:domain_store_id/productcomment/addreply/*', array( 'module' => 'default', 'controller' => 'productcomment', 'action' => 'addreply' ))); $router->addRoute('store_product', new Zend_Controller_Router_Route('/s/:domain_store_id/p/:project_id/:action/*', array( 'module' => 'default', 'controller' => 'product', 'action' => 'show' ))); $router->addRoute('store_collection', new Zend_Controller_Router_Route('/s/:domain_store_id/c/:project_id/:action/*', array( 'module' => 'default', 'controller' => 'collection', 'action' => 'show' ))); /* $router->addRoute('store_product', new Zend_Controller_Router_Route('/s/:domain_store_id/c/:project_id/:action/*', array( 'module' => 'default', 'controller' => 'collection', 'action' => 'show' ))); */ $router->addRoute('store_user', new Zend_Controller_Router_Route('/s/:domain_store_id/member/:member_id/:action/*', array( 'module' => 'default', 'controller' => 'user', 'action' => 'index' ))); $router->addRoute('store_user_name', new Zend_Controller_Router_Route('/s/:domain_store_id/u/:user_name/:action/*', array( 'module' => 'default', 'controller' => 'user', 'action' => 'index' ))); $router->addRoute('store_login', new Zend_Controller_Router_Route('/s/:domain_store_id/login/*', array( 'module' => 'default', 'controller' => 'authorization', 'action' => 'login' ))); $router->addRoute('store_register', new Zend_Controller_Router_Route('/s/:domain_store_id/register', array( 'module' => 'default', 'controller' => 'authorization', 'action' => 'register' ))); /** general routing rules */ $router->addRoute('home', new Zend_Controller_Router_Route('/', array( 'module' => 'default', 'controller' => 'home', 'action' => 'index' ))); $router->addRoute('home_home', new Zend_Controller_Router_Route('/home', array( 'module' => 'default', 'controller' => 'home', 'action' => 'index' ))); $router->addRoute('home_start', new Zend_Controller_Router_Route('/start', array( 'module' => 'default', 'controller' => 'home', 'action' => 'start' ))); $router->addRoute('home_ajax', new Zend_Controller_Router_Route('/showfeatureajax/*', array( 'module' => 'default', 'controller' => 'home', 'action' => 'showfeatureajax' ))); $router->addRoute('backend', new Zend_Controller_Router_Route('/backend/:controller/:action/*', array( 'module' => 'backend', 'controller' => 'index', 'action' => 'index' ))); $router->addRoute('backend_statistics', new Zend_Controller_Router_Route('/statistics/:action/*', array( 'module' => 'backend', 'controller' => 'statistics', 'action' => 'index' ))); $router->addRoute('browse', new Zend_Controller_Router_Route('/browse/*', array( 'module' => 'default', 'controller' => 'explore', 'action' => 'index' ))); $router->addRoute('browse_favourites', new Zend_Controller_Router_Route('/my-favourites/*', array( 'module' => 'default', 'controller' => 'explore', 'action' => 'index', 'fav' => '1' ))); $router->addRoute('button_render', new Zend_Controller_Router_Route('/button/:project_id/:size/', array( 'module' => 'default', 'controller' => 'button', 'action' => 'render', 'size' => 'large' ))); $router->addRoute('button_action', new Zend_Controller_Router_Route('/button/a/:action/', array( 'module' => 'default', 'controller' => 'button', 'action' => 'index' ))); $router->addRoute('pling_box_show', new Zend_Controller_Router_Route('/supporterbox/:memberid/', array( 'module' => 'default', 'controller' => 'plingbox', 'action' => 'index' ))); $router->addRoute('external_donation_list', new Zend_Controller_Router_Route('/donationlist/:project_id/', array( 'module' => 'default', 'controller' => 'donationlist', 'action' => 'render' ))); $router->addRoute('external_widget', new Zend_Controller_Router_Route('/widget/:project_id/', array( 'module' => 'default', 'controller' => 'widget', 'action' => 'render' ))); $router->addRoute('external_widget_save', new Zend_Controller_Router_Route('/widget/save/*', array( 'module' => 'default', 'controller' => 'widget', 'action' => 'save' ))); $router->addRoute('external_widget_save', new Zend_Controller_Router_Route('/widget/config/:project_id/', array( 'module' => 'default', 'controller' => 'widget', 'action' => 'config' ))); $router->addRoute('external_widget_save_default', new Zend_Controller_Router_Route('/widget/savedefault/*', array( 'module' => 'default', 'controller' => 'widget', 'action' => 'savedefault' ))); $router->addRoute('support_old', new Zend_Controller_Router_Route('/support-old', array( 'module' => 'default', 'controller' => 'support', 'action' => 'index' ))); $router->addRoute('support_old_pay', new Zend_Controller_Router_Route('/support-old/pay', array( 'module' => 'default', 'controller' => 'support', 'action' => 'pay' ))); $router->addRoute('support_old_paymentok', new Zend_Controller_Router_Route('/support-old/paymentok', array( 'module' => 'default', 'controller' => 'support', 'action' => 'paymentok' ))); $router->addRoute('support_old_paymentcancel', new Zend_Controller_Router_Route('/support-old/paymentcancel', array( 'module' => 'default', 'controller' => 'support', 'action' => 'paymentcancel' ))); $router->addRoute('watchlist_productmoderation', new Zend_Controller_Router_Route('/watchlist-productmoderation', array( 'module' => 'default', 'controller' => 'moderation', 'action' => 'productmoderation' ))); $router->addRoute('watchlist_samepaypal', new Zend_Controller_Router_Route('/watchlist-samepaypal', array( 'module' => 'default', 'controller' => 'spam', 'action' => 'paypal' ))); $router->addRoute('watchlist_products_files', new Zend_Controller_Router_Route('/watchlist-products-10-files', array( 'module' => 'default', 'controller' => 'spam', 'action' => 'product' ))); + $router->addRoute('watchlist_products_deprecated', new Zend_Controller_Router_Route('/watchlist-products-deprecated', array( + 'module' => 'default', + 'controller' => 'spam', + 'action' => 'deprecated' + ))); $router->addRoute('watchlist_md5sum', new Zend_Controller_Router_Route('/watchlist-md5sum-duplicated', array( 'module' => 'default', 'controller' => 'spam', 'action' => 'mdsum' ))); $router->addRoute('watchlist_unpublishedproduct', new Zend_Controller_Router_Route('/watchlist-unpublishedproduct', array( 'module' => 'default', 'controller' => 'spam', 'action' => 'unpublishedproduct' ))); $router->addRoute('watchlist_newproduct_2_month', new Zend_Controller_Router_Route('/watchlist-newproduct-2-month', array( 'module' => 'default', 'controller' => 'spam', 'action' => 'newproduct' ))); $router->addRoute('watchlist_newproducts', new Zend_Controller_Router_Route('/watchlist-newproducts', array( 'module' => 'default', 'controller' => 'newproducts', 'action' => 'index' ))); $router->addRoute('support_new', new Zend_Controller_Router_Route('/supportold2', array( 'module' => 'default', 'controller' => 'subscription', 'action' => 'index' ))); $router->addRoute('support_predefined', new Zend_Controller_Router_Route('/support-predefined', array( 'module' => 'default', 'controller' => 'subscription', 'action' => 'supportpredefinded' ))); $router->addRoute('support_pay_predefined', new Zend_Controller_Router_Route('/support/paypredefined', array( 'module' => 'default', 'controller' => 'subscription', 'action' => 'paypredefined' ))); $router->addRoute('support_new2', new Zend_Controller_Router_Route('/support', array( 'module' => 'default', 'controller' => 'subscription', 'action' => 'support2' ))); $router->addRoute('support_new_pay2', new Zend_Controller_Router_Route('/support/pay', array( 'module' => 'default', 'controller' => 'subscription', 'action' => 'pay2' ))); $router->addRoute('support_new_pay', new Zend_Controller_Router_Route('/support/payold2', array( 'module' => 'default', 'controller' => 'subscription', 'action' => 'pay' ))); $router->addRoute('support_new_paymentok', new Zend_Controller_Router_Route('/support/paymentok', array( 'module' => 'default', 'controller' => 'subscription', 'action' => 'paymentok' ))); $router->addRoute('support_new_paymentcancel', new Zend_Controller_Router_Route('/support/paymentcancel', array( 'module' => 'default', 'controller' => 'subscription', 'action' => 'paymentcancel' ))); /** * Project/Product */ $router->addRoute('product_short_url', new Zend_Controller_Router_Route('/p/:project_id/:action/*', array( 'module' => 'default', 'controller' => 'product', 'action' => 'show' ))); $router->addRoute('product_referrer_url', new Zend_Controller_Router_Route('/p/:project_id/er/:er/*', array( 'module' => 'default', 'controller' => 'product', 'action' => 'show' ))); $router->addRoute('product_collectionid_url', new Zend_Controller_Router_Route('/co/:collection_id', array( 'module' => 'default', 'controller' => 'product', 'action' => 'show' ))); $router->addRoute('product_add', new Zend_Controller_Router_Route('/product/add', array( 'module' => 'default', 'controller' => 'product', 'action' => 'add' ))); $router->addRoute('product_add_extend', new Zend_Controller_Router_Route('/product/add/:catId', array( 'module' => 'default', 'controller' => 'product', 'action' => 'add' ))); $router->addRoute('search', new Zend_Controller_Router_Route('/search/*', array( 'module' => 'default', 'controller' => 'product', 'action' => 'search' ))); $router->addRoute('search_domain', new Zend_Controller_Router_Route('/s/:domain_store_id/search/*', array( 'module' => 'default', 'controller' => 'product', 'action' => 'search' ))); $router->addRoute('product_save', new Zend_Controller_Router_Route('/p/save/*', array( 'module' => 'default', 'controller' => 'product', 'action' => 'saveproduct' ))); /** * Collection */ $router->addRoute('collection_short_url', new Zend_Controller_Router_Route('/c/:project_id/', array( 'module' => 'default', 'controller' => 'collection', 'action' => 'index' ))); $router->addRoute('collection_short_url', new Zend_Controller_Router_Route('/c/:project_id/:action/*', array( 'module' => 'default', 'controller' => 'collection', 'action' => 'index' ))); $router->addRoute('collection_referrer_url', new Zend_Controller_Router_Route('/c/:project_id/er/:er/*', array( 'module' => 'default', 'controller' => 'collection', 'action' => 'index' ))); $router->addRoute('collection_add', new Zend_Controller_Router_Route('/collection/add', array( 'module' => 'default', 'controller' => 'collection', 'action' => 'add' ))); /** * $router->addRoute('search', new Zend_Controller_Router_Route('/search/*', array( * 'module' => 'default', * 'controller' => 'collection', * 'action' => 'search' * ))); * * $router->addRoute('search_domain',new Zend_Controller_Router_Route('/s/:domain_store_id/search/*', * array( * 'module' => 'default', * 'controller' => 'product', * 'action' => 'search' * ))); */ $router->addRoute('collection_save', new Zend_Controller_Router_Route('/c/save/*', array( 'module' => 'default', 'controller' => 'collection', 'action' => 'saveproduct' ))); /** * Member */ $router->addRoute('member_settings_old', new Zend_Controller_Router_Route('/settings/:action/*', array( 'module' => 'default', 'controller' => 'settings', 'action' => 'index' ))); $router->addRoute('user_show', new Zend_Controller_Router_Route('/member/:member_id/:action/*', array( 'module' => 'default', 'controller' => 'user', 'action' => 'index' ))); $router->addRoute('user_avatar', new Zend_Controller_Router_Route('/member/avatar/:emailhash/:size', array( 'module' => 'default', 'controller' => 'user', 'action' => 'avatar' ))); $router->addRoute('user_show_with_name', new Zend_Controller_Router_Route('/u/:user_name/:action/*', array( 'module' => 'default', 'controller' => 'user', 'action' => 'index' ))); $router->addRoute('user_recification', new Zend_Controller_Router_Route('/r/:action/*', array( 'module' => 'default', 'controller' => 'rectification', 'action' => 'index' ))); $router->addRoute('user_show_short', new Zend_Controller_Router_Route('/me/:member_id/:action/*', array( 'module' => 'default', 'controller' => 'user', 'action' => 'index' ))); $router->addRoute('register', new Zend_Controller_Router_Route_Static('/register', array( 'module' => 'default', 'controller' => 'authorization', 'action' => 'register' ))); $router->addRoute('register_validate', new Zend_Controller_Router_Route_Static('/register/validate', array( 'module' => 'default', 'controller' => 'authorization', 'action' => 'validate' ))); $router->addRoute('verification', new Zend_Controller_Router_Route('/verification/:vid', array( 'module' => 'default', 'controller' => 'authorization', 'action' => 'verification' ))); $router->addRoute('logout', new Zend_Controller_Router_Route_Static('/logout', array( 'module' => 'default', 'controller' => 'logout', 'action' => 'logout' ))); $router->addRoute('propagatelogout', new Zend_Controller_Router_Route_Static('/logout/propagate', array( 'module' => 'default', 'controller' => 'authorization', 'action' => 'propagatelogout' ))); $router->addRoute('checkuser', new Zend_Controller_Router_Route_Static('/checkuser', array( 'module' => 'default', 'controller' => 'authorization', 'action' => 'checkuser' ))); $router->addRoute('login', new Zend_Controller_Router_Route('/login', array( 'module' => 'default', 'controller' => 'authorization', 'action' => 'login' ))); $router->addRoute('login', new Zend_Controller_Router_Route('/login/:action/*', array( 'module' => 'default', 'controller' => 'authorization', 'action' => 'login' ))); $router->addRoute('LoginController', new Zend_Controller_Router_Route('/l/:action/*', array( 'module' => 'default', 'controller' => 'login', 'action' => 'login' ))); $router->addRoute('content', new Zend_Controller_Router_Route('/content/:page', array( 'module' => 'default', 'controller' => 'content', 'action' => 'index' ))); $router->addRoute('categories_about', new Zend_Controller_Router_Route('/cat/:page/about', array( 'module' => 'default', 'controller' => 'categories', 'action' => 'about' ))); // **** static routes $router->addRoute('static_faq_old', new Zend_Controller_Router_Route_Static('/faq-old', array( 'module' => 'default', 'controller' => 'content', 'action' => 'index', 'page' => 'faqold' ))); $router->addRoute('static_faq', new Zend_Controller_Router_Route_Static('/faq-pling', array( 'module' => 'default', 'controller' => 'content', 'action' => 'index', 'page' => 'faq' ))); $router->addRoute('static_gitfaq', new Zend_Controller_Router_Route_Static('/faq-opencode', array( 'module' => 'default', 'controller' => 'content', 'action' => 'index', 'page' => 'gitfaq' ))); $router->addRoute('static_ocsapi', new Zend_Controller_Router_Route_Static('/ocs-api', array( 'module' => 'default', 'controller' => 'content', 'action' => 'index', 'page' => 'ocsapi' ))); $router->addRoute('static_plings', new Zend_Controller_Router_Route_Static('/about', array( 'module' => 'default', 'controller' => 'content', 'action' => 'index', 'page' => 'about' ))); $router->addRoute('static_terms', new Zend_Controller_Router_Route_Static('/terms', array( 'module' => 'default', 'controller' => 'content', 'action' => 'index', 'page' => 'terms' ))); $router->addRoute('static_terms_general', new Zend_Controller_Router_Route_Static('/terms/general', array( 'module' => 'default', 'controller' => 'content', 'action' => 'index', 'page' => 'terms-general' ))); $router->addRoute('static_terms_publish', new Zend_Controller_Router_Route_Static('/terms/publishing', array( 'module' => 'default', 'controller' => 'content', 'action' => 'index', 'page' => 'terms-publishing' ))); $router->addRoute('static_terms_dmca', new Zend_Controller_Router_Route_Static('/terms/dmca', array( 'module' => 'default', 'controller' => 'content', 'action' => 'index', 'page' => 'terms-dmca' ))); $router->addRoute('static_terms_payout', new Zend_Controller_Router_Route_Static('/terms/payout', array( 'module' => 'default', 'controller' => 'content', 'action' => 'index', 'page' => 'terms-payout' ))); $router->addRoute('static_terms_cookies', new Zend_Controller_Router_Route_Static('/terms/cookies', array( 'module' => 'default', 'controller' => 'content', 'action' => 'index', 'page' => 'terms-cookies' ))); $router->addRoute('static_privacy', new Zend_Controller_Router_Route_Static('/privacy', array( 'module' => 'default', 'controller' => 'content', 'action' => 'index', 'page' => 'privacy' ))); $router->addRoute('static_imprint', new Zend_Controller_Router_Route_Static('/imprint', array( 'module' => 'default', 'controller' => 'content', 'action' => 'index', 'page' => 'imprint' ))); $router->addRoute('static_contact', new Zend_Controller_Router_Route_Static('/contact', array( 'module' => 'default', 'controller' => 'content', 'action' => 'index', 'page' => 'contact' ))); // **** ppload $router->addRoute('pploadlogin', new Zend_Controller_Router_Route('/pploadlogin/*', array( 'module' => 'default', 'controller' => 'authorization', 'action' => 'pploadlogin' ))); // OCS API //20191120 OCS-API is disabled for webservers, only api.pling.com or api.kde-look.org allowed, see ticket #1494 //20191125 erst mal wieder drin $router->addRoute('ocs_providers_xml', new Zend_Controller_Router_Route('/ocs/providers.xml', array( 'module' => 'default', 'controller' => 'ocsv1', 'action' => 'providers' ))); $router->addRoute('ocs_v1_config', new Zend_Controller_Router_Route('/ocs/v1/config', array( 'module' => 'default', 'controller' => 'ocsv1', 'action' => 'config' ))); $router->addRoute('ocs_v1_person_check', new Zend_Controller_Router_Route('/ocs/v1/person/check', array( 'module' => 'default', 'controller' => 'ocsv1', 'action' => 'personcheck' ))); $router->addRoute('ocs_v1_person_data', new Zend_Controller_Router_Route('/ocs/v1/person/data', array( 'module' => 'default', 'controller' => 'ocsv1', 'action' => 'persondata' ))); $router->addRoute('ocs_v1_person_data_personid', new Zend_Controller_Router_Route('/ocs/v1/person/data/:personid', array( 'module' => 'default', 'controller' => 'ocsv1', 'action' => 'persondata' ))); $router->addRoute('ocs_v1_person_self', new Zend_Controller_Router_Route('/ocs/v1/person/self', array( 'module' => 'default', 'controller' => 'ocsv1', 'action' => 'personself' ))); $router->addRoute('ocs_v1_content_categories', new Zend_Controller_Router_Route('/ocs/v1/content/categories', array( 'module' => 'default', 'controller' => 'ocsv1', 'action' => 'contentcategories' ))); $router->addRoute('ocs_v1_content_data_contentid', new Zend_Controller_Router_Route('/ocs/v1/content/data/:contentid', array( 'module' => 'default', 'controller' => 'ocsv1', 'action' => 'contentdata', 'contentid' => null ))); $router->addRoute('ocs_v1_content_download_contentid_itemid', new Zend_Controller_Router_Route('/ocs/v1/content/download/:contentid/:itemid', array( 'module' => 'default', 'controller' => 'ocsv1', 'action' => 'contentdownload' ))); $router->addRoute('ocs_v1_content_previewpic_contentid', new Zend_Controller_Router_Route('/ocs/v1/content/previewpic/:contentid', array( 'module' => 'default', 'controller' => 'ocsv1', 'action' => 'contentpreviewpic' ))); $router->addRoute('ocs_v1_comments', new Zend_Controller_Router_Route('/ocs/v1/comments/data/:comment_type/:content_id/:second_id', array( 'module' => 'default', 'controller' => 'ocsv1', 'action' => 'comments', 'comment_type' => -1, 'content_id' => null, 'second_id' => null ))); $router->addRoute('ocs_v1_voting', new Zend_Controller_Router_Route('/ocs/v1/content/vote/:contentid', array( 'module' => 'default', 'controller' => 'ocsv1', 'action' => 'vote' ))); // embed $router->addRoute('embed_v1_member_projects', new Zend_Controller_Router_Route('/embed/v1/member/:memberid', array( 'module' => 'default', 'controller' => 'embedv1', 'action' => 'memberprojects' ))); $router->addRoute('embed_v1_member_projects_files', new Zend_Controller_Router_Route('/embed/v1/ppload/:ppload_collection_id', array( 'module' => 'default', 'controller' => 'embedv1', 'action' => 'ppload' ))); $router->addRoute('embed_v1_member_projectscomments', new Zend_Controller_Router_Route('/embed/v1/comments/:id', array( 'module' => 'default', 'controller' => 'embedv1', 'action' => 'comments' ))); $router->addRoute('embed_v1_member_projectdetail', new Zend_Controller_Router_Route('/embed/v1/project/:projectid', array( 'module' => 'default', 'controller' => 'embedv1', 'action' => 'projectdetail' ))); $router->addRoute('clones', new Zend_Controller_Router_Route('/clones/*', array( 'module' => 'default', 'controller' => 'credits', 'action' => 'index' ))); $router->addRoute('mods', new Zend_Controller_Router_Route('/mods/*', array( 'module' => 'default', 'controller' => 'credits', 'action' => 'mods' ))); $cache->save($router, 'ProjectRouter', array('router'), 14400); return $router; } /** * @throws Zend_Cache_Exception * @throws Zend_Exception * @throws exception */ protected function _initCss() { if (APPLICATION_ENV != "development" && APPLICATION_ENV != "staging") { return; } $appConfig = $this->getResource('config'); if ((boolean)$appConfig->settings->noLESScompile === true) { return; } $sLess = realpath(APPLICATION_PATH . '/../httpdocs/theme/flatui/less/stylesheet.less'); $sCss = realpath(APPLICATION_PATH . '/../httpdocs/theme/flatui/css/stylesheet.css'); /** * @var Zend_Cache_Core $cache */ $cache = Zend_Registry::get('cache'); if (md5_file($sLess) !== $cache->load('md5Less')) { require_once APPLICATION_PATH . "/../library/lessphp/lessc.inc.php"; $oLessc = new lessc($sLess); $oLessc->setFormatter('compressed'); file_put_contents($sCss, $oLessc->parse()); $cache->save(md5_file($sLess), 'md5Less'); } } protected function _initGlobalApplicationVars() { $modelDomainConfig = new Default_Model_DbTable_ConfigStore(); Zend_Registry::set('application_store_category_list', $modelDomainConfig->fetchAllStoresAndCategories()); Zend_Registry::set('application_store_config_list', $modelDomainConfig->fetchAllStoresConfigArray()); Zend_Registry::set('application_store_config_id_list', $modelDomainConfig->fetchAllStoresConfigByIdArray()); } /** * @throws Zend_Application_Bootstrap_Exception */ protected function _initStoreDependentVars() { /** @var $front Zend_Controller_Front */ $front = $this->bootstrap('frontController')->getResource('frontController'); $front->registerPlugin(new Default_Plugin_InitGlobalStoreVars()); } } diff --git a/application/modules/default/controllers/SpamController.php b/application/modules/default/controllers/SpamController.php index 1c2c52e72..ee0723c10 100644 --- a/application/modules/default/controllers/SpamController.php +++ b/application/modules/default/controllers/SpamController.php @@ -1,543 +1,597 @@ . * * Created: 31.05.2017 */ class SpamController extends Local_Controller_Action_DomainSwitch { const RESULT_OK = "OK"; const RESULT_ERROR = "ERROR"; const IDENTIFIER = 'comment_id'; public function indexAction() { $this->forward('list', 'spam', 'default', $this->getAllParams()); } public function listAction() { $this->view->headTitle('Spam','SET'); $this->view->page = (int)$this->getParam('page', 1); } public function commentsAction() { $this->view->headTitle('Spam - Comments','SET'); } public function productAction() { $this->view->headTitle('Watchlist - Products-10-files','SET'); } public function newproductAction() { $this->view->headTitle('Watchlist - new products < 2 months','SET'); } public function unpublishedproductAction() { $this->view->headTitle('Watchlist - Unpublished Products','SET'); } public function paypalAction() { $this->view->headTitle('Watchlist - Paypal duplicated','SET'); } public function mdsumAction() { $this->view->headTitle('Watchlist - Md5sum duplicated','SET'); } + public function deprecatedAction() + { + $this->view->headTitle('Watchlist - Deprecated Products','SET'); + + } public function deletecommentAction() { $commentId = (int)$this->getParam(self::IDENTIFIER, null); $model = new Default_Model_DbTable_Comments(); $record = $model->find($commentId)->current(); $record->comment_active = 0; $record->save(); $jTableResult = array(); $jTableResult['Result'] = self::RESULT_OK; $jTableResult['Record'] = $record->toArray(); $this->_helper->json($jTableResult); } public function deletereportsAction() { $commentId = (int)$this->getParam(self::IDENTIFIER, null); $sql = ' UPDATE reports_comment SET is_deleted = 1 WHERE comment_id = :comment_id'; Zend_Db_Table::getDefaultAdapter()->query($sql, array('comment_id' => $commentId))->execute(); $jTableResult = array(); $jTableResult['Result'] = self::RESULT_OK; $jTableResult['Record'] = array(); $this->_helper->json($jTableResult); } public function paypallistAction() { $startIndex = (int)$this->getParam('jtStartIndex'); $pageSize = (int)$this->getParam('jtPageSize'); $sorting = $this->getParam('jtSorting'); if(!isset($sorting)) { $sorting = ' paypal_mail '; } $sql = " select a.*, ( select sum(d.credits_plings)/100 amount from micro_payout d where d.member_id in (a.ids) and d.yearmonth= DATE_FORMAT(CURRENT_DATE() - INTERVAL 1 MONTH, '%Y%m') and d.is_pling_excluded = 0 and d.is_license_missing = 0 and d.is_member_pling_excluded = 0 and d.is_source_missing = 0 ) as amount from ( select paypal_mail, GROUP_CONCAT(member_id) ids, GROUP_CONCAT(username) names , count(1) cnt , GROUP_CONCAT(m.is_deleted) is_deleted ,max(m.created_at) as created_at ,sum(m.is_deleted) as sum_is_deleted from member m where m.paypal_mail is not null and m.paypal_mail <> '' and (m.paypal_mail regexp '^[A-Z0-9._%-]+@[A-Z0-9.-]+.[A-Z]{2,4}$') group by paypal_mail order by m.created_at desc ) a where cnt > 1 and cnt>sum_is_deleted "; $sql .= ' order by ' . $sorting; $sql .= ' limit ' . $pageSize; $sql .= ' offset ' . $startIndex; $results = Zend_Db_Table::getDefaultAdapter()->fetchAll($sql); $sqlall = " select count(1) cnt from ( select paypal_mail, GROUP_CONCAT(member_id) ids, GROUP_CONCAT(username) names , count(1) cnt , GROUP_CONCAT(m.is_deleted) is_deleted ,max(m.created_at) as created_at ,sum(m.is_deleted) as sum_is_deleted from member m where m.paypal_mail is not null and m.paypal_mail <> '' and (m.paypal_mail regexp '^[A-Z0-9._%-]+@[A-Z0-9.-]+.[A-Z]{2,4}$') group by paypal_mail ) a where cnt > 1 and cnt>sum_is_deleted"; $reportsAll = Zend_Db_Table::getDefaultAdapter()->fetchRow($sqlall); $jTableResult = array(); $jTableResult['Result'] = self::RESULT_OK; $jTableResult['Records'] = $results; $jTableResult['TotalRecordCount'] = $reportsAll['cnt']; $this->_helper->json($jTableResult); } public function mdsumlistAction() { $startIndex = (int)$this->getParam('jtStartIndex'); $pageSize = (int)$this->getParam('jtPageSize'); $sorting = $this->getParam('jtSorting'); if(!isset($sorting)) { $sorting = ' changed_at desc '; } $sql = " select * from ( select f.owner_id as member_id,m.username, f.md5sum, COUNT(1) cnt, GROUP_CONCAT(distinct p.project_id) as projects , count(distinct p.project_id) cntProjects ,max(p.changed_at) as changed_at from ppload.ppload_files f join project p on f.collection_id = p.ppload_collection_id join member m on f.owner_id = m.member_id and m.is_deleted=0 and m.is_active = 1 where f.md5sum is not null group by f.md5sum having count(1)>1 ) t where cntProjects>1 "; $sql .= ' order by ' . $sorting; $sql .= ' limit ' . $pageSize; $sql .= ' offset ' . $startIndex; $results = Zend_Db_Table::getDefaultAdapter()->fetchAll($sql); $sqlall = " select count(1) as cnt from ( select f.owner_id as member_id,m.username, f.md5sum, COUNT(1) cnt, GROUP_CONCAT(distinct p.project_id) as projects , count(distinct p.project_id) cntProjects from ppload.ppload_files f join project p on f.collection_id = p.ppload_collection_id join member m on f.owner_id = m.member_id and m.is_deleted=0 and m.is_active = 1 where f.md5sum is not null group by f.md5sum having count(1)>1 ) t where cntProjects>1 "; $reportsAll = Zend_Db_Table::getDefaultAdapter()->fetchRow($sqlall); $jTableResult = array(); $jTableResult['Result'] = self::RESULT_OK; $jTableResult['Records'] = $results; $jTableResult['TotalRecordCount'] = $reportsAll['cnt']; $this->_helper->json($jTableResult); } public function newproductlistAction() { $filter['filter_section'] = $this->getParam('filter_section'); $startIndex = (int)$this->getParam('jtStartIndex'); $pageSize = (int)$this->getParam('jtPageSize'); $sorting = $this->getParam('jtSorting'); if(!isset($sorting)) { $sorting = ' earn desc, created_at desc'; } $sql = " select ss.section_id, ss.name as section_name, pp.project_id,pp.status,pp.member_id, pp.created_at, m.username, m.paypal_mail,m.created_at as member_since, c.title cat_title,c.lft, c.rgt ,(select sum(probably_payout_amount) amount from member_dl_plings pl where pl.project_id=pp.project_id and pl.member_id = pp.member_id and pl.yearmonth= DATE_FORMAT(CURRENT_DATE() - INTERVAL 1 MONTH, '%Y%m') and pl.is_pling_excluded = 0 and pl.is_license_missing = 0 ) as earn from project pp ,member m ,project_category c ,section_category s ,section ss where pp.member_id = m.member_id and pp.project_category_id = c.project_category_id and m.is_deleted=0 and m.is_active = 1 and s.project_category_id = c.project_category_id and s.section_id = ss.section_id and pp.created_at > (CURRENT_DATE() - INTERVAL 2 MONTH) "; if($filter['filter_section']) { $sql.=" and ss.section_id = ".$filter['filter_section']; } $sql .= ' order by ' . $sorting; $sql .= ' limit ' . $pageSize; $sql .= ' offset ' . $startIndex; $printDateSince = new Default_View_Helper_PrintDateSince(); $filesize = new Default_View_Helper_HumanFilesize(); $results = Zend_Db_Table::getDefaultAdapter()->fetchAll($sql); $tmpsql = "select lft, rgt from project_category where project_category_id=295"; $wal =Zend_Db_Table::getDefaultAdapter()->fetchRow($tmpsql); $lft = $wal['lft']; $rgt = $wal['rgt']; foreach ($results as &$value) { $value['created_at'] = $printDateSince->printDateSince($value['created_at']); if($value['earn'] && $value['earn']>0) { $value['earn'] = number_format($value['earn'] , 2, '.', ''); } if($value['lft'] >= $lft && $value['rgt'] <= $rgt) { $value['is_wallpaper'] = 1; }else{ $value['is_wallpaper'] = 0; } } $sqlTotal = "select count(1) as cnt from project pp ,member m ,project_category c ,section_category s ,section ss where pp.member_id = m.member_id and pp.project_category_id = c.project_category_id and m.is_deleted=0 and m.is_active = 1 and s.project_category_id = c.project_category_id and s.section_id = ss.section_id and pp.created_at > (CURRENT_DATE() - INTERVAL 2 MONTH) "; if($filter['filter_section']) { $sqlTotal.=" and ss.section_id = ".$filter['filter_section']; } $resultsCnt = Zend_Db_Table::getDefaultAdapter()->fetchRow($sqlTotal); $jTableResult = array(); $jTableResult['Result'] = self::RESULT_OK; $jTableResult['Records'] = $results; $jTableResult['TotalRecordCount'] = $resultsCnt['cnt']; $this->_helper->json($jTableResult); } + public function deprecatedlistAction() + { + $startIndex = (int)$this->getParam('jtStartIndex'); + $pageSize = (int)$this->getParam('jtPageSize'); + $sorting = $this->getParam('jtSorting'); + + if(!isset($sorting)) + { + $sorting = ' tag_created desc'; + } + $sql = " + select + project_id, + title, + username, + member_id, + cat_title, + profile_image_url, + o.tag_created created_at + from + stat_projects p + inner join tag_object o on p.project_id = o.tag_object_id and o.tag_id= 5589 and o.tag_group_id = 36 and is_deleted = 0 and tag_type_id = 1 + + "; + + $sql .= ' order by ' . $sorting; + $sql .= ' limit ' . $pageSize; + $sql .= ' offset ' . $startIndex; + $printDateSince = new Default_View_Helper_PrintDateSince(); + $results = Zend_Db_Table::getDefaultAdapter()->fetchAll($sql); + $helperImage = new Default_View_Helper_Image(); + foreach ($results as &$value) { + $value['created_at'] = $printDateSince->printDateSince($value['created_at']); + $value['avatar'] = $helperImage->Image($value['profile_image_url'], array('width' => '200', 'height' => '200', 'crop' => 2)); + } + + $sqlall = " select count(1) + from stat_projects p + inner join tag_object o on p.project_id = o.tag_object_id and o.tag_id= 5589 and o.tag_group_id = 36 and is_deleted = 0 and tag_type_id = 1 + "; + + $reportsAll = Zend_Db_Table::getDefaultAdapter()->fetchRow($sqlall); + + $jTableResult = array(); + $jTableResult['Result'] = self::RESULT_OK; + $jTableResult['Records'] = $results; + $jTableResult['TotalRecordCount'] = array_pop($reportsAll); + $this->_helper->json($jTableResult); + } public function unpublishedproductlistAction() { $startIndex = (int)$this->getParam('jtStartIndex'); $pageSize = (int)$this->getParam('jtPageSize'); $sorting = $this->getParam('jtSorting'); if(!isset($sorting)) { $sorting = ' unpublished_time desc'; } $sql = " select pp.project_id,pp.title,pp.status,pp.member_id, pp.created_at, m.username, m.paypal_mail,m.created_at as member_since, c.title cat_title,c.lft, c.rgt ,(select sum(probably_payout_amount) amount from member_dl_plings where member_id=pp.member_id and yearmonth= DATE_FORMAT(CURRENT_DATE() - INTERVAL 1 MONTH, '%Y%m') and is_pling_excluded = 0 and is_license_missing = 0 ) as earn , (SELECT max(time) FROM pling.activity_log l where l.activity_type_id = 9 and project_id = pp.project_id) as unpublished_time ,( select sum(m.credits_plings)/100 AS probably_payout_amount from micro_payout m where m.project_id=pp.project_id and m.paypal_mail is not null and m.paypal_mail <> '' and (m.paypal_mail regexp '^[A-Z0-9._%-]+@[A-Z0-9.-]+.[A-Z]{2,4}$') and m.yearmonth = DATE_FORMAT(CURRENT_DATE() - INTERVAL 1 MONTH, '%Y%m') ) as probably_payout_amount from project pp join member m on pp.member_id = m.member_id and m.is_deleted=0 and m.is_active = 1 join project_category c on pp.project_category_id = c.project_category_id where pp.status = 40 "; $sql .= ' order by ' . $sorting; $sql .= ' limit ' . $pageSize; $sql .= ' offset ' . $startIndex; $printDateSince = new Default_View_Helper_PrintDateSince(); $filesize = new Default_View_Helper_HumanFilesize(); $results = Zend_Db_Table::getDefaultAdapter()->fetchAll($sql); $tmpsql = "select lft, rgt from project_category where project_category_id=295"; $wal =Zend_Db_Table::getDefaultAdapter()->fetchRow($tmpsql); $lft = $wal['lft']; $rgt = $wal['rgt']; foreach ($results as &$value) { $value['created_at'] = $printDateSince->printDateSince($value['created_at']); $value['unpublished_time'] = $printDateSince->printDateSince($value['unpublished_time']); if($value['earn'] && $value['earn']>0) { $value['earn'] = number_format($value['earn'] , 2, '.', ''); } if($value['lft'] >= $lft && $value['rgt'] <= $rgt) { $value['is_wallpaper'] = 1; }else{ $value['is_wallpaper'] = 0; } } $sqltotal = "select count(1) as cnt from project pp where pp.status = 40 "; $resultsCnt = Zend_Db_Table::getDefaultAdapter()->fetchRow($sqltotal); $jTableResult = array(); $jTableResult['Result'] = self::RESULT_OK; $jTableResult['Records'] = $results; $jTableResult['TotalRecordCount'] = $resultsCnt['cnt']; $this->_helper->json($jTableResult); } public function productfilesAction() { $startIndex = (int)$this->getParam('jtStartIndex'); $pageSize = (int)$this->getParam('jtPageSize'); $sorting = $this->getParam('jtSorting'); if(!isset($sorting)) { $sorting = ' created_at desc'; } $sql = " select pp.project_id,pp.status,pp.member_id, pp.created_at, cntfiles,size, m.username, m.paypal_mail,m.created_at as member_since, c.title cat_title,c.lft, c.rgt ,(select sum(probably_payout_amount) amount from member_dl_plings where member_id=pp.member_id and yearmonth= DATE_FORMAT(CURRENT_DATE() - INTERVAL 1 MONTH, '%Y%m') and is_pling_excluded = 0 and is_license_missing = 0 ) as earn, m.is_deleted from ( select p.project_id, p.created_at, p.changed_at, p.member_id, p.status, p.project_category_id, count(1) cntfiles, sum(size) size from project p, ppload.ppload_files f where p.ppload_collection_id = f.collection_id group by p.project_id order by p.created_at desc, cntfiles desc ) pp ,member m ,project_category c where pp.member_id = m.member_id and pp.project_category_id = c.project_category_id and m.is_deleted=0 and m.is_active = 1 and cntfiles > 10 "; $sql .= ' order by ' . $sorting; $sql .= ' limit ' . $pageSize; $sql .= ' offset ' . $startIndex; $printDateSince = new Default_View_Helper_PrintDateSince(); $filesize = new Default_View_Helper_HumanFilesize(); $results = Zend_Db_Table::getDefaultAdapter()->fetchAll($sql); $tmpsql = "select lft, rgt from project_category where project_category_id=295"; $wal =Zend_Db_Table::getDefaultAdapter()->fetchRow($tmpsql); $lft = $wal['lft']; $rgt = $wal['rgt']; foreach ($results as &$value) { $value['created_at'] = $printDateSince->printDateSince($value['created_at']); $value['size'] = $filesize->humanFilesize($value['size']); if($value['earn'] && $value['earn']>0) { $value['earn'] = number_format($value['earn'] , 2, '.', ''); } if($value['lft'] >= $lft && $value['rgt'] <= $rgt) { $value['is_wallpaper'] = 1; }else{ $value['is_wallpaper'] = 0; } } $jTableResult = array(); $jTableResult['Result'] = self::RESULT_OK; $jTableResult['Records'] = $results; $jTableResult['TotalRecordCount'] = 1000; $this->_helper->json($jTableResult); } public function commentslistAction() { $startIndex = (int)$this->getParam('jtStartIndex'); $pageSize = (int)$this->getParam('jtPageSize'); $sorting = $this->getParam('jtSorting'); $filter_year = $this->getParam('filter_year', date("Y")); if(!isset($sorting)) { $sorting = ' comment_created_at desc'; } $sql = " select comment_id, comment_target_id, comment_member_id, comment_parent_id, comment_text, comment_created_at, (select count(1) from reports_comment r where c.comment_id = r.comment_id ) cntreport, (select GROUP_CONCAT(distinct reported_by) from reports_comment r where c.comment_id = r.comment_id order by created_at desc ) as reportedby, ( SELECT count(1) AS count FROM comments c2 where c2.comment_target_id <> 0 and c2.comment_member_id = c.comment_member_id and c2.comment_active = 1 ) as cntComments, m.created_at member_since, m.username, (select count(1) from project p where p.status=100 and p.member_id=m.member_id and p.type_id = 1 and p.is_deleted=0) cntProjects, m.profile_image_url, (select description from project p where p.type_id=0 and p.member_id = c.comment_member_id) aboutme from comments c join member m on c.comment_member_id = m.member_id and m.is_active = 1 and m.is_deleted = 0 where c.comment_type=0 and c.comment_active = 1 and DATE_FORMAT(c.comment_created_at, '%Y') = :filter_year "; $sql .= ' order by ' . $sorting; $sql .= ' limit ' . $pageSize; $sql .= ' offset ' . $startIndex; $printDateSince = new Default_View_Helper_PrintDateSince(); $comments = Zend_Db_Table::getDefaultAdapter()->fetchAll($sql, array('filter_year' =>$filter_year)); $helperImage = new Default_View_Helper_Image(); foreach ($comments as &$value) { $value['member_since'] = $printDateSince->printDateSince($value['member_since']); $value['comment_created_at'] = $printDateSince->printDateSince($value['comment_created_at']); $value['avatar'] = $helperImage->Image($value['profile_image_url'], array('width' => '200', 'height' => '200', 'crop' => 2)); } $sqlall = " select count(1) from comments c join member m on c.comment_member_id = m.member_id and m.is_active = 1 and m.is_deleted = 0 where c.comment_type=0 and c.comment_active = 1 and DATE_FORMAT(c.comment_created_at, '%Y') = :filter_year"; $reportsAll = Zend_Db_Table::getDefaultAdapter()->fetchRow($sqlall,array('filter_year' =>$filter_year)); $jTableResult = array(); $jTableResult['Result'] = self::RESULT_OK; $jTableResult['Records'] = $comments; $jTableResult['TotalRecordCount'] = array_pop($reportsAll); //$jTableResult['TotalRecordCount'] = 1000; $this->_helper->json($jTableResult); } } \ No newline at end of file diff --git a/application/modules/default/models/ActivityLog.php b/application/modules/default/models/ActivityLog.php index 156cee7b4..b78efd19e 100644 --- a/application/modules/default/models/ActivityLog.php +++ b/application/modules/default/models/ActivityLog.php @@ -1,233 +1,234 @@ . **/ class Default_Model_ActivityLog extends Default_Model_DbTable_ActivityLog { const PROJECT_CREATED = 0; const PROJECT_UPDATED = 1; const PROJECT_DELETED = 2; const PROJECT_STOPPED = 3; const PROJECT_STARTED = 4; const PROJECT_EDITED = 7; const PROJECT_PUBLISHED = 8; const PROJECT_UNPUBLISHED = 9; const PROJECT_ITEM_CREATED = 10; const PROJECT_ITEM_UPDATED = 11; const PROJECT_ITEM_DELETED = 12; const PROJECT_ITEM_STOPPED = 13; const PROJECT_ITEM_STARTED = 14; const PROJECT_ITEM_EDITED = 17; const PROJECT_ITEM_PUBLISHED = 18; const PROJECT_ITEM_UNPUBLISHED = 19; const PROJECT_PLINGED = 20; const PROJECT_DISPLINGED = 21; const PROJECT_ITEM_PLINGED = 30; const PROJECT_ITEM_DISPLINGED = 31; const PROJECT_COMMENT_CREATED = 40; const PROJECT_COMMENT_UPDATED = 41; const PROJECT_COMMENT_DELETED = 42; const PROJECT_COMMENT_REPLY = 43; const PROJECT_FOLLOWED = 50; const PROJECT_UNFOLLOWED = 51; const PROJECT_SHARED = 52; const PROJECT_PLINGED_2 = 53; const PROJECT_DISPLINGED_2 = 54; const PROJECT_RATED_HIGHER = 60; const PROJECT_RATED_LOWER = 61; const PROJECT_FILES_CREATED = 200; const PROJECT_FILES_UPDATED = 210; const PROJECT_FILES_DELETED = 220; const PROJECT_LICENSE_CHANGED = 70; const MEMBER_JOINED = 100; const MEMBER_UPDATED = 101; const MEMBER_DELETED = 102; const MEMBER_EDITED = 107; const MEMBER_FOLLOWED = 150; const MEMBER_UNFOLLOWED = 151; const MEMBER_SHARED = 152; const BACKEND_LOGIN = 302; const BACKEND_LOGOUT = 304; const BACKEND_PROJECT_DELETE = 310; const BACKEND_PROJECT_FEATURE = 312; const BACKEND_PROJECT_GHNS_EXCLUDED = 314; const BACKEND_PROJECT_CAT_CHANGE = 316; const BACKEND_PROJECT_PLING_EXCLUDED = 318; const BACKEND_USER_PLING_EXCLUDED = 319; const BACKEND_USER_DELETE = 320; const BACKEND_USER_UNDELETE = 321; const BACKEND_PROJECT_DANGEROUS = 322; + const BACKEND_PROJECT_DEPREACTED = 323; //internal system logs const MEMBER_EMAIL_CONFIRMED = 401; const MEMBER_EMAIL_CHANGED = 402; const MEMBER_PAYPAL_CHANGED = 410; protected static $referenceType = array( 0 => 'project', 1 => 'project', 2 => 'project', 3 => 'project', 4 => 'project', 7 => 'project', 8 => 'project', 9 => 'project', 10 => 'update', 11 => 'update', 12 => 'update', 13 => 'update', 14 => 'update', 17 => 'update', 18 => 'update', 19 => 'update', 20 => 'pling', 30 => 'pling', 40 => 'comment', 41 => 'comment', 42 => 'comment', 43 => 'comment', 50 => 'project', 51 => 'project', 52 => 'project', 53 => 'project', 54 => 'project', 60 => 'project', 61 => 'project', 70 => 'project', 100 => 'member', 101 => 'member', 102 => 'member', 104 => 'undefined', 107 => 'member', 108 => 'undefined', 109 => 'undefined', 150 => 'member', 151 => 'member', 152 => 'member', 200 => 'project', 210 => 'project', 220 => 'project', 302 => 'backend', 304 => 'backend', 310 => 'backend', 312 => 'backend', 314 => 'backend', 316 => 'backend', 318 => 'backend', 319 => 'backend', 320 => 'backend', 321 => 'backend', 322 => 'backend', 401 => 'member', 402 => 'member_email', 410 => 'member' ); /** * @param int $objectId * @param int $projectId * @param int $userId * @param int $activity_type_id * @param array $data array with ([type_id], [pid], description, title, image_small) * * @throws Zend_Exception */ public static function logActivity($objectId, $projectId, $userId, $activity_type_id, $data = array()) { // cutting description text if necessary if (isset($data['description'])) { $object_text = (strlen($data['description']) < 150) ? $data['description'] : mb_substr($data['description'], 0, 145, 'UTF-8') . ' ... '; } $newEntry = array( 'member_id' => $userId, 'project_id' => $projectId, 'object_id' => $objectId, 'object_ref' => self::$referenceType[$activity_type_id], 'object_title' => isset($data['title']) ? $data['title'] : null, 'object_text' => isset($object_text) ? $object_text : null, 'object_img' => false === empty($data['image_small']) ? $data['image_small'] : null, 'activity_type' => $activity_type_id ); $sql = " INSERT INTO `activity_log` SET `member_id` = :member_id, `project_id` = :project_id, `object_id` = :object_id, `object_ref` = :object_ref, `object_title` = :object_title, `object_text` = :object_text, `object_img` = :object_img, `activity_type_id` = :activity_type ; "; try { Zend_Db_Table::getDefaultAdapter()->query($sql, $newEntry); } catch (Exception $e) { Zend_Registry::get('logger')->err(__METHOD__ . ' - ERROR write activity log - ' . print_r($e, true)); } } /** * @param int $objectId * @param int $userId * @param int $activity_type_id * @param array|mixed $data * * @throws Zend_Exception */ public function writeActivityLog($objectId, $userId, $activity_type_id, $data) { $projectId = $objectId; //is it an item? if (isset($data['type_id']) && $data['type_id'] == Default_Model_Project::PROJECT_TYPE_UPDATE) { $projectId = $data['pid']; } $object_text = (strlen($data['description']) < 150) ? $data['description'] : mb_substr($data['description'], 0, 145, 'UTF-8') . ' ... '; $newLog = array( 'member_id' => $userId, 'project_id' => $projectId, 'object_id' => $objectId, 'object_ref' => self::$referenceType[$activity_type_id], 'object_title' => $data['title'], 'object_text' => $object_text, 'object_img' => $data['image_small'], 'activity_type_id' => $activity_type_id ); try { $this->insert($newLog); } catch (Exception $e) { Zend_Registry::get('logger')->err(__METHOD__ . ' - ERROR write activity log - ' . print_r($e, true)); } } } diff --git a/application/modules/default/models/Tags.php b/application/modules/default/models/Tags.php index 6c7101458..0b0dda806 100644 --- a/application/modules/default/models/Tags.php +++ b/application/modules/default/models/Tags.php @@ -1,1398 +1,1451 @@ . * * Created: 11.09.2017 */ class Default_Model_Tags { const TAG_TYPE_PROJECT = 1; const TAG_TYPE_MEMBER = 2; const TAG_TYPE_FILE = 3; const TAG_TYPE_OSUSER = 9; const TAG_USER_GROUPID = 5; const TAG_CATEGORY_GROUPID = 6; const TAG_LICENSE_GROUPID = 7; const TAG_PACKAGETYPE_GROUPID = 8; const TAG_ARCHITECTURE_GROUPID = 9; const TAG_GHNS_EXCLUDED_GROUPID = 10; const TAG_PRODUCT_ORIGINAL_GROUPID = 11; const TAG_PRODUCT_ORIGINAL_ID = 2451; const TAG_PRODUCT_EBOOK_GROUPID = 14; const TAG_PRODUCT_EBOOK_AUTHOR_GROUPID = 15; const TAG_PRODUCT_EBOOK_EDITOR_GROUPID = 16; const TAG_PRODUCT_EBOOK_ILLUSTRATOR_GROUPID = 17; const TAG_PRODUCT_EBOOK_TRANSLATOR_GROUPID = 18; const TAG_PRODUCT_EBOOK_SUBJECT_GROUPID = 19; const TAG_PRODUCT_EBOOK_SHELF_GROUPID = 20; const TAG_PRODUCT_EBOOK_LANGUAGE_GROUPID = 21; const TAG_PRODUCT_EBOOK_TYPE_GROUPID = 22; const TAG_PRODUCT_EBOOK_ID = 2532; const TAG_PROJECT_GROUP_IDS = '6,7,10';//type product : category-tags, license-tags,ghns_excluded const TAG_FILE_GROUP_IDS = '8,9';//file-packagetype-tags,file-architecture-tags // $tag_project_group_ids ='6,7,10'; // $tag_file_group_ids ='8,9'; /** * Default_Model_Tags constructor. */ public function __construct() { } /** * @param int $object_id * @param string $tags * @param int $tag_type */ public function processTags($object_id, $tags, $tag_type) { $this->assignTags($object_id, $tags, $tag_type); $this->deassignTags($object_id, $tags, $tag_type); } /** * @param int $object_id * @param string $tags * @param int $tag_type */ public function assignTags($object_id, $tags, $tag_type) { $new_tags = array_diff(explode(',', $tags), explode(',', $this->getTags($object_id, $tag_type))); $tableTags = new Default_Model_DbTable_Tags(); $listIds = $tableTags->storeTags(implode(',', $new_tags)); $prepared_insert = array_map(function ($id) use ($object_id, $tag_type) { return "({$id}, {$tag_type}, {$object_id})"; }, $listIds); $sql = "INSERT IGNORE INTO tag_object (tag_id, tag_type_id, tag_object_id) VALUES " . implode(',', $prepared_insert); $this->getAdapter()->query($sql); } /** * @param int $object_id * @param int $tag_type * * @return string|null */ public function getTags($object_id, $tag_type) { $sql = " SELECT GROUP_CONCAT(`tag`.`tag_name`) AS `tag_names` FROM `tag_object` JOIN `tag` ON `tag`.`tag_id` = `tag_object`.`tag_id` JOIN `tag_group_item` ON `tag_object`.`tag_id` = `tag_group_item`.`tag_id` WHERE `tag_type_id` = :type AND `tag_object_id` = :object_id AND `tag_group_item`.`tag_group_id` <> :tag_user_groupid AND `tag_object`.`is_deleted` = 0 GROUP BY `tag_object`.`tag_object_id` "; $result = $this->getAdapter()->fetchRow($sql, array( 'type' => $tag_type, 'object_id' => $object_id, 'tag_user_groupid' => Default_Model_Tags::TAG_USER_GROUPID )); if (isset($result['tag_names'])) { return $result['tag_names']; } return null; } /** * @return Zend_Db_Adapter_Abstract */ private function getAdapter() { return Zend_Db_Table::getDefaultAdapter(); } /** * @param int $object_id * @param string $tags * @param int $tag_type */ public function deassignTags($object_id, $tags, $tag_type) { $removable_tags = array_diff(explode(',', $this->getTags($object_id, $tag_type)), explode(',', $tags)); //$sql = "DELETE tag_object FROM tag_object JOIN tag ON tag.tag_id = tag_object.tag_id WHERE tag.tag_name = :name and tag_object.tag_object_id=:object_id"; $sql = "UPDATE `tag_object` INNER JOIN `tag` ON `tag`.`tag_id` = `tag_object`.`tag_id` SET `tag_changed` = NOW() , `is_deleted` = 1 WHERE `tag`.`tag_name` = :name AND `tag_object`.`tag_object_id`=:object_id"; $this->getAdapter()->query($sql, array('tagObjectId' => $object_id, 'tagType' => $tag_type)); foreach ($removable_tags as $removable_tag) { $this->getAdapter()->query($sql, array('name' => $removable_tag, 'object_id' => $object_id)); } $this->updateChanged($object_id, $tag_type); } private function updateChanged($object_id, $tag_type) { $sql = "UPDATE `tag_object` SET `tag_changed` = NOW() WHERE `tag_object_id` = :tagObjectId AND `tag_type_id` = :tagType"; $this->getAdapter()->query($sql, array('tagObjectId' => $object_id, 'tagType' => $tag_type)); } /** * @param int $project_id * @param string $tagname * @return string|null */ public function isTagsUserExisting($project_id, $tagname) { $sql_object = "SELECT count(1) AS `cnt` FROM `tag_object` JOIN `tag` ON `tag`.`tag_id` = `tag_object`.`tag_id` WHERE `tag`.`tag_name` = :tagname AND `tag_object`.`tag_group_id`=:tag_group_id AND `tag_object`.`is_deleted`=0 AND `tag_object`.`tag_object_id`=:project_id AND `tag_object`.`tag_type_id`=:tag_type_id"; $r = $this->getAdapter()->fetchRow($sql_object, array( 'tagname' => $tagname , 'tag_group_id' => Default_Model_Tags::TAG_USER_GROUPID , 'project_id' => $project_id , 'tag_type_id' => Default_Model_Tags::TAG_TYPE_PROJECT )); if ($r['cnt'] == 0) { return false; } else { return true; } } /** * @param int $object_id * @param int $tag_type * * @return string|null */ public function getTagsCategory($object_id, $tag_type) { $tag_group_ids = $this::TAG_CATEGORY_GROUPID; $tags = $this->getTagsArray($object_id, $tag_type, $tag_group_ids); $tag_names = ''; foreach ($tags as $tag) { $tag_names = $tag_names . $tag['tag_name'] . ','; } $len = strlen($tag_names); if ($len > 0) { return substr($tag_names, 0, ($len - 1)); } return null; } /** * @param int $object_id * @param int $tag_type * @param String $tag_group_ids * * @return array */ public function getTagsArray($object_id, $tag_type, $tag_group_ids) { $sql = " SELECT tag.tag_id,tag.tag_name,tag_group_item.tag_group_id,tag.tag_fullname, tag.tag_description FROM tag_object JOIN tag ON tag.tag_id = tag_object.tag_id join tag_group_item on tag_object.tag_id = tag_group_item.tag_id and tag_object.tag_group_id = tag_group_item.tag_group_id WHERE tag_type_id = :type AND tag_object_id = :object_id and tag_object.tag_group_id in ({$tag_group_ids} ) and tag_object.is_deleted = 0 order by tag_group_item.tag_group_id desc , tag.tag_name asc "; $result = $this->getAdapter()->fetchAll($sql, array('type' => $tag_type, 'object_id' => $object_id)); return $result; } /** * @param int $object_id * @param int $tag_type * * @return string|null */ public function getTagsSystem($object_id, $tag_type) { $tag_group_ids = '6,7,10'; $tags = $this->getTagsArray($object_id, $tag_type, $tag_group_ids); $tag_names = ''; foreach ($tags as $tag) { $tag_names = $tag_names . $tag['tag_name'] . ','; } $len = strlen($tag_names); if ($len > 0) { return substr($tag_names, 0, ($len - 1)); } return null; } /** * @param int $project_id * @return array */ public function getTagsSystemList($project_id) { $tag_project_group_ids = self::TAG_PROJECT_GROUP_IDS; $tag_file_group_ids = self::TAG_FILE_GROUP_IDS; $sql = " SELECT tag.tag_id,tag.tag_name,tag_object.tag_group_id FROM tag_object JOIN tag ON tag.tag_id = tag_object.tag_id WHERE tag_type_id = :type_project AND tag_object_id = :project_id and tag_object.tag_group_id in ({$tag_project_group_ids} ) and tag_object.is_deleted = 0 union all SELECT distinct t.tag_id,t.tag_name,o.tag_group_id FROM tag_object o JOIN tag t ON t.tag_id = o.tag_id inner join project p on o.tag_parent_object_id = p.project_id inner join ppload.ppload_files f on p.ppload_collection_id = f.collection_id and o.tag_object_id=f.id and f.active = 1 WHERE o.tag_type_id = :type_file AND p.project_id = :project_id and o.tag_group_id in ({$tag_file_group_ids} ) and o.is_deleted = 0 order by tag_group_id , tag_name "; $result = $this->getAdapter()->fetchAll($sql, array( 'type_project' => Default_Model_Tags::TAG_TYPE_PROJECT , 'project_id' => $project_id , 'type_file' => Default_Model_Tags::TAG_TYPE_FILE )); return $result; } /** * @param int $object_id * @param int $tag_type * * @return string|null */ public function getTagsUserCount($object_id, $tag_type) { $sql = " SELECT count(*) AS `cnt` FROM `tag_object` JOIN `tag` ON `tag`.`tag_id` = `tag_object`.`tag_id` JOIN `tag_group_item` ON `tag_object`.`tag_id` = `tag_group_item`.`tag_id` AND `tag_object`.`tag_group_id` = `tag_group_item`.`tag_group_id` WHERE `tag_type_id` = :type AND `tag_object_id` = :object_id AND `tag_object`.`is_deleted` = 0 AND `tag_group_item`.`tag_group_id` = :tag_user_groupid "; $result = $this->getAdapter()->fetchRow($sql, array( 'type' => $tag_type, 'object_id' => $object_id, 'tag_user_groupid' => Default_Model_Tags::TAG_USER_GROUPID )); if (isset($result['cnt'])) { return $result['cnt']; } return 0; } public function filterTagsUser($filter, $limit) { $sql = " select tag.tag_id ,tag.tag_name from tag join tag_group_item on tag.tag_id = tag_group_item.tag_id and tag_group_item.tag_group_id = :tag_user_groupid where tag.tag_name like '%" . $filter . "%' "; if (isset($limit)) { $sql .= ' limit ' . $limit; } $result = $this->getAdapter()->fetchAll($sql, array('tag_user_groupid' => Default_Model_Tags::TAG_USER_GROUPID)); return $result; } /** * @param int $object_id * @param string $tags * @param int $tag_type */ public function processTagsUser($object_id, $tags, $tag_type) { if ($tags) { $this->assignTagsUser($object_id, $tags, $tag_type); } $this->deassignTagsUser($object_id, $tags, $tag_type); } /** * @param int $object_id * @param string $tags * @param int $tag_type */ public function assignTagsUser($object_id, $tags, $tag_type) { $tags = strtolower($tags); $tag_group_id = 5; $new_tags = array_diff(explode(',', $tags), explode(',', $this->getTagsUser($object_id, $tag_type))); if (sizeof($new_tags) > 0) { $tableTags = new Default_Model_DbTable_Tags(); $listIds = $tableTags->storeTagsUser(implode(',', $new_tags)); $prepared_insert = array_map(function ($id) use ($object_id, $tag_type, $tag_group_id) { return "({$id}, {$tag_type}, {$object_id},{$tag_group_id})"; }, $listIds); $sql = "INSERT IGNORE INTO tag_object (tag_id, tag_type_id, tag_object_id,tag_group_id) VALUES " . implode(',', $prepared_insert); $this->getAdapter()->query($sql); } } /** * @param int $object_id * @param int $tag_type * * @return string|null */ public function getTagsUser($object_id, $tag_type) { $tag_group_ids = $this::TAG_USER_GROUPID; $tags = $this->getTagsArray($object_id, $tag_type, $tag_group_ids); $tag_names = ''; foreach ($tags as $tag) { $tag_names = $tag_names . $tag['tag_name'] . ','; } $len = strlen($tag_names); if ($len > 0) { return substr($tag_names, 0, ($len - 1)); } return null; } public function deassignTagsUser($object_id, $tags, $tag_type) { if ($tags) { $tags = strtolower($tags); $removable_tags = array_diff(explode(',', $this->getTagsUser($object_id, $tag_type)), explode(',', $tags)); } else { $removable_tags = explode(',', $this->getTagsUser($object_id, $tag_type)); } //$sql = "DELETE tag_object FROM tag_object JOIN tag ON tag.tag_id = tag_object.tag_id WHERE tag_group_id = ".Default_Model_Tags::TAG_USER_GROUPID." and tag.tag_name = :name and tag_object.tag_object_id=:object_id"; $sql = "UPDATE tag_object inner join tag ON tag.tag_id = tag_object.tag_id set tag_changed = NOW() , is_deleted = 1 WHERE tag_group_id = " . Default_Model_Tags::TAG_USER_GROUPID . " and tag.tag_name = :name and tag_object.tag_object_id=:object_id"; foreach ($removable_tags as $removable_tag) { $this->getAdapter()->query($sql, array('name' => $removable_tag, 'object_id' => $object_id)); // if Tag is the only one in Tag_object table then delete this tag for user_groupid = 5 $sql_object = "SELECT count(1) AS `cnt` FROM `tag_object` JOIN `tag` ON `tag`.`tag_id` = `tag_object`.`tag_id` WHERE `tag`.`tag_name` = :name"; $r = $this->getAdapter()->fetchRow($sql_object, array('name' => $removable_tag)); if ($r['cnt'] == 0) { // then remove tag if not existing in Tag_object $sql_delete_tag = "delete from tag where tag_name=:name"; $this->getAdapter()->query($sql_delete_tag, array('name' => $removable_tag)); } } $this->updateChanged($object_id, $tag_type); } public function isProductOriginal($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; } } public function isProductModification($project_id) { $tag_modification_id = Zend_Registry::get('config')->settings->client->default->tag_modification_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' => $tag_modification_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; } } public function isProductDangerous($project_id) { $tag_dangerous_group_id = Zend_Registry::get('config')->settings->client->default->tag_group_dangerous_id; $tag_dangerous_id = Zend_Registry::get('config')->settings->client->default->tag_dangerous_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' => $tag_dangerous_id, 'tag_object_id' => $project_id, 'tag_group_id' => $tag_dangerous_group_id, 'tag_type_id' => self::TAG_TYPE_PROJECT )); if ($r) { return true; } else { return false; } } + public function isProductDeprecatedModerator($project_id) + { + $tag_group_id = Zend_Registry::get('config')->settings->client->default->tag_group_deprecated_id; + $tag_id = Zend_Registry::get('config')->settings->client->default->tag_deprecated_id; + return $this->isTagObjectExistingForProject($project_id, $tag_group_id,$tag_id); + } + + protected function isTagObjectExistingForProject($project_id,$tag_group_id,$tag_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' => $tag_id, + 'tag_object_id' => $project_id, + 'tag_group_id' => $tag_group_id, + 'tag_type_id' => self::TAG_TYPE_PROJECT + )); + if ($r) { + return true; + } else { + return false; + } + + } + + public function isProductEbook($project_id) { $ebookTagGroupId = Zend_Registry::get('config')->settings->client->default->tag_group_ebook; $ebookTagId = Zend_Registry::get('config')->settings->client->default->tag_is_ebook; $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' => $ebookTagId, 'tag_object_id' => $project_id, 'tag_group_id' => $ebookTagGroupId, 'tag_type_id' => self::TAG_TYPE_PROJECT )); if ($r) { return true; } else { return false; } } /** * @param int $object_id * @param int $is_original */ 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 * @param int $original (null, 1 or 2) */ public function processTagProductOriginalOrModification($object_id, $original) { $tag_original_id = Zend_Registry::get('config')->settings->client->default->tag_original_id; $tag_modification_id = Zend_Registry::get('config')->settings->client->default->tag_modification_id; $sql_object = "select tag_item_id from tag_object WHERE 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()->fetchAll($sql_object, array( 'tag_object_id' => $object_id, 'tag_group_id' => self::TAG_PRODUCT_ORIGINAL_GROUPID, 'tag_type_id' => self::TAG_TYPE_PROJECT )); if ($original == '1' || $original == '2') { if ($r) { //delte all old tags foreach ($r as $tag) { $sql = "UPDATE tag_object set tag_changed = NOW() , is_deleted = 1 WHERE tag_item_id = :tagItemId"; $this->getAdapter()->query($sql, array('tagItemId' => $tag['tag_item_id'])); } } $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)"; if ($original == '1') { $this->getAdapter()->query($sql, array( 'tag_id' => $tag_original_id, 'tag_type_id' => self::TAG_TYPE_PROJECT, 'tag_object_id' => $object_id, 'tag_group_id' => self::TAG_PRODUCT_ORIGINAL_GROUPID )); } else { $this->getAdapter()->query($sql, array( 'tag_id' => $tag_modification_id, 'tag_type_id' => self::TAG_TYPE_PROJECT, 'tag_object_id' => $object_id, 'tag_group_id' => self::TAG_PRODUCT_ORIGINAL_GROUPID )); } } else { if ($r) { foreach ($r as $tag) { $sql = "UPDATE tag_object set tag_changed = NOW() , is_deleted = 1 WHERE tag_item_id = :tagItemId"; $this->getAdapter()->query($sql, array('tagItemId' => $tag['tag_item_id'])); } } } } /** * @param int $object_id */ public function processTagCollection($object_id) { $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_COLLECTION_ID_ID, 'tag_type_id' => self::TAG_TYPE_PROJECT, 'tag_object_id' => $object_id, 'tag_group_id' => self::TAG_COLLECTION_GROUPID )); } /** * @param int $object_id * @param string $tag * @param int $tag_type */ public function addTagUser($object_id, $tag, $tag_type) { $tableTags = new Default_Model_DbTable_Tags(); $listIds = $tableTags->storeTagsUser($tag); $tag_group_id = $this::TAG_USER_GROUPID; $prepared_insert = array_map(function ($id) use ($object_id, $tag_type, $tag_group_id) { return "({$id}, {$tag_type}, {$object_id},{$tag_group_id})"; }, $listIds); $sql = "INSERT IGNORE INTO tag_object (tag_id, tag_type_id, tag_object_id,tag_group_id) VALUES " . implode(',', $prepared_insert); $this->getAdapter()->query($sql); } public function deleteTagUser($object_id, $tag, $tag_type) { $removable_tag = $tag; // $sql = "DELETE tag_object FROM tag_object JOIN tag ON tag.tag_id = tag_object.tag_id WHERE tag_group_id = ".Default_Model_Tags::TAG_USER_GROUPID." and tag.tag_name = :name and tag_object.tag_object_id=:object_id // and tag_group_id =".Default_Model_Tags::TAG_USER_GROUPID; $sql = "UPDATE `tag_object` INNER JOIN `tag` ON `tag`.`tag_id` = `tag_object`.`tag_id` SET `tag_changed` = NOW() , `is_deleted` = 1 WHERE `tag_group_id` = " . Default_Model_Tags::TAG_USER_GROUPID . " AND `tag`.`tag_name` = :name AND `tag_object`.`tag_object_id`=:object_id"; $this->getAdapter()->query($sql, array('name' => $removable_tag, 'object_id' => $object_id)); // if Tag is the only one in Tag_object table then delete this tag for user_groupid = 5 $sql_object = "select count(1) as cnt from tag_object JOIN tag ON tag.tag_id = tag_object.tag_id WHERE tag.tag_name = :name "; $r = $this->getAdapter()->fetchRow($sql_object, array('name' => $removable_tag)); if ($r['cnt'] == 0) { // then remove tag if not existing in Tag_object $sql_delete_tag = "DELETE FROM `tag` WHERE `tag_name`=:name"; $this->getAdapter()->query($sql_delete_tag, array('name' => $removable_tag)); } $this->updateChanged($object_id, $tag_type); } public function getTagsPerCategory($cat_id) { $sql = "select t.* from category_tag as c ,tag as t where c.tag_id = t.tag_id and c.category_id = :cat_id"; $r = $this->getAdapter()->fetchAll($sql, array('cat_id' => $cat_id)); return $r; } public function validateCategoryTags($cat_id, $tags) { if ($tags == null) { return true; } //check if $cat_id children has tag already $sql = ' select * from category_tag where tag_id in (' . $tags . ') and category_id in ( select c.project_category_id from project_category c join project_category d where d.project_category_id = ' . $cat_id . ' and c.lft> d.lft and c.rgtgetAdapter()->fetchAll($sql); if (sizeof($r) > 0) { return false; } // check parent $sql = ' select ancestor_id_path from stat_cat_tree where project_category_id = ' . $cat_id; $r = $this->getAdapter()->fetchRow($sql); $sql = ' select * from category_tag where category_id in (' . $r['ancestor_id_path'] . ') and category_id <> ' . $cat_id . ' and tag_id in (' . $tags . ')'; $r = $this->getAdapter()->fetchAll($sql); if (sizeof($r) > 0) { return false; } return true; } public function updateTagsPerCategory($cat_id, $tags) { $sql = "delete from category_tag where category_id=:cat_id"; $this->getAdapter()->query($sql, array('cat_id' => $cat_id)); if ($tags) { $tags_id = explode(',', $tags); $prepared_insert = array_map(function ($id) use ($cat_id) { return "({$cat_id},{$id})"; }, $tags_id); $sql = "INSERT IGNORE INTO category_tag (category_id, tag_id) VALUES " . implode(',', $prepared_insert); $this->getAdapter()->query($sql); } } public function updateTagsPerStore($store_id, $tags) { $sql = "delete from config_store_tag where store_id=:store_id"; $this->getAdapter()->query($sql, array('store_id' => $store_id)); if ($tags) { $tags_id = explode(',', $tags); $prepared_insert = array_map(function ($id) use ($store_id) { return "({$store_id},{$id})"; }, $tags_id); $sql = "INSERT IGNORE INTO config_store_tag (store_id, tag_id) VALUES " . implode(',', $prepared_insert); $this->getAdapter()->query($sql); } } public function getTagsPerGroup($groupid) { $sql = " select tag.tag_id ,tag.tag_name ,tag_fullname ,tag_description from tag join tag_group_item on tag.tag_id = tag_group_item.tag_id and tag_group_item.tag_group_id = :groupid order by tag_name "; $result = $this->getAdapter()->fetchAll($sql, array('groupid' => $groupid)); return $result; } public function getAllTagsForStoreFilter() { $sql = " select tag.tag_id, CASE WHEN tag.tag_fullname IS NULL THEN tag_name ELSE tag.tag_fullname END as tag_name from tag where tag.is_active = 1 order by tag_name "; $result = $this->getAdapter()->fetchAll($sql); return $result; } public function getAllTagGroupsForStoreFilter() { $sql = " SELECT `tag_group`.`group_id`, `tag_group`.`group_name` AS `group_name` FROM `tag_group` ORDER BY `tag_group`.`group_name` "; $result = $this->getAdapter()->fetchAll($sql); return $result; } public function saveLicenseTagForProject($object_id, $tag_id) { $tableTags = new Default_Model_DbTable_Tags(); $tags = $tableTags->fetchLicenseTagsForProject($object_id); if (count($tags) == 0) { //insert new tag if ($tag_id) { $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' => $tag_id, 'tag_type_id' => $this::TAG_TYPE_PROJECT, 'tag_object_id' => $object_id, 'tag_group_id' => $this::TAG_LICENSE_GROUPID )); } } else { $tag = $tags[0]; //remove tag license if (!$tag_id) { //$sql = "DELETE FROM tag_object WHERE tag_item_id = :tagItemId"; $sql = "UPDATE `tag_object` SET `tag_changed` = NOW() , `is_deleted` = 1 WHERE `tag_item_id` = :tagItemId"; $this->getAdapter()->query($sql, array('tagItemId' => $tag['tag_item_id'])); } else { //Update old tag if ($tag_id <> $tag['tag_id']) { $sql = "UPDATE tag_object SET tag_changed = NOW(),tag_id = :tag_id WHERE tag_item_id = :tagItemId"; $this->getAdapter()->query($sql, array('tagItemId' => $tag['tag_item_id'], 'tag_id' => $tag_id)); } } } } public function saveGhnsExcludedTagForProject($object_id, $tag_value) { $tableTags = new Default_Model_DbTable_Tags(); $ghnsExcludedTagId = $tableTags->fetchGhnsExcludedTagId(); $sql = "UPDATE tag_object SET tag_changed = NOW() , is_deleted = 1 WHERE tag_group_id = :tag_group_id AND tag_type_id = :tag_type_id AND tag_object_id = :tag_object_id"; $this->getAdapter()->query($sql, array( 'tag_group_id' => $this::TAG_GHNS_EXCLUDED_GROUPID, 'tag_type_id' => $this::TAG_TYPE_PROJECT, 'tag_object_id' => $object_id )); if ($tag_value == 1) { $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' => $ghnsExcludedTagId, 'tag_type_id' => $this::TAG_TYPE_PROJECT, 'tag_object_id' => $object_id, 'tag_group_id' => $this::TAG_GHNS_EXCLUDED_GROUPID )); } } public function saveDangerosuTagForProject($object_id, $tag_value) { $tableTags = new Default_Model_DbTable_Tags(); $tag_dangerous_group_id = Zend_Registry::get('config')->settings->client->default->tag_group_dangerous_id; $tag_dangerous_id = Zend_Registry::get('config')->settings->client->default->tag_dangerous_id; $sql = "UPDATE tag_object SET tag_changed = NOW() , is_deleted = 1 WHERE tag_group_id = :tag_group_id AND tag_type_id = :tag_type_id AND tag_object_id = :tag_object_id"; $this->getAdapter()->query($sql, array( 'tag_group_id' => $tag_dangerous_group_id, 'tag_type_id' => $this::TAG_TYPE_PROJECT, 'tag_object_id' => $object_id )); if ($tag_value == 1) { $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' => $tag_dangerous_id, 'tag_type_id' => $this::TAG_TYPE_PROJECT, 'tag_object_id' => $object_id, 'tag_group_id' => $tag_dangerous_group_id )); } } + public function saveDeprecatedModeratorTagForProject($object_id, $tag_value) + { + $tag_group_id = Zend_Registry::get('config')->settings->client->default->tag_group_deprecated_id; + $tag_id = Zend_Registry::get('config')->settings->client->default->tag_deprecated_id; + $this->saveOrUpdateTagObjectProject($object_id,$tag_value,$tag_group_id,$tag_id); + } + + protected function saveOrUpdateTagObjectProject($object_id,$tag_value,$tag_group_id,$tag_id) + { + $sql = "UPDATE tag_object SET tag_changed = NOW() , is_deleted = 1 WHERE tag_group_id = :tag_group_id AND tag_type_id = :tag_type_id AND tag_object_id = :tag_object_id"; + $this->getAdapter()->query($sql, array( + 'tag_group_id' => $tag_group_id, + 'tag_type_id' => $this::TAG_TYPE_PROJECT, + 'tag_object_id' => $object_id + )); + + if ($tag_value == 1) { + $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' => $tag_id, + 'tag_type_id' => $this::TAG_TYPE_PROJECT, + 'tag_object_id' => $object_id, + 'tag_group_id' => $tag_group_id + )); + } + } + public function saveArchitectureTagForProject($project_id, $file_id, $tag_id) { //first delete old //$sql = "DELETE FROM tag_object WHERE tag_group_id = :tag_group_id AND tag_type_id = :tag_type_id AND tag_object_id = :tag_object_id AND tag_parent_object_id = :tag_parent_object_id"; $sql = "UPDATE tag_object SET tag_changed = NOW() , is_deleted = 1 WHERE tag_group_id = :tag_group_id AND tag_type_id = :tag_type_id AND tag_object_id = :tag_object_id AND tag_parent_object_id = :tag_parent_object_id"; $this->getAdapter()->query($sql, array( 'tag_group_id' => $this::TAG_ARCHITECTURE_GROUPID, 'tag_type_id' => $this::TAG_TYPE_FILE, 'tag_object_id' => $file_id, 'tag_parent_object_id' => $project_id )); if ($tag_id) { $sql = "INSERT IGNORE INTO tag_object (tag_id, tag_type_id, tag_object_id, tag_parent_object_id, tag_group_id) VALUES (:tag_id, :tag_type_id, :tag_object_id, :tag_parent_object_id, :tag_group_id)"; $this->getAdapter()->query($sql, array( 'tag_id' => $tag_id, 'tag_type_id' => $this::TAG_TYPE_FILE, 'tag_object_id' => $file_id, 'tag_parent_object_id' => $project_id, 'tag_group_id' => $this::TAG_ARCHITECTURE_GROUPID )); } } public function saveFileTagForProjectAndTagGroup($project_id, $file_id, $tag_id, $tag_group_id) { //first delete old $sql = "UPDATE tag_object SET tag_changed = NOW() , is_deleted = 1 WHERE tag_group_id = :tag_group_id AND tag_type_id = :tag_type_id AND tag_object_id = :tag_object_id AND tag_parent_object_id = :tag_parent_object_id"; $this->getAdapter()->query($sql, array( 'tag_group_id' => $tag_group_id, 'tag_type_id' => $this::TAG_TYPE_FILE, 'tag_object_id' => $file_id, 'tag_parent_object_id' => $project_id )); if (!empty($tag_id)) { if (is_array($tag_id)) { foreach ($tag_id as $tag) { $sql = "INSERT IGNORE INTO tag_object (tag_id, tag_type_id, tag_object_id, tag_parent_object_id, tag_group_id) VALUES (:tag_id, :tag_type_id, :tag_object_id, :tag_parent_object_id, :tag_group_id)"; $this->getAdapter()->query($sql, array( 'tag_id' => $tag, 'tag_type_id' => $this::TAG_TYPE_FILE, 'tag_object_id' => $file_id, 'tag_parent_object_id' => $project_id, 'tag_group_id' => $tag_group_id )); } } else { $sql = "INSERT IGNORE INTO tag_object (tag_id, tag_type_id, tag_object_id, tag_parent_object_id, tag_group_id) VALUES (:tag_id, :tag_type_id, :tag_object_id, :tag_parent_object_id, :tag_group_id)"; $this->getAdapter()->query($sql, array( 'tag_id' => $tag_id, 'tag_type_id' => $this::TAG_TYPE_FILE, 'tag_object_id' => $file_id, 'tag_parent_object_id' => $project_id, 'tag_group_id' => $tag_group_id )); } } } public function deleteFileTagForProject($project_id, $file_id, $tag_id) { //first delete old $sql = "UPDATE tag_object SET tag_changed = NOW() , is_deleted = 1 WHERE tag_id= :tag_id AND tag_type_id = :tag_type_id AND tag_object_id = :tag_object_id AND tag_parent_object_id = :tag_parent_object_id"; $this->getAdapter()->query($sql, array( 'tag_id' => $tag_id, 'tag_type_id' => $this::TAG_TYPE_FILE, 'tag_object_id' => $file_id, 'tag_parent_object_id' => $project_id )); } public function savePackageTagForProject($project_id, $file_id, $tag_id) { //first delete old $sql = "UPDATE tag_object SET tag_changed = NOW() , is_deleted = 1 WHERE tag_group_id = :tag_group_id AND tag_type_id = :tag_type_id AND tag_object_id = :tag_object_id AND tag_parent_object_id = :tag_parent_object_id"; $this->getAdapter()->query($sql, array( 'tag_group_id' => $this::TAG_PACKAGETYPE_GROUPID, 'tag_type_id' => $this::TAG_TYPE_FILE, 'tag_object_id' => $file_id, 'tag_parent_object_id' => $project_id )); if ($tag_id) { $sql = "INSERT IGNORE INTO tag_object (tag_id, tag_type_id, tag_object_id, tag_parent_object_id, tag_group_id) VALUES (:tag_id, :tag_type_id, :tag_object_id, :tag_parent_object_id, :tag_group_id)"; $this->getAdapter()->query($sql, array( 'tag_id' => $tag_id, 'tag_type_id' => $this::TAG_TYPE_FILE, 'tag_object_id' => $file_id, 'tag_parent_object_id' => $project_id, 'tag_group_id' => $this::TAG_PACKAGETYPE_GROUPID )); } } public function getProjectPackageTypesString($projectId) { $sql = 'SELECT DISTINCT ta.tag_fullname as name FROM tag_object t INNER JOIN tag ta on ta.tag_id = t.tag_id WHERE t.tag_group_id = :tag_group_id AND t.tag_parent_object_id = :project_id AND t.is_deleted = 0'; $resultSet = $this->getAdapter()->fetchAll($sql, array('tag_group_id' => $this::TAG_PACKAGETYPE_GROUPID, 'project_id' => $projectId)); $resultString = ''; if (count($resultSet) > 0) { foreach ($resultSet as $item) { $resultString = $resultString . ' ' . stripslashes($item['name']) . ''; } return $resultString; } return ''; } public function getProjectPackageTypesPureStrings($projectId) { $sql = 'SELECT DISTINCT ta.tag_fullname as name FROM tag_object t INNER JOIN tag ta on ta.tag_id = t.tag_id WHERE t.tag_group_id = :tag_group_id AND t.tag_parent_object_id = :project_id AND t.is_deleted = 0'; $resultSet = $this->getAdapter()->fetchAll($sql, array('tag_group_id' => $this::TAG_PACKAGETYPE_GROUPID, 'project_id' => $projectId)); $resultString = ''; if (count($resultSet) > 0) { foreach ($resultSet as $item) { $resultString = $resultString . ' ' . stripslashes($item['name']); } return $resultString; } return ''; } public function deleteFileTagsOnProject($projectId, $fileId) { $sql = "UPDATE tag_object inner join tag ON tag.tag_id = tag_object.tag_id set tag_changed = NOW() , is_deleted = 1 WHERE tag_type_id = :tag_type_id and tag_object.tag_object_id=:object_id and tag_object.tag_parent_object_id=:parent_object_id"; $this->getAdapter()->query($sql, array('tag_type_id' => $this::TAG_TYPE_FILE, 'object_id' => $fileId, 'parent_object_id' => $projectId)); } public function deletePackageTypeOnProject($projectId, $fileId) { $sql = "UPDATE tag_object inner join tag ON tag.tag_id = tag_object.tag_id set tag_changed = NOW() , is_deleted = 1 WHERE tag_group_id = :tag_group_id and tag_object.tag_object_id=:object_id and tag_object.tag_parent_object_id=:parent_object_id"; $this->getAdapter()->query($sql, array( 'tag_group_id' => $this::TAG_PACKAGETYPE_GROUPID, 'object_id' => $fileId, 'parent_object_id' => $projectId )); } public function deleteArchitectureOnProject($projectId, $fileId) { $sql = "UPDATE tag_object inner join tag ON tag.tag_id = tag_object.tag_id set tag_changed = NOW() , is_deleted = 1 WHERE tag_group_id = :tag_group_id and tag_object.tag_object_id=:object_id and tag_object.tag_parent_object_id=:parent_object_id"; $this->getAdapter()->query($sql, array( 'tag_group_id' => $this::TAG_ARCHITECTURE_GROUPID, 'object_id' => $fileId, 'parent_object_id' => $projectId )); } /** * @param int $projectId * @param int $fileId * @return string */ public function getPackageType($projectId, $fileId) { $sql = 'SELECT ta.tag_fullname as name FROM tag_object t INNER JOIN tag ta on ta.tag_id = t.tag_id WHERE t.tag_group_id = :tag_group_id AND t.tag_parent_object_id = :project_id AND t.tag_object_id = :file_id AND t.is_deleted = 0'; $resultSet = $this->getAdapter()->fetchAll($sql, array('tag_group_id' => $this::TAG_PACKAGETYPE_GROUPID, 'project_id' => $projectId, 'file_id' => $fileId)); if (count($resultSet) > 0) { return $resultSet[0]['name']; } else { return ''; } } /** * @param int $fileId * @return array */ public function getFileTags($fileId) { $sql = 'SELECT ta.tag_id, ta.tag_fullname as name FROM tag_object t INNER JOIN tag ta on ta.tag_id = t.tag_id WHERE t.tag_type_id = :tag_type_id AND t.tag_object_id = :file_id AND t.is_deleted = 0'; $resultSet = $this->getAdapter()->fetchAll($sql, array('tag_type_id' => $this::TAG_TYPE_FILE, 'file_id' => $fileId)); return $resultSet; } /** * @param int $projectId * @param int $fileId * @param int $tagGroup * @return array */ public function getTagsForFileAndTagGroup($projectId, $fileId, $tagGroup) { $sql = 'SELECT ta.tag_fullname as name FROM tag_object t INNER JOIN tag ta on ta.tag_id = t.tag_id WHERE t.tag_group_id = :tag_group_id AND t.tag_parent_object_id = :project_id AND t.tag_object_id = :file_id AND t.is_deleted = 0'; $resultSet = $this->getAdapter()->fetchAll($sql, array('tag_group_id' => $tagGroup, 'project_id' => $projectId, 'file_id' => $fileId)); return $resultSet; } /** * @param int $object_id * * @return array * @throws Zend_Exception */ public function getTagsEbookSubject($object_id) { $tag_group_ids = Zend_Registry::get('config')->settings->client->default->tag_group_ebook_subject; $tags = $this->getTagsArray($object_id, $this::TAG_TYPE_PROJECT, $tag_group_ids); return $tags; } /** * @param int $object_id * * @return array * @throws Zend_Exception */ public function getTagsEbookAuthor($object_id) { $tag_group_ids = Zend_Registry::get('config')->settings->client->default->tag_group_ebook_author; $tags = $this->getTagsArray($object_id, $this::TAG_TYPE_PROJECT, $tag_group_ids); return $tags; } /** * @param int $object_id * * @return array * @throws Zend_Exception */ public function getTagsEbookEditor($object_id) { $tag_group_ids = Zend_Registry::get('config')->settings->client->default->tag_group_ebook_editor; $tags = $this->getTagsArray($object_id, $this::TAG_TYPE_PROJECT, $tag_group_ids); return $tags; } /** * @param int $object_id * * @return array * @throws Zend_Exception */ public function getTagsEbookIllustrator($object_id) { $tag_group_ids = Zend_Registry::get('config')->settings->client->default->tag_group_ebook_illustrator; $tags = $this->getTagsArray($object_id, $this::TAG_TYPE_PROJECT, $tag_group_ids); return $tags; } /** * @param int $object_id * * @return array * @throws Zend_Exception */ public function getTagsEbookTranslator($object_id) { $tag_group_ids = Zend_Registry::get('config')->settings->client->default->tag_group_ebook_translator; $tags = $this->getTagsArray($object_id, $this::TAG_TYPE_PROJECT, $tag_group_ids); return $tags; } /** * @param int $object_id * * @return array * @throws Zend_Exception */ public function getTagsEbookShelf($object_id) { $tag_group_ids = Zend_Registry::get('config')->settings->client->default->tag_group_ebook_shelf; $tags = $this->getTagsArray($object_id, $this::TAG_TYPE_PROJECT, $tag_group_ids); return $tags; } /** * @param int $object_id * * @return array * @throws Zend_Exception */ public function getTagsEbookLanguage($object_id) { $tag_group_ids = Zend_Registry::get('config')->settings->client->default->tag_group_ebook_language; $tags = $this->getTagsArray($object_id, $this::TAG_TYPE_PROJECT, $tag_group_ids); return $tags; } /** * @param int $object_id * * @return array * @throws Zend_Exception */ public function getTagsEbookType($object_id) { $tag_group_ids = Zend_Registry::get('config')->settings->client->default->tag_group_ebook_type; $tags = $this->getTagsArray($object_id, $this::TAG_TYPE_PROJECT, $tag_group_ids); return $tags; } public function saveCollectionTypeTagForProject($object_id, $tag_id) { $tableTags = new Default_Model_DbTable_Tags(); $collectionTagGroup = Zend_Registry::get('config')->settings->client->default->tag_group_collection_type_id; $tags = $tableTags->fetchTagsForProject($object_id, $collectionTagGroup); if (count($tags) == 0) { //insert new tag if ($tag_id) { $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' => $tag_id, 'tag_type_id' => $this::TAG_TYPE_PROJECT, 'tag_object_id' => $object_id, 'tag_group_id' => $collectionTagGroup )); } } else { $tag = $tags[0]; //remove tag license if (!$tag_id) { //$sql = "DELETE FROM tag_object WHERE tag_item_id = :tagItemId"; $sql = "UPDATE tag_object set tag_changed = NOW() , is_deleted = 1 WHERE tag_item_id = :tagItemId"; $this->getAdapter()->query($sql, array('tagItemId' => $tag['tag_item_id'])); } else { //Update old tag if ($tag_id <> $tag['tag_id']) { $sql = "UPDATE tag_object SET tag_changed = NOW(),tag_id = :tag_id WHERE tag_item_id = :tagItemId"; $this->getAdapter()->query($sql, array('tagItemId' => $tag['tag_item_id'], 'tag_id' => $tag_id)); } } } } //========================== generic methods ============================= public function fetchTagObject($tag_id, $tag_object_id, $tag_group_id, $tag_type_id) { $sql = $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' => $tag_id, 'tag_object_id' => $tag_object_id, 'tag_group_id' => $tag_group_id, 'tag_type_id' => $tag_type_id )); return $r; } /* * $tag_ids array tag ids */ /** * @return array * @throws Zend_Exception */ public function getTagGroupsOSUser() { $tag_group_ids = Zend_Registry::get('config')->settings->client->default->tag_group_osuser; return $this->getTagGroups($tag_group_ids); } public function getTagGroups($tag_group_ids) { $sql = 'select g.group_id ,g.group_name ,g.group_display_name ,g.is_multi_select ,i.tag_group_item_id ,i.tag_id ,t.tag_name ,t.tag_fullname ,t.tag_description from tag_group g, tag_group_item i, tag t where g.group_id=i.tag_group_id and i.tag_id = t.tag_id and g.group_id in (' . $tag_group_ids . ')'; $resultSet = $this->getAdapter()->fetchAll($sql); return $resultSet; } public function saveOSTagForUser($tag_id, $tag_group_id, $member_id) { $tag_type_id = Zend_Registry::get('config')->settings->client->default->tag_type_osuser; $this->deleteTagForTabObject($member_id, $tag_group_id, $tag_type_id); $this->insertTagObject($tag_id, $tag_type_id, $tag_group_id, $member_id, null); } //========================== generic methods end ============================= // ======================== settings profile user os ========================================== public function deleteTagForTabObject($tag_object_id, $tag_group_id, $tag_type_id) { $sql = "UPDATE tag_object SET tag_changed = NOW() , is_deleted = 1 WHERE tag_group_id = :tag_group_id AND tag_type_id = :tag_type_id AND tag_object_id = :tag_object_id"; $this->getAdapter()->query($sql, array('tag_group_id' => $tag_group_id, 'tag_type_id' => $tag_type_id, 'tag_object_id' => $tag_object_id)); } public function insertTagObject($tag_ids, $tag_type_id, $tag_group_id, $tag_object_id, $tag_parent_object_id) { if ($tag_ids == null || sizeof($tag_ids) == 0) { return; } if (!is_array($tag_ids)) { $tag_ids = array($tag_ids); } if ($tag_parent_object_id) { $prepared_insert = array_map(function ($id) use ($tag_type_id, $tag_group_id, $tag_object_id, $tag_parent_object_id) { return "({$id}, {$tag_type_id},{$tag_group_id},{$tag_object_id},{$tag_parent_object_id})"; }, $tag_ids); $sql = "INSERT IGNORE INTO tag_object (tag_id, tag_type_id, tag_group_id,tag_object_id,tag_parent_object_id) VALUES " . implode(',', $prepared_insert); $this->getAdapter()->query($sql); } else { $prepared_insert = array_map(function ($id) use ($tag_type_id, $tag_group_id, $tag_object_id) { return "({$id}, {$tag_type_id},{$tag_group_id},{$tag_object_id})"; }, $tag_ids); $sql = "INSERT IGNORE INTO tag_object (tag_id, tag_type_id, tag_group_id,tag_object_id) VALUES " . implode(',', $prepared_insert); $this->getAdapter()->query($sql); } } public function getTagsOSUser($member_id) { $tag_group_ids = Zend_Registry::get('config')->settings->client->default->tag_group_osuser; $tag_type_id = Zend_Registry::get('config')->settings->client->default->tag_type_osuser; return $this->getTagsArray($member_id, $tag_type_id,$tag_group_ids); } } \ No newline at end of file diff --git a/application/modules/default/views/scripts/product/index.phtml b/application/modules/default/views/scripts/product/index.phtml index 1f9116d9e..53663f5aa 100644 --- a/application/modules/default/views/scripts/product/index.phtml +++ b/application/modules/default/views/scripts/product/index.phtml @@ -1,1180 +1,1194 @@ . **/ $helpAddDefaultScheme = new Default_View_Helper_AddDefaultScheme(); $helpMemberUrl = new Default_View_Helper_BuildMemberUrl(); $helpEncryptUrl = new Default_View_Helper_EncryptUrl(); $helpImage = new Default_View_Helper_Image(); $helpTruncate = new Default_View_Helper_Truncate(); $helpProductUrl = new Default_View_Helper_BuildProductUrl(); $helpBBCode = new Default_View_Helper_Bbcode2html(); $helperUserRole = new Backend_View_Helper_UserRole(); $userRoleName = $helperUserRole->userRole(); $isAdmin = false; if (Default_Model_DbTable_MemberRole::ROLE_NAME_ADMIN == $userRoleName) { $isAdmin = true; } $identity = Zend_Auth::getInstance()->getStorage()->read(); $loginUrl = '/login?redirect=' . $helpEncryptUrl->encryptUrl(Zend_Controller_Front::getInstance()->getRequest() ->getRequestUri(), true); $viewSidebar = 'product/partials/productAboutSidebar.phtml'; $viewClaimBox = false; if ($this->product->claimable == 1) { $viewClaimBox = 'product/partials/productClaimTopHeader.phtml'; } $helpProjectFiles = new Default_View_Helper_ProjectFiles(); $productFileInfos = $helpProjectFiles->projectFiles($this->product->ppload_collection_id); $this->product->title = Default_Model_HtmlPurify::purify($this->product->title); $this->product->description = Default_Model_BBCode::renderHtml(Default_Model_HtmlPurify::purify($this->product->description)); $this->product->version = Default_Model_HtmlPurify::purify($this->product->version); //$this->product->embed_code =Default_Model_HtmlPurify::purify($this->product->embed_code,Default_Model_HtmlPurify::ALLOW_EMBED); $this->product->link_1 = Default_Model_HtmlPurify::purify($helpAddDefaultScheme->addDefaultScheme($this->product->link_1),Default_Model_HtmlPurify::ALLOW_URL); $this->product->source_url = Default_Model_HtmlPurify::purify($this->product->source_url,Default_Model_HtmlPurify::ALLOW_URL); $this->product->facebook_code = Default_Model_HtmlPurify::purify($this->product->facebook_code,Default_Model_HtmlPurify::ALLOW_URL); $this->product->twitter_code = Default_Model_HtmlPurify::purify($this->product->twitter_code,Default_Model_HtmlPurify::ALLOW_URL); $this->product->google_code = Default_Model_HtmlPurify::purify($this->product->google_code,Default_Model_HtmlPurify::ALLOW_URL); $this->doctype(Zend_View_Helper_Doctype::XHTML1_RDFA); $this->headMeta()->setName('description', $helpTruncate->truncate($this->product->description, 200, '...', false, true)); $this->headMeta()->setName('title', $helpTruncate->truncate($this->product->title, 200, '...', false, true)); $this->headMeta()->appendProperty('og:url', $helpProductUrl->buildProductUrl($this->product->project_id, '', null, true)); $this->headMeta()->appendProperty('og:type', 'website'); $this->headMeta()->appendProperty('og:title', $this->product->title); $this->headMeta()->appendProperty('og:description', $helpTruncate->truncate($this->product->description, 200, '...', false, true)); $this->headMeta()->appendProperty('og:image', $helpImage->Image($this->product->image_small, array('width' => 400, 'height' => 400))); $tableProject = new Default_Model_Project(); $tableCollection = new Default_Model_Collection(); $tableProjectUpdates = new Default_Model_ProjectUpdates(); $this->updates = $tableProjectUpdates->fetchProjectUpdates($this->product->project_id); $tableProjectRatings = new Default_Model_DbTable_ProjectRating(); $this->ratings = $tableProjectRatings->fetchRating($this->product->project_id); $commentModel = new Default_Model_ProjectComments(); $cntModeration = $commentModel->fetchCommentsWithTypeProjectCount(30,$this->product->project_id); if (Zend_Auth::getInstance()->hasIdentity()){ $this->ratingOfUser = $tableProjectRatings->getProjectRateForUser($this->product->project_id,$identity->member_id); } $tableProjectFollower = new Default_Model_DbTable_ProjectFollower(); $this->likes = $tableProjectFollower->fetchLikesForProject($this->product->project_id); $projectplings = new Default_Model_ProjectPlings(); $this->projectplings = $projectplings->fetchPlingsForProject($this->product->project_id); $projectsupport = new Default_Model_SectionSupport(); $this->projectaffiliates = $projectsupport->fetchAffiliatesForProject($this->product->project_id); $tagmodel = new Default_Model_Tags(); $helperUserRole = new Backend_View_Helper_UserRole(); $userRoleName = $helperUserRole->userRole(); $this->userRoleName = $userRoleName; $productTmp =$this->product->toArray(); $productTmp['image_small_absolute']=$helpImage->Image($this->product->image_small, array('width' => 400, 'height' => 400)); $productJson = Zend_Json::encode(Default_Model_Collection::cleanProductInfoForJson($productTmp)); $filesJson = $this->filesJson; $helperCatXdgType = new Default_View_Helper_CatXdgType(); $xdgTypeJson = Zend_Json::encode($helperCatXdgType->catXdgType($this->product->project_category_id)); $isowner = false; if(Zend_Auth::getInstance()->hasIdentity() && $identity->member_id==$this->product->member_id){ $isowner = true; } $this->isowner = $isowner; $filesTable = new Default_Model_DbTable_PploadFiles(); $countFiles = $filesTable->fetchFilesCntForProject($this->product->ppload_collection_id); $pics= $tableProject->getGalleryPictureSources($this->product->project_id); if(sizeof($pics)==0) { array_push($pics,$this->product->image_small); } $this->galleryPictures=array(); foreach ($pics as $p) { $this->galleryPictures[] = $this->Image($p, array('height' => '600')); } $galleryPicturesJson = Zend_Json::encode($this->galleryPictures); ?>
hasIdentity()) { ?> hasIdentity()) { ?> hasIdentity()) { ?>
product->link_1)): ?> product->title; ?> product->title; ?> translate('Edit Product') ?> product->featured=='1'){ ?> Featured isProjectOriginal($this->product->project_id)){?> Original isProjectMod($this->product->project_id)){?> Mod

product->project_category_id . '/order/latest">' . $this->product->cat_title . ' '; ?> '; $tagsuser = $tagmodel->getTagsUser($this->product->project_id, Default_Model_Tags::TAG_TYPE_PROJECT); echo ''; if(false === empty($tagsuser)) { foreach (explode(',',$tagsuser) as $tag) { ?> '; if($isowner){ $this->headLink()->appendStylesheet('/theme/flatui/css/select2.min.css'); $this->headLink()->appendStylesheet('/theme/flatui/css/select2.custmized.css'); $this->inlineScript()->appendFile('/theme/flatui/js/lib/select2.min.js'); ?> Saved inlineScript()->appendScript( ' $(document).ready(function(){ TagingProductDetail.setup(); }); '); } echo ''; ?>

Source (link to git-repo or to original if based on someone elses unmodified work): product->gitlab_project_id)) { $url = $this->gitlab_project['web_url']; $url = str_replace("http://", "https://", $url); echo ' ' . $url . ' '; } else if (false === empty($this->product->source_url)) { $target='_blank'; if (strpos($this->product->source_url, 'opencode.net') !== false) { $target='_self'; } echo '' . $this->product->source_url . ' '; if (Default_Model_DbTable_MemberRole::ROLE_NAME_ADMIN == $userRoleName) { $cntSameSource = $tableProject->getCountSourceurl($this->product->source_url); if($cntSameSource>1){ $link = '/p/'.$this->product->project_id.'/listsamesourceurl'; echo ' ['.$cntSameSource.']'; } } } else { echo ' Add the source-code for this project on opencode.net'; } ?>

partial( '/product/partials/projectlike.phtml', array( "authMember" => $identity, "project_id" => $this->product->project_id ) ); ?>
render('partials/sidebarRating.phtml'); ?>
render('partials/sidebarScore.phtml'); ?>
product->is_gitlab_project && $this->product->use_gitlab_project_readme && null != $this->gitlab_project['readme_url']) { ?>
Description:

readme ?>

Description:

product->description ?>
updates) > 0) { $this->productUpdate = $this->updates[0]; ?>
Last changelog: render('product/partials/productUpdatesV1.phtml'); ?>
paramPageId; $testComments = $modelComments->getCommentTreeForProject($this->product->project_id); $testComments->setItemCountPerPage(25); $testComments->setCurrentPageNumber($offset); $this->comments = $testComments; echo $this->render('product/partials/productCommentsUX1.phtml'); ?>
partial( $viewClaimBox, array( "member" => $this->member, "product" => $this->product ) ); } ?>
updates) > 0) { ?>
updates as $this->productUpdate) { echo $this->render('product/partials/productUpdatesV1.phtml'); } ?>
product->show_gitlab_project_issues) { ?>
gitlab_project_issues; $i = 0; foreach ($issues as $issue){ $date = date('Y-m-d H:i:s', strtotime($issue['created_at'])); echo '
' . $issue['title'] . '
'.$this->printDate($date).'
'; $i ++; if($i>5) { break; } } ?> Show all gitlab_project['open_issues_count'] ?> Issues
render('product/partials/productRating2.phtml'); ?>
+ isProductDeprecatedModerator($this->product->project_id); + ?> +
+ /> product-deprecated +
+ +
+ +
paramPageId; $testComments = $modelComments->getCommentTreeForProject($this->product->project_id,30); $testComments->setItemCountPerPage(25); $testComments->setCurrentPageNumber($offset); $this->comments = $testComments; echo $this->render('product/partials/productCommentsUX2.phtml'); ?>
likes) > 0) { ?>
render('product/partials/productLikes.phtml'); ?>
projectplings) > 0) { ?>
render('product/partials/productPlings.phtml'); ?>
render('product/partials/productAffiliates.phtml'); ?>
render('product/partials/ppload.phtml'); ?>
*Needs pling-store or ocs-url to install things
product->claimable)) { ?>
partial( '/product/partials/projectplings.phtml', array( "authMember" => $identity, "project_id" => $this->product->project_id, "ppload_collection_id" => $this->product->ppload_collection_id, "project_category_id" => $this->product->project_category_id ) ); ?>
projectaffiliates) ?> Affiliateprojectaffiliates) == 0?'s':'' ?>projectaffiliates) > 1?'s':'' ?>
product->paypal_mail) { * */ echo $this->partial( '/product/partials/support_box.phtml', array( "authMember" => $identity, "project_id" => $this->product->project_id, "project_title" => $this->product->title, "ppload_collection_id" => $this->product->ppload_collection_id, "project_category_id" => $this->product->project_category_id, "project_category_title" => $this->product->cat_title, "isAdmin" => $isAdmin ) ); /*}*/ ?> render('partials/sidebarRating.phtml'); */ ?>
*/ ?> countAllCollectionsForProject($this->product->project_id); if($cntCollections>0) { ?>
moreProducts = $tableCollection->fetchAllCollectionsForProject($this->product->project_id, 6); $this->moreProductsTitle = 'Is part of these Collections'; if (count($this->moreProducts) > 0) { echo $this->render('product/partials/productMoreProductsWidgetV1.phtml'); } ?>
fetchOrigins($this->product->project_id); $this->moreProducts = $origins; $this->moreProductsTitle = 'Based on'; if (count($this->moreProducts) > 0) { echo $this->render('product/partials/productCloneFrom.phtml'); } ?> fetchRelatedProducts($this->product->project_id); $bflag = false; foreach ($related as $r){ $rid = $r->project_id; $bflag = false; foreach ($origins as $o){ $oid = $o->project_id; if($rid == $oid){ $bflag = true; break; } } if(!$bflag) { $relatednew[] = $r; } } $this->moreProducts = $relatednew; $this->moreProductsTitle = 'Variants'; if (count($this->moreProducts) > 0) { echo $this->render('product/partials/productCloneFrom.phtml'); } ?>
moreProducts = $tableProject->fetchMoreProjects($this->product, 6); $this->moreProductsTitle = 'More ' . $this->product->cat_title . ' from ' . $this->product->username; if (count($this->moreProducts) > 0) { echo $this->render('product/partials/productMoreProductsWidgetV1.phtml'); } ?>
moreProducts = $tableProject->fetchMoreProjectsOfOtherUsr($this->product, 6); $this->moreProductsTitle = 'Other ' . $this->product->cat_title; if (count($this->moreProducts) > 0) { echo $this->render('product/partials/productMoreProductsWidgetV1.phtml'); } ?>
render('partials/sidebarCcLicense.phtml'); ?> isProjectEbook($this->product->project_id)) { echo $this->render('product/partials/ebook_details.phtml'); } ?> render('product/partials/details.phtml'); ?> render('product/partials/tags.phtml'); ?>
inlineScript()->appendScript( ' $(document).ready(function(){ InitActiveHashTab.setup(); PartialJson.setup(); PartialJsonFraud.setup(); PartialJsonClone.setup(); ProductDetailCarousel.setup(); PartialCommentReviewForm.setup(); PartialCommentReviewFormNew.setup(); PartialsButtonHeartDetail.setup(); PartialsButtonPlingProject.setup(); TooltipUser.setup("tooltipuserleft","left"); AppimagequestionOnClick.setup(); Opendownloadfile.setup(); CreateScoreRatingPopup.setup(); + PagedetailModeratorDeprecated.setup('.$this->product->project_id.'); $(\'.tooltipheart\').tooltipster({theme: [\'tooltipster-light\', \'tooltipster-light-customized\'], contentCloning: true, contentAsHTML: true, interactive: true}); }); '); diff --git a/application/modules/default/views/scripts/spam/deprecated.phtml b/application/modules/default/views/scripts/spam/deprecated.phtml new file mode 100755 index 000000000..680b18d52 --- /dev/null +++ b/application/modules/default/views/scripts/spam/deprecated.phtml @@ -0,0 +1,179 @@ +. + **/ +?> + + + + + + + + +
+ +
+ +

Deprecated Products

+
+
+
+ \ No newline at end of file diff --git a/httpdocs/theme/flatui/js/script.js b/httpdocs/theme/flatui/js/script.js index 29d84d7d3..81343e9fc 100644 --- a/httpdocs/theme/flatui/js/script.js +++ b/httpdocs/theme/flatui/js/script.js @@ -1,2772 +1,2785 @@ /** * 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 . **/ var prefix = 'ocs_'; var OcsStorage = { set: function(key, value) { localStorage[key] = JSON.stringify(value); }, get: function(key) { return localStorage[key] ? JSON.parse(localStorage[key]) : null; } }; var OcsStats = { props: {}, a: 0, readIp: function(apiv4, apiv6) { var xhr1 = $.getJSON(apiv4,function(data) { OcsStats.props.ipv4=data.ip;OcsStats.saveProps(1);}); xhr1.fail(function() { OcsStats.saveProps(1); }); var xhr2 = $.getJSON(apiv6,function(data) { OcsStats.props.ipv6=data.ip;OcsStats.saveProps(2);}); xhr2.fail(function () { OcsStats.saveProps(2); }); }, genId: function() { var options={}; Fingerprint2.get(options, function (components) { var values = components.map(function (component) { return component.value }); OcsStats.props.fp = Fingerprint2.x64hash128(values.join(''), 31); OcsStats.saveProps(4); }) }, saveProps: function(c) { OcsStorage.set('ocs',OcsStats.props); OcsStats.a += c; if (OcsStats.a == 7) { OcsStats.postProps(); } }, postProps: function() { $.post("/l/fp",OcsStats.props); }, readStats: function(apiv4, apiv6) { if (window.requestIdleCallback) { requestIdleCallback(function () { OcsStats.genId(); OcsStats.readIp(apiv4, apiv6); }) } else { setTimeout(function () { OcsStats.genId(); OcsStats.readIp(apiv4, apiv6); }, 500) } } }; var newProductPage = (function () { return { setup: function () { function adjustScrollableContentHeight() { var pling_box_height = $('#pling-it-box').height(); $('.scrollable-content').height(pling_box_height); $('.scrollable-content').jScrollPane({ mouseWheelSpeed: 30 }); } function adjustSupportersHeight() { var comments_height = $('#donations-panel').find('#comments').height(); var supporters_height = $('#donations-panel').find('#supporters').height(); if (comments_height > supporters_height) { $('#donations-panel').find('#supporters').height(comments_height); } } $(document).ready(function () { adjustScrollableContentHeight(); adjustSupportersHeight(); $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) { adjustSupportersHeight(); }); }); } } })(); // only instantiate when needed to instantiate: var ImagePreview = { hasError: false, setup: function () { this.initProductPicture(); this.initTitlePicture(); this.initProfilePicture(); this.initProfilePictureBackground(); }, previewImage: function (input, img_id) { if (input.files && input.files[0]) { var reader = new FileReader(); var image = new Image(); var file = input.files[0]; reader.readAsDataURL(input.files[0]); reader.onload = function (_image) { var image_element = $('#' + img_id); image.src = _image.target.result; // url.createObjectURL(file); image.onload = function () { var w = this.width, h = this.height, t = file.type, // ext only: // file.type.split('/')[1], n = file.name, s = ~~(file.size / 1024); // + 'KB' ImagePreview.hasError = false; image_element.parent().parent().find('div.bg-danger').remove(); if (w > 2000 || w < 20 || h > 2000 || h < 20) { //image_element.attr('src', '').hide().parent().append('
Wrong image dimensions
'); image_element.parent().parent().append('
Wrong image dimensions
'); //input.val(null); //$(input).replaceWith(input = $(input).clone(true)); $($(input).closest('form')[0]).trigger('reset'); ImagePreview.hasError = true; } if (s > 2000) { //image_element.attr('src', '').hide().parent().append('
File too large
'); image_element.parent().parent().append('
File too large
'); //input.val(null); //$(input).replaceWith(input = $(input).clone(true)); $($(input).closest('form')[0]).trigger('reset'); ImagePreview.hasError = true; } var allowedExtensions = /(jpg|jpeg|png|gif)$/i; if(!allowedExtensions.exec(t)) { image_element.parent().parent().append('
Invalid file type: ' + file.type + '
'); //input.val(null); //$(input).replaceWith(input = $(input).clone(true)); $($(input).closest('form')[0]).trigger('reset'); ImagePreview.hasError = true; } if (false == ImagePreview.hasError) { ImagePreview.hasError = false; image_element.attr('src', _image.target.result); image_element.show(); } }; image.onerror = function () { image_element.parent().parent().find('div.bg-danger').remove(); image_element.parent().parent().append('
Invalid file type: ' + file.type + '
'); }; //image_element.attr('src', _image.target.result); //image_element.show(); if (img_id == 'product-picture-preview') { $('button#add-product-picture').text('CHANGE LOGO'); } else if (img_id == 'title-picture-preview') { $('button#add-title-picture').text('CHANGE BANNER'); } else if (img_id == 'profile-picture-preview') { $('button#add-profile-picture').text('CHANGE PICTURE'); $('input#profile_img_src').val('local'); } else if (img_id == 'profile-picture-bg-preview') { $('button#add-profile-picture-background').text('CHANGE PICTURE'); } }; } }, previewImageMember: function (input, img_id) { if (input.files && input.files[0]) { var reader = new FileReader(); var image = new Image(); var file = input.files[0]; reader.readAsDataURL(input.files[0]); reader.onload = function (_image) { var image_element = $('#' + img_id); image.src = _image.target.result; // url.createObjectURL(file); image.onload = function () { ImagePreview.hasError = false; image_element.parent().find('.image-error').remove(); if (false == ImagePreview.hasError) { image_element.attr('src', _image.target.result); image_element.show(); } }; image.onerror = function () { image_element.parent().append('
Invalid file type
'); }; if (img_id == 'profile-picture-background-preview') { $('button#add-profile-picture-background').text('CHANGE PICTURE'); } }; } }, readImage: function (file) { var reader = new FileReader(); var image = new Image(); reader.readAsDataURL(file); reader.onload = function (_file) { image.src = _file.target.result; // url.createObjectURL(file); image.onload = function () { var w = this.width, h = this.height, t = file.type, // ext only: // file.type.split('/')[1], n = file.name, s = ~~(file.size / 1024) + 'KB'; $('#uploadPreview').append(' ' + w + 'x' + h + ' ' + s + ' ' + t + ' ' + n + '
'); }; image.onerror = function () { alert('Invalid file type: ' + file.type); }; }; }, initProductPicture: function () { if ($('#image_small').length == 0) { return; } if ($('#image_small').attr('value').length == 0) { return; } var imageTarget = $('#image_small').data('target'); $(imageTarget).attr('src', 'https://cn.opendesktop.org/cache/200x200-2/img/' + $('#image_small').attr('value')); $(imageTarget).show(); $('button#add-product-picture').text('CHANGE LOGO'); }, initTitlePicture: function () { if ($('#image_big').length == 0) { return; } if ($('#image_big').attr('value').length == 0) { return; } var imageTarget = $('#image_big').data('target'); $(imageTarget).attr('src', 'https://cn.opendesktop.org/cache/200x200-2/img/' + $('#image_big').attr('value')); $(imageTarget).show(); $('button#add-title-picture').text('CHANGE BANNER'); }, initProfilePicture: function () { if ($('#profile_image_url').length == 0) { return; } if ($('#profile_image_url').attr('value').length == 0) { return; } var imageTarget = $('#profile_image_url').data('target'); $(imageTarget).attr('src', $('#profile_image_url').attr('value')); $('#profile-picture').attr('src', $('#profile_image_url').attr('value')); $(imageTarget).show(); $('button#add-profile-picture').text('CHANGE PICTURE'); }, initProfilePictureBackground: function () { if ($('#profile_image_url_bg').length == 0) { return; } if ($('#profile_image_url_bg').attr('value').length == 0) { return; } var imageTarget = $('#profile_image_url_bg').data('target'); $(imageTarget).attr('src', $('#profile_image_url_bg').attr('value')); $('#profile-picture-background-preview').attr('src', $('#profile_image_url_bg').attr('value')); $(imageTarget).show(); $('button#add-profile-picture-background').text('CHANGE PICTURE'); } }; var MenuHover = (function () { return { setup: function () { $('body').on('click', 'a#login-dropdown', function (event) { event.stopPropagation(); $('.header-login-container').toggleClass('active'); }).on('click', '.header-login-container', function (event) { event.stopPropagation(); }).on('click', 'a.menu-trigger', function (event) { event.stopPropagation(); var html_menu_element = '.' + $(this).attr('rel'); $(html_menu_element).toggleClass('active'); }).on('mouseup', function (event) { var container = $('ul.profile-menu'); var trigger = $('li.profile-menu-container a.menu-trigger'); if (trigger.is(event.target)) { return; } if (!container.is(event.target) // if the target of the click isn't the container... && container.has(event.target).length === 0) // ... nor a descendant of the container { container.removeClass('active'); } }).on('mouseup', function (event) { container = $('div.header-login-container'); trigger = $('a#login-dropdown'); if (trigger.is(event.target)) { return; } if (!container.is(event.target) // if the target of the click isn't the container... && container.has(event.target).length === 0) // ... nor a descendant of the container { container.removeClass('active'); } }).click(function () { $('.header-login-container.active').removeClass('active'); $('.profile-menu.active').removeClass('active'); }); } }; })(); var ButtonCode = (function () { return { setup: function () { $('#button-code-heading').click(function () { if ($(this).hasClass('button-code-active')) { $(this).removeClass('button-code-active'); $(this).parent().find('.button-code').slideUp('fast'); $(this).parent().find('.button-code').css('border-bottom', 'none'); $(this).find('.icon-expand-code').css('background-image', 'url(img/icon-expand.png)'); } else { $(this).addClass('button-code-active'); $(this).parent().find('.button-code').css('border-bottom', '1px solid #bdc3c7'); $(this).parent().find('.button-code').slideDown('fast'); $(this).find('.icon-expand-code').css('background-image', 'url(img/icon-contract.png)'); } }) }, setupClipboardCopy: function (containerId) { $(containerId).on('mouseover', function () { $(this).off('mouseover'); $(this).find('[data-clipboard-target]').each(function () { var clipboardTarget = $($(this).attr('data-clipboard-target')); $(this).zclip({ path: '/theme/flatui/js/lib/ZeroClipboard.swf', copy: $.trim($(clipboardTarget).text()) }); }); }); } }; })(); var ProductPage = (function () { return { setup: function () { $(".dropdown-toggle").dropdown(); $('.scroll-pane').jScrollPane({ mouseWheelSpeed: 30, animateScroll: true }); $('.love-it').on('click', function () { this_img_src = $(this).find('img').attr('src'); if (!$(this).hasClass('no-login') && this_img_src != '/theme/flatui/img/icon-like-color.png') { $(this).prev('.share-it').trigger('click'); } }); $('.payment-options').find('.options').find('span.option').on('click', function () { var this_number = $(this).attr('title'); var number_input = $('.payment-options').find('input[type="number"]'); number_input.attr('value', this_number).val(this_number); number_input.focus(); $('.options').find('.selected').removeClass('selected'); $(this).addClass('selected'); }); }, setupPlingButton: function () { $('#pling-amount').on('focus', function () { $('#pling-amount').popover('destroy'); }); $('#pling-start').on('click', function (event) { validateElement = $('#pling-amount'); validateValue = validateElement.val(); if (validateValue == '' || (isNaN(parseFloat(validateValue)) || !isFinite(validateValue))) { event.preventDefault(); $('#pling-amount').popover({ placement: 'bottom', html: 'true', content: '
Donation must be a numeric value.
' }).popover('show'); return false; } minValue = validateElement.attr('min'); if (parseFloat(validateValue) < parseFloat(minValue)) { event.preventDefault(); $('#pling-amount').popover({ placement: 'bottom', html: 'true', content: '
Donation must be equal or greater than ' + minValue + '.
' }).popover('show'); return false; } maxValue = validateElement.attr('max'); if (parseFloat(validateValue) > parseFloat(maxValue)) { event.preventDefault(); $('#pling-amount').popover({ placement: 'bottom', html: 'true', content: '
Donation must be smaller or equal than ' + maxValue + '.
' }).popover('show'); return false; } }); function minmax(value, min, max) { if (parseInt(value) < 0 || isNaN(value)) return 0; else if (parseInt(value) > 100) return 100; else return value; } } } })(); var SlideShowRender = (function () { return { setup: function () { // add the active class to the first image $('#slideshow-container').find('img:first').addClass('active'); $('#slideshow-container').find('#navigation').find('a:first').addClass('active'); // trigger slideshow //SlideShow.setup(); } } })(); var ProductSlideShow = (function () { return { setup: function () { // arrows function $('#slideshow-container').find('#arrows').find('a').on('click', function (e) { var this_id = $(this).attr('id'); var slides = $('#slideshow-container #slides'); var current_img = slides.find('img.active'); var current_img_rel = current_img.attr('rel'); var current_nav_link = $('#slideshow-container').find('#navigation').find('a.active'); if (this_id == 'prev') { var prev_img_rel = parseInt(current_img_rel) - parseInt(1); var next_active_img = $('#slideshow-container').find('img[rel="' + prev_img_rel + '"]'); var next_active_nav_link = $('#slideshow-container').find('#navigation').find('a[rel="' + prev_img_rel + '"]'); if (!next_active_img.size() == 1) { var next_active_img = slides.find('img:last'); var next_active_nav_link = $('#slideshow-container').find('#navigation').find('a:last'); } } else if (this_id == 'next') { var next_img_rel = parseInt(current_img_rel) + parseInt(1); var next_active_img = $('#slideshow-container').find('img[rel="' + next_img_rel + '"]'); var next_active_nav_link = $('#slideshow-container').find('#navigation').find('a[rel="' + next_img_rel + '"]'); if (!next_active_img.size() == 1) { var next_active_img = slides.find('img:first'); var next_active_nav_link = $('#slideshow-container').find('#navigation').find('a:first'); } } current_img.removeClass('active'); current_nav_link.removeClass('active'); next_active_img.addClass('active'); next_active_nav_link.addClass('active'); //clearTimeout(slideShowInterval); //SlideShow.setup(); }); // navigation function $('#slideshow-container').find('#navigation').find('a').on('click', function () { var this_rel = $(this).attr('rel'); var this_image = $('#slideshow-container').find('img[rel="' + this_rel + '"]'); $('#slideshow-container').find('img.active').removeClass('active'); this_image.addClass('active'); $('#slideshow-container').find('#navigation').find('a.active').removeClass('active'); $(this).addClass('active'); }); } } })(); var SlideShow = (function () { return { setup: function () { slideShowInterval = setTimeout(function () { var current_img = $('#slideshow-container').find('img.active'); var current_img_rel = current_img.attr('rel'); var next_img_rel = parseInt(current_img_rel) + parseInt(1); var next_img = $('#slideshow-container').find('img[rel="' + next_img_rel + '"]'); var current_nav_link = $('#slideshow-container').find('#navigation').find('a.active'); current_img.removeClass('active'); current_nav_link.removeClass('active'); if (next_img.size() == 1) { next_img.addClass('active'); $('#slideshow-container').find('#navigation').find('a[rel="' + next_img_rel + '"]').addClass('active'); } else { $('#slideshow-container').find('img:first').addClass('active'); $('#slideshow-container').find('#navigation').find('a:first').addClass('active'); } //SlideShow.setup(); }, 4000); } } })(); var Popuppanel = (function () { return { setup: function () { $('body').on('click', 'a.popuppanel', function (event) { if ($(this).attr('target') === "_blank"){ console.log('dont prevent default'); } else { event.preventDefault(); var hf = $(this).attr('href'); $.fancybox({ 'hideOnContentClick': true, 'autoScale': true, 'cyclic': 'true', 'transitionIn': 'elastic', 'transitionOut': 'elastic', 'type': 'iframe', 'scrolling': 'auto', helpers: { overlay: { locked: false } }, autoSize: true, href: hf, type: 'ajax' }); } }); } } })(); var PlingsRedirect = (function () { return { setup: function () { if(window.location.hash) { $link = $(window.location.hash); $link.trigger("click"); } else if (document.location.hash) { $link = $(document.location.hash); $link.trigger("click"); } } } })(); var ShowPopups = (function () { return { setup: function () { if(window.location.hash) { alert('Hash'); $('a[href="' + document.location.hash + '"]').trigger("click"); } if (document.location.hash) { alert('Hash'); $('a[href="' + document.location.hash + '"]').trigger("click"); } } } })(); /** PRODUCT PAGE **/ // tool tips $('body').on('mouseenter', '.supporter-thumbnail', function () { $(this).popover('show'); }); $('body').on('mouseleave', '.supporter-thumbnail', function () { $(this).popover('hide'); }); var Partials = (function () { return { setup: function () { $('body').on('click', 'a.partial', function (event) { event.preventDefault(); var url = this.href; var target = $(this).attr("data-target"); var toggle = $(this).data('toggle'); var pageFragment = $(this).attr("data-fragment"); $(target).load(url + ' ' + pageFragment, function (response, status, xhr) { if (status == "error") { if (xhr.status == 401) { if (response) { var data = jQuery.parseJSON(response); var redirect = data.login_url; if (redirect) { window.location = redirect; } else { window.location = "/login"; } } } else { $(target).empty().html('Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.'); } } if (toggle) { $(toggle).modal('show'); } }); return false; }); } } })(); var Opendownloadfile= (function () { return { setup: function () { $('body').on('click', 'a.opendownloadfile', function (event) { event.preventDefault(); var file_id = $(this).attr("data-file_id"); var file_type = $(this).attr('data-file_type'); var file_name = $(this).attr('data-file_name'); var file_size = $(this).attr('data-file_size'); var project_id = $(this).attr('data-project_id'); var link_type = $(this).attr('data-link_type'); var is_external = $(this).attr('data-is-external-link'); var has_torrent = $(this).attr('data-has_torrent'); var external_link = null; var popupHeight = '450'; if(is_external == 'true') { external_link = $(this).attr('data-external_link'); popupHeight = '500'; } $.fancybox({ 'hideOnContentClick': true, 'autoScale': false, 'scrolling' : 'no', 'cyclic': 'true', 'transitionIn': 'elastic', 'transitionOut': 'elastic', 'type': 'iframe', 'width':'600', 'height':popupHeight, 'iframe': {'scrolling': 'no'}, 'fitToView' : false, 'autoSize' : false, 'id': 'opendownloadfilepopup', helpers: { overlay: { locked: false } }, href:'/dl?file_id='+file_id+'&file_type='+file_type+'&file_name='+file_name+'&file_size='+file_size+'&has_torrent='+has_torrent+'&project_id='+project_id+'&link_type='+link_type+'&is_external='+is_external+'&external_link='+external_link }); return false; }); } } })(); var PartialsButton = (function () { return { setup: function () { $('body').on('click', 'Button.partialbutton', function (event) { event.preventDefault(); var url = $(this).attr("data-href"); var target = $(this).attr("data-target"); var toggle = $(this).data('toggle'); var pageFragment = $(this).attr("data-fragment"); var spin = $(''); $(target).append(spin); $(target).load(url + ' ' + pageFragment, function (response, status, xhr) { if (status == "error") { if (xhr.status == 401) { if (response) { var data = jQuery.parseJSON(response); var redirect = data.login_url; if (redirect) { window.location = redirect; } else { window.location = "/login"; } } } else { $(target).empty().html('Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.'); } } if (toggle) { $(toggle).modal('show'); } }); return false; }); } } })(); var PartialsButtonHeartDetail = (function () { return { setup: function () { $('body').on('click', '.partialbuttonfollowproject', function (event) { event.preventDefault(); var url = $(this).attr("data-href"); var target = $(this).attr("data-target"); var auth = $(this).attr("data-auth"); var toggle = $(this).data('toggle'); var pageFragment = $(this).attr("data-fragment"); if (!auth) { $('#like-product-modal').modal('show'); return; } // product owner not allow to heart copy from voting.... var loginuser = $('#like-product-modal').find('#loginuser').val(); var productcreator = $('#like-product-modal').find('#productcreator').val(); if (loginuser == productcreator) { // ignore $('#like-product-modal').find('#votelabel').text('Project owner not allowed'); $('#like-product-modal').find('.modal-body').empty(); $('#like-product-modal').modal('show'); return; } var spin = $(''); $(target).prepend(spin); $.ajax({ url: url, cache: false }) .done(function( response ) { $(target).find('.spinning').remove(); if(response.status =='error'){ $(target).html( response.msg ); }else{ if(response.action=='delete'){ //$(target).find('.likelabel').html(response.cnt +' Likes'); $(target).find('.plingtext').html(response.cnt); $(target).find('.plingtext').addClass('heartnumberpurple'); $(target).find('.plingheart').removeClass('heartproject').addClass('heartgrey'); $(target).find('.plingheart').removeClass('fa-heart').addClass('fa-heart-o'); }else{ //$(target).find('.likelabel').html(response.cnt +' Likes'); $(target).find('.plingtext').html(response.cnt); //$(target).find('.plingtext').html(response.cnt+' Fans'); $(target).find('.plingtext').removeClass('heartnumberpurple'); $(target).find('.plingheart').removeClass('heartgrey').addClass('heartproject'); $(target).find('.plingheart').removeClass('fa-heart-o').addClass('fa-heart'); } } }); return false; }); } } })(); var PartialsButtonPlingProject = (function () { return { setup: function () { $('#plingbtn').hover(function(){ $(this).attr('src','/images/system/pling-btn-hover.png'); }, function(){ $(this).attr('src',$(this).attr('data-src')); }); $('body').on('click', '.partialbuttonplingproject', function (event) { event.preventDefault(); var url = $(this).attr("data-href"); var target = $(this).attr("data-target"); var auth = $(this).attr("data-auth"); var issupporter = $(this).attr("data-issupporter"); var toggle = $(this).data('toggle'); var pageFragment = $(this).attr("data-fragment"); if (!auth) { $('#like-product-modal').modal('show'); return; } // product owner not allow to heart copy from voting.... var loginuser = $('#like-product-modal').find('#loginuser').val(); var productcreator = $('#like-product-modal').find('#productcreator').val(); if (loginuser == productcreator) { // ignore $('#like-product-modal').find('#votelabel').text('Project owner not allowed'); $('#like-product-modal').find('.modal-body').empty(); $('#like-product-modal').modal('show'); return; } if (!issupporter) { // ignore $('#like-product-modal').find('#votelabel').html('
To pling a product and help the artist please consider becoming a supporter. Thanks!

Become a supporter
'); $('#like-product-modal').modal('show'); return; } $(target).find('.plingnum').html(''); $.ajax({ url: url, cache: false }) .done(function( response ) { //$(target).find('.spinning').remove(); if(response.status =='error'){ $(target).html( response.msg ); }else{ if(response.action=='delete'){ //pling deleted if(response.cnt==0) { $(target).find('.plingnum').html('Pling me'); }else { $(target).find('.plingnum').html(response.cnt+ ' Plings'); } $(target).find('#plingbtn').attr('src','/images/system/pling-btn-normal.png'); $(target).find('#plingbtn').attr('data-src','/images/system/pling-btn-normal.png'); }else{ //pling inserted $(target).find('.plingnum').html(response.cnt+ ' Plings'); $(target).find('#plingbtn').attr('src','/images/system/pling-btn-active.png'); $(target).find('#plingbtn').attr('data-src','/images/system/pling-btn-active.png'); } } }); return false; }); } } })(); var PartialsReview = (function () { return { setup: function () { $('body').on('click', 'a.partialreview', function (event) { event.preventDefault(); var url = this.href; var target = $(this).attr("data-target"); var toggle = $(this).data('toggle'); var pageFragment = $(this).attr("data-fragment"); // product owner not allow to vote var loginuser = $('#review-product-modal').find('#loginuser').val(); var productcreator = $('#review-product-modal').find('#productcreator').val(); if (loginuser == productcreator) { // ignore $('#review-product-modal').find('#votelabel').text('Project owner not allowed'); $('#review-product-modal').find('.modal-body').empty(); $('#review-product-modal').modal('show'); return; } var userrate = $('#review-product-modal').find('#userrate').val(); // -1 = no rate yet. 0= dislike 1=like if ($(this).hasClass("voteup")) { if (userrate == 1) { $('#review-product-modal').find('#votelabel').empty() .append(' is given already with comment:'); $('#review-product-modal').find('#commenttext').val($('#review-product-modal').find('#otxt').val()); //$('#review-product-modal').find(':submit').attr("disabled", "disabled").css("display", "none"); //$('#review-product-modal').find('#commenttext').attr("disabled", "disabled"); $('#review-product-modal').find(':submit').text("Remove Rating"); } else { $('#review-product-modal').find('input#voteup').val(1); $('#review-product-modal').find('#votelabel').empty() .append(' Add Comment (min. 1 char):'); $('#review-product-modal').find('#commenttext').val('+'); $('#review-product-modal').find(':submit').text("Rate Now"); $('#review-product-modal').find('#commenttext').removeAttr("disabled"); $('#review-product-modal').find(':submit').css("display", "block").removeAttr("disabled"); } } else { // vote down if (userrate == 0) { $('#review-product-modal').find('#votelabel').empty() .append(' is given already with comment: '); $('#review-product-modal').find('#commenttext').val($('#review-product-modal').find('#otxt').val()); // $('#review-product-modal').find('#commenttext').attr("disabled", "disabled"); // $('#review-product-modal').find(':submit').attr("disabled", "disabled").css("display", "none"); $('#review-product-modal').find(':submit').text("Remove Rating"); } else { $('#review-product-modal').find('input#voteup').val(2); $('#review-product-modal').find('#votelabel').empty() .append(' Add Comment (min. 5 char) Please explain the reason for downvote to help the creator to make it better '); $('#review-product-modal').find('#commenttext').val('-'); $('#review-product-modal').find('#commenttext').removeAttr("disabled"); $('#review-product-modal').find(':submit').removeAttr("disabled").css("display", "block"); $('#review-product-modal').find(':submit').text("Rate Now"); } } $('#review-product-modal').modal('show'); if ($('#review-product-modal').hasClass('noid')) { setTimeout(function () { $('#review-product-modal').modal('hide'); }, 2000); } return false; }); } } })(); var PartialsReviewDownloadHistory = (function () { return { setup: function () { $('body').on('click', 'button.partialReviewDownloadHistory', function (event) { event.preventDefault(); var userrate = $(this).attr("data-userrate"); // -1 = no rate yet. 0= dislike 1=like $('#review-product-modal').find('#commenttext').val($(this).attr("data-comment")); $('#review-product-modal').find('#form_p').val($(this).attr("data-project")); if ($(this).hasClass("voteup")) { if (userrate == 1) { $('#review-product-modal').find('#votelabel').empty() .append(' is given already with comment:'); $('#review-product-modal').find(':submit').attr("disabled", "disabled").css("display", "none"); $('#review-product-modal').find('#commenttext').attr("disabled", "disabled"); } else { $('#review-product-modal').find('input#voteup').val(1); $('#review-product-modal').find('#votelabel').empty() .append(' Add Comment (min. 1 char):'); $('#review-product-modal').find('#commenttext').val('+'); $('#review-product-modal').find('#commenttext').removeAttr("disabled"); $('#review-product-modal').find(':submit').css("display", "block").removeAttr("disabled"); } } else { // vote down if (userrate == 0) { $('#review-product-modal').find('#votelabel').empty() .append(' is given already with comment: '); $('#review-product-modal').find('#commenttext').attr("disabled", "disabled"); $('#review-product-modal').find(':submit').attr("disabled", "disabled").css("display", "none"); } else { $('#review-product-modal').find('input#voteup').val(2); $('#review-product-modal').find('#votelabel').empty() .append(' Add Comment (min. 5 chars): '); $('#review-product-modal').find('#commenttext').val('-'); $('#review-product-modal').find('#commenttext').removeAttr("disabled"); $('#review-product-modal').find(':submit').removeAttr("disabled").css("display", "block"); } } $('#review-product-modal').modal('show'); if ($('#review-product-modal').hasClass('noid')) { setTimeout(function () { $('#review-product-modal').modal('hide'); }, 2000); } return false; }); } } })(); //PartialsReviewDownloadHistoryNew var CreateScoreRatingPopup = (function () { return { setup: function () { var preRatingSelected=0; var currentSelect; $( "select.rating-select" ).focus(function() { currentSelect = $(this); preRatingSelected = $(this).val(); }).change(function() { var optionSelected = $(this).find("option:selected"); var valueSelected = optionSelected.val(); var textSelected = optionSelected.text(); var userscore = $(this).attr("data-userrate"); var oldcomment =$(this).attr("data-comment"); var productcreator = $(this).attr("data-creator"); var loginuser = $('#score-product-modal').find('#loginuser').val(); /*if(userscore>0) { $('#score-product-modal').find('#votelabel').empty() .append('Score '+userscore+' is given already with comment:'+oldcomment); }*/ if(!loginuser) { $('#score-product-modal').modal('show'); return; } if (loginuser == productcreator) { // ignore $('#score-product-modal').find('#votelabel').text('Project owner not allowed'); $('#score-product-modal').find('.modal-body').empty(); $('#score-product-modal').find('#modal-btn-onsubmit').remove(); $('#score-product-modal').modal('show'); return; } if(valueSelected==-1) { $('#score-product-modal').find('#votelabel').empty() .append('Remove Rating '); } else if(valueSelected<=5) { $('#score-product-modal').find('#votelabel').empty() .append('Add a review to your rating "'+textSelected +'" (min. 5 chars) Please explain the reason for downvote to help the creator to make it better '); $('#score-product-modal').find('#voteup').val(2); } else { $('#score-product-modal').find('#votelabel').empty() .append('Add a review to your rating "'+textSelected+'" (min. 1 char):'); $('#score-product-modal').find('#voteup').val(1); } $('#score-product-modal').find('#form_p').val($(this).attr("data-project")); $('#score-product-modal').find(':submit').css("display", "block").removeAttr("disabled"); $('#score-product-modal').find('#commenttext').removeAttr("disabled"); if(valueSelected>=1 && valueSelected<=3) { $('#score-product-modal').find('#commenttext').val(''); }else { $('#score-product-modal').find('#commenttext').val(textSelected); } $('#score-product-modal').find('#userscorevalue').val(valueSelected); if(valueSelected=='-1') { $('#score-product-modal').find(':submit').text("Remove Rating"); }else { $('#score-product-modal').find(':submit').text("Rate Now"); } $('#score-product-modal').modal('show'); }); $("#modal-btn-cancel").on("click", function(){ $(currentSelect).find("option[value="+preRatingSelected+"]").prop('selected', true); $("#score-product-modal").modal('hide'); }); var bOnsubmit = false; $('#modal-btn-onsubmit').on("click",function(){ bOnsubmit = true; }); $('#score-product-modal').on('hidden.bs.modal', function () { if(!bOnsubmit) { $(currentSelect).find("option[value="+preRatingSelected+"]").prop('selected', true); } }); } } })(); var PartialForms = (function () { return { setup: function () { $('body').on("submit", 'form.partial', function (event) { event.preventDefault(); event.stopImmediatePropagation(); $(this).find(':submit').attr("disabled", "disabled"); $(this).find(':submit').css("white-space", "normal"); var spin = $(''); $(this).find(':submit').append(spin); var target = $(this).attr("data-target"); var trigger = $(this).attr("data-trigger"); console.log(this); jQuery.ajax({ data: $(this).serialize(), url: this.action, type: this.method, error: function () { $(target).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.
"); return false; }, success: function (results) { $(target).empty().html(results); $(target).find(trigger).trigger('click'); return false; } }); return false; }); } } })(); var PartialJsonClone = (function () { return { setup: function () { $('body').on("submit", 'form.partialjsonclone', function (event) { event.preventDefault(); event.stopImmediatePropagation(); var target = $(this).attr("data-target"); var trigger = $(this).attr("data-trigger"); var projectid = $(this).attr("data-projectid"); jQuery.ajax({ data: $(this).serialize(), url: this.action, type: this.method, dataType: "json", error: function () { $(target).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.
"); }, success: function (data, textStatus) { $('form#product-report-clone').find('#clonePId').val(''); $('form#product-report-clone').find('#report-text').val('') $('#report-product-clone-'+projectid).modal('hide'); var msgBox = $('#generic-dialog'); msgBox.find('.modal-header-text').empty(); msgBox.find('.modal-body').empty().append(data.message); setTimeout(function () { msgBox.modal('show'); }, 900); } }); return false; }); } } })(); var PartialJson = (function () { return { setup: function () { $('body').on("submit", 'form.partialjson', function (event) { event.preventDefault(); event.stopImmediatePropagation(); var target = $(this).attr("data-target"); var trigger = $(this).attr("data-trigger"); jQuery.ajax({ data: $(this).serialize(), url: this.action, type: this.method, dataType: "json", error: function () { $(target).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.
"); }, success: function (data, textStatus) { if (data.redirect) { // data.redirect contains the string URL to redirect to window.location = data.redirect; return; } if (target) { // data.message contains the HTML for the replacement form $(target).empty().html(data.message); } if (trigger) { $(target).find(trigger).trigger('click'); } } }); return false; }); } } })(); var PartialJsonFraud = (function () { return { setup: function () { $('body').on("submit", 'form.partialjsonfraud', function (event) { event.preventDefault(); event.stopImmediatePropagation(); var target = $(this).attr("data-target"); var trigger = $(this).attr("data-trigger"); var text = $('form.partialjsonfraud').find('#report-text').val(); if(text.length<5) { $('form.partialjsonfraud').find('p.warning').remove(); $('form.partialjsonfraud').find('#report-text').parent().append('

at least 5 chars

'); return false; } jQuery.ajax({ data: $(this).serialize(), url: this.action, type: this.method, dataType: "json", error: function () { $(target).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.
"); }, success: function (data, textStatus) { if (data.redirect) { // data.redirect contains the string URL to redirect to window.location = data.redirect; return; } if (target) { // data.message contains the HTML for the replacement form $(target).empty().html(data.message); } if (trigger) { $(target).find(trigger).trigger('click'); } } }); return false; }); } } })(); var PartialPayPal = (function () { return { setup: function () { this.initPayPalForm(); this.initPayPalFee(); }, initPayPalForm: function () { $('body').on("submit", 'form.partialpaypal', function (event) { event.preventDefault(); event.stopImmediatePropagation(); var target = $(this).attr("data-target"); var trigger = $(this).attr("data-trigger"); jQuery.ajax({ data: $(this).serialize(), url: this.action, type: this.method, error: function (jqXHR, textStatus, errorThrown) { $('#modal-dialog').modal('hide'); var msgBox = $(''); msgBox.html($(jqXHR.responseText).filter('.page-container').children()); msgBox.append(''); setTimeout(function () { msgBox.modal('show'); }, 900); }, success: function (results) { $(target).empty().html(results); $(target).find(trigger).trigger('click'); $('#modal-dialog').modal('hide'); } }); return false; }); }, initPayPalFee: function () { $('body').on("change", '#amount_plings', function (event) { PartialPayPal.changeFee(); }); }, changeFee: function () { var e = document.getElementById('amount_plings'); var value = parseFloat(e.value); var pling_fee = this.round((value) * 0.05, 2); var pling_sum = (pling_fee) + (value); var paypal_fee = (pling_sum + 0.3) * 0.03 + 0.3; paypal_fee = this.round(paypal_fee, 2); var sum = value + pling_fee + paypal_fee; document.getElementById('pling_fee').value = this.round(pling_fee, 2).toFixed(2); document.getElementById('paypal_fee').value = this.round(paypal_fee, 2).toFixed(2); document.getElementById('sum').value = this.round(sum, 2); }, round: function (x, n) { var a = Math.pow(10, n); return (Math.round(x * a) / a); } } })(); var PartialCommentReviewForm = (function () { return { setup: function () { this.initForm(); }, initForm: function () { $('body').on("submit", 'form.product-add-comment-review', function (event) { event.preventDefault(); event.stopImmediatePropagation(); var c = $.trim($('#commenttext').val()); var v = $('#voteup').val(); if(v==2) { // votedown if(c.length<5) { if($('#review-product-modal').find('#votelabel').find('.warning').length==0) { $('#review-product-modal').find('#votelabel').append("
Please give a comment, thanks!"); } return; } } if(c.length<1) { if($('#review-product-modal').find('#votelabel').find('.warning').length==0) { $('#review-product-modal').find('#votelabel').append("
Please give a comment, thanks!"); } return; } $(this).find(':submit').attr("disabled", "disabled"); $(this).find(':submit').css("white-space", "normal"); var spin = $(''); $(this).find(':submit').append(spin); jQuery.ajax({ data: $(this).serialize(), url: this.action, type: this.method, error: function (jqXHR, textStatus, errorThrown) { $('#review-product-modal').modal('hide'); var msgBox = $('#generic-dialog'); msgBox.modal('hide'); msgBox.find('.modal-header-text').empty().append('Please try later.'); msgBox.find('.modal-body').empty().append("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.
"); setTimeout(function () { msgBox.modal('show'); }, 900); }, success: function (results) { $('#review-product-modal').modal('hide'); location.reload(); } }); return false; }); } } })(); var PartialCommentReviewFormNew = (function () { return { setup: function () { this.initForm(); }, initForm: function () { $('body').on("submit", 'form.product-add-comment-review-new', function (event) { event.preventDefault(); event.stopImmediatePropagation(); var c = $.trim($('#score-product-modal').find('#commenttext').val()); var v = $('#score-product-modal').find('#voteup').val(); if(v==2) { // votedown if(c.length<5) { if($('#score-product-modal').find('#votelabel').find('.warning').length==0) { $('#score-product-modal').find('#votelabel').append("
Please give a comment, thanks!"); } return; } } if(c.length<1) { if($('#score-product-modal').find('#votelabel').find('.warning').length==0) { $('#score-product-modal').find('#votelabel').append("
Please give a comment, thanks!"); } return; } $(this).find(':submit').attr("disabled", "disabled"); $(this).find(':submit').css("white-space", "normal"); var spin = $(''); $(this).find(':submit').append(spin); jQuery.ajax({ data: $(this).serialize(), url: this.action, type: this.method, error: function (jqXHR, textStatus, errorThrown) { $('#score-product-modal').modal('hide'); var msgBox = $('#generic-dialog'); msgBox.modal('hide'); msgBox.find('.modal-header-text').empty().append('Please try later.'); msgBox.find('.modal-body').empty().append("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.
"); setTimeout(function () { msgBox.modal('show'); }, 900); }, success: function (results) { $('#score-product-modal').modal('hide'); location.reload(); } }); return false; }); } } })(); var PartialFormsAjax = (function () { return { setup: function () { var form = $('form.partialajax'); var target = form.attr("data-target"); var trigger = form.attr("data-trigger"); $(form).find(':submit').on('click', function (e) { e.preventDefault(); $(form).find(':submit').attr("disabled", "disabled"); $(form).find(':submit').css("white-space", "normal"); var spin = $(''); $(form).find(':submit').append(spin); $(form).submit(); }); form.ajaxForm({ error: function () { $(target).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.
"); }, success: function (results) { $(target).empty().html(results); $(target).find(trigger).trigger('click'); } }); } } })(); var AjaxFormWithProgress = (function () { return { setup: function (idForm) { var form = $(idForm); var target = form.attr("data-target"); var trigger = form.attr("data-trigger"); var bar = form.find('.progress-bar'); var percent = form.find('.progress-percent'); $(form).find(':submit').on('click', function (e) { e.preventDefault(); $(form).find(':submit').attr("disabled", "disabled"); $(form).find(':submit').css("white-space", "normal"); var spin = $(''); $(form).find(':submit').append(spin); $(form).submit(); }); form.ajaxForm({ beforeSend: function() { var percentVal = '0%'; bar.parent().removeClass('hidden'); bar.width(percentVal); percent.html(percentVal); }, uploadProgress: function(event, position, total, percentComplete) { var percentVal = percentComplete + '%'; bar.width(percentVal); percent.html(percentVal); }, error: function () { $(target).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.
"); }, success: function (results) { var percentVal = '100%'; bar.width(percentVal); percent.html(percentVal); $(target).empty().html(results); $(target).find(trigger).trigger('click'); } }); } } })(); var PartialFormsAjaxMemberBg = (function () { return { setup: function () { var form = $('form.partialajaxbg'); var target = form.attr("data-target"); var trigger = form.attr("data-trigger"); $(form).find(':submit').on('click', function (e) { e.preventDefault(); $(form).find(':submit').attr("disabled", "disabled"); $(form).find(':submit').css("white-space", "normal"); var spin = $(''); $(form).find(':submit').append(spin); $(form).submit(); }); form.ajaxForm({ error: function () { $(target).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.
"); }, success: function (results) { $(target).empty().html(results); $(target).find(trigger).trigger('click'); } }); } } })(); var AjaxForm = (function () { return { setup: function (elForm, idTargetElement) { var target = $(idTargetElement); $('body').on("submit", elForm, function (event) { event.preventDefault(); event.stopImmediatePropagation(); $(this).find('button').attr("disabled", "disabled"); $(this).find('.glyphicon.glyphicon-send').removeClass('glyphicon-send').addClass('glyphicon-refresh spinning'); jQuery.ajax({ data: $(this).serialize(), url: this.action, type: this.method, dataType: "json", error: function (jqXHR, textStatus, errorThrown) { var results = JSON && JSON.parse(jqXHR.responseText) || $.parseJSON(jqXHR.responseText); var msgBox = $('#generic-dialog'); msgBox.modal('hide'); msgBox.find('.modal-header-text').empty().append(results.title); msgBox.find('.modal-body').empty().append(results.message); setTimeout(function () { msgBox.modal('show'); }, 900); }, success: function (results) { if (results.status == 'ok') { $(target).empty().html(results.data); } if (results.status == 'error') { if (results.message != '') { alert(results.message); } else { alert('Service is temporarily unavailable.'); } } } }); return false; }); } } })(); var WidgetModalAjax = (function () { return { setup: function () { $('.my-product-item').find('a.widget-button').on('click', function () { var this_rel = $(this).attr('rel'); var this_product_id = this_rel.split('product')[1]; var target = $('.modal-body#widget-code-' + this_rel); $.ajax({ url: '/widget/config/' + this_product_id, type: 'html', success: function (results) { target.prepend(results); angular.bootstrap(target, ['widgetApp']); } }); }); } } })(); var LoginContainer = (function () { return { update: function () { if (!Date.now) { Date.now = function () { return new Date().getTime(); } } var timestamp = Date.now() / 1000 | 0; var target = '#login_container'; var url = '/authorization/htmllogin?' + timestamp; $(target).load(url, function (response, status, xhr) { // nothing to do }); } } })(); var RssNews = (function () { return { setup: function () { if($("#rss-feeds").length==0) { return false; } var json_url = "/json/news"; $.getJSON(json_url, function (res) { var crss = ''; $.each(res.posts, function (i, item) { if (i >= 3) { return false; } var m = moment(item.date); crss += '
' + item.title + '
' + '' + m.format('MMM DD YYYY') + ''+ item.comments.length +' Comment'+(item.comments.length>1?'s':'') +'
'; }); $("#rss-feeds").html(crss); }); } } })(); -var Mastodon = (function () { - return { - setup: function () { - if($("#mastodon-toots").length==0) - { - return false; - } - var json_url = "/json/socialtimeline"; - $.getJSON(json_url, function (res) { - var crss = ''; - $.each(res, function (i, item) { - - crss += '
' + item.account.username + '' - + '' + item.content.replace(/(<([^>]+)>)/ig,"") + '' - + '' + item.created_at + '' - +'
'; - }); - $("#mastodon-toots").html(crss); - - }); - } - - } -})(); var BlogJson = (function () { return { setup: function () { var urlforum = 'https://forum.opendesktop.org/'; var json_url = '/json/forum'; $.ajax(json_url).then(function (result) { var topics = result.topic_list.topics; var crss = ''; var count =3; topics.sort(function(a,b){ return new Date(b.last_posted_at) - new Date(a.last_posted_at); }); $.each(topics, function (i, item) { if(!item.pinned){ var m = item.timeago; var r = 'Reply'; var t = item.posts_count -1; if(t==0){ r = 'Replies'; }else if(t==1){ r = 'Reply'; }else{ r = 'Replies'; } crss += '
' + item.title + '
' + '' + m + ''+ t +' '+ r +'
'; count--; } if(count==0) return false; }); $("#blogJson").html(crss); }); } } })(); var GitlabNewProjectsJson = (function () { return { setup: function (url_git) { var json_url = '/json/gitlabnewprojects'; $.ajax(json_url).then(function (result) { var topics = result; var crss = ''; $.each(topics, function (i, item) { var m = item.timeago; crss += ''; }); $("#lastgitprojects").html(crss); }); } } })(); function showGitUserAvatar(url_git,username, projectid) { var json_url = url_git+'/api/v4/users?username=' + username; $.ajax(json_url).then(function (result) { var usr_list = result; $.each(usr_list, function (i,usr) { $img = $('#avatar_' + username + '_' + projectid); //alert(usr); //alert($img.attr('src')); $img.attr('src',usr.avatar_url); //alert($img.attr('src')); }); }); } var ProductDetailCarousel = (function () { return { setup: function () { $('.carousel-inner img').each(function (index) { $(this).on("click", function () { if ($("#product-main-img-container").hasClass("imgfull")) { $('#product-main-img-container').prependTo($('#product-main')); } else { $('#product-main-img-container').prependTo($('#product-page-content')); } $("#product-main-img-container").toggleClass("imgfull"); $("#product-main-img-container").toggleClass("imgsmall"); }); }); } } })(); var AppimagequestionOnClick = (function () { return { setup: function (projectid) { $('body').on('click', 'i.appimagequestion', function (event) { var msgBox = $('#generic-dialog'); msgBox.modal('show'); msgBox.find('.modal-header-text').empty().append('AppImage Info'); msgBox.find('.modal-body').empty().append(""); }); } } })(); var ProductDetailBtnGetItClick = (function () { return { setup: function (projectid) { $('body').on('click', 'button#project_btn_download', function (event) { $.fancybox({ 'hideOnContentClick': true, 'autoScale': true, 'cyclic': 'true', 'transitionIn': 'elastic', 'transitionOut': 'elastic', 'type': 'ajax', helpers: { overlay: { locked: false } }, autoSize: true, href:'/p/'+projectid+'/ppload' }); }); } } })(); var GhnsExcludedClick = (function () { return { setup: function (projectid) { $('body').on('click', '#ghns_excluded-this-checkbox', function (event) { event.stopPropagation(); var status = 1; var title = ''; var btntxt = ''; if (this.checked) { status = 1; title = 'Please specify why this product should be excluded (min 5 chars) :'; btntxt=' ghns exclude'; } else { status = 0; title = 'Please specify why this product should be included (min 5 chars) :'; btntxt=' ghns include'; } var msgBox = $('#generic-dialog'); msgBox.modal('show'); msgBox.find('.modal-header-text').empty().append('GHNS '); msgBox.find('.modal-body').empty().append(title+ '

'); $('body').on("click", "#btn-ghns-excluded", function(){ var txt = $('#ghns-excluded-text').val(); if(txt.length<5) { alert('min 5 chars'); return false; } var project_id = $(this).attr('data-projectid'); var status = $(this).attr('data-status'); var target = "/backend/project/doghnsexclude"; $.ajax({ url: target, method:'POST', data:{'project_id':project_id,'ghns_excluded':status,'msg':txt}, success: function (results) { var msgBox = $('#generic-dialog'); if (status == 0) { msgBox.find('.modal-body').empty().append('Project is successfully included into GHNS'); $('#ghns_excluded-this-checkbox').prop("checked", false); } else { msgBox.find('.modal-body').empty().append('Project is successfully excluded into GHNS'); $('#ghns_excluded-this-checkbox').prop("checked", true); } setTimeout(function () { msgBox.modal('hide'); }, 1000); }, error: function () { alert('Service is temporarily unavailable.'); } }); }); return false; }); } } })(); var AboutMeMyProjectsPaging = (function () { return { setup: function () { $(window).scroll(function() { var end = $("footer").offset().top; var viewEnd = $(window).scrollTop() + $(window).height(); var distance = end - viewEnd; if (distance < 300){ // } // if($(window).scrollTop() == $(document).height() - $(window).height()) { if(!$('button#btnshowmoreproducts').length) return; let indicator = ''; let nextpage = $('button#btnshowmoreproducts').attr('data-page'); $('button#btnshowmoreproducts').remove(); $url = window.location.href; target = $('.about-me-details').find('li.active').find('a').attr('href'); if(target=='#user-original-products'){ $url = $url+'showoriginal' } //target = '#my-products-list'; let container = $('

').append(indicator).load($url,{projectpage:nextpage},function (response, status, xhr) { if (status == "error") { if (xhr.status == 401) { if (response) { var data = jQuery.parseJSON(response); var redirect = data.login_url; if (redirect) { window.location = redirect; } else { window.location = "/login"; } } } else { $(target).empty().html('Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.'); } } }); $(target).append(container); } }); } } })(); var AboutMeMyProjectsPagingButton = (function () { return { setup: function () { let indicator = ''; $('body').on('click', 'button#btnshowmoreproducts', function (event) { let nextpage = $(this).attr('data-page'); $(this).remove(); $url = window.location.href; //target = '#my-products-list'; target = $('.about-me-details').find('li.active').find('a').attr('href'); if(target=='#user-original-products'){ $url = $url+'showoriginal' } let container = $('
').append(indicator).load($url,{projectpage:nextpage},function (response, status, xhr) { if (status == "error") { if (xhr.status == 401) { if (response) { var data = jQuery.parseJSON(response); var redirect = data.login_url; if (redirect) { window.location = redirect; } else { window.location = "/login"; } } } else { $(target).empty().html('Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.'); } } }); $(target).append(container); }); } } })(); var ProductDetailCommentTooltip = (function () { return { setup: function () { TooltipUser.setup('tooltipuser','right'); } } })(); function generateTooltipster(elements,tooltipSide) { $(elements).each(function() { $(this).tooltipster( { side: tooltipSide, theme: ['tooltipster-light', 'tooltipster-light-customized'], contentCloning: true, contentAsHTML: true, interactive: true, functionBefore: function (instance, helper) { var origin = $(helper.origin); var userid = origin.attr('data-user'); if (origin.data('loaded') !== true) { $.get('/member/' + userid + '/tooltip/', function (data) { var d = data.data; var tmp = '
' + d.username + ' ' + d.countrycity + '
' + '
' + '
' + d.cntProjects + ' products
' + '
' + d.totalComments + ' comments
' + '
Likes ' + d.cntLikesGave + ' products
' + '
Got ' + d.cntLikesGot + ' Likes
' + '
Last time active : ' + d.lastactive_at + '
' + '
Member since : ' + d.created_at + '
' + '
'; tmp = tmp + '
'; instance.content(tmp); origin.data('loaded', true); }); } } } ); }); } var TooltipUser = (function () { return { setup: function (tooltipCls, tooltipSide) { $('.'+tooltipCls).tooltipster( { side: tooltipSide, theme: ['tooltipster-light', 'tooltipster-light-customized'], contentCloning: true, contentAsHTML: true, interactive: true, functionBefore: function (instance, helper) { var origin = $(helper.origin); var userid = origin.attr('data-user'); if (origin.data('loaded') !== true) { $.get('/member/' + userid + '/tooltip/', function (data) { var d = data.data; var tmp = '
' + d.username + ' ' + d.countrycity + '
' + '
' + '
' + d.cntProjects + ' products
' + '
' + d.totalComments + ' comments
' + '
Likes ' + d.cntLikesGave + ' products
' + '
Got ' + d.cntLikesGot + ' Likes
' + '
Last time active : ' + d.lastactive_at + '
' + '
Member since : ' + d.created_at + '
' + '
'; tmp = tmp + '
'; instance.content(tmp); origin.data('loaded', true); }); } } } ); } } })(); function generateTooltipUserPlings(elements,tooltipSide) { $(elements).each(function() { $(this).tooltipster( { side: tooltipSide, theme: ['tooltipster-light', 'tooltipster-light-customized'], contentCloning: true, contentAsHTML: true, interactive: true, functionBefore: function (instance, helper) { var origin = $(helper.origin); var userid = origin.attr('data-user'); if (origin.data('loaded') !== true) { $.get('/plings/tooltip/id/'+userid, function (data) { var tmp = '
'; $.each(data.data, function( index, value ) { if(index>10) return false; if(value.profile_image_url.indexOf('http')<0) { value.profile_image_url = "https://cn.opendesktop.org/cache/40x40-2/img/"+value.profile_image_url ; } if(value.profile_image_url.indexOf('.gif')>0) { value.profile_image_url = "https://cn.opendesktop.org/img/"+value.profile_image_url ; } tmp = tmp+'
'+value.username+'
'; }); tmp = tmp + '
'; instance.content(tmp); origin.data('loaded', true); }); } } } ); }); } var TooltipUserPlings = (function () { return { setup: function (tooltipCls, tooltipSide) { $('.'+tooltipCls).tooltipster( { side: tooltipSide, theme: ['tooltipster-light', 'tooltipster-light-customized'], contentCloning: true, contentAsHTML: true, interactive: true, functionBefore: function (instance, helper) { var origin = $(helper.origin); var userid = origin.attr('data-user'); if (origin.data('loaded') !== true) { $.get('/plings/tooltip/id/'+userid, function (data) { var tmp = '
'; $.each(data.data, function( index, value ) { if(index>10) return false; if(value.profile_image_url.indexOf('http')<0) { value.profile_image_url = "https://cn.opendesktop.org/cache/40x40-2/img/"+value.profile_image_url ; } if(value.profile_image_url.indexOf('.gif')>0) { value.profile_image_url = "https://cn.opendesktop.org/img/"+value.profile_image_url ; } tmp = tmp+'
'+value.username+'
'; }); tmp = tmp + '
'; instance.content(tmp); origin.data('loaded', true); }); } } } ); } } })(); var AboutMePage = (function () { return { setup: function (username) { var t = $(document).prop('title'); var tnew = username + "'s Profile " + t; $(document).prop('title', tnew); } } })(); var InitActiveHashTab = (function () { return { setup: function () { var activeTab = document.location.hash; if($('a[href="'+ activeTab +'"]')) { $('a[href="'+ activeTab +'"]').tab('show'); } } } })(); var AboutmeTab= (function () { return { setup: function () { var indicator = ''; $('body').on('click', 'a.aboutmetab', function (event) { event.preventDefault(); var el = $(this).attr('href'); var url = $(this).attr('data-href'); if($(el).find('.product').length==0) { // only load once $(el).append(indicator).load(url,function (){ }); } }); } } })(); var CommunityTabToplistMemberScrollPaging= (function () { return { setup: function (paramEl,paramUrl) { $(window).scroll(function() { var end = $("footer").offset().top; var viewEnd = $(window).scrollTop() + $(window).height(); var distance = end - viewEnd; if (distance < 300){ if(!$('button#toplistmemberscrollshowmore').length) return; var indicator = ''; var nextpage = $('button#toplistmemberscrollshowmore').attr('data-page'); $('button#toplistmemberscrollshowmore').remove(); var pagingurl = paramUrl+"/nopage/1/page/"+nextpage; var $newdiv = $('
'); $(paramEl).find('.product-list').append($newdiv); $($newdiv).load(pagingurl,function (){ generateTooltipster($($newdiv).find('.tooltipuser'),"right"); }) } }); } } })(); var CommunityTab= (function () { return { setup: function () { var indicator = ''; $('body').on('click', 'a.communitytab', function (event) { event.preventDefault(); var el = $(this).attr('href'); var url = $(this).attr('data-href'); if($(el).find('.list').find('.user').length==0) { // only load once $(el).find('.list').append(indicator).load(url,function (){ generateTooltipster($(el).find('.tooltipuser'),"right"); if($(el).find('.tooltipuserplings').length>0) { generateTooltipUserPlings($(el).find('.tooltipuserplings'),"right"); } if(el=='#toplistMemberPanel') { CommunityTabToplistMemberScrollPaging.setup(el,url); } // paging let spans = $(el).find('.opendesktopwidgetpager span'); spans.each(function(index) { $(this).on("click", function(){ $(this).parent().addClass('active').siblings().removeClass('active'); var pagingurl = url+"/nopage/1/page/"+$(this).html(); $(el).find('.product-list').html(''); $(el).find('.product-list').load(pagingurl,function (){ generateTooltipster($(el).find('.tooltipuser'),"right"); if($(el).find('.tooltipuserplings').length>0) { generateTooltipUserPlings($(el).find('.tooltipuserplings'),"right"); }}) }); }); //end paging }); } }); var activeTab = document.location.hash; if($('a[href="'+ activeTab +'"]').length>0) { $('a[href="'+ activeTab +'"]').tab('show'); $('a[href="'+ activeTab +'"]').trigger( "click" ); }else { activeTab = "#supportersPanel"; $('a[href="'+ activeTab +'"]').trigger( "click" ); } $('body').on('mouseenter', '.product-thumbnail-startpage', function () { $(this).popover('show'); }); $('body').on('mouseleave', '.product-thumbnail-startpage', function () { $(this).popover('hide'); }); } } })(); var TagingProduct = (function () { return { setup: function () { $('input[name=tagsuser]') .tagify({ whitelist: ['good', 'great'], autocomplete:true }) .on('remove', function(e, tagName){ console.log('removed', tagName) }) .on('add', function(e, tagName){ console.log('added', tagName) }); } } })(); var TagingProductSelect2 = (function () { return { setup: function () { $.fn.select2.amd.require(['select2/selection/search'], function (Search) { Search.prototype.searchRemoveChoice = function (decorated, item) { this.trigger('unselect', { data: item }); this.$search.val(''); this.handleSearch(); }; }, null, true); var t = $(".taggingSelect2").select2({ placeholder: "Add Tags here ...", //placeholder tags: true, tokenSeparators: [",", " "], minimumInputLength: 3, maximumSelectionLength: 5, width: 'resolve', ajax: { url: '/tag/filter', dataType: 'json', type: "GET", delay: 500, // wait 250 milliseconds before triggering the request processResults: function (data) { return { results : data.data.tags }; } } }); // Bind an event t.on('select2:select', function (e) { var data = e.params.data; var projectid = $("#tagsuserselect").attr('data-pid'); var lis = t.parent().find('ul.select2-selection__rendered').find('li.select2-selection__choice').length; if(lis>5){ t.find("option[value='"+data.id+"']").remove(); return; } var regexp=new RegExp("^[0-9A-Za-z_.-]+$"); if(!(regexp.test(data.text))){ t.find("option[value='"+data.id+"']").remove(); alert('Must be letter or number and can include hyphens'); } if(data.text.length>10){ t.find("option[value='"+data.id+"']").remove(); alert('Max. length 45 chars'); } }); } } })(); var TagingProductDetail = (function () { return { setup: function () { TagingProductDetailSelect2.setup(); $('body').on('click', 'button.topic-tags-btn', function (event) { $(this).toggleClass('Done'); $('.product_category').find('.usertagslabel').remove(); $('.tagsuserselectpanel').toggle(); if($(this).text() == 'Done'){ $(this).text('Manage tags'); var newhtml = ''; var lis = $('li.select2-selection__choice'); $.each(lis, function( index, value ) { newhtml=newhtml+''+value.title+''; }); $('.product_category').find('.topicslink').html(newhtml); }else{ $(this).text('Done'); } }); } } })(); var TagingProductDetailSelect2 = (function () { return { setup: function () { $.fn.select2.amd.require(['select2/selection/search'], function (Search) { Search.prototype.searchRemoveChoice = function (decorated, item) { this.trigger('unselect', { data: item }); this.$search.val(''); this.handleSearch(); }; }, null, true); var t = $("#tagsuserselect").select2({ placeholder: "Input tags please...", //placeholder tags: true, minimumInputLength: 3, closeOnSelect:true, maximumSelectionLength: 5, tokenSeparators: [",", " "], ajax: { url: '/tag/filter', dataType: 'json', type: "GET", delay: 500, // wait 250 milliseconds before triggering the request processResults: function (data) { return { results : data.data.tags }; } } }); // Bind an event t.on('select2:select', function (e) { var data = e.params.data; var projectid = $("#tagsuserselect").attr('data-pid'); $.post( "/tag/add", { p: projectid, t: data.id }) .done(function( data ) { if(data.status=='error'){ $('span.topic-tags-saved').css({ color: "red" }).html(data.message).show().delay(2000).fadeOut(); t.find("option[value='"+data.data.tag+"']").last().remove(); //t.find("option[value="+data.data.tag+"]").last().remove(); } else { $('span.topic-tags-saved').css({ color: "green" }).html(' Saved').show().delay(1000).fadeOut(); } }); }); // Unbind the event t.on('select2:unselect', function(e){ var data = e.params.data; var projectid = $("#tagsuserselect").attr('data-pid'); $.post( "/tag/del", { p: projectid, t: data.id }) .done(function( data ) { console.log(data); $('span.topic-tags-saved').css({ color: "green" }).html(''+data.message).show().delay(1000).fadeOut(); //$('span.topic-tags-saved').show().delay(1000).fadeOut(); }); }); } } })(); var TagingLoopMyProducts = (function () { return { setup: function () { TagingLoopMyProductsSelect2.setup(); $('body').on('click', 'button.topic-tags-btn', function (event) { $(this).toggleClass('Done'); $(this).parent().find('.topicsuser').html(''); $(this).parent().find('.tagsuserselectpanel').toggle(); if($(this).text() == 'Done'){ $(this).text('Manage tags'); var newhtml = ''; var lis = $(this).parent().find('li.select2-selection__choice'); $.each(lis, function( index, value ) { newhtml=newhtml+''+value.title+''; }); $(this).parent().find('.topicsuser').html(newhtml); }else{ $(this).text('Done'); } }); } } })(); var TagingLoopMyProductsSelect2 = (function () { return { setup: function () { $.fn.select2.amd.require(['select2/selection/search'], function (Search) { Search.prototype.searchRemoveChoice = function (decorated, item) { this.trigger('unselect', { data: item }); this.$search.val(''); this.handleSearch(); }; }, null, true); //var t = $("#tagsuserselect").select2({ var t = $(".taggingSelect2").select2({ placeholder: "Input tags please...", //placeholder tags: true, minimumInputLength: 3, closeOnSelect:true, maximumSelectionLength: 5, tokenSeparators: [",", " "], ajax: { url: '/tag/filter', dataType: 'json', type: "GET", delay: 500, // wait 250 milliseconds before triggering the request processResults: function (data) { return { results : data.data.tags }; } } }); // Bind an event t.on('select2:select', function (e) { var data = e.params.data; var projectid = $(this).attr('id').replace('tagsuserselect',''); //var projectid = $("#tagsuserselect").attr('data-pid'); $.post( "/tag/add", { p: projectid, t: data.id }) .done(function( data ) { if(data.status=='error'){ $('#topic-tags-saved'+projectid).css({ color: "red" }).html(data.message).show().delay(2000).fadeOut(); t.find("option[value='"+data.data.tag+"']").last().remove(); }else if(data.status=='existing'){ $('#topic-tags-saved'+projectid).css({ color: "red" }).html(data.message).show().delay(2000).fadeOut(); } else { $('#topic-tags-saved'+projectid).css({ color: "green" }).html(' Saved').show().delay(1000).fadeOut(); } }); }); // Unbind the event t.on('select2:unselect', function(e){ var data = e.params.data; //var projectid = $("#tagsuserselect").attr('data-pid'); var projectid = $(this).attr('id').replace('tagsuserselect',''); $.post( "/tag/del", { p: projectid, t: data.id }) .done(function( data ) { $('#topic-tags-saved'+projectid).css({ color: "green" }).html(''+data.message).show().delay(1000).fadeOut(); }); }); } } })(); var productRatingToggle = (function () { return { setup: function () { $('#showRatingAll').on('click', function () { $('#ratings-panel').find('.spinning').show(); setTimeout(function () { $('#ratings-panel').find('.spinning').hide(); }, 500); $('.btnRateFilter').removeClass('activeRating'); $(this).addClass('activeRating'); $('.productRating-rows').show(); $('.productRating-rows-inactive').show(); }); $('#showRatingActive').on('click', function () { $('#ratings-panel').find('.spinning').show(); setTimeout(function () { $('#ratings-panel').find('.spinning').hide(); }, 500); $('.btnRateFilter').removeClass('activeRating'); $(this).addClass('activeRating'); $('.productRating-rows').show(); $('.productRating-rows-inactive').hide(); }); $('#showRatingUpvotes').on('click', function () { $('#ratings-panel').find('.spinning').show(); setTimeout(function () { $('#ratings-panel').find('.spinning').hide(); }, 500); $('.btnRateFilter').removeClass('activeRating'); $(this).addClass('activeRating'); $('.productRating-rows').show(); $('.clsDownvotes').hide(); $('.productRating-rows-inactive').hide(); }); $('#showRatingDownvotes').on('click', function () { $('#ratings-panel').find('.spinning').show(); setTimeout(function () { $('#ratings-panel').find('.spinning').hide(); }, 500); $('.btnRateFilter').removeClass('activeRating'); $(this).addClass('activeRating'); $('.productRating-rows').show(); $('.productRating-rows-inactive').hide(); $('.clsUpvotes').hide(); }); } } })(); var FilterBrowseOriginalFn= (function () { return { setup: function () { $('body').on('click', 'input#filter_browse_original', function (event) { var checked = $(this).is( ":checked" ); var url = window.location.href; if(url.indexOf("browse")<0) { url = url+'/browse/'; } if(url.indexOf("filteroriginal")>0) { url = url.substring(0,url.indexOf("filteroriginal")); } if(checked){ window.location.href = url+'filteroriginal/1'; }else{ window.location.href = url+'filteroriginal/0'; } }); } } })(); var FilterBrowseTagGroupFn= (function () { return { setup: function () { $('body').on('change', 'select.filter_browse_tag_group', function (event) { var filterVal = $(this).val(); var groupId = $(this).attr('data_group_id'); $.ajax({ url: '/explore/savetaggroupfilter?group_id='+groupId+'&tag_id='+filterVal, cache: false }) .done(function( response ) { var url = window.location.href; window.location.href = url; }); }); } } })(); + +var PagedetailModeratorDeprecated= (function () { + return { + setup: function (project_id) { + if($('#product-deprecated-checkbox').length==0) return false; + $('body').on('click', '#product-deprecated-checkbox', function (event) { + event.stopPropagation(); + var checked = $(this).is( ":checked" ); + var status = 0; + if (checked) { + status = 1; + } else { + status = 0; + } + var target = "/backend/project/dodeprecated?project_id="+project_id+"&product_deprecated=" + status; + $.ajax({ + url: target, + success: function (results) { + if (status == 0) { + alert('Project deprecated is successfully removed'); + $('#product-deprecated-checkbox').prop("checked", false); + + } else { + alert('Project is successfully marked as deprecated'); + $('#product-deprecated-checkbox').prop("checked", true); + + } + }, + error: function () { + alert('Service is temporarily unavailable.'); + } + }); + + }); + } + } +})(); \ No newline at end of file diff --git a/httpdocs/theme/flatui/js/script.min.js b/httpdocs/theme/flatui/js/script.min.js index d476cfd0b..490f8b4f3 100644 --- a/httpdocs/theme/flatui/js/script.min.js +++ b/httpdocs/theme/flatui/js/script.min.js @@ -1 +1 @@ -var prefix="ocs_",OcsStorage={set:function(t,e){localStorage[t]=JSON.stringify(e)},get:function(t){return localStorage[t]?JSON.parse(localStorage[t]):null}},OcsStats={props:{},a:0,readIp:function(t,e){$.getJSON(t,function(t){OcsStats.props.ipv4=t.ip,OcsStats.saveProps(1)}).fail(function(){OcsStats.saveProps(1)}),$.getJSON(e,function(t){OcsStats.props.ipv6=t.ip,OcsStats.saveProps(2)}).fail(function(){OcsStats.saveProps(2)})},genId:function(){Fingerprint2.get({},function(t){var e=t.map(function(t){return t.value});OcsStats.props.fp=Fingerprint2.x64hash128(e.join(""),31),OcsStats.saveProps(4)})},saveProps:function(t){OcsStorage.set("ocs",OcsStats.props),OcsStats.a+=t,7==OcsStats.a&&OcsStats.postProps()},postProps:function(){$.post("/l/fp",OcsStats.props)},readStats:function(t,e){window.requestIdleCallback?requestIdleCallback(function(){OcsStats.genId(),OcsStats.readIp(t,e)}):setTimeout(function(){OcsStats.genId(),OcsStats.readIp(t,e)},500)}},newProductPage={setup:function(){function t(){var t=$("#donations-panel").find("#comments").height();t>$("#donations-panel").find("#supporters").height()&&$("#donations-panel").find("#supporters").height(t)}$(document).ready(function(){var e;e=$("#pling-it-box").height(),$(".scrollable-content").height(e),$(".scrollable-content").jScrollPane({mouseWheelSpeed:30}),t(),$('a[data-toggle="tab"]').on("shown.bs.tab",function(e){t()})})}},ImagePreview={hasError:!1,setup:function(){this.initProductPicture(),this.initTitlePicture(),this.initProfilePicture(),this.initProfilePictureBackground()},previewImage:function(t,e){if(t.files&&t.files[0]){var a=new FileReader,i=new Image,n=t.files[0];a.readAsDataURL(t.files[0]),a.onload=function(a){var o=$("#"+e);i.src=a.target.result,i.onload=function(){var e=this.width,i=this.height,r=n.type,s=(n.name,~~(n.size/1024));ImagePreview.hasError=!1,o.parent().parent().find("div.bg-danger").remove(),(e>2e3||e<20||i>2e3||i<20)&&(o.parent().parent().append('
Wrong image dimensions
'),$($(t).closest("form")[0]).trigger("reset"),ImagePreview.hasError=!0),s>2e3&&(o.parent().parent().append('
File too large
'),$($(t).closest("form")[0]).trigger("reset"),ImagePreview.hasError=!0);/(jpg|jpeg|png|gif)$/i.exec(r)||(o.parent().parent().append('
Invalid file type: '+n.type+"
"),$($(t).closest("form")[0]).trigger("reset"),ImagePreview.hasError=!0),0==ImagePreview.hasError&&(ImagePreview.hasError=!1,o.attr("src",a.target.result),o.show())},i.onerror=function(){o.parent().parent().find("div.bg-danger").remove(),o.parent().parent().append('
Invalid file type: '+n.type+"
")},"product-picture-preview"==e?$("button#add-product-picture").text("CHANGE LOGO"):"title-picture-preview"==e?$("button#add-title-picture").text("CHANGE BANNER"):"profile-picture-preview"==e?($("button#add-profile-picture").text("CHANGE PICTURE"),$("input#profile_img_src").val("local")):"profile-picture-bg-preview"==e&&$("button#add-profile-picture-background").text("CHANGE PICTURE")}}},previewImageMember:function(t,e){if(t.files&&t.files[0]){var a=new FileReader,i=new Image;t.files[0];a.readAsDataURL(t.files[0]),a.onload=function(t){var a=$("#"+e);i.src=t.target.result,i.onload=function(){ImagePreview.hasError=!1,a.parent().find(".image-error").remove(),0==ImagePreview.hasError&&(a.attr("src",t.target.result),a.show())},i.onerror=function(){a.parent().append('
Invalid file type
')},"profile-picture-background-preview"==e&&$("button#add-profile-picture-background").text("CHANGE PICTURE")}}},readImage:function(t){var e=new FileReader,a=new Image;e.readAsDataURL(t),e.onload=function(e){a.src=e.target.result,a.onload=function(){var e=this.width,a=this.height,i=t.type,n=t.name,o=~~(t.size/1024)+"KB";$("#uploadPreview").append(' '+e+"x"+a+" "+o+" "+i+" "+n+"
")},a.onerror=function(){alert("Invalid file type: "+t.type)}}},initProductPicture:function(){if(0!=$("#image_small").length&&0!=$("#image_small").attr("value").length){var t=$("#image_small").data("target");$(t).attr("src","https://cn.opendesktop.org/cache/200x200-2/img/"+$("#image_small").attr("value")),$(t).show(),$("button#add-product-picture").text("CHANGE LOGO")}},initTitlePicture:function(){if(0!=$("#image_big").length&&0!=$("#image_big").attr("value").length){var t=$("#image_big").data("target");$(t).attr("src","https://cn.opendesktop.org/cache/200x200-2/img/"+$("#image_big").attr("value")),$(t).show(),$("button#add-title-picture").text("CHANGE BANNER")}},initProfilePicture:function(){if(0!=$("#profile_image_url").length&&0!=$("#profile_image_url").attr("value").length){var t=$("#profile_image_url").data("target");$(t).attr("src",$("#profile_image_url").attr("value")),$("#profile-picture").attr("src",$("#profile_image_url").attr("value")),$(t).show(),$("button#add-profile-picture").text("CHANGE PICTURE")}},initProfilePictureBackground:function(){if(0!=$("#profile_image_url_bg").length&&0!=$("#profile_image_url_bg").attr("value").length){var t=$("#profile_image_url_bg").data("target");$(t).attr("src",$("#profile_image_url_bg").attr("value")),$("#profile-picture-background-preview").attr("src",$("#profile_image_url_bg").attr("value")),$(t).show(),$("button#add-profile-picture-background").text("CHANGE PICTURE")}}},MenuHover={setup:function(){$("body").on("click","a#login-dropdown",function(t){t.stopPropagation(),$(".header-login-container").toggleClass("active")}).on("click",".header-login-container",function(t){t.stopPropagation()}).on("click","a.menu-trigger",function(t){t.stopPropagation();var e="."+$(this).attr("rel");$(e).toggleClass("active")}).on("mouseup",function(t){var e=$("ul.profile-menu");$("li.profile-menu-container a.menu-trigger").is(t.target)||e.is(t.target)||0!==e.has(t.target).length||e.removeClass("active")}).on("mouseup",function(t){container=$("div.header-login-container"),trigger=$("a#login-dropdown"),trigger.is(t.target)||container.is(t.target)||0!==container.has(t.target).length||container.removeClass("active")}).click(function(){$(".header-login-container.active").removeClass("active"),$(".profile-menu.active").removeClass("active")})}},ButtonCode={setup:function(){$("#button-code-heading").click(function(){$(this).hasClass("button-code-active")?($(this).removeClass("button-code-active"),$(this).parent().find(".button-code").slideUp("fast"),$(this).parent().find(".button-code").css("border-bottom","none"),$(this).find(".icon-expand-code").css("background-image","url(img/icon-expand.png)")):($(this).addClass("button-code-active"),$(this).parent().find(".button-code").css("border-bottom","1px solid #bdc3c7"),$(this).parent().find(".button-code").slideDown("fast"),$(this).find(".icon-expand-code").css("background-image","url(img/icon-contract.png)"))})},setupClipboardCopy:function(t){$(t).on("mouseover",function(){$(this).off("mouseover"),$(this).find("[data-clipboard-target]").each(function(){var t=$($(this).attr("data-clipboard-target"));$(this).zclip({path:"/theme/flatui/js/lib/ZeroClipboard.swf",copy:$.trim($(t).text())})})})}},ProductPage={setup:function(){$(".dropdown-toggle").dropdown(),$(".scroll-pane").jScrollPane({mouseWheelSpeed:30,animateScroll:!0}),$(".love-it").on("click",function(){this_img_src=$(this).find("img").attr("src"),$(this).hasClass("no-login")||"/theme/flatui/img/icon-like-color.png"==this_img_src||$(this).prev(".share-it").trigger("click")}),$(".payment-options").find(".options").find("span.option").on("click",function(){var t=$(this).attr("title"),e=$(".payment-options").find('input[type="number"]');e.attr("value",t).val(t),e.focus(),$(".options").find(".selected").removeClass("selected"),$(this).addClass("selected")})},setupPlingButton:function(){$("#pling-amount").on("focus",function(){$("#pling-amount").popover("destroy")}),$("#pling-start").on("click",function(t){return validateElement=$("#pling-amount"),validateValue=validateElement.val(),""==validateValue||isNaN(parseFloat(validateValue))||!isFinite(validateValue)?(t.preventDefault(),$("#pling-amount").popover({placement:"bottom",html:"true",content:'
Donation must be a numeric value.
'}).popover("show"),!1):(minValue=validateElement.attr("min"),parseFloat(validateValue)×
Donation must be equal or greater than '+minValue+".
"}).popover("show"),!1):(maxValue=validateElement.attr("max"),parseFloat(validateValue)>parseFloat(maxValue)?(t.preventDefault(),$("#pling-amount").popover({placement:"bottom",html:"true",content:'
Donation must be smaller or equal than '+maxValue+".
"}).popover("show"),!1):void 0))})}},SlideShowRender={setup:function(){$("#slideshow-container").find("img:first").addClass("active"),$("#slideshow-container").find("#navigation").find("a:first").addClass("active")}},ProductSlideShow={setup:function(){$("#slideshow-container").find("#arrows").find("a").on("click",function(t){var e=$(this).attr("id"),a=$("#slideshow-container #slides"),i=a.find("img.active"),n=i.attr("rel"),o=$("#slideshow-container").find("#navigation").find("a.active");if("prev"==e){var r=parseInt(n)-parseInt(1),s=$("#slideshow-container").find('img[rel="'+r+'"]'),l=$("#slideshow-container").find("#navigation").find('a[rel="'+r+'"]');1==!s.size()&&(s=a.find("img:last"),l=$("#slideshow-container").find("#navigation").find("a:last"))}else if("next"==e){var d=parseInt(n)+parseInt(1);s=$("#slideshow-container").find('img[rel="'+d+'"]'),l=$("#slideshow-container").find("#navigation").find('a[rel="'+d+'"]'),1==!s.size()&&(s=a.find("img:first"),l=$("#slideshow-container").find("#navigation").find("a:first"))}i.removeClass("active"),o.removeClass("active"),s.addClass("active"),l.addClass("active")}),$("#slideshow-container").find("#navigation").find("a").on("click",function(){var t=$(this).attr("rel"),e=$("#slideshow-container").find('img[rel="'+t+'"]');$("#slideshow-container").find("img.active").removeClass("active"),e.addClass("active"),$("#slideshow-container").find("#navigation").find("a.active").removeClass("active"),$(this).addClass("active")})}},SlideShow={setup:function(){slideShowInterval=setTimeout(function(){var t=$("#slideshow-container").find("img.active"),e=t.attr("rel"),a=parseInt(e)+parseInt(1),i=$("#slideshow-container").find('img[rel="'+a+'"]'),n=$("#slideshow-container").find("#navigation").find("a.active");t.removeClass("active"),n.removeClass("active"),1==i.size()?(i.addClass("active"),$("#slideshow-container").find("#navigation").find('a[rel="'+a+'"]').addClass("active")):($("#slideshow-container").find("img:first").addClass("active"),$("#slideshow-container").find("#navigation").find("a:first").addClass("active"))},4e3)}},Popuppanel={setup:function(){$("body").on("click","a.popuppanel",function(t){if("_blank"===$(this).attr("target"))console.log("dont prevent default");else{t.preventDefault();var e=$(this).attr("href");$.fancybox({hideOnContentClick:!0,autoScale:!0,cyclic:"true",transitionIn:"elastic",transitionOut:"elastic",type:"iframe",scrolling:"auto",helpers:{overlay:{locked:!1}},autoSize:!0,href:e,type:"ajax"})}})}},PlingsRedirect={setup:function(){window.location.hash?($link=$(window.location.hash),$link.trigger("click")):document.location.hash&&($link=$(document.location.hash),$link.trigger("click"))}},ShowPopups={setup:function(){window.location.hash&&(alert("Hash"),$('a[href="'+document.location.hash+'"]').trigger("click")),document.location.hash&&(alert("Hash"),$('a[href="'+document.location.hash+'"]').trigger("click"))}};$("body").on("mouseenter",".supporter-thumbnail",function(){$(this).popover("show")}),$("body").on("mouseleave",".supporter-thumbnail",function(){$(this).popover("hide")});var Partials={setup:function(){$("body").on("click","a.partial",function(t){t.preventDefault();var e=this.href,a=$(this).attr("data-target"),i=$(this).data("toggle"),n=$(this).attr("data-fragment");return $(a).load(e+" "+n,function(t,e,n){if("error"==e)if(401==n.status){if(t){var o=jQuery.parseJSON(t).login_url;window.location=o||"/login"}}else $(a).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.");i&&$(i).modal("show")}),!1})}},Opendownloadfile={setup:function(){$("body").on("click","a.opendownloadfile",function(t){t.preventDefault();var e=$(this).attr("data-file_id"),a=$(this).attr("data-file_type"),i=$(this).attr("data-file_name"),n=$(this).attr("data-file_size"),o=$(this).attr("data-project_id"),r=$(this).attr("data-link_type"),s=$(this).attr("data-is-external-link"),l=$(this).attr("data-has_torrent"),d=null,c="450";return"true"==s&&(d=$(this).attr("data-external_link"),c="500"),$.fancybox({hideOnContentClick:!0,autoScale:!1,scrolling:"no",cyclic:"true",transitionIn:"elastic",transitionOut:"elastic",type:"iframe",width:"600",height:c,iframe:{scrolling:"no"},fitToView:!1,autoSize:!1,id:"opendownloadfilepopup",helpers:{overlay:{locked:!1}},href:"/dl?file_id="+e+"&file_type="+a+"&file_name="+i+"&file_size="+n+"&has_torrent="+l+"&project_id="+o+"&link_type="+r+"&is_external="+s+"&external_link="+d}),!1})}},PartialsButton={setup:function(){$("body").on("click","Button.partialbutton",function(t){t.preventDefault();var e=$(this).attr("data-href"),a=$(this).attr("data-target"),i=$(this).data("toggle"),n=$(this).attr("data-fragment"),o=$('');return $(a).append(o),$(a).load(e+" "+n,function(t,e,n){if("error"==e)if(401==n.status){if(t){var o=jQuery.parseJSON(t).login_url;window.location=o||"/login"}}else $(a).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.");i&&$(i).modal("show")}),!1})}},PartialsButtonHeartDetail={setup:function(){$("body").on("click",".partialbuttonfollowproject",function(t){t.preventDefault();var e=$(this).attr("data-href"),a=$(this).attr("data-target"),i=$(this).attr("data-auth");if($(this).data("toggle"),$(this).attr("data-fragment"),i){if($("#like-product-modal").find("#loginuser").val()==$("#like-product-modal").find("#productcreator").val())return $("#like-product-modal").find("#votelabel").text("Project owner not allowed"),$("#like-product-modal").find(".modal-body").empty(),void $("#like-product-modal").modal("show");var n=$('');return $(a).prepend(n),$.ajax({url:e,cache:!1}).done(function(t){$(a).find(".spinning").remove(),"error"==t.status?$(a).html(t.msg):"delete"==t.action?($(a).find(".plingtext").html(t.cnt),$(a).find(".plingtext").addClass("heartnumberpurple"),$(a).find(".plingheart").removeClass("heartproject").addClass("heartgrey"),$(a).find(".plingheart").removeClass("fa-heart").addClass("fa-heart-o")):($(a).find(".plingtext").html(t.cnt),$(a).find(".plingtext").removeClass("heartnumberpurple"),$(a).find(".plingheart").removeClass("heartgrey").addClass("heartproject"),$(a).find(".plingheart").removeClass("fa-heart-o").addClass("fa-heart"))}),!1}$("#like-product-modal").modal("show")})}},PartialsButtonPlingProject={setup:function(){$("#plingbtn").hover(function(){$(this).attr("src","/images/system/pling-btn-hover.png")},function(){$(this).attr("src",$(this).attr("data-src"))}),$("body").on("click",".partialbuttonplingproject",function(t){t.preventDefault();var e=$(this).attr("data-href"),a=$(this).attr("data-target"),i=$(this).attr("data-auth"),n=$(this).attr("data-issupporter");if($(this).data("toggle"),$(this).attr("data-fragment"),i)return $("#like-product-modal").find("#loginuser").val()==$("#like-product-modal").find("#productcreator").val()?($("#like-product-modal").find("#votelabel").text("Project owner not allowed"),$("#like-product-modal").find(".modal-body").empty(),void $("#like-product-modal").modal("show")):n?($(a).find(".plingnum").html(''),$.ajax({url:e,cache:!1}).done(function(t){"error"==t.status?$(a).html(t.msg):"delete"==t.action?(0==t.cnt?$(a).find(".plingnum").html("Pling me"):$(a).find(".plingnum").html(t.cnt+" Plings"),$(a).find("#plingbtn").attr("src","/images/system/pling-btn-normal.png"),$(a).find("#plingbtn").attr("data-src","/images/system/pling-btn-normal.png")):($(a).find(".plingnum").html(t.cnt+" Plings"),$(a).find("#plingbtn").attr("src","/images/system/pling-btn-active.png"),$(a).find("#plingbtn").attr("data-src","/images/system/pling-btn-active.png"))}),!1):($("#like-product-modal").find("#votelabel").html('
To pling a product and help the artist please consider becoming a supporter. Thanks!

Become a supporter
'),void $("#like-product-modal").modal("show"));$("#like-product-modal").modal("show")})}},PartialsReview={setup:function(){$("body").on("click","a.partialreview",function(t){if(t.preventDefault(),this.href,$(this).attr("data-target"),$(this).data("toggle"),$(this).attr("data-fragment"),$("#review-product-modal").find("#loginuser").val()==$("#review-product-modal").find("#productcreator").val())return $("#review-product-modal").find("#votelabel").text("Project owner not allowed"),$("#review-product-modal").find(".modal-body").empty(),void $("#review-product-modal").modal("show");var e=$("#review-product-modal").find("#userrate").val();return $(this).hasClass("voteup")?1==e?($("#review-product-modal").find("#votelabel").empty().append(' is given already with comment:'),$("#review-product-modal").find("#commenttext").val($("#review-product-modal").find("#otxt").val()),$("#review-product-modal").find(":submit").text("Remove Rating")):($("#review-product-modal").find("input#voteup").val(1),$("#review-product-modal").find("#votelabel").empty().append(' Add Comment (min. 1 char):'),$("#review-product-modal").find("#commenttext").val("+"),$("#review-product-modal").find(":submit").text("Rate Now"),$("#review-product-modal").find("#commenttext").removeAttr("disabled"),$("#review-product-modal").find(":submit").css("display","block").removeAttr("disabled")):0==e?($("#review-product-modal").find("#votelabel").empty().append(' is given already with comment: '),$("#review-product-modal").find("#commenttext").val($("#review-product-modal").find("#otxt").val()),$("#review-product-modal").find(":submit").text("Remove Rating")):($("#review-product-modal").find("input#voteup").val(2),$("#review-product-modal").find("#votelabel").empty().append(' Add Comment (min. 5 char) Please explain the reason for downvote to help the creator to make it better '),$("#review-product-modal").find("#commenttext").val("-"),$("#review-product-modal").find("#commenttext").removeAttr("disabled"),$("#review-product-modal").find(":submit").removeAttr("disabled").css("display","block"),$("#review-product-modal").find(":submit").text("Rate Now")),$("#review-product-modal").modal("show"),$("#review-product-modal").hasClass("noid")&&setTimeout(function(){$("#review-product-modal").modal("hide")},2e3),!1})}},PartialsReviewDownloadHistory={setup:function(){$("body").on("click","button.partialReviewDownloadHistory",function(t){t.preventDefault();var e=$(this).attr("data-userrate");return $("#review-product-modal").find("#commenttext").val($(this).attr("data-comment")),$("#review-product-modal").find("#form_p").val($(this).attr("data-project")),$(this).hasClass("voteup")?1==e?($("#review-product-modal").find("#votelabel").empty().append(' is given already with comment:'),$("#review-product-modal").find(":submit").attr("disabled","disabled").css("display","none"),$("#review-product-modal").find("#commenttext").attr("disabled","disabled")):($("#review-product-modal").find("input#voteup").val(1),$("#review-product-modal").find("#votelabel").empty().append(' Add Comment (min. 1 char):'),$("#review-product-modal").find("#commenttext").val("+"),$("#review-product-modal").find("#commenttext").removeAttr("disabled"),$("#review-product-modal").find(":submit").css("display","block").removeAttr("disabled")):0==e?($("#review-product-modal").find("#votelabel").empty().append(' is given already with comment: '),$("#review-product-modal").find("#commenttext").attr("disabled","disabled"),$("#review-product-modal").find(":submit").attr("disabled","disabled").css("display","none")):($("#review-product-modal").find("input#voteup").val(2),$("#review-product-modal").find("#votelabel").empty().append(' Add Comment (min. 5 chars): '),$("#review-product-modal").find("#commenttext").val("-"),$("#review-product-modal").find("#commenttext").removeAttr("disabled"),$("#review-product-modal").find(":submit").removeAttr("disabled").css("display","block")),$("#review-product-modal").modal("show"),$("#review-product-modal").hasClass("noid")&&setTimeout(function(){$("#review-product-modal").modal("hide")},2e3),!1})}},CreateScoreRatingPopup={setup:function(){var t,e=0;$("select.rating-select").focus(function(){t=$(this),e=$(this).val()}).change(function(){var t=$(this).find("option:selected"),e=t.val(),a=t.text(),i=($(this).attr("data-userrate"),$(this).attr("data-comment"),$(this).attr("data-creator")),n=$("#score-product-modal").find("#loginuser").val();if(n){if(n==i)return $("#score-product-modal").find("#votelabel").text("Project owner not allowed"),$("#score-product-modal").find(".modal-body").empty(),$("#score-product-modal").find("#modal-btn-onsubmit").remove(),void $("#score-product-modal").modal("show");-1==e?$("#score-product-modal").find("#votelabel").empty().append("Remove Rating "):e<=5?($("#score-product-modal").find("#votelabel").empty().append('Add a review to your rating "'+a+'" (min. 5 chars) Please explain the reason for downvote to help the creator to make it better '),$("#score-product-modal").find("#voteup").val(2)):($("#score-product-modal").find("#votelabel").empty().append('Add a review to your rating "'+a+'" (min. 1 char):'),$("#score-product-modal").find("#voteup").val(1)),$("#score-product-modal").find("#form_p").val($(this).attr("data-project")),$("#score-product-modal").find(":submit").css("display","block").removeAttr("disabled"),$("#score-product-modal").find("#commenttext").removeAttr("disabled"),e>=1&&e<=3?$("#score-product-modal").find("#commenttext").val(""):$("#score-product-modal").find("#commenttext").val(a),$("#score-product-modal").find("#userscorevalue").val(e),"-1"==e?$("#score-product-modal").find(":submit").text("Remove Rating"):$("#score-product-modal").find(":submit").text("Rate Now"),$("#score-product-modal").modal("show")}else $("#score-product-modal").modal("show")}),$("#modal-btn-cancel").on("click",function(){$(t).find("option[value="+e+"]").prop("selected",!0),$("#score-product-modal").modal("hide")});var a=!1;$("#modal-btn-onsubmit").on("click",function(){a=!0}),$("#score-product-modal").on("hidden.bs.modal",function(){a||$(t).find("option[value="+e+"]").prop("selected",!0)})}},PartialForms={setup:function(){$("body").on("submit","form.partial",function(t){t.preventDefault(),t.stopImmediatePropagation(),$(this).find(":submit").attr("disabled","disabled"),$(this).find(":submit").css("white-space","normal");var e=$('');$(this).find(":submit").append(e);var a=$(this).attr("data-target"),i=$(this).attr("data-trigger");return console.log(this),jQuery.ajax({data:$(this).serialize(),url:this.action,type:this.method,error:function(){return $(a).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.
"),!1},success:function(t){return $(a).empty().html(t),$(a).find(i).trigger("click"),!1}}),!1})}},PartialJsonClone={setup:function(){$("body").on("submit","form.partialjsonclone",function(t){t.preventDefault(),t.stopImmediatePropagation();var e=$(this).attr("data-target"),a=($(this).attr("data-trigger"),$(this).attr("data-projectid"));return jQuery.ajax({data:$(this).serialize(),url:this.action,type:this.method,dataType:"json",error:function(){$(e).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.
")},success:function(t,e){$("form#product-report-clone").find("#clonePId").val(""),$("form#product-report-clone").find("#report-text").val(""),$("#report-product-clone-"+a).modal("hide");var i=$("#generic-dialog");i.find(".modal-header-text").empty(),i.find(".modal-body").empty().append(t.message),setTimeout(function(){i.modal("show")},900)}}),!1})}},PartialJson={setup:function(){$("body").on("submit","form.partialjson",function(t){t.preventDefault(),t.stopImmediatePropagation();var e=$(this).attr("data-target"),a=$(this).attr("data-trigger");return jQuery.ajax({data:$(this).serialize(),url:this.action,type:this.method,dataType:"json",error:function(){$(e).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.
")},success:function(t,i){t.redirect?window.location=t.redirect:(e&&$(e).empty().html(t.message),a&&$(e).find(a).trigger("click"))}}),!1})}},PartialJsonFraud={setup:function(){$("body").on("submit","form.partialjsonfraud",function(t){t.preventDefault(),t.stopImmediatePropagation();var e=$(this).attr("data-target"),a=$(this).attr("data-trigger");return $("form.partialjsonfraud").find("#report-text").val().length<5?($("form.partialjsonfraud").find("p.warning").remove(),$("form.partialjsonfraud").find("#report-text").parent().append('

at least 5 chars

'),!1):(jQuery.ajax({data:$(this).serialize(),url:this.action,type:this.method,dataType:"json",error:function(){$(e).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.
")},success:function(t,i){t.redirect?window.location=t.redirect:(e&&$(e).empty().html(t.message),a&&$(e).find(a).trigger("click"))}}),!1)})}},PartialPayPal={setup:function(){this.initPayPalForm(),this.initPayPalFee()},initPayPalForm:function(){$("body").on("submit","form.partialpaypal",function(t){t.preventDefault(),t.stopImmediatePropagation();var e=$(this).attr("data-target"),a=$(this).attr("data-trigger");return jQuery.ajax({data:$(this).serialize(),url:this.action,type:this.method,error:function(t,e,a){$("#modal-dialog").modal("hide");var i=$('');i.html($(t.responseText).filter(".page-container").children()),i.append(''),setTimeout(function(){i.modal("show")},900)},success:function(t){$(e).empty().html(t),$(e).find(a).trigger("click"),$("#modal-dialog").modal("hide")}}),!1})},initPayPalFee:function(){$("body").on("change","#amount_plings",function(t){PartialPayPal.changeFee()})},changeFee:function(){var t=document.getElementById("amount_plings"),e=parseFloat(t.value),a=this.round(.05*e,2),i=.03*(a+e+.3)+.3,n=e+a+(i=this.round(i,2));document.getElementById("pling_fee").value=this.round(a,2).toFixed(2),document.getElementById("paypal_fee").value=this.round(i,2).toFixed(2),document.getElementById("sum").value=this.round(n,2)},round:function(t,e){var a=Math.pow(10,e);return Math.round(t*a)/a}},PartialCommentReviewForm={setup:function(){this.initForm()},initForm:function(){$("body").on("submit","form.product-add-comment-review",function(t){t.preventDefault(),t.stopImmediatePropagation();var e=$.trim($("#commenttext").val());if(2==$("#voteup").val()&&e.length<5)0==$("#review-product-modal").find("#votelabel").find(".warning").length&&$("#review-product-modal").find("#votelabel").append("
Please give a comment, thanks!");else{if(!(e.length<1)){$(this).find(":submit").attr("disabled","disabled"),$(this).find(":submit").css("white-space","normal");var a=$('');return $(this).find(":submit").append(a),jQuery.ajax({data:$(this).serialize(),url:this.action,type:this.method,error:function(t,e,a){$("#review-product-modal").modal("hide");var i=$("#generic-dialog");i.modal("hide"),i.find(".modal-header-text").empty().append("Please try later."),i.find(".modal-body").empty().append("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.
"),setTimeout(function(){i.modal("show")},900)},success:function(t){$("#review-product-modal").modal("hide"),location.reload()}}),!1}0==$("#review-product-modal").find("#votelabel").find(".warning").length&&$("#review-product-modal").find("#votelabel").append("
Please give a comment, thanks!")}})}},PartialCommentReviewFormNew={setup:function(){this.initForm()},initForm:function(){$("body").on("submit","form.product-add-comment-review-new",function(t){t.preventDefault(),t.stopImmediatePropagation();var e=$.trim($("#score-product-modal").find("#commenttext").val());if(2==$("#score-product-modal").find("#voteup").val()&&e.length<5)0==$("#score-product-modal").find("#votelabel").find(".warning").length&&$("#score-product-modal").find("#votelabel").append("
Please give a comment, thanks!");else{if(!(e.length<1)){$(this).find(":submit").attr("disabled","disabled"),$(this).find(":submit").css("white-space","normal");var a=$('');return $(this).find(":submit").append(a),jQuery.ajax({data:$(this).serialize(),url:this.action,type:this.method,error:function(t,e,a){$("#score-product-modal").modal("hide");var i=$("#generic-dialog");i.modal("hide"),i.find(".modal-header-text").empty().append("Please try later."),i.find(".modal-body").empty().append("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.
"),setTimeout(function(){i.modal("show")},900)},success:function(t){$("#score-product-modal").modal("hide"),location.reload()}}),!1}0==$("#score-product-modal").find("#votelabel").find(".warning").length&&$("#score-product-modal").find("#votelabel").append("
Please give a comment, thanks!")}})}},PartialFormsAjax={setup:function(){var t=$("form.partialajax"),e=t.attr("data-target"),a=t.attr("data-trigger");$(t).find(":submit").on("click",function(e){e.preventDefault(),$(t).find(":submit").attr("disabled","disabled"),$(t).find(":submit").css("white-space","normal");var a=$('');$(t).find(":submit").append(a),$(t).submit()}),t.ajaxForm({error:function(){$(e).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.
")},success:function(t){$(e).empty().html(t),$(e).find(a).trigger("click")}})}},AjaxFormWithProgress={setup:function(t){var e=$(t),a=e.attr("data-target"),i=e.attr("data-trigger"),n=e.find(".progress-bar"),o=e.find(".progress-percent");$(e).find(":submit").on("click",function(t){t.preventDefault(),$(e).find(":submit").attr("disabled","disabled"),$(e).find(":submit").css("white-space","normal");var a=$('');$(e).find(":submit").append(a),$(e).submit()}),e.ajaxForm({beforeSend:function(){n.parent().removeClass("hidden"),n.width("0%"),o.html("0%")},uploadProgress:function(t,e,a,i){var r=i+"%";n.width(r),o.html(r)},error:function(){$(a).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.
")},success:function(t){n.width("100%"),o.html("100%"),$(a).empty().html(t),$(a).find(i).trigger("click")}})}},PartialFormsAjaxMemberBg={setup:function(){var t=$("form.partialajaxbg"),e=t.attr("data-target"),a=t.attr("data-trigger");$(t).find(":submit").on("click",function(e){e.preventDefault(),$(t).find(":submit").attr("disabled","disabled"),$(t).find(":submit").css("white-space","normal");var a=$('');$(t).find(":submit").append(a),$(t).submit()}),t.ajaxForm({error:function(){$(e).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.
")},success:function(t){$(e).empty().html(t),$(e).find(a).trigger("click")}})}},AjaxForm={setup:function(t,e){var a=$(e);$("body").on("submit",t,function(t){return t.preventDefault(),t.stopImmediatePropagation(),$(this).find("button").attr("disabled","disabled"),$(this).find(".glyphicon.glyphicon-send").removeClass("glyphicon-send").addClass("glyphicon-refresh spinning"),jQuery.ajax({data:$(this).serialize(),url:this.action,type:this.method,dataType:"json",error:function(t,e,a){var i=JSON&&JSON.parse(t.responseText)||$.parseJSON(t.responseText),n=$("#generic-dialog");n.modal("hide"),n.find(".modal-header-text").empty().append(i.title),n.find(".modal-body").empty().append(i.message),setTimeout(function(){n.modal("show")},900)},success:function(t){"ok"==t.status&&$(a).empty().html(t.data),"error"==t.status&&(""!=t.message?alert(t.message):alert("Service is temporarily unavailable."))}}),!1})}},WidgetModalAjax={setup:function(){$(".my-product-item").find("a.widget-button").on("click",function(){var t=$(this).attr("rel"),e=t.split("product")[1],a=$(".modal-body#widget-code-"+t);$.ajax({url:"/widget/config/"+e,type:"html",success:function(t){a.prepend(t),angular.bootstrap(a,["widgetApp"])}})})}},LoginContainer={update:function(){Date.now||(Date.now=function(){return(new Date).getTime()});var t="/authorization/htmllogin?"+(Date.now()/1e3|0);$("#login_container").load(t,function(t,e,a){})}},RssNews={setup:function(){if(0==$("#rss-feeds").length)return!1;$.getJSON("/json/news",function(t){var e="";$.each(t.posts,function(t,a){if(t>=3)return!1;var i=moment(a.date);e+='
'+a.title+'
'+i.format("MMM DD YYYY")+''+a.comments.length+" Comment"+(a.comments.length>1?"s":"")+"
"}),$("#rss-feeds").html(e)})}},Mastodon={setup:function(){if(0==$("#mastodon-toots").length)return!1;$.getJSON("/json/socialtimeline",function(t){var e="";$.each(t,function(t,a){e+='
'+a.account.username+""+a.content.replace(/(<([^>]+)>)/gi,"")+''+a.created_at+"
"}),$("#mastodon-toots").html(e)})}},BlogJson={setup:function(){$.ajax("/json/forum").then(function(t){var e=t.topic_list.topics,a="",i=3;e.sort(function(t,e){return new Date(e.last_posted_at)-new Date(t.last_posted_at)}),$.each(e,function(t,e){if(!e.pinned){var n=e.timeago,o="Reply",r=e.posts_count-1;o=0==r?"Replies":1==r?"Reply":"Replies",a+='
'+e.title+'
'+n+''+r+" "+o+"
",i--}if(0==i)return!1}),$("#blogJson").html(a)})}},GitlabNewProjectsJson={setup:function(t){$.ajax("/json/gitlabnewprojects").then(function(e){var a=e,i="";$.each(a,function(e,a){var n=a.timeago;i+='"}),$("#lastgitprojects").html(i)})}};function showGitUserAvatar(t,e,a){var i=t+"/api/v4/users?username="+e;$.ajax(i).then(function(t){var i=t;$.each(i,function(t,i){$img=$("#avatar_"+e+"_"+a),$img.attr("src",i.avatar_url)})})}var ProductDetailCarousel={setup:function(){$(".carousel-inner img").each(function(t){$(this).on("click",function(){$("#product-main-img-container").hasClass("imgfull")?$("#product-main-img-container").prependTo($("#product-main")):$("#product-main-img-container").prependTo($("#product-page-content")),$("#product-main-img-container").toggleClass("imgfull"),$("#product-main-img-container").toggleClass("imgsmall")})})}},AppimagequestionOnClick={setup:function(t){$("body").on("click","i.appimagequestion",function(t){var e=$("#generic-dialog");e.modal("show"),e.find(".modal-header-text").empty().append("AppImage Info"),e.find(".modal-body").empty().append("")})}},ProductDetailBtnGetItClick={setup:function(t){$("body").on("click","button#project_btn_download",function(e){$.fancybox({hideOnContentClick:!0,autoScale:!0,cyclic:"true",transitionIn:"elastic",transitionOut:"elastic",type:"ajax",helpers:{overlay:{locked:!1}},autoSize:!0,href:"/p/"+t+"/ppload"})})}},GhnsExcludedClick={setup:function(t){$("body").on("click","#ghns_excluded-this-checkbox",function(e){e.stopPropagation();var a=1,i="",n="";this.checked?(a=1,i="Please specify why this product should be excluded (min 5 chars) :",n=" ghns exclude"):(a=0,i="Please specify why this product should be included (min 5 chars) :",n=" ghns include");var o=$("#generic-dialog");return o.modal("show"),o.find(".modal-header-text").empty().append("GHNS "),o.find(".modal-body").empty().append(i+'

"),$("body").on("click","#btn-ghns-excluded",function(){var t=$("#ghns-excluded-text").val();if(t.length<5)return alert("min 5 chars"),!1;var e=$(this).attr("data-projectid"),a=$(this).attr("data-status");$.ajax({url:"/backend/project/doghnsexclude",method:"POST",data:{project_id:e,ghns_excluded:a,msg:t},success:function(t){var e=$("#generic-dialog");0==a?(e.find(".modal-body").empty().append("Project is successfully included into GHNS"),$("#ghns_excluded-this-checkbox").prop("checked",!1)):(e.find(".modal-body").empty().append("Project is successfully excluded into GHNS"),$("#ghns_excluded-this-checkbox").prop("checked",!0)),setTimeout(function(){e.modal("hide")},1e3)},error:function(){alert("Service is temporarily unavailable.")}})}),!1})}},AboutMeMyProjectsPaging={setup:function(){$(window).scroll(function(){if($("footer").offset().top-($(window).scrollTop()+$(window).height())<300){if(!$("button#btnshowmoreproducts").length)return;let t='',e=$("button#btnshowmoreproducts").attr("data-page");$("button#btnshowmoreproducts").remove(),$url=window.location.href,target=$(".about-me-details").find("li.active").find("a").attr("href"),"#user-original-products"==target&&($url+="showoriginal");let a=$("

").append(t).load($url,{projectpage:e},function(t,e,a){if("error"==e)if(401==a.status){if(t){var i=jQuery.parseJSON(t).login_url;window.location=i||"/login"}}else $(target).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.")});$(target).append(a)}})}},AboutMeMyProjectsPagingButton={setup:function(){$("body").on("click","button#btnshowmoreproducts",function(t){let e=$(this).attr("data-page");$(this).remove(),$url=window.location.href,target=$(".about-me-details").find("li.active").find("a").attr("href"),"#user-original-products"==target&&($url+="showoriginal");let a=$("
").append('').load($url,{projectpage:e},function(t,e,a){if("error"==e)if(401==a.status){if(t){var i=jQuery.parseJSON(t).login_url;window.location=i||"/login"}}else $(target).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.")});$(target).append(a)})}},ProductDetailCommentTooltip={setup:function(){TooltipUser.setup("tooltipuser","right")}};function generateTooltipster(t,e){$(t).each(function(){$(this).tooltipster({side:e,theme:["tooltipster-light","tooltipster-light-customized"],contentCloning:!0,contentAsHTML:!0,interactive:!0,functionBefore:function(t,e){var a=$(e.origin),i=a.attr("data-user");!0!==a.data("loaded")&&$.get("/member/"+i+"/tooltip/",function(e){var i=e.data,n='
'+i.username+' '+i.countrycity+'
'+i.cntProjects+' products
'+i.totalComments+' comments
Likes '+i.cntLikesGave+' products
Got '+i.cntLikesGot+' Likes
Last time active : '+i.lastactive_at+'
Member since : '+i.created_at+"
";n+="
",t.content(n),a.data("loaded",!0)})}})})}var TooltipUser={setup:function(t,e){$("."+t).tooltipster({side:e,theme:["tooltipster-light","tooltipster-light-customized"],contentCloning:!0,contentAsHTML:!0,interactive:!0,functionBefore:function(t,e){var a=$(e.origin),i=a.attr("data-user");!0!==a.data("loaded")&&$.get("/member/"+i+"/tooltip/",function(e){var i=e.data,n='
'+i.username+' '+i.countrycity+'
'+i.cntProjects+' products
'+i.totalComments+' comments
Likes '+i.cntLikesGave+' products
Got '+i.cntLikesGot+' Likes
Last time active : '+i.lastactive_at+'
Member since : '+i.created_at+"
";n+="
",t.content(n),a.data("loaded",!0)})}})}};function generateTooltipUserPlings(t,e){$(t).each(function(){$(this).tooltipster({side:e,theme:["tooltipster-light","tooltipster-light-customized"],contentCloning:!0,contentAsHTML:!0,interactive:!0,functionBefore:function(t,e){var a=$(e.origin),i=a.attr("data-user");!0!==a.data("loaded")&&$.get("/plings/tooltip/id/"+i,function(e){var i='
';$.each(e.data,function(t,e){if(t>10)return!1;e.profile_image_url.indexOf("http")<0&&(e.profile_image_url="https://cn.opendesktop.org/cache/40x40-2/img/"+e.profile_image_url),e.profile_image_url.indexOf(".gif")>0&&(e.profile_image_url="https://cn.opendesktop.org/img/"+e.profile_image_url),i=i+'
'+e.username+"
"}),i+="
",t.content(i),a.data("loaded",!0)})}})})}var TooltipUserPlings={setup:function(t,e){$("."+t).tooltipster({side:e,theme:["tooltipster-light","tooltipster-light-customized"],contentCloning:!0,contentAsHTML:!0,interactive:!0,functionBefore:function(t,e){var a=$(e.origin),i=a.attr("data-user");!0!==a.data("loaded")&&$.get("/plings/tooltip/id/"+i,function(e){var i='
';$.each(e.data,function(t,e){if(t>10)return!1;e.profile_image_url.indexOf("http")<0&&(e.profile_image_url="https://cn.opendesktop.org/cache/40x40-2/img/"+e.profile_image_url),e.profile_image_url.indexOf(".gif")>0&&(e.profile_image_url="https://cn.opendesktop.org/img/"+e.profile_image_url),i=i+'
'+e.username+"
"}),i+="
",t.content(i),a.data("loaded",!0)})}})}},AboutMePage={setup:function(t){var e=t+"'s Profile "+$(document).prop("title");$(document).prop("title",e)}},InitActiveHashTab={setup:function(){var t=document.location.hash;$('a[href="'+t+'"]')&&$('a[href="'+t+'"]').tab("show")}},AboutmeTab={setup:function(){$("body").on("click","a.aboutmetab",function(t){t.preventDefault();var e=$(this).attr("href"),a=$(this).attr("data-href");0==$(e).find(".product").length&&$(e).append('').load(a,function(){})})}},CommunityTabToplistMemberScrollPaging={setup:function(t,e){$(window).scroll(function(){if($("footer").offset().top-($(window).scrollTop()+$(window).height())<300){if(!$("button#toplistmemberscrollshowmore").length)return;var a=$("button#toplistmemberscrollshowmore").attr("data-page");$("button#toplistmemberscrollshowmore").remove();var i=e+"/nopage/1/page/"+a,n=$('
');$(t).find(".product-list").append(n),$(n).load(i,function(){generateTooltipster($(n).find(".tooltipuser"),"right")})}})}},CommunityTab={setup:function(){$("body").on("click","a.communitytab",function(t){t.preventDefault();var e=$(this).attr("href"),a=$(this).attr("data-href");0==$(e).find(".list").find(".user").length&&$(e).find(".list").append('').load(a,function(){generateTooltipster($(e).find(".tooltipuser"),"right"),$(e).find(".tooltipuserplings").length>0&&generateTooltipUserPlings($(e).find(".tooltipuserplings"),"right"),"#toplistMemberPanel"==e&&CommunityTabToplistMemberScrollPaging.setup(e,a),$(e).find(".opendesktopwidgetpager span").each(function(t){$(this).on("click",function(){$(this).parent().addClass("active").siblings().removeClass("active");var t=a+"/nopage/1/page/"+$(this).html();$(e).find(".product-list").html(""),$(e).find(".product-list").load(t,function(){generateTooltipster($(e).find(".tooltipuser"),"right"),$(e).find(".tooltipuserplings").length>0&&generateTooltipUserPlings($(e).find(".tooltipuserplings"),"right")})})})})});var t=document.location.hash;$('a[href="'+t+'"]').length>0?($('a[href="'+t+'"]').tab("show"),$('a[href="'+t+'"]').trigger("click")):(t="#supportersPanel",$('a[href="'+t+'"]').trigger("click")),$("body").on("mouseenter",".product-thumbnail-startpage",function(){$(this).popover("show")}),$("body").on("mouseleave",".product-thumbnail-startpage",function(){$(this).popover("hide")})}},TagingProduct={setup:function(){$("input[name=tagsuser]").tagify({whitelist:["good","great"],autocomplete:!0}).on("remove",function(t,e){console.log("removed",e)}).on("add",function(t,e){console.log("added",e)})}},TagingProductSelect2={setup:function(){$.fn.select2.amd.require(["select2/selection/search"],function(t){t.prototype.searchRemoveChoice=function(t,e){this.trigger("unselect",{data:e}),this.$search.val(""),this.handleSearch()}},null,!0);var t=$(".taggingSelect2").select2({placeholder:"Add Tags here ...",tags:!0,tokenSeparators:[","," "],minimumInputLength:3,maximumSelectionLength:5,width:"resolve",ajax:{url:"/tag/filter",dataType:"json",type:"GET",delay:500,processResults:function(t){return{results:t.data.tags}}}});t.on("select2:select",function(e){var a=e.params.data;$("#tagsuserselect").attr("data-pid"),t.parent().find("ul.select2-selection__rendered").find("li.select2-selection__choice").length>5?t.find("option[value='"+a.id+"']").remove():(new RegExp("^[0-9A-Za-z_.-]+$").test(a.text)||(t.find("option[value='"+a.id+"']").remove(),alert("Must be letter or number and can include hyphens")),a.text.length>10&&(t.find("option[value='"+a.id+"']").remove(),alert("Max. length 45 chars")))})}},TagingProductDetail={setup:function(){TagingProductDetailSelect2.setup(),$("body").on("click","button.topic-tags-btn",function(t){if($(this).toggleClass("Done"),$(".product_category").find(".usertagslabel").remove(),$(".tagsuserselectpanel").toggle(),"Done"==$(this).text()){$(this).text("Manage tags");var e="",a=$("li.select2-selection__choice");$.each(a,function(t,a){e=e+''+a.title+""}),$(".product_category").find(".topicslink").html(e)}else $(this).text("Done")})}},TagingProductDetailSelect2={setup:function(){$.fn.select2.amd.require(["select2/selection/search"],function(t){t.prototype.searchRemoveChoice=function(t,e){this.trigger("unselect",{data:e}),this.$search.val(""),this.handleSearch()}},null,!0);var t=$("#tagsuserselect").select2({placeholder:"Input tags please...",tags:!0,minimumInputLength:3,closeOnSelect:!0,maximumSelectionLength:5,tokenSeparators:[","," "],ajax:{url:"/tag/filter",dataType:"json",type:"GET",delay:500,processResults:function(t){return{results:t.data.tags}}}});t.on("select2:select",function(e){var a=e.params.data,i=$("#tagsuserselect").attr("data-pid");$.post("/tag/add",{p:i,t:a.id}).done(function(e){"error"==e.status?($("span.topic-tags-saved").css({color:"red"}).html(e.message).show().delay(2e3).fadeOut(),t.find("option[value='"+e.data.tag+"']").last().remove()):$("span.topic-tags-saved").css({color:"green"}).html(' Saved').show().delay(1e3).fadeOut()})}),t.on("select2:unselect",function(t){var e=t.params.data,a=$("#tagsuserselect").attr("data-pid");$.post("/tag/del",{p:a,t:e.id}).done(function(t){console.log(t),$("span.topic-tags-saved").css({color:"green"}).html(''+t.message).show().delay(1e3).fadeOut()})})}},TagingLoopMyProducts={setup:function(){TagingLoopMyProductsSelect2.setup(),$("body").on("click","button.topic-tags-btn",function(t){if($(this).toggleClass("Done"),$(this).parent().find(".topicsuser").html(""),$(this).parent().find(".tagsuserselectpanel").toggle(),"Done"==$(this).text()){$(this).text("Manage tags");var e="",a=$(this).parent().find("li.select2-selection__choice");$.each(a,function(t,a){e=e+''+a.title+""}),$(this).parent().find(".topicsuser").html(e)}else $(this).text("Done")})}},TagingLoopMyProductsSelect2={setup:function(){$.fn.select2.amd.require(["select2/selection/search"],function(t){t.prototype.searchRemoveChoice=function(t,e){this.trigger("unselect",{data:e}),this.$search.val(""),this.handleSearch()}},null,!0);var t=$(".taggingSelect2").select2({placeholder:"Input tags please...",tags:!0,minimumInputLength:3,closeOnSelect:!0,maximumSelectionLength:5,tokenSeparators:[","," "],ajax:{url:"/tag/filter",dataType:"json",type:"GET",delay:500,processResults:function(t){return{results:t.data.tags}}}});t.on("select2:select",function(e){var a=e.params.data,i=$(this).attr("id").replace("tagsuserselect","");$.post("/tag/add",{p:i,t:a.id}).done(function(e){"error"==e.status?($("#topic-tags-saved"+i).css({color:"red"}).html(e.message).show().delay(2e3).fadeOut(),t.find("option[value='"+e.data.tag+"']").last().remove()):"existing"==e.status?$("#topic-tags-saved"+i).css({color:"red"}).html(e.message).show().delay(2e3).fadeOut():$("#topic-tags-saved"+i).css({color:"green"}).html(' Saved').show().delay(1e3).fadeOut()})}),t.on("select2:unselect",function(t){var e=t.params.data,a=$(this).attr("id").replace("tagsuserselect","");$.post("/tag/del",{p:a,t:e.id}).done(function(t){$("#topic-tags-saved"+a).css({color:"green"}).html(''+t.message).show().delay(1e3).fadeOut()})})}},productRatingToggle={setup:function(){$("#showRatingAll").on("click",function(){$("#ratings-panel").find(".spinning").show(),setTimeout(function(){$("#ratings-panel").find(".spinning").hide()},500),$(".btnRateFilter").removeClass("activeRating"),$(this).addClass("activeRating"),$(".productRating-rows").show(),$(".productRating-rows-inactive").show()}),$("#showRatingActive").on("click",function(){$("#ratings-panel").find(".spinning").show(),setTimeout(function(){$("#ratings-panel").find(".spinning").hide()},500),$(".btnRateFilter").removeClass("activeRating"),$(this).addClass("activeRating"),$(".productRating-rows").show(),$(".productRating-rows-inactive").hide()}),$("#showRatingUpvotes").on("click",function(){$("#ratings-panel").find(".spinning").show(),setTimeout(function(){$("#ratings-panel").find(".spinning").hide()},500),$(".btnRateFilter").removeClass("activeRating"),$(this).addClass("activeRating"),$(".productRating-rows").show(),$(".clsDownvotes").hide(),$(".productRating-rows-inactive").hide()}),$("#showRatingDownvotes").on("click",function(){$("#ratings-panel").find(".spinning").show(),setTimeout(function(){$("#ratings-panel").find(".spinning").hide()},500),$(".btnRateFilter").removeClass("activeRating"),$(this).addClass("activeRating"),$(".productRating-rows").show(),$(".productRating-rows-inactive").hide(),$(".clsUpvotes").hide()})}},FilterBrowseOriginalFn={setup:function(){$("body").on("click","input#filter_browse_original",function(t){var e=$(this).is(":checked"),a=window.location.href;a.indexOf("browse")<0&&(a+="/browse/"),a.indexOf("filteroriginal")>0&&(a=a.substring(0,a.indexOf("filteroriginal"))),window.location.href=e?a+"filteroriginal/1":a+"filteroriginal/0"})}},FilterBrowseTagGroupFn={setup:function(){$("body").on("change","select.filter_browse_tag_group",function(t){var e=$(this).val(),a=$(this).attr("data_group_id");$.ajax({url:"/explore/savetaggroupfilter?group_id="+a+"&tag_id="+e,cache:!1}).done(function(t){var e=window.location.href;window.location.href=e})})}}; \ No newline at end of file +var prefix="ocs_",OcsStorage={set:function(t,e){localStorage[t]=JSON.stringify(e)},get:function(t){return localStorage[t]?JSON.parse(localStorage[t]):null}},OcsStats={props:{},a:0,readIp:function(t,e){$.getJSON(t,function(t){OcsStats.props.ipv4=t.ip,OcsStats.saveProps(1)}).fail(function(){OcsStats.saveProps(1)}),$.getJSON(e,function(t){OcsStats.props.ipv6=t.ip,OcsStats.saveProps(2)}).fail(function(){OcsStats.saveProps(2)})},genId:function(){Fingerprint2.get({},function(t){var e=t.map(function(t){return t.value});OcsStats.props.fp=Fingerprint2.x64hash128(e.join(""),31),OcsStats.saveProps(4)})},saveProps:function(t){OcsStorage.set("ocs",OcsStats.props),OcsStats.a+=t,7==OcsStats.a&&OcsStats.postProps()},postProps:function(){$.post("/l/fp",OcsStats.props)},readStats:function(t,e){window.requestIdleCallback?requestIdleCallback(function(){OcsStats.genId(),OcsStats.readIp(t,e)}):setTimeout(function(){OcsStats.genId(),OcsStats.readIp(t,e)},500)}},newProductPage={setup:function(){function t(){var t=$("#donations-panel").find("#comments").height();t>$("#donations-panel").find("#supporters").height()&&$("#donations-panel").find("#supporters").height(t)}$(document).ready(function(){var e;e=$("#pling-it-box").height(),$(".scrollable-content").height(e),$(".scrollable-content").jScrollPane({mouseWheelSpeed:30}),t(),$('a[data-toggle="tab"]').on("shown.bs.tab",function(e){t()})})}},ImagePreview={hasError:!1,setup:function(){this.initProductPicture(),this.initTitlePicture(),this.initProfilePicture(),this.initProfilePictureBackground()},previewImage:function(t,e){if(t.files&&t.files[0]){var a=new FileReader,i=new Image,n=t.files[0];a.readAsDataURL(t.files[0]),a.onload=function(a){var o=$("#"+e);i.src=a.target.result,i.onload=function(){var e=this.width,i=this.height,r=n.type,s=(n.name,~~(n.size/1024));ImagePreview.hasError=!1,o.parent().parent().find("div.bg-danger").remove(),(e>2e3||e<20||i>2e3||i<20)&&(o.parent().parent().append('
Wrong image dimensions
'),$($(t).closest("form")[0]).trigger("reset"),ImagePreview.hasError=!0),s>2e3&&(o.parent().parent().append('
File too large
'),$($(t).closest("form")[0]).trigger("reset"),ImagePreview.hasError=!0);/(jpg|jpeg|png|gif)$/i.exec(r)||(o.parent().parent().append('
Invalid file type: '+n.type+"
"),$($(t).closest("form")[0]).trigger("reset"),ImagePreview.hasError=!0),0==ImagePreview.hasError&&(ImagePreview.hasError=!1,o.attr("src",a.target.result),o.show())},i.onerror=function(){o.parent().parent().find("div.bg-danger").remove(),o.parent().parent().append('
Invalid file type: '+n.type+"
")},"product-picture-preview"==e?$("button#add-product-picture").text("CHANGE LOGO"):"title-picture-preview"==e?$("button#add-title-picture").text("CHANGE BANNER"):"profile-picture-preview"==e?($("button#add-profile-picture").text("CHANGE PICTURE"),$("input#profile_img_src").val("local")):"profile-picture-bg-preview"==e&&$("button#add-profile-picture-background").text("CHANGE PICTURE")}}},previewImageMember:function(t,e){if(t.files&&t.files[0]){var a=new FileReader,i=new Image;t.files[0];a.readAsDataURL(t.files[0]),a.onload=function(t){var a=$("#"+e);i.src=t.target.result,i.onload=function(){ImagePreview.hasError=!1,a.parent().find(".image-error").remove(),0==ImagePreview.hasError&&(a.attr("src",t.target.result),a.show())},i.onerror=function(){a.parent().append('
Invalid file type
')},"profile-picture-background-preview"==e&&$("button#add-profile-picture-background").text("CHANGE PICTURE")}}},readImage:function(t){var e=new FileReader,a=new Image;e.readAsDataURL(t),e.onload=function(e){a.src=e.target.result,a.onload=function(){var e=this.width,a=this.height,i=t.type,n=t.name,o=~~(t.size/1024)+"KB";$("#uploadPreview").append(' '+e+"x"+a+" "+o+" "+i+" "+n+"
")},a.onerror=function(){alert("Invalid file type: "+t.type)}}},initProductPicture:function(){if(0!=$("#image_small").length&&0!=$("#image_small").attr("value").length){var t=$("#image_small").data("target");$(t).attr("src","https://cn.opendesktop.org/cache/200x200-2/img/"+$("#image_small").attr("value")),$(t).show(),$("button#add-product-picture").text("CHANGE LOGO")}},initTitlePicture:function(){if(0!=$("#image_big").length&&0!=$("#image_big").attr("value").length){var t=$("#image_big").data("target");$(t).attr("src","https://cn.opendesktop.org/cache/200x200-2/img/"+$("#image_big").attr("value")),$(t).show(),$("button#add-title-picture").text("CHANGE BANNER")}},initProfilePicture:function(){if(0!=$("#profile_image_url").length&&0!=$("#profile_image_url").attr("value").length){var t=$("#profile_image_url").data("target");$(t).attr("src",$("#profile_image_url").attr("value")),$("#profile-picture").attr("src",$("#profile_image_url").attr("value")),$(t).show(),$("button#add-profile-picture").text("CHANGE PICTURE")}},initProfilePictureBackground:function(){if(0!=$("#profile_image_url_bg").length&&0!=$("#profile_image_url_bg").attr("value").length){var t=$("#profile_image_url_bg").data("target");$(t).attr("src",$("#profile_image_url_bg").attr("value")),$("#profile-picture-background-preview").attr("src",$("#profile_image_url_bg").attr("value")),$(t).show(),$("button#add-profile-picture-background").text("CHANGE PICTURE")}}},MenuHover={setup:function(){$("body").on("click","a#login-dropdown",function(t){t.stopPropagation(),$(".header-login-container").toggleClass("active")}).on("click",".header-login-container",function(t){t.stopPropagation()}).on("click","a.menu-trigger",function(t){t.stopPropagation();var e="."+$(this).attr("rel");$(e).toggleClass("active")}).on("mouseup",function(t){var e=$("ul.profile-menu");$("li.profile-menu-container a.menu-trigger").is(t.target)||e.is(t.target)||0!==e.has(t.target).length||e.removeClass("active")}).on("mouseup",function(t){container=$("div.header-login-container"),trigger=$("a#login-dropdown"),trigger.is(t.target)||container.is(t.target)||0!==container.has(t.target).length||container.removeClass("active")}).click(function(){$(".header-login-container.active").removeClass("active"),$(".profile-menu.active").removeClass("active")})}},ButtonCode={setup:function(){$("#button-code-heading").click(function(){$(this).hasClass("button-code-active")?($(this).removeClass("button-code-active"),$(this).parent().find(".button-code").slideUp("fast"),$(this).parent().find(".button-code").css("border-bottom","none"),$(this).find(".icon-expand-code").css("background-image","url(img/icon-expand.png)")):($(this).addClass("button-code-active"),$(this).parent().find(".button-code").css("border-bottom","1px solid #bdc3c7"),$(this).parent().find(".button-code").slideDown("fast"),$(this).find(".icon-expand-code").css("background-image","url(img/icon-contract.png)"))})},setupClipboardCopy:function(t){$(t).on("mouseover",function(){$(this).off("mouseover"),$(this).find("[data-clipboard-target]").each(function(){var t=$($(this).attr("data-clipboard-target"));$(this).zclip({path:"/theme/flatui/js/lib/ZeroClipboard.swf",copy:$.trim($(t).text())})})})}},ProductPage={setup:function(){$(".dropdown-toggle").dropdown(),$(".scroll-pane").jScrollPane({mouseWheelSpeed:30,animateScroll:!0}),$(".love-it").on("click",function(){this_img_src=$(this).find("img").attr("src"),$(this).hasClass("no-login")||"/theme/flatui/img/icon-like-color.png"==this_img_src||$(this).prev(".share-it").trigger("click")}),$(".payment-options").find(".options").find("span.option").on("click",function(){var t=$(this).attr("title"),e=$(".payment-options").find('input[type="number"]');e.attr("value",t).val(t),e.focus(),$(".options").find(".selected").removeClass("selected"),$(this).addClass("selected")})},setupPlingButton:function(){$("#pling-amount").on("focus",function(){$("#pling-amount").popover("destroy")}),$("#pling-start").on("click",function(t){return validateElement=$("#pling-amount"),validateValue=validateElement.val(),""==validateValue||isNaN(parseFloat(validateValue))||!isFinite(validateValue)?(t.preventDefault(),$("#pling-amount").popover({placement:"bottom",html:"true",content:'
Donation must be a numeric value.
'}).popover("show"),!1):(minValue=validateElement.attr("min"),parseFloat(validateValue)×
Donation must be equal or greater than '+minValue+".
"}).popover("show"),!1):(maxValue=validateElement.attr("max"),parseFloat(validateValue)>parseFloat(maxValue)?(t.preventDefault(),$("#pling-amount").popover({placement:"bottom",html:"true",content:'
Donation must be smaller or equal than '+maxValue+".
"}).popover("show"),!1):void 0))})}},SlideShowRender={setup:function(){$("#slideshow-container").find("img:first").addClass("active"),$("#slideshow-container").find("#navigation").find("a:first").addClass("active")}},ProductSlideShow={setup:function(){$("#slideshow-container").find("#arrows").find("a").on("click",function(t){var e=$(this).attr("id"),a=$("#slideshow-container #slides"),i=a.find("img.active"),n=i.attr("rel"),o=$("#slideshow-container").find("#navigation").find("a.active");if("prev"==e){var r=parseInt(n)-parseInt(1),s=$("#slideshow-container").find('img[rel="'+r+'"]'),l=$("#slideshow-container").find("#navigation").find('a[rel="'+r+'"]');1==!s.size()&&(s=a.find("img:last"),l=$("#slideshow-container").find("#navigation").find("a:last"))}else if("next"==e){var d=parseInt(n)+parseInt(1);s=$("#slideshow-container").find('img[rel="'+d+'"]'),l=$("#slideshow-container").find("#navigation").find('a[rel="'+d+'"]'),1==!s.size()&&(s=a.find("img:first"),l=$("#slideshow-container").find("#navigation").find("a:first"))}i.removeClass("active"),o.removeClass("active"),s.addClass("active"),l.addClass("active")}),$("#slideshow-container").find("#navigation").find("a").on("click",function(){var t=$(this).attr("rel"),e=$("#slideshow-container").find('img[rel="'+t+'"]');$("#slideshow-container").find("img.active").removeClass("active"),e.addClass("active"),$("#slideshow-container").find("#navigation").find("a.active").removeClass("active"),$(this).addClass("active")})}},SlideShow={setup:function(){slideShowInterval=setTimeout(function(){var t=$("#slideshow-container").find("img.active"),e=t.attr("rel"),a=parseInt(e)+parseInt(1),i=$("#slideshow-container").find('img[rel="'+a+'"]'),n=$("#slideshow-container").find("#navigation").find("a.active");t.removeClass("active"),n.removeClass("active"),1==i.size()?(i.addClass("active"),$("#slideshow-container").find("#navigation").find('a[rel="'+a+'"]').addClass("active")):($("#slideshow-container").find("img:first").addClass("active"),$("#slideshow-container").find("#navigation").find("a:first").addClass("active"))},4e3)}},Popuppanel={setup:function(){$("body").on("click","a.popuppanel",function(t){if("_blank"===$(this).attr("target"))console.log("dont prevent default");else{t.preventDefault();var e=$(this).attr("href");$.fancybox({hideOnContentClick:!0,autoScale:!0,cyclic:"true",transitionIn:"elastic",transitionOut:"elastic",type:"iframe",scrolling:"auto",helpers:{overlay:{locked:!1}},autoSize:!0,href:e,type:"ajax"})}})}},PlingsRedirect={setup:function(){window.location.hash?($link=$(window.location.hash),$link.trigger("click")):document.location.hash&&($link=$(document.location.hash),$link.trigger("click"))}},ShowPopups={setup:function(){window.location.hash&&(alert("Hash"),$('a[href="'+document.location.hash+'"]').trigger("click")),document.location.hash&&(alert("Hash"),$('a[href="'+document.location.hash+'"]').trigger("click"))}};$("body").on("mouseenter",".supporter-thumbnail",function(){$(this).popover("show")}),$("body").on("mouseleave",".supporter-thumbnail",function(){$(this).popover("hide")});var Partials={setup:function(){$("body").on("click","a.partial",function(t){t.preventDefault();var e=this.href,a=$(this).attr("data-target"),i=$(this).data("toggle"),n=$(this).attr("data-fragment");return $(a).load(e+" "+n,function(t,e,n){if("error"==e)if(401==n.status){if(t){var o=jQuery.parseJSON(t).login_url;window.location=o||"/login"}}else $(a).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.");i&&$(i).modal("show")}),!1})}},Opendownloadfile={setup:function(){$("body").on("click","a.opendownloadfile",function(t){t.preventDefault();var e=$(this).attr("data-file_id"),a=$(this).attr("data-file_type"),i=$(this).attr("data-file_name"),n=$(this).attr("data-file_size"),o=$(this).attr("data-project_id"),r=$(this).attr("data-link_type"),s=$(this).attr("data-is-external-link"),l=$(this).attr("data-has_torrent"),d=null,c="450";return"true"==s&&(d=$(this).attr("data-external_link"),c="500"),$.fancybox({hideOnContentClick:!0,autoScale:!1,scrolling:"no",cyclic:"true",transitionIn:"elastic",transitionOut:"elastic",type:"iframe",width:"600",height:c,iframe:{scrolling:"no"},fitToView:!1,autoSize:!1,id:"opendownloadfilepopup",helpers:{overlay:{locked:!1}},href:"/dl?file_id="+e+"&file_type="+a+"&file_name="+i+"&file_size="+n+"&has_torrent="+l+"&project_id="+o+"&link_type="+r+"&is_external="+s+"&external_link="+d}),!1})}},PartialsButton={setup:function(){$("body").on("click","Button.partialbutton",function(t){t.preventDefault();var e=$(this).attr("data-href"),a=$(this).attr("data-target"),i=$(this).data("toggle"),n=$(this).attr("data-fragment"),o=$('');return $(a).append(o),$(a).load(e+" "+n,function(t,e,n){if("error"==e)if(401==n.status){if(t){var o=jQuery.parseJSON(t).login_url;window.location=o||"/login"}}else $(a).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.");i&&$(i).modal("show")}),!1})}},PartialsButtonHeartDetail={setup:function(){$("body").on("click",".partialbuttonfollowproject",function(t){t.preventDefault();var e=$(this).attr("data-href"),a=$(this).attr("data-target"),i=$(this).attr("data-auth");if($(this).data("toggle"),$(this).attr("data-fragment"),i){if($("#like-product-modal").find("#loginuser").val()==$("#like-product-modal").find("#productcreator").val())return $("#like-product-modal").find("#votelabel").text("Project owner not allowed"),$("#like-product-modal").find(".modal-body").empty(),void $("#like-product-modal").modal("show");var n=$('');return $(a).prepend(n),$.ajax({url:e,cache:!1}).done(function(t){$(a).find(".spinning").remove(),"error"==t.status?$(a).html(t.msg):"delete"==t.action?($(a).find(".plingtext").html(t.cnt),$(a).find(".plingtext").addClass("heartnumberpurple"),$(a).find(".plingheart").removeClass("heartproject").addClass("heartgrey"),$(a).find(".plingheart").removeClass("fa-heart").addClass("fa-heart-o")):($(a).find(".plingtext").html(t.cnt),$(a).find(".plingtext").removeClass("heartnumberpurple"),$(a).find(".plingheart").removeClass("heartgrey").addClass("heartproject"),$(a).find(".plingheart").removeClass("fa-heart-o").addClass("fa-heart"))}),!1}$("#like-product-modal").modal("show")})}},PartialsButtonPlingProject={setup:function(){$("#plingbtn").hover(function(){$(this).attr("src","/images/system/pling-btn-hover.png")},function(){$(this).attr("src",$(this).attr("data-src"))}),$("body").on("click",".partialbuttonplingproject",function(t){t.preventDefault();var e=$(this).attr("data-href"),a=$(this).attr("data-target"),i=$(this).attr("data-auth"),n=$(this).attr("data-issupporter");if($(this).data("toggle"),$(this).attr("data-fragment"),i)return $("#like-product-modal").find("#loginuser").val()==$("#like-product-modal").find("#productcreator").val()?($("#like-product-modal").find("#votelabel").text("Project owner not allowed"),$("#like-product-modal").find(".modal-body").empty(),void $("#like-product-modal").modal("show")):n?($(a).find(".plingnum").html(''),$.ajax({url:e,cache:!1}).done(function(t){"error"==t.status?$(a).html(t.msg):"delete"==t.action?(0==t.cnt?$(a).find(".plingnum").html("Pling me"):$(a).find(".plingnum").html(t.cnt+" Plings"),$(a).find("#plingbtn").attr("src","/images/system/pling-btn-normal.png"),$(a).find("#plingbtn").attr("data-src","/images/system/pling-btn-normal.png")):($(a).find(".plingnum").html(t.cnt+" Plings"),$(a).find("#plingbtn").attr("src","/images/system/pling-btn-active.png"),$(a).find("#plingbtn").attr("data-src","/images/system/pling-btn-active.png"))}),!1):($("#like-product-modal").find("#votelabel").html('
To pling a product and help the artist please consider becoming a supporter. Thanks!

Become a supporter
'),void $("#like-product-modal").modal("show"));$("#like-product-modal").modal("show")})}},PartialsReview={setup:function(){$("body").on("click","a.partialreview",function(t){if(t.preventDefault(),this.href,$(this).attr("data-target"),$(this).data("toggle"),$(this).attr("data-fragment"),$("#review-product-modal").find("#loginuser").val()==$("#review-product-modal").find("#productcreator").val())return $("#review-product-modal").find("#votelabel").text("Project owner not allowed"),$("#review-product-modal").find(".modal-body").empty(),void $("#review-product-modal").modal("show");var e=$("#review-product-modal").find("#userrate").val();return $(this).hasClass("voteup")?1==e?($("#review-product-modal").find("#votelabel").empty().append(' is given already with comment:'),$("#review-product-modal").find("#commenttext").val($("#review-product-modal").find("#otxt").val()),$("#review-product-modal").find(":submit").text("Remove Rating")):($("#review-product-modal").find("input#voteup").val(1),$("#review-product-modal").find("#votelabel").empty().append(' Add Comment (min. 1 char):'),$("#review-product-modal").find("#commenttext").val("+"),$("#review-product-modal").find(":submit").text("Rate Now"),$("#review-product-modal").find("#commenttext").removeAttr("disabled"),$("#review-product-modal").find(":submit").css("display","block").removeAttr("disabled")):0==e?($("#review-product-modal").find("#votelabel").empty().append(' is given already with comment: '),$("#review-product-modal").find("#commenttext").val($("#review-product-modal").find("#otxt").val()),$("#review-product-modal").find(":submit").text("Remove Rating")):($("#review-product-modal").find("input#voteup").val(2),$("#review-product-modal").find("#votelabel").empty().append(' Add Comment (min. 5 char) Please explain the reason for downvote to help the creator to make it better '),$("#review-product-modal").find("#commenttext").val("-"),$("#review-product-modal").find("#commenttext").removeAttr("disabled"),$("#review-product-modal").find(":submit").removeAttr("disabled").css("display","block"),$("#review-product-modal").find(":submit").text("Rate Now")),$("#review-product-modal").modal("show"),$("#review-product-modal").hasClass("noid")&&setTimeout(function(){$("#review-product-modal").modal("hide")},2e3),!1})}},PartialsReviewDownloadHistory={setup:function(){$("body").on("click","button.partialReviewDownloadHistory",function(t){t.preventDefault();var e=$(this).attr("data-userrate");return $("#review-product-modal").find("#commenttext").val($(this).attr("data-comment")),$("#review-product-modal").find("#form_p").val($(this).attr("data-project")),$(this).hasClass("voteup")?1==e?($("#review-product-modal").find("#votelabel").empty().append(' is given already with comment:'),$("#review-product-modal").find(":submit").attr("disabled","disabled").css("display","none"),$("#review-product-modal").find("#commenttext").attr("disabled","disabled")):($("#review-product-modal").find("input#voteup").val(1),$("#review-product-modal").find("#votelabel").empty().append(' Add Comment (min. 1 char):'),$("#review-product-modal").find("#commenttext").val("+"),$("#review-product-modal").find("#commenttext").removeAttr("disabled"),$("#review-product-modal").find(":submit").css("display","block").removeAttr("disabled")):0==e?($("#review-product-modal").find("#votelabel").empty().append(' is given already with comment: '),$("#review-product-modal").find("#commenttext").attr("disabled","disabled"),$("#review-product-modal").find(":submit").attr("disabled","disabled").css("display","none")):($("#review-product-modal").find("input#voteup").val(2),$("#review-product-modal").find("#votelabel").empty().append(' Add Comment (min. 5 chars): '),$("#review-product-modal").find("#commenttext").val("-"),$("#review-product-modal").find("#commenttext").removeAttr("disabled"),$("#review-product-modal").find(":submit").removeAttr("disabled").css("display","block")),$("#review-product-modal").modal("show"),$("#review-product-modal").hasClass("noid")&&setTimeout(function(){$("#review-product-modal").modal("hide")},2e3),!1})}},CreateScoreRatingPopup={setup:function(){var t,e=0;$("select.rating-select").focus(function(){t=$(this),e=$(this).val()}).change(function(){var t=$(this).find("option:selected"),e=t.val(),a=t.text(),i=($(this).attr("data-userrate"),$(this).attr("data-comment"),$(this).attr("data-creator")),n=$("#score-product-modal").find("#loginuser").val();if(n){if(n==i)return $("#score-product-modal").find("#votelabel").text("Project owner not allowed"),$("#score-product-modal").find(".modal-body").empty(),$("#score-product-modal").find("#modal-btn-onsubmit").remove(),void $("#score-product-modal").modal("show");-1==e?$("#score-product-modal").find("#votelabel").empty().append("Remove Rating "):e<=5?($("#score-product-modal").find("#votelabel").empty().append('Add a review to your rating "'+a+'" (min. 5 chars) Please explain the reason for downvote to help the creator to make it better '),$("#score-product-modal").find("#voteup").val(2)):($("#score-product-modal").find("#votelabel").empty().append('Add a review to your rating "'+a+'" (min. 1 char):'),$("#score-product-modal").find("#voteup").val(1)),$("#score-product-modal").find("#form_p").val($(this).attr("data-project")),$("#score-product-modal").find(":submit").css("display","block").removeAttr("disabled"),$("#score-product-modal").find("#commenttext").removeAttr("disabled"),e>=1&&e<=3?$("#score-product-modal").find("#commenttext").val(""):$("#score-product-modal").find("#commenttext").val(a),$("#score-product-modal").find("#userscorevalue").val(e),"-1"==e?$("#score-product-modal").find(":submit").text("Remove Rating"):$("#score-product-modal").find(":submit").text("Rate Now"),$("#score-product-modal").modal("show")}else $("#score-product-modal").modal("show")}),$("#modal-btn-cancel").on("click",function(){$(t).find("option[value="+e+"]").prop("selected",!0),$("#score-product-modal").modal("hide")});var a=!1;$("#modal-btn-onsubmit").on("click",function(){a=!0}),$("#score-product-modal").on("hidden.bs.modal",function(){a||$(t).find("option[value="+e+"]").prop("selected",!0)})}},PartialForms={setup:function(){$("body").on("submit","form.partial",function(t){t.preventDefault(),t.stopImmediatePropagation(),$(this).find(":submit").attr("disabled","disabled"),$(this).find(":submit").css("white-space","normal");var e=$('');$(this).find(":submit").append(e);var a=$(this).attr("data-target"),i=$(this).attr("data-trigger");return console.log(this),jQuery.ajax({data:$(this).serialize(),url:this.action,type:this.method,error:function(){return $(a).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.
"),!1},success:function(t){return $(a).empty().html(t),$(a).find(i).trigger("click"),!1}}),!1})}},PartialJsonClone={setup:function(){$("body").on("submit","form.partialjsonclone",function(t){t.preventDefault(),t.stopImmediatePropagation();var e=$(this).attr("data-target"),a=($(this).attr("data-trigger"),$(this).attr("data-projectid"));return jQuery.ajax({data:$(this).serialize(),url:this.action,type:this.method,dataType:"json",error:function(){$(e).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.
")},success:function(t,e){$("form#product-report-clone").find("#clonePId").val(""),$("form#product-report-clone").find("#report-text").val(""),$("#report-product-clone-"+a).modal("hide");var i=$("#generic-dialog");i.find(".modal-header-text").empty(),i.find(".modal-body").empty().append(t.message),setTimeout(function(){i.modal("show")},900)}}),!1})}},PartialJson={setup:function(){$("body").on("submit","form.partialjson",function(t){t.preventDefault(),t.stopImmediatePropagation();var e=$(this).attr("data-target"),a=$(this).attr("data-trigger");return jQuery.ajax({data:$(this).serialize(),url:this.action,type:this.method,dataType:"json",error:function(){$(e).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.
")},success:function(t,i){t.redirect?window.location=t.redirect:(e&&$(e).empty().html(t.message),a&&$(e).find(a).trigger("click"))}}),!1})}},PartialJsonFraud={setup:function(){$("body").on("submit","form.partialjsonfraud",function(t){t.preventDefault(),t.stopImmediatePropagation();var e=$(this).attr("data-target"),a=$(this).attr("data-trigger");return $("form.partialjsonfraud").find("#report-text").val().length<5?($("form.partialjsonfraud").find("p.warning").remove(),$("form.partialjsonfraud").find("#report-text").parent().append('

at least 5 chars

'),!1):(jQuery.ajax({data:$(this).serialize(),url:this.action,type:this.method,dataType:"json",error:function(){$(e).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.
")},success:function(t,i){t.redirect?window.location=t.redirect:(e&&$(e).empty().html(t.message),a&&$(e).find(a).trigger("click"))}}),!1)})}},PartialPayPal={setup:function(){this.initPayPalForm(),this.initPayPalFee()},initPayPalForm:function(){$("body").on("submit","form.partialpaypal",function(t){t.preventDefault(),t.stopImmediatePropagation();var e=$(this).attr("data-target"),a=$(this).attr("data-trigger");return jQuery.ajax({data:$(this).serialize(),url:this.action,type:this.method,error:function(t,e,a){$("#modal-dialog").modal("hide");var i=$('');i.html($(t.responseText).filter(".page-container").children()),i.append(''),setTimeout(function(){i.modal("show")},900)},success:function(t){$(e).empty().html(t),$(e).find(a).trigger("click"),$("#modal-dialog").modal("hide")}}),!1})},initPayPalFee:function(){$("body").on("change","#amount_plings",function(t){PartialPayPal.changeFee()})},changeFee:function(){var t=document.getElementById("amount_plings"),e=parseFloat(t.value),a=this.round(.05*e,2),i=.03*(a+e+.3)+.3,n=e+a+(i=this.round(i,2));document.getElementById("pling_fee").value=this.round(a,2).toFixed(2),document.getElementById("paypal_fee").value=this.round(i,2).toFixed(2),document.getElementById("sum").value=this.round(n,2)},round:function(t,e){var a=Math.pow(10,e);return Math.round(t*a)/a}},PartialCommentReviewForm={setup:function(){this.initForm()},initForm:function(){$("body").on("submit","form.product-add-comment-review",function(t){t.preventDefault(),t.stopImmediatePropagation();var e=$.trim($("#commenttext").val());if(2==$("#voteup").val()&&e.length<5)0==$("#review-product-modal").find("#votelabel").find(".warning").length&&$("#review-product-modal").find("#votelabel").append("
Please give a comment, thanks!");else{if(!(e.length<1)){$(this).find(":submit").attr("disabled","disabled"),$(this).find(":submit").css("white-space","normal");var a=$('');return $(this).find(":submit").append(a),jQuery.ajax({data:$(this).serialize(),url:this.action,type:this.method,error:function(t,e,a){$("#review-product-modal").modal("hide");var i=$("#generic-dialog");i.modal("hide"),i.find(".modal-header-text").empty().append("Please try later."),i.find(".modal-body").empty().append("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.
"),setTimeout(function(){i.modal("show")},900)},success:function(t){$("#review-product-modal").modal("hide"),location.reload()}}),!1}0==$("#review-product-modal").find("#votelabel").find(".warning").length&&$("#review-product-modal").find("#votelabel").append("
Please give a comment, thanks!")}})}},PartialCommentReviewFormNew={setup:function(){this.initForm()},initForm:function(){$("body").on("submit","form.product-add-comment-review-new",function(t){t.preventDefault(),t.stopImmediatePropagation();var e=$.trim($("#score-product-modal").find("#commenttext").val());if(2==$("#score-product-modal").find("#voteup").val()&&e.length<5)0==$("#score-product-modal").find("#votelabel").find(".warning").length&&$("#score-product-modal").find("#votelabel").append("
Please give a comment, thanks!");else{if(!(e.length<1)){$(this).find(":submit").attr("disabled","disabled"),$(this).find(":submit").css("white-space","normal");var a=$('');return $(this).find(":submit").append(a),jQuery.ajax({data:$(this).serialize(),url:this.action,type:this.method,error:function(t,e,a){$("#score-product-modal").modal("hide");var i=$("#generic-dialog");i.modal("hide"),i.find(".modal-header-text").empty().append("Please try later."),i.find(".modal-body").empty().append("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.
"),setTimeout(function(){i.modal("show")},900)},success:function(t){$("#score-product-modal").modal("hide"),location.reload()}}),!1}0==$("#score-product-modal").find("#votelabel").find(".warning").length&&$("#score-product-modal").find("#votelabel").append("
Please give a comment, thanks!")}})}},PartialFormsAjax={setup:function(){var t=$("form.partialajax"),e=t.attr("data-target"),a=t.attr("data-trigger");$(t).find(":submit").on("click",function(e){e.preventDefault(),$(t).find(":submit").attr("disabled","disabled"),$(t).find(":submit").css("white-space","normal");var a=$('');$(t).find(":submit").append(a),$(t).submit()}),t.ajaxForm({error:function(){$(e).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.
")},success:function(t){$(e).empty().html(t),$(e).find(a).trigger("click")}})}},AjaxFormWithProgress={setup:function(t){var e=$(t),a=e.attr("data-target"),i=e.attr("data-trigger"),n=e.find(".progress-bar"),o=e.find(".progress-percent");$(e).find(":submit").on("click",function(t){t.preventDefault(),$(e).find(":submit").attr("disabled","disabled"),$(e).find(":submit").css("white-space","normal");var a=$('');$(e).find(":submit").append(a),$(e).submit()}),e.ajaxForm({beforeSend:function(){n.parent().removeClass("hidden"),n.width("0%"),o.html("0%")},uploadProgress:function(t,e,a,i){var r=i+"%";n.width(r),o.html(r)},error:function(){$(a).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.
")},success:function(t){n.width("100%"),o.html("100%"),$(a).empty().html(t),$(a).find(i).trigger("click")}})}},PartialFormsAjaxMemberBg={setup:function(){var t=$("form.partialajaxbg"),e=t.attr("data-target"),a=t.attr("data-trigger");$(t).find(":submit").on("click",function(e){e.preventDefault(),$(t).find(":submit").attr("disabled","disabled"),$(t).find(":submit").css("white-space","normal");var a=$('');$(t).find(":submit").append(a),$(t).submit()}),t.ajaxForm({error:function(){$(e).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.
")},success:function(t){$(e).empty().html(t),$(e).find(a).trigger("click")}})}},AjaxForm={setup:function(t,e){var a=$(e);$("body").on("submit",t,function(t){return t.preventDefault(),t.stopImmediatePropagation(),$(this).find("button").attr("disabled","disabled"),$(this).find(".glyphicon.glyphicon-send").removeClass("glyphicon-send").addClass("glyphicon-refresh spinning"),jQuery.ajax({data:$(this).serialize(),url:this.action,type:this.method,dataType:"json",error:function(t,e,a){var i=JSON&&JSON.parse(t.responseText)||$.parseJSON(t.responseText),n=$("#generic-dialog");n.modal("hide"),n.find(".modal-header-text").empty().append(i.title),n.find(".modal-body").empty().append(i.message),setTimeout(function(){n.modal("show")},900)},success:function(t){"ok"==t.status&&$(a).empty().html(t.data),"error"==t.status&&(""!=t.message?alert(t.message):alert("Service is temporarily unavailable."))}}),!1})}},WidgetModalAjax={setup:function(){$(".my-product-item").find("a.widget-button").on("click",function(){var t=$(this).attr("rel"),e=t.split("product")[1],a=$(".modal-body#widget-code-"+t);$.ajax({url:"/widget/config/"+e,type:"html",success:function(t){a.prepend(t),angular.bootstrap(a,["widgetApp"])}})})}},LoginContainer={update:function(){Date.now||(Date.now=function(){return(new Date).getTime()});var t="/authorization/htmllogin?"+(Date.now()/1e3|0);$("#login_container").load(t,function(t,e,a){})}},RssNews={setup:function(){if(0==$("#rss-feeds").length)return!1;$.getJSON("/json/news",function(t){var e="";$.each(t.posts,function(t,a){if(t>=3)return!1;var i=moment(a.date);e+='
'+a.title+'
'+i.format("MMM DD YYYY")+''+a.comments.length+" Comment"+(a.comments.length>1?"s":"")+"
"}),$("#rss-feeds").html(e)})}},BlogJson={setup:function(){$.ajax("/json/forum").then(function(t){var e=t.topic_list.topics,a="",i=3;e.sort(function(t,e){return new Date(e.last_posted_at)-new Date(t.last_posted_at)}),$.each(e,function(t,e){if(!e.pinned){var n=e.timeago,o="Reply",r=e.posts_count-1;o=0==r?"Replies":1==r?"Reply":"Replies",a+='
'+e.title+'
'+n+''+r+" "+o+"
",i--}if(0==i)return!1}),$("#blogJson").html(a)})}},GitlabNewProjectsJson={setup:function(t){$.ajax("/json/gitlabnewprojects").then(function(e){var a=e,i="";$.each(a,function(e,a){var n=a.timeago;i+='"}),$("#lastgitprojects").html(i)})}};function showGitUserAvatar(t,e,a){var i=t+"/api/v4/users?username="+e;$.ajax(i).then(function(t){var i=t;$.each(i,function(t,i){$img=$("#avatar_"+e+"_"+a),$img.attr("src",i.avatar_url)})})}var ProductDetailCarousel={setup:function(){$(".carousel-inner img").each(function(t){$(this).on("click",function(){$("#product-main-img-container").hasClass("imgfull")?$("#product-main-img-container").prependTo($("#product-main")):$("#product-main-img-container").prependTo($("#product-page-content")),$("#product-main-img-container").toggleClass("imgfull"),$("#product-main-img-container").toggleClass("imgsmall")})})}},AppimagequestionOnClick={setup:function(t){$("body").on("click","i.appimagequestion",function(t){var e=$("#generic-dialog");e.modal("show"),e.find(".modal-header-text").empty().append("AppImage Info"),e.find(".modal-body").empty().append("")})}},ProductDetailBtnGetItClick={setup:function(t){$("body").on("click","button#project_btn_download",function(e){$.fancybox({hideOnContentClick:!0,autoScale:!0,cyclic:"true",transitionIn:"elastic",transitionOut:"elastic",type:"ajax",helpers:{overlay:{locked:!1}},autoSize:!0,href:"/p/"+t+"/ppload"})})}},GhnsExcludedClick={setup:function(t){$("body").on("click","#ghns_excluded-this-checkbox",function(e){e.stopPropagation();var a=1,i="",n="";this.checked?(a=1,i="Please specify why this product should be excluded (min 5 chars) :",n=" ghns exclude"):(a=0,i="Please specify why this product should be included (min 5 chars) :",n=" ghns include");var o=$("#generic-dialog");return o.modal("show"),o.find(".modal-header-text").empty().append("GHNS "),o.find(".modal-body").empty().append(i+'

"),$("body").on("click","#btn-ghns-excluded",function(){var t=$("#ghns-excluded-text").val();if(t.length<5)return alert("min 5 chars"),!1;var e=$(this).attr("data-projectid"),a=$(this).attr("data-status");$.ajax({url:"/backend/project/doghnsexclude",method:"POST",data:{project_id:e,ghns_excluded:a,msg:t},success:function(t){var e=$("#generic-dialog");0==a?(e.find(".modal-body").empty().append("Project is successfully included into GHNS"),$("#ghns_excluded-this-checkbox").prop("checked",!1)):(e.find(".modal-body").empty().append("Project is successfully excluded into GHNS"),$("#ghns_excluded-this-checkbox").prop("checked",!0)),setTimeout(function(){e.modal("hide")},1e3)},error:function(){alert("Service is temporarily unavailable.")}})}),!1})}},AboutMeMyProjectsPaging={setup:function(){$(window).scroll(function(){if($("footer").offset().top-($(window).scrollTop()+$(window).height())<300){if(!$("button#btnshowmoreproducts").length)return;let t='',e=$("button#btnshowmoreproducts").attr("data-page");$("button#btnshowmoreproducts").remove(),$url=window.location.href,target=$(".about-me-details").find("li.active").find("a").attr("href"),"#user-original-products"==target&&($url+="showoriginal");let a=$("

").append(t).load($url,{projectpage:e},function(t,e,a){if("error"==e)if(401==a.status){if(t){var i=jQuery.parseJSON(t).login_url;window.location=i||"/login"}}else $(target).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.")});$(target).append(a)}})}},AboutMeMyProjectsPagingButton={setup:function(){$("body").on("click","button#btnshowmoreproducts",function(t){let e=$(this).attr("data-page");$(this).remove(),$url=window.location.href,target=$(".about-me-details").find("li.active").find("a").attr("href"),"#user-original-products"==target&&($url+="showoriginal");let a=$("
").append('').load($url,{projectpage:e},function(t,e,a){if("error"==e)if(401==a.status){if(t){var i=jQuery.parseJSON(t).login_url;window.location=i||"/login"}}else $(target).empty().html("Service is temporarily unavailable. Our engineers are working quickly to resolve this issue.
Find out why you may have encountered this error.")});$(target).append(a)})}},ProductDetailCommentTooltip={setup:function(){TooltipUser.setup("tooltipuser","right")}};function generateTooltipster(t,e){$(t).each(function(){$(this).tooltipster({side:e,theme:["tooltipster-light","tooltipster-light-customized"],contentCloning:!0,contentAsHTML:!0,interactive:!0,functionBefore:function(t,e){var a=$(e.origin),i=a.attr("data-user");!0!==a.data("loaded")&&$.get("/member/"+i+"/tooltip/",function(e){var i=e.data,n='
'+i.username+' '+i.countrycity+'
'+i.cntProjects+' products
'+i.totalComments+' comments
Likes '+i.cntLikesGave+' products
Got '+i.cntLikesGot+' Likes
Last time active : '+i.lastactive_at+'
Member since : '+i.created_at+"
";n+="
",t.content(n),a.data("loaded",!0)})}})})}var TooltipUser={setup:function(t,e){$("."+t).tooltipster({side:e,theme:["tooltipster-light","tooltipster-light-customized"],contentCloning:!0,contentAsHTML:!0,interactive:!0,functionBefore:function(t,e){var a=$(e.origin),i=a.attr("data-user");!0!==a.data("loaded")&&$.get("/member/"+i+"/tooltip/",function(e){var i=e.data,n='
'+i.username+' '+i.countrycity+'
'+i.cntProjects+' products
'+i.totalComments+' comments
Likes '+i.cntLikesGave+' products
Got '+i.cntLikesGot+' Likes
Last time active : '+i.lastactive_at+'
Member since : '+i.created_at+"
";n+="
",t.content(n),a.data("loaded",!0)})}})}};function generateTooltipUserPlings(t,e){$(t).each(function(){$(this).tooltipster({side:e,theme:["tooltipster-light","tooltipster-light-customized"],contentCloning:!0,contentAsHTML:!0,interactive:!0,functionBefore:function(t,e){var a=$(e.origin),i=a.attr("data-user");!0!==a.data("loaded")&&$.get("/plings/tooltip/id/"+i,function(e){var i='
';$.each(e.data,function(t,e){if(t>10)return!1;e.profile_image_url.indexOf("http")<0&&(e.profile_image_url="https://cn.opendesktop.org/cache/40x40-2/img/"+e.profile_image_url),e.profile_image_url.indexOf(".gif")>0&&(e.profile_image_url="https://cn.opendesktop.org/img/"+e.profile_image_url),i=i+'
'+e.username+"
"}),i+="
",t.content(i),a.data("loaded",!0)})}})})}var TooltipUserPlings={setup:function(t,e){$("."+t).tooltipster({side:e,theme:["tooltipster-light","tooltipster-light-customized"],contentCloning:!0,contentAsHTML:!0,interactive:!0,functionBefore:function(t,e){var a=$(e.origin),i=a.attr("data-user");!0!==a.data("loaded")&&$.get("/plings/tooltip/id/"+i,function(e){var i='
';$.each(e.data,function(t,e){if(t>10)return!1;e.profile_image_url.indexOf("http")<0&&(e.profile_image_url="https://cn.opendesktop.org/cache/40x40-2/img/"+e.profile_image_url),e.profile_image_url.indexOf(".gif")>0&&(e.profile_image_url="https://cn.opendesktop.org/img/"+e.profile_image_url),i=i+'
'+e.username+"
"}),i+="
",t.content(i),a.data("loaded",!0)})}})}},AboutMePage={setup:function(t){var e=t+"'s Profile "+$(document).prop("title");$(document).prop("title",e)}},InitActiveHashTab={setup:function(){var t=document.location.hash;$('a[href="'+t+'"]')&&$('a[href="'+t+'"]').tab("show")}},AboutmeTab={setup:function(){$("body").on("click","a.aboutmetab",function(t){t.preventDefault();var e=$(this).attr("href"),a=$(this).attr("data-href");0==$(e).find(".product").length&&$(e).append('').load(a,function(){})})}},CommunityTabToplistMemberScrollPaging={setup:function(t,e){$(window).scroll(function(){if($("footer").offset().top-($(window).scrollTop()+$(window).height())<300){if(!$("button#toplistmemberscrollshowmore").length)return;var a=$("button#toplistmemberscrollshowmore").attr("data-page");$("button#toplistmemberscrollshowmore").remove();var i=e+"/nopage/1/page/"+a,n=$('
');$(t).find(".product-list").append(n),$(n).load(i,function(){generateTooltipster($(n).find(".tooltipuser"),"right")})}})}},CommunityTab={setup:function(){$("body").on("click","a.communitytab",function(t){t.preventDefault();var e=$(this).attr("href"),a=$(this).attr("data-href");0==$(e).find(".list").find(".user").length&&$(e).find(".list").append('').load(a,function(){generateTooltipster($(e).find(".tooltipuser"),"right"),$(e).find(".tooltipuserplings").length>0&&generateTooltipUserPlings($(e).find(".tooltipuserplings"),"right"),"#toplistMemberPanel"==e&&CommunityTabToplistMemberScrollPaging.setup(e,a),$(e).find(".opendesktopwidgetpager span").each(function(t){$(this).on("click",function(){$(this).parent().addClass("active").siblings().removeClass("active");var t=a+"/nopage/1/page/"+$(this).html();$(e).find(".product-list").html(""),$(e).find(".product-list").load(t,function(){generateTooltipster($(e).find(".tooltipuser"),"right"),$(e).find(".tooltipuserplings").length>0&&generateTooltipUserPlings($(e).find(".tooltipuserplings"),"right")})})})})});var t=document.location.hash;$('a[href="'+t+'"]').length>0?($('a[href="'+t+'"]').tab("show"),$('a[href="'+t+'"]').trigger("click")):(t="#supportersPanel",$('a[href="'+t+'"]').trigger("click")),$("body").on("mouseenter",".product-thumbnail-startpage",function(){$(this).popover("show")}),$("body").on("mouseleave",".product-thumbnail-startpage",function(){$(this).popover("hide")})}},TagingProduct={setup:function(){$("input[name=tagsuser]").tagify({whitelist:["good","great"],autocomplete:!0}).on("remove",function(t,e){console.log("removed",e)}).on("add",function(t,e){console.log("added",e)})}},TagingProductSelect2={setup:function(){$.fn.select2.amd.require(["select2/selection/search"],function(t){t.prototype.searchRemoveChoice=function(t,e){this.trigger("unselect",{data:e}),this.$search.val(""),this.handleSearch()}},null,!0);var t=$(".taggingSelect2").select2({placeholder:"Add Tags here ...",tags:!0,tokenSeparators:[","," "],minimumInputLength:3,maximumSelectionLength:5,width:"resolve",ajax:{url:"/tag/filter",dataType:"json",type:"GET",delay:500,processResults:function(t){return{results:t.data.tags}}}});t.on("select2:select",function(e){var a=e.params.data;$("#tagsuserselect").attr("data-pid"),t.parent().find("ul.select2-selection__rendered").find("li.select2-selection__choice").length>5?t.find("option[value='"+a.id+"']").remove():(new RegExp("^[0-9A-Za-z_.-]+$").test(a.text)||(t.find("option[value='"+a.id+"']").remove(),alert("Must be letter or number and can include hyphens")),a.text.length>10&&(t.find("option[value='"+a.id+"']").remove(),alert("Max. length 45 chars")))})}},TagingProductDetail={setup:function(){TagingProductDetailSelect2.setup(),$("body").on("click","button.topic-tags-btn",function(t){if($(this).toggleClass("Done"),$(".product_category").find(".usertagslabel").remove(),$(".tagsuserselectpanel").toggle(),"Done"==$(this).text()){$(this).text("Manage tags");var e="",a=$("li.select2-selection__choice");$.each(a,function(t,a){e=e+''+a.title+""}),$(".product_category").find(".topicslink").html(e)}else $(this).text("Done")})}},TagingProductDetailSelect2={setup:function(){$.fn.select2.amd.require(["select2/selection/search"],function(t){t.prototype.searchRemoveChoice=function(t,e){this.trigger("unselect",{data:e}),this.$search.val(""),this.handleSearch()}},null,!0);var t=$("#tagsuserselect").select2({placeholder:"Input tags please...",tags:!0,minimumInputLength:3,closeOnSelect:!0,maximumSelectionLength:5,tokenSeparators:[","," "],ajax:{url:"/tag/filter",dataType:"json",type:"GET",delay:500,processResults:function(t){return{results:t.data.tags}}}});t.on("select2:select",function(e){var a=e.params.data,i=$("#tagsuserselect").attr("data-pid");$.post("/tag/add",{p:i,t:a.id}).done(function(e){"error"==e.status?($("span.topic-tags-saved").css({color:"red"}).html(e.message).show().delay(2e3).fadeOut(),t.find("option[value='"+e.data.tag+"']").last().remove()):$("span.topic-tags-saved").css({color:"green"}).html(' Saved').show().delay(1e3).fadeOut()})}),t.on("select2:unselect",function(t){var e=t.params.data,a=$("#tagsuserselect").attr("data-pid");$.post("/tag/del",{p:a,t:e.id}).done(function(t){console.log(t),$("span.topic-tags-saved").css({color:"green"}).html(''+t.message).show().delay(1e3).fadeOut()})})}},TagingLoopMyProducts={setup:function(){TagingLoopMyProductsSelect2.setup(),$("body").on("click","button.topic-tags-btn",function(t){if($(this).toggleClass("Done"),$(this).parent().find(".topicsuser").html(""),$(this).parent().find(".tagsuserselectpanel").toggle(),"Done"==$(this).text()){$(this).text("Manage tags");var e="",a=$(this).parent().find("li.select2-selection__choice");$.each(a,function(t,a){e=e+''+a.title+""}),$(this).parent().find(".topicsuser").html(e)}else $(this).text("Done")})}},TagingLoopMyProductsSelect2={setup:function(){$.fn.select2.amd.require(["select2/selection/search"],function(t){t.prototype.searchRemoveChoice=function(t,e){this.trigger("unselect",{data:e}),this.$search.val(""),this.handleSearch()}},null,!0);var t=$(".taggingSelect2").select2({placeholder:"Input tags please...",tags:!0,minimumInputLength:3,closeOnSelect:!0,maximumSelectionLength:5,tokenSeparators:[","," "],ajax:{url:"/tag/filter",dataType:"json",type:"GET",delay:500,processResults:function(t){return{results:t.data.tags}}}});t.on("select2:select",function(e){var a=e.params.data,i=$(this).attr("id").replace("tagsuserselect","");$.post("/tag/add",{p:i,t:a.id}).done(function(e){"error"==e.status?($("#topic-tags-saved"+i).css({color:"red"}).html(e.message).show().delay(2e3).fadeOut(),t.find("option[value='"+e.data.tag+"']").last().remove()):"existing"==e.status?$("#topic-tags-saved"+i).css({color:"red"}).html(e.message).show().delay(2e3).fadeOut():$("#topic-tags-saved"+i).css({color:"green"}).html(' Saved').show().delay(1e3).fadeOut()})}),t.on("select2:unselect",function(t){var e=t.params.data,a=$(this).attr("id").replace("tagsuserselect","");$.post("/tag/del",{p:a,t:e.id}).done(function(t){$("#topic-tags-saved"+a).css({color:"green"}).html(''+t.message).show().delay(1e3).fadeOut()})})}},productRatingToggle={setup:function(){$("#showRatingAll").on("click",function(){$("#ratings-panel").find(".spinning").show(),setTimeout(function(){$("#ratings-panel").find(".spinning").hide()},500),$(".btnRateFilter").removeClass("activeRating"),$(this).addClass("activeRating"),$(".productRating-rows").show(),$(".productRating-rows-inactive").show()}),$("#showRatingActive").on("click",function(){$("#ratings-panel").find(".spinning").show(),setTimeout(function(){$("#ratings-panel").find(".spinning").hide()},500),$(".btnRateFilter").removeClass("activeRating"),$(this).addClass("activeRating"),$(".productRating-rows").show(),$(".productRating-rows-inactive").hide()}),$("#showRatingUpvotes").on("click",function(){$("#ratings-panel").find(".spinning").show(),setTimeout(function(){$("#ratings-panel").find(".spinning").hide()},500),$(".btnRateFilter").removeClass("activeRating"),$(this).addClass("activeRating"),$(".productRating-rows").show(),$(".clsDownvotes").hide(),$(".productRating-rows-inactive").hide()}),$("#showRatingDownvotes").on("click",function(){$("#ratings-panel").find(".spinning").show(),setTimeout(function(){$("#ratings-panel").find(".spinning").hide()},500),$(".btnRateFilter").removeClass("activeRating"),$(this).addClass("activeRating"),$(".productRating-rows").show(),$(".productRating-rows-inactive").hide(),$(".clsUpvotes").hide()})}},FilterBrowseOriginalFn={setup:function(){$("body").on("click","input#filter_browse_original",function(t){var e=$(this).is(":checked"),a=window.location.href;a.indexOf("browse")<0&&(a+="/browse/"),a.indexOf("filteroriginal")>0&&(a=a.substring(0,a.indexOf("filteroriginal"))),window.location.href=e?a+"filteroriginal/1":a+"filteroriginal/0"})}},FilterBrowseTagGroupFn={setup:function(){$("body").on("change","select.filter_browse_tag_group",function(t){var e=$(this).val(),a=$(this).attr("data_group_id");$.ajax({url:"/explore/savetaggroupfilter?group_id="+a+"&tag_id="+e,cache:!1}).done(function(t){var e=window.location.href;window.location.href=e})})}},PagedetailModeratorDeprecated={setup:function(t){if(0==$("#product-deprecated-checkbox").length)return!1;$("body").on("click","#product-deprecated-checkbox",function(e){e.stopPropagation();var a=$(this).is(":checked"),i=0,n="/backend/project/dodeprecated?project_id="+t+"&product_deprecated="+(i=a?1:0);$.ajax({url:n,success:function(t){0==i?(alert("Project deprecated is successfully removed"),$("#product-deprecated-checkbox").prop("checked",!1)):(alert("Project is successfully marked as deprecated"),$("#product-deprecated-checkbox").prop("checked",!0))},error:function(){alert("Service is temporarily unavailable.")}})})}}; \ No newline at end of file diff --git a/httpdocs/theme/react/bundle/home-main-container-bundle.js b/httpdocs/theme/react/bundle/home-main-container-bundle.js index c3c2e0188..af5bbf4c0 100644 --- a/httpdocs/theme/react/bundle/home-main-container-bundle.js +++ b/httpdocs/theme/react/bundle/home-main-container-bundle.js @@ -1,50 +1,50 @@ -!function(e){var t={};function n(r){if(t[r])return t[r].exports;var a=t[r]={i:r,l:!1,exports:{}};return e[r].call(a.exports,a,a.exports,n),a.l=!0,a.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)n.d(r,a,function(t){return e[t]}.bind(null,a));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=44)}([function(e,t,n){"use strict";e.exports=n(17)},function(e,t,n){"use strict";var r=n(6),a=n(28),o=Object.prototype.toString;function l(e){return"[object Array]"===o.call(e)}function i(e){return null!==e&&"object"==typeof e}function u(e){return"[object Function]"===o.call(e)}function c(e,t){if(null!=e)if("object"!=typeof e&&(e=[e]),l(e))for(var n=0,r=e.length;n=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}(e,["date","formatter","component","live","minPeriod","maxPeriod","title","now"]),b=(0,u.default)(t).valueOf();if(!b)return null;var g=s(),E=Math.round(Math.abs(g-b)/1e3),w=b=200&&e<300}};u.headers={common:{Accept:"application/json, text/plain, */*"}},r.forEach(["delete","get","head"],(function(e){u.headers[e]={}})),r.forEach(["post","put","patch"],(function(e){u.headers[e]=r.merge(o)})),e.exports=u}).call(this,n(28))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}(e,["date","formatter","component","live","minPeriod","maxPeriod","title","now"]),b=(0,u.default)(t).valueOf();if(!b)return null;var g=s(),E=Math.round(Math.abs(g-b)/1e3),w=b=200&&e<300}};u.headers={common:{Accept:"application/json, text/plain, */*"}},r.forEach(["delete","get","head"],(function(e){u.headers[e]={}})),r.forEach(["post","put","patch"],(function(e){u.headers[e]=r.merge(o)})),e.exports=u}).call(this,n(33))},function(e,t,n){"use strict";var r=n(1),a=n(35),o=n(7),l=n(37),i=n(38),u=n(11);e.exports=function(e){return new Promise((function(t,c){var s=e.data,f=e.headers;r.isFormData(s)&&delete f["Content-Type"];var p=new XMLHttpRequest;if(e.auth){var d=e.auth.username||"",m=e.auth.password||"";f.Authorization="Basic "+btoa(d+":"+m)}if(p.open(e.method.toUpperCase(),o(e.url,e.params,e.paramsSerializer),!0),p.timeout=e.timeout,p.onreadystatechange=function(){if(p&&4===p.readyState&&(0!==p.status||p.responseURL&&0===p.responseURL.indexOf("file:"))){var n="getAllResponseHeaders"in p?l(p.getAllResponseHeaders()):null,r={data:e.responseType&&"text"!==e.responseType?p.response:p.responseText,status:p.status,statusText:p.statusText,headers:n,config:e,request:p};a(t,c,r),p=null}},p.onabort=function(){p&&(c(u("Request aborted",e,"ECONNABORTED",p)),p=null)},p.onerror=function(){c(u("Network Error",e,null,p)),p=null},p.ontimeout=function(){c(u("timeout of "+e.timeout+"ms exceeded",e,"ECONNABORTED",p)),p=null},r.isStandardBrowserEnv()){var h=n(39),y=(e.withCredentials||i(e.url))&&e.xsrfCookieName?h.read(e.xsrfCookieName):void 0;y&&(f[e.xsrfHeaderName]=y)}if("setRequestHeader"in p&&r.forEach(f,(function(e,t){void 0===s&&"content-type"===t.toLowerCase()?delete f[t]:p.setRequestHeader(t,e)})),e.withCredentials&&(p.withCredentials=!0),e.responseType)try{p.responseType=e.responseType}catch(t){if("json"!==e.responseType)throw t}"function"==typeof e.onDownloadProgress&&p.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&p.upload&&p.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then((function(e){p&&(p.abort(),c(e),p=null)})),void 0===s&&(s=null),p.send(s)}))}},function(e,t,n){"use strict";var r=n(36);e.exports=function(e,t,n,a,o){var l=new Error(e);return r(l,t,n,a,o)}},function(e,t,n){"use strict";var r=n(1);e.exports=function(e,t){t=t||{};var n={};return r.forEach(["url","method","params","data"],(function(e){void 0!==t[e]&&(n[e]=t[e])})),r.forEach(["headers","auth","proxy"],(function(a){r.isObject(t[a])?n[a]=r.deepMerge(e[a],t[a]):void 0!==t[a]?n[a]=t[a]:r.isObject(e[a])?n[a]=r.deepMerge(e[a]):void 0!==e[a]&&(n[a]=e[a])})),r.forEach(["baseURL","transformRequest","transformResponse","paramsSerializer","timeout","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","maxContentLength","validateStatus","maxRedirects","httpAgent","httpsAgent","cancelToken","socketPath"],(function(r){void 0!==t[r]?n[r]=t[r]:void 0!==e[r]&&(n[r]=e[r])})),n}},function(e,t,n){"use strict";function r(e){this.message=e}r.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},r.prototype.__CANCEL__=!0,e.exports=r},function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE){0;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}}(),e.exports=n(16)},function(e,t,n){var r,a,o;a=[e,t,n(3),n(24)],void 0===(o="function"==typeof(r=function(e,t,n,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=l(n),o=l(r);function l(e){return e&&e.__esModule?e:{default:e}}function i(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}var u=function(){function e(e,t){for(var n=0;n=this.measureWidth(r))return this.onToggled(!1),(0,n.createElement)(o,s,r);var p="";if(l&&"string"==typeof l.type){var d=l.type;(d.indexOf("span")>=0||d.indexOf("a")>=0)&&(p=l.props.children)}for(var m=1,h=r.length,y="",v=0,b=0,g=t,E=0,w=!1,k=!1,S=0,x=-1,_="",T=0;g-- >0;){for(_=g?"":u+(p?" "+p:"");m<=h;){if(y=r.substr(b,m),!((E=this.measureWidth(y+_))=c)break;y=r.substr(b,m),g||m--," "===y[y.length-1]&&(y=r.substr(b,m-1)),w&&(x=y.lastIndexOf(" "))>-1?(m=x,g&&m++,y=r.substr(b,m)):(m--,y=r.substr(b,m)),E=this.measureWidth(y+_)}while(E>=f&&y.length>0);b+=m;break}-1===(v=r.indexOf(" ",m+1))?(m+=1,w=!1):(w=!0,m=v)}if(m>=h){b=h;break}w&&!k&&-1===r.substr(S,m).indexOf(" ")&&(k=-1===r.substr(S,m).indexOf(" "),g--),S=m+1}return b===h?(this.onToggled(!1),(0,n.createElement)(o,s,r)):(this.onTruncated(),this.onToggled(!0),a.default.createElement("div",s,(0,n.createElement)(o,s,r.substr(0,b)+u+" "),l))}},{key:"render",value:function(){var e=this,t=this.props,r=t.element,a=t.text,o=t.style,l=void 0===o?{}:o,u=t.containerClassName,c=t.line,s=(t.onCalculated,t.onTruncated,t.onToggled,t.textElement),f=(t.textTruncateChild,t.truncateText,t.maxCalculateTimes,i(t,["element","text","style","containerClassName","line","onCalculated","onTruncated","onToggled","textElement","textTruncateChild","truncateText","maxCalculateTimes"])),p=l.fontWeight,d=l.fontStyle,m=l.fontSize,h=l.fontFamily,y=this.scope&&c?this.getRenderText():(0,n.createElement)(s,f,a),v={ref:function(t){e.scope=t},className:u,style:{overflow:"hidden",fontWeight:p,fontStyle:d,fontSize:m,fontFamily:h}};return this.scope&&this.onCalculated(),(0,n.createElement)(r,v,y)}}]),t}(n.Component);s.propTypes={containerClassName:o.default.string,element:o.default.string,line:o.default.oneOfType([o.default.number,o.default.bool]),onCalculated:o.default.func,onTruncated:o.default.func,onToggled:o.default.func,text:o.default.string,textElement:o.default.node,textTruncateChild:o.default.node,truncateText:o.default.string,maxCalculateTimes:o.default.number},s.defaultProps={element:"div",line:1,text:"",textElement:"span",truncateText:"…",maxCalculateTimes:10},t.default=s,e.exports=t.default})?r.apply(t,a):r)||(e.exports=o)},function(e,t,n){"use strict"; +*/var r=Object.getOwnPropertySymbols,a=Object.prototype.hasOwnProperty,o=Object.prototype.propertyIsEnumerable;function l(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(e){return!1}}()?Object.assign:function(e,t){for(var n,i,u=l(e),c=1;c=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}var u=function(){function e(e,t){for(var n=0;n=this.measureWidth(r))return this.onToggled(!1),(0,n.createElement)(o,s,r);var p="";if(l&&"string"==typeof l.type){var d=l.type;(d.indexOf("span")>=0||d.indexOf("a")>=0)&&(p=l.props.children)}for(var m=1,h=r.length,y="",v=0,b=0,g=t,E=0,w=!1,k=!1,x=0,S=-1,_="",T=0;g-- >0;){for(_=g?"":u+(p?" "+p:"");m<=h;){if(y=r.substr(b,m),!((E=this.measureWidth(y+_))=c)break;y=r.substr(b,m),g||m--," "===y[y.length-1]&&(y=r.substr(b,m-1)),w&&(S=y.lastIndexOf(" "))>-1?(m=S,g&&m++,y=r.substr(b,m)):(m--,y=r.substr(b,m)),E=this.measureWidth(y+_)}while(E>=f&&y.length>0);b+=m;break}-1===(v=r.indexOf(" ",m+1))?(m+=1,w=!1):(w=!0,m=v)}if(m>=h){b=h;break}w&&!k&&-1===r.substr(x,m).indexOf(" ")&&(k=-1===r.substr(x,m).indexOf(" "),g--),x=m+1}return b===h?(this.onToggled(!1),(0,n.createElement)(o,s,r)):(this.onTruncated(),this.onToggled(!0),a.default.createElement("div",s,(0,n.createElement)(o,s,r.substr(0,b)+u+" "),l))}},{key:"render",value:function(){var e=this,t=this.props,r=t.element,a=t.text,o=t.style,l=void 0===o?{}:o,u=t.containerClassName,c=t.line,s=(t.onCalculated,t.onTruncated,t.onToggled,t.textElement),f=(t.textTruncateChild,t.truncateText,t.maxCalculateTimes,i(t,["element","text","style","containerClassName","line","onCalculated","onTruncated","onToggled","textElement","textTruncateChild","truncateText","maxCalculateTimes"])),p=l.fontWeight,d=l.fontStyle,m=l.fontSize,h=l.fontFamily,y=this.scope&&c?this.getRenderText():(0,n.createElement)(s,f,a),v={ref:function(t){e.scope=t},className:u,style:{overflow:"hidden",fontWeight:p,fontStyle:d,fontSize:m,fontFamily:h}};return this.scope&&this.onCalculated(),(0,n.createElement)(r,v,y)}}]),t}(n.Component);s.propTypes={containerClassName:o.default.string,element:o.default.string,line:o.default.oneOfType([o.default.number,o.default.bool]),onCalculated:o.default.func,onTruncated:o.default.func,onToggled:o.default.func,text:o.default.string,textElement:o.default.node,textTruncateChild:o.default.node,truncateText:o.default.string,maxCalculateTimes:o.default.number},s.defaultProps={element:"div",line:1,text:"",textElement:"span",truncateText:"…",maxCalculateTimes:10},t.default=s,e.exports=t.default})?r.apply(t,a):r)||(e.exports=o)},function(e,t,n){e.exports=n(25)},function(e,t,n){"use strict"; /** @license React v16.10.2 * react-dom.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var r=n(0),a=n(5),o=n(18);function l(e){for(var t=e.message,n="https://reactjs.org/docs/error-decoder.html?invariant="+t,r=1;r