diff --git a/PrereviewPlugin.inc.php b/PrereviewPlugin.inc.php new file mode 100644 index 0000000..95afb9a --- /dev/null +++ b/PrereviewPlugin.inc.php @@ -0,0 +1,435 @@ +getEnabled()) { + $request = Application::get()->getRequest(); + //Include javascript and css + $url = $request->getBaseUrl() . '/' . $this->getPluginPath() . '/css/prereview.css'; + $urlj = $request->getBaseUrl() . '/' . $this->getPluginPath() . '/js/prereview.js'; + $templateMgr = TemplateManager::getManager($request); + $templateMgr->addStyleSheet('callbackSharingDisplay', $url); + $templateMgr->addJavaScript('callbackSharingDisplay', $urlj); + + // Do something when the plugin is enabled + HookRegistry::register('Schema::get::publication', array($this, 'addToSchema')); //Add schema for radiobuttons + HookRegistry::register('Templates::Preprint::Details', array($this, 'callbackSharingDisplay')); // Include information in detail view of OPS + HookRegistry::register('submissionsubmitstep4form::display', array($this, 'handleFormDisplaySubmission'));//Include form to submmisions + HookRegistry::register('submissionsubmitstep4form::execute', array($this, 'handleFormExecute'));//Save form + HookRegistry::register('Template::Workflow::Publication', array($this, 'publicationTemplateData'));//Include form to publications + HookRegistry::register('LoadComponentHandler', array($this, 'setupGridHandler')); + } + + return $success; + + } + + /** + * @param $hookName string The name of the hook being invoked + * @param $args array The parameters to the invoked hook + */ + function setupGridHandler($hookName, $params) { + $component =& $params[0]; + if ($component == 'plugins.generic.prereviewPlugin.controllers.grid.PrereviewGridHandler') { + import($component); + PrereviewGridHandler::setPlugin($this); + return true; + } + return false; + } + + + /** + * Provide a name for this plugin + * + * The name will appear in the Plugin Gallery where editors can + * install, enable and disable plugins. + */ + public function getDisplayName() { + return 'PREreview'; + } + + /** + * Provide a description for this plugin + * + * The description will appear in the Plugin Gallery where editors can + * install, enable and disable plugins. + */ + public function getDescription() { + return __('plugins.generic.prereview.description'); + } + + /** + * @copydoc Plugin::getActions() + */ + function getActions($request, $actionArgs) { + // Get the existing actions + $actions = parent::getActions($request, $actionArgs); + if (!$this->getEnabled()) { + return $actions; + } + // Create a LinkAction that will call the plugin's + // `manage` method with the `settings` verb. + $router = $request->getRouter(); + import('lib.pkp.classes.linkAction.request.AjaxModal'); + $linkAction = new LinkAction( + 'settings', + new AjaxModal( + $router->url( + $request, + null, + null, + 'manage', + null, + array( + 'verb' => 'settings', + 'plugin' => $this->getName(), + 'category' => 'generic' + ) + ), + $this->getDisplayName() + ), + __('manager.plugins.settings'), + null + ); + + // Add the LinkAction to the existing actions. + // Make it the first action to be consistent with + // other plugins. + array_unshift($actions, $linkAction); + + return $actions; + } + + + /** + * @see Plugin::manage() + */ + function manage($args, $request) { + switch ($request->getUserVar('verb')) { + case 'settings': + $context = $request->getContext(); + $this->import('PrereviewSettingsForm'); + $form = new PrereviewSettingsForm($this, $context); + if ($request->getUserVar('save')) { + $form->readInputData(); + if ($form->validate()) { + $form->execute(); + return new JSONMessage(true); + } + } else { + $form->initData(); + } + return new JSONMessage(true, $form->fetch($request)); + } + return parent::manage($args, $request); + } + + function callbackSharingDisplay($hookName, $params) { + $templateMgr = $params[1]; + $output =& $params[2]; + $request = $this->getRequest(); + $context = $request->getContext(); + $result=array(); + $showRevisions = $this->_getPluginSetting($context, 'showRevisions'); + $idPreprint=$request->getRouter()->getHandler()->preprint->_data['id']; + $idPreprint=((int) $idPreprint); + $doi = $this->getDoi($idPreprint); + $doi_result = "doi-".str_replace("/", "-", strtolower($doi)); + $url= PREREVIEW_API_CHECK . $doi_result; + + $ch = curl_init(); + + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + + $result = curl_exec($ch); + // close curl resource to free up system resources + curl_close($ch); + $datos = json_decode($result); + + $fullrev=array(); + $i=0; + $datos_fullreview=$datos->data[0]->fullReviews; + $datos_rapidreview=$datos->data[0]->rapidReviews; + + foreach($datos_fullreview as $fr){ + $fullrev[$i]=array( + 'id' =>$i, + 'name'=> $fr->authors[0]->name, + 'content' =>$fr->drafts[0]->contents, + ); + + $i++; + } + + $templateMgr->assign( + array( + 'status' => $datos->status, + 'url' => PREREVIEW_URL.$doi_result, + 'numFullReviews' => count($datos_fullreview), + 'numRapidReviews' => count($datos_rapidreview), + 'numRequests' => count($datos->data[0]->requests), + 'fullReviews' =>$fullrev, + 'showReviews' =>$showRevisions, + 'showrevisionsLong' =>$showrevisionsLong, + 'rapidReviews' =>$this->getRapidReviews($datos_rapidreview), + 'authorization'=>$this->getPrereviewSetting($idPreprint)->setting_value, + ) + ); + $output .= $templateMgr->fetch($this->getTemplateResource('prereview.tpl')); + return false; + } + + + + + function handleFormDisplaySubmission($hookName, $args) { + $request = PKPApplication::get()->getRequest(); + $context = $request->getContext(); + $templateMgr = TemplateManager::getManager($request); + switch ($hookName) { + case 'submissionsubmitstep4form::display': + $authorForm =& $args[0]; + $supportedSubmissionLocales = $context->getSupportedSubmissionLocales(); + $localeNames = AppLocale::getAllLocales(); + $locales = array_map(function($localeKey) use ($localeNames) { + return ['key' => $localeKey, 'label' => $localeNames[$localeKey]]; + }, $supportedSubmissionLocales); + + $templateMgr->registerFilter("output", array($this, 'metadataForm')); + + break; + } + return false; + + } + + + function handleFormExecute($hookName, $params) { + $props =& $params[0]; + $request = Application::get()->getRequest(); + $this->import('PrereviewPluginDAO'); + $prereview = new PrereviewPluginDAO(); + DAORegistry::registerDAO('PrereviewPluginDAO', $prereview); + $id=$props->submission->_data['id']; + $request=$_POST['prereview:authorization']; + if(empty($request)) + $request='no'; + $preDao = DAORegistry::getDAO('PrereviewPluginDAO'); + $preDao->insert($id, 'prereview:authorization', $request); + + } + + /** + * Output adds prereview authorization form. + * + * @param $output string + * @param $templateMgr TemplateManager + * @return string + */ + function metadataForm($output, $templateMgr) { + if (preg_match('/]+name="submissionId"[^>]*>/', $output, $matches, PREG_OFFSET_CAPTURE)) { + $match = $matches[0][0]; + $offset = $matches[0][1]; + $templateMgr->assign('data', $output); + $newOutput = substr($output, 0, $offset + strlen($match)); + $newOutput .= $templateMgr->fetch($this->getTemplateResource('request.tpl')); + $newOutput .= substr($output, $offset + strlen($match)); + $output = $newOutput; + $templateMgr->unregisterFilter('output', array($this, 'metadataForm')); + } + return $output; + } + + /** + * @param string $hookname + * @param array $args [string, TemplateManager] + */ + function publicationTemplateData(string $hookname, array $args): void { + /** + * @var $templateMgr TemplateManager + * @var $submission Submission + * @var $submissionFileDao SubmissionFileDAO + * @var $submissionFile SubmissionFile + */ + + $templateMgr = $args[1]; + $request = $this->getRequest(); + $context = $request->getContext(); + $submission = $templateMgr->getTemplateVars('submission'); + $latestPublication = $submission->getLatestPublication(); + $latestPublicationApiUrl = $request->getDispatcher()->url($request, ROUTE_API, $context->getData('urlPath'), 'submissions/' . $submission->getId() . '/publications/' . $latestPublication->getId()); + + $supportedSubmissionLocales = $context->getSupportedSubmissionLocales(); + $localeNames = AppLocale::getAllLocales(); + $locales = array_map(function($localeKey) use ($localeNames) { + return ['key' => $localeKey, 'label' => $localeNames[$localeKey]]; + }, $supportedSubmissionLocales); + + $smarty =& $args[1]; + $output =& $args[2]; + $submission = $smarty->get_template_vars('submission'); + + $smarty->assign([ + 'submissionId' => $submission->getId(), + 'publication' => $this->getPrereviewSetting($submission->getId())->setting_value, + ]); + + $output .= sprintf( + $smarty->fetch($this->getTemplateResource('workflowPrereview.tpl')) + ); + + } + + + function getRapidReviews($rapidReviews){ + for ($l = 0; $l < count($rapidReviews); $l++) { + $ynNovel[$l] = $rapidReviews[$l]->ynNovel; + $ynFuture[$l] = $rapidReviews[$l]->ynFuture; + $ynReproducibility[$l] = $rapidReviews[$l]->ynReproducibility; + $ynMethods[$l] = $rapidReviews[$l]->ynMethods; + $ynCoherent[$l] = $rapidReviews[$l]->ynCoherent; + $ynLimitations[$l] = $rapidReviews[$l]->ynLimitations; + $ynEthics[$l] = $rapidReviews[$l]->ynEthics; + $ynNewData[$l] = $rapidReviews[$l]->ynNewData; + $ynAvailableData[$l] = $rapidReviews[$l]->ynAvailableData; + $ynAvailableCode[$l] = $rapidReviews[$l]->ynAvailableCode; + $ynRecommend[$l] = $rapidReviews[$l]->ynRecommend; + $ynPeerReview[$l] = $rapidReviews[$l]->ynPeerReview; + + + } + $rapidrev=array( + 'ynNovel'=>$this->getValues($ynNovel), + 'ynFuture'=>$this->getValues($ynFuture), + 'ynReproducibility'=>$this->getValues($ynReproducibility), + 'ynMethods'=>$this->getValues($ynMethods), + 'ynCoherent'=>$this->getValues($ynCoherent), + 'ynLimitations'=>$this->getValues($ynLimitations), + 'ynEthics'=>$this->getValues($ynEthics), + 'ynNewData'=>$this->getValues($ynNewData), + 'ynAvailableData'=>$this->getValues($ynAvailableData), + 'ynAvailableCode'=>$this->getValues($ynAvailableCode), + 'ynRecommend'=>$this->getValues($ynRecommend), + 'ynPeerReview'=>$this->getValues($ynPeerReview), + + ); + + return $rapidrev; + } + + function getValues($value) { + $yes = 0; + $no = 0; + $unsure = 0; + $na = 0; + $result = ""; + $total = (100 / count($value)); + + for ($v = 0; $v < count($value); $v++) { + switch ($value[$v]) { + case "yes": + $yes = $yes + $total; + break; + case "no": + $no = $no + $total; + break; + case "unsure": + $unsure = $unsure + $total; + break; + case "N/A": + $na = $na + $total; + break; + } + } + if ($yes != 0) { + $result = $result . '

' . $yes . '%

'; + } + if ($unsure != 0) { + $result = $result . '

' . $unsure . '%

'; + } + if ($na != 0) { + $result = $result . '

' . $na . '%

'; + } + if ($no != 0) { + $result = $result . '

' . $no . '%

'; + } + + + return $result; + } + + public function addToSchema($hookName, $args) { + $schema = $args[0]; + $propId = '{ + "type": "string", + "apiSummary": true, + "validation": [ + "nullable" + ] + }'; + + $schema->properties->{'prereview:authorization'} = json_decode($propId); + } + + + /** + * Get context wide setting. If the context or the setting does not exist, + * get the site wide setting. + * @param $context Context + * @param $name Setting name + * @return mixed + */ + function _getPluginSetting($context, $name) { + $pluginSettingsDao = DAORegistry::getDAO('PluginSettingsDAO'); + if ($context && $pluginSettingsDao->settingExists($context->getId(), $this->getName(), $name)) { + return $this->getSetting($context->getId(), $name); + } else { + return $this->getSetting(CONTEXT_ID_NONE, $name); + } + } + + function _getSubmissionSetting($id, $name) { + $this->import('PrereviewPluginDAO'); + $prereview = new PrereviewPluginDAO(); + DAORegistry::registerDAO('PrereviewPluginDAO', $prereview); + $preDao = DAORegistry::getDAO('PrereviewPluginDAO'); + $result= $preDao->_getPrereviewData($id, $name); + return $result; + } + function getPrereviewSetting($id) { + $this->import('PrereviewPluginDAO'); + $prereview = new PrereviewPluginDAO(); + DAORegistry::registerDAO('PrereviewPluginDAO', $prereview); + $preDao = DAORegistry::getDAO('PrereviewPluginDAO'); + $result= $preDao->getDataPrereview($id); + return $result; + } + + function getInstallMigration() { + $this->import('PrereviewSchemaMigration'); + return new PrereviewSchemaMigration(); + } + + public function getDoi($id) { + import('classes.submission.Submission'); + $submission = Services::get('submission')->get($id); + $submission = $submission->getData('publications')[0]->getData('pub-id::doi'); + return $submission; + } + + + +} \ No newline at end of file diff --git a/PrereviewPluginDAO.inc.php b/PrereviewPluginDAO.inc.php new file mode 100644 index 0000000..cdf46ef --- /dev/null +++ b/PrereviewPluginDAO.inc.php @@ -0,0 +1,83 @@ +_result = false; + $this->_loadId = null; + } + function insert($id, $name, $value) { + $this->update( + 'INSERT INTO prereview_settings + (publication_id, setting_name, setting_value) + VALUES + (?, ?, ?)', + array( + $id, + $name, + $value, + ) + ); + return true; + } + function updateObject($id, $name, $value) { + + $this->update( + 'UPDATE prereview_settings + SET setting_value = ? + WHERE publication_id = ? AND setting_name = ?', + array( + $value, + $id, + $name, + ) + ); + return true; + } + + function _getPrereviewData($id, $name) { + $result = $this->retrieve( + 'SELECT setting_value + FROM prereview_settings WHERE publication_id = ? AND setting_name = ? + GROUP BY setting_value', + array((int) $id, $name) + ); + $returner = $result->fields[0]; + $result->Close(); + return $returner; + } + + function getDataPrereview($id) { + $result = $this->retrieve( + 'SELECT setting_value + FROM prereview_settings WHERE publication_id = ?', + array((int) $id) + ); + $returner = $result->current(); + return $returner; + } + + +} + diff --git a/PrereviewSchemaMigration.inc.php b/PrereviewSchemaMigration.inc.php new file mode 100644 index 0000000..d2e8d7c --- /dev/null +++ b/PrereviewSchemaMigration.inc.php @@ -0,0 +1,28 @@ +create('prereview_settings', function (Blueprint $table) { + $table->bigInteger('publication_id'); + $table->string('setting_name', 255); + $table->longText('setting_value')->nullable(); + $table->longText('status')->nullable(); + $table->longText('views')->nullable(); + }); + + } +} diff --git a/PrereviewSettingsForm.inc.php b/PrereviewSettingsForm.inc.php new file mode 100644 index 0000000..9a99863 --- /dev/null +++ b/PrereviewSettingsForm.inc.php @@ -0,0 +1,89 @@ +getTemplateResource('settings.tpl')); + $this->plugin = $plugin; + + // Always add POST and CSRF validation to secure your form. + $this->addCheck(new FormValidatorPost($this)); + $this->addCheck(new FormValidatorCSRF($this)); + } + + /** + * Load the settings already saved in the database + * + * The settings are stored together with the general settings of the plugin. + * can have different settings. + */ + public function initData() { + $contextId = Application::get()->getRequest()->getContext()->getId(); + $this->setData('prereviewApp', $this->plugin->getSetting($contextId, 'prereviewApp')); + $this->setData('prereviewkey', $this->plugin->getSetting($contextId, 'prereviewkey')); + $this->setData('showRevisions', $this->plugin->getSetting($contextId, 'showRevisions')); + parent::initData(); + } + + /** + * Load data that was submitted with the form + */ + public function readInputData() { + $this->readUserVars(['prereviewApp']); + $this->readUserVars(['prereviewkey']); + $this->readUserVars(['showRevisions']); + parent::readInputData(); + } + + /** + * Fetch any additional data needed for your form. + * + * Data assigned to the form using $this->setData() during the + * initData() or readInputData() methods will be passed to the + * template. + */ + public function fetch($request, $template = null, $display = false) { + + // Pass the plugin name to the template so that it can be + // used in the URL that the form is submitted to + $templateMgr = TemplateManager::getManager($request); + $templateMgr->assign('pluginName', $this->plugin->getName()); + + return parent::fetch($request, $template, $display); + } + /** + * Save the settings + */ + public function execute(...$functionArgs) { + $contextId = Application::get()->getRequest()->getContext()->getId(); + $this->plugin->updateSetting($contextId, 'prereviewApp', $this->getData('prereviewApp')); + $this->plugin->updateSetting($contextId, 'prereviewkey', $this->getData('prereviewkey')); + $this->plugin->updateSetting($contextId, 'showRevisions', $this->getData('showRevisions')); + // Tell the user that the save was successful. + import('classes.notification.NotificationManager'); + $notificationMgr = new NotificationManager(); + $notificationMgr->createTrivialNotification( + Application::get()->getRequest()->getUser()->getId(), + NOTIFICATION_TYPE_SUCCESS, + ['contents' => __('common.changesSaved')] + ); + return parent::execute(...$functionArgs); + } + +} + diff --git a/controllers/grid/PrereviewGridHandler.inc.php b/controllers/grid/PrereviewGridHandler.inc.php new file mode 100644 index 0000000..5550f08 --- /dev/null +++ b/controllers/grid/PrereviewGridHandler.inc.php @@ -0,0 +1,128 @@ +addRoleAssignment( + array(ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR, ROLE_ID_ASSISTANT, ROLE_ID_AUTHOR), + array('updateRequest') + ); + } + + + /** + * Set the plugin. + * @param $plugin + */ + static function setPlugin($plugin) { + self::$plugin = $plugin; + } + + /** + * Get the submission associated with this grid. + * @return Submission + */ + function getSubmission() { + return $this->getAuthorizedContextObject(ASSOC_TYPE_SUBMISSION); + } + + /** + * Get whether or not this grid should be 'read only' + * @return boolean + */ + function getReadOnly() { + return $this->_readOnly; + } + + /** + * Set the boolean for 'read only' status + * @param boolean + */ + function setReadOnly($readOnly) { + $this->_readOnly = $readOnly; + } + + /** + * @copydoc PKPHandler::authorize() + */ + function authorize($request, &$args, $roleAssignments) { + import('lib.pkp.classes.security.authorization.SubmissionAccessPolicy'); + $this->addPolicy(new SubmissionAccessPolicy($request, $args, $roleAssignments)); + return parent::authorize($request, $args, $roleAssignments); + } + + + + + /** + * @copydoc GridHandler::getJSHandler() + */ + public function getJSHandler() { + return '$.pkp.plugins.generic.prereviewPlugin.PrereviewGridHandler'; + } + + + /** + * Update a request + * @param $args array + * @param $request PKPRequest + * @return string Serialized JSON object + */ + function updateRequest($args, $request) { + $result = $request->getUserVar('prereview:authorization'); + $context = $request->getContext(); + $submission = $this->getSubmission(); + $submissionId = $submission->getId(); + $latestRequest=$this->getPrereviewSetting($submission->getId())->setting_value; + $this->setupTemplate($request); + // Create and populate the form + import('plugins.generic.prereviewPlugin.controllers.grid.form.RequestForm'); + $prereviewForm = new RequestForm(self::$plugin, $context->getId(), $submissionId, $result, $latestRequest); + $prereviewForm->readInputData(); + $save = $prereviewForm->execute(); + import('classes.notification.NotificationManager'); + $notificationMgr = new NotificationManager(); + + if($save==true) + { + $notificationMgr->createTrivialNotification( + Application::get()->getRequest()->getUser()->getId(), + NOTIFICATION_TYPE_SUCCESS, + ['contents' => __('common.changesSaved')] + ); + + }else{ + $notificationMgr->createTrivialNotification( + Application::get()->getRequest()->getUser()->getId(), + NOTIFICATION_TYPE_ERROR, + ['contents' => __('common.error')]); + } + $path = getenv('HTTP_REFERER').'#publication/prereviewTab'; + header('Location: '.$path); + + } + + + function getPrereviewSetting($id) { + import('plugins.generic.prereviewPlugin.PrereviewPluginDAO'); + $prereview = new PrereviewPluginDAO(); + DAORegistry::registerDAO('PrereviewPluginDAO', $prereview); + $preDao = DAORegistry::getDAO('PrereviewPluginDAO'); + $result= $preDao->getDataPrereview($id); + return $result; + } +} diff --git a/controllers/grid/form/RequestForm.inc.php b/controllers/grid/form/RequestForm.inc.php new file mode 100644 index 0000000..d01303c --- /dev/null +++ b/controllers/grid/form/RequestForm.inc.php @@ -0,0 +1,81 @@ +getTemplateResource('workflowPrereview.tpl')); + $this->contextId = $contextId; + $this->submissionId = $submissionId; + $this->result = $result; + $this->plugin = $prereviewPlugin; + $this->latestRequest = $latestRequest; + + // Add form checks + $this->addCheck(new FormValidator($this, 'prereview:authorization', 'required', 'plugins.generic.prereview.publication.success')); + $this->addCheck(new FormValidatorPost($this)); + $this->addCheck(new FormValidatorCSRF($this)); + + } + + /** + * @copydoc Form::initData() + */ + function initData() { + $this->setData('publication_id', $this->submissionId); + $this->setData('setting_name', 'prereview:authorization'); + $this->setData('setting_value', $this->result); + } + + /** + * @copydoc Form::readInputData() + */ + function readInputData() { + $this->readUserVars(['prereview:authorization']); + } + + /** + * @copydoc Form::fetch + */ + function fetch($request, $template = null, $display = false) { + $templateMgr = TemplateManager::getManager($request); + + $templateMgr->assign('publication_id', $this->submissionId); + $templateMgr->assign('setting_value', $this->result); + return parent::fetch($request, $template, $display); + } + + /** + * Save form values into the database + */ + function execute(...$functionArgs) { + import('plugins.generic.prereviewPlugin.PrereviewPluginDAO'); + $prereview = new PrereviewPluginDAO(); + DAORegistry::registerDAO('PrereviewPluginDAO', $prereview); + $preDao = DAORegistry::getDAO('PrereviewPluginDAO'); + $latestRequest = $this->latestRequest; + $id=$this->submissionId; + $requestResult=$this->result; + + if(empty($latestRequest)) + { + $data = $preDao->insert($id, 'prereview:authorization', $requestResult); + }else{ + $data = $preDao->updateObject($id, 'prereview:authorization', $requestResult); + } + return $data; + + } +} diff --git a/css/prereview.css b/css/prereview.css new file mode 100644 index 0000000..bef946d --- /dev/null +++ b/css/prereview.css @@ -0,0 +1,200 @@ +#reviews { + border-radius: 5px; + border: 1px solid; +} + +.message_header { + text-align: center; +} + +.div-header { + width: 100%; + background-color: #D2D1CE; + font-size: 0.9rem; + font-family: Open Sans, sans-serif; + font-weight: 400; + line-height: 1.5; + color: #767676; + padding: 8px; +} + +.div-header span { + color: #FF3333; + font-size: 0.8rem; + font-weight: 700; +} + +.message { + text-align: center; + font-size: 18px; + margin-top: 15px; +} + +.general-container:nth-of-type(odd) { + background-color: rgba(0, 0, 0, 0.04); +} + +.general-container { + width: 100%; + display: flex; + flex-wrap: wrap; + box-sizing: border-box; + margin-top: 5px; + align-items: center; + padding: 5px 2px; +} + +.ask-container { + width: 50%; + display: flex; + flex-wrap: wrap; + box-sizing: border-box; + padding-right: 5px; +} + +.option-container { + width: 50%; + display: flex; + flex-wrap: wrap; + box-sizing: border-box; + height: 20px; +} + +.option-container p { + line-height: 20px; + margin: 0; + font-size: 10px; +} + +.yes { + background-color: #197CF4; + color: #fff; + text-align: center; +} + +.unsure { + background-color: #767676; + color: #fff; + text-align: center; +} + +.na { + background-color: #000; + color: #fff; + text-align: center; +} + +.no { + background-color: #F77463; + color: #fff; + text-align: center; +} + +.full-reviews { + margin: 8px 0; +} + +.author-name { + font-weight: 600; +} + +.value h2 { + /* margin-bottom: 0.5px; */ + margin: 20px 0.5px; +} + +.author-name h3 { + margin: 10px 0.5px; +} + +.author-name { + /* border: 1px solid #e6e6e6; */ + padding: 0.5px 5px; +} + +.author-name .more { + font-weight: 600; + text-align: right; + margin-top: 0; + color: #007ab2; + cursor: pointer; + margin-bottom: 2px; +} + +.author-name .less { + font-weight: 600; + text-align: right; + margin-top: 0; + color: #007ab2; + display: none; + cursor: pointer; +} + +.author-name .contents { + font-weight: normal; + text-align: justify !important; + margin-top: 5px; + color: #050505; + display: none; +} + +.author-name .contents a { + color: #050505; +} + +.author-name .contents p { + margin: 2px 0; +} + +.ql-tooltip { + display: none; +} + + +/* .section-author { + border: 1px solid; +} */ + +.semaphore { + width: 100%; + background: #ecefef; + border-radius: 5px; + padding: 10px; +} + +.red_light::before { + content: ''; + display: inline-block; + width: 20px; + height: 20px; + -moz-border-radius: 7.5px; + -webkit-border-radius: 7.5px; + border-radius: 50%; + background-color: #da0e0e; + vertical-align: text-top; +} + +.green_light::before { + content: ''; + display: inline-block; + width: 20px; + height: 20px; + -moz-border-radius: 7.5px; + -webkit-border-radius: 7.5px; + border-radius: 50%; + background-color: #009688; + vertical-align: text-top; +} + +.pre-icon { + width: 100% !important; + text-align: center !important; +} + +.pre-icon img { + max-width: 220px !important; +} +#editRequest .pkpFormField--options { + padding: 1rem 2rem; + border: none; +} \ No newline at end of file diff --git a/images/images.png b/images/images.png new file mode 100644 index 0000000..24d61a0 Binary files /dev/null and b/images/images.png differ diff --git a/images/prereview-logo.svg b/images/prereview-logo.svg new file mode 100644 index 0000000..78f7f91 --- /dev/null +++ b/images/prereview-logo.svg @@ -0,0 +1 @@ + diff --git a/index.php b/index.php new file mode 100644 index 0000000..56999f4 --- /dev/null +++ b/index.php @@ -0,0 +1,3 @@ +read here. If you have questions or concerns about what this means, please contact PREreview at contact@prereview.org." + +msgid "plugins.generic.prereview.description.buttoncheck" +msgstr "Yes, please let the PREreview research community know I would like to solicit constructive feedback on my preprint and have it displayed next to my preprint on this preprint server." + +msgid "plugins.generic.prereview.description.notdisplay" +msgstr "Yes, please let the PREreview research community know I would like to receive constructive feedback on my preprint BUT I would NOT like to have it displayed next to my preprint on this server." + +msgid "plugins.generic.prereview.description.notsolicit" +msgstr "No, I do not wish to solicit constructive feedback from the PREreview research community." + +msgid "plugins.generic.prereview.semaphore.author" +msgstr "The author's contribution statement was identified in the document" + +msgid "plugins.generic.prereview.semaphore.authorFalse" +msgstr "No authors identified" + +msgid "plugins.generic.prereview.semaphore.orcidTrue" +msgstr "The ORCID iD of the corresponding author has been correctly identified." + +msgid "plugins.generic.prereview.semaphore.orcidFalse" +msgstr "The ORCID iD of the corresponding author was not identified. " + +msgid "plugins.generic.prereview.semaphore.metadata" +msgstr "The following metadata is not found in all configured languages: " + +msgid "plugins.generic.prereview.question.ynNovel" +msgstr "Are the findings novel?" + +msgid "plugins.generic.prereview.question.ynFuture" +msgstr "Are the results likely to lead to future research?" + +msgid "plugins.generic.prereview.question.ynReproducibility" +msgstr "Is sufficient detail provided to allow reproduction of the study?" + +msgid "plugins.generic.prereview.question.ynMethods" +msgstr "Are the methods and statistics appropriate for the analysis?" + +msgid "plugins.generic.prereview.question.ynCoherent" +msgstr "Are the principal conclusions supported by the data and analysis?" + +msgid "plugins.generic.prereview.question.ynLimitations" +msgstr "Does the manuscript discuss limitations?" + +msgid "plugins.generic.prereview.question.ynEthics" +msgstr "Have the authors adequately discussed ethical concerns?" + +msgid "plugins.generic.prereview.question.ynNewData" +msgstr "Does the manuscript include new data?" + +msgid "plugins.generic.prereview.question.ynAvailableData" +msgstr "Are the data used in the manuscript available?" + +msgid "plugins.generic.prereview.question.ynAvailableCode" +msgstr "Is the code used in the manuscript available?" + +msgid "plugins.generic.prereview.question.ynRecommend" +msgstr "Would you recommend this manuscript to others?" + +msgid "plugins.generic.prereview.question.ynPeerReview" +msgstr "Do you recommend this manuscript for peer review?" + diff --git a/locale/es_ES/locale.po b/locale/es_ES/locale.po new file mode 100644 index 0000000..396a4eb --- /dev/null +++ b/locale/es_ES/locale.po @@ -0,0 +1,127 @@ +msgid "plugins.generic.prereview.title" +msgstr "PREreview" + +msgid "plugins.generic.prereview.description" +msgstr "Este plugin permite a los autores solicitar comentarios constructivos sobre su preprint a la comunidad de investigadores de PREreview (https://prereview.org/reviews)." + +msgid "plugins.generic.prereview.apisettings" +msgstr "Configure las claves de acceso a la API de PREreview para solicitar reseñas a la comunidad de PREreview." + +msgid "plugins.generic.prereview.apisettings.title" +msgstr "Claves API" + +msgid "plugins.generic.prereview.apisettings.name" +msgstr "API" + +msgid "plugins.generic.prereview.apisettings.key" +msgstr "LLave" + +msgid "plugins.generic.prereview.apisettings.option" +msgstr "Configuración de PREreview" + +msgid "plugins.generic.prereview.apisettings.optionDescription" +msgstr "En PREreview, los revisores pueden proporcionar comentarios rápidos y estructurados en formato de Rapid PREreview (por ejemplo, ___), y una revisión más larga de forma libre, una Full PREreview (por ejemplo, ___)." + +msgid "plugins.generic.prereview.apisettings.optionDescription.ask" +msgstr "¿Qué reseñas del sitio de PREreview le gustaría que aparecieran?" + +msgid "plugins.generic.prereview.apisettings.showrevisions" +msgstr "Mostrar solo revisiones rapidas" + +msgid "plugins.generic.prereview.apisettings.showrevisionsLong" +msgstr "Mostrar solo revisiones largas" + +msgid "plugins.generic.prereview.apisettings.showrevisionsBoth" +msgstr "Mostrar revisiones rapidas y largas" + +msgid "plugins.generic.prereview.view.message" +msgstr "No se ha registrado ninguna reseña" + +msgid "plugins.generic.prereview.view.textRapidReview" +msgstr "PREreviews rapidas" + +msgid "plugins.generic.prereview.view.textLongReview" +msgstr "PREreviews completas" + +msgid "plugins.generic.prereview.view.textRequest" +msgstr "Solicitudes" + +msgid "plugins.generic.prereview.view.textRequests" +msgstr "Solicitud" + +msgid "plugins.generic.prereview.view.textViewSite" +msgstr "Ver en el sitio de PREreview" + +msgid "plugins.generic.prereview.publication.success" +msgstr "Datos guardados correctamente" + +msgid "plugins.generic.prereview.description.p1" +msgstr "PREreview es una plataforma de revisión de preprints gratuita y de código abierto, un centro de recursos y un convocante. A través de la plataforma PREreview, cualquier investigador con un ORCID puede aportar comentarios constructivos a un preprint." + +msgid "plugins.generic.prereview.description.p2" +msgstr "Ahora puede solicitar los comentarios de sus compañeros a través de este plugin y elegir que se muestren abiertamente junto a su preprint en este servidor de preprints." + +msgid "plugins.generic.prereview.description.p3" +msgstr "Para saber más sobre el funcionamiento de la plataforma PREreview, lea aquí. Si tiene preguntas o dudas sobre lo que esto significa, póngase en contacto con PREreview en contact@prereview.org." + +msgid "plugins.generic.prereview.description.buttoncheck" +msgstr "Sí, por favor, haga saber a la comunidad de PREreview que me gustaría solicitar comentarios constructivos sobre mi preprint y que se muestren junto a mi preprint." + +msgid "plugins.generic.prereview.description.notdisplay" +msgstr "Sí, por favor, haga saber a la comunidad investigadora de PREreview que me gustaría recibir comentarios constructivos sobre mi preprint PERO NO me gustaría que se mostraran junto a mi preprint." + +msgid "plugins.generic.prereview.description.notsolicit" +msgstr "No, no deseo solicitar comentarios constructivos de la comunidad investigadora de PREreview." + +msgid "plugins.generic.prereview.semaphore.author" +msgstr "Se identificó la declaración de contribución del autor" + +msgid "plugins.generic.prereview.semaphore.authorFalse" +msgstr "No hay autores identificados" + +msgid "plugins.generic.prereview.semaphore.orcidTrue" +msgstr "El ORCID del autor correspondiente ha sido identificado correctamente." + +msgid "plugins.generic.prereview.semaphore.orcidFalse" +msgstr "El ORCID del autor correspondiente no fue identificado." + +msgid "plugins.generic.prereview.semaphore.metadata" +msgstr "Los siguientes metadatos no se encuentran en todos los idiomas configurados: " + +msgid "plugins.generic.prereview.question.ynNovel" +msgstr "¿Son novedosos los resultados?" + +msgid "plugins.generic.prereview.question.ynFuture" +msgstr "¿Es probable que los resultados conduzcan a futuras investigaciones?" + +msgid "plugins.generic.prereview.question.ynReproducibility" +msgstr "¿Se proporcionan suficientes detalles para permitir la reproducción del estudio?" + +msgid "plugins.generic.prereview.question.ynMethods" +msgstr "¿Los métodos y las estadísticas son adecuados para el análisis?" + +msgid "plugins.generic.prereview.question.ynCoherent" +msgstr "¿Están las principales conclusiones respaldadas por los datos y el análisis?" + +msgid "plugins.generic.prereview.question.ynLimitations" +msgstr "¿Discute el manuscrito las limitaciones?" + +msgid "plugins.generic.prereview.question.ynEthics" +msgstr "¿Los autores han discutido adecuadamente las cuestiones éticas?" + +msgid "plugins.generic.prereview.question.ynNewData" +msgstr "¿El manuscrito incluye datos nuevos?" + +msgid "plugins.generic.prereview.question.ynAvailableData" +msgstr "¿Están disponibles los datos utilizados en el manuscrito?" + +msgid "plugins.generic.prereview.question.ynAvailableCode" +msgstr "¿Está disponible el código utilizado en el manuscrito?" + +msgid "plugins.generic.prereview.question.ynRecommend" +msgstr "¿Recomendaría este manuscrito a otras personas?" + +msgid "plugins.generic.prereview.question.ynPeerReview" +msgstr "¿Recomienda este manuscrito para la revisión por pares?" + + diff --git a/locale/pt_BR/locale.po b/locale/pt_BR/locale.po new file mode 100644 index 0000000..d78ef96 --- /dev/null +++ b/locale/pt_BR/locale.po @@ -0,0 +1,126 @@ +msgid "plugins.generic.prereview.title" +msgstr "PREreview" + +msgid "plugins.generic.prereview.description" +msgstr "Este plugin permite oferecer aos autores a opção de solicitar da comunidade PREreview (https://prereview.org) pareceres construtivos para os seus preprints" + +msgid "plugins.generic.prereview.apisettings" +msgstr "Configure acesso à API do PREreview para solicitar pareceres da comunidade PREreview." + +msgid "plugins.generic.prereview.apisettings.title" +msgstr "Chaves API" + +msgid "plugins.generic.prereview.apisettings.name" +msgstr "API" + +msgid "plugins.generic.prereview.apisettings.key" +msgstr "KEY" + +msgid "plugins.generic.prereview.apisettings.option" +msgstr "Configuração de exibição do PREreview" + +msgid "plugins.generic.prereview.apisettings.optionDescription" +msgstr "No PREreview, os pareceristas da comunidade podem fornecer pareceres rápidos e estruturados na forma de um Rapid PREreview (Ex:___), e na forma de um parecer mais longo e livre, um Full PREreview (Ex:____)." + +msgid "plugins.generic.prereview.apisettings.optionDescription.ask" +msgstr "Que tipos de pareceres do website do PREreview você gostaria de exibir próximo a um preprint?" + +msgid "plugins.generic.prereview.apisettings.showrevisions" +msgstr "Exibir somente os Rapid PREreviews" + +msgid "plugins.generic.prereview.apisettings.showrevisionsLong" +msgstr "Exibir somente os Full PREreviews" + +msgid "plugins.generic.prereview.apisettings.showrevisionsBoth" +msgstr "Exibir ambos os Rapid PREreviews e Full PREreviews" + +msgid "plugins.generic.prereview.view.message" +msgstr "Não há revisões registadas" + +msgid "plugins.generic.prereview.view.textRapidReview" +msgstr "PREreviews rapid" + +msgid "plugins.generic.prereview.view.textLongReview" +msgstr "PREreviews completo" + +msgid "plugins.generic.prereview.view.textRequests" +msgstr "Solicitação(ões)" + +msgid "plugins.generic.prereview.view.textRequest" +msgstr "Solicitação" + +msgid "plugins.generic.prereview.view.textViewSite" +msgstr "Ver no site" + +msgid "plugins.generic.prereview.publication.success" +msgstr "Decisão salva com sucesso" + +msgid "plugins.generic.prereview.description.p1" +msgstr "PREreview é uma plataforma gratuita e de código aberto, um centro de recursos e uma convocadora. Por meio da plataforma PREreview, qualquer pesquisador com um ORCID iD pode fornecer pareceres construtivos para um preprint." + +msgid "plugins.generic.prereview.description.p2" +msgstr "Você pode agora solicitar pareceres de seus pares por meio deste plugin e escolher disponibilizá-los publicamente ao lado do seu preprint neste servidor." + +msgid "plugins.generic.prereview.description.p3" +msgstr "Para saber mais sobre como a plataforma PREreview funciona, leia aqui. Se você tem perguntas ou preocupações sobre o que isto significa, por favor entre em contato com o PREreview em contact@prereview.org." + +msgid "plugins.generic.prereview.description.buttoncheck" +msgstr "Sim, por favor permita que a comunidade de pesquisadores PREreview saiba que eu gostaria de solicitar avaliações construtivas para o meu preprint e exibi-las ao lado do meu preprint neste servidor." + +msgid "plugins.generic.prereview.description.notdisplay" +msgstr "Sim, por favor permita que a comunidade de pesquisadores PREreview saiba que eu gostaria de solicitar avaliações construtivas para o meu preprint mas eu NÃO gostaria de exibi-las ao lado do meu preprint neste servidor." + +msgid "plugins.generic.prereview.description.notsolicit" +msgstr "Não, eu não gostaria de solicitar avaliações construtivas à comunidade de pesquisadores PREreview." + +msgid "plugins.generic.prereview.semaphore.author" +msgstr "The author's contribution statement was identified in the document" + +msgid "plugins.generic.prereview.semaphore.authorFalse" +msgstr "No authors identified" + +msgid "plugins.generic.prereview.semaphore.orcidTrue" +msgstr "O ORCID ID do autor correspondente foi identificado." + +msgid "plugins.generic.prereview.semaphore.orcidFalse" +msgstr "O ORCID ID do autor correspondente não foi identificado. " + +msgid "plugins.generic.prereview.semaphore.metadata" +msgstr "The following metadata is not found in all configured languages: " + +msgid "plugins.generic.prereview.question.ynNovel" +msgstr "As descobertas são novas?" + +msgid "plugins.generic.prereview.question.ynFuture" +msgstr "Os resultados são susceptíveis de levar a pesquisas futuras?" + +msgid "plugins.generic.prereview.question.ynReproducibility" +msgstr "São fornecidos detalhes suficientes para permitir a reprodução do estudo?" + +msgid "plugins.generic.prereview.question.ynMethods" +msgstr "Os métodos e estatísticas são apropriados para a análise?" + +msgid "plugins.generic.prereview.question.ynCoherent" +msgstr "As principais conclusões são apoiadas pelos dados e análises?" + +msgid "plugins.generic.prereview.question.ynLimitations" +msgstr "O manuscrito discute limitações?" + +msgid "plugins.generic.prereview.question.ynEthics" +msgstr "Os autores discutiram adequadamente as preocupações éticas?" + +msgid "plugins.generic.prereview.question.ynNewData" +msgstr "O manuscrito inclui dados novos?" + +msgid "plugins.generic.prereview.question.ynAvailableData" +msgstr "Os dados utilizados no manuscrito estão disponíveis?" + +msgid "plugins.generic.prereview.question.ynAvailableCode" +msgstr "O código usado no manuscrito está disponível?" + +msgid "plugins.generic.prereview.question.ynRecommend" +msgstr "Você recomendaria este manuscrito a outras pessoas?" + +msgid "plugins.generic.prereview.question.ynPeerReview" +msgstr "Você recomenda este manuscrito para revisão por pares?" + diff --git a/schema.xml b/schema.xml new file mode 100644 index 0000000..6dac2aa --- /dev/null +++ b/schema.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + +
+ + +
diff --git a/templates/prereview.tpl b/templates/prereview.tpl new file mode 100644 index 0000000..cdc76fb --- /dev/null +++ b/templates/prereview.tpl @@ -0,0 +1,47 @@ +{* PREreview content in the OPS detail view *} +
+
+ {if $authorization=='request'} + {if $status=='ok' } + +
{$numRapidReviews} {translate key="plugins.generic.prereview.view.textRapidReview"}
{$numFullReviews} {translate key="plugins.generic.prereview.view.textLongReview"}
{$numRequests} {if $numRequests > 1}{translate key="plugins.generic.prereview.view.textRequests"}{else}{translate key="plugins.generic.prereview.view.textRequest"}{/if}
+ {if $numRapidReviews != 0 && (empty($showReviews) || $showReviews==="both" || $showReviews==="rapid")} +

Rapid PREreviews

+
{translate key="plugins.generic.prereview.question.ynNovel"}
{$rapidReviews.ynNovel}
+
{translate key="plugins.generic.prereview.question.ynFuture"}
{$rapidReviews.ynFuture}
+
{translate key="plugins.generic.prereview.question.ynReproducibility"}
{$rapidReviews.ynReproducibility}
+
{translate key="plugins.generic.prereview.question.ynMethods"}
{$rapidReviews.ynMethods}
+
{translate key="plugins.generic.prereview.question.ynCoherent"}
{$rapidReviews.ynCoherent}
+
{translate key="plugins.generic.prereview.question.ynLimitations"}
{$rapidReviews.ynLimitations}
+
{translate key="plugins.generic.prereview.question.ynEthics"}
{$rapidReviews.ynEthics}
+
{translate key="plugins.generic.prereview.question.ynNewData"}
{$rapidReviews.ynNewData}
+
{translate key="plugins.generic.prereview.question.ynAvailableData"}
{$rapidReviews.ynAvailableData}
+
{translate key="plugins.generic.prereview.question.ynAvailableCode"}
{$rapidReviews.ynAvailableCode}
+
{translate key="plugins.generic.prereview.question.ynRecommend"}
{$rapidReviews.ynRecommend}
+
{translate key="plugins.generic.prereview.question.ynPeerReview"}
{$rapidReviews.ynPeerReview}
+ {/if} + {if $numFullReviews != 0 && (empty($showReviews) || $showReviews==="both" || $showReviews==="full")} +
+

Full PREreviews

+ {foreach item=full from=$fullReviews} +
+

{$full.name}

+

More

+
{$full.content}
+

Less

+
+ {/foreach} +
+ {/if} +

{translate key="plugins.generic.prereview.view.textViewSite"}

+ {else} +
+ +
+
+ {translate key="plugins.generic.prereview.view.message"} +
+ {/if} + {/if} +
+
diff --git a/templates/request.tpl b/templates/request.tpl new file mode 100644 index 0000000..dbbdb32 --- /dev/null +++ b/templates/request.tpl @@ -0,0 +1,17 @@ + +{* Form to display radiobuttons of choice of display at the end of a shipment. *} +{fbvFormSection class="section-author pkpFormField--options" list="true" translate=false} +

+ +

+

{translate key='plugins.generic.prereview.description.p1'}

+

{translate key='plugins.generic.prereview.description.p2'}

+

{translate key='plugins.generic.prereview.description.p3'}

+

Select option*

+ + + {fbvElement type="radio" label="plugins.generic.prereview.description.buttoncheck" value="request" id="prereviewRequest" name="prereview:authorization" class="required" required="true"} + {fbvElement type="radio" label="plugins.generic.prereview.description.notdisplay" value="notdisplay" id="prereviewNotdisplay" name="prereview:authorization" } + {fbvElement type="radio" label="plugins.generic.prereview.description.notsolicit" value="no" id="prereviewNo" name="prereview:authorization" } + +{/fbvFormSection} diff --git a/templates/settings.tpl b/templates/settings.tpl new file mode 100644 index 0000000..594e824 --- /dev/null +++ b/templates/settings.tpl @@ -0,0 +1,36 @@ +{** + * templates/settings.tpl + * The basic setting tab for the PREreview plugin. + *} + + +
+
+ {csrf} + {fbvFormArea id="prereviewApiKeys" title="plugins.generic.prereview.apisettings.title" class="border"} + + {fbvFormSection for="prereviewApiKeys"} +

{translate key="plugins.generic.prereview.apisettings"}

+ {fbvElement type="text" label="plugins.generic.prereview.apisettings.name" id="prereviewApp" required="true" value=$prereviewApp size=$fbvStyles.size.MEDIUM} + {fbvElement type="text" label="plugins.generic.prereview.apisettings.key" id="prereviewkey" required="true" value=$prereviewkey size=$fbvStyles.size.MEDIUM} + {/fbvFormSection} + {/fbvFormArea} + {fbvFormArea id="prereviewOption" title="plugins.generic.prereview.apisettings.option"} + {fbvFormSection list="true"} +

{translate key="plugins.generic.prereview.apisettings.optionDescription"}

+

{translate key="plugins.generic.prereview.apisettings.optionDescription.ask"}

+ {fbvElement type="radio" id="showRevisions" name="showRevisions" value="rapid" label="plugins.generic.prereview.apisettings.showrevisions" checked=$showRevisions|compare:"rapid"} + {fbvElement type="radio" id="showRevisionsFull" name="showRevisions" value="full" label="plugins.generic.prereview.apisettings.showrevisionsLong" checked=$showRevisions|compare:"full"} + {fbvElement type="radio" id="showRevisionsBoth" name="showRevisions" value="both" label="plugins.generic.prereview.apisettings.showrevisionsBoth" checked=$showRevisions|compare:"both"} + {/fbvFormSection} + + {/fbvFormArea} + {fbvFormButtons} + +
+
diff --git a/templates/workflowPrereview.tpl b/templates/workflowPrereview.tpl new file mode 100644 index 0000000..23f535b --- /dev/null +++ b/templates/workflowPrereview.tpl @@ -0,0 +1,50 @@ + + +{capture assign=actionUrl}{url router=$smarty.const.ROUTE_COMPONENT component="plugins.generic.prereviewPlugin.controllers.grid.PrereviewGridHandler" op="updateRequest" submissionId=$submissionId escape=false}{/capture} + +
+ + +{fbvFormSection class="section-author pkpFormField--options" list="true" translate=false} +

+ +

+

{translate key='plugins.generic.prereview.description.p1'}

+

{translate key='plugins.generic.prereview.description.p2'}

+

{translate key='plugins.generic.prereview.description.p3'}

+

Select option*

+ + {fbvElement type="radio" label="plugins.generic.prereview.description.buttoncheck" value="request" id="prereviewRequest" name="prereview:authorization" required="true" checked=$publication|compare:"request"} + {fbvElement type="radio" label="plugins.generic.prereview.description.notdisplay" value="notdisplay" id="prereviewNotdisplay" name="prereview:authorization" checked=$publication|compare:"notdisplay"} + {fbvElement type="radio" label="plugins.generic.prereview.description.notsolicit" value="no" id="prereviewNo" name="prereview:authorization" checked=$publication|compare:"no"} + +{/fbvFormSection} + + {fbvFormSection class="formButtons pkpFormPage__footer"} + {assign var=buttonId value="submitFormButton"|concat:"-"|uniqid} + {fbvElement type="submit" class="submitFormButton" id=$buttonId label="common.save"} + {/fbvFormSection} + + +
+ +
+ + \ No newline at end of file diff --git a/version.xml b/version.xml new file mode 100644 index 0000000..ff74541 --- /dev/null +++ b/version.xml @@ -0,0 +1,10 @@ + + + + prereviewPlugin + plugins.generic + 0.1.0.0 + 2021-06-25 + 1 + PrereviewPlugin + \ No newline at end of file