GithubHelp home page GithubHelp logo

dojo-calendar's Introduction

-------------------------------------------------------------------------------
dojox.calendar
-------------------------------------------------------------------------------
Project state: stable
-------------------------------------------------------------------------------
Credits:
	Damien Garbarino
	Christophe Jolif
-------------------------------------------------------------------------------
Project description:
Candidate calendar widget for Dojo 1.8+
-------------------------------------------------------------------------------
Dependencies:
Dojo Core, Dijit, dojox.html, dojox.widget
-------------------------------------------------------------------------------
Documentation:
    https://dojotoolkit.org/reference-guide/dojox/calendar.html
-------------------------------------------------------------------------------

dojo-calendar's People

Contributors

aaitken80 avatar cjolif avatar damiengarbarino avatar dominiquepicard avatar dylans avatar gerpres avatar mariofalomir avatar pdardailler avatar ramunasd avatar sindilevich avatar wkeese avatar

Stargazers

 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

dojo-calendar's Issues

renderItemToItem() called twice on item during edit end

in the ViewBase.js file, _endItemEditing() passes the edited item to _onItemEditEnd() like this:

            this._onItemEditEnd(lang.mixin(this._createItemEditEvent(), {
                item: this.renderItemToItem(p.editedItem, store),
                eventSource: eventSource,
                completed: !canceled
            }));

but in _onItemEditEnd(), the data is put to the store with:

            store.put(this.renderItemToItem(e.item, store));

This essentially runs renderItemToItem() on the item twice, which mucks up the data if non-standard field names are used.

I would have submitted a patch, but I'm not entirely sure which of them to remove. It looks like _onItemEditEnd() is only called from _endItemEditing(), so I'm assuming the store.put() line can have the renderItemToItem() function removed.

Fine grained data store management

Currently the calendar is loading the entire data set contained by the store.
This is inefficient, especially with asynchronous stores like JsontRest store.
A better way to manage data would be to:

  • add to the query options the time range to display (start & end time) automatically
  • provide a function to set to a SimpleQueryEngine that tests if a data item is in the displayed time range.

In addition, a new cache class that takes a master store could be provided to query this master store for a greater time range and allow local navigation when the data is already loaded. This duration of this time range would be configurable.

No easy way to remove secondarySheet?

It seems that there is no easy way to just remove the scondarySheet from a ColumnView if you don't want it.

buildRendering checks for the existance of the respective DOM node (ColumnView.js, line 77)

if(this.secondarySheetNode){

However if you remove the secondarySheetNode from the template, this fails later with:

ColumnView.js(line 225): this.secondarySheet is undefined

_layoutRenderers: function(renderData){
if(!this.secondarySheet._domReady){ 

Would be cool, if you could just turn the scondarySheet off somehow in case you don't need it. Or am I doing it wrong?

Ease fine grained grid appearance configuration

Provide an easy access to grid cell styling function from the Calendar object.
Example:

calendar.columnView.set("styleGridCellFunc", function(node, date, hours, minutes){
if(hours < 10){
domClass.add(node, "greyCell");
}
this.defaultStyleGridCell(node, date, hours, minutes);
});

No way to retrieve DOM node of item with a specific ID

I have overridden isItemEditable so as to enable/disable item editing of only some specific items (e.g. in case another remote user edits the item, this very item should be looked for other users).

isItemEditable: function(item, rendererKind){
            var _item = this.store.get(item.id);
            if (_item.editable === false) {
                return false;
            }
            return true;
        }

For the looked items, I want to add a new specific CSS class (e.g. make the div's background gray), so as to visually make clear, this item is not editable.

However, there seems to be no easy way to retrieve the "DOM representation" of a specific item (received via the above event), i.e. there is no easy way to get the DOM node of a specific item/event.

I think I will try now to override the renderer class somehow and add a data-dojox-calendar-id property somewhere holding the id of the event...

Dojo Calendar Print Issues in Internet Explorer

If you try to print directly with the option enabled for background and css the calendar does not print correctly. We tried a work around to use a media = print attribute using CSS however we could not resize the calendar using the zoom attribute.

Please advice

Horizontal Scrolling when displayling subcolumns

If you enable subcolumns and you have many of them the calendar-widget doesn't scale. An example use-case would be displaying a calendar for reserving a set of resources (each sub-column representing a resource - such as a cabin). Horizontal scrolling would help a great deal here.

Trouble with JSON REST store

Has the calendar widget already been tested using a JSON REST store (e.g. using node.js and express-resource)?

I have made a very simple testcase that works perfectly with a memory store, but throws always "_39e is not defined" (using the nightly builds as of 2/4/2012) when using a REST store.

The store fires an "index"-GET-request to "/calendar/" whereupon I do return an empty array [] ( I have tried [{}], too, but this does not make any difference ). After the successful request to the yet empty calendar database, I get the error "_39e ist not defined in dojo.js (line 15)".

Can you also please elaborate in the docs 1) whether it is always necessary to use an Observable wrapper for the store and 2) if so what this means when using a JSON REST store. The docs for an observable JSON REST wrapper a quite hard to understand for newbies: "If you are using a server side store like the JsonRest store, you will need to provide a queryEngine in order for the update objects to be properly included or excluded from queries. If a queryEngine is not available, observe listener will be called with an undefined index." ??????? [http://livedocs.dojotoolkit.org/dojo/store/Observable]

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Test Dojo</title>
    <link rel="stylesheet" href="javascripts/dijit/themes/claro/claro.css"/>
    <link rel="stylesheet" href="javascripts/dojox/calendar/themes/claro/Calendar.css"/>
    <script src="javascripts/dojo/dojo.js" data-dojo-config="async:true, parseOnLoad:true, locale:'en'"></script>
    <script>
    require([
        "dojo/parser",
        "dojo/ready",
        "dojox/calendar/Calendar",
        "dojo/store/JsonRest",
        "dojo/store/Observable",
        "dojo/on",
        "dojo/date"
    ], function(parser, ready, Calendar, Store, Observable, on, date){

        ready(function(){

            var id=1; // XXX ToDo: Get id from server

            calendar = new Calendar({
                date: new Date(),
                store: new Observable(new Store({target:'/calendar/'})),
                dateInterval: "day",
                style: "position:relative;width:500px;height:500px"
            }, "calendar");

            calendar.on('gridDoubleClick', function(e){
                var start, end;
                var colView = calendar.columnView;
                var cal = calendar.dateFuncObj;

                if(e.source == colView){
                    start = calendar.floorDate(e.date, "minute", colView.timeSlotDuration);
                    end = cal.add(start, "hour", 1);
                }else{
                    start = calendar.floorToDay(e.date);
                    end = cal.add(start, "day", 1);
                }

                var item = {
                    id: id,
                    summary: "New event " + id,
                    startTime: start,
                    endTime: end,
                    allDay: e.source.viewKind == "matrix"
                };

                id++;       
                calendar.store.add(item);

                calendar.set("selectedItem", item);
                calendar.get("currentView").set("focusedItem", item);
            });

        });
    });
    </script>
</head>
<body class="claro">
    <h1>Test Calendar Widget</h1>
    <div id="calendar"></div>
</body>
</html> 

NLS files indicates localized bundles that don't exist

error(354) Root bundle indicates localized bundles that don't exist. Root: dojox/calendar/nls/buttons; missing bundles: 'es','fi','fr','hu','it','ja','kk','ko','nb','nl','pl','pt','pt-pt','ro','ru','sk','sl','sv','th','tr','zh','zh-tw'.

renderItemToItem() doesn't reference the correct field names in the renderItem object

from what I understand, the rendered item always uses the default field names until it is converted to a standard item, so renderItemToItem() should be using startTime/endTime/etc as keys for the renderItem object. However, it's currently using the user-defined field names (startTimeAttr, endTimeAttr), which doesn't seem correct.

Here's a patch.

diff --git a/StoreMixin.js b/StoreMixin.js
index f5beadb..a42d866 100644
--- a/StoreMixin.js
+++ b/StoreMixin.js
@@ -113,9 +113,9 @@ define(["dojo/_base/declare", "dojo/_base/array", "dojo/_base/html", "dojo/_base
                        }
                        var item = {};
                        item[store.idProperty] = renderItem.id;
-                       item[this.summaryAttr] = renderItem[this.summaryAttr];
-                       item[this.startTimeAttr] = (this.encodeDate && this.encodeDate(renderItem[this.startTimeAttr])) || renderItem[this.startTimeAttr];
-                       item[this.endTimeAttr] = (this.encodeDate && this.encodeDate(renderItem[this.endTimeAttr])) || renderItem[this.endTimeAttr];
+                       item[this.summaryAttr] = renderItem.summary;
+                       item[this.startTimeAttr] = (this.encodeDate && this.encodeDate(renderItem.startTime)) || renderItem.startTime;
+                       item[this.endTimeAttr] = (this.encodeDate && this.encodeDate(renderItem.endTime)) || renderItem.endTime;
                        return lang.mixin(store.get(renderItem.id), item);
                },

This resolves the assertion failure that I was experiencing with the ItemFileWriteStore.

when a calendar item is created and then updated (via the store), the item is duplicated on the calendar

I've created a testcase for this issue. In the testcase, I have one event that is pre-defined in the store ("Item #1"). Once the page is loaded, the dojo.ready() function updates Item #2 (with a new summary and start/end time), and then creates a new item ("Item #2"), and then updates that item (with a new summary and start/end time). You'll see that the first item updates fine, but the second item get duplicated. What's interesting, though, is that if you look at calendar_store._arrayOfAllItems after the page is loaded, there's only two items in the store.. so they're just getting duplicated on the calendar, the store itself is working fine.

I tried to track down this bug to fix it myself but couldn't seem to find the source of it.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<link rel="stylesheet" type="text/css" href="dijit/themes/claro/document.css" />
<link rel="stylesheet" type="text/css" href="dijit/themes/claro/claro.css" />
<link rel="stylesheet" type="text/css" href="dojox/calendar/themes/claro/Calendar.css" />
<script src="dojo/dojo.js" type="text/javascript" data-dojo-config="parseOnLoad: true"></script>

<script type="text/javascript">
require([
    "dojo/ready",
    "dojo/data/ItemFileWriteStore",
    "dojo/store/DataStore",
    "dojo/store/Observable",
    "dojox/calendar/Calendar"
], function(ready) {
    ready(function() {
        // update event #1
        calendar_dataStore.put({'id':1,'summary':'Item #1 Update','startTime':'2012-03-06T12:00:00','endTime':'2012-03-06T16:00:00'});
        // create event #2
        calendar_dataStore.put({'id':2,'summary':'Item #2','startTime':'2012-03-07T10:00:00','endTime':'2012-03-07T14:00:00'});
        // update event #2
        calendar_dataStore.put({'id':2,'summary':'Item #2 Update','startTime':'2012-03-07T12:00:00','endTime':'2012-03-07T16:00:00'});
    });
});

// predefined data
var calendarData = {
    'identifier':'id',
    'numRows':1,
    'items':[
        {'id':1,'summary':'Item #1','startTime':'2012-03-06T10:00:00','endTime':'2012-03-06T14:00:00'}
    ]
}
</script>

</head>

<body class="claro">

<div data-dojo-type="dojo.data.ItemFileWriteStore" data-dojo-id="calendar_store" data-dojo-props="data:calendarData"></div>
<div data-dojo-type="dojo.store.DataStore" data-dojo-id="calendar_dataStore" store="calendar_store"></div>
<div data-dojo-id="calendar" data-dojo-type="dojox.calendar.Calendar" store="dojo.store.Observable(calendar_dataStore)"></div>

</body>
</html>

Updating Items from JsonRestStore

I have my calendar working happily off the JsonRestStore, which is wrapped by Observable. I need to update the items by polling the store every 30 seconds. I noticed that, it stacks the events one on top of another, instead of doing what I hoped which was overwriting the existing items in the store (based on id) and the view updating. It eventually fills the dom and crashes the browser. What is the intent for this type of need? A live, calendar? Right now I am doing a dojo query and orphaning all of the dojoxCalendarEvents before each poll, but it flashes.

Manage working times that overlaps 2 days

From http://bugs.dojotoolkit.org/ticket/17024

ColumnView 'minHours' and 'maxHours' properties to define the start and the end of something that looks like very much a working day. Because the 'active hours' concept is definitely useful, i would like to mention the case of recurrent nightly activities, those ones that start at the end of a day (ex. 22h00) and stop at the early hours of the next day (Ex.06h00). In such a case, the active hours are spread on 2 days. Or said differently, a day contains 2 partial intervals of active hours. Support to people who works during the night or those who works in the opposite time zone are potentiel use-case.

data loaded from external data source doesn't show until calendar view is changed

This widget is looking really great so far!! I'm running into a little hitch, though. I'm linking the calendar to an ItemFileWriteStore via the dojo.store.DataStore adapter. It works fine if I'm passing the data directly to the ItemFileWriteStore via the "data" parameter, however, if I'm loading the data from an external source via the "url" parameter, the events don't show up on the calendar until the calendar view is changed (i.e. switched from 4-day to monthly).

I've uploaded a couple test files to gist: https://gist.github.com/1981034

calendar_internal.html is loading the data from a javascript variable, and calendar_external.html is loading the data from calendar_data.json (which I've also attached).

As a side-issue, I'm also having problems updating the events to the store; if you drag-and-drop the sample event in either of the above examples, the ItemFileWriteStore responds with "assertion failed in ItemFileWriteStore", even though I've defined a callback to assert the save. The callback never seems to get called at all, though that may be an issue with the data adapter, and not the calendar widget.

Thanks!

Incorrect margin-bottom on itemContainerTable nodes

I've taken a screenshot since that will be the easier way to explain the issue.

http://chrisacky.com/images/calendarBug.png

When I double click on a date to add an Event, the new event gets added to the itemContainerTable however, because the .dojoxCalendarContainerColumn inside of the itemContainerNode gets applied a marginBottom on line 938 of MonthColumnView.js it messes up the positioning of new items. (ie It incorrectly adds a 800pixel margin b0ttom)

For me, the fix was to just comment out the line.

         query("td>div", table).forEach(function(div, i){

            domStyle.set(div, {
                "height":   renderData.sheetHeight + "px",
                // "marginBottom":  "-" + renderData.sheetHeight + "px"
            });
            bgCols.push(div);       
        }, this);

I'm not sure why the margin exists? I can't replicate this bug on download tests, but I can't avoid this bug on my own application. Even when running a really basic test page.

(Also, in another ticket you metnion asking userability questions on dojox.Calendar on the userlist. Where would be a good place to ask?)

updateRendering incorrect for MonthColumnView when endDate is the first of the month

Hi,
When the endDate is the first of the month, (so that the start date is in the previous month), if you are using the MonthColumnView, the rendering is wrong.

It assumes to just extend the height one item more, which causes the actual rendered item to expand out all the way to the bottom of the month.

Look at this example image.. You can see the startDate and the endDate in the UI on the left.

And it seems as though the updateRenderer passes the wrong height...

https://github.com/damiengarbarino/dojo-calendar/blob/master/MonthColumnView.js#L1199

calendarBugHeight

I believe that the problem originates in the calculation made in _dateToYCoordinate()

The pos gets calculated incorrectly because the 1st of the month, minus 1 day, is 31. And then the height becomes the full height of the month...

_dateToYCoordinate: function(renderData, d, start){
        var pos = 0;
        if(start){
            pos = (d.getDate()-1) * this.renderData.daySize;
        }else{
            var d2 = this._waDojoxAddIssue(d, "day", -1);
            pos = this.renderData.daySize + ((d2.getDate()-1) * this.renderData.daySize);
        }            
        pos += (d.getHours()*60+d.getMinutes())*this.renderData.daySize/1440;
            return pos;
}

Ps. I'm Layke in #dojo so feel free to ping me in the IRC channel if you make it in any time.

Bug? New Calendar CreateOnGridClick seems not working with JSON server‏

my code is pretty much the same as demo:

                                calendar1.createOnGridClick=true;
                                var createItem= function(view, d, e){
                    // create item by maintaining control key
                    if(!e.ctrlKey || e.shiftKey || e.altKey){
                      return;
                    }
                   var start, end;
                   var colView = calendar1.columnView;
                   //var cal = dijitCal.dateFuncObj;

                   if(view == colView){
                    start = calendar1.floorDate(d, "minute", colView.timeSlotDuration);
                    //end = cal.add(start, "minute", colView.timeSlotDuration);
                    end=date.add(start, "minute", colView.timeSlotDuration);
                   }else{
                    start = calendar1.floorToDay(d);
                    //end = cal.add(start, "day", 1);
                    end = date.add(start, "day", 1);
                   }

                  var item = {
                    id: 200,
                    summary: "New event " + 200,
                    startTime: stamp.toISOString(start),
                    endTime: stamp.toISOString(end)
                  };
                  return item;
            };

            calendar1.createItemFunc=createItem;

in fact, it is working fine if calendar.store is Memory store. but if I
change my store to a JSON server, CreateOnGridClick seems not working fine.

I debugged a little bit, it seems like store.add() function is fired once
user click on the Grid because I can catch a pending PUT request to the
server. a NULLPointerException happened in ViewBase.js file right after put.
(line in BOLD):

this.createOnGridClick},_gridMouseDown:!1,_onGridMouseDown:function(a){this._gridMouseDown=!0;this.showFocus=!1;this._isEditing&&this._endItemEditing("mouse",!1);this._doEndItemEditing(this.owner,"mouse");this.set("focusedItem",null);this.selectFromEvent(a,null,null,!0);this._setTabIndexAttr&&this[this._setTabIndexAttr].focus();if(this._onRendererHandleMouseDown){var
b=this.get("createItemFunc");if(b){var
b=b(this,this.getTime(a),a),c=this.get("store");b&&null!=
c&&(c.put(b),(b=this.getRenderers(b)[0])

it looks like the new item is not created because the request is not
returned back from the server.

if anything wrong with my code, please help me correct it! if it is a bug,
please fix it or tell me a work around.

thanks a lot!

matrixView.js err

I have a tabContainer with 10 tabs. Each tab contain one calendar.
If I switching the tab and changing the calendar dateInterval, after some times,

in FF will prompt this err
TypeError: d is undefined
return this.renderData.dateLocaleModule.getNames('days', this.columnHeaderLabelLength ? this.columnHeaderLabelLength : 'wide', 'standAlone')[d.getDay()]; MatrixView.js line 347

in Chrome
Uncaught TypeError: Cannot read property '0' of undefined /js/dojo1.8.0/dojox/calendar/MatrixView.js:644
declare._buildRowHeader /js/dojo1.8.0/dojox/calendar/MatrixView.js:644
array.forEach /js/dojo1.8.0/dojo/_base/array.js:240
lang.extend.forEach /js/dojo1.8.0/dojo/query.js:482
declare._buildRowHeader /js/dojo1.8.0/dojox/calendar/MatrixView.js:640
declare._createRendering /js/dojo1.8.0/dojox/calendar/MatrixView.js:428
declare.refreshRendering /js/dojo1.8.0/dojox/calendar/MatrixView.js:406
declare.validateRendering /js/dojo1.8.0/dojox/widget/_Invalidating.js:53
lang.hitch

Anything I can do to solve this problems???

Creating Items when using JsonRest-store

I'm using Dojo 1.9.0 and I have a Calendar-widget hooked up to a JsonRest-store. Now by looking at the tests and by inspecting the code it seems one must assign an ID to the item directly on the client-side. In my case I cannot do that, the server will assign the ID when the item is persisted. I am pretty sure this was working fine earlier with 1.8.x.

What's the thinking here ? To me this looks like a defect...

Resetting the store does not refresh view

dateChooser.on('change', function() {
                var date = dateChooser.get('value');
                console.log('Before');
                calendar.store.query().forEach(function(item){
                    console.log(item);
                });
                calendar.store.setData([]);
                console.log('After');
                calendar.store.query().forEach(function(item){
                    console.log(item);
                });
                calendar.set("date", date);
            });

Don't know, whether this is s specific issue of the calendar widget or a general problem of the observable wrapper. Do you know? Otherwise I will report this on the Dojo bug tracker...

IE8 and JsonRestStore

I see the dojox/calendar/tests/demos work on IE8 just fine, but when I hook it up to the JsonRestStore on IE8 i can't see any events. If I switch to IE9 mode it is fine. I have tried every permutation of doctype and uxCompatible settings. It dies without any error of what is wrong, and there are no html slots loaded in any col. Ideas on where to look?

SimpleColumnView: set('date', mydate) does not update widget

Setting a new date for a SimpleColumnView does not refresh the widget, i.e. the column still displays the date the widget has been created with.

Test case:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Test DayCalendar</title>
    <link rel="stylesheet" href="../javascripts/dijit/themes/claro/claro.css"/>
    <link rel="stylesheet" href="../javascripts/dojox/calendar/themes/claro/SimpleColumnView.css"/>
    <script src="../javascripts/dojo/dojo.js" data-dojo-config="async:true, parseOnLoad:true, locale:'en'"></script>
    <script>
    require([
        "dojo/parser",
        "dojo/ready",
        "dojo/store/Memory",
        "dojo/store/Observable",
        "dojox/calendar/SimpleColumnView",
        "dojox/calendar/VerticalRenderer",
        "dijit/Calendar"
    ], function(parser, ready, Store, Observable, SimpleColumnView, VerticalRenderer){

        ready(function(){

            var calendar = new SimpleColumnView({
                date: new Date(),
                store: new Observable(new Store()),
                verticalRenderer: VerticalRenderer,
                columnCount: 1,
                hourSize: 75,
                minHours: 7,
                maxHours: 22,
                timeSlotDuration: 10,
                style: "position:relative; width:500px; height:500px;"
            }, "calendar");

            dateChooser.on('change', function(){
                var date = dateChooser.get('value');
                calendar.set('date', date);
                console.log("Calendar's date is " + calendar.get('date'));
            });


        });
    });
    </script>
</head>
<body class="claro">
    <div id="calendar"></div>
    <div data-dojo-id="dateChooser" data-dojo-type="dijit/Calendar"></div>
</body>
</html> 

Paging between month views on IE8 causes events to be hidden

The problem is when IE8 is in use the item table gets clobbered due to the IE bug workaround in MatrixView._buildItemContainer. This is attempted to be worked around by calling _recycleItemRenderers(true), but this isn't sufficient. In this case there can still be items in the renderer pool (ViewBase.rendererPool) which are not in the rendererList (i.e. previously released renderers). These items can still be attached to the dom tree that gets clobbered, and hence have their contents wiped out. The result of this is when paging between months in IE8 some items are still there (show up on hover), but have no labels since their labelRenderers have been clobbered. If I change this code in ViewBase:

if(remove){
renderer.container.parentNode.removeChild(renderer.container);
}

to this:

if(remove || has("ie") == 8){
renderer.container.parentNode.removeChild(renderer.container);
}

all works correctly.

Unify mouse/touch interaction model using dojo/touch

Currently the calendar is native touchStart, touchMove and touchEnd events.
To be more generic, it could use the dojo/touch API
Problem: mixing Mouse and Touch will trigger issues as dojo/touch is reacting to mouse event.

chrome INVALID_STATE_ERR: DOM Exception 11

Hi,

I obtained a really strange behaviour in Google Chrome while using the calendar on my Windows 7 pc.
When I moving an event in the calendar chrome showed me this error.

The error is throw during the function "_onItemEditEnd" of viewBase.js.
I can't see if there's something wrong in the given object, but when calling the "put" function a dojo.Deferred is passed. Inside the "put" function JSON.stringify() is called, and then INVALID_STATE_ERR is thrown.

So the error doesn't seems to be related to the store, but with the given object.

Here's my code:

index.html: https://gist.github.com/3370464
calendar.js: https://gist.github.com/3370457

The datasource returns object in the following form:

{"id":4,"summary":"b","startTime":"2012-08-14T10:00:00Z","endTime":"2012-08-14T11:00:00Z"}

This error is somehow Chrome-specific, Firefox or Internet Explorer didn't trigger this error

Thanks in advance,
-Davide

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.