-
Peter Rotich authored
Add ability to import and export list items
5c7a37a6
ajax.forms.php 11.58 KiB
<?php
require_once(INCLUDE_DIR . 'class.topic.php');
require_once(INCLUDE_DIR . 'class.dynamic_forms.php');
require_once(INCLUDE_DIR . 'class.forms.php');
class DynamicFormsAjaxAPI extends AjaxController {
function getForm($form_id) {
$form = DynamicForm::lookup($form_id);
if (!$form) return;
foreach ($form->getFields() as $field) {
$field->render();
}
}
function getFormsForHelpTopic($topic_id, $client=false) {
if (!($topic = Topic::lookup($topic_id)))
Http::response(404, 'No such help topic');
if ($_GET || isset($_SESSION[':form-data'])) {
if (!is_array($_SESSION[':form-data']))
$_SESSION[':form-data'] = array();
$_SESSION[':form-data'] = array_merge($_SESSION[':form-data'], $_GET);
}
foreach ($topic->getForms() as $form) {
if (!$form->hasAnyVisibleFields())
continue;
ob_start();
$form->getForm($_SESSION[':form-data'])->render(!$client);
$html .= ob_get_clean();
ob_start();
print $form->getMedia();
$media .= ob_get_clean();
}
return $this->encode(array(
'media' => $media,
'html' => $html,
));
}
function getClientFormsForHelpTopic($topic_id) {
return $this->getFormsForHelpTopic($topic_id, true);
}
function getFieldConfiguration($field_id) {
$field = DynamicFormField::lookup($field_id);
include(STAFFINC_DIR . 'templates/dynamic-field-config.tmpl.php');
}
function saveFieldConfiguration($field_id) {
if (!($field = DynamicFormField::lookup($field_id)))
Http::response(404, 'No such field');
$DFF = 'DynamicFormField';
// Capture flags which should remain unchanged
$p_mask = $DFF::MASK_MASK_ALL;
if ($field->isPrivacyForced()) {
$p_mask |= $DFF::FLAG_CLIENT_VIEW | $DFF::FLAG_AGENT_VIEW;
}
if ($field->isRequirementForced()) {
$p_mask |= $DFF::FLAG_CLIENT_REQUIRED | $DFF::FLAG_AGENT_REQUIRED;
}
if ($field->hasFlag($DFF::FLAG_MASK_DISABLE)) {
$p_mask |= $DFF::FLAG_ENABLED;
}
// Capture current state of immutable flags
$preserve = $field->flags & $p_mask;
// Set admin-configured flag states
$flags = array_reduce($_POST['flags'],
function($a, $b) { return $a | $b; }, 0);
$field->flags = $flags | $preserve;
if ($field->setConfiguration($_POST)) {
$field->save();
Http::response(201, 'Field successfully updated');
}
include STAFFINC_DIR . 'templates/dynamic-field-config.tmpl.php';
}
function deleteAnswer($entry_id, $field_id) {
global $thisstaff;
if (!$thisstaff)
Http::response(403, 'Login required');
$ent = DynamicFormEntryAnswer::lookup(array(
'entry_id'=>$entry_id, 'field_id'=>$field_id));
if (!$ent)
Http::response(404, 'Answer not found');
$ent->delete();
}
function _getListItemEditForm($source=null, $item=false) {
return new Form(array(
'value' => new TextboxField(array(
'required' => true,
'label' => __('Value'),
'configuration' => array(
'translatable' => $item ? $item->getTranslateTag('value') : false,
'size' => 60,
'length' => 0,
),
)),
'extra' => new TextboxField(array(
'label' => __('Abbreviation'),
'configuration' => array(
'size' => 60,
'length' => 0,
),
)),
), $source);
}
function getListItem($list_id, $item_id) {
$list = DynamicList::lookup($list_id);
if (!$list || !($item = $list->getItem( (int) $item_id)))
Http::response(404, 'No such list item');
$action = "#list/{$list->getId()}/item/{$item->getId()}/update";
$item_form = $this->_getListItemEditForm($item->ht, $item);
include(STAFFINC_DIR . 'templates/list-item-properties.tmpl.php');
}
function getListItems($list_id) {
global $thisstaff;
if (!$thisstaff)
Http::response(403, 'Login required');
if (!($list = DynamicList::lookup($list_id)))
Http::response(404, 'No such list');
$pjax_container = '#items';
include(STAFFINC_DIR . 'templates/list-items.tmpl.php');
}
function saveListItem($list_id, $item_id) {
global $thisstaff;
if (!$thisstaff)
Http::response(403, 'Login required');
$list = DynamicList::lookup($list_id);
if (!$list || !($item = $list->getItem( (int) $item_id)))
Http::response(404, 'No such list item');
$item_form = $this->_getListItemEditForm($_POST, $item);
if ($valid = $item_form->isValid()) {
// Update basic information
$basic = $item_form->getClean();
$item->extra = $basic['extra'];
$item->value = $basic['value'];
if ($_item = DynamicListItem::lookup(array(
'list_id' => $list->getId(), 'value'=>$item->value)))
if ($_item && $_item->id != $item->id)
$item_form->getField('value')->addError(
__('Value already in use'));
}
// Context
$action = "#list/{$list->getId()}/item/{$item->getId()}/update";
$icon = ($list->get('sort_mode') == 'SortCol')
? '<i class="icon-sort"></i> ' : '';
if (!$valid || !$item->setConfiguration($_POST)) {
include STAFFINC_DIR . 'templates/list-item-properties.tmpl.php';
return;
}
else {
$item->save();
}
// Send the whole row back
$prop_fields = array();
foreach ($list->getConfigurationForm()->getFields() as $f) {
if (in_array($f->get('type'), array('text', 'datetime', 'phone')))
$prop_fields[] = $f;
if (strpos($f->get('type'), 'list-') === 0)
$prop_fields[] = $f;
// 4 property columns max
if (count($prop_fields) == 4)
break;
}
ob_start();
$item->_config = null;
include STAFFINC_DIR . 'templates/list-item-row.tmpl.php';
$html = ob_get_clean();
Http::response(201, $this->encode(array(
'id' => $item->getId(),
'row' => $html,
'success' => true,
)));
}
function addListItem($list_id) {
global $thisstaff;
if (!$thisstaff)
Http::response(403, 'Login required');
elseif (!($list = DynamicList::lookup($list_id)))
Http::response(404, 'No such list');
$action = "#list/{$list->getId()}/item/add";
$item_form = $this->_getListItemEditForm($_POST ?: null);
if ($_POST && ($valid = $item_form->isValid())) {
$data = $item_form->getClean();
if ($_item = DynamicListItem::lookup(array(
'list_id' => $list->getId(), 'value'=>$data['value'])))
if ($_item && $_item->id)
$item_form->getField('value')->addError(
__('Value already in use'));
$data['list_id'] = $list->getId();
$item = DynamicListItem::create($data);
if ($item->save() && $item->setConfiguration())
Http::response(201, $this->encode(array('success' => true)));
}
include(STAFFINC_DIR . 'templates/list-item-properties.tmpl.php');
}
function importListItems($list_id) {
global $thisstaff;
if (!$thisstaff)
Http::response(403, 'Login required');
elseif (!($list = DynamicList::lookup($list_id)))
Http::response(404, 'No such list');
$info = array(
'title' => sprintf('%s — %s',
$list->getName(), __('Import Items')),
'action' => "#list/{$list_id}/import",
'upload_url' => "lists.php?id={$list_id}&do=import-users",
);
if ($_POST) {
$status = $list->importFromPost($_POST['pasted']);
if (is_string($status))
$info['error'] = $status;
else
Http::response(201, $this->encode(array('success' => true, 'count' => $status)));
}
include(STAFFINC_DIR . 'templates/list-import.tmpl.php');
}
function disableItems($list_id) {
global $thisstaff;
if (!$thisstaff)
Http::response(403, 'Login required');
elseif (!($list = DynamicList::lookup($list_id)))
Http::response(404, 'No such list');
elseif (!$_POST['ids'])
Http::response(422, 'Send `ids` parameter');
foreach ($_POST['ids'] as $id) {
if ($item = $list->getItem( (int) $id)) {
$item->disable();
$item->save();
}
else {
Http::response(404, 'No such list item');
}
}
Http::response(200, $this->encode(array('success' => true)));
}
function undisableItems($list_id) {
global $thisstaff;
if (!$thisstaff)
Http::response(403, 'Login required');
elseif (!($list = DynamicList::lookup($list_id)))
Http::response(404, 'No such list');
elseif (!$_POST['ids'])
Http::response(422, 'Send `ids` parameter');
foreach ($_POST['ids'] as $id) {
if ($item = $list->getItem( (int) $id)) {
$item->enable();
$item->save();
}
else {
Http::response(404, 'No such list item');
}
}
Http::response(200, $this->encode(array('success' => true)));
}
function deleteItems($list_id) {
global $thisstaff;
if (!$thisstaff)
Http::response(403, 'Login required');
elseif (!($list = DynamicList::lookup($list_id)))
Http::response(404, 'No such list');
elseif (!$_POST['ids'])
Http::response(422, 'Send `ids` parameter');
foreach ($_POST['ids'] as $id) {
if ($item = $list->getItem( (int) $id)) {
$item->delete();
}
else {
Http::response(404, 'No such list item');
}
}
#Http::response(200, $this->encode(array('success' => true)));
}
function upload($id) {
if (!$field = DynamicFormField::lookup($id))
Http::response(400, 'No such field');
$impl = $field->getImpl();
if (!$impl instanceof FileUploadField)
Http::response(400, 'Upload to a non file-field');
return JsonDataEncoder::encode(
array('id'=>$impl->ajaxUpload())
);
}
function attach() {
$field = new FileUploadField();
return JsonDataEncoder::encode(
array('id'=>$field->ajaxUpload(true))
);
}
function getAllFields($id) {
global $thisstaff;
if (!$thisstaff)
Http::response(403, 'Login required');
elseif (!$form = DynamicForm::lookup($id))
Http::response(400, 'No such form');
ob_start();
include STAFFINC_DIR . 'templates/dynamic-form-fields-view.tmpl.php';
$html = ob_get_clean();
return $this->encode(array(
'success'=>true,
'html' => $html,
));
}
}
?>