Skip to content

Commit

Permalink
Add basic inline editing to proposed grid
Browse files Browse the repository at this point in the history
  • Loading branch information
flack committed Jun 29, 2023
1 parent 2dc1b0d commit 80b1d89
Show file tree
Hide file tree
Showing 4 changed files with 119 additions and 27 deletions.
5 changes: 5 additions & 0 deletions lib/org/openpsa/sales/config/routes.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@ salesproject_new_customer:
path: /salesproject/new/{guid}/
defaults: { _controller: 'org_openpsa_sales_handler_edit::new' }

salesproject_itemedit:
path: /salesproject/itemedit/
defaults: { _controller: 'org_openpsa_sales_handler_view::itemedit' }
methods: [POST]

salesproject_view:
path: /salesproject/{guid}/
defaults: { _controller: 'org_openpsa_sales_handler_view::view' }
Expand Down
29 changes: 29 additions & 0 deletions lib/org/openpsa/sales/handler/view.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
use midcom\datamanager\helper\autocomplete;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
use midcom\grid\editor;

/**
* Salesproject display class
Expand Down Expand Up @@ -256,4 +257,32 @@ public function _handler_action(Request $request, string $action)
'updated' => []
]);
}

public function _handler_itemedit(Request $request)
{
$editor = new editor($request->request, ['title', 'plannedUnits', 'pricePerUnit']);

$deliverable = new org_openpsa_sales_salesproject_deliverable_dba($editor->get_id());
if ($editor->is_delete()) {
if (!$deliverable->delete()) {
throw new midcom_error('Failed to delete item: ' . midcom_connection::get_error_string());
}
} else {
$data = $editor->get_data();
$deliverable->plannedUnits = (float) str_replace(',', '.', $data['plannedUnits']);
$deliverable->pricePerUnit = (float) str_replace(',', '.', $data['pricePerUnit']);
$deliverable->title = $data['title'];

if (!$deliverable->update()) {
throw new midcom_error('Failed to update item: ' . midcom_connection::get_error_string());
}
}
return $editor->get_response([
'id' => $deliverable->id,
'pricePerUnit' => $deliverable->pricePerUnit,
'plannedUnits' => $deliverable->plannedUnits,
'price' => $deliverable->price,
'title' => $deliverable->title,
]);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,23 @@

$rows[] = [
'id' => $deliverable->id,
'title' => '<a href="' . $data['router']->generate('deliverable_view', ['guid' => $deliverable->guid]) . '">' . $deliverable->title . '</a>',
'index_title' => $deliverable->title,
'guid' => $deliverable->guid,
'url' => $data['router']->generate('deliverable_view', ['guid' => $deliverable->guid]),
'title' => $deliverable->title,
'pricePerUnit' => $deliverable->pricePerUnit,
'plannedUnits' => $deliverable->plannedUnits,
'index_price' => $deliverable->get_state() == 'invoiced' ? $deliverable->invoiced : $deliverable->price,
'price' => $deliverable->get_state() == 'invoiced' ? $deliverable->invoiced : $deliverable->price,
'created' => date('Y-m-d H:i:s', $deliverable->metadata->created),
'subscription' => $deliverable->orgOpenpsaObtype == org_openpsa_products_product_dba::DELIVERY_SUBSCRIPTION,
'action' => $entry['actions']
'workflow' => $entry['actions'],
'actions' => ''
];
}

$provider = new midcom\grid\provider($rows, 'local');
$grid = $provider->get_grid('deliverables_' . $data['state']);
$grid_id = $grid->get_identifier();

$classes = $data['state'];
if ($data['state'] == 'declined') {
Expand All @@ -36,24 +41,73 @@
$grid->set_option('caption', $data['l10n']->get($data['state']));

$grid->set_column('created', $data['l10n']->get('created'), 'width: 80, fixed: true, align: "center", formatter: "date"');
$grid->set_column('title', $data['l10n']->get('title'), 'width: 120, classes: "multiline"', 'string');
$grid->set_column('price', $data['l10n']->get('price'), 'width: 80, fixed: true, formatter: "number", align: "right", title: false, classes: "sum"', 'number');
$grid->set_column('title', $data['l10n']->get('title'), 'width: 120, classes: "multiline", editable: true, edittype: "textarea", formatter: viewlink, unformat: extractlabel');
if ($data['state'] == 'proposed') {
$grid->set_column('pricePerUnit', $data['l10n']->get('price per unit'), 'width: 80, fixed: true, formatter: "number", align: "right", title: false, classes: "sum", editable: true');
$grid->set_column('plannedUnits', $data['l10n']->get('units'), 'width: 80, fixed: true, formatter: "number", align: "right", title: false, classes: "sum", editable: true');
$grid->set_column('price', $data['l10n']->get('price'), 'width: 80, fixed: true, formatter: "number", align: "right", title: false, classes: "sum"', 'number');
$grid->set_option('editurl', $data['router']->generate('salesproject_itemedit'));
} else {
$grid->set_column('price', $data['l10n']->get('price'), 'width: 80, fixed: true, formatter: "number", align: "right", title: false, classes: "sum", editable: true', 'number');
}
if (!in_array($data['state'], ['declined', 'invoiced'], true)) {
$grid->set_column('action', $data['l10n']->get('actions'), 'width: 150, fixed: true, sortable: false, align: "center"');
$grid->set_column('workflow', $data['l10n']->get('actions'), 'width: 150, fixed: true, sortable: false, align: "center"');
}
$grid->set_column('subscription', $data['l10n']->get('subscription'), 'width: 30, align: "center", fixed: true, formatter: "checkbox"');
$grid->set_column('url', '', 'hidden: true');

$grid->set_footer_data($footer_data);
?>

<script>
function viewlink(cellval, options, rowdata) {
let url = rowdata.url;
if (!url) {
url = jQuery("#<?= $grid_id ?>").jqGrid('getRowData', options.rowId).url;
}
return '<a href="' + url + '">' + cellval + '</a>';
}
function extractlabel(cellval) {
return cellval;
}
</script>
<div class="org_openpsa_sales <?php echo $classes ?> full-width row-actions">
<?php $grid->render(); ?>
</div>
<script>
midcom_grid_row_actions.init({
identifier: '<?= $grid->get_identifier(); ?>',
identifier: '<?= $grid_id; ?>',
url: '&(prefix);salesproject/action/',
actions: ['decline', 'order', 'deliver', 'invoice', 'run_cycle'],
totals_field: 'sum'
});
</script>
</script>

<?php if ($data['state'] == 'proposed') { ?>
<script>

jQuery("#<?= $grid_id ?>")
.on("keyup", '[aria-describedby="<?= $grid_id ?>_pricePerUnit"] input, [aria-describedby="<?= $grid_id ?>_units"] input', function() {
var rowid = $(this).closest('tr').attr('id'),
grid = jQuery("#<?= $grid_id ?>"),
price = grid.jqGrid('getCell', rowid, 3),
quantity = grid.jqGrid('getCell', rowid, 4);
grid.jqGrid('setRowData', rowid, {price: parseFloat(price) * parseFloat(quantity)});
update_totals();
});

function update_totals() {
let grid = jQuery("#<?= $grid_id ?>"),
total = grid.jqGrid('getRowData').reduce(function(accumulator, value) {
return accumulator + (parseFloat(value.price) || 0);
}, 0);

grid.jqGrid("footerData", "set", {price: total});
}

midcom_grid_editable.enable_inline("<?= $grid_id ?>", {
afterdeletefunc: update_totals,
enable_create: false
});
</script>
<?php } ?>
42 changes: 23 additions & 19 deletions static/midcom.grid/jqGrid.custom.js
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,8 @@ const midcom_grid_editable = {
var return_values = JSON.parse(data.responseText);
return [true, return_values, return_values.id];
},
enable_sorting: false
enable_sorting: false,
enable_create: true
},
toggle: function(id, edit_mode) {
$("#" + id).find(".row_edit, .row_delete").toggleClass('hidden', edit_mode);
Expand Down Expand Up @@ -316,25 +317,28 @@ const midcom_grid_editable = {
});

self.add_inline_controls();
var create_button_parameters = {
caption: self.options.button_label || "",
buttonicon: "fa-plus",
onClickButton: function() {
var new_id = 'new_' + self.last_added_row++,
params = {};

if (self.options.enable_sorting) {
params.position = $('#' + grid_id + ' td[aria-describedby="invoice_items_position"]').length + 1;

if (self.options.enable_create) {
var create_button_parameters = {
caption: self.options.button_label || "",
buttonicon: "fa-plus",
onClickButton: function() {
var new_id = 'new_' + self.last_added_row++,
params = {};

if (self.options.enable_sorting) {
params.position = $('#' + grid_id + ' td[aria-describedby="invoice_items_position"]').length + 1;
}
//create new row; now with a position-value
$('#' + self.grid_id).jqGrid('addRowData', new_id, params, 'last');

self.render_buttons(new_id);
}
//create new row; now with a position-value
$('#' + self.grid_id).jqGrid('addRowData', new_id, params, 'last');

self.render_buttons(new_id);
}
};
$('#' + grid_id)
.jqGrid('navGrid', "#p_" + grid_id, {add: false, del: false, refresh: false, edit: false, search: false})
.jqGrid('navButtonAdd', "#p_" + grid_id, create_button_parameters);
};
$('#' + grid_id)
.jqGrid('navGrid', "#p_" + grid_id, {add: false, del: false, refresh: false, edit: false, search: false})
.jqGrid('navButtonAdd', "#p_" + grid_id, create_button_parameters);
}

if (self.options.enable_sorting) {
$('#' + grid_id)
Expand Down

0 comments on commit 80b1d89

Please sign in to comment.