//
// Copyright © 2018 SAP SE. All rights reserved.
//
// The following snippet shows the sample data being setup for the Bar chart
// The ViewController is now defined being derived from FUIChartSummaryDataSource
extension SalespersonAnalyticsViewController: FUIChartSummaryDataSource {
func chartView(_ chartView: FUIChartView, summaryItemForCategory categoryIndex: Int) -> FUIChartSummaryItem? {
let item = FUIChartSummaryItem()
item.categoryIndex = categoryIndex
item.isEnabled = true
item.isPreservingTrendHeight = false
let values: [Double] = {
var values: [Double] = []
for series in chartView.series {
values.append(series.valueForCategory(categoryIndex, dimension: 0)!)
}
return values
}()
item.valuesText = values.map { formattedTitleForDouble($0)! }
item.title.text = chartCategoryTitles()[categoryIndex]
return item
}
}
extension SalespersonAnalyticsViewController: FUIChartViewDataSource {
func formattedTitleForDouble(_ value: Double) -> String? {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .none
numberFormatter.maximumFractionDigits = 0
let formattedNumber = numberFormatter.string(from: value as NSNumber)!
return "$\(formattedNumber)k"
}
func chartSeriesTitles() -> [String] {
return ["Actual", "Target"]
}
func chartCategoryTitles() -> [String] {
return ["Adam Humprey", "Jimmy Patrick", "Franck Syren", "Alex Kilgo", "Kim Kilgo", "Sean Long", "Flash Ek-Ularnpun", "Lili Lin", "Luka Ning", "Rodhan Hickey", "Natasha Girotra", "Megan Zurcher", "Joan Wood", "Stanley Thomas Stadelman Jr."]
}
func chartData() -> [[Double]] {
return [[2.5, 2.2, 1.6, 2.8, 1.7, 0.9, 0.8, 1.95, 1.75, 1.33, 2.44, 1.4, 1.25, 1.8]]
}
func numberOfSeries(in: FUIChartView) -> Int {
return chartData().count
}
func chartView(_ chartView: FUIChartView, numberOfValuesInSeries seriesIndex: Int) -> Int {
return chartData()[seriesIndex].count
}
func chartView(_ chartView: FUIChartView, valueForSeries series: Int, category categoryIndex: Int, dimension dimensionIndex: Int) -> Double? {
return chartData()[series][categoryIndex] * 100.0
}
func chartView(_ chartView: FUIChartView, formattedStringForValue value: Double, axis: FUIChartAxisId) -> String? {
return formattedTitleForDouble(value)
}
func chartView(_ chartView: FUIChartView, titleForCategory categoryIndex: Int, inSeries seriesIndex: Int) -> String? {
return chartCategoryTitles()[categoryIndex]
}
}
extension NumberFormatter {
func string(fromOptional from: NSNumber?) -> String {
guard let value = from,
let string = self.string(from: value as NSNumber) else {
return ""
}
return string
}
}
import UIKit
import SAPFiori
class SalespersonAnalyticsViewController: FUIChartFloorplanViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.title = "Sales Chart"
self.chartView.chartType = .bar
self.chartView.numberOfGridlines = 4
self.chartView.dataSource = self
self.headerView.dataSource = self
self.titleText.text = "Total APE ($) by Salesperson"
self.status.text = "Updated 20m ago"
self.categoryAxisTitle.text = "Salesperson"
self.valuesAxisTitle.text = "Total APE ($)"
let item = FUIChartSummaryItem()
item.categoryIndex = -1
item.isEnabled = false
item.isPreservingTrendHeight = false
let values: [Double] = {
var values: [Double] = []
for series in chartView.series {
let categoriesUpperBound = series.numberOfValues - 1
if let valuesInSeries = series.valuesInCategoryRange((0...categoriesUpperBound), dimension: 0) {
values.append(valuesInSeries.flatMap({ $0 }).reduce(0.0, +))
}
}
return values
}()
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .currency
numberFormatter.maximumFractionDigits = 0
item.valuesText = values.map { "\(numberFormatter.string(from: $0 as NSNumber)!)k" }
item.title.text = "Team ($) APE"
self.headerView.addItem(item)
}
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: FUIObjectTableViewCell.reuseIdentifier, for: indexPath) as! FUIObjectTableViewCell
switch (indexPath.section, indexPath.row) {
case (0, _) :
cell.headlineLabel.text = self.collections[indexPath.row].rawValue
cell.accessoryType = !self.isPresentedInSplitView ? .disclosureIndicator : .none
cell.isMomentarySelection = false
return cell
default:
cell.textLabel?.text = "Row Chart Floorplan"
return cell
}
}
To display two sections change the TableView function to the following functions:
// Return two sections now
override func numberOfSections(in _: UITableView) -> Int {
return 2
override func tableView(_: UITableView, numberOfRowsInSection section: Int) -> Int {
switch section {
case 0:
return self.collections.count
case 1:
return 1
default:
return 2
}
}
After this, modify the TableView cell to display the Bar Chart when the ‘Row Chart Floorplan’ cell is selected:
override func tableView(_: UITableView, didSelectRowAt indexPath: IndexPath) {
let sectionIndex = indexPath.section
if (sectionIndex == 1) {
let vc = SalespersonAnalyticsViewController()
self.navigationController?.pushViewController(vc, animated: true)
}
else {
self.selectedIndex = indexPath
self.collectionSelected(at: indexPath)
}
}
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
39 | |
25 | |
17 | |
13 | |
7 | |
7 | |
7 | |
7 | |
6 | |
6 |