• Stars
    star
    118
  • Rank 299,923 (Top 6 %)
  • Language
    Swift
  • License
    MIT License
  • Created over 6 years ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A modern way to filter things in your iOS apps

CI Status Version License Platform Documentation Swift

Description

Charcoal is a declarative library that simplifies the creation of modern filtering experiences. It allows you in a flexible way to represent complex filtering flows in just a few steps. When building Charcoal we have taken major steps to ensure every UI element is refined to provide a great experience to your users, taking in account things such as accessibility and customization.

At FINN, filtering is one of the key elements of our native apps and we believe we are not alone on this, this is why we have taken the time and effort to share our countless hours of iterations and redesigns to share with you what we believe is one of the best filtering experiences, say hi to Charcoal.

Why Charcoal?

Charcoal /ˈtʃɑːkəʊl/: a porous black solid, consisting of an amorphous form of carbon, obtained as a residue when wood, bone, or other organic matter is heated in the absence of air. Used among other things as an effective component of filtering.

Features

  • Out-of-the-box implementations of various filters
  • Simple configuration and easy to use public API
  • All-in-one solution for handling of complex filtering flows
  • Beautiful design, UI animations and accessibility support
  • Haptic feedback

Demo

Installation

CocoaPods

Charcoal is available through CocoaPods. To install the core module of the framework, simply add the following line to your Podfile:

pod "Charcoal", git: "https://github.com/finn-no/charcoal-ios"

You will also need to include the FinniversKit dependency in your Podfile.

pod "FinniversKit", git: "https://github.com/finn-no/FinniversKit"

For using FINN-specific configuration in addition to core functionality:

pod 'Charcoal/FINN', git: "https://github.com/finn-no/charcoal-ios"

Swift Package Manager

Xcode

Add Charcoal to your project through Xcode by navigating to File > Swift Packages > Add Package Dependency and specify https://github.com/finn-no/charcoal-ios.

Manual – Package.swift

Add this line to your Package.swift. We may not always update the version string below in this README, so make sure to check the list of available tags and select the newest one.

.package(name: "Charcoal", url: "https://github.com/finn-no/charcoal-ios.git", from: "10.0.0")

Don't forget to add Charcoal as a dependency to your intended target!

Usage

  1. Create filter container with a list of filters, for example:
let container = FilterContainer(
    rootFilters: [
        // Multi-level list filter
        Filter(title: "Area", key: "area", subfilters: [
            Filter(title: "Oslo", key: "area", value: "Oslo"),
            Filter(title: "Bergen", key: "area", value: "Bergen"),
        ]),
        // Range slider with number inputs
        Filter.range(
            title: "Price",
            key: "price",
            lowValueKey: "price_from",
            highValueKey: "price_to",
            config: RangeFilterConfiguration(
                minimumValue: 1000,
                maximumValue: 100000,
                valueKind: .incremented(1000),
                hasLowerBoundOffset: false,
                hasUpperBoundOffset: true,
                unit: .currency,
                usesSmallNumberInputFont: false
            )
        ),
        // Map filter
        Filter.map(
            title: "Map",
            key: "map",
            latitudeKey: "latitude",
            longitudeKey: "longitude",
            radiusKey: "radius",
            locationKey: "location"
        )
    ],
    freeTextFilter: Filter.freeText(key: "query"),
    inlineFilter: Filter.inline(title: "", key: "inline", subfilters: inlineFilters),
    numberOfResults: 100
)
  1. Create CharcoalViewController, set optional delegates and data sources for handling selection changes, responding to user interactions with the map and free text search filters, etc.:
let viewController = CharcoalViewController()
viewController.mapDataSource = mapDataSource
viewController.searchLocationDataSource = searchLocationDataSource
viewController.freeTextFilterDataSource = freeTextFilterService
viewController.freeTextFilterDelegate = freeTextFilterService
viewController.selectionDelegate = self
viewController.textEditingDelegate = self
  1. Assign an instance of filter container to your view controller:
viewController.filterContainer = filterContainer
  1. If needed, pre-select some of the filters by using a set of URLQueryItem's, where name of the query item is the filter key and value is the selected filter value:
let selection = Set([
    URLQueryItem(name: "area", value: "Oslo"),
    URLQueryItem(name: "price_from", value: "10000")
])
viewController.set(selection: selection)

Changelogs

This project has a Gemfile that specify some development dependencies, one of those is pr_changelog which is a tool that helps you to generate changelogs from the Git history of the repo. You install this by running bundle install.

To get the changes that have not been released yet just run:

$ pr_changelog

If you want to see what changes were released in the last version, run:

$ pr_changelog --last-release

You can always run the command with the --help flag when needed.

Dependencies

Some of the UI elements in Charcoal are taken from FinniversKit, a framework which holds all the UI elements of the FINN iOS app.

Creating a new release

Setup

  • Install dependencies listed in Gemfile with bundle install (dependencies will be installed in ./bundler)
  • Fastlane will use the GitHub API, so make sure to create a personal access token here and place it within an environment variable called CHARCOAL_GITHUB_ACCESS_TOKEN.
    • When creating a token, you only need to give access to the scope repo.
    • There are multiple ways to make an environment variable, for example by using a .env file or adding it to .bashrc/.bash_profile). Don't forget to run source .env (for whichever file you set the environment variables in) if you don't want to restart your shell.
    • Run bundle exec fastlane verify_environment_variable to see if it is configured correctly.
  • Run bundle exec fastlane verify_ssh_to_github to see if ssh to GitHub is working.

Make release

  • Run bundle exec fastlane make_charcoal_version. Follow instructions, you will be asked for confirmation before all remote changes.
  • After the release has been created you can edit the description on GitHub by using the printed link.

License

Charcoal is available under the MIT license. See the LICENSE file for more info.

More Repositories

1

BottomSheet

Custom modal presentation style for thumb-friendly interactive views
Swift
367
star
2

FinniversKit

FINN's iOS UI Components
Swift
192
star
3

xss-html-filter

Open Sourced HTML filtering utility for Java. Used to parse user-submitted input and sanitize it against potential cross site scripting attacks, malicious html, or simply badly formed html.
Java
117
star
4

android_emulator_hacks

We run android espresso instrumentation tests on bamboo. This worked extremely randomly due to a few issues that we've tried to solve with this app.
Java
69
star
5

Finjinon

Custom iOS camera optimized for taking a sequence of photos quickly and/or selecting from an image picker
Swift
58
star
6

recsys_slates_dataset

FINN.no Slate Dataset for Recommender Systems. A dataset containing all interactions (viewed items + response (clicked item / no click) for users over a longer time horizon.
Python
52
star
7

grafana-dashboards

Shell
48
star
8

maven-dependency-mapper

Maven reverse dependency tree
Java
28
star
9

Diffuse

Diffuse is library that aims to simplify the diffing of two collections
Swift
23
star
10

maven-deploy

A simple NodeJS module to create a war/jar package and install to a local Maven repository or deploy to a remote one
JavaScript
20
star
11

lambda-companion

Java
19
star
12

capturandro

Image capture handling in Android made easy
Java
15
star
13

Paw

A library to represent object details
Swift
14
star
14

carousel-js

Our general purpose carousel widget which can be used for multiple use-cases.
JavaScript
13
star
15

terraform-provider-softlayer

This is a provider for Terraform that lets you provision infrastructure on SoftLayer.
Go
12
star
16

cross-domain-events

Event-like api for postMessage to send objects between cross-domain frames
JavaScript
12
star
17

stash-client

Simple Ruby client for the Atlassian Stash REST API
Ruby
11
star
18

tech.finn.no

Our technology blog
HTML
10
star
19

retriable-kafka-consumer

Retriable consumer pool for kafka
Java
10
star
20

cassandra-hadoop

Provides Hadoop-0.21+ integration into Cassandra. Stems from Dave Brosius work in CASSANDRA-5201
Java
9
star
21

finn-rest-api-php-demo-client

PHP sample code for clients getting started with the FINN REST API
8
star
22

node-docker

Shell
7
star
23

cookie-police

Cookie Police protects document.cookie for you 👮
JavaScript
6
star
24

finnui-ios

FINN.no UI for iOS app
Swift
6
star
25

keras-conv-sentence-classifier

Keras Implementation of "Convolutional Neural Networks for Sentence Classification"
Python
6
star
26

rxactivityresponse

A library for using rx + onActivityResponse/onRequestPermissionsResult on android. For example for using rx and permissions/gplay settings/google login etc.
Java
6
star
27

finnflow

FINN's internally used additions to square's flow pattern.
Java
5
star
28

apps-handbook

Your welcome guide to the Apps team at FINN
5
star
29

query-params

Very simple CommonJS-module to encode/decode query parameters
JavaScript
5
star
30

eventlistener

Super-simple wrapper around addEventListener and attachEvent (old IE). Does not handle differences in the Event-objects.
JavaScript
5
star
31

simplehub

Simple event hub
JavaScript
4
star
32

maven_pom

Tiny Ruby library to work with Maven's pom.xml files.
Ruby
4
star
33

unleash-client-haskell

An Unleash client SDK for Haskell
Haskell
4
star
34

cdn-uploader

Small tool uploading assets to CDN backend (Google Cloud Storage)
JavaScript
4
star
35

finn-no.github.com

Our page on GitHub
HTML
4
star
36

migrate-npm-registry

Helper script to migrate all packages from one npm registry to another
JavaScript
3
star
37

puppet-confluent

Puppet module for setting up confluent.io kafka/zookeeper/restservice/schemaregistry
Puppet
3
star
38

guava-metrics

Java
3
star
39

solr-integrationtest-support

Integration testing with Solr made easy
Java
3
star
40

define-options

Micro lib to define valid properties for an options litteral, and return a function that can validate the options.
JavaScript
3
star
41

prometheus-haproxy-log-exporter

Fork of http://git.cbaines.net/prometheus-haproxy-log-exporter/
Python
3
star
42

geocluster

Java
2
star
43

lifestyle

node.js client for FINN REST API
JavaScript
2
star
44

redux-actions

Write actions and reducers for Redux with less boilerplate
JavaScript
2
star
45

json-manifest

Create a JSON manifest of static asset files having hash in their filenames
JavaScript
2
star
46

Yammer-Java-SDK

Simple java http client to work with Yammer's REST APIs.
Java
2
star
47

eslint-config-finn

ESLint config for Finn.no
JavaScript
2
star
48

ios-handbook

Handbook on how to build excellent iOS apps at FINN
2
star
49

tiles-mustache-example

Tiles / mustache example web application [DEPRECATED]
Java
2
star
50

DemoKit-iOS

Swift
2
star
51

js-code-style

FINN.no's config files and a CLI to check JavaScript code style
JavaScript
1
star
52

maven-repo-worker

Simple app to make working with maven repositories easy
Ruby
1
star
53

finnsect

Node.js app for API monitoring and profiling
CSS
1
star
54

openjdk8bond

Shell
1
star
55

Notifications-Maven-Plugin

Send notifications from maven
Java
1
star
56

js-date-formatter

JavaScript
1
star
57

confboard

Webapp to compare *.{ini,properties} files
JavaScript
1
star
58

zendesk-tools

Tools for FINNs ZenDesks
Ruby
1
star
59

node-brakes-prometheus

JavaScript
1
star
60

gardr-finn-js

JavaScript
1
star
61

tomcat9-docker

Shell
1
star
62

Docker-and-Microservices

This is a presentation on Docker held at FINN Architecture Summit - Service Orientation on 2015.01.21.
CSS
1
star
63

norwegian-input-validator

Simple input validator with norwegian formats and error messages
JavaScript
1
star
64

gardr-plugin-ext-burt

A Garðr plugin for Burt
JavaScript
1
star
65

FINN-styl-e

Work in progress stylus script/watcher/compiler for FINN.no
JavaScript
1
star
66

Docker-on-Academy

This is a presentation on Docker held at FINN Academy 2014.05.28.
CSS
1
star
67

gardr-plugin-host-burt

Burt plugin for Garðr - host side
JavaScript
1
star
68

JSONCodable

Type-safe Codable wrapper for all basic JSON types
Swift
1
star
69

Frontend-Testing-Redefined-on-Academy

This a presentation about frontend testing redefined held at FINN Academy 2017.05.24
JavaScript
1
star
70

object-proxy-js

Wrap a proxy object around any object for method invocation hooks [DEPRECATED]
JavaScript
1
star
71

commons-reflection

Reflection utilities. Provides faster implementations of classes found in java.lang.reflect. (Openjdk request for inclusion: https://bugs.openjdk.java.net/show_bug.cgi?id=100120 )
Java
1
star