tra('Proposal'), 'documentation' => 'PluginProposal', 'description' => tra('Allow users to vote on a proposal and view the results'), 'prefs' => [ 'wikiplugin_proposal' ], 'body' => tra('The list of votes cast. One vote per line. Either 0, +1 or -1 followed by a username.'), 'iconname' => 'thumbs-up', 'introduced' => 3, 'tags' => [ 'basic' ], 'params' => [ 'caption' => [ 'required' => false, 'name' => tra('Caption'), 'description' => tra('Short description of the proposal to vote on. Will be displayed above the result table.'), 'since' => '3.0', 'filter' => 'text', 'default' => '', ], 'weights' => [ 'required' => false, 'advanced' => true, 'name' => tr('Weights'), 'description' => tr('Comma-separated list of groups and their associated weight. Default is %0Registered(1)%1 Example:', '', '') . ' Reviewer(2.5),User(1),Manager(0.25),Registered(0)', 'since' => '10.0', 'filter' => 'text', 'default' => 'Registered(1)', ], ] ]; } function wikiplugin_proposal_save($context, $data, $params) { $attributelib = TikiLib::lib('attribute'); static $objects = []; $key = $context['type'] . ':' . $context['object']; if (! isset($objects[$key])) { $objects[$key] = [ '+1' => 0, '0' => 0, '-1' => 0 ]; } $counts = wikiplugin_proposal_get_counts($data); $objects[$key]['+1'] += $counts['weights']['+1']; $objects[$key]['0'] += $counts['weights']['0']; $objects[$key]['-1'] += $counts['weights']['-1']; $attributelib->set_attribute($context['type'], $context['object'], 'tiki.proposal.accept', $objects[$key]['+1']); $attributelib->set_attribute($context['type'], $context['object'], 'tiki.proposal.undecided', $objects[$key]['0']); $attributelib->set_attribute($context['type'], $context['object'], 'tiki.proposal.reject', $objects[$key]['-1']); } function wikiplugin_proposal($data, $params) { $counts = wikiplugin_proposal_get_counts($data); unset($counts['weights']); global $user, $tiki_p_edit; $smarty = TikiLib::lib('smarty'); $smarty->assign('counts', $counts); if ($user && $tiki_p_edit == 'y') { $weight = wikiplugin_proposal_get_weight($user, $params); $availableVotes = [ tra('Accept proposal') => "$data\n+1~$weight $user", tra('Still undecided') => "$data\n0~$weight $user", tra('Reject proposal') => "$data\n-1~$weight $user", ]; $smarty->assign('available_votes', $availableVotes); } static $passes; $smarty->assign('passes', ++$passes); $smarty->assign('params', $params); $content = $smarty->fetch('wiki-plugins/wikiplugin_proposal.tpl'); return "~np~$content~/np~"; } function wikiplugin_proposal_get_counts($data) { $voteData = explode("\n", $data); $votes = []; foreach ($voteData as $entry) { $entry = trim($entry); if (preg_match("/^(([\+\-]1)|0)(~(\d+(\.\d+)?))?\s+(\w+)/", $entry, $parts)) { list( , $vote, , , $weight, , $voter ) = $parts; if (strlen($weight) == 0) { $weight = 1; } else { $weight = (float) $weight; } $votes[$voter] = [$vote, $weight]; } } $counts = [ '+1' => [], '0' => [], '-1' => [], 'weights' => [ '+1' => 0, '0' => 0, '-1' => 0, ], ]; foreach ($votes as $voter => $values) { list($vote, $weight) = $values; $counts[$vote][] = $voter; $counts['weights'][$vote] += $weight; } return $counts; } function wikiplugin_proposal_get_weight($user, array $params) { $weights = []; if (isset($params['weights'])) { $parts = explode(',', $params['weights']); foreach ($parts as $part) { if (preg_match('/^(.+)\((\d+(\.\d+)?)\)$/', $part, $segments)) { $weights[trim($segments[1])] = (float) $segments[2]; } } } if (count($weights) == 0) { $weights['Registered'] = 1.0; } $groups = Perms::get()->getGroups(); foreach ($weights as $group => $weight) { if (in_array($group, $groups)) { return $weight; } } return 0; }