diff --git a/src/Controllers/LockupsController.php b/src/Controllers/LockupsController.php index 8674010ea228a16e52468315cb7cd39bb23aa549..a0b1a2379606db843e77d47de5ae2f6abb8f5f52 100644 --- a/src/Controllers/LockupsController.php +++ b/src/Controllers/LockupsController.php @@ -10,44 +10,30 @@ class LockupsController extends Controller { const LOCKUP_VERSION = '1.4'; - public static function createAction() { - \Core::$breadcrumbs[] = array('text' => 'Create Lockup'); - - $context = new \stdClass; - $context->lockup = new Lockup; - $context->approvers = User::find('all', array('conditions' => array('role' => 'approver'))); - return self::renderView('new_lockup', $context); - } - - public static function editAction($get_params) { - self::requireAuth(); - \Core::$breadcrumbs[] = array('text' => 'Edit Lockup'); - - if (empty($get_params['id'])) { - \Core::notFound(); + private static function checkTextFieldLength($params, $field, $max_length) { + if (strlen($params[$field]) > $max_length) { + self::flashNotice(parent::NOTICE_LEVEL_ERROR, 'Invalid Text', ucwords(implode(' ',explode('_', $field))) . ' must be ' . $max_length . ' characters or fewer.'); + return FALSE; } - $id = $get_params['id']; - try { - $lockup = Lockup::find($id); - } catch (\ActiveRecord\RecordNotFound $e) { - \Core::notFound('That lockup could not be found.'); + if (empty($params[$field])) { + self::flashNotice(parent::NOTICE_LEVEL_ERROR, 'Invalid Text', ucwords(implode(' ',explode('_', $field))) . ' must not be empty.'); + return FALSE; } - # the user must have submitted the lockup or be an admin to edit - if ($lockup->user_id != \Auth::$current_user->id && !(\Auth::$current_user->isAdmin())) { - self::flashNotice(parent::NOTICE_LEVEL_ERROR, 'Unauthorized', 'Sorry, you are not allowed to edit that lockup.'); - \Core::redirect('/lockups/manage/'); - } + return TRUE; + } - # this lockup must not be generated - if ($lockup->isGenerated()) { - self::flashNotice(parent::NOTICE_LEVEL_ERROR, 'Cannot Edit', 'Sorry, this lockup has been generated and cannot be edited. Please create a new lockup.'); - \Core::redirect('/lockups/manage/'); - } + public static function createAction() { + \Core::$breadcrumbs[] = array('text' => 'Create Lockup'); $context = new \stdClass; - $context->lockup = $lockup; + if (isset($_SESSION['create_lockup'])) { + $context->lockup = $_SESSION['create_lockup']; + unset($_SESSION['create_lockup']); + } else { + $context->lockup = new Lockup; + } $context->approvers = User::find('all', array('conditions' => array('role' => 'approver'))); return self::renderView('new_lockup', $context); } @@ -73,8 +59,7 @@ class LockupsController extends Controller { $svg_text = SVG::createPreviewLockup($post_params['type'], $lockup)->svg_text; $vert_svg_text = SVG::createPreviewLockup($post_params['type'], $lockup, 'vert')->svg_text; - - $model = Lockup::create(array( + $model = new Lockup(array( 'organization' => strtoupper($post_params['organization']), 'organization_second_line' => strtoupper($post_params['organization_second_line']), 'subject' => $post_params['subject'], @@ -96,9 +81,112 @@ class LockupsController extends Controller { 'version' => NULL )); + $valid = TRUE; + # validate the lengths of fields + switch ($lockup->style) { + case 'org_only': + $valid = $valid && self::checkTextFieldLength($post_params, 'organization', 30); + break; + case 'org_two_line': + $valid = $valid && self::checkTextFieldLength($post_params, 'organization', 30); + $valid = $valid && self::checkTextFieldLength($post_params, 'organization_second_line', 30); + break; + case 'org_subject': + $valid = $valid && self::checkTextFieldLength($post_params, 'organization', 30); + $valid = $valid && self::checkTextFieldLength($post_params, 'subject', 40); + break; + case 'org_subject_1_2': + $valid = $valid && self::checkTextFieldLength($post_params, 'organization', 30); + $valid = $valid && self::checkTextFieldLength($post_params, 'subject', 40); + $valid = $valid && self::checkTextFieldLength($post_params, 'subject_second_line', 40); + break; + case 'org_subject_2_1': + $valid = $valid && self::checkTextFieldLength($post_params, 'organization', 30); + $valid = $valid && self::checkTextFieldLength($post_params, 'organization_second_line', 30); + $valid = $valid && self::checkTextFieldLength($post_params, 'subject', 40); + break; + case 'org_subject_2_2': + $valid = $valid && self::checkTextFieldLength($post_params, 'organization', 30); + $valid = $valid && self::checkTextFieldLength($post_params, 'organization_second_line', 30); + $valid = $valid && self::checkTextFieldLength($post_params, 'subject', 40); + $valid = $valid && self::checkTextFieldLength($post_params, 'subject_second_line', 40); + break; + case 'acronym': + $valid = $valid && self::checkTextFieldLength($post_params, 'acronym', 10); + break; + case 'acronym_subject': + $valid = $valid && self::checkTextFieldLength($post_params, 'acronym', 10); + $valid = $valid && self::checkTextFieldLength($post_params, 'acronym_subject', 15); + break; + case 'acronym_subject_2_1': + $valid = $valid && self::checkTextFieldLength($post_params, 'acronym', 10); + $valid = $valid && self::checkTextFieldLength($post_params, 'acronym_second_line', 10); + $valid = $valid && self::checkTextFieldLength($post_params, 'acronym_subject', 15); + break; + case 'acronym_social': + $valid = $valid && self::checkTextFieldLength($post_params, 'acronym', 10); + break; + case 'extension': + $valid = $valid && self::checkTextFieldLength($post_params, 'extension_county', 40); + break; + case 'extension_4h': + $valid = $valid && self::checkTextFieldLength($post_params, 'extension_county', 40); + break; + default; + self::flashNotice(parent::NOTICE_LEVEL_ERROR, 'Invalid Style', 'Somehow you selected an invalid style. Please select one and try again.'); + $valid = FALSE; + break; + } + + if (!$valid) { + # store this lockup in the session so it can be seen on the page + $_SESSION['create_lockup'] = $model; + \Core::redirect('/lockups/create/'); + } + + $model->save(); \Core::redirect($model->getPreviewURL()); } + public static function editAction($get_params) { + self::requireAuth(); + \Core::$breadcrumbs[] = array('text' => 'Edit Lockup'); + + if (empty($get_params['id'])) { + \Core::notFound(); + } + + $id = $get_params['id']; + try { + $lockup = Lockup::find($id); + } catch (\ActiveRecord\RecordNotFound $e) { + \Core::notFound('That lockup could not be found.'); + } + + # the user must have submitted the lockup or be an admin to edit + if ($lockup->user_id != \Auth::$current_user->id && !(\Auth::$current_user->isAdmin())) { + self::flashNotice(parent::NOTICE_LEVEL_ERROR, 'Unauthorized', 'Sorry, you are not allowed to edit that lockup.'); + \Core::redirect('/lockups/manage/'); + } + + # this lockup must not be generated + if ($lockup->isGenerated()) { + self::flashNotice(parent::NOTICE_LEVEL_ERROR, 'Cannot Edit', 'Sorry, this lockup has been generated and cannot be edited. Please create a new lockup.'); + \Core::redirect('/lockups/manage/'); + } + + $context = new \stdClass; + + if (isset($_SESSION['edit_lockup'])) { + $context->lockup = $_SESSION['edit_lockup']; + unset($_SESSION['edit_lockup']); + } else { + $context->lockup = $lockup; + } + $context->approvers = User::find('all', array('conditions' => array('role' => 'approver'))); + return self::renderView('new_lockup', $context); + } + public static function postEditAction($post_params) { self::requireAuth(); @@ -143,28 +231,93 @@ class LockupsController extends Controller { $svg_text = SVG::createPreviewLockup($post_params['type'], $lockup)->svg_text; $vert_svg_text = SVG::createPreviewLockup($post_params['type'], $lockup, 'vert')->svg_text; - $lockup_model->update_attributes(array( - 'organization' => strtoupper($post_params['organization']), - 'organization_second_line' => strtoupper($post_params['organization_second_line']), - 'subject' => $post_params['subject'], - 'subject_second_line' => $post_params['subject_second_line'], - 'acronym' => strtoupper($post_params['acronym']), - 'acronym_second_line' => strtoupper($post_params['acronym_second_line']), - 'acronym_subject' => strtoupper($post_params['acronym_subject']), - 'extension_county' => $post_params['extension_county'], - 'style' => $post_params['type'], - 'user_id' => \Auth::$current_user->id, - 'date_created' => date('Y-m-d H:i:s'), - 'status' => Lockup::AWAITING_APPROVAL, - 'creative_status' => Lockup::AWAITING_APPROVAL, - 'preview_svg' => $svg_text, - 'vert_preview_svg' => $vert_svg_text, - 'approver_id' => empty($post_params['approver']) ? NULL : $post_params['approver'], - 'file_organization' => $post_params['file_organization'], - 'file_organization_acronym' => $post_params['file_organization_acronym'], - 'file_department' => $post_params['file_department'], - 'file_department_acronym' => $post_params['file_department_acronym'] - )); + $lockup_model->organization = strtoupper($post_params['organization']); + $lockup_model->organization_second_line = strtoupper($post_params['organization_second_line']); + $lockup_model->subject = $post_params['subject']; + $lockup_model->subject_second_line = $post_params['subject_second_line']; + $lockup_model->acronym = strtoupper($post_params['acronym']); + $lockup_model->acronym_second_line = strtoupper($post_params['acronym_second_line']); + $lockup_model->acronym_subject = strtoupper($post_params['acronym_subject']); + $lockup_model->extension_county = $post_params['extension_county']; + $lockup_model->style = $post_params['type']; + $lockup_model->user_id = \Auth::$current_user->id; + $lockup_model->date_created = date('Y-m-d H:i:s'); + $lockup_model->status = Lockup::AWAITING_APPROVAL; + $lockup_model->creative_status = Lockup::AWAITING_APPROVAL; + $lockup_model->preview_svg = $svg_text; + $lockup_model->vert_preview_svg = $vert_svg_text; + $lockup_model->approver_id = empty($post_params['approver']) ? NULL : $post_params['approver']; + $lockup_model->file_organization = $post_params['file_organization']; + $lockup_model->file_organization_acronym = $post_params['file_organization_acronym']; + $lockup_model->file_department = $post_params['file_department']; + $lockup_model->file_department_acronym = $post_params['file_department_acronym']; + + $valid = TRUE; + # validate the lengths of fields + switch ($lockup_model->style) { + case 'org_only': + $valid = $valid && self::checkTextFieldLength($post_params, 'organization', 30); + break; + case 'org_two_line': + $valid = $valid && self::checkTextFieldLength($post_params, 'organization', 30); + $valid = $valid && self::checkTextFieldLength($post_params, 'organization_second_line', 30); + break; + case 'org_subject': + $valid = $valid && self::checkTextFieldLength($post_params, 'organization', 30); + $valid = $valid && self::checkTextFieldLength($post_params, 'subject', 40); + break; + case 'org_subject_1_2': + $valid = $valid && self::checkTextFieldLength($post_params, 'organization', 30); + $valid = $valid && self::checkTextFieldLength($post_params, 'subject', 40); + $valid = $valid && self::checkTextFieldLength($post_params, 'subject_second_line', 40); + break; + case 'org_subject_2_1': + $valid = $valid && self::checkTextFieldLength($post_params, 'organization', 30); + $valid = $valid && self::checkTextFieldLength($post_params, 'organization_second_line', 30); + $valid = $valid && self::checkTextFieldLength($post_params, 'subject', 40); + break; + case 'org_subject_2_2': + $valid = $valid && self::checkTextFieldLength($post_params, 'organization', 30); + $valid = $valid && self::checkTextFieldLength($post_params, 'organization_second_line', 30); + $valid = $valid && self::checkTextFieldLength($post_params, 'subject', 40); + $valid = $valid && self::checkTextFieldLength($post_params, 'subject_second_line', 40); + break; + case 'acronym': + $valid = $valid && self::checkTextFieldLength($post_params, 'acronym', 10); + break; + case 'acronym_subject': + $valid = $valid && self::checkTextFieldLength($post_params, 'acronym', 10); + $valid = $valid && self::checkTextFieldLength($post_params, 'acronym_subject', 15); + break; + case 'acronym_subject_2_1': + $valid = $valid && self::checkTextFieldLength($post_params, 'acronym', 10); + $valid = $valid && self::checkTextFieldLength($post_params, 'acronym_second_line', 10); + $valid = $valid && self::checkTextFieldLength($post_params, 'acronym_subject', 15); + break; + case 'acronym_social': + $valid = $valid && self::checkTextFieldLength($post_params, 'acronym', 10); + break; + case 'extension': + $valid = $valid && self::checkTextFieldLength($post_params, 'extension_county', 40); + break; + case 'extension_4h': + $valid = $valid && self::checkTextFieldLength($post_params, 'extension_county', 40); + break; + default; + self::flashNotice(parent::NOTICE_LEVEL_ERROR, 'Invalid Style', 'Somehow you selected an invalid style. Please select one and try again.'); + $valid = FALSE; + break; + } + + if (!$valid) { + # store this lockup in the session so it can be seen on the page + $_SESSION['edit_lockup'] = $lockup_model; + \Core::redirect($lockup_model->getEditURL()); + } + + $model->save(); + \Core::redirect($model->getPreviewURL()); + \Core::redirect($lockup_model->getPreviewURL()); } diff --git a/src/Views/new_lockup.php b/src/Views/new_lockup.php index bd757d2e4a72f5c8667bf81f635140b1c2ffc6f3..d58002ae5acba444308a1785bb0400e43aced72c 100644 --- a/src/Views/new_lockup.php +++ b/src/Views/new_lockup.php @@ -2,7 +2,7 @@ <div class="wdn-inner-wrapper"> <h3 class="page-title">Create New Lockup</h3> - <form method="POST" action=""> + <form id="create-lockup" method="POST" action=""> <input type="hidden" id="id" name="id" value="<?php echo $context->lockup->id; ?>"> <?php if (\Auth::$current_user === NULL): ?> <fieldset> @@ -163,8 +163,16 @@ </div> </fieldset> - <fieldset> + <fieldset id="lockup-text"> <legend>Lockup Text</legend> + <div id="text-notice" class="wdn_notice alert" style="display: none;" tab-index="-1"> + <div class="message"> + <h4>Invalid Text Entered</h4> + <div class="message-content"></div> + </div> + </div> + + <div id="organization-field"> <label for="organization">Organization</label> <div class="tooltip wdn-icon-info italic hang-right"> @@ -172,7 +180,7 @@ 30 characters max </div> </div> - <input type="text" name="organization" id="organization" value="<?php echo $context->lockup->organization; ?>"> + <input type="text" name="organization" id="organization" maxlength="30" value="<?php echo $context->lockup->organization; ?>"> </div> <div id="organization-second-line-field" style="display: none;"> <label for="organization-second-line">Organization Second Line</label> @@ -181,7 +189,7 @@ 30 characters max </div> </div> - <input type="text" name="organization_second_line" id="organization-second-line"> + <input type="text" name="organization_second_line" maxlength="30" id="organization-second-line"> </div> <div id="subject-field" style="display: none;"> <label for="subject">Subject</label> @@ -190,7 +198,7 @@ 40 characters max </div> </div> - <input type="text" name="subject" id="subject" value="<?php echo $context->lockup->subject; ?>"> + <input type="text" name="subject" id="subject" maxlength="40" value="<?php echo $context->lockup->subject; ?>"> <br> </div> <div id="subject-second-line-field" style="display: none;"> @@ -200,7 +208,7 @@ 40 characters max </div> </div> - <input type="text" name="subject_second_line" id="subject-second-line" value="<?php echo $context->lockup->subject_second_line; ?>"> + <input type="text" name="subject_second_line" maxlength="40" id="subject-second-line" value="<?php echo $context->lockup->subject_second_line; ?>"> <br> </div> <div id="acronym-field" style="display: none;"> @@ -210,7 +218,7 @@ 10 characters max </div> </div> - <input type="text" name="acronym" id="acronym" value="<?php echo $context->lockup->acronym; ?>"> + <input type="text" name="acronym" id="acronym" maxlength="10" value="<?php echo $context->lockup->acronym; ?>"> <br> </div> <div id="acronym-second-line-field" style="display: none;"> @@ -220,7 +228,7 @@ 10 characters max </div> </div> - <input type="text" name="acronym_second_line" id="acronym-second-line" value="<?php echo $context->lockup->acronym_second_line; ?>"> + <input type="text" name="acronym_second_line" id="acronym-second-line" maxlength="10" value="<?php echo $context->lockup->acronym_second_line; ?>"> <br> </div> <div id="acronym-subject-field" style="display: none;"> @@ -230,7 +238,7 @@ 15 characters max </div> </div> - <input type="text" name="acronym_subject" id="acronym-subject" value="<?php echo $context->lockup->acronym_subject; ?>"> + <input type="text" name="acronym_subject" id="acronym-subject" maxlength="15" value="<?php echo $context->lockup->acronym_subject; ?>"> <br> </div> <div id="extension-county-field" style="display: none;"> @@ -240,7 +248,7 @@ 40 characters max </div> </div> - <input type="text" name="extension_county" id="extension-county" value="<?php echo $context->lockup->extension_county; ?>"> + <input type="text" name="extension_county" id="extension-county" maxlength="40" value="<?php echo $context->lockup->extension_county; ?>"> <br> </div> </fieldset> @@ -293,8 +301,41 @@ </div> <script type="text/javascript"> +function ucwords (str) { + return (str + '').replace(/^([a-z])|\s+([a-z])/g, function ($1) { + return $1.toUpperCase(); + }); +} + require(['jquery'], function ($) { $(document).ready(function () { + $('#create-lockup').submit(function (submit) { + var valid = true; + var messages = ''; + + // look at all text fields that are visible inside lockup text + $('#lockup-text input').each(function(index, input) { + if ($(input).is(':visible')) { + if ($(input).val().length > parseInt($(input).attr('maxlength'))) { + messages = messages + ucwords($(input).attr('id').split('-').join(' ')) + ' must be ' + $(input).attr('maxlength') + ' characters or fewer.<br>'; + valid = false; + } + } + }); + + if (!valid) { + submit.preventDefault(); + $('#text-notice').find('.message-content').html(messages); + $('#text-notice').show(); + window.location.hash = 'text-notice'; + } + }); + + // temporary hack, until framework is improved to allow for closeable notices that do not remove HTML + $('#text-notice').click(function (click) { + $(this).fadeOut(); + }); + $('input[name=type]').change(function (change) { if ($('#type-org-only').is(':checked')) { $('#organization-field').show();