Giter Club home page Giter Club logo

enhancedlightninggrid's Introduction

EnhancedLightningGrid

Component that allows you to sort and filter data within the Lightning Experience. Use as a replacement for a Related List, or create a new grid that shows results from a custom query.

Installation

After installing the package, you need to grant permission sets to users:

  1. View Sortable Data Grids
  2. Edit Sortable Data Grids
  3. Sortable Data Grids - Manage Sharing

Documentation

AppExchange Listing
User Guide
Custom data providers

enhancedlightninggrid's People

Contributors

flindsay avatar flindsaysfdc avatar jgr-salesforce avatar jgrf avatar mcarrilloatsalesforcedotcom avatar michelcarrillo avatar patelnilay avatar scottlandes1217 avatar svc-scm avatar tepp0f3l 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

enhancedlightninggrid's Issues

Error thrown when attempting to use the grid component in custom lightning component.

I'm trying to utilize the grid component in a custom lightning component I am building but getting the following error:

screen shot 2018-10-15 at 5 49 10 pm

Upon further investigation, I found that the error is coming from the file "components/sortablegrid/sdgBase.js" when the code is trying to initialize sdgBase component:

var def = $A.componentService.getDef("markup://sortablegrid:sdgBase");

I think this is due to the fact that sdgBase is not global and lockerservice is blocking it.

Sample Code:
<sortablegrid:sdg DefaultPageSize="10"
ShowSDGError="true"
ShowFilters="true"
isPaging="true"
HideOnError="false"
MultiSelectMode="true"
Title="Approved Recent Purchase Orders"
SVGName="standard:account"
SDGConfiguration="Apex:ApprovedPurchaseOrdersGridCon"
UseCache="false"
/>

Test

Hello Team,

We are using this code to do some customizations.

I am trying to repackage this code but run into the following test errors:
Is this under development? And is the code maintained to the managed package?

Please advise.

Kind regards,
Mario

Apex Test Failures    
     
Method Name    
Message    
Stack Trace    
sdgDesignerTest.GetNewFieldOrderTest System.AssertException: Assertion Failed: Expecting new field order: Expected: 3, Actual: 1 Class.sdgDesignerTest.GetNewFieldOrderTest: line 33, column 1
sdgQueryEngineTest.TestAllRows System.AssertException: Assertion Failed: Expected rowcount=2 from load: Expected: 2, Actual: null Class.sdgQueryEngineTest.TestAllRows: line 621, column 1
sdgQueryEngineTest.TestBooleanFilter System.AssertException: Assertion Failed: TestBooleanFilter: Expected rowcount=2 from load: Expected: 2, Actual: null Class.sdgQueryEngineTest.TestBooleanFilter: line 35, column 1
sdgQueryEngineTest.TestDateFilter System.AssertException: Assertion Failed: Expected rowcount=2 from load: Expected: 2, Actual: null Class.sdgQueryEngineTest.TestDateFilter: line 162, column 1
sdgQueryEngineTest.TestDateTimeFilter System.AssertException: Assertion Failed: Expected rowcount=2 from load: Expected: 2, Actual: null Class.sdgQueryEngineTest.TestDateTimeFilter: line 284, column 1
sdgQueryEngineTest.TestDefaultFilter System.AssertException: Assertion Failed: expected two rows in results: Expected: 2, Actual: null Class.sdgQueryEngineTest.TestDefaultFilter: line 377, column 1
sdgQueryEngineTest.TestFilterCacheing System.AssertException: Assertion Failed: Expected rowcount=2 from load: Expected: 2, Actual: null Class.sdgQueryEngineTest.TestFilterCacheing: line 415, column 1
sdgQueryEngineTest.TestNumberFilter System.AssertException: Assertion Failed: Expected rowcount=2 from load: Expected: 2, Actual: null Class.sdgQueryEngineTest.TestNumberFilter: line 667, column 1
sdgQueryEngineTest.TestPicklistFilter System.AssertException: Assertion Failed: TestPicklistFilter: Expected rowcount=2 from load: Expected: 2, Actual: null Class.sdgQueryEngineTest.TestPicklistFilter: line 104, column 1
sdgQueryEngineTest.TestStringFilter System.AssertException: Assertion Failed: Load with no filter: Expected: 2, Actual: null Class.sdgQueryEngineTest.TestStringFilter: line 470, column 1
sdgSecurityTest.CanQuery System.AssertException: Assertion Failed: Admin should be able to query sdg__c: Expected: true, Actual: false Class.sdgSecurityTest.CanQuery: line 27, column 1

Numbers should be right-aligned

The base sdgDatagridCell.cmp has the layout for the individual cells:

<td data-label="{#v.renderfield.FieldLabel}" class="pullleft pullup">
    <div class="slds-truncate">{!v.body}</div>
</td>

There is no included definition for the pullleft class, but text defaults to left-aligned, so that's the default for all fields, with no way to customize or change.

This can be fixed quickly with a quick customization - add an attribute for cellStyleClass to the .cmp file and set it in the contoller based on field type.

New sdgDatagridCell.cmp:

aura:component
<aura:handler name="init" value="{!this}" action="{!c.onInit}" />
<aura:attribute name="renderfield" type="object" access="global" />
<aura:attribute name="sdgAgo" type="String" access="public" default="{!$Label.c.sdgAgo}" />
<aura:attribute name="sdgIn" type="String" access="public" default="{!$Label.c.sdgIn}" />
<aura:attribute name="cellStyleClass" type="String" access="public" default="slds-text-align_left pullup" />

<td data-label="{#v.renderfield.FieldLabel}" class="{!v.cellStyleClass}">
    <div class="slds-truncate">{!v.body}</div>
</td>

</aura:component>

And for each type that needs to be aligned right, in the controller (I would use Percent, Integer, Currency, and Double):

case "INTEGER":
          helper.renderNumber(component, datachunk, 0);
          cmp.set("v.cellStyleClass", "slds-text-align_right pullup");
          break;

Doubles not showing zero values

If I have the grid populated with any double values, columns with a zero are simply not displayed. I think this is the culprit:

`var datachunk = field.datachunk;
var datachunkid = field.datachunkid;

    var fieldurl = field.url;
    var objid = field.ObjId;

    if (!datachunk) datachunk = "";`

That last line should instead be:

if (datachunk == null) datachunk = "";

Code is in sdgDatagridCellController.js around line 22

8/9/20 Critical Update Makes Managed Package Unusable

We have activated the critical update "Restrict Access to @AuraEnabled Apex Methods for Authenticated Users Based on User Profile" in our org, and it breaks the sortable data grid managed package. This update will automatically go into affect across all orgs on 8/9/20.

Basically this update means that we have to authorize access on a per profile basis to any classes containing @AuraEnabled methods for Lightning and LWC components that we want our users to use. By activating this update, our users lost the ability to use the sortable data grid because they did not have access to the class sdgController.

Because of a separate Salesforce policy, I am unable to change the security settings for sdgController. System Admins can only change the security settings for apex classes in managed packages if the classes are declared global. Looking at your source code, sdgController is declared public, meaning that I cannot assign this class to our Profiles and rendering it unusable.

Can you update sdgController in the managed package to declare it global?

Zip codes are missing in Address fields

Grids with an address column (e.g. Mailing Address on Contacts) have all underlying address fields formatted in a nice comma-separated fashion, except for the Zip/Postal Code, which is always missing even if the data is there.

Is there a typo in the line referenced below? Shouldn't "statecode" be "postalcode" instead?

outputarray = this.addnonblank(outputarray, datachunk.statecode);

Spring '20

We get the following error message :

Failed to initialize a component [Cannot read property 'getDescriptor' of undefined]

in the component :

markup://sortablegrid:sdgBase

Stack trace :

/components/sortablegrid/sdgBase.js:3:99

Default Filters Open

Hi There,

Thanks for a great tool! Is there any way to ask the component to default to having filters open?

Thanks,
Ezra

Cant configure for WorkOrders

Does anyone know why WorkOrders dont work with this component?

when trying to add it directly on the lightning page, I keep getting the error:
6 17:34:18:704 Error: sdgDataProviderRelationship:GetSDGFieldsFromFieldSet Could not access fields listed in the field set - are restrictions on the package enabled?

Even when trying to create the sortable grid via the app it allows me to create the grid but returns this error when I try to add the fields:
Unable to resolve API Name: WorkType__c from WorkOrder

image

anyone have an idea how to resolve?
p.s. am a system admin & the one who installed the package so permissions should all be there (alsoadded the permission set to my user just incase)

Custom event parameters not resolving

When creating an action on a custom list, we are allowed to provide some custom event parameters, which are supposed to be notated using a "#fieldname#' notation. This is detailed on page 18 of the user guide, which also indicates the field needs to be setup for the list.

However, this does not appear to be working. In my use case, I have created a custom 'Contacts' list, filtered to only show Contacts of a certain record type. I am trying to replicate the default behavior for address in Salesforce, which is that the mailing address for the Contact defaults to the shipping address of the related Account.

What I have for a payload is:

{ "entityApiName" : "Contact", "defaultFieldValues" : {"AccountId" : "#parentrecordId#", "MailingAddress":"#Account.ShippingAddress#","MailingCity":"#Account.ShippingCity#","MailingState":"#Account.ShippingState#","MailingCountry":"#Account.ShippingCountry#" } }

What I get as an output is shown in the screenshot linked below, which shows the values merged as the actual hashtagged values above, not the referenced fields. Can someone help me to understand what is going on?
accountaddresserrors

Adding $User data to a Query not working

Hope this is the right place to post this and apologies if its not. The challenge I am having revolves around querying data based on a current logged in User.

I essentially need data from the login in users record in order to execute the return of the correct records within the data grid.

I have tried $User.xyz , User.xyz , $UserInfo.getxyz , and others but getting "Unable to Query..." in the debug logs.

c.GetSDGInitialLoad response: {"SDGObject":null,"Results":null,"isError":true,"ErrorMessage":"Unable to query: SELECT Name,Billing_Customer__r.Name FROM Service__c WHERE Billing_Customer__c = $User.PartnerUserAccountId__c ORDER BY Id ASC NULLS FIRST limit 100 offset 0"}

Error opening record from grid containing multiple record types

We have a custom object with multiple record types. In the list grid list view, all the different records of different record types are successfully listed. The Edit action and the Create actions work fine.
But, when we click on a record in the list to open the record for view, we get this error:
INVALID_TYPE: sObject type 'RecordType' is not supported in describeCompactLayouts

We do not see this error on our grids that display lists of just a single record type.

Anyone have any thoughts? You folks on here have helped me in the past - thank you!
Nancy

Run Flow as Action?

Hi there,

Back with another question - thanks in advance for your help. Is there a way I can run a flow from a row button? I want to run a simple autolaunched flow that takes the row's object's record id as an input. Other than that, it'll just do its thing.

Thanks!

Ezra

Wrap & Clip text options missing

Hi, it seems is not possible to wrap (or clip) the text of each column, as lighting tables do (see attached image)

It would be great if this is an option for the end user (drop menu in each column, as lighting standard) and also an option for each field configuration "predefined" mode.

Please, note that for the "clip" text option, a "tooltip" of uncutted text would be great. This is something that salesforce does not have at all in any table, but maybe is not so complicate in your component inside the sdgDatagridCell.cmp sub-component.

Best regards and thank you for your great effort!!!

image

Grid title-link not working

Hi all!

When clicking on the tile of the enhanced Lightning Grid it would open a new page with a listing of all records of the object. However that broke recently. It now would only open an empty page and not render anything.

image

We noticed the following:

  • This only happens for NEW components added to a layout, the 'old' ones continue to work just fine
  • There are differences in the metadata:
    • The working one use data-aura-class=sortablegridSdgBase
    • The broken ones use data-aura-class=cSdgBaseLocal

Our workaround is the following:
We edit the metadata of the flexipage and for each gridcomponents on the page we change the following:

  • Change the component name from
    sdgLocal to
    sortablegrid:sdg
  • Delete the section

    UseBackground
    false

After that it starts working and the links work again as before. However, this is only a workaround... Please address as soon as possible.

create record actions are not working correctly after Salesforce's Winter'21 release

Hi Team,

We are using this grid application for our project. Recently we observed that post Winter'21 release the grid is malfunctioning.
We have create new record action created on this grid related list, in this actions we have defaulting some of the values of the new record including record type, which was working fine but all of the sudden post the new release the actions have stopped picking the record type that is defined in the grid's create record action and are picking master record type as a default one. This is happening in all the the sandboxes that have got upgraded to the winter'21 release.

Would like to know in case we are aware about this issue and if we have any solution or workaround for this.

Your help would be really appreciated.

Regards,
Ashish Sutar

Enhancement: Increase Default Sort Length

Is it possible to increase the number of characters in the "Default Sort Length" on the SDG__c. Default_Sort__c object from 50 to 255. Running into issues attempting to apply a sort with longer object/field names.

Actions Issue in Spring '20

Getting an error when trying to call any of the action (List/Row/etc).

Invalid event name - cannot identify event

It seems it's unable to resolve custom events ("e.c:customEvent"), as calling the built-in events (such as "e.force:editRecord") works perfectly fine.

These work properly in Winter'20

Empty Filter Spot for Hidden Fields

Loooooove this app - so amazing. As a newbie developer (background as an admin) this was so easy to get set-up on.

Currently when you set it so a field is not a filter option, it leaves a blank space - this can be a weird user experience. Would be awesome that there were not any blank filter spots if a field/column is set to not be a filter option.

image

Email field formatting Issue

When using email fields (in this case the standard contact email) we are seeing inconsistent reading of the field type -- sometimes it's formatted correctly as EMAIL other times not.

We cannot identify what the email formatting issue is that is causing this issue ( as shown below).
Email for Jake Snake is link to 'jake.snake' then 'test.com'. There is no 'mailto:' link.

screen shot 2018-05-01 at 2 34 38 pm

AssetRelationship is not supported

AssetRelationship is not supported in the latest version (Spring 2019 / 3.37.0). This is probably because the API Version is too low.

Error received when adding New Sortable Data Grid Field for AssetRelationship: Unable to resolve API Name: Asset.Name from AssetRelationship

Issue ant Import/Export Grid

Dear,
When we try to import/export grids between environments we are getting following error when we try to click the Export Wizard:

A Component Error has occurred!
Error while creating component for lightning component quick action [possible import expression rejected around line 14 [possible import expression rejected around line 14]]
Component Descriptor: markup://sortablegrid:SDGImportExport

image

Enhancement: Support quickActionAPI

In researching use of this managed package I see that while it is possible to add standard event actions: force:createRecord, force:editRecord, and deleteRecord (with the "Internal" specification), I am unable to invoke Quick Actions (either Global or Object Specific).

This should be possible with the Summer '18 lightning:quickActionsAPI

I maybe able to implement this and submit a pull-request if you think this is feasible.

Thoughts?

Code is stale

Hey Guys,
Great implementation!

I wanted to fork this but noticed that code-base is not up-to-date, I see a new version of this on App Exchange (VersionSpring 2019 / 3.37.0) but the code was last updated in 2018.

Can you please update the code-base to reflect changes from VersionSpring 2019 / 3.37.0 of the AppExchange Component listing?

Thanks,
Ali

Understanding Actions

Hi,

I'm looking for more documentation on creating custom actions in the EnhancedLightningGrid. I'm specifically trying to create a row button on an Order Line Item that lets a user edit just the quantity field on that OrderItem.

Thanks,
Ezra

Unable to resolve API Name

I try to configure a grid with a Work Order and a Work Order Line Item.

I can access to all fields in the Field Finder, but I get the following error anytime that I try to create a new sortable data grid field:

Unable to resolve API Name

Can you help me on that?

Unable to resolve API Name When adding a new field to the table via a lookup

When trying to add a field to the table via a lookup field I get an error saying it's unable to resolve the api name.

I'm able to be able to pull fields from a master detail lookup but not from a standard lookup field.

Does anyone know of a way to resolve this without having to have formula fields and/or triggers/flows populating fields the record instead of referencing them via a lookup.

Any help with this would be much appreciated.

Thanks

Summer Release 21 - Component API version is too old on EnhancedLightningGrid

After Summer Release 21 on sandboxes we are experiencing an error message on partial sandbox community page that the Component API version is too old and must be set to API '41' or later. The full copy and prod is working so far, but if the API is outdated it might cause the issues in full copy and prod in future. Any suggestions on how to resolve the issue, as looks like I don't have access to the component to change the API version?

image

Custom Event Field Hep Text

The help text on the Event Field for the Sortable Data Grid Action has the text of "Lightning event to raise: eg c.force:editRecord". The text should say "Lightning event to raise: eg e.force:editRecord".

Screenshot_8_20_19__5_36_PM

Links don't work in communities

There is an issue with the links in Lightning Communities. The link in question is often the "Name" field. For example, when displaying a list of Contacts, the Contact Name column will contain a link to each Contact.

The issue appears to be that the links don't use the "e.force:navigateToSObject" event. They seem to just be url links which don't go to the correct location or even the correct community.

An example link endpoint is "https://mycommunities.force.com/003000000XXXXxxXXX". This not only lacks the community prefix (https://mycommunities.force.com/**partners**/003000000XXXXxxXXX
), but it can not work in Lightning Communities.

capture

Selected Rows After Refresh

It looks like the internal list of selected rows does not get cleared out after a force:refreshView or sortablegrid:evtRefreshSDG event is fired. The UI makes it look like all of the rows have been deselected, but list actions will receive the ids of previously selected rows.

Support for Time data type formatting

Hello all,
Is the library supporting Time formatting in the following: hh:mm (AM/PM). Right now it is showing the time values as follows: HH:mm:ss.SSSsZ.
The provided values under object Custom Renderer do not seem to support rendering under that format.

Looking for Advice: Setting up List Multi-select button

Hi,
I am looking for advice.
I would like to setup List Multi-Select button in order to edit e.g. field Status on multiple records at once. Is this a supported function or do I need to partially develop something special in order to make it work?

Thanks a lot in advance.

Tomas

P.S. I didn't figure out a better way how to contact you so I have submitted a new issue.

test for custom data provider

Hello, we have been using your example class as a framework for our own custom data provider classes.

global with sharing class mydp implements sortablegrid.sdgIDataProvider {

but we are having an issue with getting code coverage. Specifically on the private methods GetFields and GetActions, as well as especially the LoadSDG function, which is non-static. Since the custom class implements the sdgIDataProvider, which is an interface and cannot be instantiated, and since the custom class itself has no constructor, it would stand to reason that only static methods from it could be called. There is no way to instantiate the class, so there is no way to call instance methods. I see you found a creative way around this in your class "sdgDataProviderFactory," but unfortunately that class is not visible to us using the managed package. If you could provide some insight on how to call the LoadSDG function in your own example, it would greatly help us do the same in our own. Thanks.

Unable to pass Payload 'Id' to an Application Event in Updated Sandboxes. [Summer 19]

Before the updation of sandboxes. Everything was working smoothly. All of a sudden. An Error appears to come up.
Invalid event name - cannot identify the event

Note: The Component without a body to listen to this evt is added to page layout.

Things are fine in Production yet.

Using this as payload for button on enhanced grid :

{
"attributes":{
"type":"sortablegrid__SDG_Action__c"
},
"sortablegrid__SDG__c":null,
"Id":null,
"Name":"Put CV Forward",
"sortablegrid__Action_Order__c":3,
"sortablegrid__Action_Type__c":"Row Button",
"sortablegrid__Event__c":"e.c:OpenCvPutForwardUpdater.evt",
"sortablegrid__Event_Payload__c":"{"jobApplicationId" : "#id#"}",
"sortablegrid__Requires_Createable__c":false,
"sortablegrid__Requires_Deletable__c":false,
"sortablegrid__Requires_Editable__c":true,
"sortablegrid__Icon__c":"utility:share"
}
]
}
}

Uncaught afterRender threw an error in 'lightning:select' [Cannot read property 'value' of null]

I am using the component inside my component like this:

<sortablegrid:sdg DefaultPageSize="10" ShowSDGError="false" ShowFilters="true" ShowDebug="false" isPaging="true"
        HideOnError="true" MultiSelectMode="false" Title="Delivery Search" SVGName="standard:email"
        SDGConfiguration="Apex:CustomSearchGrid" UseCache="true" />

When I click on the filter icon, I get this error message:

Uncaught afterRender threw an error in 'lightning:select' [Cannot read property 'value' of null]

Please advice, what should I do to fix this?

Creating New buttons for Custom Actions

How to configured new actions for that component to place it as buttons?
I want to call some VF pages that I have created. And open a component.
Could someone help?

Thanks

Issue for EnhancedLightningGrid after Winter21

If a user with permissions as User (not Admin) for the EnhancedLightningGrid opens a Grid detail in Salesforce cannot open it.
Setting the Debug Logs, system throws following error:

Debug Log
5 10:1:49:648 Error invoking c.GetNamespace: You do not have access to the Apex class named 'sdgController'.
4 10:1:49:639 Error invoking c.GetSDGInitialLoad: You do not have access to the Apex class named 'sdgController'.

The #AnyApiName# does not output element values even if within the row

The #AnyApiName# does not output the element value within the row.
Using anything just outputs the Text including the hashtags..

i.e. {"entityApiName":"Opportunity", "defaultFieldValues":{"AccountID" : "#Contact__r.Account.id#"}} will output literal "#Contact__r.Account.id#" instead of 0011500001bEDtXAAW

likewise, i.e. {"entityApiName":"MyOpportunityTeam__c", "defaultFieldValues":{"Phone" : "#Contact__r.Phone#"}} will output literal "#Contact__r.Phone#" instead of 978-123-4567

The #parentRecordId# works and #id# works as expected.

{!recordId} or similar?

Is it possible to reference fields on the record page in a query?

For example, return results that show the same Industry as this record.

I imagine the Sortable Data Grid's Filter field would look like
Industry = "{!recordId.Industry}"

New Tab Title stays as "Loading" when opened

I know this is a minor issue, but I have noticed this issue in two different orgs:

Using the Service Console, when you click on the title of the Related List component, the New Tab with the full grid is opened but even when the page ends the loading, the title of the Tab stays as "Loading", and it could be confusing for some users.

You can see it in the example:
image

Pagination numbers invisible, Update Managed package

First, when i use this, the page numbers when using the pagination are not there. It seems to have the correct number of blank spots in the list but no numbers appear. Also, after this fix can the managed package on the app exchange be updated with the fixes?

2018-07-02_13-26-21

Appexchange package is outdated

Hi, it seems appexhange package last update was on 1/28/2018, which means last fixes are missing there.

Would you mind pushing it?

Thanks!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.