Coder Social home page Coder Social logo

pnp / pnp Goto Github PK

View Code? Open in Web Editor NEW
1.9K 556.0 3.3K 212.66 MB

SharePoint / Office 365 Developer Patterns and Practices - Archived older solutions. Please see https://aka.ms/m365pnp for updated guidance

Home Page: https://aka.ms/m365pnp

License: Other

C# 62.35% JavaScript 13.58% CSS 9.91% HTML 6.09% PowerShell 0.66% TypeScript 2.72% Gherkin 0.11% TSQL 0.01% ASP.NET 3.39% SCSS 1.09% Less 0.08%
pnp sharepoint office365 javascript c-sharp

pnp's Introduction

page_type products languages extensions
sample
office-sp
csharp
contentType createdDate
samples
7/26/2014 7:08:15 PM

Patterns and Practices

ARCHIVED - Notice that many of the samples in this repository are for legacy add-in model. You should be using SharePoint Framework for UX layer extensibility for SharePoint and Microsoft Teams. You can find SPFx web part and SPFx extension samples from different repository. You can use Azure AD and Microsoft Teams Solution model as replacement for the provider hosted add-in model. Please see https://aka.ms/m365pnp for the up to date guidance and samples.

This is the main repository for the community driven Microsoft 365 Patterns and Practices (PnP) initiative. If you are looking for latest news around PnP or related topics, please have a look on our one pager at http://aka.ms/m365pnp.

PnP initiative has numerous GitHub repositories, so that you can more easily find what's relevant for you depending on your interest. Easiest way to follow up on latest changes is our landing page at http://aka.ms/m365pnp.

"Sharing is caring"

This project has adopted the Microsoft Open Source Code of Conduct. For more information see the Code of Conduct FAQ or contact [email protected] with any additional questions or comments.

pnp's People

Contributors

aaclage avatar akhileshnirapure avatar andrewconnell avatar anil-lakhagoudar avatar artokai avatar braegelno5 avatar brianmichely avatar danbudimir avatar erwinvanhunen avatar franckyc avatar frankmarasco avatar henrikgustafsson avatar jansenbe avatar martinhatch avatar nanddeepn avatar nokafor avatar olemp avatar paolopia avatar patrick-rodgers avatar pbjorklund avatar pschaeflein avatar roharp avatar sgryphon avatar sharepointradi avatar simonjaeger avatar spfxadmin avatar sumanchakrabarti avatar vesajuvonen avatar vman avatar zimmergren avatar

Stargazers

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

Watchers

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

pnp's Issues

Reference Sample for Mail App interacting with SharePoint

There were a ton of questions at the #hackathon around how to build mail apps that interact with external services, that interact with SharePoint, etc.

While I was able to explain the approach of proxy the calls through the app web, but we need a great end to end example showing how this work.

Steve to work with Andrew Salamatov to get a great sample for this.

SecurityExtensions.AddReaderAccess

from Yammer thread.
Trying to use this method but someone reports that when tried using BuiltIn.EveryoneButExternalUsers and got the following error: The specified user c:0-.f|rolemanager|spo-grid-all-users/72f988bf-86f1-41af-91ab-2d7cd011db47 could not be found.

dev branch is behind master

If we want to start to use the dev branch, shouldn't the dev branch be only ahead of master and not also behind as it is right now?

Someone can merge master into dev? So at least it's ahead of master, and then from that moment pull requests should only be accepted on dev?

I wanted to fix some code in the core library, but noticed that the helper methods I was planning to use were not available in the dev branch, but they were on the master branch. I fixed them on the master branch and created a pull request on that one, but officially we should use the dev branch right now, right? If it's behind master that would be an issue...

Improvement to DeployPageLayout and DeployMasterPage

In the real scenarios, we prefer to deploy our master pages and page layouts in a separate folder in master page gallery.
For e.g.: _catalogs/masterpage/contoso/

In the below methods in ($\OfficeDevPnP.Core\AppModelExtensions\BrandingExtensions.cs)

  1. DeployPageLayout
  2. DeployMasterPage

We could add parameter folderPath and deploy master pages and page layouts under it.
Also, to DeployPageLayout we could add parameter List webPartEntities to have default webparts on page layout.

deploypagelayout

Dev branch

As Vesa mentioned on Yammer, we should build upon the dev branch, or at least issue pull requests with the dev branch. Will there be a cutoff date for that? Like after the first "release"? of the library?

ALM documentation notes for the upcoming guidance docs

Just typical questions, which we need to address in the PnP guidance. We do have answer for most of these, but just a reminder in here for tracking purposes.

• Do we need to have a tenant for dev/test and another one for prod? Multiple site collections?
• Do we need to mock SharePoint to address unit testing or we should deploy to a “build” environment?
• Can we do Performance testing on SharePoint Online?
• How do we manage redeployment of apps in SharePoint online?
• How can we automate the site collection creation and initialization?

Please add other ALM related topics which should be covered.

Interesting CSOM bug

By pure chance me and @HappySolutions ran into a bug in CSOM today. Or rather, not necessarily a bug if you follow the specs, but it should not be allowed what we did.

  1. We used the Add-SPOField cmdlet in the PowerShell.Commands solution:
    Add-SPOField -DisplayName "TestField" -Group "Test Group" -Type Text
  2. The code was supposed to provide and static name value based upon the internal name parameter, but that one was not specified. The field XML that was created only contained a DisplayName value and null values for Name and StaticName.
  3. We received an error while creating the field, which is expected.
  4. However, the field -was- created, and is listed in the Site Columns page in Site Settings.
  5. Editing the field fails from the Web UI with an error page.
  6. Retrieving the (all sitecolumn fields) fields through CSOM fails with an index out of bounds exception.
  7. Retrieving the specific field by its title fails.

E.g. we ended up in a situation where we could do nothing with the field anymore. We deleted the site collection and recreated it. We fixed the cmdlet now to make sure that the internalname parameter is required (See PR #131) but the fact that it's even possible to end up in this state my merely submitting wrong XML is not good...

The cmdlet uses the List.CreateField(string) and Web.CreateField(string) extensions in Core, which in turn use AddFieldAsXml on the FieldCollection object.

App script part and dynamic scripts

Enhanced version of the App script part approach should show how to dynamically load versioned scripts for the instance without a need to update actual instances in the portal.

Use of Web.MySiteSearch() ?

The Web.MySiteSearch() extension method doesn't seem to do anything useful? Or am I missing something?

According to the summary it should return a list of my sites?

/// <summary>
/// Returns all my site site collections
/// </summary>
/// <param name="web">Site to be processed - can be root web or sub site</param>
/// <returns>All my site site collections</returns>
public static List<SiteEntity> MySiteSearch(this Web web)
    {
        string keywordQuery = String.Format("contentclass:\"STS_Site\" AND site:{0}", web.Context.Url);
        return web.SiteSearch(keywordQuery);
    }

For that to happen you'll need at least to tell the server that you're actually looking for personal sites? Alike:

contentclass:STS_Site AND webtemplate:SPSPERS

The method confuses me...

Possible issue with remove event receiver sample

Reported through email.
Sample: Core.EventReceiver

the code does deploy to Office365 … but it never seems to run the http://localhost:44375. Also, in Office365 is says: “Sorry, something went wrong with adding the app.”.

Thus, I feel the sample always is failing due to me not doing something.

Remove MD image references to images stored inside the repo

Apparently some images where added to MD by first uploading them in the repo...Once the MD pages are processed by github the images are copied to githubusercontent.com, but we'll need to cleanup the images in the repo.

Projects with this problem are:
Provisioning.OneDrive/images/
Branding.AlternateCSSAndSiteLogo/images/
Provisioning.SubSiteCreationApp/images/
Branding.Themes/images

Issues with People Picker

I am using the AMS sample in my project. I am building the aspx page and using the people picker control. I am getting frequent error (Create IFrame timeout ping timeout or exceeds the threshold). Can someone help me.

Code related discussion of PnP going on on Yammer

It is my humble belief that all actual code and project related discussions should be hosted on github.

I have no issue with having Yammer being the place for getting help with things that are not bugs, announcing new publicly available builds or posting interesting related information. I.e, make Yammer the "consumer" channel.

I think it would be nice to use github as the "developer" channel. For instance things like the below should be filed as an (or two) issues here on github:

"PnP contain samples that upload to and reference files in the 15 path. But I also see references to 16 and I see people with broken SPO customizations. In order to build a future proof app any paths used must be stable. Two questions:

How future proof is the 15 folder?

What is the best practice in choosing where to upload resource files such as css and images that should be globally accessed by sites and subsites?"

To sum up: It would be nice to have consumer (yammer) and developer (github) channels in the project.

What do you other guys and girls think?

Core - Setting master pages methods not good for publishing sites

All master page setters in the core component are setting the master page from particular Web object. This is not however what should be done with the publishing sites where you should refer master pages stored in the root site of the site collection.

Overloaded methods or alternative solution should be provided for publishing sites.

Web.AddReaderAccess fails

Web.AddReaderAccess fails on sites with a different locale than English. It's hard coded to add "Everyone except external users" which doesn't work on sites with a different locale.

Start with creation of NuGet packages

During the community call we've discussed about creating NuGet packages for PnP, even for versions before 1.0. This issue is there to remind us :-)

OfficeDevPnP.Core SecurityExtensions GetGroupID problem

There are two methods in SecurityExtensions class in the OfficeDevPnP.Core Project:

  • public static int GetGroupID(this Web web, string groupName)
  • public static int GetGroupID(this Web web, Uri siteUrl, string groupName)

There is a problem with the first method. It is raising an exception always since first method is calling the second method, and the siteUrl parameter in this one is required.

Request time out exception for OneDriveCustomizer

When applying a theme in OneDriveCustomizer I got time out exception.

Uploading the theme works rootWeb.DeployThemeToWeb(...)
but rootWeb.SetThemeToWeb("SPC") causes the time out.

The theme gets applied but the web property value is never updated (because of the time out) and therefore OneDriveCustomizer always runs and tries deploying the theme and set the theme. Anyone else experiencing the same problem?

I'm running this code in a Azure web role in a Cloud Service.

Convert README.txt files -> README.md files for each sample

Right now each readme file under ./Samples/* is a text file. Converting them to markdown means they will render right in the browser when users navigate to each folder in the browser. Makes for greater readability.

(Note that while the files render at the moment they look a little weird.)

PeoplePicker - Hard for users to understand where to click in the textbox

Several users have now mentioned that "they can't pick people". The issue is that they click in a part of the textbox that is not part of the input that the control adds.

I am thinking about patching this with a different background color for the "active area" for now to indicate that something is happening there.

But it would be nicer to resolve this "for real".

TaxonomyPicker termstore load often returns with 'Access denied'

The execution of the load below often fails with network error 0x80070005 'Access denied' for some unknown reason. (Even with the tenant-8a49g23894230.sharepoint.com, tenant.sharepoint.com, providerlocation.azurewebsites.net in the trusted locations in IE)

this.RawTerms = this.RawTermSet.getAllTerms();
spContext.load(this.RawTermSet);
spContext.load(this.RawTerms);
spContext.executeQueryAsync(Function.createDelegate(this, this.termsLoadedSuccess), Function.createDelegate(this, this.termsLoadedFailed));

Retrying after a while seems to fix it, so right now I'm using the below snippet as a workaround (with a global taxReloadCounter)

 termsLoadedFailed: function (event, args) {
        if (taxReloadCounter < 40) {
            var that = this;
            taxReloadCounter++;
            setTimeout(function(){
                console.log("Trying to load taxpicker again. Attempt: " + taxReloadCounter);
                that.initialize();
            }, 500);
        }
        else {
            alert(TaxonomyPickerConsts.TERMSET_LOAD_FAILED);
        }
},

Question is, why is this only happening sporadically? For some users it's almost every time, for some other it almost never happens.

Testing security not possible with a dev tenant

An issue that I just ran into is that with a MSDN Developer Tenant it's not possible to add multiple users, which is something we effectively need to test the security extensions. The issue has been raised on uservoice, but only has like 9 votes, which surprises me a bit. If the MSDN dev tenant is there for us as developers to create solutions, then we should also be able to test those solutions I think?

See:
https://officespdev.uservoice.com/forums/224641-general/suggestions/6069044-provide-at-least-two-licenses-in-o365-developer-pa

Securing provider hosted app

Future enhancement to include. Sample and documentation on how to secure provider hosted app in Azure with http module (oAuth) and/or with membership provider. Pretty classic request with the provider hosted apps, so let's get this one documented as reference solution.

Issue in Peoplepicker

When i run PnP sample,i get error "An error occurred while processing your request".I do everything changes like web.config & client id in aapmanifest.xml,but i am unable to run.
The code which written in people picker,implement my project,it will give error which is in attachement.
the error is to fix it.
Please help me i am very stuck from this problem .I face this problem almost one month but nobody give the solution.
Thanks in adavance.

License.md is not correct

An update today replaced a part of the appendix in the license.md file to include:

Copyright 2014 Microsoft Corporation

This update is incorrect I think, as the appendix describes how to apply the license to your own work. I quote from the previous version:

To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.

Copyright {yyyy} {name of copyright owner}

I read that as an explanation on how to apply the license and your own copyright. This means one removes the appendix and add at the end of the file the statement

Copyright 2014 Microsoft Corporation

Right now the file is not correct anymore as it refers in the appendix to a section that doesn't exist (there are no fields enclosed in brackets...)

BrandingRefresh method invalid

Hi,

The method IsThisASubSite in the Branding.Refresh project returns false when I put a subsite under the root site collection of my tenant.

Example:
IsThisASubSite("https://mytenant.sharepoint.com/hr") returns false.

Besides this, this result are different with/without a trailing slash. Ofcourse this could easily be fixed with siteUrl.TrimEnd('/');

Regards,
Melvin

Issue createing Managed Metadata Site Column

Hello,

I am trying to create a Managed metadata site column with below XML structure using the API - web.CreateFieldsFromXML() from OfficeDevPnP.core
To be more specific method "public static void CreateFieldsFromXML(this Web web, XmlDocument xmlDoc)" from FieldAndContentTypeExtensions.cs

The method fails to create managed metadata site column.
The cause of it is, we are adding Xml namespace to all the xml fields from method CreateFieldsFromXML, which is good for traversing through the xml nodes.
Probably, we have to remove the namespace before calling the web.CreateField(fieldXml);

Simply like:
string fieldXml = field.OuterXml.Replace("xmlns="http://schemas.microsoft.com/sharepoint/\"", string.Empty);
web.CreateField(fieldXml);

Testing of the Core library

Before I submitted my powershell cmdlet library to this project, I had a unittest project in my solution that tested the core library methods I used in my cmdlets.

Now that I've refactored away the powershell core library methods to use the OfficeDevPnP.Core library, the question pops up, how do we plan to handle testing for the OfficeDevPnP.Core library? I really think we need to think about that.

The complexity with testing is that one needs a SharePoint Server/O365 Tenant to test against... I got pretty fed up with writing the tests for my own core library I have to admit, as for instance take this example:

How to test AddField()

  1. One needs a Site Collection
  2. One needs a list
  3. One tests adding the field to the list

For step 1 I had a helper method in my project that returned a context to a predefined site collection in my tenant that was only there for unit tests. That was pretty easy, but it was sort of 'hard coded' to my tenant. But that can be fixed through variables or something

For step 2 I could either use a core library method to create a list, and then add the field to it, but it felt more 'correct' to actually create the list in plain-old CSOM and then use the core library method to add the field to it. That way I didn't use 2 'testable' methods in one test.
After the tests I removed the list again.

Using this setup it made the tests slow. But okay, so be it. It also meant -lots- of work to write the tests.

Any one ideas out there how we should/could handle this in a smart/acceptable way?

Taxonomy picker on sharepoint hosted app

I tried to make the taxonomy picker with a sharepoint hosted app. I based my code on the Core.TaxonomyPicker example, I used jquery 2.1.1, and modified the references to js files like this:

<title>Learning bootstrap</title>
<link href="../Content/bootstrap.min.css" rel="stylesheet" /> 
<link href="../Content/bootstrap-theme.min.css" rel="stylesheet" />
<link rel="Stylesheet" type="text/css" href="../Content/taxonomypickercontrol.css" />
<script src="../Scripts/jquery-2.1.1.min.js"></script>
<script type="text/javascript" src="/_layouts/15/sp.runtime.js"></script>
<script type="text/javascript" src="/_layouts/15/sp.js"></script>

<script src="../Scripts/app.js" type="text/javascript"></script>
<script src="../Scripts/taxonomypickercontrol.js" type="text/javascript"></script>

on the body I have this:

     <div class="ms-core-form-line" style="margin-bottom: 0px;">
                           <input type="hidden" id="taxPickerContinent" />

                        </div>

and on the app.js I have this:
$('#taxPickerContinent').taxpicker({ isMulti: false, allowFillIn: false, useKeywords: false, termSetId: "51f18389-f28a-4961-a903-ee535f7c620d", levelToShowTerms: 1 }, context, initializeCountryTaxPicker);
taxPickerIndex["#taxPickerContinent"] = 0;

The picker works fine, except for 2 things:

  1. When I allow fill in choices and I try to add to the root node, the item disappears, If I try to add to a child term, it works.
  2. When I start typing, nothing is suggested.

I have also asked this here:
http://stackoverflow.com/questions/25949758/cannot-read-property-children-of-null-when-trying-to-add-terms-via-sharepoint-ho

Move Tenant methods to TenantExtensions

Those methods that require a tenant context should be moved to the TenantExtensions class instead, and the 'Tenant' suffix should be removed from the method.

We should make the existing methods call the ones in the TenantExtensions class and mark the old ones as obsolete.

I can do that work, but I just wanted to have it reported.

User permission issue in On-premise

Hello,
I am running below code in on-premise version.
web.AddUserToGroup(web.AssociatedVisitorGroup, "NT Authority\Authenticated Users");

  1. Code runs without error.
  2. I can see "NT Authority\Authenticated Users" added to Visitor group.
    But, site is not accessible to all users. If I manually add "NT Authority\Authenticated Users", it works.

Please suggest, if I am missing something.

Improvement to FieldAndContentTypeExtensions.cs

In the file, $\OfficeDevPnP.Core\AppModelExtensions\FieldAndContentTypeExtensions.cs

It will be helpful to update references of web.ContentTypes to web.AvailableContentTypes (It contains all content types that can be used on the site, rather than just the ones defined on this particular site.)

List of methods:

  1. ContentTypeExistsById
  2. ContentTypeExistsByName
  3. GetContentTypeByName
  4. GetContentTypeById

Exception to this is the "CreateContentType" method.

DeployPageLayout and DeployMasterPage extension seem to have a bug

I think there is a bug in the DeployPageLayout and DeployMasterPage extension. As far as i know, publishing of files is only possible if minor versions are enabled.
Currently it throws an exception if you upload to a library that has only major versions enabled.

capture

You could do something like this:

capture

To use extension methods in tests, or not?

Been thinking a bit.

In the unittests / integration tests we have in the project right now, many of the tests require a certain state to be present for a test to be able to execute. E.g. "AddContentTypeToList" requires a list to be present.

Many of those artifacts that we need to be there can be created through our own extension methods that are now available in the Core library. However, those extension methods require their own tests.

From a 'lets keep things pure' point of view, we should not use existing extension methods in tests to set up the test as they might fail too. But isn't that the whole thing? When we build the test, and use extension methods to set up the test, and things fail, well then we found an issue which should be resolved. So from that perspective maybe it's simply okay to use an extension method to setup the case anyway? It's not a unit test (regardless of the framework we're using) as such anyway.

Another reasoning we could use is: the moment there is a unit test / integration test present for an extension method then we can use it on other tests too.

The end result should be a bug free library, and not an exercise in writing academic code (not saying that academic code is a bad thing though ;-))

What do you think?

Custom Actions removal error in Branding.CustomCSSWeb sample

There is an issue with the foreach loop to remove the custom actions in PnP / Samples / Branding.CustomCSS / Branding.CustomCSSWeb / Pages / Default.aspx.cs , one lines 93 and 131.

This code works, which similar to the code in the Branding.UIElementPersonalizationWeb sample.

                var actions = existingActions.ToArray();
                foreach (var action in actions)
                {
                    if (action.Name.Equals(actionName, StringComparison.InvariantCultureIgnoreCase))
                    {
                        action.DeleteObject();
                        clientContext.ExecuteQuery();
                    }
                }

Changes to PageExtensions AddHtmlToWikiPage broke backwards compability for AddLayoutToWikiPage

Changes introduced to AddHtmlToWikiPage in fb97d2f breaks backwardscompability with AddLayoutToWikiPage

This code works in the previous commit

web.AddLayoutToWikiPage("SitePages", OfficeDevPnP.Core.WikiPageLayout.TwoColumns, "Startsida.aspx");

But now it throws

Message = "serverRelativeUrl\r\nParameter name: Det angivna värdet stöds inte för parametern serverRelativeUrl."

(roughly translated "the value is not supported by parameter serverRelativeUrl")

Cloud Provisioning Solution looses context when hosted inside the new Sites Dialog

I can get the app to work standalone - except the Yammer piece, but when I try as a dialog from the "Sites" url all is not rosy. The dialog and content appear but the OK button does not function, the site urls do not change when you change site templates - I enabled uncommented the LoadModules call from the sites list selected index changed method but that did not help either. It appears that the page is not posting back.

The issue appears to be with SharePointContextProvider.Current.GetSharePointContext(httpContext) coming back null and the SPHasRedirectedToSharePoint query param = 1

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.