alfresco / aikau Goto Github PK
View Code? Open in Web Editor NEWAikau UI framework
License: GNU Lesser General Public License v3.0
Aikau UI framework
License: GNU Lesser General Public License v3.0
The current way that complex, nested widget structures are rendered includes various inefficiencies that appear to have a nasty, non-linear effect on the time it takes to render e.g. a list of 50 entries with 50 very simple columns.
The demonstrator test case in my gist https://gist.github.com/AFaust/1d1450ffe8829371ad04 renders such a list of 50 entries with 50 columns. On IE 11 it can take around 30 seconds for the initial rendition. Firefox (45) appears to be better at handling the use case with around 6-10s. Since I don't use (or even install) Chrome, I can't say how it fares.
In other use cases when we have used a paginating, sortable list, we've additionally observed that destroying the previous page can also take a significant time (~5s on IE11 for a 50 rows and ~20 coumns case).
Sure, any use case that involves excessive complexity can expect to suffer some performance degredation. But it is hard to explain to an end-user / customer, why only 50x50 values are enough to grind his web app to a halt.
In the last week and a half I have built completely separate "high performance" variants of the ListRenderer, Row, Cell, Property and InlineEditProperty widgets (and mixins CoreWidgetProcessing / MultiItemRendererMixin), and also applied some optimisations to secondary widgets such as the Actions renderer, to effectively bring down rendering time to ~10-15% and nearly eliminate overhead of destroying the previous list page.
The main issues we identified as causing significant overheads were:
The primary changes I have included in our widget / mixin variants are:
I won't suggest that the majority of my changes need to be included in / considered for Aikau core, but I feel very strongly about the need for an enhanced widget lifecycle, especially for potentially nested / large widget structures. Both the construction in detached DOM and asynchronous destruction in a detached DOM had the most significant impact on overall performance when we ignore the HTML widget template / event attachment overhead, which could be addressed on a widget-by-widget basis outside of Aikau core.
The following screenshots showcase the profiling results of the test case from my gist, running in IE 11 (Win 7 64bit), on Alfresco 5.0.3 and Aikau 1.0.60
I'm trying to run the tutorial on my local machine, but I couldn't find where to configure my remote server's address (my alfresco server runs on a virtual machine, so, no localhost).
Is that possible?
I am starting to experiment on aikau unit testing.
After few unsuccessful local trials I came to understand that local test are not reliable, I am now trying running the tests against a VirtualBox VM, and I am hitting these errors:
====================================
AIKAU UNIT TESTS (Ctrl-C to abort)
====================================
FAILED
[previous messages h/dden ...]
PROGRESS STATUS LAST STARTED TEST
- Test Previous Page Button Disables (on scroll) [Chrome v47.0.2526.111 on Linux]
Requested Envs: 2 Environment: Complete
- Test Link Value [Chrome v47.0.2526.111 on Linux]
---------------------------------------- Tested Envs: 1 Suite name: Complete
- Test Find Next [Chrome v47.0.2526.111 on Linux]
====================.................... Total tests: 4524 Test name: Complete
Download as ZIP Action Tests
---------------------------------------- Passed: 2248 (49.7%)
Failed: 12 (0.3%) REPORTER INFO
ERRORS
Percent complete: 50% Skipped: 2 (0.0%) Last called method: runEnd
N/A
Tunnel status: Active Errors: 1
Time taken: 36 minutes 14 seconds Warnings: 1
Time Remaining: 40 mins remaining Deprecations: 0
DEPRECATIONS
FAILED
N/A
========================================
- Test Thumbnail Navigation [Chrome v47.0.2526.111 on Linux]
- Test Link Value [Chrome v47.0.2526.111 on Linux]
- Test First Page is active [Chrome v47.0.2526.111 on Linux]
- Test Find Next [Chrome v47.0.2526.111 on Linux]
- Test Find Previous [Chrome v47.0.2526.111 on Linux]
Download as ZIP Action Tests
- Test non-legacy action version [Chrome v47.0.2526.111 on Linux]
ERRORS
firefox on any platform (Unknown)
- [POST http://192.168.56.4:4444/wd/hub/session / {"desiredCapabilities":{"browserName":"firefox","selenium-version":"2.44.0","name":"src/test/resources/intern",...
WARNINGS
"firefox on any platform"
- Unable to retrieve environment info
DEPRECATIONS
N/A
========================
===== ENVIRONMENTS =====
========================
"Chrome on any platform" was fulfilled by "Chrome v47.0.2526.111 on Linux"
"Firefox on any platform" was fulfilled by "true"
====================
===== FAILED =====
====================
--- Chrome v47.0.2526.111 on Linux ---
Inherited DND Configuration Tests
"Check prepopulated nested widget configuration"
[POST http://192.168.56.4:4444/wd/hub/session/db84cbf8-dd35-49a1-b8d0-f0bd2e3440a8/element/326/click] unknown error: Element is not clickable at point (829, 232). Other element would receive the click: <div class="dijitDialogUnderlay _underlay" tabindex="-1" data-dojo-attach-point="node" id="ALF_DROPPED_ITEM_CONFIGURATION_DIALOG_underlay" style="width: 1009px; height: 661px;"></div>
(Session info: chrome=47.0.2526.111)
(Driver info: chromedriver=2.15.322448 (52179c1b310fec1797c81ea9a20326839860b7d3),platform=Linux 3.13.0-74-generic x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 33 milliseconds
Build info: version: '2.46.0', revision: '87c69e2', time: '2015-06-04 16:16:47'
System info: host: 'vagrant-ubuntu-trusty-64', ip: '10.0.2.15', os.name: 'Linux', os.arch: 'amd64', os.version: '3.13.0-74-generic', java.version: '1.7.0_91'
Session ID: 8b34468d354a52aa008706a3722e94da
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{platform=LINUX, acceptSslCerts=true, javascriptEnabled=true, browserName=chrome, chrome={userDataDir=/tmp/.com.google.Chrome.TjbO5y}, rotatable=false, locationContextEnabled=true, mobileEmulationEnabled=false, version=47.0.2526.111, takesHeapSnapshot=true, cssSelectorsEnabled=true, databaseEnabled=false, handlesAlerts=true, browserConnectionEnabled=false, webStorageEnabled=true, nativeEvents=true, applicationCacheEnabled=false, takesScreenshot=true}]
Site Picker Tests
"Can choose single site"
[POST http://192.168.56.4:4444/wd/hub/session/db84cbf8-dd35-49a1-b8d0-f0bd2e3440a8/element/1223/click] unknown error: Element is not clickable at point (551, 276). Other element would receive the click: <div data-dojo-attach-point="viewsNode" data-aikau-loading-message="Loading..." data-aikau-rendering-message="Please wait while the view is rendered..." class="alfresco-lists-AlfList__views rendered-view">...</div>
(Session info: chrome=47.0.2526.111)
(Driver info: chromedriver=2.15.322448 (52179c1b310fec1797c81ea9a20326839860b7d3),platform=Linux 3.13.0-74-generic x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 37 milliseconds
Build info: version: '2.46.0', revision: '87c69e2', time: '2015-06-04 16:16:47'
System info: host: 'vagrant-ubuntu-trusty-64', ip: '10.0.2.15', os.name: 'Linux', os.arch: 'amd64', os.version: '3.13.0-74-generic', java.version: '1.7.0_91'
Session ID: 8b34468d354a52aa008706a3722e94da
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{platform=LINUX, acceptSslCerts=true, javascriptEnabled=true, browserName=chrome, chrome={userDataDir=/tmp/.com.google.Chrome.TjbO5y}, rotatable=false, locationContextEnabled=true, mobileEmulationEnabled=false, version=47.0.2526.111, takesHeapSnapshot=true, cssSelectorsEnabled=true, databaseEnabled=false, handlesAlerts=true, browserConnectionEnabled=false, webStorageEnabled=true, nativeEvents=true, applicationCacheEnabled=false, takesScreenshot=true}]
"Can choose multiple sites"
[POST http://192.168.56.4:4444/wd/hub/session/db84cbf8-dd35-49a1-b8d0-f0bd2e3440a8/element/1224/click] unknown error: Element is not clickable at point (536, 43). Other element would receive the click: <div class="dijitDialogUnderlay _underlay" tabindex="-1" data-dojo-attach-point="node" id="6050c889-6405-4249-82a5-41107c6addfb_underlay" style="width: 1009px; height: 661px;"></div>
(Session info: chrome=47.0.2526.111)
(Driver info: chromedriver=2.15.322448 (52179c1b310fec1797c81ea9a20326839860b7d3),platform=Linux 3.13.0-74-generic x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 39 milliseconds
Build info: version: '2.46.0', revision: '87c69e2', time: '2015-06-04 16:16:47'
System info: host: 'vagrant-ubuntu-trusty-64', ip: '10.0.2.15', os.name: 'Linux', os.arch: 'amd64', os.version: '3.13.0-74-generic', java.version: '1.7.0_91'
Session ID: 8b34468d354a52aa008706a3722e94da
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{platform=LINUX, acceptSslCerts=true, javascriptEnabled=true, browserName=chrome, chrome={userDataDir=/tmp/.com.google.Chrome.TjbO5y}, rotatable=false, locationContextEnabled=true, mobileEmulationEnabled=false, version=47.0.2526.111, takesHeapSnapshot=true, cssSelectorsEnabled=true, databaseEnabled=false, handlesAlerts=true, browserConnectionEnabled=false, webStorageEnabled=true, nativeEvents=true, applicationCacheEnabled=false, takesScreenshot=true}]
List Local Storage (2)
"When there is no hash, the current filter is set as the hash"
The URL hash was not set to the current filter: expected 'http://192.168.56.1:8089/aikau/page/tp/ws/ListLocalStorageFallback?listType=CurrentFilterWithLocalStorage#key1=value1&key2=value2' to include '#key2=value2&key1=value1'
Local Storage for Lists Tests (5)
"When there is no hash and local storage is available the current filter should still be used"
Current filter was not used: expected 'http://192.168.56.1:8089/aikau/page/tp/ws/ListLocalStorageFallback?listType=CurrentFilter#key1=value1&key2=value2' to include '#key2=value2&key1=value1'
PdfJs Previewer Tests
"Test Previous Page Button Disables (on scroll)"
The previous page button was not disabled when scrolling back to the top of the viewer
"Test Thumbnail Navigation"
The second page was not active after clicking it's thumbnail
"Test Link Value"
The link was not generated correctly: http://192.168.56.1:8089/aikau/page/tp/ws/PdfJsPreview#page=6
"Test First Page is active"
The first page was not active before starting find tests: expected [ depth: 1 ] to have a length of 1 but got 0
"Test Find Next"
The second page did not become the active page as we went to the next search result
"Test Find Previous"
The first page did not become the active page as we went to the previous search result
Download as ZIP Action Tests
"Test non-legacy action version"
[POST http://192.168.56.4:4444/wd/hub/session/db84cbf8-dd35-49a1-b8d0-f0bd2e3440a8/element/3176/click] unknown error: Element is not clickable at point (40, 131). Other element would receive the click: <table class="dijit dijitReset dijitMenuTable dijitMenuActive dijitMenu dijitMenuFocused dijitFocused" role="menu" tabindex="-1" cellspacing="0" id="ACTIONS_ITEM_1_GROUP" widgetid="ACTIONS_ITEM_1_GROUP" style="top: 0px; visibility: visible;">...</table>
(Session info: chrome=47.0.2526.111)
(Driver info: chromedriver=2.15.322448 (52179c1b310fec1797c81ea9a20326839860b7d3),platform=Linux 3.13.0-74-generic x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 15 milliseconds
Build info: version: '2.46.0', revision: '87c69e2', time: '2015-06-04 16:16:47'
System info: host: 'vagrant-ubuntu-trusty-64', ip: '10.0.2.15', os.name: 'Linux', os.arch: 'amd64', os.version: '3.13.0-74-generic', java.version: '1.7.0_91'
Session ID: 8b34468d354a52aa008706a3722e94da
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{platform=LINUX, acceptSslCerts=true, javascriptEnabled=true, browserName=chrome, chrome={userDataDir=/tmp/.com.google.Chrome.TjbO5y}, rotatable=false, locationContextEnabled=true, mobileEmulationEnabled=false, version=47.0.2526.111, takesHeapSnapshot=true, cssSelectorsEnabled=true, databaseEnabled=false, handlesAlerts=true, browserConnectionEnabled=false, webStorageEnabled=true, nativeEvents=true, applicationCacheEnabled=false, takesScreenshot=true}]
====================
===== SKIPPED =====
====================
--- Chrome v47.0.2526.111 on Linux ---
Dashlet Tests
"Resizing dashlet stores height"
Test skipped because test environment is "chrome on any platform"
Infinite Scrolling Dashlet Tests
"Resizing first dashlet prompts data-load"
Test skipped because test environment is "chrome on any platform"
==================
===== ERRORS =====
==================
firefox on any platform (Unknown)
"[POST http://192.168.56.4:4444/wd/hub/session / {"desiredCapabilities":{"browserName":"firefox","selenium-version":"2.44.0","name":"src/test/resources/intern","idle-timeout":60}}] Unable to connect to host 127.0.0.1 on port 7055 after 45000 ms. Firefox console output:
r GMPProvider
1453308636586 addons.manager DEBUG Provider finished startup: GMPProvider
1453308636586 addons.manager DEBUG Starting provider: PluginProvider
1453308636586 addons.manager DEBUG Registering shutdown blocker for PluginProvider
1453308636586 addons.manager DEBUG Provider finished startup: PluginProvider
1453308636587 addons.manager DEBUG Completed startup sequence
1453308636666 DeferredSave.extensions.json DEBUG Save changes
1453308636667 addons.xpi DEBUG Updating XPIState for {"id":"[email protected]","syncGUID":"qKhgLrEsEpoE","location":"app-profile","version":"2.46.0","type":"extension","internalName":null,"updateURL":null,"updateKey":null,"optionsURL":null,"optionsType":null,"aboutURL":null,"iconURL":null,"icon64URL":null,"defaultLocale":{"name":"Firefox WebDriver","description":"WebDriver implementation for Firefox","creator":"Simon Stewart","homepageURL":null},"visible":true,"active":false,"userDisabled":false,"appDisabled":false,"descriptor":"/tmp/anonymous4264647846486076396webdriver-profile/extensions/[email protected]","installDate":1453308636000,"updateDate":1453308636000,"applyBackgroundUpdates":1,"bootstrap":false,"size":8445045,"sourceURI":null,"releaseNotesURI":null,"softDisabled":false,"foreignInstall":true,"hasBinaryComponents":true,"strictCompatibility":false,"locales":[],"targetApplications":[{"id":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","minVersion":"3.0","maxVersion":"66.*"}],"targetPlatforms":[{"os":"Darwin","abi":null},{"os":"SunOS","abi":null},{"os":"FreeBSD","abi":null},{"os":"OpenBSD","abi":null},{"os":"WINNT","abi":"x86-msvc"},{"os":"Linux","abi":null}],"multiprocessCompatible":false,"signedState":0}
1453308636667 addons.xpi DEBUG getModTime: Recursive scan of [email protected]
1453308636672 DeferredSave.extensions.json DEBUG Save changes
1453308636672 addons.xpi DEBUG Updating XPIState for {"id":"[email protected]","syncGUID":"qKhgLrEsEpoE","location":"app-profile","version":"2.46.0","type":"extension","internalName":null,"updateURL":null,"updateKey":null,"optionsURL":null,"optionsType":null,"aboutURL":null,"iconURL":null,"icon64URL":null,"defaultLocale":{"name":"Firefox WebDriver","description":"WebDriver implementation for Firefox","creator":"Simon Stewart","homepageURL":null},"visible":true,"active":false,"userDisabled":false,"appDisabled":true,"descriptor":"/tmp/anonymous4264647846486076396webdriver-profile/extensions/[email protected]","installDate":1453308636000,"updateDate":1453308636000,"applyBackgroundUpdates":1,"bootstrap":false,"size":8445045,"sourceURI":null,"releaseNotesURI":null,"softDisabled":false,"foreignInstall":true,"hasBinaryComponents":true,"strictCompatibility":false,"locales":[],"targetApplications":[{"id":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","minVersion":"3.0","maxVersion":"66.*"}],"targetPlatforms":[{"os":"Darwin","abi":null},{"os":"SunOS","abi":null},{"os":"FreeBSD","abi":null},{"os":"OpenBSD","abi":null},{"os":"WINNT","abi":"x86-msvc"},{"os":"Linux","abi":null}],"multiprocessCompatible":false,"signedState":0}
1453308636730 addons.manager DEBUG Starting provider: <unnamed-provider>
1453308636730 addons.manager DEBUG Registering shutdown blocker for <unnamed-provider>
1453308636730 addons.manager DEBUG Provider finished startup: <unnamed-provider>
1453308636778 DeferredSave.extensions.json DEBUG Starting write
1453308636881 addons.repository DEBUG No addons.json found.
1453308636881 DeferredSave.addons.json DEBUG Save changes
1453308636883 DeferredSave.addons.json DEBUG Starting timer
1453308636893 addons.manager DEBUG Starting provider: PreviousExperimentProvider
1453308636893 addons.manager DEBUG Registering shutdown blocker for PreviousExperimentProvider
1453308636893 addons.manager DEBUG Provider finished startup: PreviousExperimentProvider
1453308636896 DeferredSave.extensions.json DEBUG Write succeeded
1453308636896 addons.xpi-utils DEBUG XPI Database saved, setting schema version preference to 17
1453308636935 DeferredSave.addons.json DEBUG Starting write
1453308636946 DeferredSave.addons.json DEBUG Write succeeded
"
[POST http://192.168.56.4:4444/wd/hub/session / {"desiredCapabilities":{"browserName":"firefox","selenium-version":"2.44.0","name":"src/test/resources/intern","idle-timeout":60}}] Unable to connect to host 127.0.0.1 on port 7055 after 45000 ms. Firefox console output:
r GMPProvider
1453308636586 addons.manager DEBUG Provider finished startup: GMPProvider
1453308636586 addons.manager DEBUG Starting provider: PluginProvider
1453308636586 addons.manager DEBUG Registering shutdown blocker for PluginProvider
1453308636586 addons.manager DEBUG Provider finished startup: PluginProvider
1453308636587 addons.manager DEBUG Completed startup sequence
1453308636666 DeferredSave.extensions.json DEBUG Save changes
1453308636667 addons.xpi DEBUG Updating XPIState for {"id":"[email protected]","syncGUID":"qKhgLrEsEpoE","location":"app-profile","version":"2.46.0","type":"extension","internalName":null,"updateURL":null,"updateKey":null,"optionsURL":null,"optionsType":null,"aboutURL":null,"iconURL":null,"icon64URL":null,"defaultLocale":{"name":"Firefox WebDriver","description":"WebDriver implementation for Firefox","creator":"Simon Stewart","homepageURL":null},"visible":true,"active":false,"userDisabled":false,"appDisabled":false,"descriptor":"/tmp/anonymous4264647846486076396webdriver-profile/extensions/[email protected]","installDate":1453308636000,"updateDate":1453308636000,"applyBackgroundUpdates":1,"bootstrap":false,"size":8445045,"sourceURI":null,"releaseNotesURI":null,"softDisabled":false,"foreignInstall":true,"hasBinaryComponents":true,"strictCompatibility":false,"locales":[],"targetApplications":[{"id":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","minVersion":"3.0","maxVersion":"66.*"}],"targetPlatforms":[{"os":"Darwin","abi":null},{"os":"SunOS","abi":null},{"os":"FreeBSD","abi":null},{"os":"OpenBSD","abi":null},{"os":"WINNT","abi":"x86-msvc"},{"os":"Linux","abi":null}],"multiprocessCompatible":false,"signedState":0}
1453308636667 addons.xpi DEBUG getModTime: Recursive scan of [email protected]
1453308636672 DeferredSave.extensions.json DEBUG Save changes
1453308636672 addons.xpi DEBUG Updating XPIState for {"id":"[email protected]","syncGUID":"qKhgLrEsEpoE","location":"app-profile","version":"2.46.0","type":"extension","internalName":null,"updateURL":null,"updateKey":null,"optionsURL":null,"optionsType":null,"aboutURL":null,"iconURL":null,"icon64URL":null,"defaultLocale":{"name":"Firefox WebDriver","description":"WebDriver implementation for Firefox","creator":"Simon Stewart","homepageURL":null},"visible":true,"active":false,"userDisabled":false,"appDisabled":true,"descriptor":"/tmp/anonymous4264647846486076396webdriver-profile/extensions/[email protected]","installDate":1453308636000,"updateDate":1453308636000,"applyBackgroundUpdates":1,"bootstrap":false,"size":8445045,"sourceURI":null,"releaseNotesURI":null,"softDisabled":false,"foreignInstall":true,"hasBinaryComponents":true,"strictCompatibility":false,"locales":[],"targetApplications":[{"id":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","minVersion":"3.0","maxVersion":"66.*"}],"targetPlatforms":[{"os":"Darwin","abi":null},{"os":"SunOS","abi":null},{"os":"FreeBSD","abi":null},{"os":"OpenBSD","abi":null},{"os":"WINNT","abi":"x86-msvc"},{"os":"Linux","abi":null}],"multiprocessCompatible":false,"signedState":0}
1453308636730 addons.manager DEBUG Starting provider: <unnamed-provider>
1453308636730 addons.manager DEBUG Registering shutdown blocker for <unnamed-provider>
1453308636730 addons.manager DEBUG Provider finished startup: <unnamed-provider>
1453308636778 DeferredSave.extensions.json DEBUG Starting write
1453308636881 addons.repository DEBUG No addons.json found.
1453308636881 DeferredSave.addons.json DEBUG Save changes
1453308636883 DeferredSave.addons.json DEBUG Starting timer
1453308636893 addons.manager DEBUG Starting provider: PreviousExperimentProvider
1453308636893 addons.manager DEBUG Registering shutdown blocker for PreviousExperimentProvider
1453308636893 addons.manager DEBUG Provider finished startup: PreviousExperimentProvider
1453308636896 DeferredSave.extensions.json DEBUG Write succeeded
1453308636896 addons.xpi-utils DEBUG XPI Database saved, setting schema version preference to 17
1453308636935 DeferredSave.addons.json DEBUG Starting write
1453308636946 DeferredSave.addons.json DEBUG Write succeeded
at Server.createSession (C:\test\my-aikau\aikau\node_modules\intern\node_modules\leadfoot\Server.js:307:15)
at C:/test/my-aikau/aikau/node_modules/intern/lib/executors/Runner.js:190:22
at retry (C:/test/my-aikau/aikau/node_modules/intern/lib/util.js:723:13)
at C:\test\my-aikau\aikau\node_modules\intern\node_modules\dojo\Promise.js:156:41
at runCallbacks (C:\test\my-aikau\aikau\node_modules\intern\node_modules\dojo\Promise.js:19:22)
at C:\test\my-aikau\aikau\node_modules\intern\node_modules\dojo\Promise.js:103:21
at run (C:\test\my-aikau\aikau\node_modules\intern\node_modules\dojo\Promise.js:51:33)
at C:\test\my-aikau\aikau\node_modules\intern\node_modules\dojo\nextTick.js:35:17
at nextTickCallbackWith0Args (node.js:452:9)
at process._tickCallback (node.js:381:13)
====================
===== WARNINGS =====
====================
"firefox on any platform"
"Unable to retrieve environment info"
Error: Run failed due to one or more suite errors
at emitLocalCoverage <node_modules\intern\lib\executors\Executor.js:342:18>
at finishSuite <node_modules\intern\lib\executors\Executor.js:359:15>
at <node_modules\intern\lib\executors\Executor.js:367:8>
at <node_modules\intern\node_modules\dojo\Promise.ts:393:15>
at runCallbacks <node_modules\intern\node_modules\dojo\Promise.ts:11:11>
at <node_modules\intern\node_modules\dojo\Promise.ts:317:4>
at run <node_modules\intern\node_modules\dojo\Promise.ts:237:7>
at <node_modules\intern\node_modules\dojo\nextTick.ts:44:3>
at nextTickCallbackWith0Args <node.js:452:9>
at process._tickCallback <node.js:381:13>
Warning: Test failure; check output above for details. Use --force to continue.
Aborted due to warnings.
Execution Time (2016-01-20 16:13:32 UTC)
waitServer:server 2m 14.8s โโโโโโโโ 6%
intern:dev 36m 26.8s โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ 94%
Total 38m 55.9s
My understanding is that errors are shown once we get to Firefox tests.
I understand that vagrant is running tests against a VirtualBox VM in headless mode. Is there a way to configure that VM to have more RAM/CPU cores to speed up tests ?
Hello,
I have a picker and a textbox, when I select one item on picker the value go to the texbox
but when my picker is in a "ALF_CREATE_FORM_DIALOG_REQUEST" my payload is send but he is empty
when I click on "save" in the from dialog I'm sending payload but my function "_onPublish" is not called, I don't see a good way to do this
var temp = {
name : "alfresco/buttons/AlfButton",
config : {
label : "old",
publishTopic : "ALF_CREATE_FORM_DIALOG_REQUEST",
publishPayloadType: "PROCESS",
publishPayloadModifiers: ["processCurrentItemTokens"],
formSubmissionPayloadMixin: this.TutorialTopic,
publishPayload : {
dialogTitle : "Create Group",
dialogConfirmationButtonTitle : "Create",
dialogCancellationButtonTitle : "Cancel",
formSubmissionTopic : this.TutorialTopic, // on lance รงa
fixedWidth : true,
widgets : [ {
name : "tutorial/pickerPeople"
}
]
}
}
}
in the doc I can read that formSubmissionTopic is sending the "form value"
I have to admit I didn't really understand things like "publishPayloadType: "PROCESS" or "publishPayloadModifiers: ["processCurrentItemTokens"],
sending payload ๐ฑ
peoplePicker.js => (the button 'btn' was used when I first try to send my payload without form control) I think he sould be working even if now he is inside the form control no ?
postCreate: function example_widgets_InputWidget__postCreate() {
this.inherited(arguments);
this.picker = new SimplePicker({
label: this.message("Pick user"),
loadDataPublishTopic: "ALF_CRUD_GET_ALL",
loadDataPublishPayload: {
url: "api/people"
},
itemsProperty: "people",
itemKey: "userName",
propertyToRender: "userName",
availableItemsLabel: "available people",
pickedItemsLabel: "currently selected people",
singleItemMode: true
});
this.picker.placeAt(this.inputTopicNode);
var btn = new AlfButton({
label: "Publish",
onClick: lang.hitch(this, '_onPublish')
});
btn.placeAt(this.publishTopicNode);
},
_onPublish: function example_widgets_InputWidget__onPublish() {
this.alfPublish(this.TutorialTopic, this.picker.getValue());
this.alfLog("log", "on publie le payload");
}
receving payload
label.js =>
postCreate: function example_widget_renderWidget__postCreate() {
this.alfSubscribe(this.TutorialTopic, lang.hitch(this, "_onPayloadReceive"));
this.textArea = new TextBox({
id: "id",
fieldId: "fieldId",
name: "name",
label: "label",
description: "description"
});
this.textArea.placeAt(this.inputTopicNode);
this.alfSubscribe(this.TutorialTopic, function(payload) {
});
},
__onPayloadReceive: function example_widgets_renderWidget__onPayloadReceive(payload) {
try{
this.alfLog("log", this.textArea.setValue(payload[0].userName));
this.textArea.setValue(payload[0].userName);
}
catch (e){
this.textArea.setValue("nothing");
this.alfLog("log", "nothing"+e.message);
}
}_
});
thank you in advance
It's nice to be able to call the form dialog via the form service, but it would be nicer if the crud form is also exposed via this service, perhaps via a payload attribute of the ALF_CREATE_FORM_DIALOG_REQUEST topic.
During my tests and change "liberation" in the context of #958 I noticed that two Aikau web scripts cause errors during web script refreshs (and initial Share startup) due to having URL conflicts with web scripts from an earlier Aikau release.
Broken Web Scripts
03110005 Web Script document org/alfresco/aikau/1.0.61/webscripts/sanitize-response.get.desc.xml is attempting to define the url '/sanitize/response:GET' already defined by org/alfresco/aikau/sanitize-response.get.desc.xml (classpath:alfresco/site-webscripts/org/alfresco/aikau/1.0.61/webscripts/sanitize-response.get.desc.xml)
03110004 Web Script document org/alfresco/aikau/1.0.61/webscripts/sanitize-data.post.desc.xml is attempting to define the url '/sanitize/data:POST' already defined by org/alfresco/aikau/sanitize-data.post.desc.xml (classpath:alfresco/site-webscripts/org/alfresco/aikau/1.0.61/webscripts/sanitize-data.post.desc.xml)
This was found running Alfresco 5.0.3 with a local Aikau 1.0.61 build (from my branch Aikau-958) while 1.0.52 and 1.0.60 JARs were also deployed in the web app. Both 1.0.52 and 1.0.60 include the sanitize-response.get.desc.xml in the same path (without a version identifier) and only the introduction of the version identifier in the path for 1.0.61 now causes the conflict. Previously the (undefined / arbitrary) load order of the classpath prevented this issue. The URL of those web scripts should probably include the version identifier as well to avoid such issues when multiple Aikau JARs are present.
Hi,
I am using the following checkBox widget in the form dialog:
editPropertiesAndAssociations.push({
name: "alfresco/forms/controls/CheckBox",
config: {
name: "prop_" + property.name.replace(type + ":", type + "_"),
label: "{itemData.prop_" + property.name.replace(type + ":", type + "_") +
".displayValue}",
value: "{itemData.prop_" + property.name.replace(type + ":", type + "_") +
".displayValue}"
}
});
If the checkbox config value is value: false
, the dialog checkBox will be in uncheck state its fine but the problem is when I assign value as value: "{itemData.prop_" + property.name.replace(type + ":", type + "_") + ".displayValue}"
then the checkbox is always in check state its doesn't considering the given value and I checke the value of "{itemData.prop_" + property.name.replace(type + ":", type + "_") + ".displayValue}"
by assigning it into lable.
do you have any suggestion.
Thanks
kumar
Hi Dave,
I have customized the search page by creating a new webscript with name Custom Search.
In that page I have added a selector and a select items menu list.
i have also added a service which includes the download functionality
but my functionality is not working as per the requirement
The changes are as follows
I made chenges in
1.The custom-search.js page which is the replace for faceted-search.js
2. CustomSearchResult.js which is the replace for AlfSearchResult.js
3. CustomSearchResult.html which is the replace for AlfSearchResult.html
4.The service file which I'm calling inside the custom-search.js
I made all these made follow the aikau tutorial for UsersAndGroups
Please help me out
I'm trying to execute the chapter 4.
I've added this block of code into the home.get.js file's services section:
{ name: "alfresco/services/LoggingService", config: { loggingPreferences: { enabled: true, all: true } } },
Everything keep working, but I can't see the log message created using this:
this.alfLog("log", "Setting greeting message!");
Hi Dave,
I was following the interesting tutorials but I have an issue with the number 2
https://github.com/Alfresco/Aikau/blob/master/tutorial/chapters/Tutorial2.md
I've checked it several time and everything is correct as explained in there but I don't see the div containing the message.
I'm testing it with alfresco 5.0.c
Any hint?
Regards
Following steps from Tutorial 7, this exception is thrown on accessing http://localhost:8090/aikau-sample/page/ap/ws/users-and-groups
https://issues.alfresco.com/jira/browse/AKU-612 introduced an attempt to manually derive the "Accept-Language" header from the navigator object. Unforunately, this breaks / overrides the correct Accept-Language header already set by some browsers (like IE11) and may introduce incorrect values.
I.e. my system has been installed in locale de_DE but I usually set the browser content language to just en or de. Regardless of what I set in IE 11, Aikau XHR requests always send de-de in Accept-Language. If I override the getDefaultHeaders in my services to delete the custom-constructed value, the Accept-Language header is set by IE and correct.
As far as I could determine from https://msdn.microsoft.com/en-us/library/ms535867%28v=vs.85%29.aspx there is no property in IE navigator object to determine the correct content language as defined by the user. I would prefer CoreXhr not try to "guess" the header value if the browser is already providing it. Otherwise it should be fixed - the simplest (and most likely to be correct) option seems to be to inject the full Accept-Language header value provided in the initial request to the Aikau page as the default value.
This is using Aikau 1.0.51 on Alfresco 5.0.d
I am seeing the in /alfresco/core/Page.js file is referring service/constants/Default javascript, but I could not see the file physically in the Aikau source tree.
Does this file is generated during build? or wrongly referenced in the Page.js file.
Hi Dave,
Could you please explain me the following. I would like to show the tags in the faceted search result page. I am referring to your blogpost: https://www.alfresco.com/blogs/developer/2015/04/01/adding-views-to-filtered-search/.
I did first a test. This works:
var fctSearchRes = widgetUtils.findObject(model.jsonModel, "id", "FCTSRCH_SEARCH_RESULT");
fctSearchRes.config.widgetsBelow = [ {
name : "alfresco/renderers/Property",
config : {
propertyToRender : "description"
}
}];
Now I want to add the tags and I did the following:
var fctSearchRes = widgetUtils.findObject(model.jsonModel, "id", "FCTSRCH_SEARCH_RESULT");
fctSearchRes.config.widgetsBelow = [ {
name : " alfresco/renderers/ReadOnlyTag"
}];
Nothing. Then I did the following:
var fctSearchRes = widgetUtils.findObject(model.jsonModel, "id", "FCTSRCH_SEARCH_RESULT");
fctSearchRes.config.widgetsBelow = [ {
name : "alfresco/renderers/Property",
config : {
propertyToRender : "tags"
}
}];
I get a number, so I looked at the getRenderedProperty function in alfresco/renderers/Property.js. The following explains why I get a number back.
} else if (ObjectTypeUtils.isArray(property)) {
value = property.length;
}
Is this a bug? Is it not better to add something like the following:
for(var i=0; i<property.length; i++){
var object = property[i];
value = value + this.getRenderedProperty(object) + ",";
}
Or is there another way to show the tags properly?
Rick
I have a webscript wich get all the workflow I wan't to show, I want to add args depending on checkbox
var list = {
name: "alfresco/lists/AlfList",
config: {
loadDataPublishTopic: "GET_DATA_WF",
loadDataPublishPayload: {
filtre: checkbox.config.value
},
itemsProperty: "data"
}
};
var checkbox = {
id: "ID_CHECK",
name: "alfresco/forms/controls/DojoCheckBox",
config: {
fieldId: "idCheckboxGroup",
name: "groupFilter",
label: "Groupe",
//description: "",
value: "{value}",
// onChange:
}
};
In my widget (I know this code is wrong but It's for be more clear of what I would like to do)
I'm able to get the valu of the config (like name or even value) but If I change by checking or un-checking my checkbox, value won't change in my logs
onGetData: function wfTab_wfTabFilter__onGetData(payload) {
var url = AlfConstants.PROXY_URI+"wfTab/filter";
var test = lang.getObject("filtre", false, payload);
// var checkboxValue = payload.getValue();
this.alfLog("warn", "value of the checkbox" +checkboxValue);
I am trying to create a custom page in alfresco using Aikau to list and edit dataLists.
I have created a custom dataList, which takes another custom dataList as its association(multiplicity 1:1). This association is mandatory.
I am able to edit the properties of datalist by the help of the webscript "api/{item_kind}/{item_id}/formprocessor" (item_kind = node, item_id = nodeRef). But I am not able to change the associations.
Is there any inbuilt function to edit association?
Thanks in advance.
I'm not sure is it a bug report or feature request, but is it possible to make Breadcrumb trail to show the path to the current directory when reloading the page or returning back to the document library from the document page?
{
name: "alfresco/documentlibrary/AlfBreadcrumbTrail",
config: {
useHash: true
}
},
{
name: "alfresco/documentlibrary/AlfDocumentList",
config: {
rootNode: "alfresco://user/home",
rawData: true,
useHash: true,
widgets: [
{
name: "alfresco/documentlibrary/views/AlfSimpleView"
}
]
}
}
Looks like it should either work in all cases or don't work at all.
Hi Dave,
I have made some changes in search page . All of sudden i see a change in my page which looks similar to Toggle developer view (check in the below screenshot) without apply debug mode. Ca you just help me out with this issue.
Thanks
Anooj
When submitting a form with the fileSelect control the value is published incorrectly;
"files_field": [ {} ]
I have used the example from the unit test (Aikau/aikau/src/test/resources/testApp/WEB-INF/classes/alfresco/site-webscripts/alfresco/forms/controls/FileSelect.get.js); I have tested it against Aikau version 1.0.56.4.
{
id: "STANDARD_FORM",
name: "alfresco/forms/Form",
config: {
okButtonPublishTopic: "PUBLISH_FORM_DATA",
cancelButtonPublishTopic: "CANCEL_FORM_DATA",
widgets: [
{
name: "alfresco/forms/ControlRow",
config: {
widgets: [
{
id: "FILE_SELECT",
name: "alfresco/forms/controls/FileSelect",
config: {
label: "File(s) selector",
name: "files_field",
value: "",
requirementConfig: {
initialValue: true
}
}
},
{
id: "FILE_SELECT",
name: "alfresco/forms/controls/FileSelect",
config: {
label: "File(s) selector (clear on select)",
name: "files_field",
value: "",
recreateControlOnSelect: true,
requirementConfig: {
initialValue: true
}
}
}
]
}
}
]
}
},
{
name: "alfresco/logging/DebugLog"
}
What I've seen so far there is only the publishPayloadType: "CURRENT_ITEM" which works fine on the item in a list.
My goal is to create a button on a AlfSearchList in this case which takes all the results and send it to a repo call and fire an Action.
So what I've done so far:
var widget = widgetUtils.findObject(model.jsonModel.widgets, "id", "FCTSRCH_RESULTS_MENU_BAR");
var action = {
name: "alfresco/buttons/AlfButton",
config: {
label: "DOWNLOAD EVERYTHING",
publishTopic: "ALF_DOWNLOAD_AS_ZIP",
subscriptionTopic: "ALF_SEARCH_REQUEST",
publishPayload: {
documents: "data"
}
}
};
widget.config.widgets.push(action);
So how this button should work in theory is that it should fire Topic ALF_DOWNLOAD_AS_ZIP with the data of ALF_SEARCH_REQUEST.
It would be great if there is an extra predefined publishPayloadType like "ALL_ITEMS".
I tried to build a custom upload progress display (the default one is quite ugly / simplistic) by using alfresco/renderers/Progress as the base and mixin in alfresco/upload/_UploadsDisplayMixin, configuring the widgetsForProgressDialog property on the alfresco/services/UploadService to use the custom progress widget in the dialog. This fails since the "super classes" of alfresco/upload/_UploadsDisplayMixin cause Dojo declare to fail in its super class linearization phase.
Custom widget module (prodyna/upload/SimpleUploadProgress):
define([ 'dojo/_base/declare', 'alfresco/renderers/Progress', 'alfresco/upload/_UploadsDisplayMixin'], function(declare, Progress, UploadsDisplayMixin )
{
return declare([ Progress, _UploadsDisplayMixin ], {/** ... implementation ... */ });
});
(Simplified) page JSON configuration:
model.jsonModel = {services : [{
name : 'alfresco/services/UploadService',
config : {
widgetsForProgressDialog : [ {
name : 'prodyna/upload/SimpleUploadProgress',
assignTo : 'uploadDisplayWidget',
config : {}
} ]
}
}]};
During service initialization, the alfresco_core_CoreWidgetProcessing__processWidgets operation fails when constructing the custom widget with the exception message "declare: can't build consistent linearization"
Since the mixin is "only" supposed to define an interface (JSDoc of the module), it should not include dijit/_WidgetBase nor dijit/_TemplatedMixin as super classes.
This affects Aikau 1.0.51 on Alfresco 5.0.d
Iยดve built a form dialog with a select control inside. I followed https://github.com/Alfresco/Aikau/blob/master/tutorial/chapters/Tutorial8.md#step-5-add-a-user-select-control tutorial but I had to hack to get this working. My control grab data from my own service so iยดve confiured this way:
{
name: "alfresco/forms/controls/Select",
config: {
fieldId: "accountingHouseOptions",
label: "Asesoria",
description: "create_new_business_site.accountingHouseParent.label",
name: "accountingHouseParent",
optionsConfig: {
publishTopic: "ZZ_GET_AVAILABLE_ACCOUNTING_HOUSE_OPTIONS",
publishPayload: {valueSubscriptionTopic: "ZZ_SET_AVAILABLE_ACCOUNTING_HOUSE_OPTIONS"},
labelAttribute: "shortName"
valueAttribute: "shortNameValue"
//valueSubscriptionTopic: "ZZ_SET_AVAILABLE_ACCOUNTING_HOUSE_OPTIONS"
}
}
};
To make this work:
I tried to replace the faceted-search page's title:
var pageTitleWidget = widgetUtils.findObject(model.jsonModel.widgets, "id", "HEADER_TITLE");
if(pageTitleWidget != null){
pageTitleWidget.config.browserTitlePrefix = msg.get("faceted.search.page.custom.title.prefix");
}
This code works, but then I have to repeat the same thing for the search config form, and I guess, for all new pages built with Aikau.
Is there any easier way of doing that? Something like we used to do replacing the property "page.title" ?
Hi,
I customized the share advanced-search-page to be able to search on custom object-types. In the resultpage I created a table view and I want to make the link behind the document-name to open in a new page. According to the documentation, this should be possible (alfresco/services/_NavigationServiceTopicMixin.newTarget) and alfresco/services/NavigationService.navigateToPage
else if (data.target === this.newTarget) { window.open(url); }
However, when you look at alfresco/renderers/_SearchResultLinkMixin.generateSearchLinkPayload the following is hardcoded and not merged with the publishPayload entered while instantiating the widget
var payload = { type: "PAGE_RELATIVE", target: "CURRENT", url: null };
There is no way to overwrite this setting
I don't know why, but I tried to install this project, and I got the error logs below.
That's weird, because it was working yesterday, and it still works for other Alfresco SDK projects without having to "force" java version.
In order to be able to fix it, I had to include this on the pom.xml file:
maven-compiler-plugin
3.2
1.7
user@machine:/Projetos/testes/aikau-client$ mvn install/Projetos/testes/aikau-client$ java -version
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Aikau Client 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.3:resources (default-resources) @ aikau-client ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /home/user/Projetos/testes/aikau-client/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:2.0.2:compile (default-compile) @ aikau-client ---
[INFO] Compiling 8 source files to /home/user/Projetos/testes/aikau-client/target/classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.315s
[INFO] Finished at: Tue Mar 17 09:41:29 BRT 2015
[INFO] Final Memory: 19M/982M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.0.2:compile (default-compile) on project aikau-client: Compilation failure: Compilation failure:
[ERROR] /home/user/Projetos/testes/aikau-client/src/main/java/org/alfresco/AikauServletRequestWrapper.java:[39,15] error: generics are not supported in -source 1.3
[ERROR]
[ERROR](use -source 5 or higher to enable generics)
[ERROR] /home/user/Projetos/testes/aikau-client/src/main/java/org/alfresco/AikauServletRequestWrapper.java:[61,5] error: annotations are not supported in -source 1.3
[ERROR]
[ERROR](use -source 5 or higher to enable annotations)
[ERROR] /home/user/Projetos/testes/aikau-client/src/main/java/org/alfresco/AikauServletRequestWrapper.java:[111,24] error: for-each loops are not supported in -source 1.3
[ERROR]
[ERROR](use -source 5 or higher to enable for-each loops)
[ERROR] /home/user/Projetos/testes/aikau-client/src/main/java/org/alfresco/AikauPageViewResolver.java:[46,5] error: annotations are not supported in -source 1.3
[ERROR]
[ERROR](use -source 5 or higher to enable annotations)
[ERROR] /home/user/Projetos/testes/aikau-client/src/main/java/org/alfresco/AikauLogoutController.java:[65,5] error: annotations are not supported in -source 1.3
[ERROR]
[ERROR](use -source 5 or higher to enable annotations)
[ERROR] /home/user/Projetos/testes/aikau-client/src/main/java/org/alfresco/AikauUser.java:[46,35] error: generics are not supported in -source 1.3
[ERROR]
[ERROR](use -source 5 or higher to enable generics)
[ERROR] /home/user/Projetos/testes/aikau-client/src/main/java/org/alfresco/AikauUser.java:[54,5] error: annotations are not supported in -source 1.3
[ERROR]
[ERROR](use -source 5 or higher to enable annotations)
[ERROR] /home/user/Projetos/testes/aikau-client/src/main/java/org/alfresco/AikauAuthenticationFilter.java:[45,30] error: generics are not supported in -source 1.3
[ERROR]
[ERROR](use -source 5 or higher to enable generics)
[ERROR] /home/user/Projetos/testes/aikau-client/src/main/java/org/alfresco/AikauPageView.java:[82,5] error: annotations are not supported in -source 1.3
[ERROR]
[ERROR](use -source 5 or higher to enable annotations)
[ERROR] /home/user/Projetos/testes/aikau-client/src/main/java/org/alfresco/AikauLoginController.java:[63,5] error: annotations are not supported in -source 1.3
[ERROR]
[ERROR](use -source 5 or higher to enable annotations)
[ERROR] /home/user/Projetos/testes/aikau-client/src/main/java/org/alfresco/AikauLoginController.java:[127,49] error: for-each loops are not supported in -source 1.3
[ERROR]
[ERROR](use -source 5 or higher to enable for-each loops)
[ERROR] /home/user/Projetos/testes/aikau-client/src/main/java/org/alfresco/AikauUserFactory.java:[79,5] error: annotations are not supported in -source 1.3
[ERROR]
[ERROR](use -source 5 or higher to enable annotations)
[ERROR] /home/user/Projetos/testes/aikau-client/src/main/java/org/alfresco/AikauUserFactory.java:[102,67] error: generics are not supported in -source 1.3
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
user@machine:
java version "1.7.0_76"
Java(TM) SE Runtime Environment (build 1.7.0_76-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.76-b04, mixed mode)
user@machine:~/Projetos/testes/aikau-client$ java -version
java version "1.7.0_76"
Java(TM) SE Runtime Environment (build 1.7.0_76-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.76-b04, mixed mode)
Hi,
I configured the ManageAspects action:
name : "alfresco/renderers/PublishAction",
config : {
label : "Manage Aspects",
publishTopic : "ALF_SINGLE_DOCUMENT_ACTION_REQUEST",
publishPayloadType : "PROCESS",
publishPayloadModifiers : [ "processCurrentItemTokens" ],
publishPayload : {
action : "onActionManageAspects",
document : "{node}"
}
}
The dialog will not open because the nodeRef contains '://'. In the ManageAspectsService, the following code is used for node retrieval:
onAspects: function alfresco_services_actions_ManageAspectsService__onAspects(item) {
this.serviceXhr({url: AlfConstants.PROXY_URI + "slingshot/doclib/aspects/node/" + item.nodeRef,
method: "GET",
item: item,
What would be the best way to override the core css so as to bring in sweeping changes (like change fonts for instance) to all widgets?
Hi,
So far, I really like the Aikau framework. Only what I am missing is an easy way to add custom actions (in document list). Like the ActionFormProcessor of Share. Actions makes it very easy to add additional business logic to you're solution. You can add an onActionFormDialog and you can create an action that will send all additional parameters. Is there a way to do this in Aikau? I noticed the onActionSimpleRepoAction in the code. Only this is limited. It provides only the action name and actionedUponNoderef (used for workflow).
Do you support this already? If not, can you provide a sample that illustrates sending the payload information as params to a backend API (to initiate the action)? I don't mind to build the backend myself (that is not the challenging part). But a sample would be great!
Thank you for you're time.
Rick
I have a problem where the value of any form control extended from BaseFormControl does not publish its value once the form widgets have been processed if it is inside the ControlRow widget.
In a form I was working on I wanted to show/hide form controls based upon the value of another control. I noticed the visibilityConfig rules stopped working on the controls placed within the ControlRow. After looking at the pub/sub log I could see that the controls inside the ControlRow were not publishing to the valueChangeOf topic when the page loaded.
After walking through what was happening in the javascript debugger console I have discovered that the BaseFormControl widgets inside the ControlRow create deferred objects with their publishValue: function alfresco_forms_controls_BaseFormControl__publishValue function. However they are never resolved as this occurs after the onWidgetAddedToDocument: function alfresco_forms_controls_BaseFormControl__onWidgetAddedToDocument function is called in which the resolution of the deferredValuePublication property the deferred objects were set to is executed.
The issue seems to come from that the publishChildValue: function alfresco_forms_LayoutMixin__publishChildValue function is called after the child widget has executed the onWidgetAddedToDocument: function alfresco_forms_controls_BaseFormControl__onWidgetAddedToDocument
I have created a test page with the following widgets to demonstrate the issue:
{
name : "alfresco/forms/Form",
config : {
id : "FORM_WITHOUT_CONTROL_ROW",
okButtonPublishTopic : "SAVE_FORM_WITHOUT_CONTROL_ROW",
okButtonLabel : "Save Form 1",
widgets : [
{
name : "alfresco/forms/controls/CheckBox",
config : {
fieldId : "control_a",
name : "control_a",
label : "Control A",
description : "When selected this should show the field Control B",
value : true
}
},
{
name : "alfresco/forms/controls/TextBox",
config : {
fieldId : "control_b",
name : "control_b",
label : "Control B",
description : "This should be shown when check box Control A is checked",
visibilityConfig : {
initialValue : false,
rules : [ {
targetId : "control_a",
is : [ true ]
} ]
}
}
}, {
name : "alfresco/forms/controls/TextBox",
config : {
fieldId : "control_c",
name : "control_c",
label : "Control C"
}
}, {
name : "alfresco/forms/controls/TextBox",
config : {
fieldId : "control_d",
name : "control_d",
label : "Control D"
}
} ]
}
},
{
name : "alfresco/forms/Form",
config : {
id : "FORM_WITH_CONTROL_ROW",
okButtonPublishTopic : "SAVE_FORM_WITH_CONTROL_ROW",
okButtonLabel : "Save Form 2",
widgets : [
{
name : "alfresco/forms/ControlRow",
config : {
title : "Control Row For Controls E & F",
widgets : [
{
name : "alfresco/forms/controls/CheckBox",
config : {
fieldId : "control_e",
name : "control_e",
label : "Control E",
description : "When selected this should show the field Control F",
value : true
}
},
{
name : "alfresco/forms/controls/TextBox",
config : {
fieldId : "control_f",
name : "control_f",
label : "Control F",
description : "This should be shown when check box Control E is checked",
visibilityConfig : {
initialValue : false,
rules : [ {
targetId : "control_e",
is : [ true ]
} ]
}
}
} ]
}
}, {
name : "alfresco/forms/controls/TextBox",
config : {
fieldId : "control_g",
name : "control_g",
label : "Control G"
}
}, {
name : "alfresco/forms/controls/TextBox",
config : {
fieldId : "control_h",
name : "control_h",
label : "Control H"
}
} ]
}
},
{
name : "alfresco/forms/Form",
config : {
id : "FORM_WITH_CONTROL_ROW_ALL_WIDGETS_INSIDE",
okButtonPublishTopic : "SAVE_FORM_WITH_CONTROL_ROW_ALL_WIDGETS_INSIDE",
okButtonLabel : "Save Form 3",
widgets : [ {
name : "alfresco/forms/ControlRow",
config : {
title : "Control Row For Controls I,J,K,L",
widgets : [
{
name : "alfresco/forms/controls/CheckBox",
config : {
fieldId : "control_i",
name : "control_i",
label : "Control I",
description : "When selected this should show the field Control J",
value : true
}
},
{
name : "alfresco/forms/controls/TextBox",
config : {
name : "control_j",
label : "Control J",
description : "This should be shown when check box Control I is checked",
visibilityConfig : {
initialValue : false,
rules : [ {
targetId : "control_i",
is : [ true ]
} ]
}
}
}, {
name : "alfresco/forms/controls/TextBox",
config : {
fieldId : "control_k",
name : "control_k",
label : "Control K"
}
}, {
name : "alfresco/forms/controls/TextBox",
config : {
fieldId : "control_l",
name : "control_l",
label : "Control L"
}
} ]
}
} ]
}
}
I have tested this issue out in Safari 9.1 and Google Chrome 49.0.2623.110
Hi,
Since aikau v1.0.39.5 (Alfresco 5.1.e), I'm facing issues when using AlfDocumentPreview widgets on PDF documents.
Steps to reproduce: (I detect this on my home made aikau page, but it can be reproduced on any aikau page which contains preview widget like faceted page):
1- Open faceted seach share page, and run query returning pdf and office documents ('pdf or xls')
2- Click on the thumbnail widget of the pdf file: open pdf preview, works fine.
3- Click on the thumbnail widget of the xls file: open xls preview, works fine.
4- Click on the thumbnail widget of the pdf file: error.
Since a txt or MSoffice document has been previewed, it is not possible anymore to preview any pdf document (need page reload).
Log output: org.springframework.extensions.webscripts.WebScriptException: 03150001 The content node was not specified so the content cannot be streamed to the client: classpath*:alfresco/templates/webscripts/org/alfresco/repository/thumbnail/thumbnail.get.js)
PdfJs tries to get pdf thumbnail at following url which always return null value : /share/proxy/alfresco/api/node/workspace/SpacesStore/1a0b110f-1e09-4ca2-b367-fe25e4964a4e/content/thumbnails/pdf?c=force&noCache=1460754387703
Using last aikau release (1.0.63), pdf preview are just not loading.....
Any idea ?
Vincent
I've notice that title in html head (<head><title>
) does not display correctly for aikau based pages.
Pages that are "old" Surf pages shows correctly.
For example the search page should show "Sรถk"
in Swedish, but is shown as "Sök"
.
All localisation properties files are encoded for umlauts, and it shows correctly in all other parts of an aikau page.
If needed I can provide you with the Swedish localization amps.
I've tested this with 5.1.c now, but it is the same for 5.0 Community versions as well.
I have tried tutorial #1. I can see the dropzone 'Drop files here to upload to this location' when i drag a file but no upload dialog appears after dropping. And no file is uploaded. I am using Mac OS. My code is here: https://github.com/torstenwerner/aikau-sample
I have used Alfbutton widget in one of my dialog box.
While Initializing the button i have set the disabled property to true.
I need to set the same disabled property to false once I get my response.
Here I have tried by changing widgetsbuttons.config.disabled=false
but my button is not getting enabled any suggestions on how to enable the button
When an AlfList instance is used with a non-empty pubSubScope, the payload of the data load pub will contain both the alfResponseScope set to the pubSubScope and the alfResponseTopic prefixed with the pubSubScope. Any custom service that uses both alfResponseTopic and alfResponseScope to pub a response with the actual data will not reach the AlfList instance due to the effective response publish topic being double-prefixed with the pubSubScope of the AlfList instance.
The full setup to reproduce this is defined in this gist: https://gist.github.com/AFaust/b2b55bfa15eecbd6c7ef
In short, the relevant config / code snippets are
onLoadSimpleList : function test_SimpleListService__onLoadSimpleList(payload)
{
// this response only works for AlfList with an empty pubSubScope
this.alfPublish(payload.alfResponseTopic + '_SUCCESS', {
// this is accessed as fallback - only after payload.response.items failed
items : [/* ... actual items ... */],
// this is not actually mapped by AlfList - only payload.response.metadata is accessed
metadata : {}
}, false, false, payload.alfResponseScope || '');
}
model.jsonModel = {
widgets : [{
name : 'alfresco/lists/AlfList',
config : {
loadDataPublishTopic : 'LOAD_SIMPLE_LIST',
// this causes AlfList not to receive the response from the service
pubSubScope : 'Test',
widgets : [/* ... list views ... */]
}
}]
};
This is using Aikau 1.0.60 on Alfresco 5.0.3
Hi David,
I have followed tutorial 18 but cannot get it to show a page with a preview. The "No Document Details Provided" error message appears if I call the page without the store, id etc.( ie http://localhost:8090/aikau-sample/page/ap/ws/document) but if I call the same page passing in the store id etc, ie http://localhost:8090/aikau-sample/page/ap/ws/document/workspace/SpacesStore/5fa74ad3-9b5b-461b-9df5-de407f1f4fe7 then it just shows a blank page. Do you have the home.js and document.js so I can have a look at where I am going wrong.
Brian
Hi,
just pointing out a typo in the documentation where: Add a new alfresco/layout/HorizontalLayout
into the page and place the alfresco/documentlibrary/AlfDocumentList
as the first widget into the widgets array of its configuration.
The HorizontalLayout
is maybe meant to be HorizontalWidgets
?
Thanks.
in Tutorial6.md
The only truly important line in this file (in the context of Aikau) is the element.
it should be changed into
... the url element.
I'm trying to use some features of your code but, the aikau pages doesn't work on Chrome? In FireFox I open the page and works, but in Chrome doesn't work.
If you set a label configuration for InlineEditProperty you might expect it to behave as it does in Property. It should be rendered right before the value but it doesn't it just doesn't show the label.
It seems to be a trivial issue related to the template used for the widget. Using a custom template like this it works:
<span class="alfresco-renderers-InlineEditProperty ${renderedValueClass}">
<span class="label">${label}</span>
<span data-dojo-attach-point="renderedValueNode" data-dojo-attach-event="onkeypress:onKeyPress,ondijitclick:onClickRenderedValue" class="inlineEditValue ${renderedValueClass}" tabindex="0">${!renderedValue}</span>
<span data-dojo-attach-point="editNode" class="editor hidden" data-dojo-attach-event="onkeypress:onValueEntryKeyPress,onclick:suppressFocusRequest">
<span data-dojo-attach-point="formWidgetNode"></span>
<span class="action save" data-dojo-attach-point="saveLinkNode" data-dojo-attach-event="ondijitclick:onSave" tabindex="0">${saveLabel}</span>
<span class="action cancel" data-dojo-attach-event="ondijitclick:onCancel" tabindex="0">${cancelLabel}</span>
</span>
<img class="editIcon" src="${editIconImageSrc}" alt="${editAltText}" title="${editAltText}" data-dojo-attach-point="editIconNode" data-dojo-attach-event="ondijitclick:onEditClick"/>
</span>
I followed the Tutorial 1-13. It's awesome and gives an opportunity to start working with Aikau. Thank you very much.
But I met one bug (yeh, only one) that I cannot fix. After moving the table with groups to the HorizontalWidgets -> ClassicWindow, the table does not fit the widget. I removed all "widthPc" configurations and I use MacBook, so the width of the screen for websites is 1280px.
As I understand, the problem is that the name of the groups are too long. You had the same default groups in the table in the tutorial (like ALFRESCO_MODEL_ADMINISTRATORS) and the length of the text in the cells was ok for your screen. So the question is:
Is it normal behaviour of the nesting widgets? So if the table is bigger than a block (ClassicWindow), then users will have the same bug that I have? Or is it a way to solve this?
We are creating a custom page using Aikau for custom datalists. We are able to add and remove the custom datalist items. We have been able to provide edit functionality also but only for properties. We are facing problem while editing associations.
In this case associations are other datalist items. To accomplish this we are using edit form dialog and "api/node/{nodeRef}/formprocessor" as formSubmissionPayloadMixin URL. We are rendering "alfresco/forms/controls/DojoSelect" to add the association. Depending on the add form control value attribute we are rendering the form control to remove the association.
renderFilter: [{
target: "",
property: "value",
renderOnAbsentProperty: true,
values: ["no"]
}]
This is the render filter we are using to remove association. If the association is not changed during edit then the remove form control should not be rendered. We are not sure what value to use in the target attribute. We know the add form control widgetId. What could be the value for target attribute?
If I create a new tab in AlfTabContainer using tabAdditionTopic and a tab contains AlfList, then the list is not rendered (shows alflist.no.data.message) until I select another tab and then select again this newly created tab. Any way to solve it?
var tabs = {
name: "alfresco/layout/AlfTabContainer",
config: {
tabSelectionTopic: "SELECT_TAB_TOPIC",
tabDisablementTopic: "DISABLE_TAB_TOPIC",
tabAdditionTopic: "ADD_TAB_TOPIC",
tabDeletionTopic: "DELETE_TAB_TOPIC",
widgets: []
}
};
var newTab = {
widgets: [{
name: "alfresco/lists/AlfList",
title: "Title",
config: {
loadDataPublishTopic: "ALF_CRUD_GET_ALL",
loadDataPublishPayload: {
url: "api/groups?sortBy=displayName&zone=APP.DEFAULT"
},
itemsProperty: "data",
widgets: [{
name: "alfresco/lists/views/AlfListView",
config: {
widgets: [{
name: "alfresco/lists/views/layouts/Row",
config: {
widgets: [{
name: "alfresco/lists/views/layouts/Cell",
config: {
widgets: [{
name: "alfresco/renderers/Property",
config: {
propertyToRender: "displayName"
}
}]
}
}]
}
}]
}
}]
}
}]
};
var AddButton = {
name:"alfresco/buttons/AlfButton",
config: {
label: "Add tab",
publishTopic: "ADD_TAB_TOPIC",
publishPayload: newTab
}
}
This issue is very likely related to the Surf library but since it is encountered solely when using Aikau, I'm filing it here.
When multiple Dojo packages have been configured in a way where the source location of a package A is prefixed with the name of another package B, any widgets / services of package A referenced in JSON model will not work as their source code is not contained in the aggregated JS file. As far as I was able to determine via debugging, this is the result of a second, redundant package mapping process.
<config evaluator="string-compare" condition="WebFramework">
<web-framework>
<dojo-pages>
<packages>
<!-- a package mapping ending in a location prefixed by another package name is problematic -->
<package name="A" location="B/path/to/files" />
<package name="B" location="js/B/path/to/files" />
</packages>
</dojo-pages>
</web-framework>
</config>
model.jsonModel = { widgets : [{name : 'A/moduleId'}] /* ... */ };
During dependency collection, the DojoDependencyHandler.getPath(String, String) operation is called to resolve a (potentially relative) module ID to the source path of the JS (or CSS, HTML, properties) file.
While outputting the aggregated dependency source, the DojoDependencyHandler.getPath(String, String) operation is called again with the already resolved source path. When the first folder in the path happens to be a name of a Dojo package, that packages location is prefixed to the already resolved path.
The result of this redundant mapping of package locations is that the DojoDependencyHandler.outputDependency(String, String, DojoDependencies) operation can't find a resource input stream for the invalid path and returns the String "null", which will be output as the "source" of the module. The output in the aggregated JS file looks like this
'A/moduleId':function(){
null},
I have compiled a set of test files in the following gist: https://gist.github.com/AFaust/f1c3930c336a33e6fcb8
This was found in 5.0.d using Aikau 1.0.51 but appears to also be present in 5.0.3 (which might have had newer Spring libraries).
The example of course is using a constructed constellation, but we have actually arrived naturally in a such a situation with two separate, independant modules. Our Aikau library module defines a package "prodyna" with a location "js/prodyna" (using common Aikau root path) while our Enhanced Search module (predating Aikau and faceted search page) now defines a package "enhanced-search" with location "prodyna/enhanced-search/dojo" for a custom SearchBox widget. The location was chosen to keep all source files relating to that module in one distinct root.
A workaround exists by simply refactoring the module packages structures, but a long term solution should prevent accidental conflicts with modules not under the control of a customer / developer.
Step 5 in Tutorial17 describes a shortcut for displaying the preview. But there is a side effect: documents that needs a transformation for previewing e.g. powerpoint are no longer previewed. A download link is displayed instead. I do not know if it is a bug or the intended behavior of this shortcut.
Hey there,
I am currently using the "alfresco/services/LoggingService" to log client side activity.
As you must know, client-side logging can be a performance pit even if you setup log filters, so sometimes I need to deactivate logging on all pages. I can of course rely on maven profiles to setup my logging preference during build and then I will need to redeploy my webapp, but it would be really nice if I could configure :
in a property file
Aikau 1.0.39.5 + Alfresco 5.1.e.
I try to add a text field with autocomplete (or something like that) to the form dialog to select users.
The following control works good:
{
name: "alfresco/forms/controls/Select",
config: {
fieldId: "select1",
label: "Select a person",
name: "select1",
optionsConfig: {
publishTopic: "ALF_GET_FORM_CONTROL_OPTIONS",
publishPayload: {
url: AlfConstants.PROXY_URI + "api/people",
itemsAttribute: "people",
labelAttribute: "userName",
valueAttribute: "userName"
}
}
}
}
So I suggest that FilteringSelect and MultiSelectInput should work in similar way, but they don't:
{
name: "alfresco/forms/controls/FilteringSelect",
config: {
fieldId: "people1",
name: "people1",
label: "People",
optionsConfig: {
queryAttribute: "value",
publishTopic: "ALF_GET_FORM_CONTROL_OPTIONS",
publishPayload: {
url: AlfConstants.PROXY_URI + "api/people",
itemsAttribute: "people",
labelAttribute: "userName",
valueAttribute: "userName"
}
}
}
}, {
name: "alfresco/forms/controls/MultiSelectInput",
config: {
label: "people2",
name: "people2",
optionsConfig: {
queryAttribute: "label",
publishTopic: "ALF_GET_FORM_CONTROL_OPTIONS",
publishPayload: {
url: AlfConstants.PROXY_URI + "api/people",
itemsAttribute: "people",
labelAttribute: "userName",
valueAttribute: "userName"
}
}
}
}
FilteringSelect does not show any suggestions and always shows "The value entered in not valid", but request is sent and correct response is returned from the repository
MultiSelectInput does not even sending request and shows "Loading" all the time:
Any ideas what to do with it? Usually I think that I do something incorrectly, but in this time Axel Faust said that it may be a bug. I copy the discussion from IRC here, maybe it can help:
I found why all of the widgets using ServiceStore won't work with the OptionsService (and potentially other services to load options). A bug has been introduced when some cloud related changes were included back in October. The change in question is 9f082b7#diff-ef5813a119e4ee7498950e45fb286a95R395. This causes an early response (the progress pub) to the pubSub from ServiceStore providing the raw, unprocessed options. ServiceStore then unsubcribes and does not receive the actual pub payload from the OptionsService with the processed options.
Hi!
We'd like to show Alfresco Content as part of our IBM Connections social intranet since our Alfresco one service is much more accepted for enterprise sync and share than the ESN is although the features are quite similar. So we'd use the generic html widget which allows us to embed any web page into an iframe inside connections.
I could make an iframe with src=.../webdav/... show the library content but that is ugly.
We'd prefeer to show the share library as full window like it is possible in share. Is there any URL parameter to call that view in an iframe? Would you say this is a good or a bad idea?
Or should we go deeper and develop our own pages for that purpose? (Would better like to stay on the standard pages for maintenance reasons)
iframe on full window tile view;
We'd like to use the last one within our social intranet.
Can you provide some link information on how this can be the best solution for that?
Thank you in advance!
Form controls, that are inside a ControlRow, that are in a Form, that have been created in a Dialog using ALF_CREATE_DIALOG_REQUEST will not initially publish their value to the valueChangeOf topic unless the Forms config has the the property "value:{}".
I came across this as we are creating a dialog that contains a DynamicForm that is updated by a select control in the same dialog window. I noticed that only the controls not inside ControlRows were publishing to the valueChangeOf topic.
A Form without the "value:{}" set but just on the page seems to work fine.
As a work around I have just included "value:{}" in the Form config
Here is an example demonstrating the behaviour. If you filter the PubSub log by valueChangeOf you will see Control C does not publish its value:
{
name : "alfresco/forms/Form",
config : {
widgets : [ {
name : "alfresco/forms/ControlRow",
config : {
title : "Control Row 1",
widgets : [ {
name : "alfresco/forms/controls/TextBox",
config : {
fieldId : "control_a",
name : "control_a",
label : "Control A"
}
} ]
}
}, {
name : "alfresco/forms/controls/TextBox",
config : {
fieldId : "control_b",
name : "control_b",
label : "Control B"
}
} ]
}
}, {
name : "alfresco/buttons/AlfButton",
config : {
label : "Show Form",
publishTopic : "ALF_CREATE_DIALOG_REQUEST",
publishPayload : {
dialogId : "DIALOG",
dialogTitle : "DIALOG FORM WITH CONTROL ROW",
widgetsContent : [ {
name : "alfresco/forms/Form",
config : {
//value : {},
widgets : [ {
name : "alfresco/forms/ControlRow",
config : {
title : "Control Row 2",
widgets : [ {
name : "alfresco/forms/controls/TextBox",
config : {
fieldId : "control_c",
name : "control_c",
label : "Control C"
}
} ]
}
}, {
name : "alfresco/forms/controls/TextBox",
config : {
fieldId : "control_d",
name : "control_d",
label : "Control D"
}
} ]
}
} ],
widgetsButtons : [ {
name : "alfresco/buttons/AlfButton",
config : {
label : "Close dialog",
publishTopic : "CUSTOM_TOPIC"
}
} ]
}
}
}, {
name : "alfresco/buttons/AlfButton",
config : {
label : "Show Form with value : {}",
publishTopic : "ALF_CREATE_DIALOG_REQUEST",
publishPayload : {
dialogId : "DIALOG",
dialogTitle : "DIALOG FORM WITH CONTROL ROW",
widgetsContent : [ {
name : "alfresco/forms/Form",
config : {
value : {},//Addition of this property means that Control e will now have its value published to the _valueChangeOf_ topic when the form is loaded
widgets : [ {
name : "alfresco/forms/ControlRow",
config : {
title : "Control Row 3",
widgets : [ {
name : "alfresco/forms/controls/TextBox",
config : {
fieldId : "control_e",
name : "control_e",
label : "Control E"
}
} ]
}
}, {
name : "alfresco/forms/controls/TextBox",
config : {
fieldId : "control_f",
name : "control_f",
label : "Control F"
}
} ]
}
} ],
widgetsButtons : [ {
name : "alfresco/buttons/AlfButton",
config : {
label : "Close dialog",
publishTopic : "CUSTOM_TOPIC"
}
} ]
}
}
}, {
name : "alfresco/buttons/AlfButton",
config : {
label : "Show Form Dialog",
publishTopic : "ALF_CREATE_FORM_DIALOG_REQUEST",
publishPayload : {
dialogId : "FORM_DIALOG",
dialogTitle : "FORM DIALOG WITH CONTROL ROW",
formSubmissionTopic : "SAVE_FORM_4",
widgets : [ {
name : "alfresco/forms/ControlRow",
config : {
title : "Control Row 4",
widgets : [ {
name : "alfresco/forms/controls/TextBox",
config : {
fieldId : "control_g",
name : "control_g",
label : "Control G"
}
} ]
}
}, {
name : "alfresco/forms/controls/TextBox",
config : {
fieldId : "control_h",
name : "control_h",
label : "Control H"
}
} ]
}
}
},{
name: "alfresco/logging/DebugLog"
}
This was tested against version 1.0.62
I was starting the tuto on my debian alfresco server when i got the same error as in this thread, it was fixed the same way, just by adding
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>`
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.