From 8c049124135e95a9b6c259d5282146103fd66dcf Mon Sep 17 00:00:00 2001 From: cdujeu Date: Wed, 15 Feb 2017 10:18:32 +0100 Subject: [PATCH] React 15 migration fixes MaterialUI legacy & recent now coexist in the application, start using new elements Start moving js out of the manifests --- core/src/plugins/access.fs/Gruntfile.js | 34 ++ core/src/plugins/access.fs/fsActions.xml | 564 +----------------- core/src/plugins/access.fs/manifest.xml | 1 + core/src/plugins/access.fs/package.json | 18 + .../src/plugins/access.fs/res/js/FSActions.js | 545 +++++++++++++++++ .../action.share/res/react/ShareDialog.js | 6 +- .../plugins/core.ajaxplorer/ajxp_registry.xsd | 3 + core/src/plugins/gui.ajax/Gruntfile.js | 15 +- core/src/plugins/gui.ajax/package.json | 49 +- .../gui.ajax/res/js/es6/model/Action.es6 | 54 +- .../gui.ajax/res/js/es6/util/LangUtils.es6 | 20 + .../gui.ajax/res/js/ui/reactjs/jsx/ReactUI.js | 17 +- .../res/js/ui/reactjs/jsx/UsersCompleter.js | 6 +- .../res/js/ui/reactjs/jsx/WSComponents.js | 109 +++- .../gui.ajax/res/js/vendor/nodejs/export.js | 7 +- .../res/js/vendor/nodejs/export.legacy.js | 7 +- 16 files changed, 846 insertions(+), 609 deletions(-) create mode 100644 core/src/plugins/access.fs/Gruntfile.js create mode 100644 core/src/plugins/access.fs/package.json create mode 100644 core/src/plugins/access.fs/res/js/FSActions.js diff --git a/core/src/plugins/access.fs/Gruntfile.js b/core/src/plugins/access.fs/Gruntfile.js new file mode 100644 index 0000000000..0a169cc15e --- /dev/null +++ b/core/src/plugins/access.fs/Gruntfile.js @@ -0,0 +1,34 @@ +module.exports = function(grunt) { + grunt.initConfig({ + babel: { + options: {}, + + dist: { + files: [ + { + expand: true, + cwd: 'res/js/', + src: ['**/*.js'], + dest: 'res/build/', + ext: '.js' + } + ] + } + }, + watch: { + js: { + files: [ + "res/**/*" + ], + tasks: ['babel'], + options: { + spawn: false + } + } + } + }); + grunt.loadNpmTasks('grunt-babel'); + grunt.loadNpmTasks('grunt-contrib-watch'); + grunt.registerTask('default', ['babel']); + +}; diff --git a/core/src/plugins/access.fs/fsActions.xml b/core/src/plugins/access.fs/fsActions.xml index c0ab356561..db4ce7d0c8 100644 --- a/core/src/plugins/access.fs/fsActions.xml +++ b/core/src/plugins/access.fs/fsActions.xml @@ -14,21 +14,6 @@ write="false" adminOnly="false"> - 0){ - path = window.actionArguments[0]; - if(Object.isString(path)){path = new AjxpNode(path,false,getBaseName(path));} - }else{ - var userSelection = pydio.getUserSelection(); - if(userSelection && userSelection.isUnique() && (userSelection.hasDir() || userSelection.hasMime("AJXP_MIMES_ZIP".split(",")))){ - path = userSelection.getUniqueNode(); - } - } - if(path){ - pydio.updateContextData(path); - } - ]]> @@ -59,26 +44,7 @@ - +
AJXP_MESSAGE[173]
@@ -99,20 +65,7 @@ - +
AJXP_MESSAGE[174]
@@ -132,57 +85,7 @@ - + @@ -201,15 +104,7 @@ - + AJXP_MESSAGE[177] @@ -226,38 +121,8 @@ - - +
AJXP_MESSAGE[119]

@@ -267,26 +132,8 @@ ]]> -
- +
+ @@ -301,21 +148,8 @@ - - + + @@ -336,52 +170,14 @@ - + AJXP_MESSAGE[315]
]]>
- +
@@ -393,10 +189,7 @@ - + @@ -449,10 +242,7 @@ ]]> - + @@ -463,35 +253,7 @@ - 0){ - url = url.substring(0, url.indexOf('#')); - } - if(url.indexOf('?') > 0){ - url = url.substring(0, url.indexOf('?')); - } - var repoId = pydio.repositoryId || (pydio.user ? pydio.user.activeRepository : null); - if(pydio.user){ - var slug = pydio.user.repositories.get(repoId).getSlug(); - if(slug) repoId = slug; - } - link = url + '?goto=' + repoId + encodeURIComponent(pydio.getUserSelection().getUniqueNode().getPath()); - input.value = link; - var email = oForm.down('a[id="email"]'); - if (email){ - email.setAttribute('href', 'mailto:unknown@unknown.com?Subject=UPLOAD&Body='+encodeURIComponent(link)); - } - input.select(); - }; - modal.showDialogForm('Get', 'ajxp_link_form', loadFunc, function(){ - hideLightBox(true); - return false; - }, null, true); - ]]> +
@@ -559,23 +321,10 @@ - - - - + + + + @@ -587,46 +336,7 @@ - {callback(n, value);}}); - if((!res || res[0] !== true) && n.getParent()){ - n.getParent().notify("child_node_action", {type:"prompt-rename", child:n, callback:(value)=>{callback(n, value);}}); - } - } - } - ]]> + @@ -648,69 +358,7 @@ - + @@ -723,32 +371,7 @@ ]]> - + @@ -764,68 +387,7 @@ - + @@ -843,25 +405,7 @@ - + @@ -881,23 +425,7 @@ - + ]]> @@ -928,47 +456,7 @@ - '+MessageHash[401]+''+MessageHash[402]+''); - dObject.insert({before:'\ -
\ - '+MessageHash[400]+' \ - OK\ -
\ - '}); - $("dl_form_submit").observe("click", function(e){ - Event.stop(e); - var conn = new Connexion(); - conn.addParameter("get_action", "prepare_chunk_dl"); - conn.addParameter("chunk_count", $("chunk_count").value ); - conn.addParameter("file", userSelection.getUniqueNode().getPath()); - var downloader = new MultiDownloader(dObject, ''); - conn.onComplete = function(transp){ - var chunkData = transp.responseJSON; - downloader.setDownloadUrl(ajxpServerAccessPath+'&action=download_chunk&file_id='+chunkData.file_id); - downloader.triggerEnd = function(){hideLightBox();}; - for(var i=0; i
+
AJXP_MESSAGE[119]

diff --git a/core/src/plugins/access.fs/manifest.xml b/core/src/plugins/access.fs/manifest.xml index 02977780f2..bd7efbf7d9 100644 --- a/core/src/plugins/access.fs/manifest.xml +++ b/core/src/plugins/access.fs/manifest.xml @@ -3,6 +3,7 @@ + diff --git a/core/src/plugins/access.fs/package.json b/core/src/plugins/access.fs/package.json new file mode 100644 index 0000000000..2b58abefa1 --- /dev/null +++ b/core/src/plugins/access.fs/package.json @@ -0,0 +1,18 @@ +{ + "name": "access.fs", + "version": "8.0.0", + "description": "Standard FS actions", + "source_path": "res/js", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Abstrium SAS", + "license": "agpl", + "devDependencies": {}, + "dependencies": { + "grunt": "^1.0.1", + "grunt-babel": "^6.0.0", + "grunt-contrib-watch": "^1.0.0" + } +} diff --git a/core/src/plugins/access.fs/res/js/FSActions.js b/core/src/plugins/access.fs/res/js/FSActions.js new file mode 100644 index 0000000000..d86c70151f --- /dev/null +++ b/core/src/plugins/access.fs/res/js/FSActions.js @@ -0,0 +1,545 @@ +(function(global){ + + let pydio = global.pydio; + + class Callbacks { + + static mkdir(){ + pydio.UI.modal.showDialogForm('Create', 'mkdir_form', function(form){ + if(form.down('a.create_file_alt_link')){ + form.down('a.create_file_alt_link').observe('click', function(){ + pydio.getController().fireAction('mkfile'); + }); + } + }, function(){ + var oForm = $(pydio.UI.modal.getForm()); + var elementToCheck=(oForm['dirname']); + if(pydio.getContextHolder().fileNameExists($(elementToCheck).getValue())) + { + alert(MessageHash[125]); + return false; + } + PydioApi.getClient().submitForm(oForm); + hideLightBox(true); + return false; + }); + } + + static mkfile(){ + pydio.UI.modal.showDialogForm('Create', 'mkfile_form', null, function(){ + var oForm = $(pydio.UI.modal.getForm()); + var elementToCheck=(oForm['filename']); + if(pydio.getContextHolder().fileNameExists($(elementToCheck).getValue())) + { + alert(MessageHash[125]); + return false; + } + PydioApi.getClient().submitForm(oForm); + hideLightBox(true); + return false; + }); + } + + static rename(){ + if(pydio.getUserSelection()){ + var orig = pydio.getUserSelection().getSelectionSource(); + } + var callback = function(node, newValue){ + if(!node) node = pydio.getUserSelection().getUniqueNode(); + var filename = node.getPath(); + var conn = new Connexion(); + conn.addParameter('get_action', 'rename'); + conn.addParameter('file', filename); + conn.addParameter('filename_new', newValue); + conn.onComplete = function(transport){ + PydioApi.getClient().parseXmlMessage(transport.responseXML); + if(orig && pydio.getUserSelection()){ + pydio.getUserSelection().setSelectionSource(orig); + } + }; + conn.sendAsync(); + }; + var found = false; + if(pydio.getUserSelection() && pydio.getUserSelection().getSelectionSource() && pydio.getUserSelection().getSelectionSource().switchCurrentLabelToEdition) { + pydio.getUserSelection().getSelectionSource().switchCurrentLabelToEdition(callback); + found = true; + }else{ + var test = pydio.UI._focusables.detect(function(obj){return obj.hasFocus;}); + if (test && test.switchCurrentLabelToEdition){ + test.switchCurrentLabelToEdition(callback); + found = true; + } + } + if(!found){ + var n = pydio.getUserSelection().getSelectedNodes()[0]; + if(n){ + let res = n.notify("node_action", {type:"prompt-rename", callback:(value)=>{callback(n, value);}}); + if((!res || res[0] !== true) && n.getParent()){ + n.getParent().notify("child_node_action", {type:"prompt-rename", child:n, callback:(value)=>{callback(n, value);}}); + } + } + } + } + + static copy(){ + + if(pydio.user){ + var user = pydio.user; + var activeRepository = user.getActiveRepository(); + } + var context = pydio.getController(); + var onLoad = function(oForm){ + var getAction = oForm.select('input[name="get_action"]')[0]; + getAction.value = 'copy'; + this.treeSelector = new TreeSelector(oForm, { + nodeFilter : function(ajxpNode){ + return (!ajxpNode.isLeaf() && !ajxpNode.hasMetadataInBranch("ajxp_readonly", "true")); + } + }); + if(user && user.canCrossRepositoryCopy() && user.hasCrossRepositories()){ + var firstKey ; + var reposList = new Hash(); + ProtoCompat.map2hash(user.getCrossRepositories()).each(function(pair){ + if(!firstKey) firstKey = pair.key; + reposList.set(pair.key, pair.value.getLabel()); + }.bind(this)); + if(!user.canWrite()){ + var nodeProvider = new RemoteNodeProvider(); + nodeProvider.initProvider({tmp_repository_id:firstKey}); + var rootNode = new AjxpNode("/", false, MessageHash[373], "folder.png", nodeProvider); + this.treeSelector.load(rootNode); + }else{ + this.treeSelector.load(); + } + this.treeSelector.setFilterShow(true); + reposList.each(function(pair){ + this.treeSelector.appendFilterValue(pair.key, pair.value); + }.bind(this)); + if(user.canWrite()) this.treeSelector.appendFilterValue(activeRepository, "<"+MessageHash[372]+">", 'top'); + this.treeSelector.setFilterSelectedIndex(0); + this.treeSelector.setFilterChangeCallback(function(e){ + var externalRepo = this.filterSelector.getValue(); + var nodeProvider = new RemoteNodeProvider(); + nodeProvider.initProvider({tmp_repository_id:externalRepo}); + this.resetAjxpRootNode(new AjxpNode("/", false, MessageHash[373], "folder.png", nodeProvider)); + }); + }else{ + this.treeSelector.load(); + } + }.bind(context); + var onCancel = function(){ + this.treeSelector.unload(); + hideLightBox(); + }.bind(context); + var onSubmit = function(){ + var oForm = modal.getForm(); + var getAction = oForm.select('input[name="get_action"]')[0]; + var selectedNode = this.treeSelector.getSelectedNode(); + if(activeRepository && this.treeSelector.getFilterActive(activeRepository)){ + getAction.value = "cross_copy" ; + } + pydio.getUserSelection().updateFormOrUrl(oForm); + this.submitForm(oForm); + this.treeSelector.unload(); + hideLightBox(); + }.bind(context); + modal.showDialogForm('Move/Copy', 'copymove_form', onLoad, onSubmit, onCancel); + + } + + static move(){ + var context = pydio.getController(); + if(pydio.user){ + var user = pydio.user; + var activeRepository = user.getActiveRepository(); + } + var context = pydio.getController(); + var onLoad = function(oForm){ + var getAction = oForm.select('input[name="get_action"]')[0]; + getAction.value = 'move'; + this.treeSelector = new TreeSelector(oForm, { + nodeFilter : function(ajxpNode){ + return (!ajxpNode.isLeaf() && !ajxpNode.hasMetadataInBranch("ajxp_readonly", "true")); + } + }); + this.treeSelector.load(); + if(!pydio.getUserSelection().hasDir() && user && user.canCrossRepositoryCopy() && user.hasCrossRepositories()){ + this.treeSelector.setFilterShow(true); + ProtoCompat.map2hash(user.getCrossRepositories()).each(function(pair){ + this.treeSelector.appendFilterValue(pair.key, pair.value.getLabel()); + }.bind(this)); + this.treeSelector.appendFilterValue(activeRepository, "<"+MessageHash[372]+">", 'top'); + this.treeSelector.setFilterSelectedIndex(0); + this.treeSelector.setFilterChangeCallback(function(e){ + var externalRepo = this.filterSelector.getValue(); + var nodeProvider = new RemoteNodeProvider(); + nodeProvider.initProvider({tmp_repository_id:externalRepo}); + this.resetAjxpRootNode(new AjxpNode("/", false, MessageHash[373], "folder.png", nodeProvider)); + }); + } + }.bind(context); + var onCancel = function(){ + this.treeSelector.unload(); + hideLightBox(); + }.bind(context); + var onSubmit = function(){ + var oForm = modal.getForm(); + var getAction = oForm.down('input[name="get_action"]'); + var selectedNode = this.treeSelector.getSelectedNode(); + if(!this.treeSelector.getFilterActive(activeRepository) && selectedNode == pydio.getContextNode().getPath()){ + alert(MessageHash[183]); + return false; + } + pydio.getUserSelection().updateFormOrUrl(oForm); + if(activeRepository && this.treeSelector.getFilterActive(activeRepository)){ + getAction.value = "cross_copy" ; + var subAction = new Element('input', {type:'hidden',name:'moving_files',value:'true'}); + oForm.insert(subAction); + this.submitForm(oForm, false, function(transport){ + var res = this.parseXmlMessage(transport.responseXML); + if(!res) return; + + pydio.fireContextRefresh(); + }.bind(this)); + }else{ + this.submitForm(oForm); + } + this.treeSelector.unload(); + hideLightBox(); + }.bind(context); + modal.showDialogForm('Move/Copy', 'copymove_form', onLoad, onSubmit, onCancel); + + } + + static deleteAction(){ + var onLoad = function(oForm){ + var message = MessageHash[177]; + var repoHasRecycle = pydio.getContextHolder().getRootNode().getMetadata().get("repo_has_recycle"); + if(repoHasRecycle && pydio.getContextNode().getAjxpMime() != "ajxp_recycle"){ + message = MessageHash[176]; + } + $(oForm).getElementsBySelector('span[id="delete_message"]')[0].innerHTML = message; + }; + modal.showDialogForm('Delete', 'delete_form', onLoad, function(){ + var oForm = modal.getForm(); + pydio.getUserSelection().updateFormOrUrl(oForm); + PydioApi.getClient().submitForm(oForm, true, function(transport){ + var result = PydioApi.getClient().parseXmlMessage(transport.responseXML); + }.bind(pydio.getController())); + hideLightBox(true); + return false; + }); + } + + static chmod(){ + var userSelection = pydio.getUserSelection(); + var loadFunc = function(oForm){ + pydio.getController().propertyPane = new PropertyPanel(userSelection, oForm); + }; + var completeFunc = function(){ + if(!pydio.getController().propertyPane.valueChanged()){ + hideLightBox(); + return false; + } + userSelection.updateFormOrUrl(modal.getForm()); + PydioApi.getClient().submitForm(modal.getForm()); + hideLightBox(); + return false; + }; + modal.showDialogForm('Edit Online', 'properties_box', loadFunc, completeFunc); + } + + static upload(manager, uploaderArguments){ + var uploaders = pydio.Registry.getActiveExtensionByType("uploader"); + uploaders.sort(function(objA, objB){ + return objA.order - objB.order; + }); + if(!uploaders.length) return; + + let uploader; + if(uploaderArguments && uploaderArguments.length) { + uploader = uploaderArguments[0]; + }else{ + uploader = uploaders[0]; + } + if(pydio.getController().getActionByName("trigger_remote_copy")){ + pydio.UI.modal.setCloseAction(function(){ + pydio.fireContextRefresh(); + PydioApi.getClient().request({get_action:'trigger_remote_copy'}); + }); + } + if(uploader.dialogOnOpen){ + uploader.resourcesManager.load(); + var dialogOnOpen = new Function("oForm", uploader.dialogOnOpen); + } + if(uploader.dialogOnComplete){ + uploader.resourcesManager.load(); + var dialogOnComplete = new Function("oForm", uploader.dialogOnComplete); + pydio.UI.modal.setCloseAction(dialogOnComplete); + } + var dialogOpen = function(form){ + if (form.down('#uploader_chooser')) form.down('#uploader_chooser').remove(); + var chooser = new Element('div', {id:'uploader_chooser'}); + form.insert({top:chooser}); + var chooserList = new Element('ul'); + chooser.insert(chooserList); + uploaders.each(function(up){ + var label = up.xmlNode.getAttribute("label"); + var desc = up.xmlNode.getAttribute("description") + var item = new Element('li', {title:desc}).update(label).observe("click", function(){ + pydio.getController().fireAction("upload", up); + }); + if(up == uploader) item.addClassName('current'); + chooserList.insert(item); + }); + if(uploader.dialogOnOpen){ + uploader.resourcesManager.load(); + var dialogOnOpen = new Function("oForm", uploader.dialogOnOpen); + dialogOnOpen(form); + } + }; + pydio.UI.modal.showDialogForm('Upload', uploader.formId, dialogOpen, null, dialogOnComplete, true, true); + + } + + static download(){ + var userSelection = pydio.getUserSelection(); + if(( userSelection.isUnique() && !userSelection.hasDir() ) || pydio.Parameters.get('multipleFilesDownloadEnabled')) + { + if(window.gaTrackEvent){ + var fileNames = userSelection.getFileNames(); + for(var i=0; i'+MessageHash[401]+''+MessageHash[402]+''); + dObject.insert({before:'\ +
\ + '+MessageHash[400]+' \ + OK\ +
\ + '}); + $("dl_form_submit").observe("click", function(e){ + Event.stop(e); + var conn = new Connexion(); + conn.addParameter("get_action", "prepare_chunk_dl"); + conn.addParameter("chunk_count", $("chunk_count").value ); + conn.addParameter("file", userSelection.getUniqueNode().getPath()); + var downloader = new MultiDownloader(dObject, ''); + conn.onComplete = function(transp){ + var chunkData = transp.responseJSON; + downloader.setDownloadUrl(ajxpServerAccessPath+'&action=download_chunk&file_id='+chunkData.file_id); + downloader.triggerEnd = function(){hideLightBox();}; + for(var i=0; i 0){ + url = url.substring(0, url.indexOf('#')); + } + if(url.indexOf('?') > 0){ + url = url.substring(0, url.indexOf('?')); + } + var repoId = pydio.repositoryId || (pydio.user ? pydio.user.activeRepository : null); + if(pydio.user){ + var slug = pydio.user.repositories.get(repoId).getSlug(); + if(slug) repoId = slug; + } + link = url + '?goto=' + repoId + encodeURIComponent(pydio.getUserSelection().getUniqueNode().getPath()); + input.value = link; + var email = oForm.down('a[id="email"]'); + if (email){ + email.setAttribute('href', 'mailto:unknown@unknown.com?Subject=UPLOAD&Body='+encodeURIComponent(link)); + } + input.select(); + }; + modal.showDialogForm('Get', 'ajxp_link_form', loadFunc, function(){ + hideLightBox(true); + return false; + }, null, true); + } + + } + + class Listeners { + + static downloadSelectionChange(){ + + var userSelection = pydio.getUserSelection(); + if(window.zipEnabled && window.multipleFilesDownloadEnabled){ + if((userSelection.isUnique() && !userSelection.hasDir()) || userSelection.isEmpty()){ + this.setIconSrc('download_manager.png'); + }else{ + this.setIconSrc('accessories-archiver.png'); + } + }else if(userSelection.hasDir()){ + this.selectionContext.dir = false; + } + } + + static downloadAllInit(){ + + if(!pydio.Parameters.get('zipEnabled') || !pydio.Parameters.get('multipleFilesDownloadEnabled')){ + this.hide(); + pydio.Controller.actions["delete"]("download_all"); + } + + } + + static compressUiSelectionChange(){ + var userSelection = pydio.getUserSelection(); + if(!window.zipEnabled || !window.multipleFilesDownloadEnabled){ + if(userSelection.isUnique()) this.selectionContext.multipleOnly = true; + else this.selectionContext.unique = true; + } + } + + static copyContextChange(){ + + this.rightsContext.write = true; + var pydioUser = pydio.user; + if(pydioUser && pydioUser.canRead() && pydioUser.canCrossRepositoryCopy() && pydioUser.hasCrossRepositories()){ + this.rightsContext.write = false; + if(!pydioUser.canWrite()){ + pydio.getController().defaultActions['delete']('ctrldragndrop'); + pydio.getController().defaultActions['delete']('dragndrop'); + } + } + if(pydioUser && pydioUser.canWrite() && pydio.getContextNode().hasAjxpMimeInBranch("ajxp_browsable_archive")){ + this.rightsContext.write = false; + } + if(pydio.getContextNode().hasAjxpMimeInBranch("ajxp_browsable_archive")){ + this.setLabel(247, 248); + this.setIconSrc('ark_extract.png'); + }else{ + this.setLabel(66, 159); + this.setIconSrc('editcopy.png'); + } + } + } + + let ns = global.FSActions || {}; + ns.Callbacks = Callbacks; + ns.Listeners = Listeners; + global.FSActions = ns; + +})(window); \ No newline at end of file diff --git a/core/src/plugins/action.share/res/react/ShareDialog.js b/core/src/plugins/action.share/res/react/ShareDialog.js index b52b9a1a21..5b8db00717 100644 --- a/core/src/plugins/action.share/res/react/ShareDialog.js +++ b/core/src/plugins/action.share/res/react/ShareDialog.js @@ -335,7 +335,7 @@ hideMenu: function(event){ if(event && ( event.target.hasClassName('mui-icon-button') || event.target.up('.mui-icon-button'))){ var tg = event.target.hasClassName('mui-icon-button') ? event.target : event.target.up('.mui-icon-button'); - if(this.refs["menuButton"] && tg == this.refs["menuButton"].getDOMNode()){ + if(this.refs["menuButton"] && tg == ReactDOM.findDOMNode(this.refs["menuButton"])){ return; } } @@ -913,7 +913,7 @@ attachClipboard: function(){ this.detachClipboard(); if(this.refs['copy-button']){ - this._clip = new Clipboard(this.refs['copy-button'].getDOMNode(), { + this._clip = new Clipboard(this.refs['copy-button'], { text: function(trigger) { return this.props.linkData['public_link']; }.bind(this) @@ -1207,7 +1207,7 @@ expDate.setDate(today.getDate() + parseInt(expirationDateValue)); var clearValue = function(){ this.props.shareModel.setExpirationFor(linkId, "days", ""); - this.refs['expirationDate'].getDOMNode().querySelector(".mui-text-field-input").value = ""; + ReactDOM.findDOMNode(this.refs['expirationDate']).querySelector(".mui-text-field-input").value = ""; }.bind(this); calIcon = ; var calLabel = {this.context.getMessage(dateExpired?'21b':'21')} diff --git a/core/src/plugins/core.ajaxplorer/ajxp_registry.xsd b/core/src/plugins/core.ajaxplorer/ajxp_registry.xsd index 53b6cf709e..c0725d5839 100644 --- a/core/src/plugins/core.ajaxplorer/ajxp_registry.xsd +++ b/core/src/plugins/core.ajaxplorer/ajxp_registry.xsd @@ -473,6 +473,7 @@ + @@ -537,6 +538,7 @@ + @@ -556,6 +558,7 @@ + diff --git a/core/src/plugins/gui.ajax/Gruntfile.js b/core/src/plugins/gui.ajax/Gruntfile.js index e8365a9fb7..d5d82a51fc 100644 --- a/core/src/plugins/gui.ajax/Gruntfile.js +++ b/core/src/plugins/gui.ajax/Gruntfile.js @@ -146,9 +146,9 @@ module.exports = function(grunt) { { mode: {loose: false}, expand: true, - cwd: 'node_modules/material-ui/src/', + cwd: 'node_modules/material-ui-legacy/src/', src: ['**/*.js', '**/*.jsx'], - dest: 'node_modules/material-ui/lib/', + dest: 'node_modules/material-ui-legacy/lib/', ext: '.js' }] }, @@ -248,6 +248,16 @@ module.exports = function(grunt) { ] } } + }, + hub: { + all: { + options:{ + concurrent: 20, + allowSelf:true + }, + src: ['../*/Gruntfile.js'], + tasks: ['default'] + } } }); grunt.loadNpmTasks('grunt-env'); @@ -258,6 +268,7 @@ module.exports = function(grunt) { grunt.loadNpmTasks('grunt-contrib-copy'); grunt.loadNpmTasks('grunt-run'); grunt.loadNpmTasks('grunt-contrib-cssmin'); + grunt.loadNpmTasks('grunt-hub'); grunt.loadNpmTasks('assemble-less'); grunt.registerTask('type:js', [ 'copy:debug', diff --git a/core/src/plugins/gui.ajax/package.json b/core/src/plugins/gui.ajax/package.json index a559260323..f54ef22c1b 100644 --- a/core/src/plugins/gui.ajax/package.json +++ b/core/src/plugins/gui.ajax/package.json @@ -3,49 +3,52 @@ "version": "8.0.0", "description": "", "main": "index.js", - "source_path":"res/js", - "css_path":"res/themes/common/css", + "source_path": "res/js", + "css_path": "res/themes/common/css", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "AGPL-v3", "dependencies": { + "chart.js": "^1.0.2", + "classnames": "~2.1.3", + "clipboard": "^1.5.8", + "cronstrue": "0.3.1", + "he": "1.1.0", + "lodash": "^3.10.1", + "material-ui": "^0.17.0", + "material-ui-legacy": "git://github.com/pydio/material-ui.git#pydio", + "qrcode.react": "0.6.1", "react": "15.4.2", - "react-dom": "^15.4.2", "react-addons-css-transition-group": "^15.4.2", "react-addons-pure-render-mixin": "^15.4.2", "react-addons-update": "^15.4.2", + "react-autosuggest": "8.0.0", "react-chartjs": "^0.8.0", - "react-grid-layout": "^0.13.9", - "react-infinite": "^0.7.1", - "material-ui": "git://github.com/pydio/material-ui.git#pydio", - "reactify": "^1.1.1", - "react-select": "^0.6.5", "react-dnd": "^2.2.2", "react-dnd-html5-backend": "^2.2.3", - "react-autosuggest": "8.0.0", + "react-dom": "^15.4.2", + "react-grid-layout": "^0.13.9", + "react-infinite": "^0.7.1", "react-mfb": "0.4.1", - "chart.js": "^1.0.2", - "lodash": "^3.10.1", - "classnames": "~2.1.3", - "clipboard":"^1.5.8", - "qrcode.react":"0.6.1", - "cronstrue":"0.3.1", - "he":"1.1.0" + "react-select": "^0.6.5", + "react-tap-event-plugin": "^2.0.1", + "reactify": "^1.1.1" }, "devDependencies": { + "assemble-less": "~0.7.0", + "envify": "3.4.0", "grunt": "~0.4.5", "grunt-babel": "~5.0.3", + "grunt-browserify": "~4.0.1", + "grunt-contrib-copy": "1.0.0", + "grunt-contrib-cssmin": "~0.14.0", "grunt-contrib-uglify": "~0.9.2", "grunt-contrib-watch": "~0.6.1", - "grunt-contrib-copy": "1.0.0", - "grunt-browserify": "~4.0.1", "grunt-env": "~0.4.4", - "grunt-run":"~0.5.2", - "grunt-contrib-cssmin":"~0.14.0", - "assemble-less": "~0.7.0", - "less-plugin-autoprefix": "~1.5.1", - "envify": "3.4.0" + "grunt-hub": "^0.7.0", + "grunt-run": "~0.5.2", + "less-plugin-autoprefix": "~1.5.1" } } diff --git a/core/src/plugins/gui.ajax/res/js/es6/model/Action.es6 b/core/src/plugins/gui.ajax/res/js/es6/model/Action.es6 index c325ea246a..bf4b14a6ad 100644 --- a/core/src/plugins/gui.ajax/res/js/es6/model/Action.es6 +++ b/core/src/plugins/gui.ajax/res/js/es6/model/Action.es6 @@ -197,7 +197,7 @@ class Action extends Observable{ var components = XMLUtils.XPathSelectNodes(this.options.callbackDialogNode, "component"); this.manager.uiMountComponents(components); }else if(this.options.callback){ - this.options.callback(); + this.options.callback(this.manager, arguments[0]); } if(this.options.subMenu && arguments[0] && arguments[0][0]){ this.notify("submenu_active", arguments[0][0]); @@ -232,11 +232,15 @@ class Action extends Observable{ } if(this.options.listeners["contextChange"]){ - window.listenerContext = this; - try{ - this._evalScripts(this.options.listeners["contextChange"]); - }catch(e){ - Logger.error("Error while evaluating script for contextChange event - action " + this.options.name); + if(this.options.listeners["contextChange"] instanceof Function){ + this.options.listeners["contextChange"](); + }else{ + window.listenerContext = this; + try{ + this._evalScripts(this.options.listeners["contextChange"]); + }catch(e){ + Logger.error("Error while evaluating script for contextChange event - action " + this.options.name); + } } } var rightsContext = this.rightsContext; @@ -294,11 +298,15 @@ class Action extends Observable{ */ fireSelectionChange(){ if(this.options.listeners["selectionChange"]){ - window.listenerContext = this; - try{ - this._evalScripts(this.options.listeners["selectionChange"]); - }catch(e){ - Logger.error("Error while evaluating script for selectionChange event - action " + this.options.name); + if(this.options.listeners["selectionChange"] instanceof Function){ + this.options.listeners["selectionChange"](); + } else { + window.listenerContext = this; + try { + this._evalScripts(this.options.listeners["selectionChange"]); + } catch (e) { + Logger.error("Error while evaluating script for selectionChange event - action " + this.options.name); + } } } if(this.options.activeCondition){ @@ -444,15 +452,31 @@ class Action extends Observable{ } }else if(processNode.nodeName == "clientCallback"){ if(processNode.getAttribute('prepareModal') && processNode.getAttribute('prepareModal') == "true"){ - this.options.prepareModal = true; + this.options.prepareModal = true; } if(processNode.getAttribute('dialogOpenForm') || processNode.getAttribute("components")){ this.options.callbackDialogNode = processNode; - }else if(processNode.firstChild){ + }else if(processNode.getAttribute('module')){ + let fName = processNode.getAttribute('module'); + this.options.callback = function(manager, otherArguments){ + ResourcesManager.detectModuleToLoadAndApply(fName, function(){ + LangUtils.executeFunctionByName(fName, window, manager, otherArguments); + }); + }; + }else if(processNode.firstChild){ this.options.callbackCode = processNode.firstChild.nodeValue.trim(); } - }else if(processNode.nodeName == "clientListener" && processNode.firstChild){ - this.options.listeners[processNode.getAttribute('name')] = processNode.firstChild.nodeValue.trim(); + }else if(processNode.nodeName == "clientListener"){ + if(processNode.getAttribute('module')){ + let moduleName = processNode.getAttribute('module'); + this.options.listeners[processNode.getAttribute('name')] = function(){ + ResourcesManager.detectModuleToLoadAndApply(moduleName, function(){ + LangUtils.getFunctionByName(moduleName, window).apply(this); + }.bind(this)); + }.bind(this); + }else if(processNode.firstChild){ + this.options.listeners[processNode.getAttribute('name')] = processNode.firstChild.nodeValue.trim(); + } }else if(processNode.nodeName == "activeCondition" && processNode.firstChild){ this.options.activeCondition = new Function(processNode.firstChild.nodeValue.trim()); } diff --git a/core/src/plugins/gui.ajax/res/js/es6/util/LangUtils.es6 b/core/src/plugins/gui.ajax/res/js/es6/util/LangUtils.es6 index 1ff8870079..2ea1fb80a3 100644 --- a/core/src/plugins/gui.ajax/res/js/es6/util/LangUtils.es6 +++ b/core/src/plugins/gui.ajax/res/js/es6/util/LangUtils.es6 @@ -161,6 +161,26 @@ class LangUtils{ return LangUtils.trimLeft(LangUtils.trimRight(string, charlist), charlist); } + static executeFunctionByName(functionName, context) { + var args = Array.prototype.slice.call(arguments, 2); + var namespaces = functionName.split("."); + var func = namespaces.pop(); + for (var i = 0; i < namespaces.length; i++) { + context = context[namespaces[i]]; + } + return context[func].apply(context, args); + } + + static getFunctionByName(functionName, context) { + var args = Array.prototype.slice.call(arguments, 2); + var namespaces = functionName.split("."); + var func = namespaces.pop(); + for (var i = 0; i < namespaces.length; i++) { + context = context[namespaces[i]]; + } + return context[func]; + } + } LangUtils.slugTable = [ diff --git a/core/src/plugins/gui.ajax/res/js/ui/reactjs/jsx/ReactUI.js b/core/src/plugins/gui.ajax/res/js/ui/reactjs/jsx/ReactUI.js index d567623acb..1b8e409ea6 100644 --- a/core/src/plugins/gui.ajax/res/js/ui/reactjs/jsx/ReactUI.js +++ b/core/src/plugins/gui.ajax/res/js/ui/reactjs/jsx/ReactUI.js @@ -8,6 +8,7 @@ this._focusables = []; this.modal = window.modal; this._componentsRegistry = new Map(); + this.modalSupportsComponents = false; } insertChildFromString(parent, html){ @@ -194,6 +195,20 @@ } } + registerModalOpener(component){ + this._modalOpener = component; + this.modalSupportsComponents = true; + } + + unregisterModalOpener(){ + this._modalOpener = null; + this.modalSupportsComponents = false; + } + + openComponentInModal(namespace, componentName, props){ + this._modalOpener.open(namespace, componentName, props); + } + /** * PROXY TO PROTOTYPE UI * @param seedInputField @@ -233,7 +248,7 @@ blurAll(){} focusOn(){} focusLast(){} - + } let ns = global.ReactUI || {}; diff --git a/core/src/plugins/gui.ajax/res/js/ui/reactjs/jsx/UsersCompleter.js b/core/src/plugins/gui.ajax/res/js/ui/reactjs/jsx/UsersCompleter.js index 6513a95f10..d34be5ff69 100644 --- a/core/src/plugins/gui.ajax/res/js/ui/reactjs/jsx/UsersCompleter.js +++ b/core/src/plugins/gui.ajax/res/js/ui/reactjs/jsx/UsersCompleter.js @@ -160,10 +160,10 @@ ref="autosuggest" cache={false} showWhen = {input => true } - inputAttributes={inputAttributes} + inputProps={inputAttributes} suggestions={this.getSuggestions} - suggestionRenderer={this.props.renderSuggestion} - suggestionValue={this.suggestionValue} + getSuggestionValue={this.suggestionValue} + renderSuggestion={this.props.renderSuggestion} onSuggestionSelected={this.onSuggestionSelected} /> diff --git a/core/src/plugins/gui.ajax/res/js/ui/reactjs/jsx/WSComponents.js b/core/src/plugins/gui.ajax/res/js/ui/reactjs/jsx/WSComponents.js index a8ade31378..5e2f6f724b 100644 --- a/core/src/plugins/gui.ajax/res/js/ui/reactjs/jsx/WSComponents.js +++ b/core/src/plugins/gui.ajax/res/js/ui/reactjs/jsx/WSComponents.js @@ -372,7 +372,7 @@ OpenNodesModel.getInstance().removeNode(object); }; let label = {object.node.getLabel()}; - tabs.push(); + tabs.push(); }else{ mfbMenus.push(); } @@ -426,9 +426,11 @@ {mainIcon} {title} - + {tabs} - + {editors} @@ -1256,6 +1258,70 @@ }); + let Modal = React.createClass({ + + componentDidMount: function(){ + this.props.pydio.UI.registerModalOpener(this); + }, + + componentWillUnmount: function(){ + this.props.pydio.UI.unregisterModalOpener(); + }, + + open:function(namespace, component, props){ + this.setState({ + open: true, + namespace:namespace, + component: component, + props: props + }); + }, + + getInitialState:function(){ + return {open: false}; + }, + + handleClose: function(){ + this.setState({open: false}); + }, + + render: function(){ + const actions = [ + , + , + ]; + return ( + + + + ); + } + + }); + let FSTemplate = React.createClass({ mixins: [MessagesConsumerMixin], @@ -1267,25 +1333,28 @@ render: function () { return ( -
- -
-
- - -
-
- - - - + +
+ +
+
+ + +
+
+ + + + +
+
- + + + +
- - - -
+ ); } diff --git a/core/src/plugins/gui.ajax/res/js/vendor/nodejs/export.js b/core/src/plugins/gui.ajax/res/js/vendor/nodejs/export.js index a7618fd69e..c2386d2916 100644 --- a/core/src/plugins/gui.ajax/res/js/vendor/nodejs/export.js +++ b/core/src/plugins/gui.ajax/res/js/vendor/nodejs/export.js @@ -3,7 +3,8 @@ window.ReactDOM = require('react-dom'); window.PureRenderMixin = require('react-addons-pure-render-mixin'); window.ReactCSSTransitionGroup = require('react-addons-css-transition-group'); window.ReactUpdate = require('react-addons-update'); -window.ReactMUI = require('material-ui'); +window.ReactMUI = require('material-ui-legacy'); +window.MaterialUI = require('material-ui'); window.Infinite = require('react-infinite'); window.ReactGridLayout = require('react-grid-layout'); window.ReactChart = require('react-chartjs'); @@ -16,4 +17,6 @@ window.ReactAutoSuggest = require('react-autosuggest'); window.Clipboard = require('clipboard'); window.ReactQRCode = require('qrcode.react'); window.ReactMFB = require('react-mfb'); -window.Cronstrue = require("cronstrue"); \ No newline at end of file +window.Cronstrue = require("cronstrue"); +window.injectTapEventPlugin = require('react-tap-event-plugin'); +window.injectTapEventPlugin(); \ No newline at end of file diff --git a/core/src/plugins/gui.ajax/res/js/vendor/nodejs/export.legacy.js b/core/src/plugins/gui.ajax/res/js/vendor/nodejs/export.legacy.js index eeab6ff8d0..9301ce1b06 100644 --- a/core/src/plugins/gui.ajax/res/js/vendor/nodejs/export.legacy.js +++ b/core/src/plugins/gui.ajax/res/js/vendor/nodejs/export.legacy.js @@ -3,9 +3,12 @@ window.ReactDOM = require('react-dom'); window.PureRenderMixin = require('react-addons-pure-render-mixin'); window.ReactCSSTransitionGroup = require('react-addons-css-transition-group'); window.ReactUpdate = require('react-addons-update'); -window.ReactMUI = require('material-ui'); +window.ReactMUI = require('material-ui-legacy'); +window.MaterialUI = require('material-ui'); window.Infinite = require('react-infinite'); window.ReactGridLayout = require('react-grid-layout'); window.ReactChart = require('react-chartjs'); window.ReactSelect = require('react-select'); -window.classNames = require('classnames'); \ No newline at end of file +window.classNames = require('classnames'); +window.injectTapEventPlugin = require('react-tap-event-plugin'); +window.injectTapEventPlugin(); \ No newline at end of file