fix JSON lookup methods to always return an empty array, to prevent the infamous Data Error label from being displayed. Also, EMS clean-up, round 1
This commit is contained in:
parent
a8bce70cdb
commit
630eda0e03
2 changed files with 4 additions and 375 deletions
|
|
@ -25,6 +25,7 @@
|
||||||
- fixed: asset context menu is positioned incorrectly on RTL pages
|
- fixed: asset context menu is positioned incorrectly on RTL pages
|
||||||
- fixed: asset context menu broken if the only asset is a navigation included by AssetProxy
|
- fixed: asset context menu broken if the only asset is a navigation included by AssetProxy
|
||||||
- fixed: EMS Ticket Meta Fields- Can't Delete
|
- fixed: EMS Ticket Meta Fields- Can't Delete
|
||||||
|
- fixed: Ribbons and Tokens on badge page error
|
||||||
|
|
||||||
7.5.17
|
7.5.17
|
||||||
- fixed: Payment Methods Hover Help Incomplete
|
- fixed: Payment Methods Hover Help Incomplete
|
||||||
|
|
|
||||||
|
|
@ -665,6 +665,7 @@ sub www_getBadgesAsJson {
|
||||||
return $session->privilege->insufficient() unless $self->canView;
|
return $session->privilege->insufficient() unless $self->canView;
|
||||||
my ($db, $form) = $session->quick(qw(db form));
|
my ($db, $form) = $session->quick(qw(db form));
|
||||||
my %results = ();
|
my %results = ();
|
||||||
|
$results{records} = [];
|
||||||
foreach my $badge (@{$self->getBadges}) {
|
foreach my $badge (@{$self->getBadges}) {
|
||||||
push(@{$results{records}}, {
|
push(@{$results{records}}, {
|
||||||
title => $badge->getTitle,
|
title => $badge->getTitle,
|
||||||
|
|
@ -894,6 +895,7 @@ sub www_getRibbonsAsJson {
|
||||||
return $session->privilege->insufficient() unless $self->canView;
|
return $session->privilege->insufficient() unless $self->canView;
|
||||||
my ($db, $form) = $session->quick(qw(db form));
|
my ($db, $form) = $session->quick(qw(db form));
|
||||||
my %results = ();
|
my %results = ();
|
||||||
|
$results{records} = [];
|
||||||
foreach my $ribbon (@{$self->getRibbons}) {
|
foreach my $ribbon (@{$self->getRibbons}) {
|
||||||
push(@{$results{records}}, {
|
push(@{$results{records}}, {
|
||||||
title => $ribbon->getTitle,
|
title => $ribbon->getTitle,
|
||||||
|
|
@ -1080,6 +1082,7 @@ sub www_getTokensAsJson {
|
||||||
return $session->privilege->insufficient() unless $self->canView;
|
return $session->privilege->insufficient() unless $self->canView;
|
||||||
my ($db, $form) = $session->quick(qw(db form));
|
my ($db, $form) = $session->quick(qw(db form));
|
||||||
my %results = ();
|
my %results = ();
|
||||||
|
$results{records} = []; ##Initialize to an empty array
|
||||||
foreach my $token (@{$self->getTokens}) {
|
foreach my $token (@{$self->getTokens}) {
|
||||||
push(@{$results{records}}, {
|
push(@{$results{records}}, {
|
||||||
title => $token->getTitle,
|
title => $token->getTitle,
|
||||||
|
|
@ -1544,128 +1547,6 @@ sub www_toggleRegistrantCheckedIn {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
sub _getFieldHash {
|
|
||||||
my $self = shift;
|
|
||||||
return $self->{_fieldHash} if ($self->{_fieldHash});
|
|
||||||
|
|
||||||
my %hash;
|
|
||||||
tie %hash, "Tie::IxHash";
|
|
||||||
my $i18n = WebGUI::International->new($self->session,'Asset_EventManagementSystem');
|
|
||||||
%hash = (
|
|
||||||
"eventName"=>{
|
|
||||||
name=>$i18n->get('add/edit event title'),
|
|
||||||
type=>"text",
|
|
||||||
compare=>"text",
|
|
||||||
method=>"text",
|
|
||||||
columnName=>"title",
|
|
||||||
tableName=>"p",
|
|
||||||
initial=>1
|
|
||||||
},
|
|
||||||
"eventDescription"=>{
|
|
||||||
name=>$i18n->get("add/edit event description"),
|
|
||||||
type=>"text",
|
|
||||||
compare=>"text",
|
|
||||||
method=>"text",
|
|
||||||
columnName=>"description",
|
|
||||||
tableName=>"p",
|
|
||||||
initial=>1
|
|
||||||
},
|
|
||||||
"maxAttendees"=>{
|
|
||||||
name=>$i18n->get("add/edit event maximum attendees"),
|
|
||||||
type=>"text",
|
|
||||||
compare=>"numeric",
|
|
||||||
method=>"integer",
|
|
||||||
columnName=>"maximumAttendees",
|
|
||||||
tableName=>"e",
|
|
||||||
initial=>1
|
|
||||||
},
|
|
||||||
"seatsAvailable"=>{
|
|
||||||
name=>$i18n->get("seats available"),
|
|
||||||
type=>"text",
|
|
||||||
method=>"integer",
|
|
||||||
compare=>"numeric",
|
|
||||||
calculated=>1,
|
|
||||||
initial=>1
|
|
||||||
},
|
|
||||||
"price"=>{
|
|
||||||
name=>$i18n->get("price"),
|
|
||||||
type=>"text",
|
|
||||||
compare=>"numeric",
|
|
||||||
method=>"float",
|
|
||||||
columnName=>"price",
|
|
||||||
tableName=>"p",
|
|
||||||
initial=>1
|
|
||||||
},
|
|
||||||
"startDate"=>{
|
|
||||||
name=>$i18n->get("add/edit event start date"),
|
|
||||||
type=>"dateTime",
|
|
||||||
compare=>"numeric",
|
|
||||||
method=>"dateTime",
|
|
||||||
columnName=>"startDate",
|
|
||||||
tableName=>"e",
|
|
||||||
initial=>1
|
|
||||||
},
|
|
||||||
"endDate"=>{
|
|
||||||
name=>$i18n->get("add/edit event end date"),
|
|
||||||
type=>"dateTime",
|
|
||||||
compare=>"numeric",
|
|
||||||
method=>"dateTime",
|
|
||||||
columnName=>"endDate",
|
|
||||||
tableName=>"e",
|
|
||||||
initial=>1
|
|
||||||
},
|
|
||||||
"sku"=>{
|
|
||||||
name=>$i18n->get("Event Number"),
|
|
||||||
type=>"text",
|
|
||||||
compare=>"numeric",
|
|
||||||
method=>"text",
|
|
||||||
columnName=>"sku",
|
|
||||||
tableName=>"p",
|
|
||||||
initial=>1
|
|
||||||
},
|
|
||||||
"requirement"=>{
|
|
||||||
name=>$i18n->get('add/edit event required events'),
|
|
||||||
type=>"select",
|
|
||||||
list=>{''=>$i18n->get('select one'),$self->_getAllEvents()},
|
|
||||||
compare=>"boolean",
|
|
||||||
method=>"selectBox",
|
|
||||||
calculated=>1,
|
|
||||||
initial=>0
|
|
||||||
}
|
|
||||||
);
|
|
||||||
# Add custom metadata fields to the list, matching the types up
|
|
||||||
# automatically.
|
|
||||||
my $fieldList = $self->getEventMetaFields;
|
|
||||||
foreach my $field (@{$fieldList}) {
|
|
||||||
next unless $field->{visible};
|
|
||||||
my $dataType = $field->{dataType};
|
|
||||||
my $compare = $self->_matchTypes($dataType);
|
|
||||||
my $type;
|
|
||||||
if ($dataType =~ /^date/i) {
|
|
||||||
$type = lcfirst($dataType);
|
|
||||||
} elsif ($compare eq 'text' || $compare eq 'numeric') {
|
|
||||||
$type = 'text';
|
|
||||||
} else {
|
|
||||||
$type = 'select';
|
|
||||||
}
|
|
||||||
$hash{$field->{fieldId}} = {
|
|
||||||
name=>$field->{label},
|
|
||||||
type=>$type,
|
|
||||||
method=>$dataType,
|
|
||||||
initial=>$field->{autoSearch},
|
|
||||||
compare=>$compare,
|
|
||||||
calculated=>1,
|
|
||||||
metadata=>1
|
|
||||||
};
|
|
||||||
if ($hash{$field->{fieldId}}->{type} eq 'select') {
|
|
||||||
$hash{$field->{fieldId}}->{list} = $self->_matchPairs($field->{possibleValues});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$self->{_fieldHash} = \%hash;
|
|
||||||
return $self->{_fieldHash};
|
|
||||||
}
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
#-------------------------------------------------------------------
|
||||||
sub _acWrapper {
|
sub _acWrapper {
|
||||||
|
|
@ -1686,223 +1567,6 @@ sub _acWrapper {
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
#-------------------------------------------------------------------
|
||||||
|
|
||||||
sub _matchPairs {
|
|
||||||
my $self = shift;
|
|
||||||
my $options = shift;
|
|
||||||
my %hash;
|
|
||||||
tie %hash, 'Tie::IxHash';
|
|
||||||
my $i18n = WebGUI::International->new($self->session, 'Asset_EventManagementSystem');
|
|
||||||
$hash{''} = $i18n->get('select one');
|
|
||||||
foreach (split("\n",$options)) {
|
|
||||||
my $val = $_;
|
|
||||||
#$val =~ s/\s//g;
|
|
||||||
$val =~ s/\r//g;
|
|
||||||
$val =~ s/\n//g;
|
|
||||||
$hash{$val} = $val;
|
|
||||||
}
|
|
||||||
return \%hash;
|
|
||||||
}
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
|
|
||||||
sub _matchTypes {
|
|
||||||
my $self = shift;
|
|
||||||
my $dataType = lc(shift);
|
|
||||||
return 'text' if (
|
|
||||||
WebGUI::Utility::isIn($dataType, qw(
|
|
||||||
codearea
|
|
||||||
email
|
|
||||||
htmlarea
|
|
||||||
phone
|
|
||||||
text
|
|
||||||
textarea
|
|
||||||
url
|
|
||||||
zipcode
|
|
||||||
))
|
|
||||||
);
|
|
||||||
return 'numeric' if (
|
|
||||||
WebGUI::Utility::isIn($dataType, qw(
|
|
||||||
date
|
|
||||||
datetime
|
|
||||||
float
|
|
||||||
integer
|
|
||||||
interval
|
|
||||||
))
|
|
||||||
);
|
|
||||||
return 'boolean' if (
|
|
||||||
WebGUI::Utility::isIn($dataType, qw(
|
|
||||||
checkbox
|
|
||||||
combo
|
|
||||||
selectlist
|
|
||||||
checklist
|
|
||||||
contenttype
|
|
||||||
databaselink
|
|
||||||
fieldtype
|
|
||||||
group
|
|
||||||
ldaplink
|
|
||||||
radio
|
|
||||||
radiolist
|
|
||||||
selectbox
|
|
||||||
template
|
|
||||||
timezone
|
|
||||||
yesno
|
|
||||||
))
|
|
||||||
);
|
|
||||||
return 'text';
|
|
||||||
}
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
|
|
||||||
sub _getAllEvents {
|
|
||||||
my $self = shift;
|
|
||||||
my $conditionalWhere;
|
|
||||||
if ($self->get("globalPrerequisites") == 0) {
|
|
||||||
$conditionalWhere = "and e.assetId=".$self->session->db->quote($self->get('assetId'));
|
|
||||||
}
|
|
||||||
my $sql = "select p.productId, p.title from products as p, EventManagementSystem_products as e
|
|
||||||
where p.productId = e.productId $conditionalWhere";
|
|
||||||
return $self->session->db->buildHash($sql);
|
|
||||||
}
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# Temporary Shopping Cart to store subevent selections for prerequisite and conflict checking
|
|
||||||
# Contents are moved to real shopping cart after attendee information is entered and the scratchCart gets emptied.
|
|
||||||
#
|
|
||||||
sub addToScratchCart {
|
|
||||||
my $self = shift;
|
|
||||||
my $event = shift;
|
|
||||||
my $scratchCart = $self->session->scratch->get('EMS_scratch_cart');
|
|
||||||
my @eventsInCart = split("\n",$scratchCart);
|
|
||||||
my ($isApproved) = $self->session->db->quickArray("select approved from EventManagementSystem_products where productId = ?",[$event]);
|
|
||||||
return undef unless $isApproved;
|
|
||||||
unless (scalar(@eventsInCart) || $scratchCart) {
|
|
||||||
# the cart is empty, so check if this is a master event or not.
|
|
||||||
my ($isChild) = $self->session->db->quickArray("select prerequisiteId from EventManagementSystem_products where productId = ?",[$event]);
|
|
||||||
return undef if $isChild;
|
|
||||||
$self->session->scratch->set('currentMainEvent',$event);
|
|
||||||
$self->session->scratch->set('EMS_scratch_cart', $event);
|
|
||||||
return $event;
|
|
||||||
}
|
|
||||||
# check if event is actually available.
|
|
||||||
my ($numberRegistered) = $self->session->db->quickArray("select count(*) from EventManagementSystem_registrations as r, EventManagementSystem_purchases as p, transaction as t where t.transactionId=p.transactionId and t.status='Completed' and r.purchaseId = p.purchaseId and r.returned=0 and r.productId=?",[$event]);
|
|
||||||
my ($maxAttendees) = $self->session->db->quickArray("select maximumAttendees from EventManagementSystem_products where productId=?",[$event]);
|
|
||||||
return undef unless ($self->canApproveEvents || ($maxAttendees > $numberRegistered));
|
|
||||||
|
|
||||||
my $bid = $self->session->scratch->get('currentBadgeId');
|
|
||||||
my @pastEvents = ($bid)?$self->session->db->buildArray("select r.productId from EventManagementSystem_registrations as r, EventManagementSystem_purchases as p, transaction as t where r.returned=0 and r.badgeId=? and t.transactionId=p.transactionId and t.status='Completed' and p.purchaseId=r.purchaseId group by productId",[$bid]):();
|
|
||||||
push(@eventsInCart, $event) unless (isIn($event,@eventsInCart) || isIn($event,@pastEvents));
|
|
||||||
|
|
||||||
$self->session->scratch->delete('EMS_scratch_cart');
|
|
||||||
$self->session->scratch->set('EMS_scratch_cart', join("\n", @eventsInCart));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
|
|
||||||
sub buildMenu {
|
|
||||||
my $self = shift;
|
|
||||||
my $var = shift;
|
|
||||||
my $i18n = WebGUI::International->new($self->session,'Asset_EventManagementSystem');
|
|
||||||
my $fields = $self->_getFieldHash();
|
|
||||||
my $counter = 0;
|
|
||||||
my $js = "var filterList = {\n";
|
|
||||||
foreach my $fieldId (keys %{$fields}) {
|
|
||||||
my $field = $fields->{$fieldId};
|
|
||||||
next if $fieldId eq 'requirement';
|
|
||||||
$js .= ",\n" if($counter++ > 0);
|
|
||||||
my $fieldName = $field->{name};
|
|
||||||
my $fieldType = $field->{type};
|
|
||||||
my $compareType = $field->{compare};
|
|
||||||
my $autoSearch = $field->{initial};
|
|
||||||
$js .= qq|"$fieldId": {|;
|
|
||||||
$js .= qq| "name":"$fieldName"|;
|
|
||||||
$js .= qq| ,"type":"$fieldType"|;
|
|
||||||
$js .= qq| ,"compare":"$compareType"|;
|
|
||||||
$js .= qq| ,"autoSearch":"$autoSearch"|;
|
|
||||||
if($fieldType eq "select") {
|
|
||||||
my $list = $field->{list};
|
|
||||||
my $fieldList = "";
|
|
||||||
foreach my $key (keys %{$list}) {
|
|
||||||
$fieldList .= "," if($fieldList ne "");
|
|
||||||
my $js_key = $key;
|
|
||||||
$js_key =~ s/\\/\\\\/g;
|
|
||||||
$js_key =~ s/"/\\"/g;
|
|
||||||
my $value = $list->{$key};
|
|
||||||
$value =~ s/\\/\\\\/g;
|
|
||||||
$value =~ s/"/\\"/g;
|
|
||||||
$fieldList .= qq|"$js_key":"$value"|
|
|
||||||
}
|
|
||||||
$js .= qq| ,"list":{ $fieldList }|;
|
|
||||||
}
|
|
||||||
$js .= q| }|;
|
|
||||||
}
|
|
||||||
$js .= "\n};\n";
|
|
||||||
|
|
||||||
$var->{'search.filters.options'} = $js;
|
|
||||||
$var->{'search.data.url'} = $self->getUrl("func=search");
|
|
||||||
}
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
|
|
||||||
=head2 checkConflicts ( )
|
|
||||||
|
|
||||||
Check for scheduling conflicts in events in the user's cart. A conflict is defined as
|
|
||||||
whenever two events have overlapping times.
|
|
||||||
|
|
||||||
=cut
|
|
||||||
|
|
||||||
sub checkConflicts {
|
|
||||||
my $self = shift;
|
|
||||||
# my $eventsInCart = $self->getEventsInCart;
|
|
||||||
my $checkSingleEvent = shift;
|
|
||||||
my $eventsInCart = $self->getEventsInScratchCart;
|
|
||||||
# $self->session->errorHandler->warn(Dumper($eventsInCart));
|
|
||||||
my @schedule;
|
|
||||||
|
|
||||||
# Get schedule info for events in cart and sort asc by start date
|
|
||||||
my $sth = $self->session->db->read("
|
|
||||||
select productId, startDate, endDate from EventManagementSystem_products
|
|
||||||
where productId in (".$self->session->db->quoteAndJoin($eventsInCart).")
|
|
||||||
order by startDate"
|
|
||||||
);
|
|
||||||
|
|
||||||
# Build our schedule
|
|
||||||
while (my $scheduleData = $sth->hashRef) {
|
|
||||||
|
|
||||||
# make sure it's a subevent...
|
|
||||||
my ($isSubEvent) = $self->session->db->quickArray("
|
|
||||||
select count(*) from EventManagementSystem_products
|
|
||||||
where (prerequisiteId is not null and prerequisiteId != '') and productId=?", [$scheduleData->{productId}]
|
|
||||||
);
|
|
||||||
next unless ($isSubEvent);
|
|
||||||
|
|
||||||
push(@schedule, $scheduleData);
|
|
||||||
}
|
|
||||||
my $singleData = {};
|
|
||||||
$singleData = $self->session->db->quickHashRef("select productId, startDate, endDate from EventManagementSystem_products where productId=?", [$checkSingleEvent]) if $checkSingleEvent;
|
|
||||||
|
|
||||||
# Check the schedule for conflicts
|
|
||||||
for (my $i=0; $i < scalar(@schedule); $i++) {
|
|
||||||
next if ($i == 0 && !$checkSingleEvent);
|
|
||||||
if ($checkSingleEvent) {
|
|
||||||
return 1 if ($singleData->{startDate} < $schedule[$i]->{endDate} && $singleData->{endDate} > $schedule[$i]->{startDate});
|
|
||||||
} else {
|
|
||||||
unless ($schedule[$i]->{startDate} > $schedule[$i-1]->{endDate}) {
|
|
||||||
#conflict
|
|
||||||
return [{ 'event1' => $schedule[$i]->{productId},
|
|
||||||
'event2' => $schedule[$i-1]->{productId},
|
|
||||||
'type' => 'conflict'
|
|
||||||
}];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0 if $checkSingleEvent;
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
|
|
||||||
=head2 checkRequiredFields ( [ dataHref ] [, recNum ] )
|
=head2 checkRequiredFields ( [ dataHref ] [, recNum ] )
|
||||||
|
|
||||||
Check for null form fields.
|
Check for null form fields.
|
||||||
|
|
@ -2037,42 +1701,6 @@ sub getRequiredFields {
|
||||||
return \%requiredFields;
|
return \%requiredFields;
|
||||||
}
|
}
|
||||||
|
|
||||||
#------------------------------------------------------------------
|
|
||||||
|
|
||||||
=head2 validateEditEventForm ( )
|
|
||||||
|
|
||||||
Returns array reference containing any errors generated while validating the input of the Add/Edit Event Form
|
|
||||||
|
|
||||||
=cut
|
|
||||||
|
|
||||||
sub validateEditEventForm {
|
|
||||||
my $self = shift;
|
|
||||||
my $errors;
|
|
||||||
my $i18n = WebGUI::International->new($self->session, 'Asset_EventManagementSystem');
|
|
||||||
|
|
||||||
$errors = $self->checkRequiredFields;
|
|
||||||
|
|
||||||
#Check price greater than zero
|
|
||||||
if ($self->session->form->get("price") < 0) {
|
|
||||||
push (@{$errors}, {
|
|
||||||
type => "general",
|
|
||||||
message => $i18n->get("price must be greater than zero"),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if ($self->session->form->get("pid") eq "meetmymaker") { # TODO - could this be more opaque?
|
|
||||||
push (@{$errors}, {
|
|
||||||
type => "special",
|
|
||||||
message => '/26T@<V]R<GDL($1A=F4N',
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
#Other checks go here
|
|
||||||
|
|
||||||
return $errors;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
#-------------------------------------------------------------------
|
||||||
|
|
||||||
=head2 www_test ( )
|
=head2 www_test ( )
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue