Quellcode durchsuchen

add app/UI/Client/Ressource sourced from Account

andre vor 2 Jahren
Ursprung
Commit
fe87058cc7
31 geänderte Dateien mit 2097 neuen und 0 gelöschten Zeilen
  1. 26 0
      app/UI/Client/Ressource/Buttons/AddRessourceButton.php
  2. 30 0
      app/UI/Client/Ressource/Buttons/ChangePasswordButton.php
  3. 31 0
      app/UI/Client/Ressource/Buttons/ChangeStatusButton.php
  4. 31 0
      app/UI/Client/Ressource/Buttons/DeleteRessourceButton.php
  5. 32 0
      app/UI/Client/Ressource/Buttons/EditRessourceButton.php
  6. 103 0
      app/UI/Client/Ressource/Buttons/LoginToPanelButton.php
  7. 28 0
      app/UI/Client/Ressource/Buttons/MassChangeStatusButton.php
  8. 28 0
      app/UI/Client/Ressource/Buttons/MassDeleteRessourceButton.php
  9. 19 0
      app/UI/Client/Ressource/Buttons/SpanDropdownButton.php
  10. 58 0
      app/UI/Client/Ressource/Forms/AddRessourceForm.php
  11. 58 0
      app/UI/Client/Ressource/Forms/ChangePasswordForm.php
  12. 47 0
      app/UI/Client/Ressource/Forms/ChangeStatusForm.php
  13. 40 0
      app/UI/Client/Ressource/Forms/DeleteRessourceForm.php
  14. 55 0
      app/UI/Client/Ressource/Forms/EditRessourceForm.php
  15. 38 0
      app/UI/Client/Ressource/Forms/MassChangeStatusForm.php
  16. 42 0
      app/UI/Client/Ressource/Forms/MassDeleteRessourceForm.php
  17. 26 0
      app/UI/Client/Ressource/Modals/AddRessourceModal.php
  18. 29 0
      app/UI/Client/Ressource/Modals/ChangePasswordModal.php
  19. 29 0
      app/UI/Client/Ressource/Modals/ChangeStatusModal.php
  20. 34 0
      app/UI/Client/Ressource/Modals/DeleteRessourceModal.php
  21. 30 0
      app/UI/Client/Ressource/Modals/EditRessourceModal.php
  22. 30 0
      app/UI/Client/Ressource/Modals/MassChangeStatusModal.php
  23. 31 0
      app/UI/Client/Ressource/Modals/MassDeleteRessourceModal.php
  24. 203 0
      app/UI/Client/Ressource/Pages/Ressources.php
  25. 116 0
      app/UI/Client/Ressource/Providers/DeleteRessourceDataProvider.php
  26. 354 0
      app/UI/Client/Ressource/Providers/EditRessourceDataProvider.php
  27. 307 0
      app/UI/Client/Ressource/Providers/RessourceDataProvider.php
  28. 45 0
      app/UI/Client/Ressource/Sections/AdditionalSection.php
  29. 44 0
      app/UI/Client/Ressource/Sections/EditAdditionalSection.php
  30. 70 0
      app/UI/Client/Ressource/Sections/EditGeneralSection.php
  31. 83 0
      app/UI/Client/Ressource/Sections/GeneralSection.php

+ 26 - 0
app/UI/Client/Ressource/Buttons/AddRessourceButton.php

@@ -0,0 +1,26 @@
+<?php
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Buttons;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Modals\AddRessourceModal;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Buttons\ButtonCreate;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 10.09.19
+ * Time: 13:06
+ * Class AddRessourceButton
+ */
+class AddRessourceButton extends ButtonCreate implements ClientArea
+{
+    protected $id    = 'addRessourceButton';
+    protected $title = 'addRessourceButton';
+
+    public function initContent()
+    {
+        $this->initLoadModalAction(new AddRessourceModal());
+    }
+
+
+}

+ 30 - 0
app/UI/Client/Ressource/Buttons/ChangePasswordButton.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Buttons;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Modals\ChangePasswordModal;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Buttons\ButtonDataTableModalAction;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Buttons\DropdawnButtonWrappers\ButtonDropdownItem;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 08.11.19
+ * Time: 12:07
+ * Class ChangePassword
+ */
+class ChangePasswordButton extends ButtonDropdownItem implements ClientArea
+{
+    protected $id    = 'changePassword';
+    protected $title = 'changePassword';
+    protected $icon  = 'lu-dropdown__link-icon lu-btn__icon lu-zmdi lu-zmdi-lock';
+
+    public function initContent()
+    {
+        $this->initLoadModalAction(new ChangePasswordModal());
+    }
+
+}

+ 31 - 0
app/UI/Client/Ressource/Buttons/ChangeStatusButton.php

@@ -0,0 +1,31 @@
+<?php
+/**
+ * Class ChangeStatusButton
+ * User: Nessandro
+ * Date: 2019-10-11
+ * Time: 11:29
+ * @package ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Buttons
+ */
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Buttons;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Modals\AddRessourceModal;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Modals\ChangeStatusModal;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Buttons\ButtonCreate;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Buttons\ButtonDataTableModalAction;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Buttons\DropdawnButtonWrappers\ButtonDropdownItem;
+
+class ChangeStatusButton extends ButtonDropdownItem implements ClientArea
+{
+    protected $id    = 'changeStatusButton';
+    protected $title = 'changeStatusButton';
+    protected $icon  = 'lu-dropdown__link-icon lu-btn__icon lu-zmdi lu-zmdi-refresh-sync';
+
+    public function initContent()
+    {
+        $this->initLoadModalAction(new ChangeStatusModal());
+    }
+
+}

+ 31 - 0
app/UI/Client/Ressource/Buttons/DeleteRessourceButton.php

@@ -0,0 +1,31 @@
+<?php
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Buttons;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Modals\DeleteRessourceModal;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Buttons\ButtonDataTableModalAction;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Buttons\ButtonModal;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Buttons\DropdawnButtonWrappers\ButtonDropdownItem;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 18.09.19
+ * Time: 11:27
+ * Class DeleteRessourceButton
+ */
+class DeleteRessourceButton extends ButtonDataTableModalAction implements ClientArea
+{
+    protected $id    = 'deleteRessourceButton';
+    protected $title = 'deleteRessourceButton';
+
+    public function initContent()
+    {
+        $this->switchToRemoveBtn();
+        $this->initLoadModalAction(new DeleteRessourceModal());
+    }
+
+}

+ 32 - 0
app/UI/Client/Ressource/Buttons/EditRessourceButton.php

@@ -0,0 +1,32 @@
+<?php
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Buttons;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Modals\EditRessourceModal;
+use \ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Buttons\ButtonDataTableModalAction;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Modals\AddRessourceModal;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Buttons\ButtonCustomAction;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Buttons\ButtonModal;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Buttons\DropdawnButtonWrappers\ButtonDropdownItem;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 18.09.19
+ * Time: 09:29
+ * Class EditRessourceButton
+ */
+class EditRessourceButton extends ButtonDataTableModalAction implements ClientArea
+{
+    protected $id    = 'editRessourceButton';
+    protected $title = 'editRessourceButton';
+
+    public function initContent()
+    {
+        $this->initLoadModalAction(new EditRessourceModal());
+    }
+
+}

+ 103 - 0
app/UI/Client/Ressource/Buttons/LoginToPanelButton.php

@@ -0,0 +1,103 @@
+<?php
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Buttons;
+
+
+use ModulesGarden\Servers\ZimbraEmail\Core\Helper\BuildUrl;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Buttons\ButtonDataTableModalAction;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Buttons\ButtonRedirect;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Buttons\DropdawnButtonWrappers\ButtonDropdownItem;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 12.11.19
+ * Time: 16:44
+ * Class LoginToPanel
+ */
+class LoginToPanelButton extends ButtonDropdownItem implements ClientArea
+{
+    protected $icon           = 'lu-dropdown__link-icon lu-btn__icon lu-zmdi lu-zmdi-email';
+
+    protected $rawUrl = null;
+    protected $redirectParams = [];
+
+    public function initContent()
+    {
+        $this->htmlAttributes['@click.middle'] = 'redirect($event, ' . $this->parseCustomParams() . ', true)';
+        $this->htmlAttributes['@click'] = 'redirect($event, ' . $this->parseCustomParams() . ', true)';
+
+    }
+
+    protected function parseCustomParams()
+    {
+        if (count($this->redirectParams) === 0 && $this->rawUrl === null)
+        {
+            return '{}';
+        }
+
+        return $this->parseListTOJsString($this->redirectParams);
+    }
+
+    protected function parseListTOJsString($params)
+    {
+        $jsString = '{';
+
+        if ($this->rawUrl !== null)
+        {
+            $params['rawUrl'] = $this->rawUrl;
+        }
+
+        foreach ($params as $key => $value)
+        {
+            $jsString .= ' ' . str_replace('-', '__', $key) . ': ' . (is_array($value) ? ($this->parseListTOJsString($value) . ',') : ("'" . (string) $value) . "',");
+        }
+
+        $jsString = trim($jsString, ',') . ' } ';
+
+        return $jsString;
+    }
+
+    public function setRawUrl($url)
+    {
+        $this->rawUrl = $url;
+
+        return $this;
+    }
+
+    public function addRedirectParam($key, $value)
+    {
+        $this->redirectParams[$key] = $value;
+
+        $this->updateHtmlAttributesByRedirectParams();
+
+        return $this;
+    }
+
+    public function setRedirectParams($paramsList)
+    {
+        $this->redirectParams = $paramsList;
+
+        $this->updateHtmlAttributesByRedirectParams();
+
+        return $this;
+    }
+
+    protected function updateHtmlAttributesByRedirectParams()
+    {
+        foreach ($this->redirectParams as $key => $value)
+        {
+            $this->updateHtmlAttribute($key, $value);
+        }
+    }
+
+    protected function updateHtmlAttribute($key, $value)
+    {
+        if (strpos($value, ':') === 0)
+        {
+            $this->addHtmlAttribute(':data-' . $key , 'dataRow.' . trim($value, ':'));
+        }
+    }
+}

+ 28 - 0
app/UI/Client/Ressource/Buttons/MassChangeStatusButton.php

@@ -0,0 +1,28 @@
+<?php
+/**
+ * Class MassChangeStatusButton
+ * User: Nessandro
+ * Date: 2019-10-11
+ * Time: 11:29
+ * @package ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Buttons
+ */
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Buttons;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Modals\MassChangeStatusModal;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Buttons\ButtonMassAction;
+
+class MassChangeStatusButton extends ButtonMassAction implements ClientArea
+{
+    protected $id    = 'massChangeStatusButton';
+    protected $title = 'massChangeStatusButton';
+    protected $icon  = 'lu-btn__icon lu-zmdi lu-zmdi-refresh-sync';
+
+    public function initContent()
+    {
+        $this->initLoadModalAction(new MassChangeStatusModal());
+    }
+
+}

+ 28 - 0
app/UI/Client/Ressource/Buttons/MassDeleteRessourceButton.php

@@ -0,0 +1,28 @@
+<?php
+/**
+ * Class MassDeleteRessourceButton
+ * User: Nessandro
+ * Date: 2019-10-11
+ * Time: 11:29
+ * @package ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Buttons
+ */
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Buttons;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Modals\MassDeleteRessourceModal;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Buttons\ButtonMassAction;
+
+class MassDeleteRessourceButton extends ButtonMassAction implements ClientArea
+{
+
+    protected $id    = 'massDeleteRessourceButton';
+    protected $title = 'massDeleteRessourceButton';
+
+    public function initContent()
+    {
+        $this->switchToRemoveBtn(); 
+        $this->initLoadModalAction(new MassDeleteRessourceModal());
+    }
+}

+ 19 - 0
app/UI/Client/Ressource/Buttons/SpanDropdownButton.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Buttons;
+
+
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Buttons\DropdawnButtonWrappers\ButtonDropdown;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 13.11.19
+ * Time: 08:53
+ * Class SpanDropdownButton
+ */
+class SpanDropdownButton extends ButtonDropdown
+{
+    protected $id = 'spanDropdownButton';
+}

+ 58 - 0
app/UI/Client/Ressource/Forms/AddRessourceForm.php

@@ -0,0 +1,58 @@
+<?php
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Forms;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Product\ProductManager;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\ClassOfService;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Repository\ClassOfServices;
+use ModulesGarden\Servers\ZimbraEmail\App\Traits\FormExtendedTrait;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Admin\Custom\Forms\SortedFieldForm;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Admin\Custom\Sections\RowSection;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Providers\RessourceDataProvider;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Sections\AdditionalSection;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Sections\GeneralSection;
+use ModulesGarden\Servers\ZimbraEmail\App\Validators\PasswordsValidator;
+use ModulesGarden\Servers\ZimbraEmail\App\Validators\RepeatPasswordValidator;
+use function ModulesGarden\Servers\ZimbraEmail\Core\Helper\di;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\BaseForm;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\Hidden;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\Password;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\Select;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\Text;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\FormConstants;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Sections\HalfPageSection;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Sections\InputGroup;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\InputGroupElements;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Sections\RawSection;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 10.09.19
+ * Time: 13:06
+ * Class AddRessourceForm
+ */
+class AddRessourceForm extends SortedFieldForm implements ClientArea
+{
+    use FormExtendedTrait;
+
+    protected $id    = 'addRessourceForm';
+    protected $name  = 'addRessourceForm';
+    protected $title = 'addRessourceForm';
+
+    public function initContent()
+    {
+        $this->setFormType(FormConstants::CREATE);
+        $this->setProvider(new RessourceDataProvider());
+        $this->initFields();
+        $this->loadDataToForm();
+    }
+
+    public function initFields()
+    {
+        $this->addSection(new GeneralSection());
+        $this->addSection(new AdditionalSection());
+
+
+    }
+}

+ 58 - 0
app/UI/Client/Ressource/Forms/ChangePasswordForm.php

@@ -0,0 +1,58 @@
+<?php
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Forms;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Providers\EditRessourceDataProvider;
+use ModulesGarden\Servers\ZimbraEmail\App\Validators\PasswordsValidator;
+use ModulesGarden\Servers\ZimbraEmail\App\Validators\RepeatPasswordValidator;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\BaseForm;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\Hidden;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\Password;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\Select;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 08.11.19
+ * Time: 12:07
+ * Class ChangePasswordForm
+ */
+class ChangePasswordForm extends BaseForm implements ClientArea
+{
+
+
+    protected $id    = 'changePasswordForm';
+    protected $name  = 'changePasswordForm';
+    protected $title = 'changePasswordForm';
+
+    protected function getDefaultActions()
+    {
+        return ['changePassword'];
+    }
+
+    public function initContent()
+    {
+        $this->setFormType('changePassword');
+        $this->dataProvider = new EditRessourceDataProvider();
+
+        $field = new Hidden('id');
+        $this->addField($field);
+
+        /**end**/
+        $field = new Password('password');
+        $field->setDescription('description');
+        $field->addValidator(new PasswordsValidator());
+        $field->notEmpty();
+        $this->addField($field);
+
+        $field = (new Password('repeat_password'))->addValidator(new RepeatPasswordValidator());
+        $field->notEmpty();
+        $this->addField($field);
+
+        $this->loadDataToForm();
+    }
+
+}

+ 47 - 0
app/UI/Client/Ressource/Forms/ChangeStatusForm.php

@@ -0,0 +1,47 @@
+<?php
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Forms;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Providers\RessourceDataProvider;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Providers\EditRessourceDataProvider;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\BaseForm;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\Hidden;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\Select;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\FormConstants;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 16.10.19
+ * Time: 13:20
+ * Class ChangeStatusForm
+ */
+class ChangeStatusForm extends BaseForm implements ClientArea
+{
+    protected $id    = 'changeStatusForm';
+    protected $name  = 'changeStatusForm';
+    protected $title = 'changeStatusForm';
+
+    protected function getDefaultActions()
+    {
+        return ['updateStatus'];
+    }
+
+    public function initContent()
+    {
+        $this->setFormType('updateStatus');
+        $this->dataProvider = new EditRessourceDataProvider();
+
+        $field = new Hidden('id');
+        $this->addField($field);
+
+        $field = new Select('status');
+        $this->addField($field);
+
+        $this->loadDataToForm();
+    }
+
+}

+ 40 - 0
app/UI/Client/Ressource/Forms/DeleteRessourceForm.php

@@ -0,0 +1,40 @@
+<?php
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Forms;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Providers\DeleteRessourceDataProvider;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\BaseForm;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\Hidden;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\FormConstants;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 18.09.19
+ * Time: 11:28
+ * Class DeleteRessourceForm
+ */
+class DeleteRessourceForm extends BaseForm implements ClientArea
+{
+    protected $id    = 'deleteRessourceForm';
+    protected $name  = 'deleteRessourceForm';
+    protected $title = 'deleteRessourceForm';
+
+    public function initContent()
+    {
+        $this->setFormType(FormConstants::DELETE);
+        $this->dataProvider = new DeleteRessourceDataProvider();
+
+        $this->setConfirmMessage('confirmRemoveRessource');
+
+        $field = new Hidden();
+        $field->setId('id');
+        $field->setName('id');
+        $this->addField($field);
+
+        $this->loadDataToForm();
+    }
+}

+ 55 - 0
app/UI/Client/Ressource/Forms/EditRessourceForm.php

@@ -0,0 +1,55 @@
+<?php
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Forms;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Product\ProductManager;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Repository\ClassOfServices;
+use ModulesGarden\Servers\ZimbraEmail\App\Traits\FormExtendedTrait;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Admin\Custom\Forms\SortedFieldForm;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Admin\Custom\Sections\RowSection;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Providers\RessourceDataProvider;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Providers\EditRessourceDataProvider;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Sections\EditAdditionalSection;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Sections\EditGeneralSection;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\Hidden;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\Select;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\Text;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\FormConstants;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Sections\HalfPageSection;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Sections\InputGroup;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Modals\BaseEditModal;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\InputGroupElements;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 18.09.19
+ * Time: 09:29
+ * Class EditRessourceForm
+ */
+class EditRessourceForm extends SortedFieldForm implements ClientArea
+{
+    use FormExtendedTrait;
+
+    protected $id    = 'editRessourceForm';
+    protected $name  = 'editRessourceForm';
+    protected $title = 'editRessourceForm';
+
+    public function initContent()
+    {
+        $this->setFormType(FormConstants::UPDATE);
+        $this->setProvider(new EditRessourceDataProvider());
+        $this->initFields();
+        $this->loadDataToForm();
+    }
+
+    public function initFields()
+    {
+        $this->addSection(new EditGeneralSection());
+
+        $this->addSection(new EditAdditionalSection());
+    }
+}

+ 38 - 0
app/UI/Client/Ressource/Forms/MassChangeStatusForm.php

@@ -0,0 +1,38 @@
+<?php
+/**
+ * Class MassChangeStatusForm
+ * User: Nessandro
+ * Date: 2019-10-11
+ * Time: 12:26
+ * @package ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Forms
+ */
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Forms;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\DistributionList\Providers\DeleteListDataProvider;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Providers\RessourceDataProvider;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\BaseForm;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\Hidden;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\Select;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\FormConstants;
+
+class MassChangeStatusForm extends BaseForm implements ClientArea
+{
+    protected $id    = 'massChangeStatusForm';
+    protected $name  = 'massChangeStatusForm';
+    protected $title = 'massChangeStatusForm';
+
+    public function initContent()
+    {
+        $this->setFormType(FormConstants::UPDATE);
+        $this->dataProvider = new RessourceDataProvider();
+
+        $field = new Select('status');
+        $this->addField($field);
+
+        $this->loadDataToForm();
+    }
+
+}

+ 42 - 0
app/UI/Client/Ressource/Forms/MassDeleteRessourceForm.php

@@ -0,0 +1,42 @@
+<?php
+/**
+ * Class MassDeleteRessourceForm
+ * User: Nessandro
+ * Date: 2019-10-11
+ * Time: 11:29
+ * @package ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Forms
+ */
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Forms;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\DistributionList\Providers\DeleteListDataProvider;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Providers\DeleteRessourceDataProvider;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\BaseForm;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\Hidden;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\FormConstants;
+
+class MassDeleteRessourceForm extends BaseForm implements ClientArea
+{
+    protected $id    = 'massDeleteRessourceForm';
+    protected $name  = 'massDeleteRessourceForm';
+    protected $title = 'massDeleteRessourceForm';
+
+    protected function getDefaultActions()
+    {
+        return ['massDelete'];
+    }
+
+    public function initContent()
+    {
+        $this->setFormType('massDelete');
+        $this->dataProvider = new DeleteRessourceDataProvider();
+
+        $this->setConfirmMessage('massDeleteRessourceFormConfirm');
+
+
+        $this->loadDataToForm();
+    }
+
+}

+ 26 - 0
app/UI/Client/Ressource/Modals/AddRessourceModal.php

@@ -0,0 +1,26 @@
+<?php
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Modals;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Admin\Custom\Modals\ModalExtendedTabsEdit;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Forms\AddRessourceForm;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Modals\BaseEditModal;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 10.09.19
+ * Time: 13:06
+ * Class AddRessourceModal
+ */
+class AddRessourceModal extends ModalExtendedTabsEdit implements ClientArea
+{
+    protected $id    = 'addRessourceModal';
+    protected $name  = 'addRessourceModal';
+    protected $title = 'addRessourceModal';
+
+    public function initContent()
+    {
+        $this->addForm(new AddRessourceForm());
+    }
+}

+ 29 - 0
app/UI/Client/Ressource/Modals/ChangePasswordModal.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Modals;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Forms\ChangePasswordForm;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Forms\EditRessourceForm;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Modals\BaseEditModal;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 08.11.19
+ * Time: 12:07
+ * Class ChangePasswordModal
+ */
+class ChangePasswordModal extends BaseEditModal implements ClientArea
+{
+    protected $id    = 'changePasswordModal';
+    protected $name  = 'changePasswordModal';
+    protected $title = 'changePasswordModal';
+
+    public function initContent()
+    {
+        $this->addForm(new ChangePasswordForm());
+    }
+}

+ 29 - 0
app/UI/Client/Ressource/Modals/ChangeStatusModal.php

@@ -0,0 +1,29 @@
+<?php
+/**
+ * Class ChangeStatusModal
+ * User: Nessandro
+ * Date: 2019-10-11
+ * Time: 11:29
+ * @package ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Modals
+ */
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Modals;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Forms\ChangeStatusForm;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Forms\EditRessourceForm;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Buttons\ButtonDataTableModalAction;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Modals\BaseEditModal;
+
+class ChangeStatusModal extends BaseEditModal implements ClientArea
+{
+    protected $id    = 'changeStatusModal';
+    protected $name  = 'changeStatusModal';
+    protected $title = 'changeStatusModal';
+
+    public function initContent()
+    {
+        $this->addForm(new ChangeStatusForm());
+    }
+}

+ 34 - 0
app/UI/Client/Ressource/Modals/DeleteRessourceModal.php

@@ -0,0 +1,34 @@
+<?php
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Modals;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Forms\DeleteRessourceForm;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Forms\EditRessourceForm;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Modals\BaseModal;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 18.09.19
+ * Time: 11:28
+ * Class DeleteRessourceModal
+ */
+class DeleteRessourceModal extends BaseModal implements ClientArea
+{
+
+    protected $id    = 'deleteRessourceModal';
+    protected $name  = 'deleteRessourceModal';
+    protected $title = 'deleteRessourceModal';
+
+    public function initContent()
+    {
+        $this->setSubmitButtonClassesDanger();
+        $this->setModalTitleTypeDanger();
+
+        $this->addForm(new DeleteRessourceForm());
+    }
+
+}

+ 30 - 0
app/UI/Client/Ressource/Modals/EditRessourceModal.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Modals;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Admin\Custom\Modals\ModalExtendedTabsEdit;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Forms\AddRessourceForm;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Forms\EditRessourceForm;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Modals\BaseEditModal;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 18.09.19
+ * Time: 09:30
+ * Class EditRessourceModal
+ */
+class EditRessourceModal extends ModalExtendedTabsEdit implements ClientArea
+{
+    protected $id    = 'editRessourceModal';
+    protected $name  = 'editRessourceModal';
+    protected $title = 'editRessourceModal';
+
+    public function initContent()
+    {
+        $this->addForm(new EditRessourceForm());
+    }
+}

+ 30 - 0
app/UI/Client/Ressource/Modals/MassChangeStatusModal.php

@@ -0,0 +1,30 @@
+<?php
+/**
+ * Class MassChangeStatusModal
+ * User: Nessandro
+ * Date: 2019-10-11
+ * Time: 11:30
+ * @package ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Modals
+ */
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Modals;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Forms\MassChangeStatusForm;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Modals\BaseEditModal;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Modals\BaseModal;
+
+class MassChangeStatusModal extends BaseEditModal implements ClientArea
+{
+
+    protected $id    = 'massChangeStatusModal';
+    protected $name  = 'massChangeStatusModal';
+    protected $title = 'massChangeStatusModal';
+
+    public function initContent()
+    {
+        $this->addForm(new MassChangeStatusForm());
+    }
+
+}

+ 31 - 0
app/UI/Client/Ressource/Modals/MassDeleteRessourceModal.php

@@ -0,0 +1,31 @@
+<?php
+/**
+ * Class MassDeleteRessourceModal
+ * User: Nessandro
+ * Date: 2019-10-11
+ * Time: 11:29
+ * @package ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Modals
+ */
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Modals;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Forms\MassDeleteRessourceForm;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Modals\BaseModal;
+
+class MassDeleteRessourceModal extends BaseModal implements ClientArea
+{
+
+    protected $id    = 'massDeleteRessourceModal';
+    protected $name  = 'massDeleteRessourceModal';
+    protected $title = 'massDeleteRessourceModal';
+
+    public function initContent()
+    {
+        $this->setSubmitButtonClassesDanger();
+        $this->setModalTitleTypeDanger();
+        $this->addForm(new MassDeleteRessourceForm());
+    }
+
+}

+ 203 - 0
app/UI/Client/Ressource/Pages/Ressources.php

@@ -0,0 +1,203 @@
+<?php
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Pages;
+
+use ModulesGarden\Servers\ZimbraEmail\App\Helpers\BuildUrlExtended;
+use ModulesGarden\Servers\ZimbraEmail\App\Helpers\ZimbraManager;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Product\ProductManager;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Connection;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Helpers\RessourceHelper;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\Ressource;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Repository\ClassOfServices;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Filters\EmailRessources\FilterByCosId;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Admin\Custom\Fields\EnabledField;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Buttons\AddRessourceButton;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Buttons\ChangePasswordButton;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Buttons\ChangeStatusButton;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Buttons\DeleteRessourceButton;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Buttons\EditRessourceButton;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Buttons\LoginToPanelButton;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Buttons\MassChangeStatusButton;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Buttons\MassDeleteRessourceButton;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Buttons\SpanDropdownButton;
+use function ModulesGarden\Servers\ZimbraEmail\Core\Helper\di;
+use ModulesGarden\Servers\ZimbraEmail\Core\Models\Whmcs\Hosting;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Buttons\DropdawnButtonWrappers\ButtonDropdown;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\DataTable\Column;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\DataTable\DataProviders\DataProvider;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\DataTable\DataProviders\Providers\ArrayDataProvider;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\DataTable\DataTable;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 10.09.19
+ * Time: 10:51
+ * Class Ressources
+ */
+class Ressources extends DataTable implements ClientArea
+{
+
+    /**
+     * labels for statuses
+     */
+    const STATUS_LABEL = [
+        'active'        => 'success',
+        'locked'        => 'default',
+        'maintenance'   => 'warning',
+        'closed'        =>'default',
+        'lockout'       => 'info',
+        'pending'       => 'warning',
+        'default'       => 'default'
+    ];
+
+    protected $id    = 'accounts';
+    protected $name  = 'accounts';
+    protected $title = null;
+
+    /**
+     * load columns
+     */
+    protected function loadHtml()
+    {
+        $this
+            ->addColumn((new Column('mailbox'))
+                ->setOrderable(DataProvider::SORT_ASC)
+                ->setSearchable(true, Column::TYPE_STRING))
+            ->addColumn((new Column('date_created'))
+                ->setOrderable()
+                ->setSearchable(true))
+            ->addColumn((new Column('date_created'))
+                ->setOrderable()
+                ->setSearchable(true))
+            ->addColumn((new Column('last_login'))
+                ->setOrderable()
+                ->setSearchable(true))
+            ->addColumn((new Column('quota'))
+                ->setOrderable()
+                ->setSearchable(true, Column::TYPE_INT))
+            ->addColumn((new Column('status'))
+                ->setOrderable()
+                ->setSearchable(true));
+    }
+
+    /**
+     * @param $key
+     * @param $row
+     * @return mixed
+     */
+    public function replaceFieldStatus($key, $row)
+    {
+        $status = self::STATUS_LABEL[$row[$key]] ? self::STATUS_LABEL[$row[$key]] : self::STATUS_LABEL['default'];
+        $label = di('lang')->absoluteT('zimbra','account','status',$row[$key]);
+
+        $field = new EnabledField();
+        $field->setRawType($status);
+        $field->setRawTitle($label);
+
+        return $field->getHtml();
+    }
+
+    /**
+     * @param $key
+     * @param $row
+     * @return mixed
+     */
+    public function replaceFieldLast_login($key, $row)
+    {
+        return $row[$key] ? $row[$key] : '-';
+    }
+
+    /**
+     * load buttons
+     */
+    public function initContent()
+    {
+        $productManager = new ProductManager();
+        $productManager->loadByHostingId($this->getRequestValue('id'));
+
+        $this->addMassActionButton(new MassChangeStatusButton());
+        $this->addMassActionButton(new MassDeleteRessourceButton());
+
+        $this->addButton(new AddRessourceButton());
+
+
+        $this->addActionButton(new EditRessourceButton());
+        $this->addActionButton(new DeleteRessourceButton());
+
+        $mailBox = new LoginToPanelButton();
+        $mailBox
+            ->setRawUrl(BuildUrlExtended::getProvisioningUrl('webmail', true, true,'clientSso'))
+            ->setRedirectParams(['actionElementId' => 'true']);
+
+        $actions = new SpanDropdownButton('actions');
+        $actions->addButton(new ChangeStatusButton());
+        $actions->addButton(new ChangePasswordButton());
+
+        if ($productManager->get('ca_logInToMailboxButton') === 'on')
+        {
+            $actions->addButton($mailBox);
+        }
+
+        $this->addActionButton($actions);
+
+    }
+
+    /**
+     * load data
+     */
+    public function loadData()
+    {
+        /**
+         * load hosting
+         */
+        $hosting = Hosting::where('id', $this->getRequestValue('id'))->first();
+
+
+        $accounts = (new ZimbraManager())
+            ->getApiByServer($hosting->server)
+            ->soap
+            ->repository()
+            ->accounts
+            ->getByDomainName($hosting->domain);
+
+        $productManager = new ProductManager();
+        $productManager->loadByHostingId($hosting->id);
+
+        if($productManager->get('filterRessourcesByCOS') === 'on' && $productManager->get('cos_name') !=  ClassOfServices::CUSTOM_ZIMBRA)
+        {
+            $availableCoses = is_array($productManager->getSettingCos()) ? array_keys($productManager->getSettingCos()) : [$productManager->getSettingCos()];
+            $filter = new FilterByCosId();
+            $filter->setAvailableCoses($availableCoses);
+            $accounts = $filter->filter($accounts);
+        }
+
+        /**
+         * format model to array
+         */
+        $data = [];
+        foreach ($accounts as $account)
+        {
+            /* @var $account Ressource */
+
+            $accountArray = [
+                'id'           => $account->getId(),
+                'mailbox'      => $account->getName(),
+                'date_created' => RessourceHelper::getFormattedData($account->getDataResourceA('zimbraCreateTimestamp')),
+                'last_login'   => RessourceHelper::getFormattedData($account->getDataResourceA('zimbraLastLogonTimestamp'), 'd/m/Y H:i'),
+                'quota'        => RessourceHelper::getQuotaAsMb($account->getDataResourceA('zimbraMailQuota')),
+                'status'       => $account->getDataResourceA('zimbraRessourceStatus'),
+
+            ];
+
+            $data[] = $accountArray;
+        }
+        $dataProv = new ArrayDataProvider();
+        $dataProv->setDefaultSorting('mailbox', 'ASC')->setData($data);
+
+        $this->setDataProvider($dataProv);
+    }
+
+}

+ 116 - 0
app/UI/Client/Ressource/Providers/DeleteRessourceDataProvider.php

@@ -0,0 +1,116 @@
+<?php
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Providers;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\Helpers\ZimbraManager;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Product\ProductManager;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Services\Delete\DeleteRessource;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\ResponseTemplates\HtmlDataJsonResponse;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\DataProviders\BaseDataProvider;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 18.09.19
+ * Time: 11:28
+ * Class DeleteRessourceDataProvider
+ */
+class DeleteRessourceDataProvider extends BaseDataProvider
+{
+
+    public function read()
+    {
+        $this->data['id'] = $this->actionElementId;
+    }
+
+    public function update()
+    {
+        // TODO: Implement update() method.
+    }
+
+    public function delete()
+    {
+
+        /**
+         * hosting id
+         */
+        $hid = $this->request->get('id');
+
+        /**
+         * product manager allow to check product settings
+         */
+        $productManager = new ProductManager();
+        $productManager->loadByHostingId($hid);
+
+        /**
+         *
+         * get soap create domain  service
+         */
+        $service =(new ZimbraManager())
+            ->getApiByHosting($hid)
+            ->soap
+            ->service()
+            ->deleteRessource();
+        /**
+         *
+         * set product manager & form data to service
+         */
+        $service
+            ->setFormData($this->formData);
+
+        /**
+         *
+         * run service
+         */
+        $result = $service->run();
+
+        /**
+         *
+         * return success or error response
+         */
+        if(!$result)
+        {
+            return (new HtmlDataJsonResponse())->setMessageAndTranslate($service->getError())->setStatusError();
+        }
+
+        return (new HtmlDataJsonResponse())->setMessageAndTranslate('emailRessourceHasBeenDeleted')->setStatusSuccess();
+
+    }
+
+    public function massDelete()
+    {
+        /**
+         * hosting id
+         */
+        $hid = $this->request->get('id');
+
+        /**
+         * product manager allow to check product settings
+         */
+        $productManager = new ProductManager();
+        $productManager->loadByHostingId($hid);
+
+        /**
+         *
+         * get soap create domain  service
+         */
+        $service =(new ZimbraManager())
+            ->getApiByHosting($hid)
+            ->soap
+            ->service()
+            ->deleteRessource();
+
+        /**
+         *
+         */
+        foreach($this->request->get('massActions') as $id)
+        {
+            $service->setFormData(['id' => $id]);
+            $result = $service->run();
+        }
+
+        return (new HtmlDataJsonResponse())->setMessageAndTranslate('massEmailRessourceHasBeenDeleted')->setStatusSuccess();
+    }
+}

+ 354 - 0
app/UI/Client/Ressource/Providers/EditRessourceDataProvider.php

@@ -0,0 +1,354 @@
+<?php
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Providers;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\Enums\Zimbra;
+use ModulesGarden\Servers\ZimbraEmail\App\Helpers\ZimbraManager;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Product\ProductManager;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\Ressource;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\ClassOfService;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Repository;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Repository\ClassOfServices;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Response;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Services\Update\UpdateRessource;
+use ModulesGarden\Servers\ZimbraEmail\App\Services\ConfigurableOptions\Strategy\Types\ClassOfServicesOptions;
+use function ModulesGarden\Servers\ZimbraEmail\Core\Helper\di;
+use ModulesGarden\Servers\ZimbraEmail\Core\Models\Whmcs\Hosting;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\ResponseTemplates\HtmlDataJsonResponse;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\DataProviders\BaseDataProvider;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 18.09.19
+ * Time: 09:35
+ * Class EditRessourceDataProvider
+ */
+class EditRessourceDataProvider extends BaseDataProvider
+{
+
+    /**
+     *
+     */
+    public function read()
+    {
+        /**
+         * hosting id
+         */
+        $hid = $this->getRequestValue('id');
+        /**
+         * load hosting
+         */
+        $hosting = Hosting::where('id', $hid)->first();
+
+        /**
+         * load api
+         */
+        $api = (new ZimbraManager())->getApiByServer($hosting->server);
+
+        $repository = new Repository($api->soap);
+
+        $result = $repository->accounts->getRessourceOptionsById($this->actionElementId);
+
+        if($result instanceof Response && $result->getLastError())
+        {
+            throw new \Exception($result->getLastError());
+        }
+
+        $mailBoxParams              = explode('@', $result->getName());
+        $this->data['id']           = $result->getId();
+        $this->data['username']     = $mailBoxParams[0];
+        $this->data['domain']       = $mailBoxParams[1];
+        $this->data['firstname']    = $result->getDataResourceA(Ressource::ATTR_FIRSTNAME);
+        $this->data['lastname']     = $result->getDataResourceA(Ressource::ATTR_LASTNAME);
+        $this->data['display_name'] = $result->getDataResourceA(Ressource::ATTR_DISPLAY_NAME);
+        $this->data['status']       = $result->getDataResourceA(Ressource::ATTR_ACCOUNT_STATUS);
+        $this->data['company']      = $result->getDataResourceA(Ressource::ATTR_COMPANY);
+        $this->data['title']        = $result->getDataResourceA(Ressource::ATTR_PROF_TITLE);
+        $this->data['phone']        = $result->getDataResourceA(Ressource::ATTR_PHONE);
+        $this->data['home_phone']   = $result->getDataResourceA(Ressource::ATTR_HOME_PHONE);
+        $this->data['mobile_phone'] = $result->getDataResourceA(Ressource::ATTR_MOBILE_PHONE);
+        $this->data['fax']          = $result->getDataResourceA(Ressource::ATTR_FAX);
+        $this->data['pager']        = $result->getDataResourceA(Ressource::ATTR_PAGER);
+        $this->data['country']      = $result->getDataResourceA(Ressource::ATTR_COUNTRY);
+        $this->data['city']         = $result->getDataResourceA(Ressource::ATTR_CITY);
+        $this->data['street']       = $result->getDataResourceA(Ressource::ATTR_STREET);
+        $this->data['post_code']    = $result->getDataResourceA(Ressource::ATTR_POSTAL_CODE);
+        $this->data['currentCosId'] = $result->getDataResourceA(Ressource::ATTR_CLASS_OF_SERVICE_ID);
+        $this->data['cosId']        = $result->getDataResourceA(Ressource::ATTR_CLASS_OF_SERVICE_ID);
+        $this->data['state']        = $result->getDataResourceA(Ressource::ATTR_STATE);
+
+        $lang = di('lang');
+        $this->availableValues['status'] = [
+            Zimbra::ACC_STATUS_ACTIVE        => $lang->absoluteT('zimbra','account','status','active'),
+            Zimbra::ACC_STATUS_LOCKED        => $lang->absoluteT('zimbra','account','status','locked'),
+            Zimbra::ACC_STATUS_MAINTENANCE   => $lang->absoluteT('zimbra','account','status','maintenance'),
+            Zimbra::ACC_STATUS_CLOSED        => $lang->absoluteT('zimbra','account','status','closed'),
+            Zimbra::ACC_STATUS_LOCKOUT       => $lang->absoluteT('zimbra','account','status','lockout'),
+            Zimbra::ACC_STATUS_PENDING       => $lang->absoluteT('zimbra','account','status','pending')
+        ];
+
+        $this->readCosParams();
+
+    }
+
+    /**
+     * @return HtmlDataJsonResponse
+     */
+    public function update()
+    {
+        /**
+         * hosting id
+         */
+        $hid = $this->request->get('id');
+
+
+        $fieldToProtection = ['firstname', 'lastname', 'display_name', 'company', 'title', 'country', 'state', 'city', 'street', 'post_code' ];
+
+        foreach ($this->formData as $field => &$value)
+        {
+            $value = in_array($field, $fieldToProtection) ? htmlentities($value) : $value;
+        }
+
+        /**
+         * product manager allow to check product settings
+         */
+        $productManager = new ProductManager();
+        $productManager->loadByHostingId($hid);
+
+        /**
+         *
+         * get soap create domain  service
+         */
+        $service =(new ZimbraManager())
+            ->getApiByHosting($hid)
+            ->soap
+            ->service()
+            ->updateRessource($productManager->get('cos_name'));
+        /**
+         *
+         * set product manager & form data to service
+         */
+        $service
+            ->setProductManager($productManager)
+            ->setFormData($this->formData);
+
+
+        /**
+         * run service
+         */
+        $result = $service->run();
+
+        /**
+         * return success or error response
+         */
+        if(!$result)
+        {
+            return (new HtmlDataJsonResponse())->setMessageAndTranslate($service->getError())->setStatusError();
+        }
+
+        return (new HtmlDataJsonResponse())->setMessageAndTranslate('emailRessourceHasBeenUpdated')->setStatusSuccess();
+    }
+
+    /**
+     * @return HtmlDataJsonResponse
+     */
+    public function updateStatus()
+    {
+        /**
+         * hosting id
+         */
+        $hid = $this->request->get('id');
+
+        /**
+         * product manager allow to check product settings
+         */
+        $productManager = new ProductManager();
+        $productManager->loadByHostingId($hid);
+
+        /**
+         *
+         * get soap create domain  service
+         */
+        $service =(new ZimbraManager())
+            ->getApiByHosting($hid)
+            ->soap
+            ->service()
+            ->updateRessourceStatus()
+            ->setProductManager($productManager)
+        ;
+        /**
+         *
+         * set product manager & form data to service
+         */
+
+        /**
+         * run service for each id
+         */
+        $service->setFormData($this->formData);
+        $result = $service->run();
+
+        if(!$result)
+        {
+            return (new HtmlDataJsonResponse())->setMessageAndTranslate($service->getError())->setStatusError();
+        }
+
+        /**
+         * return success
+         */
+        return (new HtmlDataJsonResponse())->setMessageAndTranslate('emailRessourceStatusHasBeenUpdated')->setStatusSuccess();
+
+    }
+
+    /**
+     * @return HtmlDataJsonResponse
+     */
+    public function changePassword()
+    {
+        /**
+         * hosting id
+         */
+        $hid = $this->request->get('id');
+
+        /**
+         * product manager allow to check product settings
+         */
+        $productManager = new ProductManager();
+        $productManager->loadByHostingId($hid);
+
+        /**
+         *
+         * get soap create domain  service
+         */
+        $service =(new ZimbraManager())
+            ->getApiByHosting($hid)
+            ->soap
+            ->service()
+            ->updateRessourcePassword()
+            ->setProductManager($productManager)
+        ;
+        /**
+         *
+         * set product manager & form data to service
+         */
+
+        /**
+         * run service for each id
+         */
+        $service->setFormData($this->formData);
+        $result = $service->run();
+
+        if(!$result)
+        {
+            return (new HtmlDataJsonResponse())->setMessageAndTranslate($service->getError())->setStatusError();
+        }
+
+        return (new HtmlDataJsonResponse())->setMessageAndTranslate('passwordChangedSuccessfully')->setStatusSuccess();
+    }
+
+    /**
+     *
+     */
+    public function readCosParams()
+    {
+        $hid = $this->getRequestValue('id');
+        /**
+         * product manager allow to check product settings
+         */
+        $productManager = new ProductManager();
+        $productManager->loadByHostingId($hid);
+        if($productManager->get('cos_name') === ClassOfServices::CLASS_OF_SERVICE_QUOTA)
+        {
+            /**
+             *
+             * get soap create domain  service
+             */
+            $api =(new ZimbraManager())
+                ->getApiByHosting($hid)
+                ->soap;
+
+            /**
+             *
+             * get cos from API
+             */
+            $classOfServices = $api->repository()->cos->all();
+
+            /**
+             *
+             * load configurable options coses
+             */
+            $supportedCos = $productManager->getSettingCos();
+
+            /**
+             *
+             * add COS to array
+             */
+            $configoptions = $this->getFilteredCosConfigurableOptions();
+            foreach($classOfServices as $cos)
+            {
+                /**
+                 *
+                 *
+                 * skip COS which is not used in configurable options
+                 */
+                if(!($supportedCos && array_key_exists($cos->getId(), $supportedCos)))
+                {
+                    continue;
+                }
+
+                /**
+                 *
+                 * skip if class of services doesnt exists in config option list
+                 */
+                if($configoptions && !array_key_exists('cosQuota_'.$cos->getId(), $configoptions))
+                {
+                    continue;
+                }
+
+                /**
+                 * skip not purchased as CO
+                 */
+                if ($configoptions && $configoptions['cosQuota_'.$cos->getId()] == 0)
+                {
+                    continue;
+                }
+
+                /**
+                 * 1. check if config opts are not available
+                 * 2. skip if quantity === 0
+                 */
+                if(!$configoptions && $supportedCos[$cos->getId()] == 0)
+                {
+                    continue;
+                }
+
+
+                /* @var $cos ClassOfService*/
+                $this->availableValues['cosId'][$cos->getId()] = $cos->getMbMailQuote().' MB';
+            }
+        }
+
+    }
+
+    /**
+     * @return bool|mixed
+     */
+    protected function getFilteredCosConfigurableOptions()
+    {
+        $configoptions = $this->getWhmcsParamByKey('configoptions');
+
+        foreach($configoptions as $key => $value)
+        {
+            if(strpos($key, ClassOfServicesOptions::COS_CONFIG_OPT_PREFIX) === false)
+            {
+                unset($configoptions[$key]);
+            }
+
+        }
+
+        return $configoptions;
+    }
+
+}

+ 307 - 0
app/UI/Client/Ressource/Providers/RessourceDataProvider.php

@@ -0,0 +1,307 @@
+<?php
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Providers;
+use ModulesGarden\Servers\ZimbraEmail\App\Enums\ProductParams;
+use ModulesGarden\Servers\ZimbraEmail\App\Enums\Size;
+use ModulesGarden\Servers\ZimbraEmail\App\Enums\Zimbra;
+use ModulesGarden\Servers\ZimbraEmail\App\Helpers\ZimbraManager;
+use ModulesGarden\Servers\ZimbraEmail\App\Http\Admin\ProductConfiguration;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Product\ProductManager;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Helpers\ServiceFactory;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\Ressource;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\ClassOfService;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Repository\ClassOfServices;
+use ModulesGarden\Servers\ZimbraEmail\App\Services\ConfigurableOptions\Strategy\Types\ClassOfServicesOptions;
+use function ModulesGarden\Servers\ZimbraEmail\Core\Helper\di;
+use ModulesGarden\Servers\ZimbraEmail\Core\Http\JsonResponse;
+use ModulesGarden\Servers\ZimbraEmail\Core\Models\Whmcs\Hosting;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\ResponseTemplates\HtmlDataJsonResponse;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\DataProviders\BaseDataProvider;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 10.09.19
+ * Time: 13:06
+ * Class RessourceDataProvider
+ */
+class RessourceDataProvider extends BaseDataProvider
+{
+
+    public function read()
+    {
+        /**
+         * hosting id
+         */
+        $hid = $this->request->get('id');
+
+        $hosting = Hosting::where('id', $hid)->first();
+        //todo refactor
+        $this->data['domain'] = $hosting->domain;
+
+        $lang = di('lang');
+        $this->availableValues['status'] = [
+            Zimbra::ACC_STATUS_ACTIVE        => $lang->absoluteT('zimbra','account','status','active'),
+            Zimbra::ACC_STATUS_LOCKED        => $lang->absoluteT('zimbra','account','status','locked'),
+            Zimbra::ACC_STATUS_MAINTENANCE   => $lang->absoluteT('zimbra','account','status','maintenance'),
+            Zimbra::ACC_STATUS_CLOSED        => $lang->absoluteT('zimbra','account','status','closed'),
+            Zimbra::ACC_STATUS_LOCKOUT       => $lang->absoluteT('zimbra','account','status','lockout'),
+            Zimbra::ACC_STATUS_PENDING       => $lang->absoluteT('zimbra','account','status','pending')
+        ];
+
+        /**
+         * product manager allow to check product settings
+         */
+
+        $this->readCosParams();
+    }
+
+    public function create()
+    {
+        /**
+         * hosting id
+         */
+        $hid = $this->request->get('id');
+
+
+        $fieldToProtection = ['firstname', 'lastname', 'display_name', 'company', 'title', 'country', 'state', 'city', 'street', 'post_code' ];
+
+        foreach ($this->formData as $field => &$value)
+        {
+            $value = in_array($field, $fieldToProtection) ? htmlentities($value) : $value;
+        }
+
+        /**
+         * product manager allow to check product settings
+         */
+        $productManager = new ProductManager();
+        $productManager->loadByHostingId($hid);
+
+        /**
+         *
+         * get soap create domain  service
+         */
+        $service =(new ZimbraManager())
+            ->getApiByHosting($hid)
+            ->soap
+            ->service()
+            ->createRessource($productManager->get('cos_name'));
+        /**
+         *
+         * set product manager & form data to service
+         */
+        $service
+            ->setProductManager($productManager)
+            ->setFormData($this->formData);
+
+        /**
+         *
+         * run service
+         */
+        $result = $service->run();
+
+        /**
+         *
+         * return success or error response
+         */
+        if(!$result)
+        {
+            return (new HtmlDataJsonResponse())->setMessageAndTranslate($service->getError())->setStatusError();
+        }
+
+        return (new HtmlDataJsonResponse())->setMessageAndTranslate('emailRessourceHasBeenAdded')->setStatusSuccess();
+
+    }
+
+    public function updateStatus()
+    {
+
+
+    }
+
+    public function update()
+    {
+        /**
+         * hosting id
+         */
+        $hid = $this->request->get('id');
+
+        /**
+         * product manager allow to check product settings
+         */
+        $productManager = new ProductManager();
+        $productManager->loadByHostingId($hid);
+
+        /**
+         *
+         * get soap create domain  service
+         */
+        $service =(new ZimbraManager())
+            ->getApiByHosting($hid)
+            ->soap
+            ->service()
+            ->updateRessourceStatus()
+            ->setProductManager($productManager)
+        ;
+        /**
+         *
+         * set product manager & form data to service
+         */
+
+        /**
+         * run service for each id
+         */
+        foreach($this->request->get('massActions') as $id)
+        {
+            $service->setFormData(['status' => $this->formData['status'], 'id' => $id]);
+            $result = $service->run();
+        }
+
+        /**
+         * return success
+         */
+        return (new HtmlDataJsonResponse())->setMessageAndTranslate('massEmailRessourceStatusHasBeenUpdated')->setStatusSuccess();
+    }
+
+    /**
+     *
+     * read data per cos_name
+     */
+    protected function readCosParams()
+    {
+        $hid = $this->request->get('id');
+
+
+        /**
+         *
+         * load product manager
+         */
+        $productManager = new ProductManager();
+        $productManager->loadByHostingId($hid);
+
+        /**
+         *
+         * check if class of services should be selectable
+         */
+        if($productManager->get('cos_name') === ClassOfServices::CLASS_OF_SERVICE_QUOTA)
+        {
+            /**
+             *
+             * get soap create domain  service
+             */
+            $api =(new ZimbraManager())
+                ->getApiByHosting($hid)
+                ->soap;
+
+            /**
+             *
+             * get cos from API
+             */
+            $classOfServices = $api->repository()->cos->all();
+
+            /**
+             *
+             * load configurable options coses
+             */
+            $supportedCos = $productManager->getSettingCos();
+
+            /**
+             *
+             * add COS to array
+             */
+            $configoptions = $this->getFilteredCosConfigurableOptions();
+
+            foreach($classOfServices as $cos)
+            {
+                /**
+                 *
+                 *
+                 * skip COS which is not used in configurable options
+                 */
+                if(!($supportedCos && array_key_exists($cos->getId(), $supportedCos)))
+                {
+                    continue;
+                }
+
+                /**
+                 * 1. check if config opts are available
+                 * 2. skip if class of services doesnt exists in config option list
+                 */
+                if($configoptions && !array_key_exists('cosQuota_'.$cos->getId(), $configoptions))
+                {
+                    continue;
+                }
+
+                /**
+                 * 1. check if config opts are available
+                 * 2. skip not purchased as CO
+                 */
+                if ($configoptions && $configoptions['cosQuota_'.$cos->getId()] == 0)
+                {
+                    continue;
+                }
+
+                /**
+                 * 1. check if config opts are not available
+                 * 2. skip if quantity === 0
+                 */
+                if(!$configoptions && $supportedCos[$cos->getId()] == 0)
+                {
+                    continue;
+                }
+
+                /* @var $cos ClassOfService*/
+                $this->availableValues['cosId'][$cos->getId()] = $cos->getMbMailQuote().' MB';
+            }
+
+
+            return $this;
+        }
+
+
+        /**
+         *
+         * check if class of service is choosen by config opt
+         */
+        if($productManager->get('cos_name') === ClassOfServices::ZIMBRA_CONFIG_OPTIONS)
+        {
+
+            $this->data['cosId'] = key($productManager->getSettingCos());
+            return $this;
+        }
+
+        /**
+         *
+         * if cos_name is dedicated (loaded from API)
+         */
+        if($productManager->get('cos_name') !== ClassOfServices::CUSTOM_ZIMBRA)
+        {
+            /**
+             * if dedicated class of service has been selected
+             */
+            $this->data['cosId'] = $productManager->get('cos_name');
+            return $this;
+        }
+
+        return $this;
+    }
+
+    /**
+     * @return bool|mixed
+     */
+    protected function getFilteredCosConfigurableOptions()
+    {
+        $configoptions = $this->getWhmcsParamByKey('configoptions');
+
+        foreach($configoptions as $key => $value)
+        {
+            if(strpos($key, ClassOfServicesOptions::COS_CONFIG_OPT_PREFIX) === false)
+            {
+                unset($configoptions[$key]);
+            }
+
+        }
+
+        return $configoptions;
+    }
+}

+ 45 - 0
app/UI/Client/Ressource/Sections/AdditionalSection.php

@@ -0,0 +1,45 @@
+<?php
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Sections;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\Traits\FormExtendedTrait;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Admin\Custom\Sections\FreeFieldsSection;
+use function ModulesGarden\Servers\ZimbraEmail\Core\Helper\di;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\Text;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 12.11.19
+ * Time: 13:42
+ * Class AdditionalSection
+ */
+class AdditionalSection extends FreeFieldsSection
+{
+    protected $id   = 'additionalSection';
+    protected $name = 'additionalSection';
+
+    use FormExtendedTrait;
+
+    public function initContent()
+    {
+        $this->generateDoubleSection([new Text('company'), new Text('title')]);
+
+        $field = new Text('phone');
+        $field->setPlaceholder(di('lang')->absoluteT('phoneNumberPlaceholder'));
+        $this->addField($field);
+
+        $this->generateDoubleSection([new Text('home_phone'), new Text('mobile_phone')]);
+
+        $this->generateDoubleSection([new Text('fax'), new Text('pager')]);
+
+        $this->generateDoubleSection([new Text('country'), new Text('state')]);
+
+        $this->generateDoubleSection([new Text('city'), new Text('street')]);
+
+        $field = new Text('post_code');
+        $this->addField($field);
+    }
+}

+ 44 - 0
app/UI/Client/Ressource/Sections/EditAdditionalSection.php

@@ -0,0 +1,44 @@
+<?php
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Sections;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\Traits\FormExtendedTrait;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Admin\Custom\Sections\FreeFieldsSection;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\Text;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 12.11.19
+ * Time: 13:52
+ * Class EditAdditionalSection
+ */
+class EditAdditionalSection extends FreeFieldsSection
+{
+    protected $id   = 'editAdditionalSection';
+    protected $name = 'editAdditionalSection';
+
+    use FormExtendedTrait;
+
+    public function initContent()
+    {
+        $this->generateDoubleSection([new Text('company'), new Text('title')]);
+
+        $field = new Text('phone');
+        $this->addField($field);
+
+        $this->generateDoubleSection([new Text('home_phone'), new Text('mobile_phone')]);
+
+        $this->generateDoubleSection([new Text('fax'), new Text('pager')]);
+
+        $this->generateDoubleSection([new Text('country'), new Text('state')]);
+
+        $this->generateDoubleSection([new Text('city'), new Text('street')]);
+
+        $field = new Text('post_code');
+        $this->addField($field);
+    }
+
+}

+ 70 - 0
app/UI/Client/Ressource/Sections/EditGeneralSection.php

@@ -0,0 +1,70 @@
+<?php
+
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Sections;
+
+
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Product\ProductManager;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Repository\ClassOfServices;
+use ModulesGarden\Servers\ZimbraEmail\App\Traits\FormExtendedTrait;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Admin\Custom\Sections\FreeFieldsSection;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\Hidden;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\Select;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\Text;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Sections\InputGroup;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\InputGroupElements;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 12.11.19
+ * Time: 13:52
+ * Class EditGeneralSection
+ */
+class EditGeneralSection extends FreeFieldsSection
+{
+    protected $id   = 'editGeneralSection';
+    protected $name = 'editGeneralSection';
+
+    use FormExtendedTrait;
+
+    public function initContent()
+    {
+        /**
+         * hosting id
+         */
+        $hid = $this->getRequestValue('id');
+
+        /**
+         * product manager allow to check product settings
+         */
+        $productManager = new ProductManager();
+        $productManager->loadByHostingId($hid);
+
+        /**
+         * add fields
+         */
+        $field = new Hidden('id');
+        $this->addField($field);
+
+        $this->generateDoubleSection([new Text('firstname'), new Text('lastname')]);
+
+        $email =new InputGroup('usernameGroup');
+
+        $email->addInputComponent((new InputGroupElements\Text('username'))->addHtmlAttribute('readonly','true'));
+        $email->addInputAddon('emailSign', false, '@');
+        $email->addInputComponent((new InputGroupElements\Text('domain'))->addHtmlAttribute('readonly','true'));
+        $this->addSection($email);
+
+        $this->generateDoubleSection([new Text('display_name'), new Select('status')]);
+
+        if($productManager->get('cos_name') === ClassOfServices::CLASS_OF_SERVICE_QUOTA)
+        {
+            $field = new Hidden('currentCosId');
+            $this->addField($field);
+
+            $field = new Select('cosId');
+            $this->addField($field);
+        }
+    }
+}

+ 83 - 0
app/UI/Client/Ressource/Sections/GeneralSection.php

@@ -0,0 +1,83 @@
+<?php
+namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailRessource\Sections;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Product\ProductManager;
+use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Repository\ClassOfServices;
+use ModulesGarden\Servers\ZimbraEmail\App\Traits\FormExtendedTrait;
+use ModulesGarden\Servers\ZimbraEmail\App\UI\Admin\Custom\Sections\FreeFieldsSection;
+use ModulesGarden\Servers\ZimbraEmail\App\Validators\PasswordsValidator;
+use ModulesGarden\Servers\ZimbraEmail\App\Validators\RepeatPasswordValidator;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\Hidden;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\Password;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\Select;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\Text;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Sections\InputGroup;
+use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\Fields\InputGroupElements;
+
+/**
+ *
+ * Created by PhpStorm.
+ * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
+ * Date: 12.11.19
+ * Time: 13:39
+ * Class GeneralSection
+ */
+class GeneralSection extends FreeFieldsSection
+{
+    protected $id   = 'generalSection';
+    protected $name = 'generalSection';
+
+    use FormExtendedTrait;
+
+    public function initContent()
+    {
+        /**
+         * hosting id
+         */
+        $hid = $this->getRequestValue('id');
+
+        /**
+         * product manager allow to check product settings
+         */
+        $productManager = new ProductManager();
+        $productManager->loadByHostingId($hid);
+
+        $this->generateDoubleSection([new Text('firstname'), new Text('lastname')]);
+
+        $email = new InputGroup('usernameGroup');
+
+        $email->addTextField('username', false, true);
+        $email->addInputAddon('emailSign', false, '@');
+        $email->addInputComponent((new InputGroupElements\Text('domain'))->addHtmlAttribute('readonly','true'));
+        $this->addSection($email);
+
+        $this->generateDoubleSection([new Text('display_name'), new Select('status')]);
+        /***
+         *
+         * set cosId dependent od cos_name
+         */
+        if($productManager->get('cos_name') === ClassOfServices::CLASS_OF_SERVICE_QUOTA)
+        {
+            $field = new Select('cosId');
+            $this->addField($field);
+        }elseif($productManager->get('cos_name') === ClassOfServices::ZIMBRA_CONFIG_OPTIONS)
+        {
+            $field = new Hidden('cosId');
+            $this->addField($field);
+        }elseif($productManager->get('cos_name') !== ClassOfServices::CUSTOM_ZIMBRA)
+        {
+            $field = new Hidden('cosId');
+            $this->addField($field);
+        }
+
+        $passwd = new Password('password');
+        $passwd->setDescription('description');
+        $passwd->addValidator(new PasswordsValidator());
+        $passwd->notEmpty();
+
+        $repPasswd = (new Password('repeat_password'))->addValidator(new RepeatPasswordValidator());
+        $repPasswd->notEmpty();
+
+        $this->generateDoubleSection([$passwd, $repPasswd]);
+
+    }
+}