Giter VIP home page Giter VIP logo

yii2-tree-manager's Introduction

Krajee Logo
yii2-tree-manager

Donate       kartikv

Stable Version Unstable Version License Total Downloads Monthly Downloads Daily Downloads

An enhanced tree management module from Krajee with tree node selection and manipulation using nested sets. The extension features are listed below:

  • A complete tree management solution which provides ability to manage hierarchical data stored using nested sets. Utilizes the yii2-nested-sets extension to manage the tree structure in your database. Refer the documentation for yii2-nested-sets extension before you start using this module.
  • A tree view built from scratch entirely without any third party plugins. The TreeView is designed using HTML5, jQuery & CSS3 features to work along with Yii PHP framework.
  • Styled with CSS3, includes jquery transitions and loading sections for ajax content, includes embedded alerts, and utilizes bootstrap css.
  • Tree management feature options and modes:
    • View, edit, or administer the tree structure using TreeView widget as a selector and a dynamically rendered form to edit the tree node
    • The form works as both a detail view for the node OR as a management tool to add/edit/delete the node.
    • Form is rendered via ajax. It intelligently uses caching when the same node is clicked again (unless, the nodes are modified).
    • Unique Admin Mode for allowing administrator actions on tree.
    • Ability to add, edit, or delete tree nodes
    • Ability to reorder tree nodes (move up, down, left or right).
    • Configure tree node icons, styles, and ability to add checkboxes to tree nodes
    • i18N translations enabled across the module.
  • Includes various jquery plugin events for advanced usage that are triggered on various tree manipulation actions.
  • Bonus: Includes a TreeViewInput widget that allows you to use the treeview as an input widget. The TreeViewInput widget is uniquely designed by Krajee (using jQuery & PHP with HTML5/CSS) to appear as a dropdown selection menu. It allows multiple selection or single selection of values/nodes from the tree.
  • A Tree model that builds upon the yii2-nested-set model and is made to be easily extensible for various use cases. It includes prebuilt flags for each tree node. Check the Tree Model documentation for more.
  • active: whether a tree node is active (if soft delete is enabled, the tree node will be just inactivated instead of deleting from database).
  • selected: whether a tree node is selected by default.
  • disabled: disables a tree node for editing or reorder
  • readonly: a read only tree node that prevents editing, but can be reordered or moved up/down
  • visible: whether a tree node is visible by default.
  • collapsed: whether a tree node is collapsed by default.
  • movable_u: whether a tree node is allowed to be movable up.
  • movable_d: whether a tree node is allowed to be movable down.
  • movable_l: whether a tree node is allowed to be movable left.
  • movable_r: whether a tree node is allowed to be movable right.
  • removable: whether a tree node is removable - will not be removed if children exist. If soft delete is enabled, then the node will be inactivated - else removed from database.
  • removable_all: whether a tree node is removable with children. If soft delete is enabled, then the node and its children will be inactivated - else removed from database.

The following important PHP classes are available with this module:

  1. kartik\tree\Module: Module, allows you to configure the module. You must setup a module named treemanager. Refer documentation for details.
  2. kartik\tree\TreeView: Widget, allows you to manage the tree in admin mode or normal user mode with actions and toolbar to add, edit, reorder, or delete tree nodes.
  3. kartik\tree\TreeViewInput: Widget, allows you to use the treeview as a dropdown input either as a single select or multiple selection.
  4. kartik\tree\models\Tree: Model, the entire tree data structure that uses the Nested set behavior from yii2-nested-sets to manage the tree nodes.
  5. kartik\tree\models\TreeQuery: Query, the query class as required for the Nested set model.
  6. kartik\tree\controllers\NodeController: Controller, the controller actions that manages the editing of each node for create, update, delete, or reorder (move).

Demo

You can see detailed documentation, API Code Documentation and TreeView demonstration or TreeViewInput demonstration on usage of the extension.

Installation

The preferred way to install this extension is through composer.

NOTE: Check the composer.json for this extension's requirements and dependencies. Read this web tip /wiki on setting the minimum-stability settings for your application's composer.json.

Either run

$ php composer.phar require kartik-v/yii2-tree-manager "@dev"

or add

"kartik-v/yii2-tree-manager": "@dev"

to the require section of your composer.json file.

Usage

Step 1: Prepare Database

Create your database table to store the tree structure. You can do it in one of the following ways:

Option 1: Run DB Migrations

You can run the migrations script provided to create the database structure from your yii programming console:

php yii migrate/up --migrationPath=@vendor/kartik-v/yii2-tree-manager/src/migrations

Option 2: Executing SQL script

Alternatively, you can execute the SQL script to generate your DB structure. Copy and modify the migrations/tree.sql file (a MySQL example), to create the table tbl_tree (or for any table name you need).

NOTE: You can add columns you need to this table, but you cannot skip/drop any of the columns mentioned in the script. You can choose to rename the id, root, lft, rgt, lvl, name, icon, icon_type columns if you choose to - but these must be accordingly setup in the module.

Step 2: Setup Model

Create your model for storing the tree structure extending kartik\tree\models\Tree class. You can alternatively build your own model extending from yii\db\ActiveRecord but modify it to use the kartik\tree\models\TreeTrait. You must provide the table name in the model. Optionally you can add rules, or edit the various methods like isVisible, isDisabled etc. to identify allowed flags for nodes.

So when extending from the \kartik\tree\models\Tree, you can set it like below:

namespace frontend\models;

use Yii;

class Tree extends \kartik\tree\models\Tree
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'tbl_tree';
    }    
}

Alternatively, you can configure your model to not extend from kartik\tree\models\Tree and instead implement and use the kartik\tree\models\TreeTrait:

namespace frontend\models;

use Yii;

class Tree extends \yii\db\ActiveRecord
{
    use kartik\tree\models\TreeTrait;

    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'tbl_tree';
    }    
}

Step 3: Setup Module

Configure the module named treemanager in the modules section of your Yii configuration file.

'modules' => [
   'treemanager' =>  [
        'class' => '\kartik\tree\Module',
        // other module settings, refer detailed documentation
    ]
]

Step 4: Using TreeView Widget

In your view files, you can now use the tree view directly to manage tree data as shown below:

use kartik\tree\TreeView;
echo TreeView::widget([
    // single query fetch to render the tree
    'query'             => Tree::find()->addOrderBy('root, lft'), 
    'headingOptions'    => ['label' => 'Categories'],
    'isAdmin'           => false,                       // optional (toggle to enable admin mode)
    'displayValue'      => 1,                           // initial display value
    //'softDelete'      => true,                        // normally not needed to change
    //'cacheSettings'   => ['enableCache' => true]      // normally not needed to change
]);

Step 5: Using TreeViewInput Widget

If you wish to use the tree input to select tree items, you can use the TreeViewInput widget as shown below. Normally you would use this as a dropdown with the asDropdown property set to true. If asDropdown is set to false, the treeview input widget will be rendered inline for selection.

use kartik\tree\TreeViewInput;
echo TreeViewInput::widget([
    // single query fetch to render the tree
    'query'             => Tree::find()->addOrderBy('root, lft'), 
    'headingOptions'    => ['label' => 'Categories'],
    'name'              => 'kv-product',    // input name
    'value'             => '1,2,3',         // values selected (comma separated for multiple select)
    'asDropdown'        => true,            // will render the tree input widget as a dropdown.
    'multiple'          => true,            // set to false if you do not need multiple selection
    'fontAwesome'       => true,            // render font awesome icons
    'rootOptions'       => [
        'label' => '<i class="fa fa-tree"></i>', 
        'class'=>'text-success'
    ],                                      // custom root label
    //'options'         => ['disabled' => true],
]);

Contributors

Code Contributors

This project exists thanks to all the people who contribute. [Contribute].

Financial Contributors

Become a financial contributor and help us sustain our community. [Contribute]

Individuals

Organizations

Support this project with your organization. Your logo will show up here with a link to your website. [Contribute]

License

yii2-tree-manager is released under the BSD-3-Clause License. See the bundled LICENSE.md for details.

yii2-tree-manager's People

Contributors

alexforte avatar andrejlola avatar billheaton avatar bookin avatar brightskyit avatar bubifengyun avatar doommer avatar edofre avatar jafaripur avatar kambizzandi avatar kartik-v avatar knjazevandr avatar linkaixiang4883 avatar makroxyz avatar mariusrumpf avatar monkeywithacupcake avatar muhammadcahya avatar nicomollet avatar okplatova avatar simialbi avatar srnden avatar syedmuneer avatar tombouctou avatar tonisormisson avatar yanhuixie 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

yii2-tree-manager's Issues

cant add a root node

I am trying to get started with TreeView::widget(). I followed the guide, and I see the interface. When I click add a new root I get the following:

ajax request to: http://192.168.2.130:82/index.php?r=treemanager%2Fnode%2Fmanage&kvtree=-959722365

{"name":"Exception","message":"Invalid JSON data.","code":0,"type":"yii\\base\\InvalidParamException"
,"file":"/app/vendor/yiisoft/yii2/helpers/BaseJson.php","line":68,"stack-trace"
:["#0 /app/vendor/kartik-v/yii2-tree-manager/controllers/NodeController.php
(103): yii\\helpers\\BaseJson::decode(Array)","#1 [internal function]: kartik\\tree\\controllers\\NodeController-
>actionManage()","#2 /app/vendor/yiisoft/yii2/base/InlineAction.php(55):
 call_user_func_array(Array, Array)","#3 /app/vendor/yiisoft/yii2/base/Controller
.php(151): yii\\base\\InlineAction->runWithParams(Array)","#4 /app/vendor
/yiisoft/yii2/base/Module.php(455): yii\\base\\Controller->runAction('manage', Array)","#5 /app
/vendor/yiisoft/yii2/web/Application.php(84): yii\\base\\Module->runAction('treemanager/nod...', Array
)","#6 /app/vendor/yiisoft/yii2/base/Application.php(375): yii\\web\\Application-
>handleRequest(Object(yii\\web\\Request))","#7 /app/web/index.php(14): yii
\\base\\Application->run()","#8 {main}"]}

Do you know what I am doing wrong?

Encode node names feature in `Tree` model

  • New property Tree::encodeNodeNames which defaults to true.
  • New method Tree::getNodeName() which will return the parsed node name based on encodeNodeNames setting (i.e. HTML encoded if encodeNodeNames = true OR the raw node name if encodeNodeNames = false).

Can't find variable: resetParent

I get this error when trying to delete a node:

[Error] ReferenceError: Can't find variable: resetParent
    remove (kv-tree.js, line 285)
    (anonyme Funktion) (kv-tree.js, line 770)
    dispatch (jquery.js, line 4435)
    handle (jquery.js, line 4121)

Version: dev-master had also problems with the existing stable releases out of nowhere.

Enhancing tree container styles for smaller device screen sizes

All working fine but thought I would request Tree.php as trait ideally or perhaps behaviour. Like a lot of people all of my models extend from my own extended ActiveRecord class (and my own ActiveQuery). I had errors that were awkward to get around so either had to extend Tree.php from my \common\components\ActiveRecord or turn Tree.php into a trait (Trait was a nice easy problem free option within minimal changes so I have it currently as a trait). Changes were minimal - but did have to comment out a few lines in TreeView.php where it tested for the model being derived from Tree.

The other change I needed was to modify find within Tree.php to attach nested set behaviour directly to my own ActiveQuery class - though this no major as the class derived from Tree can override find anyway - though have included here for possibility anyway.

    public static function find()
    {
        $query = get_called_class() . 'Query';
        $query = new $query(get_called_class());
        $query->attachBehavior(NULL, NestedSetsQueryBehavior::className());

        return $query;
    }

Perhaps I am missing something really obvious - long day. In order to use my own ActiveRecord, I couldn't see anyway other than altering Tree.php which isn't ideal for updates of course.

As another minor sub-issue, a suggestion on styling as below to add margin betwewn stacked containers on narrow width devices - if you close up your browser to iphone size you will see currently no margin between the containers in your demo

.kv-tree-wrapper, .kv-detail-container {
    margin-top: 20px;
}```

$treeQueryClass declaration in trait

Don't think $treeQueryClass property should be declared in TreeTrait - just in the model that uses it.

This would only be noticed when someone uses this property

NodeController trait

Hi Kartik

Could also make NodeController a trait for similar reasons as previously for the model.

FYI I have described my use case below - I am not suggesting to change kv-tree.js as I think that is just something I am going to have to maintain in my own code however I thought it may be useful for you at some stage in the future to understand different ways that people are using your code in case it helps to make it more easily extended :

Extending my own controller and using NodeController as a trait, with a couple of very minor alterations to kv-tree.js, when I select a node rather than ajax update of the form I am redirecting to the update action of my normal controller which allows for url to change to reflect the selected id and to update my breadcrumbs in a consistent manner with the rest of my application - and a few other things as suitable in this circumstance. I wouldn't suggest that everyone would want to do this - the existing way is natural for a different model in my system. I have embedded the treeview widget into that update view so in essence it looks the same but with correct navigation items like breadcrumbs and a more useful url for linking to if necessary. I updated kv-tree.js to include an update method which is called instead of manage when selected and that is a simple 1 line redirect to the url based on a new nodeAction key of 'update' - as follows:

update: function (key) {
    location.href = this.actions.update + key;
},
select: function (key, init, mesg) {
...
            } else {
                self.update(key);
            }

and in my view

        'nodeActions' => [
            'update' => Yii::$app->urlManager->baseUrl . '/' . $this->context->id . '/',
            Module::NODE_MANAGE => Url::to(['manage'] ...

I havn't tested everything yet but the above changes so far seem to have achieved what I needed. NB I don't need a view action as I use your DetailView and just detect from the users access rights for a particular model whether they should edit or view.

Yii2: navbar dropdown is disabled when TreeView widget is active

Hi,

I have a small problem with TreeView::widget.

When it is initialized as

TreeView::widget([
    'query' => Category::find()->addOrderBy('root, lft'),
    'headingOptions' => ['label' => Yii::t('app', 'Categories')],
    'softDelete' => false,
    'fontAwesome' => false,
    'displayValue' => 1,
    'isAdmin' => false,
]);

it disables bootstrap navbar dropdown menu. It happens when 'displayValue' is set to 1 or when any node is selected.

Navbar is added as a widget:

Nav::widget([
     'options' => ['class' => 'navbar-nav'],
     'items' => [
         ['label' => Yii::t('app', 'Catalog'), 'items' => [
             ['label' => Yii::t('app', 'Products'), 'url' => ['/product']],
             ['label' => Yii::t('app', 'Categories'), 'url' => ['/category']],
             ['label' => Yii::t('app', 'Manufacturers'), 'url' => ['/manufacturer']],
         ],
    ],
]);

So if I click Catalog with TreeView widget active, nothing happens, no dropdown is displayed.

I guess there might be a CSS override somewhere in TreeView widget, which prevents dropdown to work properly, but could not find any reference. No obvious errors in browser console either.

Is there a workaround for this?

Thank you.

Initialize variables prior to extraction

Hi Kartik
TreeView widget, add "new Root" - error: "name":"PHP Notice","message":"Undefined variable: formOptions","code":8,"type":"yii\base\ErrorException"
,"file":".../vendor/kartik-v/yii2-tree-manager/controllers/NodeController.php","line":83

Saving with non default dataStructure keyAttribute

I have the autoincrement field that differs from default "id"
My config is:

'treemanager' => [
            'class' => '\kartik\tree\Module',
            'dataStructure' => [
                'keyAttribute' => 'geo_id',
                'nameAttribute' => 'geo_name',
            ],
            'treeViewSettings' => [
                'nodeView' => '@backend/themes/adminlte/geo/_form'
            ]
        ],

I've noticed that https://github.com/kartik-v/yii2-tree-manager/blob/master/controllers/NodeController.php#L126 seems to be incorrect.

$node->id //--- is unset!

Without deep diving I think it must be something like:

$node->{$module->dataStructure["keyAttribute"]}

Thank You for Your hard work.

Refactor code for extensibility - implement Tree model to use a TreeTrait

CHANGES

  1. Implement a new trait kartik\tree\models\TreeTrait where entire codeset for model will be moved to.
  2. The model kartik\tree\models\Tree will implement this trait. One can define their own Tree model using this trait if one does not want to extend their model class from kartik\tree\models\Tree.
  3. Include a new static property treeQueryClass within the TreeTrait (i.e. model) to set the query class that implements the NestedSetQueryBehavior.
  4. Include and modify validation in TreeView widget to check if the model in step 2 uses and implements the kartik\tree\models\TreeTrait else an exception will be thrown.

FEATURES

The changes will enable the following:

  • Allow to override and set your own Tree model that extends from any ActiveRecord implementation (and not necessarily extending from kartik\tree\models\Tree). The only consideration is that the implemented model must use the trait kartik\tree\models\TreeTrait.
  • Allow to override and set your own NestedSetQueryBehavior based query class. Just override and set the static property treeQueryClass within your extended model above.

Possible small bug beforeselect

Not 100% sure if it is something I have configured wrong, or if it is desired or if bug but:

treeview.beforeselect appears to be firing on click of "add new" button option - apologies I havn't tested or stepped thru further but thought I would raise this issue for you to double check if it is the case and if it is desired.

I expected it to just fire on tree node selection - as per the documentation. No major as can just test for key === null however thought I should raise issue for you to check.

id attribute not found

Every try to update a tree node was causing an error("id attribute not found").
Solution:
in views/_form.php line 56:
$options = ['disable' => true];

change to:

$options = ['readonly' => true];

Disabled inputs are not passed by post.

Working example

Is there any chance that you could post a working example of how this module is used. I've tried following your step-by-step instructions, but they're just not working for me. For instance, in Getting Started, I went through steps 1, 2, and 3 with no problem. Then in Step 4, Using TreeView widget, it says "In your view files, you can now use the tree view directly to manage tree data as shown below. ..." Now, I have to say: What view files? What controller? What actions? Do I assume that the model will use the NodeController? Do I create a controller and have it extend NodeController?

Then your instructions say to refer to the treeview section for details. Now, it plunges right in to telling me how to set up the widget. Set is up where? I still don't have a controller or view to set it up in.

The only view that I find in the extension is a _form.php partial. I don't know if I'm supposed to understand what that is doing or if I'm supposed to be using it.

I know that it is hard to write technical documentation for this stuff. (I spent over eight years of my life very successfully writing similar technical documentation.) You clearly have make a heroic effort to write documentation, and perhaps I am just stupid. Nonetheless, your documentation just isn't working for me. If I could see all the relevant files from a functioning usage, I could probably reverse engineer it.

Set a maximum nesting level

Hi,

Firstly, thanks for your great work! It is an amazing extension for Yii2!

Are you thinking about implementing an option to set the maximum "lvl" for the tree? In this way it would be possible to limit the nesting level. I have this need in a specific project and I would need that option very badly... ;D

Thanks again for everything!

Can we set 'dataStructure' configuration in Widget instead of in web\config\Module?

As title.
In case I want to add new fields for specific Tree but not for all Trees.

echo TreeView::widget([
// single query fetch to render the tree
// use the Product model you have in the previous step
        'query' => ApprovalTree::find()->addOrderBy('root, lft'),
        'headingOptions' => ['label' => 'Approval_Tree'],
        'fontAwesome' => true, // optional
        'isAdmin' => false, // optional (toggle to enable admin mode)
        //'displayValue' => 11, // initial display value
        'softDelete' => true, // defaults to true
        'cacheSettings' => [
            'enableCache' => true // defaults to true
        ],
        'showCheckbox' => false,
        'multiple' => false,
        'nodeAddlViews' => [
            kartik\tree\Module::VIEW_PART_1 => '@app/views/eop/approvaltree/additionalView',
        ],
// such as enable below setting.
//        'dataStructure' => [
//            'keyAttribute' => 'id',
//            'nameAttribute' => 'name',
//            'user_idAttribute' => 'user_id',
//            'iconAttribute' => 'icon',
//            'iconTypeAttribute' => 'icon_type'
//        ],
]
);

Thanks.

Relations

Good day!
I need to add a relation so that the field 'name' id filed another table, and the derivation of the name of the id formed from this table.
For example:
tree table:
...
name - this id from 'another table'
...

another table
id
another_name
...
...
...

And when output is displayed another_name

How to register this functionality?

How to properly init db

Hi Kartik
When I try to use TreeView widget with an empty db table I get "PHP Fatal Error: Call to a member function parents() on null" in yii2-tree-manager/views/_form.php line 24.
How do I properly initialize the table?

add tag to repository

at least 0.0.1 would be nice, since you can not depend on dev-master in a dependency, if you main project is stable.

I cannot replace nodeView with my own view, and have to add VIEW_PART_X, but cannot hid setion 6 content.

Can we use our own nodeView to replace default view?

'treeViewSettings' => [
                'nodeView' => '@kvtree/views/_form', //Can we replace by our own view??
                'nodeAddlViews' => [
                    kartik\tree\Module::VIEW_PART_1 =>'@app/views/eop/approvaltree/additionalView',
                    kartik\tree\Module::VIEW_PART_2 => '',
                    kartik\tree\Module::VIEW_PART_3 =>'',
                    kartik\tree\Module::VIEW_PART_4 =>'',
                    kartik\tree\Module::VIEW_PART_5 =>'',
                ],
            ],

As I know we cannot replaced till April 30,2015.
As alt solution, I have to use VIEW_PART_X to add additional view.
However, I also want to hide your section 6 content. Since it is useless to me due I will use afterFind function to auto setting.

Can we add a parameters into Module setting to turn on/off session 6? Just need to add an hidden input for key attributes if turn off that session.

Thanks.

Add new plugin events and enhance plugin event parameters

Following jquery events revamped with additional parameters:

  • treeview.beforeselect (New)
  • treeview.selected
  • treeview.selecterror
  • treeview.selectajaxerror (New)
  • treeview.beforeremove (New)
  • treeview.remove
  • treeview.removeerror
  • treeview.removeajaxerror (New)
  • treeview.beforemove (New)
  • treeview.move
  • treeview.moveerror
  • treeview.moveajaxerror (New)
  • treeview.create
  • treeview.createroot
  • treeview.expand
  • treeview.collapse
  • treeview.expandall
  • treeview.collapseall
  • treeview.search
  • treeview.checked
  • treeview.unchecked
  • treeview.change

about the "nodeAddlViews" params .

this feature is not work in my machine , after i modify some code it works:

     $renderContent = function($part) use($nodeAddlViews,$params,$form)  {

    if (empty($nodeAddlViews[$part])) {
        return '';
    }
    $p = $params;
    $p['form'] = $form;
    return $this->render($nodeAddlViews[$part], $p);
};

then replace renderContent with $renderContent (or use the call_user_func... syntax ^-^) .

the original is:

    function renderContent ($part) {

    if (empty($nodeAddlViews[$part])) {
        return '';
    }
    $p = $params;
    $p['form'] = $form;
    return $this->render($nodeAddlViews[$part], $p);
};

above code does not work ! may be some vars can't be resolved !( $nodeAddlViews , $params ,$form)

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.