Commit 41f46bd5 authored by Shawn Kwang's avatar Shawn Kwang

Drupal: Add module flag_abuse_reason.

This is a 'replacement' for the flag_abuse module. It contains the feature that when a user clicks Report to flag content for abuse a drop-down with different reasons.

Note: this module must work with conjunction with BOINC theme which has the dropdown in the templates.

Part of
https://dev.gridrepublic.org/browse/DBOINCP-298
parent e7a545e7
/* $Id$ */
/**
* @file
*
* CSS-style for flag-abuse-reason content
*/
.dropbtn {
background-color: #3498DB;
color: white;
padding: 16px;
font-size: 16px;
border: none;
cursor: pointer;
}
.dropbtn:hover, .dropbtn:focus {
background-color: #2980B9;
}
.dropdown {
position: relative;
display: inline-block;
}
.dropdown-content {
display: none;
position: absolute;
background-color: #f1f1f1;
min-width: 160px;
overflow: auto;
box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
z-index: 1;
}
.dropdown-content a {
color: black;
padding: 12px 16px;
text-decoration: none;
display: block;
}
.dropdown a:hover {background-color: #ddd;}
.show {display: block;}
\ No newline at end of file
; $Id$
name = Flag Abuse Reason
description = Allow users to give a reason for flagged content
core = 6.x
package = Flags
dependencies[] = comment
dependencies[] = flag
dependencies[] = node
dependencies[] = user
project = "flag_abuse_reason"
datestamp = "1557420000"
version = "6.x-1.x"
<?php
// $Id$
/**
* @file
* Create a flag link with a JS dropdown with reasons why content has
* been flagged for abuse.
*/
/* * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Hooks into flag module
* * * * * * * * * * * * * * * * * * * * * * * * * * * */
/**
* Implementation of hook_flag_default_flags()
*/
function flag_abuse_reason_flag_default_flags() {
$flags = array();
module_load_include('inc', 'flag_abuse_reason', 'includes/flag_abuse_reason.flag_default');
_flag_abuse_reason_abuse_node_flags($flags);
_flag_abuse_reason_abuse_comment_flags($flags);
_flag_abuse_reason_abuse_user_flags($flags);
return $flags;
}
/**
* Implementation of hook_views_api().
*/
function flag_abuse_reason_views_api() {
return array(
'api' => 2.0,
'path' => drupal_get_path('module', 'flag_abuse_reason') . '/includes',
);
}
/**
* Implementation of hook_perm().
*/
function flag_abuse_reason_perm() {
return array('reset abuse flags');
}
/**
* Implementation of hook_preprocess_flag().
*
* Here we change our flag event/action to 'reset'.
*/
function flag_abuse_reason_preprocess_flag(&$vars) {
drupal_add_js(drupal_get_path('module', 'flag_abuse_reason') . "/includes/flag_abuse_reason.js");
drupal_add_css(drupal_get_path('module', 'flag_abuse_reason') . "/css/flag_abuse_reason.css");
global $user;
// permmission check instead of a role
if (user_access('reset abuse flags', $user)) {
$metaflags = array('abuse_node_meta', 'abuse_comment_meta', 'abuse_user_meta');
// Is this one of our abuse flags?
if (in_array($vars['flag']->name, $metaflags)) {
// count the number of flags on this content
$count = db_result(db_query("SELECT COUNT(*) FROM {flag_content} WHERE content_id=%d AND fid=%d", $vars['content_id'], $vars['flag']->fid));
// If the variable <flagname>-<contentid> is set, then Reset
// completely.
if (variable_get($vars['flag']->name.'-'.$vars['content_id'], FALSE)) {
$vars['action'] = 'none';
$vars['link_text'] = t('Reset Completely');
$vars['link_title'] = t('Reset everying, allows users to re-flag content.');
}
else {
// If there are flags on this content, clear the flags and
// lock the content.
if ($count>0) {
$vars['action'] = 'reset';
$vars['link_text'] = t('Clear Reports and Lock');
$vars['link_title'] = t('Remove all flags on this content and prevent any new flagging.');
}
// Otherwise the link is shown but has no effect.
else {
$vars['action'] = 'none';
$vars['link_text'] = t('No abuse reports');
$vars['link_title'] = t('This content has no abuse reports. Link does nothing.');
}
}
}
}
}
/**
* Implementation of hook_flag().
*
* If a user with appropriate permission/role flags this content from our view
* we want to remove all flags. http://drupal.org/node/327901#comment-1085685
*/
function flag_abuse_reason_flag($event, $flag, $content_id, $account) {
$metaflags = array('abuse_node_meta', 'abuse_comment_meta', 'abuse_user_meta');
// For privileged users, check permissions and reset flags
// permission check instead of a role.
if (user_access('reset abuse flags', $account)) {
// Is this one of our abuse flags?
if (in_array($flag->name, $metaflags)) {
// Reset the flags completely.
if (variable_get($flag->name.'-'.$content_id, FALSE)) {
// Since the user flags the content again, we need to unflag it.
flag_reset_flag($flag, $content_id);
// @todo - replace t() with bts()
drupal_set_message(t('INFO: Reset everything. Users may reflag this content.', array('!rows' => $rows)), 'info');
// unlock flag; effectively resets flags for this content
variable_del($flag->name.'-'.$content_id);
}
else {
// Clear and Lock all flags on this content.
$dbresult = db_query("SELECT DISTINCT fid FROM {flag_content} WHERE content_id = %d", $content_id);
$rows = 0;
while ($myfid = db_fetch_array($dbresult)) {
$myflag = flag_get_flag(NULL, array_pop($myfid));
$rows += flag_reset_flag($myflag, $content_id);
}
if ($rows) {
// This user actually flags the content as well, so it may
// confuse the user if they reset what they thought was one
// flag and we report two.
$rows--;
// @todo - replace t() with bts()
drupal_set_message(t('INFO: Cleared !rows flags. Content is now locked and may not be reflagged.', array('!rows' => $rows)), 'info');
// This is the line which sets a Drupal variable which
// prevents the flag link from showing again for all
// users. Effectively preventing the content from being
// flagged again.
variable_set($flag->name.'-'.$content_id, TRUE);
}
}
}
}
// Normal users may cancel their all their reported flags on this
// content.
else {
if ( ($event=='unflag') && (in_array($flag->name, $metaflags)) ) {
$allflags = flag_get_user_flags($flag->content_type, $content_id, $account->uid);
foreach ($allflags as $subflag) {
$myflag = flag_get_flag(NULL, $subflag->fid);
$rc = $myflag->flag('unflag', $content_id, $account);
}
}
}
}
/**
* Implementation of hook_flag_access().
*/
function flag_abuse_reason_flag_access($flag, $content_id, $action, $account) {
$metaflags = array('abuse_node_meta', 'abuse_comment_meta', 'abuse_user_meta');
if (in_array($flag->name, $metaflags)) {
// Check to see if this flag is locked.
if (variable_get($flag->name.'-'.$content_id, FALSE)) {
if (user_access('reset abuse flags', $account)) {
return TRUE;
}
else {
// Normal users see nothing when flag is locked.
return FALSE;
}
}
}
}
/**
* Implementation of hook_form_FORM_ID_alter().
*/
function flag_abuse_reason_form_flag_confirm_alter(&$form, &$form_state) {
global $user;
// Permmission check instead of a role.
if (user_access('reset abuse flags', $account)) {
$flag_name = $form['flag_name']['#value'];
// Is this one of our abuse flags?
if (in_array($flag_name, array('abuse_node_meta', 'abuse_comment_meta', 'abuse_user_meta'))) {
drupal_set_title(t('Flag reset'));
$form['description']['#value'] = t('Are you sure you want to reset all offensive flag on this content? Once doing so, users will not be able to flag this content again.');
$form['actions']['submit']['#value'] = t('Reset flags');
}
}
}
/**
* @file
*
* Javascript for flag_abuse_reason. Shows the dropdown box defined in
* the template.
*/
/**
* Useful variables/parameters
*
* data.contentId - Id of content, e.g., node id, comment id, etc.
* data.contentType - Type of content, e.g., node, comment, etc.
* data.flagName - Name of the flag.
* data.flagStatus - State of the flag.
*/
$(document).bind('flagGlobalBeforeLinkUpdate', function(event, data) {
/* dd is the dropdown defined the boinc template.
*/
var dd = 'flag_abuse_reason-dropdown-' + data.contentType + '-' + data.contentId;
var ddelement = document.getElementById(dd);
// Only node, comment, and user types are defined.
switch (data.contentType) {
case 'node':
/**
* Node
*/
// User clicks on the Report link
if ( window.getComputedStyle(ddelement).display === "none" &&
data.flagName == "abuse_node_meta" &&
data.flagStatus == "flagged" ) {
ddelement.style.display = "block";
}
if ( window.getComputedStyle(ddelement).display === "block" ) {
// User clicks on any of the flags in the drop down
if ( data.flagName != "abuse_node_meta" &&
data.flagStatus == "flagged" ) {
ddelement.style.display = "none";
}
// User clicks on Cancel Report
else if ( data.flagName == "abuse_node_meta" &&
data.flagStatus == "unflagged" ) {
ddelement.style.display = "none";
}
}
break;
case 'comment':
/**
* Comments
*/
// User clicks on the Report link
if ( window.getComputedStyle(ddelement).display === "none" &&
data.flagName == "abuse_comment_meta" &&
data.flagStatus == "flagged" ) {
ddelement.style.display = "block";
}
if ( window.getComputedStyle(ddelement).display === "block" ) {
// User clicks on any of the flags in the drop down
if ( data.flagName != "abuse_comment_meta" &&
data.flagStatus == "flagged" ) {
ddelement.style.display = "none";
}
// User clicks on Cancel Report
else if ( data.flagName == "abuse_comment_meta" &&
data.flagStatus == "unflagged" ) {
ddelement.style.display = "none";
}
}
break;
case 'user':
/**
* User
*/
// User clicks on the Report link
if ( window.getComputedStyle(ddelement).display === "none" &&
data.flagName == "abuse_user_meta" &&
data.flagStatus == "flagged" ) {
ddelement.style.display = "block";
}
if ( window.getComputedStyle(ddelement).display === "block" ) {
// User clicks on any of the flags in the drop down
if ( data.flagName != "abuse_user_meta" &&
data.flagStatus == "flagged" ) {
ddelement.style.display = "none";
}
// User clicks on Cancel Report
else if ( data.flagName == "abuse_user_meta" &&
data.flagStatus == "unflagged" ) {
ddelement.style.display = "none";
}
}
break;
} //switch
});
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment