From eb21361c3704291fcbbb4f11cc244019bde25e80 Mon Sep 17 00:00:00 2001 From: Yung Han Khoe Date: Sun, 30 Nov 2008 09:28:46 +0000 Subject: [PATCH 1/4] Creating a branch to work on thingy RFEs From 47ee55639e93aa0a513d80d1506d95618fd5a143 Mon Sep 17 00:00:00 2001 From: Yung Han Khoe Date: Sun, 30 Nov 2008 11:11:04 +0000 Subject: [PATCH 2/4] rfe: Thing-copy function (#9098) --- .../templates_thingy-default.wgpkg | Bin 0 -> 1139 bytes lib/WebGUI/Asset/Wobject/Thingy.pm | 57 ++++++++++++++++++ t/Asset/Wobject/Thingy.t | 10 ++- 3 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 docs/upgrades/packages-thingy-rfe/templates_thingy-default.wgpkg diff --git a/docs/upgrades/packages-thingy-rfe/templates_thingy-default.wgpkg b/docs/upgrades/packages-thingy-rfe/templates_thingy-default.wgpkg new file mode 100644 index 0000000000000000000000000000000000000000..d1ec87948dcad0845fa58eb7046b4aa7965e3d1a GIT binary patch literal 1139 zcmV-(1dRJ1iwFP!000001MOCAZz4Ak=JWlE)qbd2=}LB&1rm-TB_+8a<*hk#QB_)G zb{*CiV{dE&*`Dsd-`HO8LXy+zn)Fi~iGXM3nVDzCW7lghzk(oWH=DIu5QOb!SgSSK zc6sX+)IwNs+>RPiT=T*pj9WDiOkRG?r9uKiTjI%dPJY}UBne9=Y5)H?(*J5{q7B_= zTz;>AlAJwLB!J$E<0tDMH(RZ(`ZwaJQS*S!mtQYc|N6^^{u~}Yzkx&OOT`76V&Cg{ zfBpT|Y~_OISSW&}-Zg4kGZ7dmoE{W<*KhbnSqmtV>hM120;K!KhRrEmi{X?hgYW0_ z2_-Vask3Exc}-Z#mj*O&0$DJgOY#toFBukB5{p5)9SFWx0v%(N4$<_XA(9fS(rB0w zHZ6v;oSOc(AEEO;7u0|&3@Q-5+)>8j*A(BNIaN-R$YYYGm~F>T&-3L^)%a%cqIlq|di=#{^X{N>aJJ@R`aF=8XtRS?^l+;|d8NjR%7kf@_{ zM%XzkRX{24Sv?SX31>=hDtq0XdzI_5KtRrg+39s< zj@VjD&Jd+ofS&i$1UloLcZwMFoM#e}-5sqBF=f$r1%+iINUk7b7gLp})G2I)R@nz< zVDUZP62x?!Y^0C-Td}GOqs*USQGe?qFBA9%s^=I&X=>2M&||%k?^sd=#RqexI0K}A z225eWkWLfPpTWpex&u9mCYZh*`TM$?#|Ehw`M%CGLXTERG%W6Jreb4n*$?J2JX%3*qFG8_%2$F!|YVhhJGRjuHZUi5k5f#s!UL#PwOKWzV+{3uRIng;X#}3Do<&P| zUX+r}PR~(-1%#@J-ip8!&Yp}4HJc?ck=rtCGW}$kTmjt-AuPj!s4GE_1fN|XftejN zl^H|{!{ylb-4h@%Pk_}!z#*CSp5qo*_1U>bf}P zDY+qV5$LNVjH2BjZp5uU2Vv%jk@oGxwZo!t8s!xI2t_h_Z6_j9pIJ1aHr~oym$xK8 z;|hEy=4ctq3N16t=4RY|)3wfTZY~%<$1H^=a=y(i^MU+Zx{kt1QaKWEZyD$(IP7$e zho>hG8O`8QJD@zd)y5mQE0HI#{TRh4|_ zY1icncN|J?S8Y_KIpfO#JK|zyS*nN_bP=4H#PVb3mqWxX5k;;pR+yED6q=Tocf_;Z zkC$iY?(isCsession->db; + + my $thingProperties = $self->getThing($oldThingId); + $thingProperties->{thingId} = 'new'; + $thingProperties->{label} = $thingProperties->{label}.' (copy)'; + + my $newThingId = $self->addThing($thingProperties); + my $fields = $db->buildArrayRefOfHashRefs('select * from Thingy_fields where assetId=? and thingId=?' + ,[$self->getId,$oldThingId]); + foreach my $field (@$fields) { + # set thingId to newly created thing's id. + $field->{thingId} = $newThingId; + $self->addField($field,0); + } + + return $newThingId; + +} + +#------------------------------------------------------------------- + =head2 deleteField ( fieldId , thingId ) Deletes a field from Collateral and drops the fields column in the thingy table. @@ -1395,6 +1430,26 @@ sub www_deleteFieldConfirm { return 1; } + +#------------------------------------------------------------------- + +=head2 www_deleteFieldConfirm ( ) + +Duplicates a Thing. + +=cut + +sub www_duplicateThing { + my $self = shift; + my $session = $self->session; + my $thingId = $session->form->process("thingId"); + return $session->privilege->insufficient() unless $self->canEdit; + + $self->duplicateThing($thingId); + + return $self->www_manage; +} + #------------------------------------------------------------------- =head2 www_copyThingData( ) @@ -2821,6 +2876,8 @@ sub www_manage { "",$i18n->get('delete thing warning')), 'thing_editUrl' => $session->url->append($url, 'func=editThing;thingId='.$thing->{thingId}), 'thing_editIcon' => $session->icon->edit('func=editThing;thingId='.$thing->{thingId}), + 'thing_copyUrl' => $session->url->append($url, 'func=duplicateThing;thingId='.$thing->{thingId}), + 'thing_copyIcon' => $session->icon->copy('func=duplicateThing;thingId='.$thing->{thingId}), 'thing_addUrl' => $session->url->append($url, 'func=editThingData;thingId='.$thing->{thingId}.';thingDataId=new'), 'thing_searchUrl' => $session->url->append($url, 'func=search;thingId='.$thing->{thingId}), diff --git a/t/Asset/Wobject/Thingy.t b/t/Asset/Wobject/Thingy.t index 45c198f04..646266512 100644 --- a/t/Asset/Wobject/Thingy.t +++ b/t/Asset/Wobject/Thingy.t @@ -17,7 +17,7 @@ use lib "$FindBin::Bin/../../lib"; use WebGUI::Test; use WebGUI::Session; use WebGUI::PseudoRequest; -use Test::More tests => 16; # increment this value for each test you create +use Test::More tests => 17; # increment this value for each test you create use Test::Deep; use JSON; use WebGUI::Asset::Wobject::Thingy; @@ -192,6 +192,14 @@ my ($fieldLabel, $columnType, $Null, $Key, $Default, $Extra) = $session->db->qui is($fieldLabel,"field_".$fieldId,"A column for the new field Field_$fieldId exists."); is($columnType,"longtext","The columns is the right type"); +# Test duplicating a Thing + +my $copyThingId = $thingy->duplicateThing($thingId); + +$isValidId = $session->id->valid($copyThingId); + +is($isValidId,1,"duplicating a Thing: duplicateThing returned a valid id: ".$copyThingId); + # Test adding, editing, getting and deleting thing data my ($newThingDataId,$errors) = $thingy->editThingDataSave($thingId,'new',{"field_".$fieldId => 'test value'}); From 858c9033b92ed02f6f5f6ffa21336d93238fa023 Mon Sep 17 00:00:00 2001 From: Yung Han Khoe Date: Tue, 2 Dec 2008 10:04:00 +0000 Subject: [PATCH 3/4] Added rfe 9128: Thingy fields subtext and pretext now have max length of 1024. --- docs/upgrades/rfe-9128.sql | 1 + lib/WebGUI/Asset/Wobject/Thingy.pm | 2 ++ 2 files changed, 3 insertions(+) create mode 100644 docs/upgrades/rfe-9128.sql diff --git a/docs/upgrades/rfe-9128.sql b/docs/upgrades/rfe-9128.sql new file mode 100644 index 000000000..b554f347c --- /dev/null +++ b/docs/upgrades/rfe-9128.sql @@ -0,0 +1 @@ +alter table Thingy_fields change subtext subtext text, change pretext pretext text; diff --git a/lib/WebGUI/Asset/Wobject/Thingy.pm b/lib/WebGUI/Asset/Wobject/Thingy.pm index 76e9a2c16..db7832320 100644 --- a/lib/WebGUI/Asset/Wobject/Thingy.pm +++ b/lib/WebGUI/Asset/Wobject/Thingy.pm @@ -702,12 +702,14 @@ sub getEditFieldForm { -value=>$field->{pretext}, -label=>$i18n->get('pretext label'), -hoverHelp=>$i18n->get('pretext description'), + -maxlength=>'1024', ); $f->text( -name=>"subtext", -value=>$field->{subtext}, -label=>$i18n->get('subtext label'), -hoverHelp=>$i18n->get('subtext description'), + -maxlength=>'1024', ); $f->selectBox( -name=>"status", From 1527ac43e85af797797724440c3fea31ce69d378 Mon Sep 17 00:00:00 2001 From: Yung Han Khoe Date: Wed, 3 Dec 2008 12:43:10 +0000 Subject: [PATCH 4/4] added rfe #w9099: Thingy field-copy function --- lib/WebGUI/Asset/Wobject/Thingy.pm | 30 ++++++++++++---- www/extras/wobject/Thingy/thingy.js | 53 +++++++++++++++++++---------- 2 files changed, 58 insertions(+), 25 deletions(-) diff --git a/lib/WebGUI/Asset/Wobject/Thingy.pm b/lib/WebGUI/Asset/Wobject/Thingy.pm index db7832320..1db70039d 100644 --- a/lib/WebGUI/Asset/Wobject/Thingy.pm +++ b/lib/WebGUI/Asset/Wobject/Thingy.pm @@ -643,7 +643,10 @@ sub getEditFieldForm { } my $dialogPrefix; - if ($fieldId eq "new"){ + if ($field->{oldFieldId}){ + $dialogPrefix = "edit_".$field->{oldFieldId}."_Dialog_copy"; + } + elsif($fieldId eq "new"){ $dialogPrefix = "addDialog"; } else{ @@ -1727,7 +1730,10 @@ sub www_editThing { ." ".$field->{label}."\n" ." ".$formElement."\n" ." session->url->page() - ."?func=editField;fieldId=".$field->{fieldId}.";thingId=".$thingId."','".$field->{fieldId}."')\" value='Edit' type='button'>" + ."?func=editField;fieldId=".$field->{fieldId}.";thingId=".$thingId."','".$field->{fieldId}."')\" value='Edit' type='button'>" + ." session->url->page() + ."?func=editField;copy=1;fieldId=".$field->{fieldId}.";thingId=".$thingId."','".$field->{fieldId} + ."','copy')\" value='Copy' type='button'>" ."session->url->page()."','".$field->{fieldId}."','".$thingId."')\" " ."value='Delete' type='button'>\n\n\n\n"; @@ -2068,12 +2074,19 @@ Returns the html for a pop-up dialog to add or edit a field. sub www_editField { - my $self = shift; + my $self = shift; + my $session = $self->session; my (%properties,$thingId,$fieldId,$dialogBody); - return $self->session->privilege->insufficient() unless $self->canEdit; - $fieldId = $self->session->form->process("fieldId"); - $thingId = $self->session->form->process("thingId"); - %properties = $self->session->db->quickHash("select * from Thingy_fields where thingId=".$self->session->db->quote($thingId)." and fieldId = ".$self->session->db->quote($fieldId)." and assetId = ".$self->session->db->quote($self->get("assetId"))); + return $session->privilege->insufficient() unless $self->canEdit; + $fieldId = $session->form->process("fieldId"); + $thingId = $session->form->process("thingId"); + %properties = $session->db->quickHash("select * from Thingy_fields where thingId=? and fieldId=? and assetId=?", + [$thingId,$fieldId,$self->get("assetId")]); + if($session->form->process("copy")){ + $properties{oldFieldId} = $properties{fieldId}; + $properties{fieldId} = 'new'; + $properties{label} = $properties{label}.' (copy)'; + } $dialogBody = $self->getEditFieldForm(\%properties); $self->session->output->print($dialogBody->print); return "chunked"; @@ -2157,6 +2170,9 @@ sub www_editFieldSave { ."".$formElement."\n" ." session->url->page() ."?func=editField;fieldId=".$newFieldId.";thingId=".$properties{thingId}."','".$newFieldId."')\" value='Edit' type='button'>" + ." session->url->page() + ."?func=editField;copy=1;fieldId=".$newFieldId.";thingId=".$properties{thingId}."','".$newFieldId + ."','copy')\" value='Copy' type='button'>" ."session->url->page()."','".$newFieldId ."','".$properties{thingId}."')\" value='Delete' type='button'>\n\n"; diff --git a/www/extras/wobject/Thingy/thingy.js b/www/extras/wobject/Thingy/thingy.js index 6d0fdde70..24992fe60 100644 --- a/www/extras/wobject/Thingy/thingy.js +++ b/www/extras/wobject/Thingy/thingy.js @@ -129,15 +129,18 @@ function initOptionalFields(prefix,fieldId) { } } -function editListItem(url,fieldId) { +function editListItem(url,fieldId,copy) { var handleGetFormSuccess = function(o){ - var handleSuccess = function(o) { var response = o.responseText; var listItemId = response.slice(0,22); var newInnerHTML = response.slice(22); var label = editFieldDialog.getData().label; + + if(copy){ + addListItemHTML(listItemId, newInnerHTML,label); + } var li = new YAHOO.util.Element(listItemId); li.set('innerHTML',newInnerHTML); @@ -159,21 +162,31 @@ function editListItem(url,fieldId) { this.destroy(); }; function optionalFields() { - initOptionalFields("edit_"+fieldId+"_Dialog",fieldId); + initOptionalFields(dialogId,fieldId); } - editFieldDialog = new YAHOO.widget.Dialog("edit_"+fieldId+"_Dialog", { width:"460px", visible:false, draggable:true, close:true, fixedcenter:true, zIndex:11001, height: "420px", + + var dialogId = "edit_"+fieldId+"_Dialog"; + if(copy){ + dialogId = dialogId + '_copy'; + } + + editFieldDialog = new YAHOO.widget.Dialog(dialogId, { width:"460px", visible:false, draggable:true, close:true, fixedcenter:true, zIndex:11001, height: "420px", autofillheight:false, buttons : [ { text:"Submit", handler:handleSubmit, isDefault:true }, { text:"Cancel", handler:handleCancel } ] } ); - - editFieldDialog.setHeader("Edit Field"); + + if(copy){ + editFieldDialog.setHeader("Copy Field"); + }else{ + editFieldDialog.setHeader("Edit Field"); + } editFieldDialog.setBody(o.responseText); editFieldDialog.render(document.body); editFieldDialog.callback = { success: handleSuccess, failure: handleFailure }; editFieldDialog.show(); - YAHOO.util.Event.onContentReady("edit_"+fieldId+"_Dialog", optionalFields); - initHoverHelp("edit_"+fieldId+"_Dialog"); + YAHOO.util.Event.onContentReady(dialogId, optionalFields); + initHoverHelp(dialogId); }; @@ -191,16 +204,8 @@ function editListItem(url,fieldId) { var request = YAHOO.util.Connect.asyncRequest('GET', url, callbackGetForm); } - -function initAddFieldDialog() { - - var handleSuccess = function(o) { - var response = o.responseText; - var listItemId = response.slice(0,22); - var newInnerHTML = response.slice(22); - var label = addFieldDialog.getData().label; - - var ul1 = new YAHOO.util.Element('ul1'); +function addListItemHTML(listItemId, newInnerHTML,label){ + var ul1 = new YAHOO.util.Element('ul1'); var li = document.createElement('li'); li.id = listItemId; li.className = 'list1'; @@ -275,6 +280,18 @@ function initAddFieldDialog() { viewScreenTitle_td.innerHTML = ""; } view_tr.appendChild(viewScreenTitle_td); +} + + +function initAddFieldDialog() { + + var handleSuccess = function(o) { + var response = o.responseText; + var listItemId = response.slice(0,22); + var newInnerHTML = response.slice(22); + var label = addFieldDialog.getData().label; + addListItemHTML(listItemId, newInnerHTML,label); + }; var handleFailure = function(o) {