Code Monkey home page Code Monkey logo

angular-drag-and-drop-lists's Introduction

angular-drag-and-drop-lists

Angular directives that allow you to build sortable lists with the native HTML5 drag & drop API. The directives can also be nested to bring drag & drop to your WYSIWYG editor, your tree, or whatever fancy structure you are building.

⚠️ Discontinuation Notice

This library was built for AngularJS 1.x, which is in maintenance mode. I recommend migrating to Angular and using one of these alternatives:

  • ngx-drag-drop: A fork of this library, re-written for Angular 2 and above.
  • Angular Material Drag & Drop: Lots of features and well supported, although it doesn't seem to support nested lists (bug) and doesn't use the HTML5 Drag & Drop API (which might be a good thing, depending on your use case)
  • ng2-dragula

Let me know if there are other libraries I should add here.

Demo

Supported browsers

Touch devices are not supported, because they do not implement the HTML5 drag & drop standard. However, you can use a shim to make it work on touch devices as well.

Internet Explorer 8 or lower is not supported, but all modern browsers are (see changelog for list of tested browsers).

Download & Installation

  • Download angular-drag-and-drop-lists.js (or the minified version) and include it in your application. If you use bower or npm, just include the angular-drag-and-drop-lists package.
  • Add the dndLists module as a dependency to your angular app.

dnd-draggable directive

Use the dnd-draggable directive to make your element draggable

Attributes

  • dnd-draggable Required attribute. The value has to be an object that represents the data of the element. In case of a drag and drop operation the object will be serialized and unserialized on the receiving end.
  • dnd-effect-allowed Use this attribute to limit the operations that can be performed. Valid options are move, copy and link, as well as all, copyMove, copyLink and linkMove, while move is the default value. The semantics of these operations are up to you and have to be implemented using the callbacks described below. If you allow multiple options, the user can choose between them by using the modifier keys (OS specific). The cursor will be changed accordingly, expect for IE and Edge, where this is not supported. Note that the implementation of this attribute is very buggy in IE9. This attribute works together with dnd-external-sources except on Safari and IE, where the restriction will be lost when dragging accross browser tabs. Design document Demo
  • dnd-type Use this attribute if you have different kinds of items in your application and you want to limit which items can be dropped into which lists. Combine with dnd-allowed-types on the dnd-list(s). This attribute must be a lower case string. Upper case characters can be used, but will be converted to lower case automatically. Demo
  • dnd-disable-if You can use this attribute to dynamically disable the draggability of the element. This is useful if you have certain list items that you don't want to be draggable, or if you want to disable drag & drop completely without having two different code branches (e.g. only allow for admins). Demo

Callbacks

  • dnd-dragstart Callback that is invoked when the element was dragged. The original dragstart event will be provided in the local event variable. Demo
  • dnd-moved Callback that is invoked when the element was moved. Usually you will remove your element from the original list in this callback, since the directive is not doing that for you automatically. The original dragend event will be provided in the local event variable. Demo
  • dnd-copied Same as dnd-moved, just that it is called when the element was copied instead of moved. The original dragend event will be provided in the local event variable. Demo
  • dnd-linked Same as dnd-moved, just that it is called when the element was linked instead of moved. The original dragend event will be provided in the local event variable. Demo
  • dnd-canceled Callback that is invoked if the element was dragged, but the operation was canceled and the element was not dropped. The original dragend event will be provided in the local event variable. Demo
  • dnd-dragend Callback that is invoked when the drag operation ended. Available local variables are event and dropEffect. Demo
  • dnd-selected Callback that is invoked when the element was clicked but not dragged. The original click event will be provided in the local event variable. Demo
  • dnd-callback Custom callback that is passed to dropzone callbacks and can be used to communicate between source and target scopes. The dropzone can pass user defined variables to this callback. This can be used to transfer objects without serialization, see Demo.

CSS classes

  • dndDragging This class will be added to the element while the element is being dragged. It will affect both the element you see while dragging and the source element that stays at it's position. Do not try to hide the source element with this class, because that will abort the drag operation.
  • dndDraggingSource This class will be added to the element after the drag operation was started, meaning it only affects the original element that is still at it's source position, and not the "element" that the user is dragging with his mouse pointer

dnd-list directive

Use the dnd-list attribute to make your list element a dropzone. Usually you will add a single li element as child with the ng-repeat directive. If you don't do that, we will not be able to position the dropped element correctly. If you want your list to be sortable, also add the dnd-draggable directive to your li element(s).

Attributes

  • dnd-list Required attribute. The value has to be the array in which the data of the dropped element should be inserted. The value can be blank if used with a custom dnd-drop handler that handles the insertion on its own.
  • dnd-allowed-types Optional array of allowed item types. When used, only items that had a matching dnd-type attribute will be dropable. Upper case characters will automatically be converted to lower case. Demo
  • dnd-effect-allowed Optional string expression that limits the drop effects that can be performed on the list. See dnd-effect-allowed on dnd-draggable for more details on allowed options. The default value is all.
  • dnd-disable-if Optional boolean expression. When it evaluates to true, no dropping into the list is possible. Note that this also disables rearranging items inside the list. Demo
  • dnd-horizontal-list Optional boolean expression. When it evaluates to true, the positioning algorithm will use the left and right halfs of the list items instead of the upper and lower halfs. Demo
  • dnd-external-sources Optional boolean expression. When it evaluates to true, the list accepts drops from sources outside of the current browser tab, which allows to drag and drop accross different browser tabs. The only major browser for which this is currently not working is Microsoft Edge. Demo

Callbacks

  • dnd-dragover Optional expression that is invoked when an element is dragged over the list. If the expression is set, but does not return true, the element is not allowed to be dropped. The following variables will be available:
    • event The original dragover event sent by the browser.
    • index The position in the list at which the element would be dropped.
    • type The dnd-type set on the dnd-draggable, or undefined if unset. Will be null for drops from external sources in IE and Edge, since we don't know the type in those cases.
    • external Whether the element was dragged from an external source. See dnd-external-sources.
    • dropEffect The dropEffect that is going to be performed, see dnd-effect-allowed.
    • callback If dnd-callback was set on the source element, this is a function reference to the callback. The callback can be invoked with custom variables like this: callback({var1: value1, var2: value2}). The callback will be executed on the scope of the source element. If dnd-external-sources was set and external is true, this callback will not be available.
    • Demo
  • dnd-drop Optional expression that is invoked when an element is dropped on the list. The same variables as for dnd-dragover will be available, with the exception that type is always known and therefore never null. There will also be an item variable, which is the transferred object. The return value determines the further handling of the drop:
    • falsy The drop will be canceled and the element won't be inserted.
    • true Signalises that the drop is allowed, but the dnd-drop callback will take care of inserting the element.
    • Otherwise: All other return values will be treated as the object to insert into the array. In most cases you simply want to return the item parameter, but there are no restrictions on what you can return.
  • dnd-inserted Optional expression that is invoked after a drop if the element was actually inserted into the list. The same local variables as for dnd-drop will be available. Note that for reorderings inside the same list the old element will still be in the list due to the fact that dnd-moved was not called yet. Demo

CSS classes

  • dndPlaceholder When an element is dragged over the list, a new placeholder child element will be added. This element is of type li and has the class dndPlaceholder set. Alternatively, you can define your own placeholder by creating a child element with dndPlaceholder class.
  • dndDragover This class will be added to the list while an element is being dragged over the list.

dnd-nodrag directive

Use the dnd-nodrag attribute inside of dnd-draggable elements to prevent them from starting drag operations. This is especially useful if you want to use input elements inside of dnd-draggable elements or create specific handle elements.

Note: This directive does not work in Internet Explorer 9.

Demo

dnd-handle directive

Use the dnd-handle directive within a dnd-nodrag element in order to allow dragging of that element after all. Therefore, by combining dnd-nodrag and dnd-handle you can allow dnd-draggable elements to only be dragged via specific handle elements.

Note: Internet Explorer will show the handle element as drag image instead of the dnd-draggable element. You can work around this by styling the handle element differently when it is being dragged. Use the CSS selector .dndDragging:not(.dndDraggingSource) [dnd-handle] for that.

Demo

Recommended CSS styles

It is recommended that you apply the following CSS styles:

  • If your application is about moving elements by drag and drop, it is recommended that you hide the source element while dragging, i.e. setting display: none on the .dndDraggingSource class.
  • If your application allows to drop elements into empty lists, you need to ensure that empty lists never have a height or width of zero, e.g. by setting a min-width.
  • You should style the .dndPlaceholder class accordingly.

Note: Previous versions of this directive required postion: relative on certain elements, but this is no longer required.

Why another drag & drop library?

There are tons of other drag & drop libraries out there, but none of them met my three requirements:

  • Angular: If you use angular.js, you really don't want to throw a bunch of jQuery into your app. Instead you want to use libraries that were built the "angular way" and support two-way data binding to update your data model automatically.
  • Nested lists: If you want to build a WYSIWYG editor or have some fancy tree structure, the library has to support nested lists.
  • HTML5 drag & drop: Most drag & drop applications you'll find on the internet use pure JavaScript drag & drop. But with the arrival of HTML5 we can delegate most of the work to the browser. For example: If you want to show the user what they are currently dragging, you'll have to update the position of the element all the time and set it below the mouse pointer. In HTML5 the browser will do that for you! But you can not only save code lines, you can also offer a more native user experience: If you click on an element in a pure JavaScript drag & drop implementation, it will usually start the drag operation. But remember what happens when you click an icon on your desktop: The icon will be selected, not dragged! This is the native behaviour you can bring to your web application with HTML5.

If this doesn't fit your requirements, check out one of the other awesome drag & drop libraries:

  • angular-ui-tree: Very similar to this library, but does not use the HTML5 API. Therefore you need to write some more markup to see what you are dragging and it will create another DOM node that you have to style. However, if you plan to support touch devices this is probably your best choice.
  • angular-dragdrop: One of many libraries with the same name. This one uses the HTML5 API, but if you want to build (nested) sortable lists, you're on your own, because it does not calculate the correct element position for you.
  • more...

License

Copyright (c) 2014 Marcel Juenemann

Copyright (c) 2014-2017 Google Inc.

This is not an official Google product (experimental or otherwise), it is just code that happens to be owned by Google.

MIT License

angular-drag-and-drop-lists's People

Contributors

cesarandreu avatar chadwhitacre avatar chbrown avatar dependabot[bot] avatar gustavodegeus avatar marceljuenemann avatar seiyria avatar thesimoms 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  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  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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

angular-drag-and-drop-lists's Issues

Nested list and dropzones

is it possible to allow category to drop only on categories dropzone and not in services dropzone, with the following code ?

<ul class="categories" data-dnd-list="categories">
    <li
        class="category"
        data-ng-repeat="category in categories"
        data-dnd-draggable="category"
        data-dnd-effect-allowed="move"
        data-dnd-moved="categories.splice($index, 1)"
    >
        <span>
            [[ category.name ]]
        </span>

        <ul class="services" data-dnd-list="category.services">
            <li
                class="service"
                data-ng-repeat="service in category.services"
                data-dnd-draggable="service"
                data-dnd-effect-allowed="move"
                data-dnd-moved="category.services.splice($index, 1)"
            >
                <span>
                    [[ service.name ]]
                </span>
            </li>
        </ul>
    </li>
</ul>

Drop on address bar should not be allowed

Hi there and thanks for making this great directive.

I noticed that I can drop items on the browser's address bar and in Chrome this redirects the user away from your page.
Firefox and IE behave a little better - you can still drop on the address bar, but they won't redirect the user.

I had a look at angular-ui-tree and it does not allow you to drop on the address bar. In fact it looks like you can't drag items out of the viewport at all.

It would be great if the drop event was cancelled if the user (accidentally) drops on the address bar.

Thanks

Creates Duplicates of Array Members Aren't Objects

I noticed I got some very tricky behaviour involving duplicates if I used an array of strings like so,

['a','b','c'];

The problem went away when I used object literals:

[{a:'a'},{b:'b'},{c:'c'}]

It might make sense for the library to throw an error if it detects that a member of an array it is using is not an object.

Incorrect index when moving list item.

All of the below was produced on the 30th Nov 2014 build.
I added a console log to output the value returned by the getPlaceholderIndex() function.
I used chrome dev tools to modify the script served from gh-pages.

indexOf returns a zero-based index of the array. At first glance this function returns a one-based index. However I have came across a few inconsistencies

1. Moving the last item to the same position returns the wrong index
Moving the last item actually returns a zero-based index.
lastitem mov

2. Moving an item to the same position gives different results
Note that the placeholder for both drops is in the same position but the index is different.
dragtosameposition mov

3. Moving an item up gives a zero-based index, moving down gives one-based index
zerooneindex mov

Anyone with these issues can make a short term fix by checking if:

  • the item is being moved down the list (a higher getPlaceholderIndex() value)
  • the item being moved is not the last item in the list

simply -1 from the value to return a zero-based index. This should fix issues 1 and 3.

Implement multi-drag and drop

Wondering if it would be possible to implement multi-drag and drop. Since the select is already there, could it keep track of the items selected?

Incompatible with jQuery

I use jQuery on my website and want to use your library, but it's not work because jQuery catch events and wrap event object in a new jQuery.Event object.

In your directive, you try to access to event.dataTranser but it doesn't exist.
With jQuery, you must access to event.originalEvent.dataTransfer.

You could test if event object is an instance of jQuery.Event and get original event from event.originalEvent.
Or you could test if event.dataTransfer exists and, if not, try to get event.originalEvent.
Both solutions seems to me very dirty and specifically to jQuery... but I don't see an other clean solution. Do you ?

How do I fix: Dragging tabs horizontally

When I'm dragging a tab in a horizontal list of tabs, instead of adding a placeholder tab within the list of tabs, dnd adds an li bullet above or below the list of tabs, which add the tab to either the front of the list or the second position in the list. Has anyone encountered this? What is creating those bullet points when I don't have an li involved at all? Thanks.
I'm using angular bootstrap tabs.
Here's the mockup:

 tabset class="tab-container" dnd-list="layout.tabs">
        <tab
             ng-repeat="tab in layout.tabs"
             active="tab.active"
             dnd-draggable="tab"
             dnd-moved="layout.tabs.splice($index, 1)"
             dnd-effect-allowed="move"
             dnd-selected="layout.tabs.selected = tab"
             tab-highlight>
            <tab-heading id="tab-draggable">
                <span>{{tab.title}}</span> <i class="glyphicon glyphicon-remove" ng-click="removeTab($event, $index)"></i>
            </tab-heading> 

Touch enable

Hi Is there any plans of making this touch enabled? For usage in iOS and Android?

Items are missing on drop

Hello, I observed that the items are sometimes missing after drop into a different list from its parent. Could some one help me resolving it.

Allow drops from external sources

I have a use case where I would like to accept drops from external sources. Can a "dnd-external-allowed" attribute be created to allow this?

Max Depth

Hi - Great module.
This is really more of a feature request. It would be great to specify a maximum depth for nested elements, and reject drops exceeding those limits.

Nested items always allowed

I'm having problems with nested items. In my example they are always allowed. Because of the dnd-allowed-types on the child dnd-list, a block element shouldn't be added to a layout element. It happens anyway though, because of the parent dnd-allowed-types interference?

Example:
http://codepen.io/baaaaas/pen/fcdlA?editors=101

I tried:

  • Adding pointer-events:none on the parent-list while dragging over child-list
  • Empty value of dnd-allowed-types on parent-list while dragging over child-list

Dirty fix in directive while adding dropped element:
if(element.hasClass("blocks") && transferredObject.type == "layout"){
gridArray.splice(placeholderIndex, 0, transferredObject);
} else {
targetArray.splice(placeholderIndex, 0, transferredObject);
}

Please help, I don't want to use the dirty fix.

Question: adding an item can sometimes cause some jumpiness

Hi,
thanks for this great plugin!

In the nested list example, I am having a little trouble dropping items into a container that has several items on the left column for instance, and none on the right - the drop placeholder starts alternating between the correct place for the item I am trying to drop, and the drop zone above the container making it very hard to drop it. Any thoughts on how to fix this?

Here are steps to reproduce the problem (I am using latest Chrome) - in Dropzone A, start dragging Item 3 out of its place and then try to drop it back in the sample spot.

Thanks

How to determine the list the item was move to?

Other implementations of DnD in Angular have a callback that's executed on the list you've moved the item. Example: ng-drag-success="onDragComplete($data, $event)" in ngDraggable.

I'm sure this must be possible but I'm not sure how to go about it. Basically I need to know where which list my list item was dragged to as well as either the data or index.

@marceljuenemann any insight?

Button Propagation

I have a DND enabled list consisting of images I want our users to be able to sort with the drag and drop functionality. The problem is that I have some input (Description, type, etc) for the user to populate in each of these elements (IE: They each have a remove|edit button).

I can't click on these buttons I imagine because of the way dnd-selected works (I'll have to take a deeper dive). Any help on how to solve this would be appreciated.

screenylist

Additional callback hooks

It would be really helpful to have a couple more callbacks such as:

  • Drag Start ( when an item was starting to be dragged )
  • Drag Over ( when an item is over a list )
  • Dropped ( when an item was dropped on a list )

I've done these locally and they work great, I'll do a PR for main repo.

[improve] Horizontal drag and drop

marceljuenemann, thanks for these directives, It's powerful.

Could you add the behaviour for horizontal drag and drop on one of your next releases, please?

cheers :)

Container with single child

Right now Columns is of the structure [ [ ], [ ] ], but I would rather have it as [ ] since I want a container to have only one child. How would I go about with this? Is this possible in the current implementation?

Remove dnd-selected

The selection of draggable elements does not belong here in my opinion. It doesn't seem to do anything that can't be done with a simple ng-click instead. Am I overlooking something?

I propose it should be removed (for 2.0 as it'd be a breaking change). What do you think?

You loose scope when removing an item.

Maybe not a bug but I don't know how to get around it. When you remove an item from your list using: "dnd-moved="list.splice($index, 1)" you loose your scope and cannot get hold of $parent or use the scope to emit an event. I wanted to add a hook, dnd-dragend, when the model is updated without the placeholder and emit an event up the chain to my controller to save the model.

testevent 2 will never reach my controller.

            // Invoke callbacks
            scope.$emit('testevent', '1')
            scope.$apply(function() {
                switch (dropEffect) {
                    case "move":
                        $parse(attr.dndMoved)(scope);
                        break;

                    case "copy":
                        $parse(attr.dndCopied)(scope);
                        break;
                }
            });

            scope.$emit('testevent', '2');

Inpu tag non-editable

I'm really impressed with this library and would like to use it in my project. I'm new to angular and I an having an issue making input tag elements editable with the angular-drag-and-drop-list. In the nested list example, I have an input textarea in the item.html template. It is by default non-editable. Is it possible to make it editable.

Regards,
Karthic

cursor: grabbing

@marceljuenemann this is a great lib. I've used all those available and yours is definitely the most well thought out and intuitive. Thanks.

I'm trying to set the following styles on the dndDragging class but they seem to be overridden no matter what I do:

cursor: grabbing
cursor: -webkit-grabbing

Thoughts?

Disable draggable when click a form in the list element

I have put a text form in each element in the list. When i select the list element itself, it can be dragged as expected. However, when i want to select the text inside the text form (inside the list element) it cause the drag effect instead of selecting the text. How can i disable drag effect when i click text form?

Callback data

Does your api for callback provide info on things like previous parent, new parent, position within siblings?

sample code of usage dndDropZone

I have the same problem in my project, so your solution would be really helpfull. So, I have one ask for you: Could you maybe show a sample code of usage this? Especially usage of dndDropZone?

Incorrect dragOver and drop behavior while limited range of list.

This is my case:

  1. I have a menu tree with 2 level (containers), top level limited 3 parents, each item has child with 5 limited.
  2. I using 'dragoverCallback' to track back item should or should not drop intro the container.
  3. I send current drag area's 'list' intro dragover callback as param
  4. When try drag a parent into children area already full, the call back got correct report, but still can
    drop in. (there is no placeholder showing up anymore) which mean is I can still drop in even the placeholder is disappear away and the console.log report is confirmed.
  5. I had to have use a global key pass to dropCallback make sure the it's able to drop in.

The point, I believe it's not suppose doing that way, if dragover tell not droping, should not droping.
it's looks like try to droping but not able to then rollback to some how.

Easily allow drag & drop with lists with duplicate items

[edit - I tried removing an item on dragstart to get around the duplicate item issue, and submitted this issue prior to really working with it and discovering some flaws. The root issue is that the example model for using drag & drop with lists doesn't work with lists which are tracked by $index, as is the suggested solution for lists with duplicate items in them.]

If you remove an item on dragstart, that item doesn't stay displayed in the list while you drag. It also removes it correctly in both the standard "ng-repeat x in y" and "ng-repeat x in y track by $index".

The second example is what angular's error page tells you to try if you ever try to ng-repeat something with duplicate entries.

any tips for drag multiple items at once?

I'm combining this directive with another jQuery library for selecting multiple items at once (via ctrl+click, shift+click etc. See https://evulse.github.io/finderSelect for example).

Is there a straight-forward way for telling dndLists to grab all other items that are currently decorated with a particular css class or json object property ? The idea is I should be able to click on any number of child items in my list of draggables to highlight them, and as I drag any one highlighted item, all highlighted items are dragged with it.

FYI I'm using dnd-draggable inside an li with ng-repeat.

Any help would be greatly appreciated. Thanks!

Drag and drop item index is not in consistency

When move items from down to up, for example move last item to the first, then on callback index gives 0. So I understood that, the items ordered based on zero based index..

When I move first element to second place, then on callback the index should be 1. But on callback I am getting 2 instead of 1 for index.

Do I need to add anything to resolve this issue ?

Integrate into Python web app

Hi, i'm come across your project and it fit my need perfectly, but i'm using Python Flask as my back-end, will it need some additional dependencies? Thank you.

What am I missing on the move callback ?

Hello All,

Great job for the dnd list ! It looks awesome. I am facing a new problem... Where I need your help :

  • {{ $index + answer.value}}
  • The basic move function is answer.splice(index,1); This is my basic dnd list. The ouput is - 0 model test - 1 test - 2 another test

    When I drag 2 to 0 I have :

    • 0 another test
    • 1 test
    • 2 another test

    Kind of weird, isn't it ?
    Where could this come from ?

    Regards,
    Rémi

    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.