diff --git a/include/ajax.tasks.php b/include/ajax.tasks.php index e0330dc98daf11ec850e10a6ac859c4916c67271..eaf0630fdb4dbee400402f37c4486636e0c255c8 100644 --- a/include/ajax.tasks.php +++ b/include/ajax.tasks.php @@ -86,9 +86,16 @@ class TasksAjaxAPI extends AjaxController { $forms = DynamicFormEntry::forObject($task->getId(), ObjectModel::OBJECT_TYPE_TASK); - if ($_POST) { + if ($_POST && $forms) { + // TODO: Validate internal form + + // Validate dynamic meta-data + if ($task->update($forms, $_POST, $errors)) { + Http::response(201, 'Task updated successfully'); + } elseif(!$errors['err']) { + $errors['err']=__('Unable to update the task. Correct the errors below and try again!'); + } $info = Format::htmlchars($_POST); - $info['error'] = $errors['err'] ?: __('Coming soon!'); } include STAFFINC_DIR . 'templates/task-edit.tmpl.php'; diff --git a/include/class.forms.php b/include/class.forms.php index 146aa898fdeb9b22948f9acf6ccc677f66a01fde..7e58209ce5509bd4ad12580bb3c95e366abbbb87 100644 --- a/include/class.forms.php +++ b/include/class.forms.php @@ -399,6 +399,10 @@ implements FormRenderer { <?php $row_size = 12; $cols = $row = 0; + + //Layout and rendering options + $options = $this->options; + foreach ($form->getFields() as $f) { $layout = $this->getLayout($f); $size = $layout->getWidth() ?: 12; @@ -428,6 +432,10 @@ implements FormRenderer { <label class="<?php if ($f->isRequired()) echo 'required'; ?>" for="<?php echo $f->getWidget()->id; ?>"> <?php echo Format::htmlchars($label); ?>: + <?php if ($f->isRequired()) { ?> + <span class="error">*</span> + <?php + }?> </label> <?php } if ($f->get('hint')) { ?> @@ -435,7 +443,7 @@ implements FormRenderer { <?php echo Format::htmlchars($f->get('hint')); ?> </div> <?php } - $f->render(); + $f->render($options); if ($f->errors()) foreach ($f->errors() as $e) echo sprintf('<div class="error">%s</div>', Format::htmlchars($e)); diff --git a/include/class.task.php b/include/class.task.php index 31fcf11b2a1bbe463e4bf15d909e4cd162bcf090..bae276155174c8d33f15986c4960ad0fb3bc1061 100644 --- a/include/class.task.php +++ b/include/class.task.php @@ -1061,6 +1061,51 @@ class Task extends TaskModel implements RestrictedAccess, Threadable { } } + function update($forms, $vars, &$errors) { + global $thisstaff; + + + if (!$forms || !$this->checkStaffPerm($thisstaff, Task::PERM_EDIT)) + return false; + + + foreach ($forms as $form) { + $form->setSource($vars); + if (!$form->isValid(function($f) { + return $f->isVisibleToStaff() && $f->isEditableToStaff(); + }, array('mode'=>'edit'))) { + $errors = array_merge($errors, $form->errors()); + } + } + + if ($errors) + return false; + + // Update dynamic meta-data + $changes = array(); + foreach ($forms as $f) { + $changes += $f->getChanges(); + $f->save(); + } + + + if ($vars['note']) { + $_errors = array(); + $this->postNote(array( + 'note' => $vars['note'], + 'title' => __('Task Update'), + ), + $_errors, + $thisstaff); + } + + if ($changes) + $this->logEvent('edited', array('fields' => $changes)); + + Signal::send('model.updated', $this); + return $this->save(); + } + /* static routines */ static function lookupIdByNumber($number) { $sql = 'SELECT id FROM '.TASK_TABLE diff --git a/include/staff/templates/task-edit.tmpl.php b/include/staff/templates/task-edit.tmpl.php index b90d545f823a2e812da24300225643d69c70ed55..f86e8a70a4c751d92b23b5bf592849bb66b7c08a 100644 --- a/include/staff/templates/task-edit.tmpl.php +++ b/include/staff/templates/task-edit.tmpl.php @@ -8,6 +8,8 @@ if (!$info['title']) $action = $info['action'] ?: ('#tasks/'.$task->getId().'/edit'); +$namespace = sprintf('task.%d.edit', $task->getId()); + ?> <div id="task-form"> <h3 class="drag-handle"><?php echo $info['title']; ?></h3> @@ -24,61 +26,29 @@ if ($info['error']) { } ?> <div id="edit-task-form" style="display:block;"> <form method="post" class="task" action="<?php echo $action; ?>"> - - <table class="form_table dynamic-forms" width="100%" border="0" cellspacing="0" cellpadding="2"> - <?php if ($forms) - foreach ($forms as $form) { - $form->render(true, false, array('mode'=>'edit','width'=>160,'entry'=>$form)); - print $form->getForm()->getMedia(); - } ?> - </table> - <table class="form_table dynamic-forms" width="100%" border="0" cellspacing="0" cellpadding="2"> - <tr><th colspan=2><em><?php - echo __('Task Visibility & Assignment'); ?></em></th></tr> + <div> <?php - $iform = $iform ?: TaskForm::getInternalForm(); - foreach ($iform->getFields() as $name=>$field) { - if (!$field->isEditable()) continue; - ?> - <tr> - <td class="multi-line <?php if ($field->get('required')) echo 'required'; - ?>" style="min-width:120px;" width="160"> - <?php echo Format::htmlchars($field->get('label')); ?>:</td> - <td> - <fieldset id="field<?php echo $field->getWidget()->id; - ?>" <?php if (!$field->isVisible()) echo 'style="display:none;"'; ?>> - <?php echo $field->render(); ?> - <?php if ($field->get('required')) { ?> - <span class="error">*</span> - <?php - } - foreach ($field->errors() as $E) { - ?><div class="error"><?php echo $E; ?></div><?php - } ?> - </fieldset> - </td> - </tr> - <?php - } - ?> - </table> - <table class="form_table" width="100%" border="0" cellspacing="0" cellpadding="2"> - <tbody> - <tr> - <th colspan="2"> - <em><strong><?php echo __('Internal Note');?></strong>: <?php - echo __('Reason for editing the task (optional');?> <font class="error"> <?php echo $errors['note'];?></font></em> - </th> - </tr> - <tr> - <td colspan="2"> - <textarea class="richtext no-bar" name="note" cols="21" - rows="6" style="width:80%;"><?php echo $info['note']; - ?></textarea> - </td> - </tr> - </tbody> - </table> + if ($forms) { + foreach ($forms as $form) + echo $form->getForm(false, array('mode' => 'edit'))->asTable( + __('Task Information'), + array( + 'draft-namespace' => $namespace, + ) + ); + } + ?> + </div> + <div><strong><?php echo __('Internal Note');?></strong>: + <font class="error"> <?php echo $errors['note'];?></font></div> + <div> + <textarea class="richtext no-bar" name="note" cols="21" rows="6" + style="width:80%;" + placeholder="<?php echo __('Reason for editing the task (optional)'); ?>" + > + <?php echo $info['note']; + ?></textarea> + </div> <hr> <p class="full-width"> <span class="buttons pull-left"> diff --git a/include/staff/templates/task.tmpl.php b/include/staff/templates/task.tmpl.php index e7743a79a9dd81d90760b8490861a6ec9e0a8d89..7bcafc77d68a267e0a20f62fdf8480f5edec29b0 100644 --- a/include/staff/templates/task.tmpl.php +++ b/include/staff/templates/task.tmpl.php @@ -25,7 +25,7 @@ if ($info['error']) { <form method="post" class="org" action="<?php echo $info['action'] ?: '#tasks/add'; ?>"> <?php $form = $form ?: TaskForm::getInstance(); - echo $form->getForm()->asTable(__('Create New Task'), + echo $form->getForm()->asTable(' ', array('draft-namespace' => $namespace) );