BUG 6212 Skin Feature complete

New, import, export and delete function ready
This commit is contained in:
Hugo Loza
2011-07-26 12:34:16 -04:00
parent 46db68ea71
commit 5b22027acc
2 changed files with 360 additions and 129 deletions

View File

@@ -2,21 +2,31 @@
if (!isset($_REQUEST ['action'])) {
$res ['success'] = false;
$res ['message'] = 'You may request an action';
$res ['error']=$res ['message'] = 'You may request an action';
print G::json_encode($res);
die ();
}
if (!function_exists($_REQUEST ['action'])) {
$res ['success'] = false;
$res ['message'] = 'The requested action doesn\'t exists';
$res ['error']=$res ['message'] = 'The requested action doesn\'t exists';
print G::json_encode($res);
die ();
}
$restrictedFunctions=array('copy_skin_folder','addTarFolder');
if (in_array($_REQUEST ['action'],$restrictedFunctions)) {
$res ['success'] = false;
$res ['error']=$res ['message'] = 'The requested action doesn\'t exists *';
print G::json_encode($res);
die ();
}
$functionName = $_REQUEST ['action'];
$functionParams = isset($_REQUEST ['params']) ? $_REQUEST ['params'] : array();
$functionName($functionParams);
$functionName();
function updatePageSize() {
G::LoadClass('configuration');
@@ -45,20 +55,99 @@ function skinList() {
$folderId = "classic";
$xmlConfiguration = file_get_contents($configInformation);
$xmlConfigurationObj = G::xmlParser($xmlConfiguration);
if (isset($xmlConfigurationObj->result['skinConfiguration'])) {
$skinInformationArray = $skinFilesArray = $xmlConfigurationObj->result['skinConfiguration']['__CONTENT__']['information']['__CONTENT__'];
$menuOption = array();
$res = array();
$res['SKIN_FOLDER_ID'] = strtolower($folderId);
foreach ($skinInformationArray as $keyInfo => $infoValue) {
$res['SKIN_' . strtoupper($keyInfo)] = $infoValue['__VALUE__'];
}
$skinListArray['skins'][] = $res;
$skinMenuArray[] = $menuOption;
}
}
$skinListArray['currentSkin'] = SYS_SKIN;
if ((isset($_REQUEST['type'])) && ($_REQUEST['type'] == "menu")) {
print_r(G::json_encode($skinMenuArray));
} else {
print_r(G::json_encode($skinListArray));
}
}
function createSkin($baseSkin='classic') {
function newSkin($baseSkin='classic') {
//G::pr($_REQUEST);
$skinBase = $baseSkin != "" ? strtolower($baseSkin) : 'classic';
if ((isset($_REQUEST['skinBase'])) && ($_REQUEST['skinBase'] != "")) {
$skinBase = strtolower($_REQUEST['skinBase']);
}
try {
if (!(isset($_REQUEST['skinName']))) {
throw ( new Exception(G::LoadTranslation('ID_SKIN_NAME_REQUIRED')) );
}
if (!(isset($_REQUEST['skinFolder']))) {
throw ( new Exception(G::LoadTranslation('ID_SKIN_FOLDER_REQUIRED')) );
}
//Should validate skin folder name here
//if....
$skinName = $_REQUEST['skinName'];
$skinFolder = $_REQUEST['skinFolder'];
$skinDescription = isset($_REQUEST['skinDescription']) ? $_REQUEST['skinDescription'] : '';
$skinAuthor = isset($_REQUEST['skinAuthor']) ? $_REQUEST['skinAuthor'] : 'ProcessMaker Team';
if (is_dir(PATH_CUSTOM_SKINS . $skinFolder)) {
throw ( new Exception(G::LoadTranslation('ID_SKIN_ALREADY_EXISTS')) );
}
if (strtolower($skinFolder) == 'classic') {
throw ( new Exception(G::LoadTranslation('ID_SKIN_ALREADY_EXISTS')) );
}
//All validations OK then create skin
switch ($skinBase) {
case 'classic': //Special Copy of this dir + xmlreplace
//$configurationFile = G::ExpandPath("skinEngine") . 'base' . PATH_SEP . 'config.xml';
copy_skin_folder(G::ExpandPath("skinEngine") . 'base' . PATH_SEP, PATH_CUSTOM_SKINS . $skinFolder,array("config.xml","baseCss"));
$pathBase=G::ExpandPath("skinEngine") . 'base' . PATH_SEP;
break;
default: //Commmon copy/paste of a folder + xmlrepalce
copy_skin_folder(PATH_CUSTOM_SKINS . $skinBase, PATH_CUSTOM_SKINS . $skinFolder,array("config.xml"));
$pathBase=PATH_CUSTOM_SKINS.$skinBase;
break;
}
//ReBuild config file
//TODO: Improve this pre_replace lines
$configFileOriginal = $pathBase . PATH_SEP . 'config.xml';
$configFileFinal = PATH_CUSTOM_SKINS . $skinFolder . PATH_SEP . 'config.xml';
$xmlConfiguration = file_get_contents($configFileOriginal);
$xmlConfiguration = preg_replace('/(<id>)(.+?)(<\/id>)/i', '<id>' . G::generateUniqueID() . '</id><!-- $2 -->', $xmlConfiguration);
$xmlConfiguration = preg_replace("/(<name>)(.+?)(<\/name>)/i", "<name>" . $skinName . "</name><!-- $2 -->", $xmlConfiguration);
$xmlConfiguration = preg_replace("/(<description>)(.+?)(<\/description>)/i", "<description>" . $skinDescription . "</description><!-- $2 -->", $xmlConfiguration);
$xmlConfiguration = preg_replace("/(<author>)(.+?)(<\/author>)/i", "<author>" . $skinAuthor . "</author><!-- $2 -->", $xmlConfiguration);
$xmlConfiguration = preg_replace("/(<createDate>)(.+?)(<\/createDate>)/i", "<createDate>" . date("Y-m-d") . "</createDate><!-- $2 -->", $xmlConfiguration);
$xmlConfiguration = preg_replace("/(<modifiedDate>)(.+?)(<\/modifiedDate>)/i", "<modifiedDate>" . date("Y-m-d H:i:s") . "</modifiedDate><!-- $2 -->", $xmlConfiguration);
file_put_contents($configFileFinal, $xmlConfiguration);
$response['success'] = true;
$response['message'] = G::LoadTranslation('ID_SKIN_SUCCESS_CREATE');
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 importSkin() {
@@ -85,22 +174,22 @@ function importSkin() {
throw ( new Exception(G::LoadTranslation('ID_SKIN_FILE_REQUIRED')) );
}
if ($up_err == 1 || $up_err == 2) {
throw ( new Exception(G::LoadTranslation('ID_SKIN_FILE_SIZE_ERROR')) );
throw ( new Exception(G::LoadTranslation('ID_FILE_TOO_BIG')) );
//$errors[$i]='miscfilesize';
}
if ($up_err == 3) {
throw ( new Exception(G::LoadTranslation('ID_SKIN_FILE_PART_ERROR')) );
throw ( new Exception(G::LoadTranslation('ID_ERROR_UPLOAD_FILE_CONTACT_ADMINISTRATOR')) );
//$errors[$i]='miscfilepart';
}
if (!@is_uploaded_file($tmp)) {
throw ( new Exception(G::LoadTranslation('ID_SKIN_FILE_NOT_UPLOADED')) );
throw ( new Exception(G::LoadTranslation('ID_ERROR_UPLOAD_FILE_CONTACT_ADMINISTRATOR')) );
//$errors[$i]='uploadfile';
}
$fileInfo = pathinfo($items);
$validType = array('tar', 'gz');
if (!in_array($fileInfo['extension'], $validType)) {
throw ( new Exception(G::LoadTranslation('ID_SKIN_FILE_TYPE_ERROR')) );
throw ( new Exception(G::LoadTranslation('ID_FILE_UPLOAD_INCORRECT_EXTENSION')) );
//$errors[$i]='wrongtype';
}
@@ -155,16 +244,14 @@ function importSkin() {
}
}
function exportSkin($skinToExport) {
function exportSkin($skinToExport="") {
try {
if (!isset($_REQUEST['SKIN_FOLDER_ID'])) {
throw ( new Exception(G::LoadTranslation('ID_SKIN_NAME_REUIRED')) );
throw ( new Exception(G::LoadTranslation('ID_SKIN_NAME_REQUIRED')) );
}
$skinName = $_REQUEST['SKIN_FOLDER_ID'];
$customSkins = glob(PATH_CUSTOM_SKINS . "*/config.xml");
$skinFolderBase = PATH_CUSTOM_SKINS . $skinName;
$skinFolder = $skinFolderBase . PATH_SEP;
$skinTar = PATH_CUSTOM_SKINS . $skinName . '.tar';
@@ -172,7 +259,7 @@ function exportSkin($skinToExport) {
throw ( new Exception(G::LoadTranslation('ID_SKIN_DOESNT_EXIST')) );
}
if (!file_exists($skinFolder . "config.xml")) {
throw ( new Exception(G::LoadTranslation('ID_SKIN_CONFIGFILE_DOESNT_EXIST')) );
throw ( new Exception(G::LoadTranslation('ID_SKIN_CONFIGURATION_MISSING')) );
}
if (file_exists($skinTar)) {
@@ -201,7 +288,28 @@ function exportSkin($skinToExport) {
print_r(G::json_encode($response));
}
}
function deleteSkin(){
try{
if(!(isset($_REQUEST['SKIN_FOLDER_ID']))){
throw ( new Exception(G::LoadTranslation('ID_SKIN_FOLDER_REQUIRED')) );
}
if(($_REQUEST['SKIN_FOLDER_ID'])=="classic"){
throw ( new Exception(G::LoadTranslation('ID_SKIN_FOLDER_NOT_DELETEABLE')) );
}
$folderId=$_REQUEST['SKIN_FOLDER_ID'];
if(!is_dir(PATH_CUSTOM_SKINS.$folderId)){
throw ( new Exception(G::LoadTranslation('ID_SKIN_NOT_EXISTS')) );
}
//Delete
G::rm_dir(PATH_CUSTOM_SKINS.$folderId);
$response['success'] = true;
$response['message'] = "$folderId deleted";
} catch (Exception $e) {
$response['success'] = false;
$response['error']=$response['message'] = $e->getMessage();
print_r(G::json_encode($response));
}
}
function streamSkin() {
$skinTar = $_REQUEST['file'];
$bDownload = true;
@@ -228,3 +336,29 @@ function addTarFolder($tar, $pathBase, $pluginHome) {
closedir($handle);
}
}
function copy_skin_folder($path, $dest, $exclude=array()) {
$defaultExcluded=array(".","..");
$excludedItems=array_merge($defaultExcluded,$exclude);
if (is_dir($path)) {
@mkdir($dest);
$objects = scandir($path);
if (sizeof($objects) > 0) {
foreach ($objects as $file) {
if(in_array($file,$excludedItems))
continue;
// go on
if (is_dir($path . PATH_SEP . $file)) {
copy_skin_folder($path . PATH_SEP . $file, $dest . PATH_SEP . $file,$exclude);
} else {
copy($path . PATH_SEP . $file, $dest . PATH_SEP . $file);
}
}
}
return true;
} elseif (is_file($path)) {
return copy($path, $dest);
} else {
return false;
}
}

View File

@@ -17,7 +17,7 @@ new Ext.KeyMap(document, [
e.stopEvent();
document.location = document.location;
}else{
Ext.Msg.alert('Refresh', 'You clicked: CTRL-F5');
//Ext.Msg.alert('Refresh', 'You clicked: CTRL-F5');
}
}
}
@@ -27,19 +27,19 @@ new Ext.KeyMap(document, [
fn: function(k,e){
iGrid = Ext.getCmp('infoGrid');
rowSelected = iGrid.getSelectionModel().getSelected();
if (rowSelected){
DeleteButtonAction();
if (rowSelected && !deleteButton.isDisabled()){
deleteSkin();
}
}
},
{
key: Ext.EventObject.F2,
fn: function(k,e){
iGrid = Ext.getCmp('infoGrid');
rowSelected = iGrid.getSelectionModel().getSelected();
if (rowSelected){
EditCalendarAction();
}
//iGrid = Ext.getCmp('infoGrid');
//rowSelected = iGrid.getSelectionModel().getSelected();
//if (rowSelected){
//}
}
}
]);
@@ -49,13 +49,9 @@ var cmodel;
var infoGrid;
var viewport;
var smodel;
var newButton;
var editButton;
var deleteButton;
var copyButton;
var searchButton;
var searchText;
var contextMenu;
var pageSize;
@@ -70,53 +66,40 @@ Ext.onReady(function(){
newButton = new Ext.Action({
text: _('ID_NEW'),
iconCls: 'button_menu_ext ss_sprite ss_add',
disabled: true,
handler: NewCalendarAction
disabled: false,
handler: newSkin
});
editButton = new Ext.Action({
text: _('ID_EDIT'),
iconCls: 'button_menu_ext ss_sprite ss_pencil',
handler: EditCalendarAction,
hidden: true,
disabled: true
});
deleteButton = new Ext.Action({
text: _('ID_DELETE'),
iconCls: 'button_menu_ext ss_sprite ss_delete',
handler: DeleteButtonAction,
hidden: true,
handler: deleteSkin,
disabled: true
});
copyButton = new Ext.Action({
text: _('ID_COPY'),
iconCls: 'button_menu_ext ss_sprite ss_calendar_add',
handler: CopyButtonAction,
hidden: true,
disabled: true
});
importButton = new Ext.Action({
text: _('ID_IMPORT'),
iconCls: 'button_menu_ext ss_sprite ss_basket_put',
iconCls: 'button_menu_ext ss_sprite ss_building_add',
handler: importSkin,
disabled: false
});
exportButton = new Ext.Action({
text: _('ID_EXPORT'),
iconCls: 'button_menu_ext ss_sprite ss_basket_go',
iconCls: 'button_menu_ext ss_sprite ss_building_go',
handler: exportSkin,
disabled: true
});
searchButton = new Ext.Action({
text: _('ID_SEARCH'),
handler: DoSearch
});
contextMenu = new Ext.menu.Menu({
items: [exportButton]
items: [exportButton,deleteButton]
});
searchText = new Ext.form.TextField ({
@@ -152,16 +135,34 @@ Ext.onReady(function(){
rowSelected = infoGrid.getSelectionModel().getSelected();
if((rowSelected.data.SKIN_FOLDER_ID)&&((rowSelected.data.SKIN_FOLDER_ID!="classic"))){
exportButton.enable();
deleteButton.enable();
}else{
exportButton.disable();
deleteButton.disable();
}
},
rowdeselect: function(sm){
exportButton.disable();
deleteButton.disable();
}
}
});
storeSkins = new Ext.data.JsonStore({
root: 'skins',
totalProperty: 'totalCount',
idProperty: 'SKIN_FOLDER_ID',
autoLoad : false,
remoteSort: false,
fields: [
'SKIN_FOLDER_ID',
'SKIN_NAME'
],
proxy: new Ext.data.HttpProxy({
url: 'skin_Ajax?action=skinList'
})
});
store = new Ext.data.GroupingStore( {
proxy : new Ext.data.HttpProxy({
url: 'skin_Ajax?action=skinList'
@@ -254,7 +255,7 @@ Ext.onReady(function(){
align:'center',
renderer: showdate
}
//{header: _('ID_STATUS'), dataIndex: 'SKIN_STATUS', width: 130, align:'center', renderer: render_status},
]
});
@@ -314,7 +315,7 @@ Ext.onReady(function(){
store: store,
cm: cmodel,
sm: smodel,
tbar: [newButton, '-', importButton,exportButton, {
tbar: [newButton, '-', importButton,exportButton,'-',deleteButton, {
xtype: 'tbfill'
}, searchText,clearTextButton,searchButton],
bbar: bbarpaging,
@@ -371,6 +372,155 @@ onMessageContextMenu = function (grid, rowIndex, e) {
//Do Nothing Function
DoNothing = function(){};
newSkin = function(){
newDialog = new Ext.Window( {
id: "newDialog",
title:_('ID_NEW_SKIN'),
autoCreate: true,
modal:true,
width:400,
autoHeight:true,
shadow:true,
minWidth:100,
minHeight:50,
proxyDrag: true,
resizable: true,
keys: {
key: 27,
fn : function(){
newDialog.hide();
}
},
items:[
{
xtype:'form',
autoScroll:true,
autoHeight:true,
id:"newform",
fileUpload:true,
labelWidth:100,
url:'skin_Ajax',
frame:false,
items:[
{
xtype:'textfield',
id:'skinName',
allowBlank: false,
width:200,
emptyText: _('ID_SKIN_NAME_REQUIRED'),
fieldLabel:_('ID_NAME'),
enableKeyEvents:true,
vtype:'alphanum',
listeners: {
keyup:function(a,b,c){
Ext.getCmp('newform').getForm().findField('skinFolder').setValue(a.getValue().toLowerCase());
}
}
},
{
xtype:'textfield',
emptyText: _('ID_SKIN_FOLDER_REQUIRED'),
id:'skinFolder',
fieldLabel:_('ID_SKIN_FOLDER'),
width:200,
vtype:'alphanum',
autoCreate: {
tag: 'input',
type: 'text',
size: '20',
autocomplete: 'off',
maxlength: '10'
}
},
{
xtype:'textarea',
id:'skinDescription',
fieldLabel:_('ID_DESCRIPTION'),
width:200
},
{
xtype:'textfield',
id:'skinAuthor',
emptyText :'ProcessMaker Team',
value :'ProcessMaker Team',
allowBlank: false,
width:200,
fieldLabel:_('ID_AUTHOR')
},
new Ext.form.ComboBox({
id:'skinBase',
fieldLabel : _('ID_SKIN_BASE'),
editable : false,
store: storeSkins,
valueField :'SKIN_FOLDER_ID',
displayField :'SKIN_NAME',
submitValue:true,
typeAhead : false,
triggerAction : 'all',
allowBlank: false,
selectOnFocus:true,
width:200
})
],
buttons:[
{
text:_('ID_SAVE'),
handler: function() {
//statusBarMessage( _('ID_UPLOADING_FILE'), true, true );
newDialog.getEl().mask(_('ID_SKIN_CREATING'));
form = Ext.getCmp("newform").getForm();
//Ext.getCmp("uploadform").getForm().submit();
//console.log(form);
//console.log(form.url);
Ext.getCmp("newform").getForm().submit({
//reset: true,
reset: false,
success: function(form, action) {
store.reload();
Ext.getCmp("newDialog").destroy();
PMExt.notify(_('ID_SKINS'),_('ID_SKIN_SUCCESS_CREATE'));
},
failure: function(form, action) {
Ext.getCmp("newDialog").destroy();
if( !action.result ) {
Ext.MessageBox.alert("error", _('ID_ERROR'));
return;
}
Ext.MessageBox.alert("error", action.result.error);
},
scope: Ext.getCmp("newform"),
// add some vars to the request, similar to hidden fields
params: {
action: "newSkin",
requestType: "xmlhttprequest"
}
});
}
},
{
text:_('ID_CANCEL'),
handler: function() {
Ext.getCmp("newDialog").destroy();
}
}
]
}
]
});
newDialog.on( 'hide', function() {
newDialog.destroy(true);
} );
newDialog.show();
}
importSkin = function(){
importDialog = new Ext.Window( {
id: "importDialog",
@@ -399,19 +549,19 @@ importSkin = function(){
fileUpload:true,
labelWidth:90,
url:'skin_Ajax',
tooltip:"Max File Size <strong>XXX MB</strong><br />Max Post Size<strong>XXX MB</strong><br />",
//tooltip:"Max File Size <strong>XXX MB</strong><br />Max Post Size<strong>XXX MB</strong><br />",
frame:false,
items:[
{
xtype:"displayfield",
value:"Max File Size <strong>XXX MB</strong><br />Max Post Size<strong>XXX MB</strong><br />"
},
//{
// xtype:"displayfield",
// value:"Max File Size <strong>XXX MB</strong><br />Max Post Size<strong>XXX MB</strong><br />"
//},
{
xtype:"fileuploadfield",
fieldLabel:"File ",
id:"uploadedFile",
name:"uploadedFile",
width:100,
width:190,
buttonOnly:false
},
{
@@ -440,6 +590,7 @@ importSkin = function(){
store.reload();
Ext.getCmp("importDialog").destroy();
PMExt.notify(_('ID_SKINS'),_('ID_SKIN_SUCCESS_IMPORTED'));
},
failure: function(form, action) {
Ext.getCmp("importDialog").destroy();
@@ -530,10 +681,6 @@ exportSkin = function(){
}
//Open New Calendar
NewCalendarAction = function(){
location.href = 'calendarEdit';
};
//Load Grid By Default
GridByDefault = function(){
@@ -550,45 +697,25 @@ DoSearch = function(){
});
};
//Edit Calendar Action
EditCalendarAction = function(){
rowSelected = infoGrid.getSelectionModel().getSelected();
if (rowSelected){
location.href = 'calendarEdit?id=' + rowSelected.data.CALENDAR_UID;
}
};
//Delete Button Action
DeleteButtonAction = function(){
rowSelected = infoGrid.getSelectionModel().getSelected();
viewport.getEl().mask(_('ID_PROCESSING'));
Ext.Ajax.request({
url: 'calendar_Ajax',
params: {
action: 'canDeleteCalendar',
CAL_UID: rowSelected.data.CALENDAR_UID
},
success: function(r,o){
viewport.getEl().unmask();
var resp = Ext.util.JSON.decode(r.responseText);
if (resp.success){
Ext.Msg.confirm(_('ID_CONFIRM'),_('ID_CONFIRM_DELETE_CALENDAR'),
deleteSkin = function(){
Ext.Msg.confirm(_('ID_CONFIRM'),_('ID_CONFIRM_DELETE_SKIN'),
function(btn, text){
if (btn=='yes'){
viewport.getEl().mask(_('ID_PROCESSING'));
Ext.Ajax.request({
url: 'calendar_Ajax',
url: 'skin_Ajax',
params: {
action: 'deleteCalendar',
CAL_UID: rowSelected.data.CALENDAR_UID
action: 'deleteSkin',
SKIN_FOLDER_ID: rowSelected.data.SKIN_FOLDER_ID
},
success: function(r,o){
viewport.getEl().unmask();
editButton.disable();
deleteButton.disable();
copyButton.disable();
DoSearch();
PMExt.notify(_('ID_CALENDARS'),_('ID_CALENDAR_SUCCESS_DELETE'));
store.reload();
PMExt.notify(_('ID_SKINS'),_('ID_SKIN_SUCCESS_DELETE'));
},
failure: function(r,o){
viewport.getEl().unmask();
@@ -597,40 +724,9 @@ DeleteButtonAction = function(){
}
}
);
}else{
PMExt.error(_('ID_CALENDARS'),_('ID_MSG_CANNOT_DELETE_CALENDAR'));
}
},
failure: function(r,o){
viewport.getEl().unmask();
}
});
};
//Render Status
render_status = function(v){
switch(v){
case 'ACTIVE':
return '<font color="green">' + _('ID_ACTIVE') + '</font>';
break;
case 'INACTIVE':
return '<font color="red">' + _('ID_INACTIVE') + '</font>';
;
break;
case 'VACATION':
return '<font color="blue">' + _('ID_VACATION') + '</font>';
;
break;
}
};
//Members Button Action
CopyButtonAction = function(){
rowSelected = infoGrid.getSelectionModel().getSelected();
if (rowSelected){
location.href = 'calendarEdit?cp=1&id=' + rowSelected.data.CALENDAR_UID;
}
};
//Update Page Size Configuration
UpdatePageConfig = function(pageSize){
@@ -642,6 +738,7 @@ UpdatePageConfig = function(pageSize){
}
});
};
function changeSkin(newSkin,currentSkin){
currentLocation=top.location.href;
newLocation = currentLocation.replace("/"+currentSkin+"/","/"+newSkin+"/");