cloudscribe / cloudscribe.web.pagination Goto Github PK
View Code? Open in Web Editor NEWASP.NET Core MVC TagHelper for Pagination
License: Apache License 2.0
ASP.NET Core MVC TagHelper for Pagination
License: Apache License 2.0
I used cloudscribe.Web.Pagination in my new project instead of telerik grid as I needed less bulky solution and I do not need filters and other tons of options provided by kendo grid. but what I do need is a proper search option. I see demos and there is some options like filter by category. so
Is it possible to filter result by string containing key words like product name, category name, some other things all together (sort of like autocomplete works)? I mean is it possible without forking project but using current functionality or is it might be possible for you to add suck a feature?
Dima
Unable to resolve service for type 'Microsoft.AspNetCore.Mvc.Infrastructure.IActionContextAccessor' while attempting to activate 'cloudscribe.Web.Pagination.PagerTagHelper'.
Hi.
Thank you for your pager component.
Can you please consider implementing additional parameters for cs-pager tag helper, which can allow to implement bootstrap 4 pager. There are lack of attribute parameter for spans and link inside of page "li" item. So we need something like "cs-pager-link-class".
Thanks in advance.
Best regards Dan.
It would be nice to have these extra features:
Hi,
is there a reason to have a reference from cloudscribe.Web.Pagination to the cloudscribe.Pagination.Models project. As far as I can see in the code and the documentation this reference is not needed.
tnx!
can you target netstandard1.3
dun know but i think 4.6 is the sweet spot atm, also i dun know if azure support 4.6.2.
pulled the repo and converted it and the demo works fine after changing to .netstardard1.3.
installed .netframework 4.6.2 and tried to run teh app it gave reflection expecption and its cause was from this libarary so i pulled the the modified project and refrenced it.
thanks a lot
I previously create #25 to discuss this but it close very long ago.
In MVC , the View know nothing about the Controller
, but the Controller
is the one who know about the Url stuff (querystring, route parameters). Back in asp
or aspx
age, dynamic build the link is very popular, but now with the routing system , it seems harder than the file base , and this library does not preseve the querystring and only preseve current route value (implement by the default UrlHelper
and underling routing system).
I think preserve the querystring is more correct behaviour for a pagination compenent.
for example:
/public/movielist?tag=Marvel
route: [controller=PublicController&action=Movielist]
query: tag, sortby, classify
/vip/movieslist?sort=price&TodayUpdate=True
route:[controller=VipController&action=Movielist]
query: sort, TodayUpdate, PriceLower, PriceUpper
they use the same View with different ViewComponent/PartialView (the filter panel) , then It's hard to tell the PageTagHelper
the right route values, but can be easily do by dynamic build the link .
on the other hand, I just want to go to next page, it'll give me wrong data if the url missing a querystring.
this is my fork of your library , the AddCurrentQueryString
is what I add , but missing handle the ActionDescriptor.RouteValues
( this is the values that the routing system use for handing controller/action selection , that they must not repeat in RouteValueDictionarys
(they will not generate querystring) eg. /home/index?area=top&Action=close
)
I suggest to add the QueryString
and RouteData.RouteValues
process , and a new supress-auto-route
attribute to the PageTagHeper , the default value should be false
since it won't break any link that you current manual specify the action
and controller
latest version
/Paging/IndexAjax demo generates JavaScript error.
"Empty string passed to getElementById()."
in
/lib/jquery-ajax-unobtrusive/jquery.unobtrusive-ajax.js
at line 28.
Seems like it still works fine with it but this error prevent my JavaScript placed later to work
enable disable loading element as it was in jquery-ajax-unobtrusive
Hello,
I've been experimenting with this library for about a week and so far I really love it. It does a lot with minimal set up and is really powerful. I'm getting a lot of great functionality with minimal code on my part.
But, it's been hard setting up the library and using it correctly. It has required a lot of trial and error on my part. Furthermore, there's a lot of features in this package and I'm having a hard time finding examples for some of them in the sample project and documentation. In particular I'm having difficulty with cs-next-page-html and cs-ajax-loading. For cs-next-page-html, I ended up just having razor encode the html into a string and put it into the -text property. Works fine but doesn't seem optimal. I haven't been able to figure out cs-ajax-loading at all.
A sample or two in the sample project for every feature would be very helpful. I'm using version 1.1.4 if that makes a difference. I looked at the 2.0 sample project and could not find any additional help there.
If I missed something, let me know. Thanks for a great library.
Test 1:
var list = _context.Posts.ToPagedList(1, 10);
Test 2:
var list = _context.Posts.ToPagedList(1, 10,
100);
Both tests produces the same two sql queries: one for select and one for count. In second case It does not need to call internally IQueryable Count() because count value passed as param.
So I've installed the library in my application and configured just as directed both in the read me and sample project, I went on bringing in the sample paging controller inside my project with the view to test the library and everything was just responding as expected. Now, I'm pulling data from database, making sure everything is in the same picture like the paging controller and all I can see is my data table no display of any pagination beneath the table and the code is there with every thing well set but still nothing is coming up for pagination. My data is showing with my filter box ontop but pagination isn't responding but it working fine with the sample paging controller I added to the project.
My project is on Dotnet core 1.1
What could be the problem? there's no error per say.
Just found out that the pagination tag helper isn't rendering, the div closing it is empty.
Hi
Cloud please help me in razor page (.net core 3.1) when I want paging link with cs-psgenumber-param="page". It doesn't work, and instead of generate link just put # in anchor.
Add option to turn on [ render if only 1 page ].
It's a good idea to not render if only 1 page, but when you test the page , that don't show anything,it hard to find out that page is paged or not
I think it's a good idea to add a global setting in Startup
class, when the Environment
is Development
turn this on .
It seems the ToPagedList extension method is returning 0 items back from any types of IEnumerable types I try. I've tried an IEnumerable, ICollection, and IQueryable.
The Demo seems to work fine, but not when I implement this in my application.
Hello! I have a problem with my total items. I need to use the query count (no my entire table) since I need to show specific data through a join, When I use TotalItems = query.Count(), it displays pages with same data. my join it works fine I have test it. Any idea? Thank you
I use core 2.2
.NET Core 3.0 support can be added this way (tested and works fine)
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Description>an AspNetCore TagHelper for pagination</Description>
<Copyright>Source Tree Solutions</Copyright>
<VersionPrefix>2.1.11</VersionPrefix>
<AssemblyVersion>2.1.11</AssemblyVersion>
<Authors>Joe Audette</Authors>
<TargetFrameworks>netcoreapp3.0;netstandard2.0</TargetFrameworks>
<PackageTags>cloudscribe;mvc;pagination;navigation;bootstrap</PackageTags>
<PackageReleaseNotes></PackageReleaseNotes>
<PackageIconUrl>https://raw.githubusercontent.com/joeaudette/cloudscribe.Web.Pagination/master/cloudscribe-icon-32.png</PackageIconUrl>
<PackageProjectUrl>https://github.com/joeaudette/cloudscribe.Web.Pagination</PackageProjectUrl>
<PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
<RepositoryUrl>https://github.com/cloudscribe/cloudscribe.Web.Pagination.git</RepositoryUrl>
<RepositoryType>git</RepositoryType>
</PropertyGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.1.3" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="2.1.3" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.TagHelpers" Version="2.1.3" />
<PackageReference Include="System.Linq.Queryable" Version="4.3.0" />
</ItemGroup>
<PropertyGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
<DefineConstants>NETSTANDARD2_0</DefineConstants>
</PropertyGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp3.0' ">
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
<PropertyGroup Condition="'$(TargetFramework)' == 'netcoreapp3.0'">
<DefineConstants>NETCOREAPP3_0</DefineConstants>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\cloudscribe.Pagination.Models\cloudscribe.Pagination.Models.csproj" />
</ItemGroup>
</Project>
Is any way to trigger JavaScript before and after updating grid? I mean to insert panel with animation on top of page while loading data?
Using cloudscribe.Web.Pagination 2.1.7. Setting MVC CompatibilityVersion to Version_2_2 causes a NRE when encountering the tag helper. Reverting to Version_2_1 resolves the issue.
services
.AddMvc(options =>
{
options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
})
.AddRazorPagesOptions(options =>
{
options.Conventions.AuthorizeFolder("/");
})
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
<cs-pager cs-paging-pagesize="@Model.PageSize"
cs-paging-pagenumber="@Model.PageNumber"
cs-paging-totalitems="@Model.TotalItems"
cs-pagenumber-param="page"
asp-controller="Colors"
asp-action="Index"></cs-pager>
System.NullReferenceException: Object reference not set to an instance of an object.
at cloudscribe.Web.Pagination.PagerTagHelper.Process(TagHelperContext context, TagHelperOutput output)
at Microsoft.AspNetCore.Razor.TagHelpers.TagHelper.ProcessAsync(TagHelperContext context, TagHelperOutput output)
at Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperRunner.RunAsync(TagHelperExecutionContext executionContext)
at AspNetCore.Views_Colors_Index.ExecuteAsync() in C:\src\agon\Agon.Admin.Mvc\Views\Colors\Index.cshtml:line 81
at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageCoreAsync(IRazorPage page, ViewContext context)
at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageAsync(IRazorPage page, ViewContext context, Boolean invokeViewStarts)
at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderAsync(ViewContext context)
Hi,
I was trying out my project asp core 1.1 so I'm using 1.1.4 package... I found this bug:
If you put small number of items like this:
private void InitializeProducts()
{
for (var i = 0; i < 7; i++) // <=========== JUST 7 items
{
var product = new Product();
product.Name = "Product " + (i + 1);
var categoryIndex = i % 4;
if (categoryIndex > 2)
{
categoryIndex = categoryIndex - 3;
}
product.Category = allCategories[categoryIndex];
allProducts.Add(product);
}
}
It won't show anything on the page and the list will be empty.
My controller action looks like this:
public IActionResult Index(int? page)
{
var currentPageNum = page.HasValue ? page.Value : 1;
var model = allProducts.ToPagedList(currentPageNum, 10);
return View(model);
}
*P.S: different kind of issue appears if you put 15 items.
Hope there is a fix (something like 1.1.5) for people who still use asp core 1.1.
Hi Joe,
Great product, very useful. I'm using your latest nuget package 2.1.2.
I am finding that the cs-paging-maxpageritems attribute is not working, no matter what value I set it to it is still showing the maximum number of page items (in my case 11). I have opened up your demo project and tried adding the attribute in there which works.
Please help.
Cloudscribe Web Pagination doesn't support netstandard 2.1
. If you reference Cloudscribe Web Pagination 3 in a netstandard 2.1
class library, you get to this error:
Package cloudscribe.Web.Pagination 3.0.0 is not compatible with netstandard2.1 (.NETStandard,Version=v2.1). Package cloudscribe.Web.Pagination 3.0.0 supports: netcoreapp3.0 (.NETCoreApp,Version=v3.0)
I have a few questions about the model library
class
? it seem no need here, since data is a List<T>
whitch support struct
List<T>
instead of IEnumerable<T>
? The .IndexOf
extension check if the type is a IList<T>
and use it's .Count
property instead of re-calculate it's index.Hi Joe!
Wanted to thank you for your great project.
I wanted to ask you, for some reason the pagination CSS seems to look awkward, and I couldn't find the reason since all the static resources looks in place.
I attach a picture of how the pagination looks after forked it from Git.
It looks the same pretty much in the other paginations examples.
Hope you can figure out where's the problem.
Thank you !
Roni.
Hi Joe,
I have been using your pagination utility for sometime now and find it very useful. However, I am not a fan of the Next and Previous Links << and >> as they come and go depending on whether you are at the start or end of a set of pages.
I have looked at the code and would propose something along the following...
Add the following to PaginationSettings.cs
public bool RemoveNextPrevLinks { get; set; } = false;
Add to PageTagHelper.cs
[HtmlAttributeName("cs-remove-nextprev-links")]
public bool RemoveNextPrevLinks { get; set; } = false;
Add to PaginationLinkBuilder.cs
// Remove the PREV and NEXT Page Links
if (paginationSettings.RemoveNextPrevLinks)
{
if (paginationLinks[0].Text == previousPageText) {
paginationLinks.RemoveAt(0);
}
var lastLink = paginationLinks.Count - 1;
if (paginationLinks[lastLink].Text == nextPageText) {
paginationLinks.RemoveAt(lastLink);
}
}
I have read your contribution notes and I think it best to leave you to respond!
Many Thanks
Mark Lawson
[email protected]
currently we have an HtmlHelper AlphabeticPagination.cs, it works fine, but it would be nice to modernize it into a TagHelper instead.
It is not a high priority at the moment but thought I should list it here in case someone else wants to work on that.
Hi Joe,
Is it possible to change the look of the pager element, like background color etc? I tried changing the css base don the class "pagination" but it didn't work for me.
Thanks
Hi,
I was having the following problem showing when I ran this demo project:
EINVRES Request to https://bower.herokuapp.com/packages/jquery failed with 502
It was causing bootstrap and JQuery load errors in the browser console.
The fix is to change the .bowercc file to the following (adds "registry": "https://registry.bower.io",):
{
"registry": "https://registry.bower.io",
"directory": "wwwroot/lib"
}
Thank you.
How to support area asp-controller="operateLog/operateLog"?
Hi.
If you click on Page one, Pager show items from page 2.
You can fix it as follows:
PageIndex = index - 1; // HERE ADD -1 TO FIX THIS PROBLEM
HERE IS PART OF CODE WITH this FIX
public PagedList(IQueryable<T> source, int index, int pageSize, int? totalCount = null)
{
if (index < 0)
throw new ArgumentOutOfRangeException("index", "Value can not be below 0.");
if (pageSize < 1)
throw new ArgumentOutOfRangeException("pageSize", "Value can not be less than 1.");
if (source == null)
source = new List<T>().AsQueryable();
var realTotalCount = source.Count();
PageSize = pageSize;
PageIndex = index - 1; // HERE ADD -1 TO FIX THIS PROBLEM
TotalItemCount = totalCount.HasValue ? totalCount.Value : realTotalCount;
PageCount = TotalItemCount > 0 ? (int)Math.Ceiling(TotalItemCount / (double)PageSize) : 0;
HasPreviousPage = (PageIndex > 0);
HasNextPage = (PageIndex < (PageCount - 1));
IsFirstPage = (PageIndex <= 0);
IsLastPage = (PageIndex >= (PageCount - 1));
ItemStart = PageIndex * PageSize + 1;
ItemEnd = Math.Min(PageIndex * PageSize + PageSize, TotalItemCount);
if (TotalItemCount <= 0)
return;
var realTotalPages = (int)Math.Ceiling(realTotalCount / (double)PageSize);
if (realTotalCount < TotalItemCount && realTotalPages <= PageIndex)
AddRange(source.Skip((realTotalPages - 1) * PageSize).Take(PageSize));
else
AddRange(source.Skip(PageIndex * PageSize).Take(PageSize));
}
I recently updated my code to use the latest version of Boostrap and the Pagination component is no longer drawing itself correctly. I get this (text only no borders etc)
Prev123456Next
I assume this is because the Pagination component has been rewritten using flexbox
Current I must define asp-action
,asp-controller
,asp-route-*
for a search. Is this a Bug?
it should support auto parse QueryString to those links
It would be nice to have async support when doing database calls with something like ToPagedListAsync() just like there is with toListAsync().
Hi, if you added the hashtag to url, it would be great.
Thanks
I tried to do a nuget install of this package.
I got an error as follows:
error: Package cloudscribe.Web.Pagination 1.0.2 is not compatible with netcoreapp1.0 (.NETCoreApp,Version=v1.0). Package cloudscribe.Web.Pagination 1.0.2 supports:
error: - net451 (.NETFramework,Version=v4.5.1)
error: - net452 (.NETFramework,Version=v4.5.2)
error: - net46 (.NETFramework,Version=v4.6)
error: - netstandard1.6 (.NETStandard,Version=v1.6)
error: One or more packages are incompatible with .NETCoreApp,Version=v1.0.
Is there a compatibility issue?
Please add support for totalitems
with long
type.
Thanks for the great code! I downloaded it and have it working (mostly) in an new MVC 6 / .NET 5 Web application. The only problem that I have run across is I am unable to get the First and Last links to display in the output page.
Here is my code:
<cs-pager cs-paging-pagesize="@Convert.ToInt32(ViewData["PageSize"])" cs-paging-pagenumber="@Convert.ToInt32(ViewData["CurrentPage"])" cs-paging-totalitems="@Convert.ToInt32(ViewData["CurrPartCatCount"])" cs-paging-maxpageritems="10" cs-pagenumber-param="page" cs-show-first-last="true" cs-first-page-text="First" cs-next-page-text="Next >" cs-previous-page-text="< Previous" cs-last-page-text="Last" asp-controller="PartCategories" asp-action="Index"></cs-pager>
I am probably missing something stupid. Any help would be appreciated.
Thanks!
Hi
In AJAX mode there is an issue with link buttons:
take Paging Demo5 example
Then you start you are at page 1. And back button is disable and even red crossed mouse cursor appear then you put mount over it BUT it still clickable with this red crossed mouse cursor leading to unpredictable behaviour (can be seen on Paging Demo5 sample). Same thing then you click on last page. Last page button become unavailable but still clickable.
When I go to next page I see 2 similar requests
https://www.dropbox.com/s/cw070i7tlpg3byi/Untitled.jpg?dl=0
Each time data requested twice.
Hi there,
same like this issue
add support for the following parameters
data-ajax-begin -> cs-ajax-begin
data-ajax-complete -> cs-ajax-complete
but they take a callback function not and element if this will make any difference with you.
Thanks a lot
Hi,
is it possible to hide the disabled prev button on first page and the disabled next button on last page?
I could use some CSS to achive this:
.pagination > li.disabled {
display: none;
}
But maybe there is or should be a server side solution?
I can use this in my project with default values.
But for the pager links, it gives me option to specify action and controller.
Since I am not using MVC and using Razor Pages, I need a asp-page parameter to correctly set my target url.
I also have issues with the parameters.
cs-selected-letter-param="query"
option is fine for querystring, but I need it as a route parameter to a razor page.
Hi Joe,
Excellent job with this TagHelper for Pagination. I found it very useful for paging, especially the Ajax control.
Can this be extended to add some custom attributes? e.g. data-ajax-success and data-ajax-failure
Basically, I was looking to smooth scroll to the top of the page/div when using Ajax but I need a 'data-ajax-success' attribute..
I've took a local copy down to try out..
Added to your PagerTagHelper.cs:
private const string AjaxSuccessAttributeName = "cs-ajax-success";
private const string AjaxFailureAttributeName = "cs-ajax-failure";
[HtmlAttributeName(AjaxSuccessAttributeName)]
public string AjaxSuccess { get; set; } = string.Empty;
[HtmlAttributeName(AjaxFailureAttributeName)]
public string AjaxFailure { get; set; } = string.Empty;
then just added a simple if statement to add the attributes :
if (AjaxTarget.Length > 0)
{
a.MergeAttribute("data-ajax", "true");
a.MergeAttribute("data-ajax-mode", AjaxMode);
a.MergeAttribute("data-ajax-update", AjaxTarget);
if (AjaxSuccess.Length > 0)
{
a.MergeAttribute("data-ajax-success", AjaxSuccess);
}
if (AjaxFailure.Length > 0)
{
a.MergeAttribute("data-ajax-failure", AjaxFailure);
}
}
Its handy to use as below:
<cs-pager cs-paging-pagesize="@Model.PageSize"
cs-paging-pagenumber="@Model.PageNumber"
cs-paging-totalitems="@Model.TotalItemCount"
cs-next-page-text="Next Page >"
cs-previous-page-text="< Previous Page"
cs-paging-maxpageritems="5"
cs-pagenumber-param="page"
cs-ajax-target="#gridcontainer"
cs-ajax-success="scrollToListingLocation('#gridcontainer')"
asp-controller="Home"
asp-action="AjaxPage"
asp-route-pagesize="@Model.PageSize" ></cs-pager>
with the simple JS function to auto-scroll to the top of the div:
function scrollToListingLocation(n) {
$('html, body').animate({
scrollTop: $(n).offset().top
}, 1200);
}
Is this the best way to do this?
Errors in C:\XX...XXXProjects\SwiftCourier-master\src\SwiftCourier.Web\SwiftCourier.Web.xproj
Version conflict detected for Microsoft.CodeAnalysis.Common.
SwiftCourier.Web (>= 0.0.1-120) -> Microsoft.NETCore.App (>= 1.0.0-rc2) -> Microsoft.CodeAnalysis.CSharp (>= 1.3.0) -> Microsoft.CodeAnalysis.Common (= 1.3.0)
SwiftCourier.Web (>= 0.0.1-120) -> Microsoft.VisualStudio.Web.CodeGeneration.Tools (>= 1.0.0-preview1-final) -> Microsoft.VisualStudio.Web.CodeGeneration (>= 1.0.0-preview1-final) -> Microsoft.VisualStudio.Web.CodeGeneration.EntityFrameworkCore (>= 1.0.0-preview1-final) -> Microsoft.VisualStudio.Web.CodeGeneration.Core (>= 1.0.0-preview1-final) -> Microsoft.VisualStudio.Web.CodeGeneration.Templating (>= 1.0.0-preview1-final) -> Microsoft.VisualStudio.Web.CodeGeneration.Utils (>= 1.0.0-preview1-final) -> Microsoft.CodeAnalysis.CSharp.Workspaces (>= 1.3.0-beta1-20160429-01) -> Microsoft.CodeAnalysis.Workspaces.Common (= 1.3.0-beta1-20160429-01) -> Microsoft.CodeAnalysis.Common (= 1.3.0-beta1-20160429-01).
In Ajax sample /Paging/IndexAjax
clicking on current page Icon (should be no action) leads to unpredictable behaviour.
Is any chance an option to use async requests? like asp.net core rc2 standard template
public async Task<IActionResult> Index()
{
return View(await _context.Reason.ToListAsync());
}
_context.Reason.ToPagedList(0, DefaultPageSize) does not have ToListAsync method
I have problems with this package in all my projects because it requires .net 5
Instead of calling an action on a controller, I'm looking to call Javascript functions on click of the numbers and passing the page number as a parameter to the function. Is this functionality possible?
The reason being is I want to post an entire form on the click of the pager buttons so my plan was to use a jquery ajax function to post it like this.
function ChangePage(pageNumber)
{
$.ajax({
type: 'POST',
url: "/Items/ChangePage",
data: $('#SearchForm').serialize(),
success: function (result)
{
$('#target').html(result);
}
});
}
Am I going about this the wrong way?
On dnx 4.5.1/core 1.0.0-rc1-final
Problem code:
baseHref = linkTemplate.Attributes["href"];
querySeparator = baseHref.Contains("?") ? "&" : "?";//NullReferenceException
baseHref = baseHref + querySeparator + PageNumberParam + "=";
corrected
baseHref = linkTemplate.Attributes["href"] ?? string.Empty;
querySeparator = baseHref.Contains("?") ? "&" : "?";
baseHref = baseHref + querySeparator + PageNumberParam + "=";
I can't seem to get the page param to work for my routes which use attribute routing, using MVC6 and .Net Core.
For example:
[Route("media/{widgetId}/{page?}]
public IActionResult MediaByWidget(int widgetId, int? page)
It works, but it uses a querystring instead such as:
/media/1/?page=1
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.