Git Product home page Git Product logo

esn-frontend-calendar's Introduction

esn-frontend-calendar

Calendar application for OpenPaaS

Development

Configuration

First, you want to ensure that the application grid component is provided with the necessary information about the apps via the environment variable APP_GRID_ITEMS:

cp .env.example .env
  • APP_GRID_ITEMS: A stringified JSON representation of the apps to show in the application grid. It has the following shape:
    [
      { "name": "Inbox", "url": "http://localhost:9900/#/unifiedinbox/inbox" },
      { "name": "Calendar", "url": "http://localhost:9900/#/calendar" },
      ...
    ]

Then, launch the dev server on http://localhost:9900:

OPENPAAS_URL=https://dev.open-paas.org npm run serve
  • OPENPAAS_URL: The OpenPaaS URL to be used by the current SPA application. Defaults to http://localhost:8080.

The development server can also be used to serve minified SPA to check that everything is OK:

OPENPAAS_URL=https://dev.open-paas.org npm run serve:prod

Authentication

Authentication is provided by a dedicated SPA esn-frontend-login-app which is defined in the project devDependencies. In order to make it work with the webpack-dev-server launched by the npm run serve command, you will have to generate it like this:

cd ./node_modules/esn-frontend-login && npm install && npm run build

Serve

Go to http://localhost:9900/calendar/ to open the SPA

Build

Generates minified SPA in the ./dist folder:

npm run build:prod

Regarding APP_GRID_ITEMS, you can also provide it as a system variable for production purposes, e.g.:

APP_GRID_ITEMS="[{ \"name\": \"Calendar\", \"url\": \"https://dev.open-paas.org/calendar/\" }, { \"name\": \"Contacts\", \"url\": \"https://dev.open-paas.org/contacts/\" }, { \"name\": \"Inbox\", \"url\": \"http://dev.open-paas.org/inbox/\" }, { \"name\": \"Admin\", \"url\": \"https://dev.open-paas.org/admin/\" }, { \"name\": \"LinShare\", \"url\": \"https://user.linshare-4-0.integration-linshare.org/\" }]" npm run build:prod

Running tests

You can run tests by executing the following command:

npm run test

Note that there is a 10000ms timeout by default. If you want to change that, simply pass the TEST_TIMEOUT environment variable:

TEST_TIMEOUT=2000 npm run test

Debugging tests

You can debug tests on VSCode with Chrome by executing the following command:

npm run test:debug

Then you have to add the following configuration to you launch.json and then run it (F5):

{
  "name": "Attach to Chrome",
  "port": 9222,
  "request": "attach",
  "type": "pwa-chrome",
}

This will let you use breakpoints on the application. Save a file to make tests run again.

esn-frontend-calendar's People

Contributors

alagane avatar asmanode avatar atan-linagora avatar fabienmoyon avatar michaelbailly avatar pbson avatar piavgh avatar ppppbn avatar renaudboyer avatar rezk2ll avatar tanandy avatar thebtililya avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

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

esn-frontend-calendar's Issues

Wrong behavior when invite users who has duplicated default calendar "My Calendar"

Context and reproduced steps

  • During the migration from OBM to OpenPaaS, by somehow, user B has 2 "My calendar"
  • user A login to calendar spa
  • user A creates a new event with attendees: B & C

Current behavior

  • The created event does not appear on the organizer (user A) calendar
  • The created event appears on the user C calendar

Expected behavior

  • The created event must appear on the organizer (user A) calendar

Additional info: log on user A browser

Screenshot from 2020-09-18 15-05-35

I cannot select "My Agenda" when importing an ICS

Reproduction steps:

  • set "My Agenda" -> "Settings" -> "Public rights" to "See all events details"
  • click on "+" => "Import"
  • use the dropdown to choose the target calendar

Current behaviour

My Agenda is not in the list

image

Expected behaviour

My Agenda is in the list

Analyses

The rules to set whether the calendar is writable is wrong https://github.com/OpenPaaS-Suite/esn-frontend-calendar/blob/main/src/esn.calendar.libs/app/services/cal-ui-authorization-service.js#L47 :

return !!calendar && calendar.isOwner(userId) && !calendar.isSubscription() && !calendar.isPublic();

calendar.isPublic() here should means "has been shared with me using public sharing" and not "is publicely shared or not".

Mobile > iOS > The next/previous button on the header of planning sidebar

Actual Result

On the planning sidebar, It's hard to tap on the next/ previous buttons to change the date.

3E669B02-0FE8-4F7A-AD8D-D2BE1157B8A0

Expected result

Please investigate the issue.
It might because of the tooltips. Tooltips are no more needed for mobile/tablet devices, so please remove them.

Environment

Chrome on iOS Mobile/Tablet

Calendar is broken

Console message when loading the calendar:

session.js:116 TypeError: this.each is not a function
    at Object.r.fn.fullCalendar (fullcalendar.js:12396)
    at Object.fullCalendar (calendar.controller.js:26)
    at M (main.61e0d8013a556e24ecad.min.js:2)
    at angular.js:13319
    at angular.js:13335
    at d.$eval (angular.js:14571)
    at d.$digest (angular.js:14387)
    at d.$apply (angular.js:14676)
    at session.js:118

I think it's because here: https://github.com/OpenPaaS-Suite/esn-frontend-calendar/blob/main/src/linagora.esn.calendar/app/components/calendar/calendar.controller.js#L25 this should be changed to self.

Correct location selection for dav import

current location is:

process.env.OPENPAAS_URL || 'http://localhost:8080';

process.env.OPENPAAS_URL means nothing when the app is built (using npm run build:prod).

The root url is the same as the one currently serving the app, so window.location can be used here.

Text color is incorrect in the event details modal

Actual Result

In the event details modal, some labels are faded than other text. It is #555555 while other's is #0D0D0D

image

Expected result

Text labels should be in the same color

Environment
Browsers on Ubuntu

The calAttendeeAvatarExternal component loads image from server

Module esn-frontend-calendar-public will be broken because it also uses this component

The avatar is missing (it should appear next to the green check mark)
Screenshot 2020-08-11 14:09:30

Related file: src/esn.calendar.libs/app/components/avatar/attendee-avatar/external/attendee-avatar-external.pug

.cal-attendee-avatar
  a.avatar(href="", ng-attr-title='{{::ctrl.getDisplayName()}}')
    img(ng-src="{{ctrl.avatarUrl}}", src='/images/throbber-amber.svg', fallback-src='/images/user.png', alt="{{ 'Avatar' | translate }}")

Opening color-chooser widget throw an error with serve:prod

When using npm run serve:prod:

  • choose "New Calendar"
  • in the form, click on the color square
  • this throw an error in the console:
Error: [$injector:unpr] Unknown provider: tProvider <- t
http://errors.angularjs.org/1.3.20/$injector/unpr?p0=tProvider%20%3C-%20t
    at angular.js:63
    at angular.js:4031
    at Object.a [as get] (angular.js:4178)
    at angular.js:4036
    at a (angular.js:4178)
    at Object.s [as invoke] (angular.js:4210)
    at angular.js:8516
    at Object.link (angular-strap.js:2483)
    at Object.g.show (angular-strap.js:2648)
    at angular-strap.js:2619

Can not understand email notification about event update

Yesterday I received an email about an updated event but I do not understand anything:

  1. Email sender is Vincent
  2. In email body, it is mentioned that "Michael updated the event"
  3. The 'bluebar' date is 30 oct. 2018 11:00 (1h)
  4. The 'Event details' opens /
  5. The From/To date in email body is 10/30/201810:00 AMUTC |   | 10/30/201811:00 AMUTC

So who updated the event? Which event (it is a recurrent event)? etc

Capture d’écran 2020-09-15 à 10 09 51

Dependencies optimization

As explained here, switch the calendar SPA to require only vendor-libs from esn-frontend-common-libs, then it'll use its own files to handle dependencies

Mobile > The date/time picker on android is not convenient to use

Actual Result

On Android, it uses date/time picker as on the PC, which makes it's not convenient to use.

processed1
processed

While on iOS, it uses the default time picker of IOS which is fit the mobile screen.

Expected result

Mobile Android should use the default date/time picker of Android.

Environment

Chrome on mobile Android 8.1.0
Phone: Redmi Go

Private event has incorrect behavoir in delegated user calendar with "edit and manage sharing" permission

Actual Result

  1. Open the private event details, it displays the modal: Create a new event

label

=> It should display "Edit event" modal because the delegated user has update permission.

  1. A private event is displaying as if it belongs to the default calendar of the delegated user (My Agenda)

calendar

=> The calendar name of the private event is apparent, it shouldn't be hidden. Please display the correct calendar name of the private event.

  1. After updating the private event, it displays an ambiguous message: "No content. Please refresh your calendar"

Peek 2020-08-21 14-53

=> It is able to update a private event, so it should display: "Event updated" after the update.

Precondition

  • UserA delegated to UserB a calendar with permission "edit and manage sharing"
  • UserA creates a private event in the delegated calendar:

Environment
Firefox/Chrome on Ubuntu

Group resolver

Allows to resolve from a group.

Denormalize group members to event attendees.

Cannot respond to the recurrence event

Actual Result

User cannot respond to the recurrence event successfully

respond

image

Expected result

User should be able to respond to the recurrence event.

Environment

As a user, I want a more user-friendly time picker instead of the current clock picker so that I can conveniently pick time on all types of devices

User story summary

As a user, I want a more user-friendly time picker instead of the current clock picker so that I can conveniently pick time on all types of devices.

Where to find the feature

The current clock picker is used in many places, notably the event dialog (when you create an event or edit an event in Calendar).

Criteria

  • The time picker must support both 12-hour format and 24-hour format.
  • The step for the time picker is 15 minutes, starting from 12:00 AM (in 12-hour format) or 00:00 (in 24-hour format).
  • The currently selected time should be highlighted (by having the primary color) in the list of time options.
  • The time picker must respect the selected language (locale) of the user. For example, when the user has selected Vietnamese, it should be 12:00 SA instead of 12:00 AM.
  • The user will also be able to edit the time directly in the input. This should work with both 12-hour format and 24-hour format.
  • When the user enters an invalid time in the input (e.g. "abcdef") and leaves the input, the time resets back to the previous value.
  • When 12-hour format is selected and the user inputs a time within [00:00, 12:00], e.g. 09:00, it should then be converted to 09:00 AM after the input loses focus.
  • When 12-hour format is selected and the user inputs a time within [12:00, 24:00], e.g. 15:00, it should then be converted to 03:00 PM after the input loses focus.
  • When the user inputs a time larger than 24:00, e.g. 25:00, it should be considered as an invalid date.
  • On mobile devices, the native time picker should be used instead.
  • When the user has no permission to edit the event, the time selector should appear disabled.
  • When the user enters the time select input using the "Tab" button on the keyboard, it should open the select menu and should close it when the user leaves the input, also using "Tab".
  • (Optional) While the user is inputting, the best matched time option should be selected and the dropdown should scroll to it. For example, when the user inputs "430", the 04:30 (in 24-hour format) or 04:30 AM (in 12-hour format) will be selected.

UI/UX Design

  • When the user first opens the time picker:

image

  • The selected time should be highlighted in the list of time options:

image

Fix automated i18n code

As explained here. Calendar migration to frotnend only has resulted in warnings:

In the task changing pug i18n calls __() with angular translate {{ 'thing' | translate }}
The expression
#{__('%s attendees', '{{ctrl.attendees.length}}')}
will be replaced by
{{ '%s attendees' | translate:ctrl.attendees.length }}

That will not work. The code should be updated to use Angular Translate way of passing arguments
See https://angular-translate.github.io/docs/#/api/pascalprecht.translate.filter:translate
File: /home/mbailly/work/openpaas/git/esn-frontend-calendar/src/linagora.esn.calendar/app/components/attendee/list/attendee-list.pug

---------------------------------------------
In the task changing pug i18n calls __() with angular translate {{ 'thing' | translate }}
The expression
#{__('%s suggested some changes', '{{ $ctrl.user.displayName }}')}
will be replaced by
{{ '%s suggested some changes' | translate:$ctrl.user.displayName }}

That will not work. The code should be updated to use Angular Translate way of passing arguments
See https://angular-translate.github.io/docs/#/api/pascalprecht.translate.filter:translate
File: /home/mbailly/work/openpaas/git/esn-frontend-calendar/src/linagora.esn.calendar/app/components/event-date-suggestion/summary/event-date-suggestion-summary.pug

---------------------------------------------
In the task changing pug i18n calls __() with angular translate {{ 'thing' | translate }}
The expression
#{__('Recurs %s', '{{ $ctrl.event.getRecurrenceType() | lowercase }}')}
will be replaced by
{{ 'Recurs %s' | translate:$ctrl.event.getRecurrenceType() | lowercase }}

That will not work. The code should be updated to use Angular Translate way of passing arguments
See https://angular-translate.github.io/docs/#/api/pascalprecht.translate.filter:translate
File: /home/mbailly/work/openpaas/git/esn-frontend-calendar/src/linagora.esn.calendar/app/components/event-date-suggestion/summary/event-date-suggestion-summary.pug

---------------------------------------------
In the task changing pug i18n calls __() with angular translate {{ 'thing' | translate }}
The expression
#{__('Recurs %s', '{{ $ctrl.event.getRecurrenceType() | lowercase }}')}
will be replaced by
{{ 'Recurs %s' | translate:$ctrl.event.getRecurrenceType() | lowercase }}

That will not work. The code should be updated to use Angular Translate way of passing arguments
See https://angular-translate.github.io/docs/#/api/pascalprecht.translate.filter:translate
File: /home/mbailly/work/openpaas/git/esn-frontend-calendar/src/linagora.esn.calendar/app/components/inbox/invitation-message-blue-bar/invitation-message-blue-bar.pug

---------------------------------------------
In the task changing pug i18n calls __() with angular translate {{ 'thing' | translate }}
The expression
#{__('%s has accepted this event', '{{ $ctrl.replyAttendee.displayName || $ctrl.replyAttendee.email }}')}
will be replaced by
{{ '%s has accepted this event' | translate:$ctrl.replyAttendee.displayName || $ctrl.replyAttendee.email }}

That will not work. The code should be updated to use Angular Translate way of passing arguments
See https://angular-translate.github.io/docs/#/api/pascalprecht.translate.filter:translate
File: /home/mbailly/work/openpaas/git/esn-frontend-calendar/src/linagora.esn.calendar/app/components/inbox/invitation-message-blue-bar/invitation-message-blue-bar.pug

---------------------------------------------
In the task changing pug i18n calls __() with angular translate {{ 'thing' | translate }}
The expression
#{__('%s has tentatively accepted this event', '{{ $ctrl.replyAttendee.displayName || $ctrl.replyAttendee.email }}')}
will be replaced by
{{ '%s has tentatively accepted this event' | translate:$ctrl.replyAttendee.displayName || $ctrl.replyAttendee.email }}

That will not work. The code should be updated to use Angular Translate way of passing arguments
See https://angular-translate.github.io/docs/#/api/pascalprecht.translate.filter:translate
File: /home/mbailly/work/openpaas/git/esn-frontend-calendar/src/linagora.esn.calendar/app/components/inbox/invitation-message-blue-bar/invitation-message-blue-bar.pug

---------------------------------------------
In the task changing pug i18n calls __() with angular translate {{ 'thing' | translate }}
The expression
#{__('%s has declined this event', '{{ $ctrl.replyAttendee.displayName || $ctrl.replyAttendee.email }}')}
will be replaced by
{{ '%s has declined this event' | translate:$ctrl.replyAttendee.displayName || $ctrl.replyAttendee.email }}

That will not work. The code should be updated to use Angular Translate way of passing arguments
See https://angular-translate.github.io/docs/#/api/pascalprecht.translate.filter:translate
File: /home/mbailly/work/openpaas/git/esn-frontend-calendar/src/linagora.esn.calendar/app/components/inbox/invitation-message-blue-bar/invitation-message-blue-bar.pug

---------------------------------------------
In the task changing pug i18n calls __() with angular translate {{ 'thing' | translate }}
The expression
#{__('This will remove the "%s" calendar and all events it contains.', "{{::ctrl.calendarName}}")}
will be replaced by
{{ 'This will remove the "%s" calendar and all events it contains.' | translate:ctrl.calendarName }}

That will not work. The code should be updated to use Angular Translate way of passing arguments
See https://angular-translate.github.io/docs/#/api/pascalprecht.translate.filter:translate
File: /home/mbailly/work/openpaas/git/esn-frontend-calendar/src/linagora.esn.calendar/app/components/modals/calendar-delete-confirmation/calendar-delete-confirmation-modal.pug

---------------------------------------------
In the task changing pug i18n calls __() with angular translate {{ 'thing' | translate }}
The expression
#{__('This will unsubscribe you from the "%s" calendar.', "{{::ctrl.calendarName}}")}
will be replaced by
{{ 'This will unsubscribe you from the "%s" calendar.' | translate:ctrl.calendarName }}

That will not work. The code should be updated to use Angular Translate way of passing arguments
See https://angular-translate.github.io/docs/#/api/pascalprecht.translate.filter:translate
File: /home/mbailly/work/openpaas/git/esn-frontend-calendar/src/linagora.esn.calendar/app/components/modals/calendar-delete-confirmation/calendar-delete-confirmation-modal.pug

I cannot change my participation status when I am the organizer of an event without having to press the "Save" button

Steps to reproduce

This bug only happens on the web app.

  • As User1:
  1. Go to the web app, login, and go to Calendar.
  2. Create an event. (Optionally) Invite User2 and User3.
  3. Open the newly created event.
  4. Click on the "Maybe" button to change the participation status.

Current behaviour

Nothing happens. No notification is shown, and User1's participation status isn't updated. The participation status will only be updated after User1 (the organizer) clicks the "Save" button.

Expected behavior

User1's participation status should be updated and a notification should be shown to inform that the participation status has been updated without having to press the "Save" button.

Criteria

  • The participation status should be updated right after the organizer clicks one of the "Accept/Maybe/Decline" buttons, without having to click the "Save" button.
  • If the organizer chooses the same participation status, nothing should happen.
  • After the participation status has been updated when the user clicks one of the "Accept/Maybe/Decline" buttons, he/she should be able to continue to edit the event.
  • After the organizer has made some changes (but hasn't clicked the "Save" button), and he/she clicks one of the "Accept/Maybe/Decline" buttons, the participation status should be updated and the changes he/she has made must still remain and he/she can save them.
  • the save and delete buttons should be disabled while the organizer participation status is being updated ( slow connections ).

I cannot save event if change start date by typing date string into start date field

Reproduction steps

Using the web interface

  • Create new event, edit start date by typing date string (exp: Thu 2020/09/10)

Actual behaviour

  • Button "save" event is not activated.
  • Cannot save event

Expected behavior

  • Can select start date by that way, and event can be save.

More Infomation

  • If I copy this date string and paste to that field, button save work and i can save event.

Only event organizer see the event

Scenario 1:

  1. Usera shares calendar X to userb (either by delegation or public share)

  2. Usera creates event in calendar X

=> Userb does not see the above event

Scenario 2:

  1. Usera shares calendar X to userb (either by delegation or public share)
  2. Userb creates event in calendar X
    => Usera does not see the above event

Scenario 3:

  1. Usera shares calendar X to userb (either by delegation or public share)
  2. Usera/userb creates event in calendar X and add userc as attendee
    => Userc does not see the event

Scenario 4:

  1. Usera create an event in his calendar and invite user b
    => Userb does not see the event

To SUM UP: only people who create the event can see the event in his calendar

Translation issue in calendar

  • Event details -All languages
    image
    image

Actual: Date picker displays days in a week in English
Expected: Should display in the corresponding languages

  • Adding a shared caledar - all languages

add_calendar

Actual: When adding a shared calendar, it displays a message in English: "Successfully added shared calendar"
Expected: The message should be translated into the corresponding language.

  • Configuration saved message when saving calendar setting - FR
    Peek 2020-08-21 16-29

Actual: Display "Configuration saved"
Expected: Please translate to French

  • Calendar setting > Display - all languages
    image

Actual: "Show" option is in English
Expected: It should be translated to the corresponding language

  • Event invitation mail/Updating mail/ Cancelation mail - FR
    image
    image

Actual: Some places in English have been marked in red
Expected: Please translate to French

  • Tooltip is in English-FR
    tooltip

Actual: Tooltip "Mail to attendees" is in English
Expected: It should be translated to French

  • Response message in the invitation mail - FR
    translation

Actual: After the response to an invitation email, it displays a message in English.
Expected: Messages should be French

  • Incorrect word - EN
    image

Actual: In the invitation email, there're some places display "a videoconference" - which is not a word
Expected: It should be "a video conference"

  • Event details > Recurrence - Chinese
    image

Actual: In the event details, the recurrence option displays days in a week and label "on" in english
Expected: It should be translated into Chinese

  • The note for video conference in event details modal - Chinese
    image

Actual: Open the event details, the note for video conference is in English
Expected: It should be translated into Chinese

[UX] Need a message to inform user for importing calendar

Actual Result

When importing a calendar, it displays only the message "Request submitted". Sometimes the user has to wait quite a long time for the import process to be finished. While waiting, he/she doesn't know if the function is working or not until he receives a report email that tells him/her the import process has finished.

Peek 2020-09-11 17-06

Expected Result

The "Request submitted" message should be changed to something to inform the user that he/she will receive a report email when the calendar finishes being imported.

Splashscreen support

From the web pageinception, to the start of JavaScript & AngularJS run, the user is presented with a blank, empty page.
Add a splashscreen to provide the user with a tips that something is happening.

Import menu entry does not work

The calendar (+) button -> Import does not work.

Error in the console:

angular-strap.js:2501 Error: [$injector:unpr] Unknown provider: davImportServiceProvider <- davImportService <- CalCalendarImportController
http://errors.angularjs.org/1.3.20/$injector/unpr?p0=davImportServiceProvider%20%3C-%20davImportService%20%3C-%20CalCalendarImportController

Fix template import

As explained here, fix the PUG template imports.

In the task moving from "templateUrl: string" to "template: require('pugfile')"

The templateUrl has not been changed for path /calendar/app/search/event/event-search-item.html. This would break application.

On Chrome Ubuntu, recurrence icon is not arranged with event name

Precondition

Recurrence event on Chrome Ubuntu, Zooms 100%

Actual Result

When browser zooms 100%, the recurrence icon is not in the same line with the event name.

image

Expected result

Recurrence icon or other icons should be arranged with the event name

Environment

Chrome on Ubuntu

Mobile/Tablet > Modules menu is displaying incorrect

Actual Result

  1. On mobile, both ios and android, "Video conference" label sticks to the menu border

mobile

  1. On Tablet - ipad, the menu has been cut by the sidebar

tablet

Expected result

The modules menu should display normally

Environment

  • Android/Ios Mobile
  • Tablet - iPad Air 2

Declined event displays in planing section

Actual Result

The User declined the event but it still appears in his planing section

image

Expected result

The declined event shouldn't be in planing section

Environment

Browser on Ubuntu

The "Manage calendars" page is broken

Manage_Calendars_Bug

Note: If you cannot reproduce the bug, add the label "irreproducible" to this issue.

This issue contains 3 bugs:

  • touchscreenDetectorService is not loaded
  • deepStateRedirect doesn't run (because ct.ui.router.extras.dsr is not loaded)
  • {{ 'Hello' | tranlsate }} does not work in mixin

The mixin translate bug is because of 2 files:

  • src/linagora.esn.calendar/app/settings/settings.pug
  • src/linagora.esn.calendar/app/settings/display/settings-display.pug

Attendee calendar does not update when event is created using DAV

Reproduction steps

User1 & User2 are two OpenPaaS calendar user.

  • user2 opens its calendar grid on a browser
  • user1 synchronizes its calendar using DavX5 on Android
  • user1 creates an event event1, invites user2, validates

Current behaviour

event1 is not displayed on user2 calendar. If user2 refreshes, event1 is displayed

Expected behaviour

event1 is displayed on user2 calendar.

Error log appears when save the event respond

Actual Result

On the desktop event, respond then click "Save" button, it's able to save but generates error logs:

save_the response

Expected result

Please investigate the error log. It shouldn't appear

Environment

Desktop Ubuntu

Single event

search back button is broken

Reproduction steps

  • go on calendar
  • search for something
  • click on the "back" icon

current behaviour

The back button does not work

intended behaviour

The back button sends me back to the calendar view

Warning: also test when there is no history. Example: point your browser to http://localhost:9900/#/search/?q=test&p=op.events , then hit the back button: it should go to the default calendar grid view

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.