Code Monkey home page Code Monkey logo

cordova-plugin-app-event's People

Contributors

jqrgen avatar katzer avatar zfoltin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cordova-plugin-app-event's Issues

Complete basic example request

Hi, first of all thanks for the plugin. It seems just what I need.

I implemented the steps for didFinishLaunchingWithOptions but this is not being called when application first starts. The xcode native handler does.

It should be called right? Could you create a basic example?

Thanks in advance

Error when running on ios.

Hello

I get the following error in xcode when running an ionic project with the following ionic info output:

Image of the error

$ionic info
Your system information:
Cordova CLI: 6.0.0
Gulp version:  CLI version 3.9.1
Gulp local:   Local version 3.9.1
Ionic Version: 1.2.1-nightly-1867
Ionic CLI Version: 2.0.0-beta.19
Ionic App Lib Version: 2.0.0-beta.9
ios-deploy version: 1.8.5
ios-sim version: 5.0.6
OS: Mac OS X El Capitan
Node Version: v4.2.3
Xcode version: Xcode 7.2.1 Build version 7C1002

These plugins are installed in the project:

com.pushwoosh.plugins.pushwoosh 4.2.0 "Pushwoosh"
com.transistorsoft.cordova.background-geolocation 1.3.1 "BackgroundGeolocation"
cordova-android-support-v4 4.0.0 "Android Support v4"
cordova-plugin-app-event 1.1.0 "Application Events"
cordova-plugin-console 1.0.2 "Console"
cordova-plugin-device 1.1.1 "Device"
cordova-plugin-dialogs 1.2.0 "Notification"
cordova-plugin-sim 1.2.1 "SIM"
cordova-plugin-splashscreen 3.2.1 "Splashscreen"
cordova-plugin-vibration 2.1.0 "Vibration"
cordova-plugin-whitelist 1.2.1 "Whitelist"
cordova.plugins.diagnostic 2.3.10 "Diagnostic"
de.appplant.cordova.plugin.local-notification 0.8.4 "LocalNotification"
ionic-plugin-keyboard 1.0.8 "Keyboard"

de.appplant.cordova.plugin.local-notification depends on cordova-plugin-app-event. There might be an issue here. I dont know where the problem is exactly.

Crash on iOS 11 when postNotificationName is called from background thread

I came across this as I was using another one of your Cordova plugins, the local-notifications plugin.

On iOS 11 the plugin causes crashes (see other issues there: katzer/cordova-plugin-local-notifications#1559) and I might just have stumbled across the issue, which seems to be within this plugin.

When I was trying to find out what's happening I saw some Xcode console output. It seems like

[[NSNotificationCenter defaultCenter] postNotificationName:aName object:anObject];

is executed on a background thread and this should be done on the main thread:

2018-04-09 21:45:53.735684+0200 MyApp[5914:28571855] [reports] Main Thread Checker: UI API called on a background thread: -[UIApplication registerUserNotificationSettings:]

IOS build failed

I use the Intell XDK Framework and the local Notifikation Plugin 0.8.4. When i compile the iOS app, than i see following message. The android compile works fine. The problem is the cordova-plugin-app-event.

CompileC build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/Objects-normal/armv7/AppDelegate+APPAppEvent.o MyFoodDB/Plugins/cordova-plugin-app-event/AppDelegate+APPAppEvent.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler
cd .../mobile2/platforms/ios
export LANG=en_US.US-ASCII
export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin:/Developer/android-sdk-macosx/tools:/usr/local/ant/bin"
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c -arch armv7 -fmessage-length=0 -fdiagnostics-show-note-include-stack -fmacro-backtrace-limit=0 -std=c99 -fobjc-arc -Wno-trigraphs -fpascal-strings -Os -Wno-missing-field-initializers -Wno-missing-prototypes -Wno-implicit-atomic-properties -Wno-receiver-is-weak -Wno-arc-repeated-use-of-weak -Wduplicate-method-match -Wno-missing-braces -Wparentheses -Wswitch -Wunused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wempty-body -Wuninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-conversion -Wconstant-conversion -Wint-conversion -Wbool-conversion -Wenum-conversion -Wno-shorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wundeclared-selector -Wno-deprecated-implementations -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.0.sdk -fstrict-aliasing -Wprotocol -Wdeprecated-declarations -g -fvisibility=hidden -Wno-sign-conversion -miphoneos-version-min=8.0 -iquote .../mobile2/platforms/ios/build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/MyFoodDB-generated-files.hmap -I.../mobile2/platforms/ios/build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/MyFoodDB-own-target-headers.hmap -I.../mobile2/platforms/ios/build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/MyFoodDB-all-target-headers.hmap -iquote .../mobile2/platforms/ios/build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/MyFoodDB-project-headers.hmap -I.../mobile2/platforms/ios/build/device/include -I.../mobile2/platforms/ios/build/device/usr/local/lib/include -I.../mobile2/platforms/ios/build/UninstalledProducts/include -I.../mobile2/platforms/ios/build/device -I.../mobile2/platforms/ios/build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/DerivedSources/armv7 -I.../mobile2/platforms/ios/build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/DerivedSources -F.../mobile2/platforms/ios/build/device -include .../mobile2/platforms/ios/build/sharedpch/MyFoodDB-Prefix-adnximjampipriatljpcmowmenem/MyFoodDB-Prefix.pch -MMD -MT dependencies -MF .../mobile2/platforms/ios/build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/Objects-normal/armv7/AppDelegate+APPAppEvent.d --serialize-diagnostics .../mobile2/platforms/ios/build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/Objects-normal/armv7/AppDelegate+APPAppEvent.dia -c .../mobile2/platforms/ios/MyFoodDB/Plugins/cordova-plugin-app-event/AppDelegate+APPAppEvent.m -o .../mobile2/platforms/ios/build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/Objects-normal/armv7/AppDelegate+APPAppEvent.o
.../mobile2/platforms/ios/MyFoodDB/Plugins/cordova-plugin-app-event/AppDelegate+APPAppEvent.m:109:56: error: expected a type

(void) postNotificationName:(NSString*)aName object:(nullable id)anObject ^ 1 error generated.
CompileC build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/Objects-normal/armv7/CDVDevice.o MyFoodDB/Plugins/cordova-plugin-device/CDVDevice.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler
cd .../mobile2/platforms/ios
export LANG=en_US.US-ASCII
export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin:/Developer/android-sdk-macosx/tools:/usr/local/ant/bin"
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c -arch armv7 -fmessage-length=0 -fdiagnostics-show-note-include-stack -fmacro-backtrace-limit=0 -std=c99 -fobjc-arc -Wno-trigraphs -fpascal-strings -Os -Wno-missing-field-initializers -Wno-missing-prototypes -Wno-implicit-atomic-properties -Wno-receiver-is-weak -Wno-arc-repeated-use-of-weak -Wduplicate-method-match -Wno-missing-braces -Wparentheses -Wswitch -Wunused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wempty-body -Wuninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-conversion -Wconstant-conversion -Wint-conversion -Wbool-conversion -Wenum-conversion -Wno-shorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wundeclared-selector -Wno-deprecated-implementations -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.0.sdk -fstrict-aliasing -Wprotocol -Wdeprecated-declarations -g -fvisibility=hidden -Wno-sign-conversion -miphoneos-version-min=8.0 -iquote .../mobile2/platforms/ios/build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/MyFoodDB-generated-files.hmap -I.../mobile2/platforms/ios/build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/MyFoodDB-own-target-headers.hmap -I.../mobile2/platforms/ios/build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/MyFoodDB-all-target-headers.hmap -iquote .../mobile2/platforms/ios/build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/MyFoodDB-project-headers.hmap -I.../mobile2/platforms/ios/build/device/include -I.../mobile2/platforms/ios/build/device/usr/local/lib/include -I.../mobile2/platforms/ios/build/UninstalledProducts/include -I.../mobile2/platforms/ios/build/device -I.../mobile2/platforms/ios/build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/DerivedSources/armv7 -I.../mobile2/platforms/ios/build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/DerivedSources -F.../mobile2/platforms/ios/build/device -include .../mobile2/platforms/ios/build/sharedpch/MyFoodDB-Prefix-adnximjampipriatljpcmowmenem/MyFoodDB-Prefix.pch -MMD -MT dependencies -MF .../mobile2/platforms/ios/build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/Objects-normal/armv7/CDVDevice.d --serialize-diagnostics .../mobile2/platforms/ios/build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/Objects-normal/armv7/CDVDevice.dia -c .../mobile2/platforms/ios/MyFoodDB/Plugins/cordova-plugin-device/CDVDevice.m -o .../mobile2/platforms/ios/build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/Objects-normal/armv7/CDVDevice.o

CompileC build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/Objects-normal/armv7/CDVPlugin+APPAppEvent.o MyFoodDB/Plugins/cordova-plugin-app-event/CDVPlugin+APPAppEvent.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler
cd .../mobile2/platforms/ios
export LANG=en_US.US-ASCII
export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin:/Developer/android-sdk-macosx/tools:/usr/local/ant/bin"
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c -arch armv7 -fmessage-length=0 -fdiagnostics-show-note-include-stack -fmacro-backtrace-limit=0 -std=c99 -fobjc-arc -Wno-trigraphs -fpascal-strings -Os -Wno-missing-field-initializers -Wno-missing-prototypes -Wno-implicit-atomic-properties -Wno-receiver-is-weak -Wno-arc-repeated-use-of-weak -Wduplicate-method-match -Wno-missing-braces -Wparentheses -Wswitch -Wunused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wempty-body -Wuninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-conversion -Wconstant-conversion -Wint-conversion -Wbool-conversion -Wenum-conversion -Wno-shorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wundeclared-selector -Wno-deprecated-implementations -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.0.sdk -fstrict-aliasing -Wprotocol -Wdeprecated-declarations -g -fvisibility=hidden -Wno-sign-conversion -miphoneos-version-min=8.0 -iquote .../mobile2/platforms/ios/build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/MyFoodDB-generated-files.hmap -I.../mobile2/platforms/ios/build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/MyFoodDB-own-target-headers.hmap -I.../mobile2/platforms/ios/build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/MyFoodDB-all-target-headers.hmap -iquote .../mobile2/platforms/ios/build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/MyFoodDB-project-headers.hmap -I.../mobile2/platforms/ios/build/device/include -I.../mobile2/platforms/ios/build/device/usr/local/lib/include -I.../mobile2/platforms/ios/build/UninstalledProducts/include -I.../mobile2/platforms/ios/build/device -I.../mobile2/platforms/ios/build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/DerivedSources/armv7 -I.../mobile2/platforms/ios/build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/DerivedSources -F.../mobile2/platforms/ios/build/device -include .../mobile2/platforms/ios/build/sharedpch/MyFoodDB-Prefix-adnximjampipriatljpcmowmenem/MyFoodDB-Prefix.pch -MMD -MT dependencies -MF .../mobile2/platforms/ios/build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/Objects-normal/armv7/CDVPlugin+APPAppEvent.d --serialize-diagnostics .../mobile2/platforms/ios/build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/Objects-normal/armv7/CDVPlugin+APPAppEvent.dia -c .../mobile2/platforms/ios/MyFoodDB/Plugins/cordova-plugin-app-event/CDVPlugin+APPAppEvent.m -o .../mobile2/platforms/ios/build/MyFoodDB.build/Release-iphoneos/MyFoodDB.build/Objects-normal/armv7/CDVPlugin+APPAppEvent.o
.../mobile2/platforms/ios/MyFoodDB/Plugins/cordova-plugin-app-event/CDVPlugin+APPAppEvent.m:93:23: error: expected a type
name:(nullable NSString*)event
^
.../mobile2/platforms/ios/MyFoodDB/Plugins/cordova-plugin-app-event/CDVPlugin+APPAppEvent.m:94:23: error: expected a type
object:(nullable id)object
^
2 errors generated.

[Feature request] Support more application events

First of all, great idea in creating this plugin!

It's something that has bothered me for a while with my own plugins when they conflict with other plugins which register delegate methods for the same events.

I intend to make use of this plugin as a dependency for my fork of cordova-plugin-firebase - cordova-plugin-firebasex - as this is something that's already been raised as an issue: dpa99c/cordova-plugin-firebasex#443

However, I'd need to extend you plugin to support the following additional application events:

  • applicationDidBecomeActive
  • applicationDidEnterBackground
  • didRegisterForRemoteNotificationsWithDeviceToken
  • didFailToRegisterForRemoteNotificationsWithError
  • didReceiveRemoteNotification

When I get some time, I'll put up a PR which adds support for these.

There may be some other useful ones on the UIApplicationDelegate class too that are worth adding at the same time.

I think long term it would be great if this plugin could be merged into the core of cordova-ios to provide this broadcast functionality out-of-the-box - it's something I've raised in the Cordova Slack.

Crash for `didReceiveLocalNotification`

This plugin looks great. However, I'm getting an error when opening a local notification.

When [self postNotificationName:CDVLocalNotification object:notification] is called from the method (void) swizzled_application:(UIApplication*)application didReceiveLocalNotification:(UILocalNotification*)notification in AppDelegate+APPAppEvent.m the app crashes (see log output below). Sometimes this output is not shown and the app just stops telling the debugger stopped with exit code 6.

Both parameters for postNotificationName are not nil

2017-09-15 13:15:26.937 Cordova Demo[732:233136] [15/09/17 13:15:26] :(32): Send content-event for (null)
2017-09-15 13:15:26.940 Cordova Demo[732:233136] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]'
*** First throw call stack:
(0x25aea2eb 0x252b6dff 0x25a07e2b 0x25a07caf 0x603efb 0x5f0c2d 0x614353 0x9e7a9 0x25a9e9ed 0x25a9e3fb 0x25a9e1d1 0x25af2543 0x259ffa1b 0x2622fd47 0x2623487b 0x9b849 0x9b6f9 0x29f3098d 0x29f366a5 0x29f35d4f 0x29f35ca9 0x29f22123 0x29f21e11 0x26de099d 0x26dfbc75 0x26dfbf61 0x25aad257 0x25aace47 0x25aab1af 0x259fdbb9 0x259fd9ad 0x26c77af9 0x29ce9fb5 0x9b0b3 0x256b0873)
libc++abi.dylib: terminating with uncaught exception of type NSException

Any ideas what's going on?

Missing write access

Hi! tried to install several times and follow some workarounds for the cordova-local-notifications, but i cant solve this issue:

cameraApp git:(master) โœ— npm i cordova-plugin-app-event
npm WARN checkPermissions Missing write access to /Users/clburguete/Desktop/Booknbloom/inshop-creation/android-camera/cameraApp/node_modules/cordova-plugin-app-event
npm ERR! path /Users/clburguete/Desktop/Booknbloom/inshop-creation/android-camera/cameraApp/node_modules/cordova-plugin-app-event
npm ERR! code ELOOP
npm ERR! errno -62
npm ERR! syscall access
npm ERR! ELOOP: too many symbolic links encountered, access '/Users/clburguete/Desktop/Booknbloom/inshop-creation/android-camera/cameraApp/node_modules/cordova-plugin-app-event'

My node is installed through homebrew, and i checked the permissions where correctly configured- I've never encountered this kind of error before. Could anyone tell me what's going on?

Thanks in advance

Swizzling should be white-listed

In order to not interfere with other plugins, only plugins that depend on cordova-plugin-app-event should be swizzled.

This would ensure that only plugins that want to be swizzled will be, and mitigate any EXC_BAD_ACCESS errors for plugins not expecting to be swizzled.

Checking the class for conformance to a particular protocol or response to a particular selector may be an option.

Plugin crashes when using with cordova-email-plugin

plugin crashes when I call cordova.plugins.email.isAvailable() or cordova.plugins.email.open()

2016-01-07 14 53 45

my code:

$scope.goToStatistics = function (){
    if (window.cordova) {
        cordova.plugins.email.isAvailable(function (isAvailable) {
            console.log(isAvailable);
        });
    }
};

I tried to wrap it in $ionicPlatform.ready(), but nothing changed
Everything is ok, when I put plugin method in app.run()

.run(function ($ionicPlatform) {
    $ionicPlatform.ready(function() {
        cordova.plugins.email.isAvailable(function (isAvailable) {
            console.log(isAvailable);
        });
    });
})

Ionic 1.2.1
Cordova 5.4.1
cordova-ios 4.0.1
cordova-plugin-app-event 1.1.0
cordova-plugin-email 1.1.0

Plugin causes warning on Windows platform

When compiling the app with this command for WP8 devices, I get this warning:
**cordova build windows --appx=8.1-phone**

MakePRI : warning 0xdef00520: Invalid qualifier: MOBILE-EVENTS [D:\PhoneGap\Argim\platforms\windows
\CordovaApp.Phone.jsproj]

Is there any way to prevent this? Thanks.

Adding event handler

I know this plugin is used as part of local notifications (for example). Another instance where the app wakes up on iOS is if I am using location services and monitoring for an iBeacon. When that iBeacon comes in range, if the app has been killed, it is relaunched. Can you suggest a way to have the system make the launch options available to the cordova app on startup (maybe through an event, maybe through polling some API) so that apps restarted by the OS can react accordingly?

Breaks on cordova-ios 5.0.0

New [email protected] was just released and we cannot build now

Plugins/cordova-plugin-app-event/CDVPlugin+APPAppEvent.m:65:23: error: use of undeclared identifier
      'CDVLocalNotification'
                 name:CDVLocalNotification
                      ^
1 error generated.

Package.json not found Cordova 7.0

Facing issue with this plugin where package.json file not found while compiling with Cordova 7.0.

Error: Failed to fetch plugin https://github.com/katzer/cordova-plugin-local-notifications.git via registry.
Probably this is either a connection problem, or plugin spec is incorrect.
Check your connection and plugin name/version/URL.
Error: npm: Command failed with exit code 194 Error output:
npm ERR! path /Adreno Projects/Estays Project/Estays/node_modules/cordova-plugin-app-event/package.json
npm ERR! code ELOOP
npm ERR! errno -62
npm ERR! syscall open
npm ERR! ELOOP: too many symbolic links encountered, open '/Adreno Projects/Estays Project/Estays/node_modules/cordova-plugin-app-event/package.json'

npm ERR! A complete log of this run can be found in:
npm ERR! /Users/Vachhani/.npm/_logs/2017-07-19T07_32_57_641Z-debug.log

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.