diff --git a/.gitignore b/.gitignore
index 2ea8568..dc3cf74 100755
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
node_modules
.ideas
# Ignore files generated by PhpStorm
-/*/*/.idea/
\ No newline at end of file
+/*/*/.idea/
+patch
\ No newline at end of file
diff --git a/commerce_pos.links.task.yml b/commerce_pos.links.task.yml
index 89da886..e547b25 100644
--- a/commerce_pos.links.task.yml
+++ b/commerce_pos.links.task.yml
@@ -21,3 +21,7 @@ commerce_pos.close_register:
route_name: 'commerce_pos.close_register'
base_route: 'commerce_pos.main'
description: 'Close Register'
+
+commerce_pos.select_register:
+ deriver: 'Drupal\commerce_pos\Plugin\Derivative\DynamicSelectRegister'
+ weight: 100
diff --git a/commerce_pos.permissions.yml b/commerce_pos.permissions.yml
index 1517321..ce148f5 100755
--- a/commerce_pos.permissions.yml
+++ b/commerce_pos.permissions.yml
@@ -4,3 +4,5 @@
title: 'Use the commerce point of sale standard functionality'
'access commerce pos order lookup':
title: 'Use the commerce point of sale order lookup'
+'change commerce pos active register':
+ title: 'Change the active commerce point of sale register'
diff --git a/commerce_pos.routing.yml b/commerce_pos.routing.yml
index bd50cc1..3a7ceae 100644
--- a/commerce_pos.routing.yml
+++ b/commerce_pos.routing.yml
@@ -60,6 +60,14 @@ commerce_pos.order_lookup:
requirements:
_permission: 'access commerce pos order lookup'
+commerce_pos.select_register:
+ path: '/admin/commerce/pos/register'
+ defaults:
+ _form: '\Drupal\commerce_pos\Form\RegisterSelectForm'
+ _title: 'Point of Sale Select Register'
+ requirements:
+ _permission: 'modify commerce pos register'
+
commerce_pos.parked_order_lookup:
path: '/admin/commerce/pos/orders/parked'
defaults:
diff --git a/src/Form/POSForm.php b/src/Form/POSForm.php
index 991480b..5724bb5 100644
--- a/src/Form/POSForm.php
+++ b/src/Form/POSForm.php
@@ -597,6 +597,10 @@ protected function addTotalsDisplay(array &$form, FormStateInterface $form_state
$form['totals'] = [
'#type' => 'container',
];
+ $current_register = \Drupal::service('commerce_pos.current_register')->get()->getName();
+ $form['totals']['register'] = [
+ '#markup' => '
Register: ' . $current_register . '
',
+ ];
$number_formatter_factory = \Drupal::service('commerce_price.number_formatter_factory');
$number_formatter = $number_formatter_factory->createInstance();
diff --git a/src/Form/RegisterSelectForm.php b/src/Form/RegisterSelectForm.php
index b0fe09c..c4dfde8 100755
--- a/src/Form/RegisterSelectForm.php
+++ b/src/Form/RegisterSelectForm.php
@@ -36,7 +36,7 @@ public function buildForm(array $form, FormStateInterface $form_state) {
return $form;
}
- $register_options = ['' => '-'];
+ $register_options = [];
foreach ($registers as $id => $register) {
$register_options[$id] = $register->getName();
}
diff --git a/src/Plugin/Derivative/DynamicSelectRegister.php b/src/Plugin/Derivative/DynamicSelectRegister.php
new file mode 100644
index 0000000..59c4b90
--- /dev/null
+++ b/src/Plugin/Derivative/DynamicSelectRegister.php
@@ -0,0 +1,32 @@
+getRegisters();
+ if (count($registers) > 1) {
+ $this->derivatives['select_register'] = $base_plugin_definition;
+ $this->derivatives['select_register']['title'] = $this->t("Select Register");
+ $this->derivatives['select_register']['base_route'] = 'commerce_pos.main';
+ $this->derivatives['select_register']['route_name'] = 'commerce_pos.select_register';
+ return $this->derivatives;
+ }
+ return '';
+ }
+
+}
+
diff --git a/tests/src/FunctionalJavascript/SelectRegisterTest.php b/tests/src/FunctionalJavascript/SelectRegisterTest.php
new file mode 100644
index 0000000..74ad2f0
--- /dev/null
+++ b/tests/src/FunctionalJavascript/SelectRegisterTest.php
@@ -0,0 +1,96 @@
+setUpStore();
+ $register = Register::create([
+ 'store_id' => $test_store->id(),
+ 'name' => 'Other register',
+ 'default_float' => new Price('100.00', 'USD'),
+ ]);
+ $register->save();
+ $this->drupalLogin($this->rootUser);
+ }
+
+ /**
+ * Tests adding and removing products from the POS form.
+ */
+ public function testRegisterSelection() {
+ $web_assert = $this->assertSession();
+ $this->drupalGet('admin/commerce/pos/main');
+
+ $this->getSession()->getPage()->fillField('register', '1');
+ $this->getSession()->getPage()->fillField('float[number]', '10.00');
+ $this->getSession()->getPage()->findButton('Open Register')->click();
+ $current_register_name = Register::load($this->getSession()->getCookie('commerce_pos_register'))->getName();
+
+ // Now we should be able to select order items.
+ $autocomplete_field = $this->getSession()->getPage()->findField('order_items[target_id][product_selector]');
+ $autocomplete_field->setValue('Jum');
+ $this->getSession()->getDriver()->keyDown($autocomplete_field->getXpath(), 'p');
+ $web_assert->waitOnAutocomplete();
+ $results = $this->getSession()->getPage()->findAll('css', '.ui-autocomplete li');
+ $this->assertCount(3, $results);
+ // Click on of the auto-complete.
+ $results[0]->click();
+ $web_assert->assertWaitOnAjaxRequest();
+
+ // Assert that the product is listed as expected.
+ $web_assert->pageTextContains('Jumper');
+ $web_assert->fieldValueEquals('order_items[target_id][order_items][0][quantity]', '1.00');
+ $web_assert->fieldValueEquals('order_items[target_id][order_items][0][unit_price][number]', '50.00');
+ $web_assert->pageTextContains('Total $50.00');
+ $web_assert->pageTextContains('To Pay $50.00');
+
+ // Goto register seletion page.
+ $this->drupalGet('admin/commerce/pos/register');
+
+ // Asserting current register.
+ $field = $this->assertSession()->optionExists('register', 1)->getText();
+ $this->assertEquals($field, $current_register_name);
+ $this->getSession()->getPage()->fillField('register', '2');
+ $this->getSession()->getPage()->fillField('float[number]', '10.00');
+ $this->getSession()->getPage()->findButton('Open Register')->click();
+
+ $this->drupalGet('admin/commerce/pos/main');
+ $web_assert->pageTextNotContains("Register: $current_register_name");
+ $current_register_name = Register::load($this->getSession()->getCookie('commerce_pos_register'))->getName();
+ $web_assert->pageTextContains("Register: $current_register_name");
+
+ // Assert that the product is listed as expected.
+ $web_assert->pageTextContains('Jumper');
+ $web_assert->fieldValueEquals('order_items[target_id][order_items][0][quantity]', '1.00');
+ $web_assert->fieldValueEquals('order_items[target_id][order_items][0][unit_price][number]', '50.00');
+ $web_assert->pageTextContains('Total $50.00');
+ $web_assert->pageTextContains('To Pay $50.00');
+ }
+
+}