devexpress / devextreme Goto Github PK
View Code? Open in Web Editor NEWHTML5 JavaScript Component Suite for Responsive Web Development
Home Page: https://js.devexpress.com/
License: Other
HTML5 JavaScript Component Suite for Responsive Web Development
Home Page: https://js.devexpress.com/
License: Other
var app = angular.module('app', [
'dx'
]);
I am getting this error
Uncaught Error: [$injector:modulerr] Failed to instantiate module app due to:
Error: [$injector:modulerr] Failed to instantiate module dx due to:
Error: [$compile:baddir] Directive name 'DOMComponent' is invalid. The first character must be a lowercase letter
http://errors.angularjs.org/1.4.3/$compile/baddir?p0=DOMComponent
at http://ajax.googleapis.com/ajax/libs/angularjs/1.4.3/angular.js:68:12
at assertValidDirectiveName (http://ajax.googleapis.com/ajax/libs/angularjs/1.4.3/angular.js:6905:13)
at $CompileProvider.registerDirective [as directive] (http://ajax.googleapis.com/ajax/libs/angularjs/1.4.3/angular.js:6932:7)
at runInvokeQueue (http://ajax.googleapis.com/ajax/libs/angularjs/1.4.3/angular.js:4356:35)
at http://ajax.googleapis.com/ajax/libs/angularjs/1.4.3/angular.js:4364:11
at forEach (http://ajax.googleapis.com/ajax/libs/angularjs/1.4.3/angular.js:336:20)
at loadModules (http://ajax.googleapis.com/ajax/libs/angularjs/1.4.3/angular.js:4346:5)
at http://ajax.googleapis.com/ajax/libs/angularjs/1.4.3/angular.js:4363:40
at forEach (http://ajax.googleapis.com/ajax/libs/angularjs/1.4.3/angular.js:336:20)
at loadModules (http://ajax.googleapis.com/ajax/libs/angularjs/1.4.3/angular.js:4346:5)
Such a poweful TreeList doesn't have a pager? Hmm so much for the consistency. :( It's still a grid that has a hierarchy. Why wouldn't you add this support?
Issue can be reproduced in this CodePen: https://codepen.io/jaggedaz/pen/ZaPRmE
Allows the user to begin dragging the appointment.
Should not allow the user to drag the appointment.
devexteme version: 17.2.3
Kodus on the new TreeList! Loving it! We're evaluating moving an existing competitors grid to this on a couple of customer projects as it solves a bunch of hacks. Thanks for creating it and supporting such awesome consistency between the grid with the features and APIs like filtering, sorting, columns, selection, etc. I hope you continue to evolve it.
On that note, a couple feature requests / suggestions for it:
onRowPrepared
why not add to the columns a property that can be mapped to the data field? A couple other grid controls we've used do it this way and it's very handy. Though I realize it would be specific to the cell that way, so maybe having a rows
object with a property for that in addition to the cell to satisfy both needs.onSelectionChanged
, the checkbox shouldn't even been shown and would be helpful to control that through a property that can come in the data as a boolean for each item.rowAlternationEnabled
is enabled, a row selection is really hard to tell apart from the dark background of the alternating row.And of course we'd want you to add this to the other grid controls for consistency as they become useful there too.
I would load custom date names like to load as in messages, how to do this?
This issue can be reproduced with this demo by adding the following options to TreeView:
selectNodesRecursive: false, searchEnabled: true
Steps to reproduce:
selected: true
for any parent node.Step 2 - Nothing happens
Step 3 - Upload begins
Step 2 - File should have started uploading
Step 3 - File is rejected, upload does not start
DevExtreme 17.1
Latest Chrome on Windows 10
After clicking test Test-button ui/dialog/confirm() is called and resulting with the following error:
ERROR TypeError: Cannot read property 'jQuery3310043683433871879452' of undefined
(or some other random number behind jQuery)
The same problem happens with ui/dialog/notify() ...
Expected DevExtreme confirm() and notify() to work without error.
A ugly fix is to comment two lines (4 and 24) in app.module.ts ...
and let the HomeModule only be referenced by Angular Router such way ...
const routes: Routes = [
// Lazy async modules
{
path: '',
loadChildren: './home/home.module#HomeModule'
}
];
Angular.io
JQuery
Webpack2
DevExtreme 17.2.4 (but any version fail same way)
Would be helpful to have a method .clear()
and simply do: $("#treeList").dxTreeList('clear')
for example instead of having to do:
var instance=$("#treeList");
instance.option('dataSource', []);
Same for DataGrid and PivotGrid.
Took me hours and lots of searching in forums to figure that out whereas this one method could be well documented in API.
The locale is always the same. (But the messages on this control correspond to the selected locale.)
DevExtreme/js/localization/date.js 68 line and 604 line
var months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];```
/*.................*/
getMonthNames: function(format) {
return cutCaptions(months, format);
},
getDayNames: function(format) {
return cutCaptions(days, format);
},
Assumption:
There are no places where the values of these variables change, or other places to which the reference occurs when forming the component.
The names of the weeks of the months should be in accordance with the specified locale
17.1.3 DevExtreme
Если в форме указать поле dxSelectBox с CustomStore с указанными полями displayExpr и valueExpr,
то будет вызван многократное load у CustomStore
Пример
https://codepen.io/anon/pen/JMpXVz
import { confirm } from 'devextreme/ui/dialog'; to a component
use confirm
confirm('My string', '').done(res => {
if (res === true) {
location.reload();
}
});
Gets compile error:
error TS2339: Property 'done' does not exist on type 'JQueryPromise<boolean>'.
Find another way to get dialogs working again 🥇
Chrome latest, Win 10, angular 5.0.0-rc.9
"devextreme": "17.2.1-pre-17291",
"devextreme-angular": "17.2.1-beta.3",
Using 17.2.4, but this was issue in previous releases as well. Users are having difficulty seeing the vertical and horizontal scrollbars. Some don't hover long enough for the scrollbars to appear, and even when they do, the height / width of them is difficult to work with. Please please please add an option to always display the scrollbars in the standard sizes.
Also, when there are a lot of rows in the TreeList, the vertical scrollbar height is so tiny it's very hard to even see it and hard to grab it. Can you spot the vertical scrollbar it in the screenshot?
On the version 17.1.3 doesn't work in a popup edit mode.
https://www.devexpress.com/Support/Center/Example/Details/T334359/dxdatagrid-how-to-implement-cascading-lookup-columns
onToolbarPreparing: function (sender) {
sender.toolbarOptions.items.unshift({
widget: "dxMenu",
location: "after",
options: {
selectionMode: 'single',
focusStateEnabled: true,
hoverStateEnabled: true,
showSubmenuMode: {
name: 'onClick',
},
hideSubmenuOnMouseLeave: false,
items: [{
text: 'Экспортировать',
icon: 'export',
items: [{
icon: 'exportxlsx',
text: 'Экспортировать всё',
},
{
icon: 'exportselected',
text: 'Экспортировать выбранные строки',
},
]
},]
},
});
},
add code
not hover and spindown ico
Hello, when I'm using devexpressJs, I find some problems with using filxed column in IE browsers.
1, the reset of $(document.body).Click event will expire and will only be triggered by clicking on the text or the border border.
2, using the right-click menu event will fail and will only be triggered by clicking on the text or the border border.
3, when more than 26 data, the last two data in addition to the frozen column (filxed Colmun), the other are merged into a cell.
4, in a lot of time to move to the right, in the IE browser will appear flashing, the experience is not good.
Use Devexreme and devextreme-angular 17.2.4
If I select a value from a select-box
and than I refresh the items/datasource, I lost the current value on the UI because of the reference value change.
Is it possible to override the compare behaviour?
This Plunker reproduce the problem.
Changing the items/datasource I would like to not lose the current selected value
OS: MacOs 10.12.6
angular/cli: 1.2.3
node: 6.11.0
Are there any suggestions/examples on how to integrate the devextreme components with the react.js view renderer?
I'm not sure if this is the right place for this question. I originally asked this on StackOverflow, as I thought you guys might be monitoring the "devexpress" and "devextreme" tags, but the question hasn't received many views, so here it is - I hope you can help:
I'm upgrading a project from an older version of DevExpress to the latest version of DevExtreme and having an issue with the pivot grid's OLAP connection. In the old version, we could bind to a connection string as follows:
@Html.DevExpress().PivotGrid(pivotSettings).BindToOLAP("provider=MSOLAP;data source=.;initial catalog=Dashboard AS;cube name=Dashboard Cube").GetHtml()
In the new one, there is no option for a connection string and I am forced to provide a URL for msmdpump.dll.
I followed some of instructions here: Configure HTTP Access to Analysis Services on IIS 8.0
However, that is for IIS and not IIS Express, so I basically just copied the files to /wwwroot/OLAP/ in my new .NET Core application.
My pivot grid has the following definition:
@(Html.DevExtreme().PivotGrid()
.ID("pivotGrid")
.Width("100%")
.AllowSortingBySummary(true)
.AllowFiltering(true)
.ShowBorders(true)
.ShowColumnGrandTotals(true)
.ShowRowGrandTotals(true)
.ShowRowTotals(true)
.ShowColumnTotals(true)
.FieldChooser(c => c.Enabled(true))
.DataSource(d => d.RetrieveFields(true)
.Store(s => s.Xmla()
.Url("/OLAP/msmdpump.dll")
.Catalog("Dashboard AS")
.Cube("Dashboard Cube")
)
)
)
and the msmdpump.ini is as follows:
<ConfigurationSettings>
<ServerName>localhost</ServerName>
<SessionTimeout>3600</SessionTimeout>
<ConnectionPoolSize>100</ConnectionPoolSize>
</ConfigurationSettings>
The problem is I keep getting a 404 in the browser console even though the URL is correct:
http://localhost:4116/OLAP/msmdpump.dll
I can't find any instructions for getting msmdpump.dll to work with IIS Express.
I'm thinking maybe IIS Express prevents the browser from accessing DLLs directly? I'm not certain... but it did give me a 404 on the .ini file as well when I tested that. If this is the problem, how do I solve it?
Is it possible for you to make this simpler by allowing an alternative to the Url parameter, so that we don't need to use msmdpump.dll? For example:
.Store(s => s.Xmla()
.FromConnectionString("provider=MSOLAP;data source=.;initial catalog=Dashboard AS;cube name=Dashboard Cube")
)
or even have a Server parameter so you can build a connection string that way:
.Store(s => s.Xmla()
.Server("localhost")
.Catalog("Dashboard AS")
.Cube("Dashboard Cube")
)
Using 17.1.6, I have 10 rows. 3 of the rows have 1 level of 3 children under them. When I click on SelectAll, if those parent rows a collapsed, the children are never shown as selected via the checkbox. I would expect the behavior to selected the children whether the parent row is expanded or not. You can see this behavior also here, have everything collapsed, tick on select all and expand John Heart: https://js.devexpress.com/Demos/WidgetsGallery/Demo/TreeList/MultipleRowSelection/jQuery/Light/
Also, if I select the parent row, whether the row is expanded or not has no affect, the children are never automatically selected. I would expect selecting the parent row should automatically select the children whether the parent is expanded or not. Further, I would expect the checkbox on the parent to be the same functionality or three state so that if I unselect a child it should change to indicate that like the SelectAll checkbox visual state.
Hi . How can i change globlizayion of my dxdatebox from gregorian to jalali ?
I know that i have to use globlization.js and cldr.js and dependencies but still when i am using dxdatebox it is not working and says your date.js is not supporting jullian calendar
Is there any when that i change my dxdatebox to julian?
Thanks for your attention
Reopening as it's a feature request as discussed in #2358
Hi Everyone
dxDropDownBox is different observer in chrome developer tool open and close.
TL:DR
Have you got dxDropdownbox with cascade at runtime.
Ex Code
<%= OneHtml.DdGrid<CustomerRequestWrapper>(m=>m.InterviewId, wrapperDivClass:class12_12_12, ngEnabled:"SalesmanIdEnabled", ngId="sbInterview", htmlId="ddbInterview") %>
Above code creating belove code
=======
<div class="col-md-12 col-sm-12 col-xs-12"> <label class="control-label bold">Görüşme</label>
<div id="ddbInterview" dx-drop-down-box="sbInterview">
<div data-options="dxTemplate: { name: 'content' }">
<div id="gridInterview" dx-data-grid="sbInterview.dataGrid"></div>
</div>
</div>
</div>
and
<scirpt type="text/javascript">
$scope.InterviewServiceLoad=()=>
{
InterviewService.LookupForRequest($scope.ActiveRow, $scope.CustomerRequestWrapper.OperationId, $scope.CustomerRequestWrapper.SalesmanId, $scope.GetCurrentCustomerId()).then((r) => {
$scope.InterviewDataSourceList = r.Data;
$scope.fgridstate = true;
});
}
$("#ddbInterview").click(() => {
console.log('mf');
if ($("#ddbInterview").dxDropDownBox("instance").isReady()) {
if (true) {
$("#ddbInterview").dxDropDownBox("instance").repaint();
$scope.fgridstate = false;
}
}
});
$scope.sbInterview = {
bindingOptions: {
dataSource: "InterviewDataSourceList",
value: Config.ModelId + ".InterviewId"
},
valueExpr: "Id",
displayExpr: "Id",
showClearButton: true,
onValueChanged: function (e) {
e.component.close();
},
dataGrid: {
bindingOptions: {
dataSource:"InterviewDataSourceList"
},
columns: [
{ dataField: "Id", caption: "No" }, "Interviewed", "CustomerId"
],
hoverStateEnabled: true,
paging: { enabled: false, pageSize: 20 },
filterRow: { visible: false },
scrolling: { mode: "virtual" },
selection: { mode: "single" },
onSelectionChanged: function (selectedItems) {
$scope.CustomerRequestWrapper.InterviewId = selectedItems.selectedRowKeys[0];
}
}
};
SS:
Chrome Developer tools open (normal run) =>
http://imgur.com/flraPbg
Chrome Developer tools close (error run) =>
http://imgur.com/BHn64vw
other metod trigger $scope.InterviewServiceLoad
<div dx-chart="{
dataSource: [
{ fruit: 'Oranges', total: 10 },
{ fruit: 'Apples', total: 15 },
{ fruit: 'Bananas', total: 9 }
],
series: { argumentField: 'fruit', valueField: 'total' }
}"></div>
UglifyJsPlugin
to uglify your javascript codeChart plugin draws only the background but not the actual chart
Beautiful chart is drawn
DevExtreme 17.1
Angular 1.5.7
Webpack 1.12.11
Latest Chrome
ASP.NET MVC Core 2.0 DevExtreme
Create class with array of elements like this:
public class TestElement {
public string Id { get; set; }
}
public class Test{
public List SomeArray { get; set;}
}
Add form with Test object - Html.DevExtreme().Form().FormData(TestObject)
Add SimpleItem with data field to array element -
AddSimple().DataField($"SomeArray[0].Id").Visible(false);
Add to page Model the following handlers
public void OnPost(Test request){ }
public void OnGet() {
TestObject = new Test() { SomeArray = new List() { new TestElement { Id = Guid.NewGuid().ToString() } } }
}
Submit form
Id in array element is null
Id in array element is specified guid
!!! If you change Visible to true everything works fine
errors post to view but not shown in edit form like validation of form widget.
we expected to see validation errors on edit form when datagrid in edit mode.
Asp.net core
DevExtreme 17.1.6
Chrome
I am using:
Windows 10,
Visual Studio 2017 Enterprise - Version 15.2 (26430.16) Release
When I install DevExtreme.Web from Nuget to a new ASP.NET Core application, the package reference shows up fine without any errors, but nothing works - the namespaces are inaccessible. I then tried to create another ASP.NET Core web app, but this time targeting the full .NET framework and I got the same problem. Also, I did restart Visual Studio in both instances to no avail.
Am I missing something here or is there a bug?
Product Name
columnheaderFilter loads ALL data with all columns when using OData datasource
Correct OData query that uses distinct, selects only one field that interested for header filter, and uses paging.
Possibility to cache these values instead of querying OData service for each click.
Version: 17.1.6
npm install -g @angular/[email protected]
to get webpack 3.11.0ng new angular-tour-of-heroes
npm up --save
npm install devextreme devextreme-angular --save
ng eject
to create the webpack.config.js
npm run build
I'm a web dev beginner, so I don't know how to use webpack directly, but it's relevant that webpack 3.11.0 isn't a preview release and the fact that angular/cli is a preview is (IMHO) meaningless.
ERROR in ./node_modules/raw-loader!./node_modules/postcss-loader/lib??embedded!./node_modules/devextreme/dist/css/dx.light.css
(Emitted value instead of an instance of Error) CssSyntaxError: C:\Test-Projekte\Angular6\angular-tour-of-heroes\node_modules\devextreme\dist\css\dx.light.css:3219:12: Can't resolve 'icons/dxicons.woff)%20format(%27woff%27),%20url(icons/dxicons.ttf)%20format(%27truetype%27' in 'C:\Test-Projekte\Angular6\angular-tour-of-heroes\node_modules\devextreme\dist\css'
3217 | @font-face {
3218 | font-family: 'DXIcons';
> 3219 | src: url(icons/dxicons.woff) format('woff'), url(icons/dxicons.ttf) format('truetype');
| ^
3220 | font-weight: normal;
3221 | font-style: normal;
A successful build
DevExtreme: 17.2.5 (also tested with 18.1.1-pre-18037)
Webpack: 3.11.0
OS: Win 10 1709
Just put the value of url()
into quotation marks and webpack will be able to resolve the relative URL.
Popup not on front side when using inside TabPanel content template. it was fine before. but broken after npm update couple of days ago
17.1.4, angular 4.3.0, chrome, win 10
Example at Plunker.
groupPanel
.items
option using dxToolbar.option
method (reproduces for the static dataSource also).groupPanel
back to the grid's header.groupPanel
items are not draggable any more.
groupPanel
items could be drag'n'dropped back to the grid's header.
DevExtreme 17.2.4, Google Chrome 63, Windows 10
$("#Form").dxForm({
"colCount": 1,
"width": 300.0,
"items": [{
"itemType": "simple",
"dataField": "Date",
"editorOptions": {
"width": 200.0,
"displayFormat": "shortDate",
"dateSerializationFormat": "yyyy-MM-dd"
},
"editorType": "dxDateBox",
"label": {
"text": "Дата отчёта"
}
}],
"formData": {
"Date": new Date(2017,9,12)
}
});
$('#Form').dxForm('instance').option('formData')
At first run you get a js date object: {Date: Thu Oct 12 2017 00:00:00 GMT+0300 (Russia Standard Time)}
At second run you get formatted string: {Date: "2017-10-12"}
Each time we will should receive a formatted string.
Devextreme 17.1.6
Chrome 61.0.3163.100
DevExtreme doesn't seem to be usable with require()
nor Webpack. Is it something you plan to support in the future?
and more. The list grows every day.
Do you have a plan to develop framework-independent web components instead of developing custom components for frames?
Someone who loves Devexpress will not have to love angular. So we can choose which frame to use. You are focused on the core project. It's just an idea. :) regards to.
I don't know if that is a bug issue or if is it by design behaviour
I use the Devextreme 17.2.5 and this issue concerns the dxTreeList widget with selection mode "multiple" and selection recursive true
if select a node with childs in onSelectionChanged event, the e.selectedRowsData returns only the data for the selected (parent) node and not all of the selected data (with child nodes)
this is an example of this behaviour:
https://jsfiddle.net/samoilis/LwkgdLhg/30/
No more than 2 "tbody" elements
Chrome 62
Latest stable DevExtreme ( 17.1?)
Hello, DevEx
I'm using the Scheduler in Angular2 app and I need instead of a popup editing form, redirect user to another route with my own editing form (not popup).
I did not find a way to cancel the popup appointment editing form.
How can I cancel popup form?
Using 17.2.4 TreeList and for options have selection: {mode: 'multiple', showCheckBoxesMode: 'always', recursive: true}'. When I select a parent node that has 3 children, it correctly selects those 3 children and the parent however when using callback
onSelectionChanged: function(e)and looking at
e.currentSelectedRowKeys` it only contains the row I actually clicked on which is the parent row's index. What about the indexes of the children? How do I know that they were also selected. And of course when I unselect parent, the same happens. I need to know all the children that are selected / unselected.
How can I do that?
// import it to change locale and load localization messages
import { locale, loadMessages } from 'devextreme/localization';
import 'devextreme-intl';
// Load localized messages (English included by default)
const messagesDe = require('devextreme/localization/messages/de.json');
loadMessages(messagesDe);
// Set locale according the browser language
locale(navigator.language);
// ------------------ navigator.language is in IE and EDGE de-DE. In Chrome 'de'
locale(navigator.language);
in IE or Edge with german languagesettings. navigator.language is 'de-DE' and does not worklocale('de')
in IE or Edge. This works for me.localization works only for 'de' not for 'de-DE'
Should work for 'de-DE' and 'de'
Devextreme 17.1.5
InternetExplorer and Edge
The issue can be re-created with this CodePen: https://codepen.io/jaggedaz/pen/YEgvme
Displayed the appointment detail pop-up.
Should do nothing, should not display the appointment detail pop-up.
devextreme 17.2.3
I am experimenting with Rails and DevExtreme.
Rails, by default, is expecting name attributes of input elements to be like model[field]
for example name="article[caption]"
. At the moment, dxForm items ignores name
for an item if there is dataField
specified, and if formData contains keys like "model[field]"
- binding is broken.
Is it possible to force name of generated input element in dxForm?
DevExtreme 17.1
You deep support quite some frameworks, but how about react? Anything on the roadmap?
This is how DevExtreme.AspNet.Data loads data in jQuery-free mode.
Minimal app to reproduce:
package.json
{
"name": "bug",
"scripts": {
"watch": "webpack --watch index.js index.out.js",
"serve": "hs -q0"
},
"dependencies": {
"devextreme": "^17.2.5",
"http-server": "^0.11.1",
"jquery": "^3.3.1",
"webpack": "^3.10.0"
}
}
index.js
//import 'devextreme/integration/jquery';
const ajax = require("devextreme/core/utils/ajax");
ajax.sendRequest({
url: "https://js.devexpress.com/Demos/Mvc/api/DataGridWebApi/Orders",
dataType: "json",
cache: false
})
.done(function(res) {
// BUG: res is null
// "Uncaught SyntaxError: Unexpected token :" is browser console
debugger
})
.fail(function(error) {
debugger
})
index.html
<script src=index.out.js></script>
npm i
npm run watch
npm run serve
Hi,
I'm starting using DevExtreme and I love it but I found a big performance issue.
I created a basic application with one route-state (main) and I put a dx-button in the main component.
The main component also display a binded variable.
That variable is a get
property and putting a console.log()
in it I noticed that it is call every time I move the mouse on the screen.
Removing any DevExtreme module resolve the problem.
Unfortunately I cant reproduce the case on Plunkr so I created a very small application that reproduce the case.
You can find it here.
Once downloaded you just need to perform this commands:
As every angular-cli application the server is binded to localhost:4200 by default.
Mac OS 10.10
Node 6.11
angular-cli 1.2.1
Some time ago, I was working on a PR for T487901, but I want to test my changes locally before submitting a PR.
I've been following the description to build and test DevExtreme locally here: https://github.com/DevExpress/DevExtreme/blob/17_2/README_DEVELOPERS.md#locally-in-docker
But there's something I don't quite understand, since I get an error message that says ./docker-ci.sh
doesn't exist at the provided path.
Any hints on what's wrong, or links to more resources that can help me run the CI tests before opening a PR?
We've used VueJS for building our new product for enterprises. We really want to see some support for VueJS. So that we could start to leverage this powerful UI libraries. Is here the right channel to ask for this?
devexpress
node_modulesng build
response are as belowAlternatively, removed the module declaration and ran ng build
it results in very few memory
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.