From 88841c22122fa85d5aa7c53b655ed5027da13cd9 Mon Sep 17 00:00:00 2001 From: Arvin Singla Date: Fri, 15 Nov 2024 14:40:25 -0500 Subject: [PATCH] FEATURE: Duration Element (#561) * Adding duration element. * First pass at code review comments * Adding focus support and caption naming to form validation. * Updating list help pages for english and french to add duration. * Adding boilerplate to durationElement. --- modules/formulize/class/durationElement.php | 359 +++++ modules/formulize/docs/search_help.html | 758 ++++++++++ modules/formulize/docs/search_help_fr.html | 1239 ++++++++++------- modules/formulize/include/entriesdisplay.php | 2 +- modules/formulize/language/english/admin.php | 8 + modules/formulize/language/english/main.php | 6 + modules/formulize/language/french/main.php | 6 + .../admin/element_type_duration.html | 15 + themes/Anari/css/style.css | 6 + 9 files changed, 1856 insertions(+), 543 deletions(-) create mode 100644 modules/formulize/class/durationElement.php create mode 100644 modules/formulize/docs/search_help.html create mode 100644 modules/formulize/templates/admin/element_type_duration.html diff --git a/modules/formulize/class/durationElement.php b/modules/formulize/class/durationElement.php new file mode 100644 index 000000000..c01944fc9 --- /dev/null +++ b/modules/formulize/class/durationElement.php @@ -0,0 +1,359 @@ + ## +############################################################################### +## 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 ## +## the Free Software Foundation; either version 2 of the License, or ## +## (at your option) any later version. ## +## ## +## You may not change or alter any portion of this comment or credits ## +## of supporting developers from this source code or any supporting ## +## source code which is considered copyrighted (c) material of the ## +## original comment or credit authors. ## +## ## +## This program is distributed in the hope that it will be useful, ## +## but WITHOUT ANY WARRANTY; without even the implied warranty of ## +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## +## GNU General Public License for more details. ## +## ## +## You should have received a copy of the GNU General Public License ## +## along with this program; if not, write to the Free Software ## +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## +############################################################################### +## Author of this file: Formulize Project ## +## Project: Formulize ## +############################################################################### + +require_once XOOPS_ROOT_PATH . "/modules/formulize/class/elements.php"; +require_once XOOPS_ROOT_PATH . "/modules/formulize/include/functions.php"; + +class formulizeDurationElement extends formulizeElement +{ + + function __construct() + { + $this->name = "Duration"; + $this->hasData = true; + $this->needsDataType = false; // We'll force this to be stored as INT (minutes) + $this->overrideDataType = "int"; // Store as integer minutes + $this->adminCanMakeRequired = true; + $this->alwaysValidateInputs = true; // We'll always validate to ensure duration is within bounds + $this->canHaveMultipleValues = false; + $this->hasMultipleOptions = false; + parent::__construct(); + } +} + +class formulizeDurationElementHandler extends formulizeElementsHandler +{ + var $db; + // Conversion factors to minutes + private $timeUnits = array( + 'days' => 1440, + 'hours' => 60, + 'minutes' => 1 + ); + + private $displayUnitSingular = array( + 'days' => _formulize_DAY, + 'hours' => _formulize_HOUR, + 'minutes' => _formulize_MINUTE + ); + + private $displayUnitPlural = array( + 'days' => _formulize_DAYS, + 'hours' => _formulize_HOURS, + 'minutes' => _formulize_MINUTES + ); + + function __construct($db) + { + $this->db = &$db; + } + + function create() + { + return new formulizeDurationElement(); + } + + // Prepare admin UI data + function adminPrepare($element) + { + $dataToSendToTemplate = array(); + + if (is_object($element) && is_subclass_of($element, 'formulizeElement')) { + // Existing element + $ele_value = $element->getVar('ele_value'); + $dataToSendToTemplate['ele_value'] = $ele_value; + } else { + // New element - set defaults + $ele_value = array( + 'show_days' => 1, + 'show_hours' => 1, + 'show_minutes' => 1, + 'min_minutes' => 0, + 'max_minutes' => 0, // 0 means no maximum + 'size' => 3 // width of each input box + ); + $dataToSendToTemplate['ele_value'] = $ele_value; + } + + return $dataToSendToTemplate; + } + + // Save admin UI data + function adminSave($element, $ele_value) + { + if (is_object($element) && is_subclass_of($element, 'formulizeElement')) { + // Save which units to show + $ele_value['show_days'] = isset($_POST['show_days']) ? 1 : 0; + $ele_value['show_hours'] = isset($_POST['show_hours']) ? 1 : 0; + $ele_value['show_minutes'] = isset($_POST['show_minutes']) ? 1 : 0; + + // Save min/max durations + $ele_value['min_minutes'] = intval($_POST['min_minutes']); + $ele_value['max_minutes'] = intval($_POST['max_minutes']); + + // Save input box size + $ele_value['size'] = intval($_POST['size']); + + $element->setVar('ele_value', $ele_value); + } + return false; + } + + // Convert form input to minutes for storage + function prepareDataForSaving($value, $element, $entry_id = null) + { + if (!is_array($value)) { + return NULL; + } + + $ele_value = $element->getVar('ele_value'); + + $totalMinutes = 0; + + foreach ($this->timeUnits as $unit => $multiplier) { + if (isset($value[$unit]) && is_numeric($value[$unit])) { + $totalMinutes += $value[$unit] * $multiplier; + } + } + + // Validate min/max duration + if ($ele_value['min_minutes'] > 0 && $totalMinutes < $ele_value['min_minutes']) { + return $ele_value['min_minutes']; + } + if ($ele_value['max_minutes'] > 0 && $totalMinutes > $ele_value['max_minutes']) { + return $ele_value['max_minutes']; + } + + return $totalMinutes > 0 ? $totalMinutes : NULL; + } + + function afterSavingLogic($value, $element_id, $entry_id) { + } + + function prepareDataForDataset($value, $handle, $entry_id) { + return $value; + } + + function prepareLiteralTextForDB($value, $element, $partialMatch=false) { + $pattern = '/(\d+)d|(\d+)h|(\d+)m/'; + preg_match_all($pattern, $value, $matches); + + $days = 0; + $hours = 0; + $minutes = 0; + + foreach ($matches[1] as $value) { + if ($value) { + $days = (int) $value * $this->timeUnits['days']; + break; + } + } + + foreach ($matches[2] as $value) { + if ($value) { + $hours = (int) $value * $this->timeUnits['hours']; + break; + } + } + + foreach ($matches[3] as $value) { + if ($value) { + $minutes = (int) $value * $this->timeUnits['minutes']; + break; + } + } + + $total = $days + $hours + $minutes; + + return $total == 0 ? false : $total; + } + + // Convert stored minutes back to time units for display + function loadValue($value, $ele_value, $element) + { + if (!is_numeric($value)) { + return $ele_value; + } + + $minutes = intval($value); + $breakdown = array(); + + // Convert minutes to time units + $remaining = $minutes; + foreach ($this->timeUnits as $unit => $multiplier) { + if ($ele_value['show_' . $unit]) { + $amount = floor($remaining / $multiplier); + $breakdown[$unit] = $amount; + $remaining -= ($amount * $multiplier); + } + } + + $ele_value['values'] = $breakdown; + return $ele_value; + } + + // Render the duration inputs + function render($ele_value, $caption, $markupName, $isDisabled, $element, $entry_id, $screen = false, $owner = null) + { + if ($isDisabled) { + // Render as text for disabled state + $output = ""; + if (isset($ele_value['values'])) { + foreach ($ele_value['values'] as $unit => $amount) { + if ($amount > 0 && $ele_value['show_' . $unit]) { + $output .= $amount . " " . $unit . " "; + } + } + } + return new XoopsFormLabel($caption, trim($output), $markupName); + } + + // Create container for inputs + $container = new XoopsFormElementTray($caption, ' '); + + // Add input field for each enabled time unit + foreach ($this->timeUnits as $unit => $multiplier) { + $unitMarkupName = $markupName . '[' . $unit . ']'; + if ($ele_value['show_' . $unit]) { + $value = isset($ele_value['values'][$unit]) ? $ele_value['values'][$unit] : ''; + ${"input_$unit"} = new XoopsFormText( + $this->displayUnitPlural[$unit].":", + $unitMarkupName, + $ele_value['size'], + 5, + $value, + false, + true + ); + ${"input_$unit"}->setExtra("min='0'"); + ${"input_$unit"}->setExtra("class='formulize-duration-element-input'"); + ${"input_$unit"}->setExtra(" onchange=\"javascript:formulizechanged=1;\" jquerytag=\"$unitMarkupName\" "); + $container->addElement(${"input_$unit"}); + } + } + + $renderedElement = $container->render(); + + $form_ele = new XoopsFormLabel( + $caption, + trans($renderedElement), + $markupName + ); + + return $form_ele; + } + + // Validate the duration is within bounds + function generateValidationCode($caption, $markupName, $element, $entry_id = false) + { + $validationCode = array(); + $ele_value = $element->getVar('ele_value'); + + // First input name for focus on validation failure + foreach ($this->timeUnits as $unit => $multiplier) { + if ($ele_value['show_' . $unit]) { + $firstInputName = $markupName . '[' . $unit . ']'; + break; + } + } + + // Basic required validation if element is required + if ($element->getVar('ele_req')) { + $validationCode[] = "var hasValue = false;\n"; + foreach ($this->timeUnits as $unit => $multiplier) { + if ($ele_value['show_' . $unit]) { + $validationCode[] = "if(myform['{$markupName}[{$unit}]'].value != '') hasValue = true;\n"; + } + } + $validationCode[] = "if(!hasValue) {\n"; + $validationCode[] = " window.alert('Please enter a value for ${caption}.');\n"; + $validationCode[] = " myform['{$firstInputName}'].focus();\n"; + $validationCode[] = " return false;\n"; + $validationCode[] = "}\n"; + } + + // Validate min/max duration + $validationCode[] = "var totalMinutes = 0;\n"; + foreach ($this->timeUnits as $unit => $multiplier) { + if ($ele_value['show_' . $unit]) { + $validationCode[] = "if(myform['{$markupName}[{$unit}]'].value != '') {\n"; + $validationCode[] = " totalMinutes += parseInt(myform['{$markupName}[{$unit}]'].value) * $multiplier;\n"; + $validationCode[] = "}\n"; + } + } + + if ($ele_value['min_minutes'] > 0) { + $validationCode[] = "if(totalMinutes < {$ele_value['min_minutes']}) {\n"; + $validationCode[] = " window.alert('${caption} must be at least {$ele_value['min_minutes']} minutes.');\n"; + $validationCode[] = " myform['{$firstInputName}'].focus();\n"; + $validationCode[] = " return false;\n"; + $validationCode[] = "}\n"; + } + + if ($ele_value['max_minutes'] > 0) { + $validationCode[] = "if(totalMinutes > {$ele_value['max_minutes']}) {\n"; + $validationCode[] = " window.alert('${caption} must not exceed {$ele_value['max_minutes']} minutes.');\n"; + $validationCode[] = " myform['{$firstInputName}'].focus();\n"; + $validationCode[] = " return false;\n"; + $validationCode[] = "}\n"; + } + + return $validationCode; + } + + // Format duration for display in lists + function formatDataForList($value, $handle = "", $entry_id = 0, $textWidth = 100) + { + if (!is_numeric($value)) { + return ''; + } + + $minutes = intval($value); + $output = array(); + + $remaining = $minutes; + foreach ($this->timeUnits as $unit => $multiplier) { + $amount = floor($remaining / $multiplier); + if ($amount > 0) { + $diplayUnit = $amount == 1 ? $this->displayUnitSingular[$unit] : $this->displayUnitPlural[$unit]; + $output[] = $amount . " " . $diplayUnit; + } + $remaining -= ($amount * $multiplier); + } + + $this->clickable = false; + $this->striphtml = true; + $this->length = 0; + + return implode(", ", $output); + } +} diff --git a/modules/formulize/docs/search_help.html b/modules/formulize/docs/search_help.html new file mode 100644 index 000000000..716905a96 --- /dev/null +++ b/modules/formulize/docs/search_help.html @@ -0,0 +1,758 @@ + + + + + Formulize Search Help + + + + + + + + + + +

+ + Cheat Sheet for searching through your entries +

+

There are a lot of different search terms that you can type in the “quicksearch” boxes at the top of each column in the list of entries pages.  Here is a brief summary:

+

+ + The basics +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

This search term:

+
+

Means this:

+
+

It will find:

+
+

orange

+
+

find “orange” by itself or inside something else

+
+

+ orange +
+ orange + peels +
+ apples and + orange + s +

+
+

=orange

+
+

find the exact text “orange”, no more, no less

+
+

+ orange +
+ (it won't find “oranges”) +

+
+

!orange

+
+

find entries that do not have orange in them

+
+

+ red +
+ purple +
+ banana peels +

+
+

+ !=orange +
+

+
+

find entries that do not match the exact text “orange”

+
+

+ red +
+ apples and oranges +
+ orange peels +

+
+

15

+
+

find the text “15” by itself or inside something else

+
+

+ 15 + baseballs +
+ 127 + 15 +
+ 15 +

+
+

=15

+
+

find the exact number 15

+
+

15

+
+

!15

+
+

find text that does not contain “15”

+
+

+ 1848 +
+ 3 strikes +
+ etc +

+
+

!=15

+
+

find anything except the exact number 15

+
+

+ 14 +
+ 16 +
+ 15 baseballs +

+
+
+

+ + Numbers +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

This search term:

+
+

Means this:

+
+

It will find:

+
+

>10

+
+

find numbers greater than 10

+
+

11, 12, 1485

+
+

>=1000

+
+

find numbers greater than or equal to 1000

+
+

1000, 1001, etc

+
+

<65

+
+

find numbers less than 65

+
+

64, 10, -401

+
+

<=65

+
+

find numbers less than or equal to 65

+
+

65, 64, etc

+
+
+

+ + Dates +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

This search term:

+
+

Means this:

+
+

It will find:

+
+

2009-01-01

+
+

find January 1, 2009

+
+

2009-01-01

+
+

>=2009-01-01

+
+

find dates on or after January 1, 2009

+
+

+ 2009-01-01 +
+ 2009-05-23 +
+ 2010-02-20 +
+ etc +

+
+

<2009-01//>2007-12

+
+

find dates in the year 2008 (see below for more info on using two terms at once)

+
+

Any date starting with 2008

+
+

>=2008-10-01//<=2008-10-31

+
+

find dates in October 2008 (see below for more info on using two terms at once)

+
+

Any date starting with 2008-10

+
+

2008-10

+
+

find dates in October 2008

+
+

Any date starting with 2008-10 (same as the previous, more complex search)

+
+
+

+ + Duration +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+

This search term:

+
+

Means this:

+
+

It will find:

+
+

1d 1h 10m
1d 1h 10m
10m 1d 1h

+
+

Find a duration set to exactly 1510 minutes

+
+

A duration set to exactly 1510 minutes

+
+

<=1h 10m

+
+

Find a duration less than or equal to 70 minutes

+
+

Any duration less than or equal to 70 minutes

+
+

<5h//>10m

+
+

Find a duraction greater than 10 minutes and less than 300 minutes

+
+

Any duration greater than 10 minutes and less than 300 minutes

+
+
+

+ + More than one search on the same column +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

This search term:

+
+

Means this:

+
+

It will find:

+
+

>10//<100

+
+

find numbers between 11 and 99

+
+

11, 12, etc

+
+

>10//<10

+
+

find entries that are both greater than 10 and less than 10

+
+

it will find nothing...the search condition is logically impossible

+
+

santa//!monica

+
+

find entries that contain “santa” and not “monica”

+
+

+ Santa + Claus +
+ Santa + Cruz +

+
+

>=2008-10-01//<=2008-10-31

+
+

find dates within October 2008

+
+

+ 2008-10-01 +
+ 2008-10-15 +

+
+

red//orange//blue

+
+

find those three values.  You can have as many terms as you want in a single column.

+
+

Searches like this will usually only find matches if the field you're searching accepts multiple selections (ie: checkboxes), and red, orange and blue were three of the options.

+
+
+

+ + Wildcard terms {TODAY}, {USER} and {BLANK} +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

This search term:

+
+

Means this:

+
+

It will find:

+
+

{TODAY}

+
+

find today's date

+
+

the text of today's date, in YYYY-mm-dd format

+
+

>={TODAY-30}

+
+

find dates anytime from the past 30 days into the future

+
+

you get the idea

+
+

>={TODAY+30}//<={TODAY}

+
+

find dates between 30 days ago and today

+
+

+
+

>{TODAY+14}

+
+

Find dates more than 14 days in the future

+
+

+
+

{USER}

+
+

Find entries that match the current user's full name, or if no full name is in their profile, then match on their username

+
+

+
+

{BLANK}

+
+

Find entries that are blank or empty

+
+

+
+
+

+ + “OR” searches on multiple columns +

+
+ + + + + + + + + + + + + + + + +
+

This search term:

+
+

Means this:

+
+

It will find:

+
+

+ on the fruit column: +
+ ORapples +
+ and at the same time on the vegetable column: +
+ ORcarrots +

+
+

Find entries that match either apples in the fruit column, or carrots in the vegetable column (normally, search terms on multiple columns must all be matched)

+
+
+ + + + + + + + + + + + + + + + + +
+

Fruits

+
+

Vegetables

+
+

Apples

+
+

Spinach

+
+

Oranges

+
+

Carrots

+
+
+

+
+
+

+ + Advanced developer-focused search terms +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+

This search term:

+
+

Means this:

+
+

{order}

+
+

Find entries that match whatever is in $_POST['order'] or if that's empty, $_GET['order'].  This is meant for use in a complex application where a certain screen might need to show different things at different times.  You can save one view with this kind of search term and then make some kind of architecture (with javascript maybe?) to populate $_POST or $_GET with the values you need at the right time.

+
+

!{order}

+
+

Find entries that do not match whatever is in $_POST['order'] or $_GET['order']

+
+

!orange!

+
+

Persist this search term even if this column is not included in the view.  Certain columns are visible only to certain groups of users.  You might want to use a search term on a certain column that only webmasters have access to, in order to limit the list of entries.  Then you could publish that view to other users who do not have that column available, but the list of entries would still be limited by this search term.

+
+

!!monica!//!santa!

+
+

When persisting a search that includes multiple terms, put the ! ! at the beginning and end of each term.  Don't get confused by “not” operators (!) that may be part of the terms (as in “not monica” at the beginning of this set of terms).

+
+
+ + diff --git a/modules/formulize/docs/search_help_fr.html b/modules/formulize/docs/search_help_fr.html index 0e3060874..9b4c2d67d 100644 --- a/modules/formulize/docs/search_help_fr.html +++ b/modules/formulize/docs/search_help_fr.html @@ -1,542 +1,697 @@ - - - - - - Formulize Search Help - - - - - - -

Feuille d'aide pour utiliser la recherche

-

Il y a beaucoup de termes différents que vous pouvez utiliser dans le champ “recherche rapide” en haut de chaque colonne.  En voici un bref résumé:

-

Les basiques

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

Terme de recherche: 

-
-

Cela veut dire: 

-
-

Cela va chercher: 

-
-

orange 

-
-

trouver le terme “orange” seul ou dans un ensemble de mot

-
-

orange
-oranges pelées
-pommes et oranges

-
-

=orange 

-
-

chercher le terme exact “orange”, ni plus, ni moins 

-
-

orange
-(cela ne trouvera pas “oranges”)

-
-

!orange 

-
-

trouve toutes les entrées qui n'ont pas le terme "orange" 

-
-

rouge
-violet
-bananes pelées

-
-

!=orange

-
-

trouve toutes les entrées qui n'ont pas uniquement le terme “orange” pour les définir

-
-

rouge
-pommes et oranges
-orange pelée

-
-

15 

-
-

trouve le nombre “15” seul ou dans un ensemble

-
-

15 dents
-12715
-15

-
-

=15 

-
-

trouve exactement le nombre 15  

-
-

15 

-
-

!15 

-
-

trouve du texte qui ne contient pas le nombre “15” 

-
-

1848
-3 dents
-etc

-
-

!=15 

-
-

trouve tout sauf le nombre "15" seul

-
-

14
-16
-15 dents

-
-

Nombres

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

Terme de recherche: 

-
-

Cela veut dire: 

-
-

Cela va chercher: 

-
-

>10 

-
-

trouve des nombres plus grands que 10 

-
-

11, 12, 1485 

-
-

>=1000 

-
-

trouve des nombres plus grands que ou égal à1000 

-
-

1000, 1001, etc 

-
-

<65 

-
-

trouve des nombres plus petits que 65 

-
-

64, 10, -401 

-
-

<=65 

-
-

trouve des nombres plus petits que ou égal à 65 

-
-

65, 64, etc 

-
-

Dates (en écriture anglaise)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

Terme de recherche: 

-
-

Cela veut dire: 

-
-

Cela va chercher: 

-
-

2009-01-01 

-
-

trouve le 1er janvier de 2009 

-
-

2009-01-01 

-
-

>=2009-01-01 

-
-

trouve des dates après le 1 janvier 2009 

-
-

2009-01-01
-2009-05-23
-2010-02-20
-etc

-
-

<2009-01//>2007-12 

-
-

trouve des dates dans l'année 2008 (voir plus bas pour l'usage de deux termes en même temps) 

-
-

N'importe quelle date en 2008 

-
-

>=2008-10-01//<=2008-10-31 

-
-

trouve des dates en Octobre 2008 (voir plus bas pour l'usage de deux termes en même temps) 

-
-

N'importe quelle date ayant le terme 2008-10 

-
-

2008-10 

-
-

trouve des dates en Octobre 2008 

-
-

N'importe quelle date commençant par 2008-10 (la même chose que plus haut, mais recherche plus gourmande en ressources) 

-
-

Plus d'un terme de recherche dans la même colonne

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

Terme de recherche: 

-
-

Cela veut dire: 

-
-

Cela va chercher: 

-
-

>10//<100 

-
-

trouve des nombres entre 11 et 99 

-
-

11, 12, etc 

-
-

>10//<10 

-
-

trouve des entrées qui sont plus grande que 10 et en même temps plus petite

-
-

on ne trouvera rien…cette condition est logiquement impossible 

-
-

dent//!temporaire 

-
-

trouve des entrées contenant “dent” mais pas “temporaire” 

-
-

Dents sensibles
-Dent incluse

-
-

>=2008-10-01//<=2008-10-31 

-
-

trouve des dates en Octobre 2008 

-
-

2008-10-01
-2008-10-15

-
-

rouge//orange//bleu 

-
-

trouve ces 3 valeurs.  Vous pouvez avoir autant de terme que vous le souhaitez dans la même colonne.  

-
-

Ces recherches ne font trouver des résultats que si vous avez des questions à choix multiples(cases à cocher), et rouge, orange et bleu sont trois de ces options. 

-
-

Les termes jokers{TODAY}, {USER} et {BLANK} (c'est de l'anglais de programmation).

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

Terme de recherche: 

-
-

Cela veut dire: 

-
-

Cela va chercher: 

-
-

{TODAY} 

-
-

Trouve la date d'aujourd'hui 

-
-

la date d'aujourd'hui au format anglais, YYYY-mm-dd (Year, Month, Day)

-
-

>={TODAY-30} 

-
-

Trouve toutes les dates depuis les 30 derniers jours et le futur

-
-

je vous laisse imaginer 

-
-

>={TODAY+30}//<={TODAY} 

-
-

Trouve les dates entre aujourd'hui et les 30 prochains jours

-
-

 

-
-

>{TODAY+14} 

-
-

Trouve toutes les dates plus loin que dans 14 jours 

-
-

 

-
-

{USER} 

-
-

Trouve toutes les entrées avec le nom entier de l'utilisateur ou bien son pseudonyme de connexion

-
-

 

-
-

{BLANK} 

-
-

Trouve les entrées blanches ou vides

-
-

 

-
-

“OR” la recherche sur de multiples colonnes

- - - - - - - - - - - - - -
-

Terme de recherche: 

-
-

Cela veut dire: 

-
-

Cela va chercher: 

-
-

Sur la colonne des fruits:
-ORpommes
-et dans le même temps sur la colonne des légumes:
-ORcarrotes

-
-

Trouve les entrées avec soit la pomme dans la colonne des fruits soit les carrotes dans la colonne des légumes (normalement les termes de recherche sur plusieurs colonnes doivent tous être adaptés) 

-
- - - - - - - - - - - - - - - -
-

Fruits 

-
-

Légumes 

-
-

Pommes

-
-

Epinards

-
-

Oranges 

-
-

Carrotes 

-
-

 

-
-

Termes avancés de recherche pour les programmeurs et webmaster 

- - - - - - - - - - - - - - - - - - - - - - - -
-

Terme de recherche: 

-
-

Cela veut dire: 

-
-

{order} 

-
-

Trouver des entrées qui correspondent à ce qui est dans $ _POST ['commande'] ou si c'est vide, $ _GET ['commande']. Ceci est destiné à être utilisé dans une application complexe, où un certain écran peut avoir besoin de montrer des choses différentes à des moments différents. Vous pouvez enregistrer une vue avec ce genre de terme de recherche et faire une sorte d'architecture (avec éventuellement du javascript ) pour remplir $ _POST ou $ _GET avec les valeurs dont vous avez besoin au bon moment.

-
-

!{order} 

-
-

Find entries that do not match whatever is in $_POST['order'] or $_GET['order'] 

-
-

!orange! 

-
-

Oblige la présence de ce termes de recherche même si la colonne est cachée à certains utilisateurs. Une vue sauvegardée avec ce terme, donnera, du coté des utilisateurs  n'ayant pas le droit de voir cette colonne, la vue de toutes les entrées contenant le mot "orange", même s'ils ne le voient pas écrit.

-
-

!!dent!//!temporaire! 

-
-

Quand vous faites une sélection persistante avec les ! au début et à la fin de chaque partie, ne confondez pas avec le ! qui signifie "ne correspondant pas". Dans cette exemple on impose une recherche ne contenant pas le mot dent mais contenant le mot temporaire. 

-
- - + + + + + + Formulize Search Help + + + + + + +

+ Feuille d'aide pour utiliser la recherche +

+

Il y a beaucoup de termes différents que vous pouvez utiliser dans le champ “recherche rapide” en haut de chaque colonne.  En voici un bref résumé:

+

+ Les basiques +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+ Terme de recherche: +

+
+

+ Cela veut dire: +

+
+

+ Cela va chercher: +

+
+

orange

+
+

trouver le terme “orange” seul ou dans un ensemble de mot

+
+

orange +
+ oranges pelées +
+ pommes et oranges +

+
+

=orange

+
+

chercher le terme exact “orange”, ni plus, ni moins

+
+

orange +
+ (cela ne trouvera pas “oranges”) +

+
+

!orange

+
+

trouve toutes les entrées qui n'ont pas le terme "orange"

+
+

rouge +
+ violet +
+ bananes pelées +

+
+

!=orange

+
+

trouve toutes les entrées qui n'ont pas uniquement le terme “orange” pour les définir

+
+

rouge +
+ pommes et oranges +
+ orange pelée +

+
+

15

+
+

trouve le nombre “15” seul ou dans un ensemble

+
+

15 dents +
+ 12715 +
+ 15 +

+
+

=15

+
+

trouve exactement le nombre 15

+
+

15

+
+

!15

+
+

trouve du texte qui ne contient pas le nombre “15”

+
+

1848 +
+ 3 dents +
+ etc +

+
+

!=15

+
+

trouve tout sauf le nombre "15" seul

+
+

14 +
+ 16 +
+ 15 dents +

+
+

+ Nombres +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+ Terme de recherche: +

+
+

+ Cela veut dire: +

+
+

+ Cela va chercher: +

+
+

>10

+
+

trouve des nombres plus grands que 10

+
+

11, 12, 1485

+
+

>=1000

+
+

trouve des nombres plus grands que ou égal à1000

+
+

1000, 1001, etc

+
+

<65

+
+

trouve des nombres plus petits que 65

+
+

64, 10, -401

+
+

<=65

+
+

trouve des nombres plus petits que ou égal à 65

+
+

65, 64, etc

+
+

+ Dates (en écriture anglaise) +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+ Terme de recherche: +

+
+

+ Cela veut dire: +

+
+

+ Cela va chercher: +

+
+

2009-01-01

+
+

trouve le 1er janvier de 2009

+
+

2009-01-01

+
+

>=2009-01-01

+
+

trouve des dates après le 1 janvier 2009

+
+

2009-01-01 +
+ 2009-05-23 +
+ 2010-02-20 +
+ etc +

+
+

<2009-01//>2007-12

+
+

trouve des dates dans l'année 2008 (voir plus bas pour l'usage de deux termes en même temps)

+
+

N'importe quelle date en 2008

+
+

>=2008-10-01//<=2008-10-31

+
+

trouve des dates en Octobre 2008 (voir plus bas pour l'usage de deux termes en même temps)

+
+

N'importe quelle date ayant le terme 2008-10

+
+

2008-10

+
+

trouve des dates en Octobre 2008

+
+

N'importe quelle date commençant par 2008-10 (la même chose que plus haut, mais recherche plus gourmande en ressources)

+
+

+ Durée +

+ + + + + + + + + + + + + + + + + + + + + + + +
+

+ Terme de recherche: +

+
+

+ Cela veut dire: +

+
+

+ Cela va chercher: +

+
+

1d 1h 10m
1d 1h 10m
10m 1d 1h

+
+

Trouver une durée fixée à exactement 1510 minutes

+
+

Une durée fixée à exactement 1510 minutes

+
+

<=1h 10m

+
+

trouver une durée inférieure ou égale à 70 minutes

+
+

Toute durée inférieure ou égale à 70 minutes

+
+

<5h//>10m

+
+

Trouver une durée supérieure à 10 minutes et inférieure à 300 minutes

+
+

Toute durée supérieure à 10 minutes et inférieure à 300 minutes

+
+

+ Plus d'un terme de recherche dans la même colonne +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+ Terme de recherche: +

+
+

+ Cela veut dire: +

+
+

+ Cela va chercher: +

+
+

>10//<100

+
+

trouve des nombres entre 11 et 99

+
+

11, 12, etc

+
+

>10//<10

+
+

trouve des entrées qui sont plus grande que 10 et en même temps plus petite

+
+

on ne trouvera rien…cette condition est logiquement impossible

+
+

dent//!temporaire

+
+

trouve des entrées contenant “dent” mais pas “temporaire”

+
+

Dents sensibles +
+ Dent incluse +

+
+

>=2008-10-01//<=2008-10-31

+
+

trouve des dates en Octobre 2008

+
+

2008-10-01 +
+ 2008-10-15 +

+
+

rouge//orange//bleu

+
+

trouve ces 3 valeurs.  Vous pouvez avoir autant de terme que vous le souhaitez dans la même colonne.

+
+

Ces recherches ne font trouver des résultats que si vous avez des questions à choix multiples(cases à cocher), et rouge, orange et bleu sont trois de ces options.

+
+

+ Les termes jokers{TODAY}, {USER} et {BLANK} (c'est de l'anglais de programmation). +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+ Terme de recherche: +

+
+

+ Cela veut dire: +

+
+

+ Cela va chercher: +

+
+

{TODAY}

+
+

Trouve la date d'aujourd'hui

+
+

la date d'aujourd'hui au format anglais, YYYY-mm-dd (Year, Month, Day)

+
+

>={TODAY-30}

+
+

Trouve toutes les dates depuis les 30 derniers jours et le futur

+
+

je vous laisse imaginer

+
+

>={TODAY+30}//<={TODAY}

+
+

Trouve les dates entre aujourd'hui et les 30 prochains jours

+
+

+
+

>{TODAY+14}

+
+

Trouve toutes les dates plus loin que dans 14 jours

+
+

+
+

{USER}

+
+

Trouve toutes les entrées avec le nom entier de l'utilisateur ou bien son pseudonyme de connexion

+
+

+
+

{BLANK}

+
+

Trouve les entrées blanches ou vides

+
+

+
+

+ “OR” la recherche sur de multiples colonnes +

+ + + + + + + + + + + + + +
+

+ Terme de recherche: +

+
+

+ Cela veut dire: +

+
+

+ Cela va chercher: +

+
+

Sur la colonne des fruits: +
+ ORpommes +
+ et dans le même temps sur la colonne des légumes: +
+ ORcarrotes +

+
+

Trouve les entrées avec soit la pomme dans la colonne des fruits soit les carrotes dans la colonne des légumes (normalement les termes de recherche sur plusieurs colonnes doivent tous être adaptés)

+
+ + + + + + + + + + + + + + + +
+

+ Fruits +

+
+

+ Légumes +

+
+

Pommes

+
+

Epinards

+
+

Oranges

+
+

Carrotes

+
+

+
+

+ Termes avancés de recherche pour les programmeurs et webmaster + + +

+ + + + + + + + + + + + + + + + + + + + + + + +
+

+ Terme de recherche: +

+
+

+ Cela veut dire: +

+
+

{order}

+
+

Trouver des entrées qui correspondent à ce qui est dans $ _POST ['commande'] ou si c'est vide, $ _GET ['commande']. Ceci est destiné à être utilisé dans une application complexe, où un certain écran peut avoir besoin de montrer des choses différentes à des moments différents. Vous pouvez enregistrer une vue avec ce genre de terme de recherche et faire une sorte d'architecture (avec éventuellement du javascript ) pour remplir $ _POST ou $ _GET avec les valeurs dont vous avez besoin au bon moment.

+
+

!{order}

+
+

Find entries that do not match whatever is in $_POST['order'] or $_GET['order']

+
+

!orange!

+
+

Oblige la présence de ce termes de recherche même si la colonne est cachée à certains utilisateurs. Une vue sauvegardée avec ce terme, donnera, du coté des utilisateurs + n'ayant pas le droit de voir cette colonne, la vue de toutes les entrées contenant le mot "orange", même s'ils ne le voient pas écrit. +

+
+

!!dent!//!temporaire!

+
+

Quand vous faites une sélection persistante avec les ! au début et à la fin de chaque partie, ne confondez pas avec le ! qui signifie "ne correspondant pas". Dans cette exemple on impose une recherche ne contenant pas le mot dent mais contenant le mot temporaire. + +

+
+ + diff --git a/modules/formulize/include/entriesdisplay.php b/modules/formulize/include/entriesdisplay.php index d487f06a5..5b2ceb0ea 100644 --- a/modules/formulize/include/entriesdisplay.php +++ b/modules/formulize/include/entriesdisplay.php @@ -1711,7 +1711,7 @@ function drawEntries($fid, $cols, $searches, $frid, $scope, $standalone, $curren } elseif(file_exists(XOOPS_ROOT_PATH."/modules/formulize/docs/search_help_"._LANGCODE.".xhtml")) { $search_help_filepath = XOOPS_URL."/modules/formulize/docs/search_help_"._LANGCODE.".xhtml"; } else { - $search_help_filepath = XOOPS_URL."/modules/formulize/docs/search_help.xhtml"; + $search_help_filepath = XOOPS_URL."/modules/formulize/docs/search_help.html"; } $searchHelp = "
"; $toggleSearches = " diff --git a/modules/formulize/language/english/admin.php b/modules/formulize/language/english/admin.php index 7f2642654..1444c3aa3 100644 --- a/modules/formulize/language/english/admin.php +++ b/modules/formulize/language/english/admin.php @@ -409,6 +409,14 @@ define("_AM_ELE_SELECT_NONE","No element selected"); define("_AM_ELE_CONFIRM_DELETE","Are you sure you want to delete this form element? All data anyone has ever entered into this form element will be deleted as well."); +// Duration +define("_AM_ELE_DURATION", "Duration"); +define("_AM_ELE_DURATION_SHOW_UNITS", "Show units"); +define("_AM_ELE_DURATION_LIMITS", "Duration limits"); +define("_AM_ELE_DURATION_LIMITS_MIN", "Minimum duration (in minutes)"); +define("_AM_ELE_DURATION_LIMITS_MAX", "Maximum duration (in minutes)"); +define("_AM_ELE_DURATION_LIMITS_NOMAX", "no maximum"); + define("_AM_TITLE","Menu administration"); define("_AM_ID","ID"); define("_AM_POS","Position"); diff --git a/modules/formulize/language/english/main.php b/modules/formulize/language/english/main.php index 3ac890d37..1ce5bfca0 100644 --- a/modules/formulize/language/english/main.php +++ b/modules/formulize/language/english/main.php @@ -240,6 +240,12 @@ define("_formulize_SAVEREPORTBUTTON", "Save"); define("_formulize_REPORTNAME", "Report Name:"); define("_formulize_ANDORTITLE", "Interfield AND/OR Setting:"); +define("_formulize_DAYS", "Days"); +define("_formulize_HOURS", "Hours"); +define("_formulize_MINUTES", "Minutes"); +define("_formulize_DAY", "Day"); +define("_formulize_HOUR", "Hour"); +define("_formulize_MINUTE", "Minute"); define("_formulize_SHOWCALCONLY", "Show Calculations Only (no list of entries)"); diff --git a/modules/formulize/language/french/main.php b/modules/formulize/language/french/main.php index 58b29b924..3b5be165d 100644 --- a/modules/formulize/language/french/main.php +++ b/modules/formulize/language/french/main.php @@ -160,6 +160,12 @@ define("_formulize_AVERAGE", "Moyenne"); define("_formulize_AVERAGE_EXCLBLANKS", "Valeur moyenne exclue des blancs et des zéro:"); define("_formulize_AVERAGE_INCLBLANKS", "Valeur moyenne dans la colonne:"); +define("_formulize_DAYS", "Jours"); +define("_formulize_HOURS", "Heures"); +define("_formulize_MINUTES", "Minutes"); +define("_formulize_DAY", "Jour"); +define("_formulize_HOUR", "Heure"); +define("_formulize_MINUTE", "Minutes"); define("_formulize_CAL_ADD_ITEM", "Cliquez pour ajouter un nouvel item sur ce jour."); define("_formulize_CAL_MONTH_01", "Janvier"); define("_formulize_CAL_MONTH_02", "Février"); diff --git a/modules/formulize/templates/admin/element_type_duration.html b/modules/formulize/templates/admin/element_type_duration.html new file mode 100644 index 000000000..1e7b8f1f7 --- /dev/null +++ b/modules/formulize/templates/admin/element_type_duration.html @@ -0,0 +1,15 @@ +
+
+ <{$smarty.const._AM_ELE_DURATION_SHOW_UNITS}>: + checked<{/if}>> <{$smarty.const._formulize_DAYS}> + checked<{/if}>> <{$smarty.const._formulize_HOURS}> + checked<{/if}>><{$smarty.const._formulize_MINUTES}> +
+
+
+
+ <{$smarty.const._AM_ELE_DURATION_LIMITS}>: + <{$smarty.const._AM_ELE_DURATION_LIMITS_MIN}>:
+ <{$smarty.const._AM_ELE_DURATION_LIMITS_MAX}>: (0 = <{$smarty.const._AM_ELE_DURATION_LIMITS_NOMAX}>) +
+
diff --git a/themes/Anari/css/style.css b/themes/Anari/css/style.css index 9d4442426..6cd623f70 100644 --- a/themes/Anari/css/style.css +++ b/themes/Anari/css/style.css @@ -3573,3 +3573,9 @@ form[name='metachoiceform'] td p { .block_login_form--submit { margin-bottom: 20px; } + +/** Duration Element **/ +input.formulize-duration-element-input[type="number"] { + min-width: 50px; + max-width: 100px; +}