diff --git a/workflow/engine/methods/setup/skin_Ajax.php b/workflow/engine/methods/setup/skin_Ajax.php
index f37b4cf94..417fb56e6 100644
--- a/workflow/engine/methods/setup/skin_Ajax.php
+++ b/workflow/engine/methods/setup/skin_Ajax.php
@@ -1,13 +1,13 @@
listContent();
+ $swConfigFile = false;
+
+ foreach ($aFiles as $key => $val) {
+ if (basename($val['filename']) == 'config.xml') {
+ $skinName = dirname($val['filename']);
+ $skinArray = explode("/", $skinName);
+ if (count($skinArray) == 1) {
+ $swConfigFile = true;
+ }
+ }
+ }
+
+ if (!$swConfigFile) {
+ @unlink(PATH_CUSTOM_SKINS . '.tmp' . PATH_SEP . $filename);
+ throw ( new Exception(G::LoadTranslation('ID_SKIN_CONFIGURATION_MISSING')) );
+ }
+
+ if (is_dir(PATH_CUSTOM_SKINS . $skinName)) {
+ if ((isset($_REQUEST['overwrite_files'])) && ($_REQUEST['overwrite_files'] == 'on')) {
+ G::rm_dir(PATH_CUSTOM_SKINS . $skinName, false);
+ } else {
+ throw ( new Exception(G::LoadTranslation('ID_SKIN_ALREADY_EXISTS')) );
+ }
+ }
+ $res = $tar->extract(PATH_CUSTOM_SKINS);
+ if (!$res) {
+ throw ( new Exception(G::LoadTranslation('ID_SKIN_ERROR_EXTRACTING')) );
+ }
+//Delete Temporal
+ @unlink(PATH_CUSTOM_SKINS . '.tmp' . PATH_SEP . $filename);
+
+ $response['success'] = true;
+ $response['message'] = G::LoadTranslation('ID_SKIN_SUCCESSFUL_IMPORTED');
+ print_r(G::json_encode($response));
+ } catch (Exception $e) {
+ $response['success'] = false;
+ $response['message'] = $e->getMessage();
+ $response['error'] = $e->getMessage();
+ print_r(G::json_encode($response));
+ }
+}
+
function exportSkin($skinToExport) {
try {
if (!isset($_REQUEST['SKIN_FOLDER_ID'])) {
@@ -95,7 +189,7 @@ function exportSkin($skinToExport) {
$tar->_compress = false;
addTarFolder($tar, $skinFolder, PATH_CUSTOM_SKINS);
-
+
$response['success'] = true;
$response['message'] = $skinTar;
diff --git a/workflow/engine/templates/setup/skinList.js b/workflow/engine/templates/setup/skinList.js
index 5ab4f3388..6ed82b096 100755
--- a/workflow/engine/templates/setup/skinList.js
+++ b/workflow/engine/templates/setup/skinList.js
@@ -101,8 +101,8 @@ Ext.onReady(function(){
importButton = new Ext.Action({
text: _('ID_IMPORT'),
iconCls: 'button_menu_ext ss_sprite ss_basket_put',
- //handler: CopyButtonAction,
- disabled: true
+ handler: importSkin,
+ disabled: false
});
exportButton = new Ext.Action({
text: _('ID_EXPORT'),
@@ -371,7 +371,120 @@ onMessageContextMenu = function (grid, rowIndex, e) {
//Do Nothing Function
DoNothing = function(){};
+importSkin = function(){
+ importDialog = new Ext.Window( {
+ id: "importDialog",
+ title:_('ID_UPLOAD'),
+ autoCreate: true,
+ modal:true,
+ width:400,
+ autoHeight:true,
+ shadow:true,
+ minWidth:100,
+ minHeight:50,
+ proxyDrag: true,
+ resizable: true,
+ keys: {
+ key: 27,
+ fn : function(){
+ importDialog.hide();
+ }
+ },
+ items:[
+ {
+ xtype:'form',
+ autoScroll:true,
+ autoHeight:true,
+ id:"uploadform",
+ fileUpload:true,
+ labelWidth:90,
+ url:'skin_Ajax',
+ tooltip:"Max File Size XXX MB
Max Post SizeXXX MB
",
+ frame:false,
+ items:[
+ {
+ xtype:"displayfield",
+ value:"Max File Size XXX MB
Max Post SizeXXX MB
"
+ },
+ {
+ xtype:"fileuploadfield",
+ fieldLabel:"File ",
+ id:"uploadedFile",
+ name:"uploadedFile",
+ width:100,
+ buttonOnly:false
+ },
+ {
+ xtype:"checkbox",
+ fieldLabel:"Overwrite",
+ name:"overwrite_files",
+ checked:true
+ }
+ ],
+ buttons:[
+ {
+ text:_('ID_SAVE'),
+ handler: function() {
+ //statusBarMessage( _('ID_UPLOADING_FILE'), true, true );
+ importDialog.getEl().mask(_('ID_SKIN_IMPORTING'));
+ form = Ext.getCmp("uploadform").getForm();
+ //Ext.getCmp("uploadform").getForm().submit();
+ //console.log(form);
+ //console.log(form.url);
+ Ext.getCmp("uploadform").getForm().submit({
+ //reset: true,
+ reset: false,
+ success: function(form, action) {
+
+ store.reload();
+
+ Ext.getCmp("importDialog").destroy();
+ },
+ failure: function(form, action) {
+ Ext.getCmp("importDialog").destroy();
+
+ if( !action.result ) {
+ Ext.MessageBox.alert("error", _('ID_ERROR'));
+ return;
+ }
+ Ext.MessageBox.alert("error", action.result.error);
+
+ },
+ scope: Ext.getCmp("uploadform"),
+ // add some vars to the request, similar to hidden fields
+ params: {
+ option: "standardupload",
+ action: "importSkin",
+ requestType: "xmlhttprequest",
+ confirm: "true"
+ }
+ });
+ }
+ },
+ {
+ text:_('ID_CANCEL'),
+ handler: function() {
+ Ext.getCmp("importDialog").destroy();
+ }
+ }
+ ]
+ }
+ ]
+
+ });
+ // importDialog.doLayout();
+
+ // recalculate
+ // Window size
+ //importDialog.syncSize();
+ // center the window
+ //importDialog.center();
+ importDialog.on( 'hide', function() {
+ importDialog.destroy(true);
+ } );
+ importDialog.show();
+};
exportSkin = function(){
viewport.getEl().mask(_('ID_SKIN_EXPORTING'));
rowSelected = infoGrid.getSelectionModel().getSelected();
@@ -381,7 +494,7 @@ exportSkin = function(){
params: {
action: 'exportSkin',
SKIN_FOLDER_ID: rowSelected.data.SKIN_FOLDER_ID
- },
+ },
success: function(r,o){
viewport.getEl().unmask();
var resp = Ext.util.JSON.decode(r.responseText);
@@ -433,8 +546,8 @@ DoSearch = function(){
infoGrid.store.load({
params: {
textFilter: searchText.getValue()
- }
- });
+ }
+ });
};
//Edit Calendar Action
@@ -454,7 +567,7 @@ DeleteButtonAction = function(){
params: {
action: 'canDeleteCalendar',
CAL_UID: rowSelected.data.CALENDAR_UID
- },
+ },
success: function(r,o){
viewport.getEl().unmask();
var resp = Ext.util.JSON.decode(r.responseText);
@@ -468,7 +581,7 @@ DeleteButtonAction = function(){
params: {
action: 'deleteCalendar',
CAL_UID: rowSelected.data.CALENDAR_UID
- },
+ },
success: function(r,o){
viewport.getEl().unmask();
editButton.disable();