--- /dev/null
+/*
+Copyright (c) Igor Barma, Alexandre Desoubeaux, Christian Martel, Eric Brun, Mathieu Amblard, Gwenael Gevet, Pierre Guillot, 2012
+ * Copyright Alexandre Desoubeaux, Christian Martel, Cedric Lecarpentier, Alexandre Lefevre, Marc Salvat 2014-2016
+ * Copyright Alexandre Desoubeaux, Christian Martel, Cedric Lecarpentier, Marc Salvat, Marc Suarez, Harifetra Ramamonjy 2017
+For licensing, see README.txt or http://www.pentilanero.com (Cecill-C or AGPL or LGPL)
+*/
+Ext.ns("EntSavoie.Cartable");
+EntSavoie.Cartable.TreeFolder = function (config) {
+ Ext.apply(this, config);
+
+ // Ajoute le texte des erreurs
+ Ext.QuickTips.init();
+ // turn on validation errors beside the field globally
+ Ext.form.Field.prototype.msgTarget = 'side';
+
+ this.wait = this.wait || null;
+
+ // Définition des composants graphiques
+ this.treeLoader = this.treeLoader || new Ext.tree.TreeLoader({
+ dataUrl: this.renderURLAjax+'&jspPage=%2Fajax%2FlistFolders.jsp'
+ });
+
+ this.rootNodeText = this.isGroup ? this.i18n.Cartable.TreeFolder.rootGroupNodeText : this.i18n.Cartable.TreeFolder.rootNodeText;
+
+ if(!this.casierView && this.listFolderId.length>0){
+ this.index = this.listFolderId.length - 1;
+ this.expand = true;
+ }
+
+ /*
+ if (this.casierView) {
+ this.rootNodeText = "Racine";
+ }
+ if (this.isGroup) {
+ this.rootNodeText = "Racine";
+ }
+ */
+
+ this.treeFolderPanel = this.treeFolderPanel || new Ext.tree.TreePanel({
+ treeId: "treeFolderPanel",
+ border: false,
+ useArrows: true,
+ autoScroll: true,
+ animate: true,
+ containerScroll: true,
+ enableDD: true,
+ ddGroup: 'changeFolderDD',
+ ddAppendOnly: true,
+ loader: this.treeLoader,
+ rootVisible: true,
+ root: {
+ nodeType: 'async',
+ text: this.rootNodeText,
+ draggable: false, // Désactiver le Drag and drop sur ce noeud
+ id: this.rootNodePath, // Id du rootNodePah
+ leaf: false,
+ iconCls: 'folder',
+ expanded: true,
+ urlWebdav: this.rootNodeWebdavUrl
+ }
+ });
+
+ this.treeSorter = this.treeSorter || new Ext.tree.TreeSorter(this.treeFolderPanel, {
+ folderSort : false,
+ dir : "asc",
+ caseSensitive: true,
+ sortType: function(node) {
+ return node.text;
+ }
+ });
+
+ EntSavoie.Cartable.TreeFolder.superclass.constructor.call(this, {
+ border: false,
+ style: 'border-right: solid 1px #99BBE8',
+ layout: "fit",
+ items: [this.treeFolderPanel]
+ });
+
+ // Définition des listeners
+ this.treeLoader.on("load", this.onTreeLoaderLoad, this);
+ this.treeFolderPanel.on("click", this.onClickTreePanel, this);
+ this.treeFolderPanel.on("movenode", this.onMoveNodeTreePanel, this);
+ this.treeFolderPanel.on("beforenodedrop", this.onBeforeNodeDrop, this);
+ this.treeFolderPanel.on("expandnode", this.onExpandNodeTreePanel, this);
+
+};
+
+Ext.extend(EntSavoie.Cartable.TreeFolder, Ext.Panel, {
+ initComponent: function () {
+ EntSavoie.Cartable.TreeFolder.superclass.initComponent.call(this);
+ },
+
+
+ /**
+ * Chargement du treeLoader
+ */
+ onTreeLoaderLoad : function(tl, node, response) {
+ if(this.index>=0){
+ if(this.expand){
+ this.expand = false;
+ this.expandNode(this.listFolderId[this.index]);
+ }
+ } else {
+ if (node.id == this.rootNodePath && !this.index) {
+ // on charge le root donc on selectionne 'Mon cartable' par defaut
+ this.entityNode = this.treeFolderPanel.getNodeById(this.rootNodePath);
+ this.onClickTreePanel(this.entityNode, null);
+ this.treeFolderPanel.getNodeById(this.rootNodePath).select();
+ }
+ }
+ },
+
+ /**
+ * Expand d'un noeud de l'arbre
+ * @param node
+ */
+ onExpandNodeTreePanel: function(node){
+ this.index--;
+ if(this.index != -1){
+ this.expandNode(this.listFolderId[this.index]);
+ } else {
+ this.onClickTreePanel(node, null);
+ node.select();
+ }
+ },
+
+ expandNode: function(folderId){
+ var node = this.treeFolderPanel.getNodeById(folderId);
+ node.expand();
+ },
+
+ /**
+ * Clic sur le TreePanel
+ */
+ onClickTreePanel: function(node, e) {
+ // Stockage du noeud sélectionné
+ this.entityNode = node;
+ // Expand le noeud selectionne
+ this.treeFolderPanel.getNodeById(node.id).expand();
+ // on affiche la liste des fichiers contenus dans le dossier
+ this.mainContainer.viewContainer.refreshGrid(node.id);
+ this.treeFolderPanel.un("expandnode", this.onExpandNodeTreePanel, this);
+ },
+
+ /**
+ * Set de la selection d'un dossier et rafraichit l'interface
+ */
+ setSelectedFolder: function(folderId) {
+ var node = this.treeFolderPanel.getNodeById(folderId);
+ if(node == null){
+ var record = this.mainContainer.viewContainer.entityStore.getById(folderId);
+ node = new Ext.tree.TreeNode({id: record.get("id"), text: record.get("title"), leaf: false, iconCls: 'folder'});
+ this.entityNode.appendChild(node);
+ this.entityNode.sort(function(a, b) {if(a.text < b.text){return -1;} else if(a.text == b.text){return 0;} else {return 1;}});
+ }
+ this.treeFolderPanel.selectPath(node.getPath());
+ this.onClickTreePanel(node, null);
+ },
+
+ setSelectedParentFolder: function(folderId) {
+ var node = this.treeFolderPanel.getNodeById(folderId).parentNode;
+ try {
+ this.treeFolderPanel.selectPath(node.getPath());
+ this.onClickTreePanel(node, null);
+ } catch(except){}
+ },
+
+ /**
+ * Drop d'un ou plusieurs elements sur un dossier
+ */
+
+ onBeforeNodeDrop: function(e) {
+
+ if(!this.beforeNodeDropIsAlreadyFire){
+
+ var targetFolderId = e.target.id;
+
+ if (e.data.selections) {
+ // Id du dossier cible
+
+ // si on deplace dans le meme dossier --> on fait rien
+ if (targetFolderId == this.entityNode.id) {
+ return false;
+ }
+
+ this.beforeNodeDropIsAlreadyFire = true;
+ this.moveDDEntity(targetFolderId, e.data.selections);
+ } else if(e.source.tree && e.tree) {
+ //Si on fait une copie entre 2 arbres différents
+ if (e.source.tree.id != e.tree.id) {
+
+ var node = e.dropNode;
+ //Si ce n'est pas un dossier, on ne l'ajoute pas
+ if(!e.dropNode.leaf){
+ var nodeCopy = new Ext.tree.TreeNode({id: "copyNode" + node.id, text: node.text, leaf: false, iconCls: 'folder'});
+ e.target.appendChild(nodeCopy);
+ e.target.sort(function(a, b) {if(a.text < b.text){return -1;} else if(a.text == b.text){return 0;} else {return 1;}});
+ }
+
+ this.beforeNodeDropIsAlreadyFire = true;
+ e.dropStatus = true;
+ this.copyFromTree(targetFolderId, node);
+
+ return false;
+ }
+ }
+ } else {
+ return false;
+ }
+ },
+
+ copyFromTree: function(targetId, node){
+ if(!this.wait){
+ this.wait = new Ext.LoadMask(Ext.getBody(), {msg: this.i18n.Cartable.TreeFolder.wait.msg});
+ }
+ this.wait.show();
+
+ Ext.Ajax.request({
+ url: this.actionURLAjax,
+ params: {
+ cmd: "copyFromTree",
+ folderId: targetId,
+ entityId: node.id,
+ isFile: node.leaf
+ },
+ scope: this,
+ success: this.onSuccessCopyFromTree,
+ failure: this.onFailureCopyFromTree
+ });
+ },
+
+ onSuccessCopyFromTree: function(response, options) {
+ this.beforeNodeDropIsAlreadyFire = false;
+ // Traitement des messages
+ var backObj = Ext.decode(response.responseText);
+ if (!backObj.success) {
+ this.wait.hide();
+ if(backObj.hasPermissions){
+ Ext.MessageBox.alert(this.i18n.Cartable.TreeFolder.copyFromTree.alert.title, this.i18n.Cartable.TreeFolder.copyFromTree.alert.msg, function(btn){});
+ }
+ else{
+ Ext.MessageBox.alert(this.i18n.Cartable.TreeFolder.copyFromTree.alert.title, backObj.permissionMessage, function(btn){});
+ }
+ } else {
+
+ // Actualisation de la grid
+ if(this.mainContainer.viewContainer.folderId == backObj.targetFolderId){
+ var record = new this.mainContainer.viewContainer.entityStore.recordType({
+ id: backObj.id,
+ title: backObj.title,
+ name: backObj.name,
+ type: backObj.type,
+ version: backObj.version,
+ creator: backObj.creator,
+ typeEntity: backObj.typeEntity,
+ size: backObj.size,
+ date: backObj.date,
+ contentType: backObj.contentType,
+ pathMain: backObj.pathMain,
+ plid: backObj.plid,
+ comment: backObj.comment,
+ isNew: false,
+ senderName: backObj.senderName,
+ senderId: backObj.senderId,
+ hideIconViewer: backObj.hideIconViewer,
+ hideIconDownload: backObj.hideIconDownload,
+ hideIconUnzip: backObj.hideIconUnzip,
+ hideIconZip: backObj.hideIconZip,
+ hideIconPermissions: backObj.hideIconPermissions,
+ hideIconComment: backObj.hideIconComment,
+ hideEditFile: backObj.hideEditFile,
+ urlImg: backObj.urlImg,
+ fileExtension: backObj.fileExtension,
+ isSignet: false,
+ urlSignet: null,
+ urlWebdav: backObj.urlWebdav,
+ lock: backObj.lock}, backObj.id);
+
+ // on ajoute l element ds la grille
+ this.mainContainer.viewContainer.entityStore.addSorted(record);
+ }
+
+ if(backObj.typeEntity == "Dossier"){
+ var copyNode = this.treeFolderPanel.getNodeById("copyNode" + backObj.oldNodeId);
+ //On met à jour l'identifiant du nouveau dossier créé
+ copyNode.setId(backObj.id);
+ copyNode.setText(backObj.title);
+ copyNode.parentNode.sort(function(a, b) {if(a.text < b.text){return -1;} else if(a.text == b.text){return 0;} else {return 1;}});
+ this.treeFolderPanel.getLoader().load(copyNode);
+ }
+
+ this.wait.hide();
+ }
+ },
+
+ onFailureCopyFromTree: function(response, options) {
+ this.wait.hide();
+ this.beforeNodeDropIsAlreadyFire = false;
+ Ext.MessageBox.alert(this.i18n.Cartable.TreeFolder.copyFromTree.alert.title, this.i18n.Cartable.TreeFolder.copyFromTree.alert.title, function(btn){});
+ },
+
+
+ moveDDEntity: function(targetId, selections) {
+
+ var fileIdArray = [];
+ var folderIdArray = [];
+
+ var targetNode = this.treeFolderPanel.getNodeById(targetId);
+
+ for (i = 0; i < selections.length; i++) {
+ var entityId = selections[i].data['id'];
+ var record = this.mainContainer.viewContainer.entityStore.getById(entityId);
+ var movedEntityFlag = true;
+ try {
+ var movedNode = this.treeFolderPanel.getNodeById(entityId);
+ if (movedNode.contains(targetNode)) {
+ movedEntityFlag = false;
+ }
+ } catch(except) {
+ }
+ if (targetId!=entityId && movedEntityFlag) {
+ // Suppression de la grid
+ this.mainContainer.viewContainer.entityStore.remove(record);
+ if (record.get("type")=="Fichier") {
+ fileIdArray.push(record.get("id"));
+ }
+ // Si c'est un dossier actualisation du tree
+ if (record.get("type")=="Dossier") {
+ folderIdArray.push(record.get("id"));
+ // Suppression du dossier à l'ancien emplacement
+ this.treeFolderPanel.getNodeById(record.get("id")).remove();
+ // Ajout du dossier au nouvel emplacement
+ var newNode = new Ext.tree.TreeNode({id: record.get("id"), text: record.get("title"), leaf: false, iconCls: 'folder'});
+
+ targetNode.appendChild(newNode);
+ targetNode.sort(function(a, b) {if(a.text < b.text){return -1;} else if(a.text == b.text){return 0;} else {return 1;}});
+ this.treeFolderPanel.getLoader().load(newNode);
+ }
+ } else {
+ this.beforeNodeDropIsAlreadyFire = false;
+ Ext.slideMsg.msg(this.i18n.Cartable.TreeFolder.moveDDEntity.slideMsg.title, record.get("title") + this.i18n.Cartable.TreeFolder.moveDDEntity.slideMsg.msg);
+ }
+ }
+ this.mainContainer.viewContainer.operationProgress.show();
+ Ext.Ajax.request({
+ url: this.actionURLAjax,
+ params: {
+ cmd: 'moveEntity',
+ targetFolderId: targetId,
+ folderIdArray: Ext.encode(folderIdArray),
+ fileIdArray: Ext.encode(fileIdArray)
+ },
+ scope: this,
+ success: this.onSuccessMoveEntity,
+ failure: this.onFailureMoveEntity
+ });
+ },
+
+ onSuccessMoveEntity: function(response, options) {
+ this.beforeNodeDropIsAlreadyFire = false;
+ this.mainContainer.viewContainer.operationProgress.hide();
+ // Traitement des messages
+ var backObj = Ext.decode(response.responseText);
+ if (!backObj.success) {
+ if (backObj.portal_message){
+ Ext.MessageBox.alert(this.i18n.Cartable.TreeFolder.onSuccessMoveEntity.alert, backObj.portal_message, function(btn){});
+ }
+ else{
+ Ext.MessageBox.alert(this.i18n.Cartable.TreeFolder.onSuccessMoveEntity.alert, this.i18n.Cartable.TreeFolder.onSuccessMoveEntity.msg, function(btn){});
+ }
+ this.treeFolderPanel.root.reload();
+ this.mainContainer.viewContainer.refreshGrid(this.mainContainer.viewContainer.folderId, true);
+ } else {
+ for(var i = 0, len = backObj.folderRenamed.length; i < len; i++) {
+ var folderRename = backObj.folderRenamed[i];
+ try {
+ this.treeFolderPanel.getNodeById(folderRename.folderId).setText(folderRename.newFolderName);
+ }
+ catch(except){
+ console.log(except)
+ }
+ }
+ Ext.slideMsg.msg(this.i18n.Cartable.TreeFolder.moveEntity.slideMsg.title, this.i18n.Cartable.TreeFolder.moveEntity.slideMsg.msg);
+ }
+ },
+
+ onFailureMoveEntity: function(response, options) {
+ this.mainContainer.viewContainer.operationProgress.hide();
+ this.beforeNodeDropIsAlreadyFire = false;
+ Ext.MessageBox.alert(this.i18n.Cartable.TreeFolder.onFailureMoveEntity.alert.title, this.i18n.Cartable.TreeFolder.onFailureMoveEntity.alert.msg, function(btn){});
+ },
+
+ /**
+ * Déplacement d'un dossier dans le TreePanel
+ */
+ onMoveNodeTreePanel: function(tree, node, oldParent, newParent, index) {
+ if(oldParent.getOwnerTree().getRootNode().id == newParent.getOwnerTree().getRootNode().id){
+ // Si on deplace le dossier dans un dossier parent different
+ if (oldParent!=newParent) {
+ this.mainContainer.viewContainer.operationProgress.show();
+ Ext.Ajax.request({
+ url: this.actionURLAjax,
+ params: {
+ cmd: "moveNode",
+ entityId: node.id,
+ targetFolderId: newParent.id,
+ isFile: node.leaf
+ },
+ scope: this,
+ success: this.onSuccessMoveNode,
+ failure: this.onFailureMoveNode
+ });
+ }
+ }
+ },
+
+ onSuccessMoveNode: function(response, options) {
+ this.mainContainer.viewContainer.operationProgress.hide();
+ // Traitement des messages
+ var backObj = Ext.decode(response.responseText);
+ if (!backObj.success) {
+ if (backObj.portal_message){
+ Ext.MessageBox.alert(this.i18n.Cartable.TreeFolder.onSuccessMoveNode.alert.title, backObj.portal_message, function(btn){});
+ }
+ else{
+ Ext.MessageBox.alert(this.i18n.Cartable.TreeFolder.onSuccessMoveNode.alert.title, this.i18n.Cartable.TreeFolder.onSuccessMoveNode.alert.msg, function(btn){});
+ }
+ this.treeFolderPanel.root.reload();
+ this.mainContainer.viewContainer.refreshGrid(this.mainContainer.viewContainer.folderId, true);
+ } else {
+ // Mise a jour de l'interface
+ // on met a jour le nom du dossier si besoin
+ if (backObj.newEntityName) {
+ this.treeFolderPanel.getNodeById(backObj.entityId).setText(backObj.newEntityName);
+ }
+ // Selection du dossier deplace seulement si c'est celui-ci qui etait affiché
+ if (this.entityNode.id==backObj.entityId) {
+ this.setSelectedFolder(backObj.entityId);
+ }
+ else {
+ this.setSelectedFolder(this.entityNode.id);
+ }
+
+ }
+
+ },
+
+ onFailureMoveNode: function(response, options) {
+ this.mainContainer.viewContainer.operationProgress.hide();
+ Ext.MessageBox.alert(this.i18n.Cartable.TreeFolder.onFailureMoveNode.alert.title, this.i18n.Cartable.TreeFolder.onFailureMoveNode.alert.msg, function(btn){});
+ }
+
+});