From af9f714ffb9b9f5f7bd87beb44b027e8a968e195 Mon Sep 17 00:00:00 2001 From: Roland Gruber Date: Sat, 28 Sep 2019 11:24:47 +0200 Subject: [PATCH] responsive --- lam/lib/modules/pykotaPrinter.inc | 64 ++++++------ lam/lib/modules/pykotaUser.inc | 162 +++++++++++++----------------- 2 files changed, 100 insertions(+), 126 deletions(-) diff --git a/lam/lib/modules/pykotaPrinter.inc b/lam/lib/modules/pykotaPrinter.inc index 2fcec9b9..b37d026f 100644 --- a/lam/lib/modules/pykotaPrinter.inc +++ b/lam/lib/modules/pykotaPrinter.inc @@ -2,7 +2,7 @@ /* This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/) - Copyright (C) 2013 - 2018 Roland Gruber + Copyright (C) 2013 - 2019 Roland Gruber This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -225,7 +225,7 @@ class pykotaPrinter extends baseModule { * @return htmlElement HTML meta data */ function display_html_attributes() { - $container = new htmlTable(); + $container = new htmlResponsiveRow(); // cn $this->addSimpleInputTextField($container, 'cn', _('Printer name'), true); // job size @@ -239,10 +239,9 @@ class pykotaPrinter extends baseModule { if (!empty($this->attributes['pykotaPassThrough'][0])) { $pykotaPassThroughOption = $this->attributes['pykotaPassThrough'][0]; } - $pykotaPassThroughSelect = new htmlTableExtendedSelect('pykotaPassThrough', $this->passThroughOptions, array($pykotaPassThroughOption), _('Passthrough'), 'pykotaPassThrough'); + $pykotaPassThroughSelect = new htmlResponsiveSelect('pykotaPassThrough', $this->passThroughOptions, array($pykotaPassThroughOption), _('Passthrough'), 'pykotaPassThrough'); $pykotaPassThroughSelect->setHasDescriptiveElements(true); - $container->addElement($pykotaPassThroughSelect); - $container->addElement(new htmlSpacer('150px', null), true); // layout fix if many parent groups exist + $container->add($pykotaPassThroughSelect, 12); // description $this->addMultiValueInputTextField($container, 'description', _('Description'), false, null, true); // printer groups @@ -254,21 +253,19 @@ class pykotaPrinter extends baseModule { $parentPrinters[] = $this->printerCache[$groupDN]['cn']; } if (sizeof($parentPrinters) > 0) { - $container->addElement(new htmlOutputText(_('Printer groups'))); + $container->addLabel(new htmlOutputText(_('Printer groups'))); $parentPrinterText = new htmlOutputText(implode(', ', $parentPrinters)); - $parentPrinterText->colspan = 5; - $container->addElement($parentPrinterText, true); + $container->addField($parentPrinterText, true); } } // printer members $memberLabel = new htmlOutputText(_('Group members')); - $memberLabel->alignment = htmlElement::ALIGN_TOP; - $container->addElement($memberLabel); + $container->addLabel($memberLabel); $addMemberButton = new htmlAccountPageButton(get_class($this), 'members', 'open', 'add.png', true); $addMemberButton->setTitle(_('Add')); - $addMemberButton->alignment = htmlElement::ALIGN_TOP; + $memberHelp = new htmlHelpLink('uniqueMember'); + $memberTable = new htmlTable(); if (!empty($this->attributes['uniqueMember'][0])) { - $memberTable = new htmlTable(); $memberTable->alignment = htmlElement::ALIGN_TOP; for ($i = 0; $i < sizeof($this->attributes['uniqueMember']); $i++) { $member = $this->attributes['uniqueMember'][$i]; @@ -281,17 +278,16 @@ class pykotaPrinter extends baseModule { $memberTable->addElement($delButton); if ($i == (sizeof($this->attributes['uniqueMember']) - 1)) { $memberTable->addElement($addMemberButton); + $memberTable->addElement($memberHelp); } $memberTable->addNewLine(); } - $container->addElement($memberTable); } else { - $container->addElement($addMemberButton); + $memberTable->addElement($addMemberButton); + $memberTable->addElement($memberHelp); } - $memberHelp = new htmlHelpLink('uniqueMember'); - $memberHelp->alignment = htmlElement::ALIGN_TOP; - $container->addElement($memberHelp, true); + $container->addField($memberTable); return $container; } @@ -382,13 +378,7 @@ class pykotaPrinter extends baseModule { * @return htmlElement HTML meta data */ function display_html_members() { - $return = new htmlTable(); - $userFilter = ''; - $userFilterRegex = ''; - if (isset($_POST['newFilter'])) { - $userFilter = $_POST['newFilter']; - $userFilterRegex = '/' . str_replace(array('*', '(', ')'), array('.*', '\(', '\)'), $_POST['newFilter']) . '/ui'; - } + $return = new htmlResponsiveRow(); $options = array(); $this->loadPrinterNameCache(); foreach ($this->printerCache as $dn => $attrs) { @@ -398,10 +388,6 @@ class pykotaPrinter extends baseModule { else { $label = $attrs['cn']; } - // skip filtered printers - if (!empty($userFilter) && !preg_match($userFilterRegex, $label)) { - continue; - } // skip own entry if (!$this->getAccountContainer()->isNewAccount && ($this->getAccountContainer()->dn_orig == $dn)) { continue; @@ -413,22 +399,28 @@ class pykotaPrinter extends baseModule { $options[$label] = $dn; } $size = 20; - if (sizeof($options) < 20) $size = sizeof($options); + if (sizeof($options) < 20) { + $size = sizeof($options); + } $membersSelect = new htmlSelect('members', $options, array(), $size); $membersSelect->setHasDescriptiveElements(true); $membersSelect->setMultiSelect(true); $membersSelect->setTransformSingleSelect(false); - $return->addElement($membersSelect, true); + $return->add($membersSelect, 12); $filterGroup = new htmlGroup(); - $filterGroup->addElement(new htmlInputField('newFilter', $userFilter)); - $filterGroup->addElement(new htmlButton('setFilter', _('Filter'))); + $filterGroup->addElement(new htmlOutputText(_('Filter'))); + $filterInput = new htmlInputField('newFilter', null); + $filterInput->setCSSClasses(array('maxwidth20')); + $filterInput->filterSelectBox('members'); + $filterGroup->addElement($filterInput); $filterGroup->addElement(new htmlHelpLink('filter')); - $return->addElement($filterGroup, true); - $return->addElement(new htmlSpacer(null, '10px'), true); - $buttonTable = new htmlTable(); + $return->add($filterGroup, 12); + $return->addVerticalSpacer('2rem'); + $buttonTable = new htmlGroup(); $buttonTable->addElement(new htmlAccountPageButton(get_class($this), 'attributes', 'addMembers', _('Add'))); + $buttonTable->addElement(new htmlSpacer('0.5rem', null)); $buttonTable->addElement(new htmlAccountPageButton(get_class($this), 'attributes', 'cancel', _('Cancel'))); - $return->addElement($buttonTable); + $return->add($buttonTable, 12); return $return; } diff --git a/lam/lib/modules/pykotaUser.inc b/lam/lib/modules/pykotaUser.inc index e0a45dd4..95e370ec 100644 --- a/lam/lib/modules/pykotaUser.inc +++ b/lam/lib/modules/pykotaUser.inc @@ -296,7 +296,7 @@ class pykotaUser extends baseModule { * @return htmlElement HTML meta data */ function display_html_attributes() { - $container = new htmlTable(); + $container = new htmlResponsiveRow(); $modules = $this->getAccountContainer()->get_type()->getModules(); if ($this->isStructural() || (isset($this->attributes['objectClass']) && in_array('pykotaAccount', $this->attributes['objectClass']))) { // uid @@ -315,8 +315,7 @@ class pykotaUser extends baseModule { $page = $this->getAccountContainer()->getAccountModule('inetOrgPerson')->get_alias(); } $msg = new htmlStatusMessage('INFO', sprintf(_("Please enter an user name on this page: %s"), $page)); - $msg->colspan = 5; - $container->addElement($msg, true); + $container->add($msg, 12); } } // pykotaUserName @@ -326,42 +325,31 @@ class pykotaUser extends baseModule { if (isset($this->attributes['pykotaBalance'][0])) { $pykotaBalance = $this->attributes['pykotaBalance'][0]; } - $container->addElement(new htmlOutputText(_('Balance'))); - $container->addElement(new htmlOutputText($pykotaBalance)); - $container->addElement(new htmlHelpLink('pykotaBalance'), true); - // new payment and balance history - $container->addElement(new htmlOutputText(_('Payment'))); - $newPaymentGroup = new htmlGroup(); - $newPaymentAmount = new htmlInputField('pykotaBalanceAdd', '', '5em'); - $newPaymentAmount->setTitle(_('Amount')); - $newPaymentGroup->addElement($newPaymentAmount); - $newPaymentComment = new htmlInputField('pykotaBalanceComment', '', '20em'); - $newPaymentComment->setTitle(_('Comment')); - $newPaymentGroup->addElement($newPaymentComment); - $newPaymentBtn = new htmlButton('addPayment', _('Add')); - $newPaymentBtn->setIconClass('createButton'); - $newPaymentGroup->addElement($newPaymentBtn); - $container->addElement($newPaymentGroup); - $container->addElement(new htmlHelpLink('pykotaPaymentsAdd'), true); - $container->addElement(new htmlOutputText('')); + $container->addLabel(new htmlOutputText(_('Balance'))); + $balanceGroup = new htmlGroup(); + $balanceGroup->addElement(new htmlOutputText($pykotaBalance)); + $balanceGroup->addElement(new htmlSpacer('0.5rem', null)); + $balanceGroup->addElement(new htmlHelpLink('pykotaBalance')); + $container->addField($balanceGroup); + $container->addLabel(new htmlOutputText(' ', false)); $historyGroup = new htmlGroup(); $historyGroup->addElement(new htmlAccountPageButton(get_class($this), 'payments', 'open', _('Payment history'))); if (!$this->getAccountContainer()->isNewAccount && !empty($this->moduleSettings['pykotaUser_jobSuffix'][0])) { $historyGroup->addElement(new htmlSpacer('5px', null)); $historyGroup->addElement(new htmlAccountPageButton(get_class($this), 'jobs', 'open', _('Job history'))); } - $container->addElement($historyGroup); - $container->addElement(new htmlHelpLink('pykotaPayments'), true); - $container->addElement(new htmlSpacer(null, '10px'), true); + $historyGroup->addElement(new htmlSpacer('5px', null)); + $historyGroup->addElement(new htmlHelpLink('pykotaPayments'), true); + $container->addField($historyGroup); // limit by $limitOption = 'quota'; if (!empty($this->attributes['pykotaLimitBy'][0])) { $limitOption = $this->attributes['pykotaLimitBy'][0]; } - $limitSelect = new htmlTableExtendedSelect('pykotaLimitBy', $this->limitOptions, array($limitOption), _('Limit type'), 'pykotaLimitBy'); + $limitSelect = new htmlResponsiveSelect('pykotaLimitBy', $this->limitOptions, array($limitOption), _('Limit type'), 'pykotaLimitBy'); $limitSelect->setHasDescriptiveElements(true); $limitSelect->setSortElements(false); - $container->addElement($limitSelect, true); + $container->add($limitSelect, 12); // overcharge factor $this->addSimpleInputTextField($container, 'pykotaOverCharge', _('Overcharge factor')); // cn @@ -376,17 +364,29 @@ class pykotaUser extends baseModule { if ($this->manageDescription($modules)) { $this->addMultiValueInputTextField($container, 'description', _('Description'), false, null, true); } + // new payment + $container->add(new htmlSubTitle(_('Payment')), 12); + $newPaymentAmount = new htmlResponsiveInputField(_('Amount'), 'pykotaBalanceAdd', '', '5em'); + $container->add($newPaymentAmount, 12); + $newPaymentComment = new htmlResponsiveInputField(_('Comment'), 'pykotaBalanceComment', '', '20em'); + $container->add($newPaymentComment, 12); + $newPaymentBtn = new htmlButton('addPayment', _('Add')); + $newPaymentBtn->setIconClass('createButton'); + $newPaymentGroup = new htmlGroup(); + $newPaymentGroup->addElement($newPaymentBtn); + $newPaymentGroup->addElement(new htmlSpacer('0.5rem', null)); + $newPaymentGroup->addElement(new htmlHelpLink('pykotaPaymentsAdd')); + $container->add($newPaymentGroup, 12, 12, 12, 'text-center'); // remove button if (!$this->isStructural()) { - $container->addElement(new htmlSpacer(null, '20px'), true); + $container->addVerticalSpacer('2rem'); $remButton = new htmlButton('remObjectClass', _('Remove PyKota extension')); - $remButton->colspan = 5; - $container->addElement($remButton); + $container->add($remButton, 12, 12, 12, 'text-center'); } } else { // add button - $container->addElement(new htmlButton('addObjectClass', _('Add PyKota extension'))); + $container->add(new htmlButton('addObjectClass', _('Add PyKota extension')), 12); } return $container; } @@ -542,48 +542,44 @@ class pykotaUser extends baseModule { * @return htmlElement HTML meta data */ function display_html_payments() { - $container = new htmlTable(); + $container = new htmlResponsiveRow(); + $container->setCSSClasses(array('maxrow')); // total paid $total = ''; if (!empty($this->attributes['pykotaLifeTimePaid'][0])) { $total = $this->attributes['pykotaLifeTimePaid'][0]; } - $container->addElement(new htmlOutputText(_('Total paid'))); - $container->addElement(new htmlOutputText($total)); - $container->addElement(new htmlHelpLink('pykotaLifeTimePaid'), true); + $container->addLabel(new htmlOutputText(_('Total paid'))); + $totalPaidGroup = new htmlGroup(); + $totalPaidGroup->addElement(new htmlOutputText($total)); + $totalPaidGroup->addElement(new htmlSpacer('0.5rem', null)); + $totalPaidGroup->addElement(new htmlHelpLink('pykotaLifeTimePaid')); + $container->addField($totalPaidGroup, 12); // payment/job history if (!empty($this->attributes['pykotaPayments'][0])) { - $container->addElement(new htmlSubTitle(_('Payment history')), true); - $spacer = new htmlSpacer('10px', null); - $historyTable = new htmlTable(); - $historyTable->colspan = 5; - $historyTable->addElement(new htmlOutputText(_('Date')), false, true); - $historyTable->addElement($spacer); - $historyTable->addElement(new htmlOutputText(_('Amount')), false, true); - $historyTable->addElement($spacer); - $historyTable->addElement(new htmlOutputText(_('Comment')), true, true); + $container->add(new htmlSubTitle(_('Payment history')), 12); + $labels = array(_('Date'), _('Amount'), _('Comment')); + $data = array(); rsort($this->attributes['pykotaPayments']); foreach ($this->attributes['pykotaPayments'] as $payment) { $parts = explode(' # ', $payment); - $historyTable->addElement(new htmlOutputText($parts[0])); - $historyTable->addElement($spacer); - $amount = new htmlOutputText($parts[1]); - $amount->alignment = htmlElement::ALIGN_RIGHT; - $historyTable->addElement($amount); - $historyTable->addElement($spacer); - if (!empty($parts[2])) { - $historyTable->addElement(new htmlOutputText(base64_decode($parts[2]))); - } - $historyTable->addNewLine(); + $comment = empty($parts[2]) ? '' : base64_decode($parts[2]); + $commentField = new htmlOutputText($comment); + $amountFied = new htmlOutputText($parts[1]); + $data[] = array( + new htmlOutputText($parts[0]), + $amountFied, + $commentField + ); } - $container->addElement($historyTable, true); + $historyTable = new htmlResponsiveTable($labels, $data); + $historyTable->setWidths(array('20%', '15%', '65%')); + $container->add($historyTable, 12); } // back button - $container->addElement(new htmlSpacer(null, '20px'), true); + $container->addVerticalSpacer('2rem'); $backButton = new htmlAccountPageButton(get_class($this), 'attributes', 'back', _('Back')); - $backButton->colspan = 5; - $backButton->alignment = htmlElement::ALIGN_LEFT; - $container->addElement($backButton, true); + $container->add($backButton, 12); return $container; } @@ -603,44 +599,30 @@ class pykotaUser extends baseModule { * @return htmlElement HTML meta data */ function display_html_jobs() { - $container = new htmlTable(); + $container = new htmlResponsiveRow(); + $container->setCSSClasses(array('maxrow')); // jobs $jobs = $this->getJobs($this->getCurrentUserName(), $this->moduleSettings['pykotaUser_jobSuffix'][0]); - $spacer = new htmlSpacer('10px', null); - // header - $container->addElement(new htmlOutputText(_('Date')), false, true); - $container->addElement($spacer); - $container->addElement(new htmlOutputText(_('Printer')), false, true); - $container->addElement($spacer); - $container->addElement(new htmlOutputText(_('Price')), false, true); - $container->addElement($spacer); - $container->addElement(new htmlOutputText(_('Size')), false, true); - $container->addElement($spacer); - $title = new htmlOutputText(_('Title')); - $title->alignment = htmlElement::ALIGN_LEFT; - $container->addElement($title, true, true); - // jobs + $titles = array( + _('Date'), _('Printer'), _('Price'), _('Size'), _('Title') + ); + $data = array(); foreach ($jobs as $job) { - $container->addElement(new htmlOutputText(formatLDAPTimestamp($job['createtimestamp'][0]))); - $container->addElement($spacer); - $container->addElement(new htmlOutputText($job['pykotaprintername'][0])); - $container->addElement($spacer); - $price = new htmlOutputText($job['pykotajobprice'][0]); - $price->alignment = htmlElement::ALIGN_RIGHT; - $container->addElement($price); - $container->addElement($spacer); - $size = new htmlOutputText($job['pykotajobsize'][0]); - $size->alignment = htmlElement::ALIGN_RIGHT; - $container->addElement($size); - $container->addElement($spacer); - $container->addElement(new htmlOutputText($job['pykotatitle'][0]), true); + $data[] = array( + new htmlOutputText(formatLDAPTimestamp($job['createtimestamp'][0])), + new htmlOutputText($job['pykotaprintername'][0]), + new htmlOutputText($job['pykotajobprice'][0]), + new htmlOutputText($job['pykotajobsize'][0]), + new htmlOutputText($job['pykotatitle'][0]) + ); } + $table = new htmlResponsiveTable($titles, $data); + $table->setWidths(array('20%', '20%', '15%', '15%', '30%')); + $container->add($table, 12); // back button - $container->addElement(new htmlSpacer(null, '20px'), true); + $container->addVerticalSpacer('2rem'); $backButton = new htmlAccountPageButton(get_class($this), 'attributes', 'back', _('Back')); - $backButton->colspan = 5; - $backButton->alignment = htmlElement::ALIGN_LEFT; - $container->addElement($backButton, true); + $container->add($backButton, 12); return $container; }