Git Product home page Git Product logo

october-plugin-forms's Introduction

Magic Forms for OctoberCMS

Create easy (and almost magic) AJAX forms.

Why Magic Forms?

Almost everyday we do forms for our clients, personal projects, etc

Sometimes we need to add or remove fields, change validations, store data and at some point, this can be boring and repetitive.

So, the objective was to find a way to just put the HTML elements on the page, skip the repetitive task of coding and (with some kind of magic) store this data on a database or send by mail.

Features

  • Create any type of form: contact, feedback, registration, uploads, etc
  • Write only HTML
  • Don't code forms logic
  • Laravel validation
  • Custom validation errors
  • Use multiple forms on same page
  • Store on database
  • Export data in CSV
  • Access database records from backend
  • Send mail notifications to multiple recipients
  • Auto-response email on form submit
  • reCAPTCHA validation
  • Support for Translate plugin
  • Inline errors with fields (read documentation for more info)
  • AJAX file uploads (BETA, available since v1.3.0)

Documentation

Checkout our docs at:

https://skydiver.github.io/october-plugin-forms/

october-plugin-forms's People

Contributors

boxxroom avatar damsfx avatar everyx avatar flusherdock1 avatar fosphatic avatar mariavilaro avatar mattox3 avatar mjauvin avatar multiwebinc avatar neias avatar panakour avatar ribsousa avatar skydiver avatar therealkevinard avatar two4zero 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  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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

october-plugin-forms's Issues

DB error

Hi,

I have issue with different columns in DB. The column has name form_data but in your code has name form_data_arr.

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'form_data_arr' in 'order clause' (SQL: select martin_forms_records.* from martin_forms_records where martin_forms_records.deleted_at is null order by form_data_arr desc limit 20 offset 0)

Uncaught TypeError: $(...).render is not a function

Hello,

I tried the file upload form, no customization at the moment, regular component, called using, just activated the upload feature.

{% component 'uploadForm' %}

But when I go to my form, I have the following error

Uncaught TypeError: $(...).render is not a function
    at uploader.js:340
    at uploader.js:344

Did I miss something ?

Here is my component code

[uploadForm]
messages_success = "Sent"
messages_errors = "Errors"
recaptcha_enabled = 0
recaptcha_theme = "light"
recaptcha_type = "image"
recaptcha_size = "normal"
uploader_enable = 1
uploader_multi = 0
placeholderText = "Click or drag files to upload"
maxSize = 5
fileTypes[] = "jpg"
fileTypes[] = "jpeg"
fileTypes[] = "pdf"

Regards,

Alex

Multi checkbox โ€“ correct way to group checkboxes ?

Thank's for this great plugin.

I did not find in the documentation how to use the multiple checkbox field ?

Whith this code

 <input type="checkbox" name="chk_group" value="value1" />Value 1<br />  
 <input type="checkbox" name="chk_group" value="value2" />Value 2<br />  
 <input type="checkbox" name="chk_group" value="value3" />Value 3<br />

the plugin store only the last checked checkbox value.

I need to use :

<input type="checkbox" name="chk_group[]" value="value1" />Value 1<br />
<input type="checkbox" name="chk_group[]" value="value2" />Value 2<br />
<input type="checkbox" name="chk_group[]" value="value3" />Value 3<br />

in order to get grouped values.
chk_group : _Value 1, Value 2 ... _

This can be retrieved in PHP with a simple loop:

<?php
if (isset($_POST['chk_group'])) {
    $optionArray = $_POST['chk_group'];
    for ($i=0; $i<count($optionArray); $i++) {
        echo $optionArray[$i]."<br />";
    }
}
?>

Is there a way to get this working in Magic Forms ?

AJAX handler

When I submit the form i'm getting this error message:
AJAX handler 'emptyForm::onFormSubmit' was not found.

Does anyone have a solution?

I got an error after installation. Call to undefined method Illuminate\Support\Facades\Validator::extend()

I use October CMS 1.0.422. After I download and enable Magic Forms in backend I got this error.
(I changed actual site adress to example.com). Both backend and frontend stop working. Gives "Whoops ..." error.

This is the same issue as [https://github.com//issues/74]
, so I close this one.
from storage/logs/system.log :
[2017-09-10 16:13:53] production.ERROR: Symfony\Component\Debug\Exception\FatalThrowableError: Call to undefined method Illuminate\Support\Facades\Validator::extend() in /var/www/rgucluer.com/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:221 Stack trace: #0 /var/www/example.com/plugins/martin/forms/Plugin.php(87): Illuminate\Support\Facades\Facade::__callStatic('extend', Array) #1 /var/www/example.com/modules/system/classes/PluginManager.php(205): Martin\Forms\Plugin->register() #2 /var/www/example.com/modules/system/classes/PluginManager.php(159): System\Classes\PluginManager->registerPlugin(Object(Martin\Forms\Plugin), 'Martin.Forms') #3 /var/www/example.com/modules/system/ServiceProvider.php(48): System\Classes\PluginManager->registerAll() #4 /var/www/example.com/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(586): System\ServiceProvider->register() #5 /var/www/example.com/vendor/laravel/framework/src/Illuminate/Foundation/ProviderRepository.php(75): Illuminate\Foundation\Application->register(Object(System\ServiceProvider)) #6 /var/www/example.com/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(561): Illuminate\Foundation\ProviderRepository->load(Array) #7 /var/www/example.com/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/RegisterProviders.php(17): Illuminate\Foundation\Application->registerConfiguredProviders() #8 /var/www/example.com/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(213): Illuminate\Foundation\Bootstrap\RegisterProviders->bootstrap(Object(October\Rain\Foundation\Application)) #9 /var/www/example.com/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(162): Illuminate\Foundation\Application->bootstrapWith(Array) #10 /var/www/example.com/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(146): Illuminate\Foundation\Http\Kernel->bootstrap() #11 /var/www/example.com/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(116): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request)) #12 /var/www/example.com/index.php(43): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request)) #13 {main}

Validation failed on array with checkboxes

Hello,

first, thank you for contributing this useful plugin.

With the latest OctoberCMS (build 419) and MagicForms (1.3.9) plugin I ran into a problem with a form containing checkboxes.

The form looks like this (simplyfied):

<form data-request="{{ genericForm }}::onFormSubmit">
    {{ form_token() }}
    <label><input class="form-check-input" type="checkbox" name="Product[]" value="Product1">Product 1</label>
    <label><input class="form-check-input" type="checkbox" name="Product[]" value="Product2">Product 2</label>
</form>

However, even if I don't specify any validation rules, I am running into a 406 Not Acceptable HTTP response which claims that there is a problem with "Product". In the list of allowed files, "Product" is also specified (in a new line). The same holds if I add a validation rule "Product" with "sometimes|array".

I feel confident that the form with the specification stated above was working just a few weeks ago. Is it a problem on my side or is it a general bug caused by plugin changes or October/Laravel updates?

Thanks and best,
Tom

form_data_arr does not allow to perform where request

Hello,

Maybe I'm wrong, but storing all the form datas in a jsoned array does not allow to use "where" clause when performing requests ?
Example : I use two extra fields in a generic upload form : user and activated, when I try to get records I can't filter on these.

Thanks in advance for your thoughts on this !

Undefined index: mail_template

Hi,

After the latest update I am receiving this error when submitting forms.

I have not check the 'Send Auto-Response' option in my component and it is giving an alert message with this error when submitting the form.

I then added the default mail template for the auto-response but it's still giving the same error. How can I fix this?

Thanks for your kind assistance.

Put the component in partial

Hello,

I'm doing some tests with the plugin, and it seems that you cannot put a form in a partial.

What I mean is that insteaf of calling the component in your page, and override the default template using a partial, I would like to put the component directly in the partial and call it by using

{% partial 'myform' %}

Like that, the form could be configured in the partial directly (validation, messages etc...) and you just embed it when you want.

It works with all plugin I could test (blog etc...) but with this one, when I submit the form I get an error.

Ajax handler 'emptyForm::onFormSubmit was not found'

Would it be possible to fix it ?

Thanks

Alex

Magic Forms: Issue

How to fix this issue ?

"Array to string conversion" on line 179 of /var/www/html/octcms.dev/vendor/laravel/framework/src/Illuminate/Support/MessageBag.php
screenshot from 2017-05-24 15-23-37
screenshot from 2017-05-24 15-25-00

Custom submission handler?

Imagine a scenario where I don't want to save it to a DB or send an email but rather handle it in a custom way. Does this plugin support that? Basically I want to submit tickets to Zendesk directly via their API (can't send on behalf of another user very easily with Amazon SES)

Better way to include javascript

Hello,

I'm still playing with the module and I noticed that the javascript is included inside the emptyForm_forms_flash div.

I think you should find a better way to execute some JS when form is submitted (custom JS function, form reset, etc....) for several reasons :

  • It's not a good practice to include javascript in the middle of the DOM.
  • If you want to theme your form and don't want to include that empty div "emptyForm_forms_flash" you lost some functionnalities, which should never happens.

So I think that the javascript addition should be done in a separate way and the emptyForm_forms_flash div should only be used as a wrapper for the alert message.

Thanks

Add variable to flash.htm partial to get the name of all fields giving an error

Hello,

I'm trying to customize the flash error message, and I think it would be great to have a variable (an array) that give the name of all fields that returned an error.

Like that, I could write some JS to add an "has-error" class to fields that returned an error and make a better UI with fields outlined in red when there is a problem.

A nice way to do that would be to consider the key of the {{ list }} twig tag as the field name, like that we can have the name of the field and the associated error message.

Make different table for each form

Hello,

Currently, the configuration of fields is saved in a table, in one field and generates as "stored fields".
This is, thus, restrictive because one cannot map it to other tables or other plugins cannot work with it.

Instead of saving the field configuration, how about creating a real table for that particular form?

Then one could have the name as suffix, for e.g. martin_forms_myNameOne, martin_forms_myNameTwo, etc. This should not be a problem with Migration of tables.

With this, all the fields are real and mapped, not like now. Then other plugins could use and interface with the form fields.

For e.g.:

martin_forms_myNameOne ---> Dating profile
martin_forms_myNameTwo ---> Business Profile

etc. This feature would be fantastic to have.

{{__SELF__}} is empty

Hello,

First excellent plugin for october. Flexible and simple to use, congratulation !

However, I encountered a small issue. I followed the instruction you give when you embed the emptyForm component and my form correctly submit the informations.

But the value of {{ SELF }} is empty, so the flash message id is : "_forms_flash" instead of "emptyForm_forms_flash"

If I remove the variable and manually enter the ID it works, but I wonder why that variable is not available.

Alex

Error for Partial Recaptcha

An error occurs when i enable recaptcha in settings of generic forms or Empty Form and in case of generic forms when i expand the component. It throws this below error. May i know how to resolve the error.

An exception has been thrown during the rendering of a template ("The partial 'recaptcha' is not found.").

TYPE

Twig Template

EXCEPTION

Cms\Classes\CmsException

        <div class="form-group">
            <textarea id="comments" name="comments" rows="8" cols="80"></textarea>
        </div>

        {% partial '@recaptcha' %}
        <button id="simpleContactSubmitButton" type="submit" class="btn btn-default">Submit</button>

Redirect / Succes page

Is it possible to redirect to a specific "thank you" page when a form is succesvol submitted?

A better example for Usage

In documentation step 2 Usage , there is a link for "Override component HTML with your form". But that does not help. Can you give an example for overriding component HTML for General AJAX Form.

How to add Front End Form Record Editor

okay i've problem while creating front end record data for specific form, i want add data's editor and it's failed data did'nt change at all, im using same name form but different in page.

how can i possibly change the record in front end, and btw please give record data editor in front / back end.

Thanks, your plugin is awesome.

Inline error message

Hello,

It would be great to have an option to display error messages just before or just next the field instead of global message in the top of the form.

Just an idea to improve this plugin that is already really great !

Alex

Attached files not appearing in CMS nor email notifications

The files I send from the form are never attached to the emails nor the detail in the CMS itself.

Here's my config:
screen shot 2017-03-28 at 12 23 03 pm

Any idea? Do I need to enable anything else?

Here's my form code (overridden uploadFile):

<form data-request="{{ __SELF__ }}::onFormSubmit">

    {{ form_token() }}

    <div id="{{ __SELF__ }}_forms_flash"></div>

    <div class="form-group">
        <input type="text" id="name" name="name" class="form-control" placeholder="{{ 'contact.enter-name'|_ }}">
    </div>

    <div class="form-group">
        <input type="text" id="email" name="email" class="form-control" placeholder="{{ 'contact.enter-email'|_ }}">
    </div>

    <div class="form-group">
        <input type="text" id="subject" name="subject" class="form-control" placeholder="{{ 'contact.enter-subject'|_ }}">
    </div>

    <div class="form-group">
        <textarea class="form-control" value="" name="body" placeholder="{{ 'contact.enter-message'|_ }}" cols="30" rows="10"></textarea>
    </div>

    <button id="simpleContactSubmitButton" type="submit" class="btn btn-primary btn-lg pull-right">{{ 'contact.send'|_ }}</button>
    <div class="form-group">
        <h4>{{'Attach documents'|_}}</h4>
        {% partial '@file-upload' %}
    </div>
    <div class="form-group">
        {% partial '@recaptcha' %}
    </div>
</form>

file-upload isn't overridden though.

Any suggestions?

Thank you

Add token to component settings

Hello,

This issue about the possibility to give tokens/variables to the magic form component.

For example to have an email message corresponding to the "subject" field of the form, or adding the current date to the email subject, or defining the visitor email as the "reply-to" option see my reply-to issue.

What do you think about it ? Actually, the component settings is a little too static.

Option to assign custom mail templates to forms

Hi,

It would be good to have the ability to create email & auto-response templates and assign them to their respective forms with custom messages.

Currently you only have a default email & auto-response template for all forms.

Can you kindly consider this functionality please?

Thanks,

Client's email as sender's email in the form

Hey there,

Can we have clients email as sender's email while sending/submitting the form. This is something very important for our business and if you can reply as soon as possible then it will help me a lot.

Regards,
Vijay Patel

Using Validator::resolve conflicts with other plugins

Please use Validator::extend('recaptcha', Martin\Forms\Classes\ReCaptchaValidator@validateReCaptcha'), instead of Validator:: resolve to prevent conflicts with other plugins that add more validators to the system.

Magic Forms plugin not installing on Build 420

Probably already a known issue, during a test drive with Build 420 (Laravel 5.5 update), the Magic Forms plugin does not install.

I love your plugin! This is of course no problem at the moment

add plugin to snippet

Hi @skydiver,

thank you for you brilliant plugin. I need to use it within a snippet to add it to a customer static-page rainlab plugin.

In the snipped I have

<div class="step-by-spep-form">
    <h3>A STEP BY STEP FORM</h3>
    {% component 'customForm' subjects=requests %}
</div>

where requests is a list of different subjects to choose.

in the custom form I have (together with the genericForm view):

<div class="form-group dropdown">
        <label for="subject">Subject:</label>
        {% set foo = requests|split(',') %}
        {% set subjects = {'':'-- scegli un argometo --'} %}
        {% for subject in foo %}
            {% set key = subject|replace({' ':'_'}) %}
            {% set subjects = subjects|merge({ (key) : subject }) %}
        {% endfor %}
        <select name="subject" class="form-control">
                {% for key,subject in subjects %}
                    <option value="{{ key }}">{{ subject }}</option>
                {% endfor %}
        </select>
    </div>

Now I can select a list of subject by adding to the "subject" variable in the snippet a comma separated list of subjects.

Unfortunately the page respond me AJAX handler 'customForm::onFormSubmit' was not found.

It seems that the plugin is not registered. Can you help me?

Thank you!!

Add Location fields and drop downs in forms | IP

Hello,

Your plugin is just great!

I could not find any method to add fields of Country/country_id, State/state_id and City/city_id that could be added in a frontend form and have it displayed with their labels pulling from the location tables.

The same applies, when such drop down depending on values of a different table is saved. This should be sortable and searchable, when many forms are made available.

Add a small option to choose the partial name you want to use

Hello,

I work on a project with many different forms. I already know the default way of october to override a default partial with your custom one using subdirectory and component alias.

The problem is that you can only have 1 form per subdirectory for example :

/partials/contact/default.htm
/partials/quote/default.htm
/partials/survey1/default.htm
etc...

I would like to group all my magic form into one subdirectory, which would be far more easy to maintain, for example :

/partials/forms/contact.htm
/partials/forms/quote.htm
/partials/forms/survey1.htm
etc...

Would it be possible to add a small option when you configure the component "partial to use", to be able to precide the filename of the partial you want to use instead of "default.htm"

Thanks, and continue that great work !

Best regards,

Alex

Upload required

Hello,

I wonder how to define upload as required. For others fields you can use validation rules with the field name, but the upload field don't have any names, so how to make it required ?

Regards,

An exception has been thrown during the rendering of a template ("The partial 'recaptcha' is not found.").

<div class="form-group">
              <textarea id="comments" name="comments" rows="8" cols="80"></textarea>
          </div>

     <div class="form-group">
    {% partial 'recaptcha' %}
</div>

          <button id="simpleContactSubmitButton" type="submit" class="btn btn-default">Submit</button>

      </form>

Can you please help me with this problem ?

I am getting An exception has been thrown during the rendering of a template ("The partial 'recaptcha' is not found."). error.

I did tried finding many things but i didn't worked out.

Flash Messages on long forms

Hi,

I am building some very long forms, and when the form is submitted the flash messages are displayed way at the top and the user has no idea if there were any errors with the submission, unless they scroll back to the top of the page.

Is there a way to scroll to the position of the flash messages once the form is submitted?

Thanks,

Auto-response functionality

Thank you for the auto-response functionality, it is working very well, however I would like to kindly request passing the form field values to the auto-response as well.

I would like to send a copy of the form data in the auto-response message, I've tried using the template that you have set in the notification but it does not capture the data.

Thank you for your kind assistance.

Can't find AJAX handler

The plugin seems promising but I can't get it to work.
I installed the plugin and added the emptyForm component to my partial (sections/contact.htm and the component's alias is emptyForm).
Then I added the following HTML snippet to my markup:

<form data-request="{{ __SELF__ }}::onFormSubmit">
	{{ form_token() }}
	<div id="{{ __SELF__ }}_forms_flash"></div>
	<!-- YOUR FORM FIELDS -->
	<input type="text" id="name" name="name" placeholder="uw naam" required="required">
	<div data-validate-for="name"></div>
	
	<input type="text" id="email" name="email" placeholder="uw e-mailadres" required="required">
	<div data-validate-for="email"></div>
	
	<textarea name="message" cols="30" rows="8" placeholder="uw bericht" required="required"></textarea>
	<div data-validate-for="message"></div>
	<!-- SUBMIT BUTTON -->
	<input type="submit" class="btn btn-primary" value="verzend">
</form>

When I submit the form the page just puts the parameters as GET in the URL bar. If I change
{{ __SELF__ }}
to
{{ emptyForm }}
as suggested on the reviews page of octoberCMS I get the following error:
AJAX handler 'emptyForm::onFormSubmit' was not found.

Am I missing something?

Reply-To option

Hello,

It's very useful to be able to add a Reply-To option in a form to allow replying to your visitors using the reply function of your webmail.

Is it possible to add an option the plugin component to be able to define the Reply-To option, you should be able to target a field of the form cause generally, you have to reply to the email address filled in the form.

Thanks

About the upload feature

Hello,

About the upload feature, I wonder if you created another component because it's a beta and you will merge it with the standard component when it will be considered as stable, or if it will still be separate component.

I would votre for only one component cause, if you setup a standart form and need to add upload functionnality later, its easier to check "allow upload" on your already existing component that adding and configure from scratch a new one.

custom Email subject

Is there a way to overwrite the default subject? I can do this in the mail view of your plugin, but that off course will be over-written with future updates

Captcha required

Captcha is a must for each forms. So if that can be provided along with this form. Then this form will be complete.

Custom alert partial or classes

Hello. Nice plugin, really love it.

Only issue I have at the moment - I want to use custom alert msg layout, but this partial (flash.htm) is called somewhere inside plugin and can't be rewritten by simply making some partial in my theme.

What is easy way to achieve this?

And as proposition - make it possible to change Alert layout as easy as it is to make new forms with this plugin :)

How to use after installation

Hello Team,

I find your plugin very interesting but I am new to OctoberCMS and this might be a silly question to ask but I tried and tried to use your plugin and unable to understand how to use your plugin.
I also went here https://octobercms.com/plugin/martin-forms and try to find any steps over there to use it for newbies like me but I found it hard to find and hence I have come up with a question.

Here below is how I have tried so far. I installed the plugin and went to CMS -> Pages section and created a page lets say "Ajax form" , selected a default layout from dropdown then and clicked on Components -> clicked on "Generic AJAX Form" .

Then I created one form validation for single field as "name" and made it required. I did not change form name and keep it same as "genericForm".

Now I just saved the page and clicked on "Preview" but I am unable to see any form or anything.

Additionally, I added below HTML in markup tab

<form method="post">
<input type="text" name="name" id="name" value="" />
<input type="submit" value="send" />
</form>

But if i click on it, nothing appears, no validation and nothing.

Can someone guide me what can I do to make it work.

Any guidance will be so helpful.

Thanks

File input / mail attachment support

Hello,

It seems that the file input form type isn't supported. It would be a great addition to let users attach a file to the form managed with magic form.

Regards,

Alex

Multiple Recaptcha Option

We are not able to generate multiple recaptcha for 2 forms on a single page. I guess you can implement or modify the codes by the following this reference. It will help you out in making it possible. Below is the reference link for your reference.

http://stackoverflow.com/a/28126317

How can we get the ID value in autoresponse templates?

Hi,

I have created a new mail template and have included the ID fields as so {{ id }} however this does not work when the email is sent.

How can I access the record Id field in the autoresponse template please?

Thanks.

Asking the Basic

hello... i have question about the basic that i dont know, just like the user plugin when i want to add the submit value to the front-end i must add something like {{user.name}}, but i've confused when using the value from the form i build, to show up in front-end page, is that i must using sql query to echoing the value?

Q : how to use the value from the back-end table to front-end page.

Thanks.

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.