Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b6ea1a502a | |||
| afcf328158 | |||
| 49cf12c568 | |||
| 0d4b942b74 | |||
| 30a369796f | |||
| f2f35312e4 | |||
| d32f09a584 | |||
| 80e179df1d | |||
| 48da335f09 | |||
| 70c1fb897c | |||
| 30df02f804 | |||
| 9ba20e9e14 | |||
| d6d1dd8461 | |||
| b0de620503 | |||
| 8e81fb20cd |
@@ -1,5 +1,9 @@
|
||||
# Changelog
|
||||
|
||||
## <a href="https://github.com/Jawbone/JBChartView/tree/v2.6.0">2.6.0</a>
|
||||
#### 07/24/14
|
||||
- Fixes issue <a href="https://github.com/Jawbone/JBChartView/pull/71">#71</a>.
|
||||
|
||||
## <a href="https://github.com/Jawbone/JBChartView/tree/v2.5.5">2.5.5</a>
|
||||
#### 05/13/14
|
||||
- Fixes issue <a href="https://github.com/Jawbone/JBChartView/pull/57">#57</a>.
|
||||
|
||||
@@ -127,6 +127,18 @@ typedef NS_ENUM(NSInteger, JBLineChartViewLineStyle){
|
||||
*/
|
||||
- (UIColor *)lineChartView:(JBLineChartView *)lineChartView colorForLineAtLineIndex:(NSUInteger)lineIndex;
|
||||
|
||||
/**
|
||||
* Returns the fill color of particular line at lineIndex within the chart.
|
||||
*
|
||||
* Default: clear color.
|
||||
*
|
||||
* @param lineChartView The line chart object requesting this information.
|
||||
* @param lineIndex An index number identifying a line in the chart.
|
||||
*
|
||||
* @return The fill color to show under a line in the chart.
|
||||
*/
|
||||
- (UIColor *)lineChartView:(JBLineChartView *)lineChartView fillColorForLineAtLineIndex:(NSUInteger)lineIndex;
|
||||
|
||||
/**
|
||||
* Returns the color of a particular dot in a line at lineIndex within the chart.
|
||||
* For this value to apply, showsDotsForLineAtLineIndex: must return YES for the line at lineIndex.
|
||||
@@ -207,6 +219,19 @@ typedef NS_ENUM(NSInteger, JBLineChartViewLineStyle){
|
||||
*/
|
||||
- (UIColor *)lineChartView:(JBLineChartView *)lineChartView selectionColorForLineAtLineIndex:(NSUInteger)lineIndex;
|
||||
|
||||
/**
|
||||
* Returns the selection fill color to be overlayed under a line within the chart during touch events.
|
||||
* The property showsLineSelection must be YES for the color to apply.
|
||||
*
|
||||
* Default: clear color.
|
||||
*
|
||||
* @param lineChartView The line chart object requesting this information.
|
||||
* @param lineIndex An index number identifying a line in the chart.
|
||||
*
|
||||
* @return The color to be used to highlight under a line during chart selections.
|
||||
*/
|
||||
- (UIColor *)lineChartView:(JBLineChartView *)lineChartView selectionFillColorForLineAtLineIndex:(NSUInteger)lineIndex;
|
||||
|
||||
/**
|
||||
* Returns the selection color to be overlayed on a line within the chart during touch events.
|
||||
* The property showsLineSelection must be YES for the color to apply.
|
||||
|
||||
+114
-3
@@ -46,8 +46,10 @@ static NSArray *kJBLineChartLineViewDefaultDashPattern = nil;
|
||||
|
||||
// Colors (JBLineChartView)
|
||||
static UIColor *kJBLineChartViewDefaultLineColor = nil;
|
||||
static UIColor *kJBLineChartViewDefaultDotColor = nil;
|
||||
static UIColor *kJBLineChartViewDefaultLineFillColor = nil;
|
||||
static UIColor *kJBLineChartViewDefaultLineSelectionColor = nil;
|
||||
static UIColor *kJBLineChartViewDefaultLineSelectionFillColor = nil;
|
||||
static UIColor *kJBLineChartViewDefaultDotColor = nil;
|
||||
static UIColor *kJBLineChartViewDefaultDotSelectionColor = nil;
|
||||
|
||||
@interface JBChartView (Private)
|
||||
@@ -64,6 +66,12 @@ static UIColor *kJBLineChartViewDefaultDotSelectionColor = nil;
|
||||
|
||||
@end
|
||||
|
||||
@interface JBFillLayer : CAShapeLayer
|
||||
|
||||
@property (nonatomic, assign) NSUInteger tag;
|
||||
|
||||
@end
|
||||
|
||||
@interface JBLineChartPoint : NSObject
|
||||
|
||||
@property (nonatomic, assign) CGPoint position;
|
||||
@@ -89,6 +97,7 @@ static UIColor *kJBLineChartViewDefaultDotSelectionColor = nil;
|
||||
|
||||
// View helpers
|
||||
- (JBLineLayer *)lineLayerForLineIndex:(NSUInteger)lineIndex;
|
||||
- (JBFillLayer *)fillLayerForLineIndex:(NSUInteger)lineIndex;
|
||||
|
||||
@end
|
||||
|
||||
@@ -97,6 +106,8 @@ static UIColor *kJBLineChartViewDefaultDotSelectionColor = nil;
|
||||
- (NSArray *)chartDataForLineChartLinesView:(JBLineChartLinesView*)lineChartLinesView;
|
||||
- (UIColor *)lineChartLinesView:(JBLineChartLinesView *)lineChartLinesView colorForLineAtLineIndex:(NSUInteger)lineIndex;
|
||||
- (UIColor *)lineChartLinesView:(JBLineChartLinesView *)lineChartLinesView selectedColorForLineAtLineIndex:(NSUInteger)lineIndex;
|
||||
- (UIColor *)lineChartLinesView:(JBLineChartLinesView *)lineChartLinesView fillColorForLineAtLineIndex:(NSUInteger)lineIndex;
|
||||
- (UIColor *)lineChartLinesView:(JBLineChartLinesView *)lineChartLinesView selectedFillColorForLineAtLineIndex:(NSUInteger)lineIndex;
|
||||
- (CGFloat)lineChartLinesView:(JBLineChartLinesView *)lineChartLinesView widthForLineAtLineIndex:(NSUInteger)lineIndex;
|
||||
- (CGFloat)paddingForLineChartLinesView:(JBLineChartLinesView *)lineChartLinesView;
|
||||
- (JBLineChartViewLineStyle)lineChartLinesView:(JBLineChartLinesView *)lineChartLinesView lineStyleForLineAtLineIndex:(NSUInteger)lineIndex;
|
||||
@@ -182,8 +193,10 @@ static UIColor *kJBLineChartViewDefaultDotSelectionColor = nil;
|
||||
if (self == [JBLineChartView class])
|
||||
{
|
||||
kJBLineChartViewDefaultLineColor = [UIColor blackColor];
|
||||
kJBLineChartViewDefaultDotColor = [UIColor blackColor];
|
||||
kJBLineChartViewDefaultLineFillColor = [UIColor clearColor];
|
||||
kJBLineChartViewDefaultLineSelectionColor = [UIColor whiteColor];
|
||||
kJBLineChartViewDefaultLineSelectionFillColor = [UIColor clearColor];
|
||||
kJBLineChartViewDefaultDotColor = [UIColor blackColor];
|
||||
kJBLineChartViewDefaultDotSelectionColor = [UIColor whiteColor];
|
||||
}
|
||||
}
|
||||
@@ -483,6 +496,24 @@ static UIColor *kJBLineChartViewDefaultDotSelectionColor = nil;
|
||||
return kJBLineChartViewDefaultLineSelectionColor;
|
||||
}
|
||||
|
||||
- (UIColor *)lineChartLinesView:(JBLineChartLinesView *)lineChartLinesView fillColorForLineAtLineIndex:(NSUInteger)lineIndex
|
||||
{
|
||||
if ([self.dataSource respondsToSelector:@selector(lineChartView:fillColorForLineAtLineIndex:)])
|
||||
{
|
||||
return [self.dataSource lineChartView:self fillColorForLineAtLineIndex:lineIndex];
|
||||
}
|
||||
return kJBLineChartViewDefaultLineFillColor;
|
||||
}
|
||||
|
||||
- (UIColor *)lineChartLinesView:(JBLineChartLinesView *)lineChartLinesView selectedFillColorForLineAtLineIndex:(NSUInteger)lineIndex
|
||||
{
|
||||
if ([self.dataSource respondsToSelector:@selector(lineChartView:selectionFillColorForLineAtLineIndex:)])
|
||||
{
|
||||
return [self.dataSource lineChartView:self selectionFillColorForLineAtLineIndex:lineIndex];
|
||||
}
|
||||
return kJBLineChartViewDefaultLineSelectionFillColor;
|
||||
}
|
||||
|
||||
- (CGFloat)lineChartLinesView:(JBLineChartLinesView *)lineChartLinesView widthForLineAtLineIndex:(NSUInteger)lineIndex
|
||||
{
|
||||
if ([self.dataSource respondsToSelector:@selector(lineChartView:widthForLineAtLineIndex:)])
|
||||
@@ -952,7 +983,7 @@ static UIColor *kJBLineChartViewDefaultDotSelectionColor = nil;
|
||||
self = [super init];
|
||||
if (self)
|
||||
{
|
||||
self.zPosition = 0.0f;
|
||||
self.zPosition = 0.1f;
|
||||
self.fillColor = [UIColor clearColor].CGColor;
|
||||
}
|
||||
return self;
|
||||
@@ -978,6 +1009,24 @@ static UIColor *kJBLineChartViewDefaultDotSelectionColor = nil;
|
||||
|
||||
@end
|
||||
|
||||
@implementation JBFillLayer
|
||||
|
||||
#pragma mark - Alloc/Init
|
||||
|
||||
- (id)init
|
||||
{
|
||||
self = [super init];
|
||||
if (self)
|
||||
{
|
||||
self.zPosition = 0.0f;
|
||||
self.strokeColor = [UIColor clearColor].CGColor;
|
||||
self.lineWidth = 0.0f;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation JBLineChartPoint
|
||||
|
||||
#pragma mark - Alloc/Init
|
||||
@@ -1048,11 +1097,14 @@ static UIColor *kJBLineChartViewDefaultDotSelectionColor = nil;
|
||||
|
||||
NSUInteger index = 0;
|
||||
NSArray *sortedLineData = [lineData sortedArrayUsingSelector:@selector(compare:)];
|
||||
CGFloat firstXPosition = 0.0f;
|
||||
CGFloat lastXPosition = 0.0f;
|
||||
for (JBLineChartPoint *lineChartPoint in sortedLineData)
|
||||
{
|
||||
if (index == 0)
|
||||
{
|
||||
[path moveToPoint:CGPointMake(lineChartPoint.position.x, fmin(self.bounds.size.height - padding, fmax(padding, lineChartPoint.position.y)))];
|
||||
firstXPosition = lineChartPoint.position.x;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1084,6 +1136,7 @@ static UIColor *kJBLineChartViewDefaultDotSelectionColor = nil;
|
||||
[path addLineToPoint:CGPointMake(lineChartPoint.position.x, fmin(self.bounds.size.height - padding, fmax(padding, lineChartPoint.position.y)))];
|
||||
}
|
||||
|
||||
lastXPosition = lineChartPoint.position.x;
|
||||
previousSlope = currentSlope;
|
||||
}
|
||||
previousLineChartPoint = lineChartPoint;
|
||||
@@ -1096,28 +1149,54 @@ static UIColor *kJBLineChartViewDefaultDotSelectionColor = nil;
|
||||
shapeLayer = [JBLineLayer layer];
|
||||
}
|
||||
|
||||
JBFillLayer *shapeFillLayer = [self fillLayerForLineIndex:lineIndex];
|
||||
if (shapeFillLayer == nil)
|
||||
{
|
||||
shapeFillLayer = [JBFillLayer layer];
|
||||
}
|
||||
|
||||
shapeLayer.tag = lineIndex;
|
||||
shapeFillLayer.tag = lineIndex;
|
||||
|
||||
NSAssert([self.delegate respondsToSelector:@selector(lineChartLinesView:lineStyleForLineAtLineIndex:)], @"JBLineChartLinesView // delegate must implement - (JBLineChartViewLineStyle)lineChartLineView:(JBLineChartLinesView *)lineChartLinesView lineStyleForLineAtLineIndex:(NSUInteger)lineIndex");
|
||||
shapeLayer.lineStyle = [self.delegate lineChartLinesView:self lineStyleForLineAtLineIndex:lineIndex];
|
||||
|
||||
NSAssert([self.delegate respondsToSelector:@selector(lineChartLinesView:colorForLineAtLineIndex:)], @"JBLineChartLinesView // delegate must implement - (UIColor *)lineChartLinesView:(JBLineChartLinesView *)lineChartLinesView colorForLineAtLineIndex:(NSUInteger)lineIndex");
|
||||
shapeLayer.strokeColor = [self.delegate lineChartLinesView:self colorForLineAtLineIndex:lineIndex].CGColor;
|
||||
|
||||
NSAssert([self.delegate respondsToSelector:@selector(lineChartLinesView:fillColorForLineAtLineIndex:)], @"JBLineChartLinesView // delegate must implement - (UIColor *)lineChartLinesView:(JBLineChartLinesView *)lineChartLinesView fillColorForLineAtLineIndex:(NSUInteger)lineIndex");
|
||||
shapeFillLayer.fillColor = [self.delegate lineChartLinesView:self fillColorForLineAtLineIndex:lineIndex].CGColor;
|
||||
|
||||
if (smoothLine == YES)
|
||||
{
|
||||
shapeLayer.lineCap = kCALineCapRound;
|
||||
shapeLayer.lineJoin = kCALineJoinRound;
|
||||
shapeFillLayer.lineCap = kCALineCapRound;
|
||||
shapeFillLayer.lineJoin = kCALineJoinRound;
|
||||
}
|
||||
else
|
||||
{
|
||||
shapeLayer.lineCap = kCALineCapButt;
|
||||
shapeLayer.lineJoin = kCALineJoinMiter;
|
||||
shapeFillLayer.lineCap = kCALineCapButt;
|
||||
shapeFillLayer.lineJoin = kCALineJoinMiter;
|
||||
}
|
||||
|
||||
NSAssert([self.delegate respondsToSelector:@selector(lineChartLinesView:widthForLineAtLineIndex:)], @"JBLineChartLinesView // delegate must implement - (CGFloat)lineChartLinesView:(JBLineChartLinesView *)lineChartLinesView widthForLineAtLineIndex:(NSUInteger)lineIndex");
|
||||
shapeLayer.lineWidth = [self.delegate lineChartLinesView:self widthForLineAtLineIndex:lineIndex];
|
||||
shapeLayer.path = path.CGPath;
|
||||
shapeLayer.frame = self.bounds;
|
||||
|
||||
// Continue the path for the fill layer (close and fill)
|
||||
UIBezierPath *fillPath = [path copy];
|
||||
|
||||
[fillPath addLineToPoint:CGPointMake(lastXPosition, self.bounds.size.height - padding)];
|
||||
[fillPath addLineToPoint:CGPointMake(firstXPosition, self.bounds.size.height - padding)];
|
||||
|
||||
shapeFillLayer.path = fillPath.CGPath;
|
||||
shapeFillLayer.frame = self.bounds;
|
||||
|
||||
[self.layer addSublayer:shapeFillLayer];
|
||||
[self.layer addSublayer:shapeLayer];
|
||||
|
||||
lineIndex++;
|
||||
@@ -1160,6 +1239,21 @@ static UIColor *kJBLineChartViewDefaultDotSelectionColor = nil;
|
||||
((JBLineLayer *)layer).opacity = (weakSelf.selectedLineIndex == kJBLineChartLinesViewUnselectedLineIndex) ? 1.0f : kJBLineChartLinesViewDefaultDimmedOpacity;
|
||||
}
|
||||
}
|
||||
else if ([layer isKindOfClass:[JBFillLayer class]])
|
||||
{
|
||||
if (((NSInteger)((JBFillLayer *)layer).tag) == weakSelf.selectedLineIndex)
|
||||
{
|
||||
NSAssert([self.delegate respondsToSelector:@selector(lineChartLinesView:selectedFillColorForLineAtLineIndex:)], @"JBLineChartLinesView // delegate must implement - (UIColor *)lineChartLinesView:(JBLineChartLinesView *)lineChartLinesView selectedFillColorForLineAtLineIndex:(NSUInteger)lineIndex");
|
||||
((JBFillLayer *)layer).fillColor = [self.delegate lineChartLinesView:self selectedFillColorForLineAtLineIndex:((JBLineLayer *)layer).tag].CGColor;
|
||||
((JBFillLayer *)layer).opacity = 1.0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
NSAssert([self.delegate respondsToSelector:@selector(lineChartLinesView:fillColorForLineAtLineIndex:)], @"JBLineChartLinesView // delegate must implement - (UIColor *)lineChartLinesView:(JBLineChartLinesView *)lineChartLinesView fillColorForLineAtLineIndex:(NSUInteger)lineIndex");
|
||||
((JBFillLayer *)layer).fillColor = [self.delegate lineChartLinesView:self fillColorForLineAtLineIndex:((JBLineLayer *)layer).tag].CGColor;
|
||||
((JBFillLayer *)layer).opacity = (weakSelf.selectedLineIndex == kJBLineChartLinesViewUnselectedLineIndex) ? 1.0f : kJBLineChartLinesViewDefaultDimmedOpacity;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1192,6 +1286,8 @@ static UIColor *kJBLineChartViewDefaultDotSelectionColor = nil;
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - View Helpers
|
||||
|
||||
- (JBLineLayer *)lineLayerForLineIndex:(NSUInteger)lineIndex
|
||||
{
|
||||
for (CALayer *layer in [self.layer sublayers])
|
||||
@@ -1207,6 +1303,21 @@ static UIColor *kJBLineChartViewDefaultDotSelectionColor = nil;
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (JBFillLayer *)fillLayerForLineIndex:(NSUInteger)lineIndex
|
||||
{
|
||||
for (CALayer *layer in [self.layer sublayers])
|
||||
{
|
||||
if ([layer isKindOfClass:[JBFillLayer class]])
|
||||
{
|
||||
if (((JBFillLayer *)layer).tag == lineIndex)
|
||||
{
|
||||
return (JBFillLayer *)layer;
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation JBLineChartDotsView
|
||||
|
||||
+3
-3
@@ -1,16 +1,16 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = "JBChartView"
|
||||
s.version = "2.5.5"
|
||||
s.version = "2.6.0"
|
||||
s.summary = "Jawbone's iOS-based charting library for both line and bar graphs."
|
||||
s.homepage = "https://github.com/Jawbone/JBChartView"
|
||||
|
||||
s.screenshot = "https://raw.github.com/Jawbone/JBChartView/master/Screenshots/main.png"
|
||||
s.screenshot = "https://raw.github.com/Jawbone/JBChartView/master/Screenshots/main.jpg"
|
||||
|
||||
s.license = { :type => 'Apache', :file => 'LICENSE' }
|
||||
s.author = { "Terry Worona" => "tworona@jawbone.com" }
|
||||
s.source = {
|
||||
:git => "https://github.com/Jawbone/JBChartView.git",
|
||||
:tag => "v2.5.5"
|
||||
:tag => "v2.6.0"
|
||||
}
|
||||
|
||||
s.platform = :ios, '7.0'
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# JBChartView
|
||||
<br/>
|
||||
<p align="center">
|
||||
<img src="https://raw.github.com/Jawbone/JBChartView/master/Screenshots/main.png">
|
||||
<img src="https://raw.github.com/Jawbone/JBChartView/master/Screenshots/main.jpg">
|
||||
</p>
|
||||
|
||||
Introducing <b>JBChartView - </b> Jawbone's iOS-based charting library for both line and bar graphs. It is easy to set-up, and highly customizable.
|
||||
@@ -21,10 +21,15 @@ Refer to the <a href="https://github.com/Jawbone/JBChartView/blob/master/CHANGEL
|
||||
- Requires iOS 7 or later
|
||||
- Requires Automatic Reference Counting (ARC)
|
||||
|
||||
## Demo
|
||||
## Demo Project
|
||||
|
||||
Build and run the <i>JBChartViewDemo</i> project in Xcode. The demo demonstrates the use of both the line and bar charts. It also outlines how a chart's appearance can be customized.
|
||||
|
||||
## More Demos
|
||||
|
||||
- <a href="https://github.com/Jawbone/anscombe-quartet-ios">Amsombe's Quartet</a>: project showcasing the use of JBChartView in the classic data visualization example known as Anscombe's Quartet.
|
||||
- <a href="https://github.com/Jawbone/spark-friends-ios">Spark Friends</a>: project showcasing the use of JBChartView in the context of sparklines and (fake) user step data.
|
||||
|
||||
## Installation
|
||||
|
||||
<a href="http://cocoapods.org/" target="_blank">CocoaPods</a> is the recommended method of installing JBChartView.
|
||||
@@ -38,7 +43,7 @@ Simply add the following line to your <code>Podfile</code>:
|
||||
Your Podfile should look something like:
|
||||
|
||||
platform :ios, '7.0'
|
||||
pod 'JBChartView', '~> 2.5.5'
|
||||
pod 'JBChartView', '~> 2.6.0'
|
||||
|
||||
### The Old School Way
|
||||
|
||||
@@ -52,6 +57,17 @@ The simpliest way to use JBChartView with your application is to drag and drop t
|
||||
|
||||
All JBChartView implementations have a similiar data source and delgate pattern to <i>UITableView</i>. If you're familiar with using a <i>UITableView</i> or <i>UITableViewController</i>, using a JBChartView subclass should be a breeze!
|
||||
|
||||
#### Swift Projects
|
||||
|
||||
To use JBCartView in a Swift project add the following to your bridging header (JBChartView-Bridging-Header.h):
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import "JBChartView/JBChartView.h"
|
||||
#import "JBChartView/JBBarChartView.h"
|
||||
#import "JBChartView/JBLineChartView.h"
|
||||
|
||||
For more information about adding bridging headers see <a href="https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html" target="_blank">Swift and Objective-C in the Same Project</a>.
|
||||
|
||||
#### JBBarChartView
|
||||
|
||||
To initialize a <i>JBBarChartView</i>, you only need a few lines of code (see below). Bar charts can also be initialized via a <b>nib</b> or with a <b>frame</b>.
|
||||
@@ -175,6 +191,11 @@ The color, width and style of each line in the chart can be customized via the <
|
||||
return ...; // color of line in chart
|
||||
}
|
||||
|
||||
- (UIColor *)lineChartView:(JBLineChartView *)lineChartView fillColorForLineAtLineIndex:(NSUInteger)lineIndex
|
||||
{
|
||||
return ...; // color of area under line in chart
|
||||
}
|
||||
|
||||
- (CGFloat)lineChartView:(JBLineChartView *)lineChartView widthForLineAtLineIndex:(NSUInteger)lineIndex
|
||||
{
|
||||
return ...; // width of line in chart
|
||||
@@ -202,6 +223,11 @@ Furthermore, the color and width of the selection view along with the color of t
|
||||
return ...; // color of selected line
|
||||
}
|
||||
|
||||
- (UIColor *)lineChartView:(JBLineChartView *)lineChartView selectionFillColorForLineAtLineIndex:(NSUInteger)lineIndex
|
||||
{
|
||||
return ...; // color of area under selected line
|
||||
}
|
||||
|
||||
By default, each line will not show dots for each point. To enable this on a per-line basis:
|
||||
|
||||
- (BOOL)lineChartView:(JBLineChartView *)lineChartView showsDotsForLineAtLineIndex:(NSUInteger)lineIndex;
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 58 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 157 KiB |
Reference in New Issue
Block a user