From aa8e64ddd8074a09db61de8e1f5caa78cea2047e Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 23 Sep 2016 12:47:02 +0200 Subject: [PATCH 001/164] fix call of apigen --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index a5cc32c91..75dbff9d2 100644 --- a/Makefile +++ b/Makefile @@ -32,6 +32,6 @@ doc: $(PHPDOC) -d SeedDMS_Core --ignore 'getusers.php,getfoldertree.php,config.php,reverselookup.php' --force -t html apidoc: - apigen generate -s SeedDMS_Core --exclude tests --skip-doc-prefix tests -d html + apigen generate -s SeedDMS_Core --exclude tests -d html .PHONY: webdav webapp From c97a300fd424ea434efa16568f446cb7db820bfa Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 26 Sep 2016 17:47:48 +0200 Subject: [PATCH 002/164] reenable empty form for new workflow --- views/bootstrap/class.WorkflowMgr.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/views/bootstrap/class.WorkflowMgr.php b/views/bootstrap/class.WorkflowMgr.php index 637aa4255..2b7fb850b 100644 --- a/views/bootstrap/class.WorkflowMgr.php +++ b/views/bootstrap/class.WorkflowMgr.php @@ -143,7 +143,7 @@ $(document).ready(function() { ?> isUsed()) { + if($workflow && !$workflow->isUsed()) { ?> params['selworkflow']; - if($selworkflow) $this->showWorkflowForm($selworkflow); } /* }}} */ From 4b9fc722e1baff27b32a27648523dd0a0cd9faa1 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 26 Sep 2016 17:54:42 +0200 Subject: [PATCH 003/164] started version 4.3.30 --- CHANGELOG | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index e9a8e4857..3d5cd3ebd 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,8 @@ +-------------------------------------------------------------------------------- + Changes in version 4.3.30 +-------------------------------------------------------------------------------- +- fix adding new workflows + -------------------------------------------------------------------------------- Changes in version 4.3.29 -------------------------------------------------------------------------------- From ce9bb05a0b957f586f7f537547d301a564b6f4ef Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 27 Sep 2016 17:31:21 +0200 Subject: [PATCH 004/164] add hooks --- op/op.SetExpires.php | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/op/op.SetExpires.php b/op/op.SetExpires.php index aa5d90435..dbb80b021 100644 --- a/op/op.SetExpires.php +++ b/op/op.SetExpires.php @@ -52,12 +52,29 @@ if (!isset($_POST["expires"]) || $_POST["expires"] != "false") { $expires = mktime(0,0,0, $_POST["expmonth"], $_POST["expday"], $_POST["expyear"]); } } + +if(isset($GLOBALS['SEEDDMS_HOOKS']['setExpires'])) { + foreach($GLOBALS['SEEDDMS_HOOKS']['setExpires'] as $hookObj) { + if (method_exists($hookObj, 'preSetExpires')) { + $hookObj->preSetExpires(array('document'=>$document, 'expires'=>&$expires)); + } + } +} + if (!$document->setExpires($expires)){ UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("error_occured")); } $document->verifyLastestContentExpriry(); +if(isset($GLOBALS['SEEDDMS_HOOKS']['setExpires'])) { + foreach($GLOBALS['SEEDDMS_HOOKS']['setExpires'] as $hookObj) { + if (method_exists($hookObj, 'postSetExpires')) { + $hookObj->postSetExpires(array('document'=>$document, 'expires'=>$expires)); + } + } +} + add_log_line("?documentid=".$documentid); header("Location:../out/out.ViewDocument.php?documentid=".$documentid); From 583770dc04a09180fbc1047c8ee93db4a29e81f6 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 27 Sep 2016 17:31:35 +0200 Subject: [PATCH 005/164] add hooks --- op/op.TriggerWorkflow.php | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/op/op.TriggerWorkflow.php b/op/op.TriggerWorkflow.php index 704d128fe..f8b4f9725 100644 --- a/op/op.TriggerWorkflow.php +++ b/op/op.TriggerWorkflow.php @@ -68,23 +68,19 @@ if(!$version->triggerWorkflowTransitionIsAllowed($user, $transition)) { $workflow = $transition->getWorkflow(); +if(isset($GLOBALS['SEEDDMS_HOOKS']['triggerWorkflowTransition'])) { + foreach($GLOBALS['SEEDDMS_HOOKS']['triggerWorkflowTransition'] as $hookObj) { + if (method_exists($hookObj, 'preTriggerWorkflowTransition')) { + $hookObj->preTriggerWorkflowTransition(array('version'=>$version, 'transition'=>$transition, 'comment'=>$_POST["comment"])); + } + } +} + if($version->triggerWorkflowTransition($user, $transition, $_POST["comment"])) { if ($notifier) { $nl = $document->getNotifyList(); $folder = $document->getFolder(); -/* - $subject = "###SITENAME###: ".$document->getName()." - ".getMLText("transition_triggered_email"); - $message = getMLText("transition_triggered_email")."\r\n"; - $message .= - getMLText("document").": ".$document->getName()."\r\n". - getMLText("workflow").": ".$workflow->getName()."\r\n". - getMLText("action").": ".$transition->getAction()->getName()."\r\n". - getMLText("comment").": ".$_POST["comment"]."\r\n". - getMLText("previous_state").": ".$transition->getState()->getName()."\r\n". - getMLText("current_state").": ".$transition->getNextState()->getName()."\r\n". - getMLText("user").": ".$user->getFullName()." <". $user->getEmail() ."> "; -*/ $subject = "transition_triggered_email_subject"; $message = "transition_triggered_email_body"; $params = array(); @@ -131,6 +127,14 @@ if($version->triggerWorkflowTransition($user, $transition, $_POST["comment"])) { } } } + + if(isset($GLOBALS['SEEDDMS_HOOKS']['triggerWorkflowTransition'])) { + foreach($GLOBALS['SEEDDMS_HOOKS']['triggerWorkflowTransition'] as $hookObj) { + if (method_exists($hookObj, 'postTriggerWorkflowTransition')) { + $hookObj->postTriggerWorkflowTransition(array('version'=>$version, 'transition'=>$transition, 'comment'=>$_POST["comment"])); + } + } + } } add_log_line("?documentid=".$documentid."&version".$version_num); From d251beb7c32127a91ed129592b2fcdf84541d004 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 28 Sep 2016 14:59:39 +0200 Subject: [PATCH 006/164] show divider only if menuitems and admin menu exists --- views/bootstrap/class.Bootstrap.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/views/bootstrap/class.Bootstrap.php b/views/bootstrap/class.Bootstrap.php index 966603298..6ec4b1537 100644 --- a/views/bootstrap/class.Bootstrap.php +++ b/views/bootstrap/class.Bootstrap.php @@ -276,10 +276,12 @@ $(document).ready(function () { $menuitems = $hookObj->userMenuItems($this, $menuitems); } } - foreach($menuitems as $menuitem) { - echo "
  • ".getMLText($menuitem['label'])."
  • "; + if($menuitems) { + foreach($menuitems as $menuitem) { + echo "
  • ".getMLText($menuitem['label'])."
  • "; + } + echo "
  • \n"; } - echo "
  • \n"; } $showdivider = false; if($this->params['enablelanguageselector']) { From dd2cda7d8536afce973e207a468d5ffcee491f90 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 28 Sep 2016 21:30:29 +0200 Subject: [PATCH 007/164] add missing phrases, some updates --- languages/ar_EG/lang.inc | 9 +++++++-- languages/bg_BG/lang.inc | 5 +++++ languages/ca_ES/lang.inc | 5 +++++ languages/cs_CZ/lang.inc | 5 +++++ languages/de_DE/lang.inc | 7 ++++++- languages/el_GR/lang.inc | 15 ++++++++++----- languages/en_GB/lang.inc | 7 ++++++- languages/es_ES/lang.inc | 5 +++++ languages/fr_FR/lang.inc | 15 ++++++++++----- languages/hr_HR/lang.inc | 5 +++++ languages/hu_HU/lang.inc | 5 +++++ languages/it_IT/lang.inc | 5 +++++ languages/ko_KR/lang.inc | 5 +++++ languages/nl_NL/lang.inc | 5 +++++ languages/pl_PL/lang.inc | 5 +++++ languages/pt_BR/lang.inc | 25 +++++++++++++++---------- languages/ro_RO/lang.inc | 9 +++++++-- languages/ru_RU/lang.inc | 5 +++++ languages/sk_SK/lang.inc | 5 +++++ languages/sv_SE/lang.inc | 5 +++++ languages/tr_TR/lang.inc | 5 +++++ languages/uk_UA/lang.inc | 13 +++++++++---- languages/zh_CN/lang.inc | 5 +++++ languages/zh_TW/lang.inc | 5 +++++ 24 files changed, 150 insertions(+), 30 deletions(-) diff --git a/languages/ar_EG/lang.inc b/languages/ar_EG/lang.inc index aa0067ba4..d3af6c075 100644 --- a/languages/ar_EG/lang.inc +++ b/languages/ar_EG/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (1268) +// Translators: Admin (1269) $text = array( '2_factor_auth' => '', @@ -403,7 +403,7 @@ URL: [url]', 'edit_user' => 'تعديل المستخدم', 'edit_user_details' => 'تعديل بيانات المستخدم', 'edit_version' => '', -'el_GR' => '', +'el_GR' => 'ﺲﻴﺴﻴﺳ', 'email' => 'بريد الكتروني', 'email_error_title' => 'لمي يتم ادخال البريد الالكتروني', 'email_footer' => 'يمكنك دائما تغيير اعدادات بريدك الالكتروني من خلال خاصية - مستنداتي', @@ -634,6 +634,7 @@ URL: [url]', 'missing_checksum' => 'فحص اخطاء مفقود', 'missing_file' => '', 'missing_filesize' => 'حجم ملف مفقود', +'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => 'مستخدم/مجموعة مفقودة للتحول', 'monday' => 'الاثنين', @@ -788,6 +789,10 @@ URL: [url]', 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'reception' => '', +'reception_acknowleged' => '', +'reception_noaction' => '', +'reception_rejected' => '', 'recipients' => '', 'redraw' => '', 'refresh' => 'اعادة تحميل', diff --git a/languages/bg_BG/lang.inc b/languages/bg_BG/lang.inc index 12f6318f2..49f03d5d2 100644 --- a/languages/bg_BG/lang.inc +++ b/languages/bg_BG/lang.inc @@ -565,6 +565,7 @@ $text = array( 'missing_checksum' => 'липсва контролна сума', 'missing_file' => '', 'missing_filesize' => 'липсва размер на файла', +'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => 'липсва потребител или група за преход', 'monday' => 'понеделник', @@ -689,6 +690,10 @@ $text = array( 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'reception' => '', +'reception_acknowleged' => '', +'reception_noaction' => '', +'reception_rejected' => '', 'recipients' => '', 'redraw' => '', 'refresh' => 'Обнови', diff --git a/languages/ca_ES/lang.inc b/languages/ca_ES/lang.inc index 46d4a5ff5..ee8470fb3 100644 --- a/languages/ca_ES/lang.inc +++ b/languages/ca_ES/lang.inc @@ -570,6 +570,7 @@ URL: [url]', 'missing_checksum' => '', 'missing_file' => '', 'missing_filesize' => '', +'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => '', 'monday' => 'Dilluns', @@ -694,6 +695,10 @@ URL: [url]', 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'reception' => '', +'reception_acknowleged' => '', +'reception_noaction' => '', +'reception_rejected' => '', 'recipients' => '', 'redraw' => '', 'refresh' => 'Refresh', diff --git a/languages/cs_CZ/lang.inc b/languages/cs_CZ/lang.inc index 8cc8ebb94..2b6dea69c 100644 --- a/languages/cs_CZ/lang.inc +++ b/languages/cs_CZ/lang.inc @@ -641,6 +641,7 @@ URL: [url]', 'missing_checksum' => 'Chybějící kontrolní součet', 'missing_file' => '', 'missing_filesize' => 'Chybějící velikost souboru', +'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => 'Chybějící uživatel/skupina pro změnu', 'monday' => 'Pondělí', @@ -799,6 +800,10 @@ Pokud budete mít problém s přihlášením i po změně hesla, kontaktujte Adm 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'reception' => '', +'reception_acknowleged' => '', +'reception_noaction' => '', +'reception_rejected' => '', 'recipients' => '', 'redraw' => '', 'refresh' => 'Obnovit', diff --git a/languages/de_DE/lang.inc b/languages/de_DE/lang.inc index 7525b584a..815186553 100644 --- a/languages/de_DE/lang.inc +++ b/languages/de_DE/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (2294), dgrutsch (21) +// Translators: Admin (2299), dgrutsch (21) $text = array( '2_factor_auth' => '2-Faktor Authentifizierung', @@ -646,6 +646,7 @@ URL: [url]', 'missing_checksum' => 'Fehlende Check-Summe', 'missing_file' => 'Datei fehlt', 'missing_filesize' => 'Fehlende Dateigröße', +'missing_reception' => 'Fehlende Empfangsbestätigung', 'missing_request_object' => 'Fehlendes Zugriffsobjekte', 'missing_transition_user_group' => 'Fehlende/r Benutzer/Gruppe für Transition', 'monday' => 'Montag', @@ -812,6 +813,10 @@ URL: [url]', 'receipt_request_email_subject' => '[sitename]: [name] - Aufforderung zur Empfangsbestätigung', 'receipt_status' => 'Status', 'receipt_summary' => 'Übersicht Bestätigungen', +'reception' => 'Empfangsbestätigung', +'reception_acknowleged' => 'Empfang bestätigt', +'reception_noaction' => 'Keine Aktion', +'reception_rejected' => 'Empfang abgelehnt', 'recipients' => 'Empfänger', 'redraw' => 'Neu zeichnen', 'refresh' => 'Aktualisieren', diff --git a/languages/el_GR/lang.inc b/languages/el_GR/lang.inc index 1c64289c5..294a0b183 100644 --- a/languages/el_GR/lang.inc +++ b/languages/el_GR/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (202) +// Translators: Admin (206) $text = array( '2_factor_auth' => '', @@ -424,7 +424,7 @@ $text = array( 'fullsearch_hint' => '', 'fulltext_info' => '', 'global_attributedefinitiongroups' => '', -'global_attributedefinitions' => '', +'global_attributedefinitions' => 'Ιδιότητες', 'global_default_keywords' => 'Λέξεις Κλειδιά', 'global_document_categories' => 'Κατηγορίες', 'global_workflows' => 'Ροές Εργασίας', @@ -565,6 +565,7 @@ $text = array( 'missing_checksum' => '', 'missing_file' => '', 'missing_filesize' => '', +'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => '', 'monday' => 'Δευτέρα', @@ -700,6 +701,10 @@ URL: [url]', 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'reception' => '', +'reception_acknowleged' => '', +'reception_noaction' => '', +'reception_rejected' => '', 'recipients' => '', 'redraw' => '', 'refresh' => '', @@ -837,7 +842,7 @@ URL: [url]', 'seq_end' => 'Στο τέλος', 'seq_keep' => '', 'seq_start' => '', -'settings' => '', +'settings' => 'Ρυθμίσεις', 'settings_activate_module' => '', 'settings_activate_php_extension' => '', 'settings_adminIP' => '', @@ -1203,7 +1208,7 @@ URL: [url]', 'submit_userinfo' => '', 'subsribe_timelinefeed' => '', 'substitute_to_user' => '', -'substitute_user' => '', +'substitute_user' => 'Αντικατάσταση Χρήστη', 'success_add_aro' => '', 'success_add_permission' => '', 'success_remove_permission' => '', @@ -1312,7 +1317,7 @@ URL: [url]', 'version_deleted_email' => '', 'version_deleted_email_body' => '', 'version_deleted_email_subject' => '', -'version_info' => '', +'version_info' => 'Πληροφορίες έκδοσης', 'view' => '', 'view_online' => '', 'warning' => 'Προειδοποίηση', diff --git a/languages/en_GB/lang.inc b/languages/en_GB/lang.inc index 64156dd68..09ce38f47 100644 --- a/languages/en_GB/lang.inc +++ b/languages/en_GB/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (1440), dgrutsch (7), netixw (14) +// Translators: Admin (1445), dgrutsch (7), netixw (14) $text = array( '2_factor_auth' => '2-factor authentication', @@ -646,6 +646,7 @@ URL: [url]', 'missing_checksum' => 'Missing checksum', 'missing_file' => 'Missing file', 'missing_filesize' => 'Missing filesize', +'missing_reception' => 'Missing reception', 'missing_request_object' => 'Missing request object', 'missing_transition_user_group' => 'Missing user/group for transition', 'monday' => 'Monday', @@ -813,6 +814,10 @@ URL: [url]', 'receipt_request_email_subject' => '[sitename]: [name] - Reception request', 'receipt_status' => 'Status', 'receipt_summary' => 'Receipt summary', +'reception' => 'Reception', +'reception_acknowleged' => 'Reception acknowledged', +'reception_noaction' => 'No action', +'reception_rejected' => 'Reception rejected', 'recipients' => 'Recipients', 'redraw' => 'Redraw', 'refresh' => 'Refresh', diff --git a/languages/es_ES/lang.inc b/languages/es_ES/lang.inc index 3973845a0..0f8851242 100644 --- a/languages/es_ES/lang.inc +++ b/languages/es_ES/lang.inc @@ -641,6 +641,7 @@ URL: [url]', 'missing_checksum' => 'Falta checksum', 'missing_file' => '', 'missing_filesize' => 'Falta tamaño fichero', +'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => 'Falta usuario/grupo para transición', 'monday' => 'Lunes', @@ -803,6 +804,10 @@ Si continua teniendo problemas de acceso, por favor contacte con el administrado 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'reception' => '', +'reception_acknowleged' => '', +'reception_noaction' => '', +'reception_rejected' => '', 'recipients' => '', 'redraw' => '', 'refresh' => 'Actualizar', diff --git a/languages/fr_FR/lang.inc b/languages/fr_FR/lang.inc index 4343a9fbc..ccc138e2d 100644 --- a/languages/fr_FR/lang.inc +++ b/languages/fr_FR/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (1048), jeromerobert (50), lonnnew (9) +// Translators: Admin (1053), jeromerobert (50), lonnnew (9) $text = array( '2_factor_auth' => '', @@ -641,6 +641,7 @@ URL: [url]', 'missing_checksum' => 'Checksum manquante', 'missing_file' => '', 'missing_filesize' => 'Taille de fichier manquante', +'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => 'Utilisateur/groupe manquant pour transition', 'monday' => 'Lundi', @@ -800,6 +801,10 @@ En cas de problème persistant, veuillez contacter votre administrateur.', 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'reception' => '', +'reception_acknowleged' => '', +'reception_noaction' => '', +'reception_rejected' => '', 'recipients' => '', 'redraw' => '', 'refresh' => 'Actualiser', @@ -1130,8 +1135,8 @@ URL: [url]', 'settings_maxExecutionTime_desc' => 'Ceci définit la durée maximale en secondes q\'un script est autorisé à exécuter avant de se terminer par l\'analyse syntaxique', 'settings_maxRecursiveCount' => 'Nombre maximal de document/dossier récursif', 'settings_maxRecursiveCount_desc' => 'Nombre maximum de documents et répertoires dont l\'accès sera vérifié, lors d\'un décompte récursif. Si ce nombre est dépassé, le nombre de documents et répertoires affichés sera approximé.', -'settings_maxSizeForFullText' => '', -'settings_maxSizeForFullText_desc' => '', +'settings_maxSizeForFullText' => 'Taille maximum pour l\'indexation instantanée', +'settings_maxSizeForFullText_desc' => 'Toute nouvelle version d\'un document plus petite que la taille configuré sera intégralement indéxé juste après l\'upload. Dans tout les autres cas, seulement les metadonées seront indéxées.', 'settings_more_settings' => 'Configurer d\'autres paramètres. Connexion par défaut: admin/admin', 'settings_notfound' => 'Introuvable', 'settings_Notification' => 'Notifications', @@ -1168,8 +1173,8 @@ URL: [url]', 'settings_printDisclaimer_desc' => 'If true the disclaimer message the lang.inc files will be print on the bottom of the page', 'settings_quota' => 'Quota de l\'utilisateur', 'settings_quota_desc' => 'Le maximum de bytes qu\'un utilisateur peut utiliser sur le disque. Définir à 0 pour un espace illimité. Cette valeur peut être outrepasser pour chaque utilisation dans son profile.', -'settings_removeFromDropFolder' => '', -'settings_removeFromDropFolder_desc' => '', +'settings_removeFromDropFolder' => 'Supprimer le fichier du dossier de dépôt après un upload résussi', +'settings_removeFromDropFolder_desc' => 'Activez ceci si un fichier pris du dossier de dépôt doit être supprimé après un upload réussi.', 'settings_restricted' => 'Accès restreint', 'settings_restricted_desc' => 'Autoriser les utilisateurs à se connecter seulement s\'ils ont une entrée dans la BD locale (independamment d\'une authentification réussie avec LDAP)', 'settings_rootDir' => 'Répertoire racine', diff --git a/languages/hr_HR/lang.inc b/languages/hr_HR/lang.inc index c293625d5..3ae98272d 100644 --- a/languages/hr_HR/lang.inc +++ b/languages/hr_HR/lang.inc @@ -646,6 +646,7 @@ Internet poveznica: [url]', 'missing_checksum' => 'Nedostaje kontrolna suma', 'missing_file' => '', 'missing_filesize' => 'Nedostaje veličina datoteke', +'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => 'Nedostaje korisnik/grupa za promjenu', 'monday' => 'Ponedjeljak', @@ -807,6 +808,10 @@ Ako i dalje imate problema s prijavom, molimo kontaktirajte Vašeg administrator 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => 'Sažetak prijema', +'reception' => '', +'reception_acknowleged' => '', +'reception_noaction' => '', +'reception_rejected' => '', 'recipients' => 'Primatelji', 'redraw' => '', 'refresh' => 'Osvježi', diff --git a/languages/hu_HU/lang.inc b/languages/hu_HU/lang.inc index 2ae3b2623..39f772342 100644 --- a/languages/hu_HU/lang.inc +++ b/languages/hu_HU/lang.inc @@ -641,6 +641,7 @@ URL: [url]', 'missing_checksum' => 'Hiányzó ellenőrzőösszeg', 'missing_file' => '', 'missing_filesize' => 'Hiányzó állomány méret', +'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => 'Hiányzó felhasználó/csoport az átvezetéshez', 'monday' => 'Hétfő', @@ -803,6 +804,10 @@ Amennyiben problémákba ütközik a bejelentkezés során, kérjük vegye fel a 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'reception' => '', +'reception_acknowleged' => '', +'reception_noaction' => '', +'reception_rejected' => '', 'recipients' => '', 'redraw' => '', 'refresh' => 'Frissítés', diff --git a/languages/it_IT/lang.inc b/languages/it_IT/lang.inc index efd1d2100..1b13db7b0 100644 --- a/languages/it_IT/lang.inc +++ b/languages/it_IT/lang.inc @@ -647,6 +647,7 @@ URL: [url]', 'missing_checksum' => 'Checksum mancante', 'missing_file' => 'File mancante', 'missing_filesize' => 'Dimensione mancante', +'missing_reception' => '', 'missing_request_object' => 'Manca oggetto di richiesta', 'missing_transition_user_group' => 'Utente/Gruppo per la transizione mancanti', 'monday' => 'Lunedì', @@ -814,6 +815,10 @@ URL: [url]', 'receipt_request_email_subject' => '[sitename]: [name] - Richiesta di ricezione', 'receipt_status' => 'Status', 'receipt_summary' => 'Sommario ricezione', +'reception' => '', +'reception_acknowleged' => '', +'reception_noaction' => '', +'reception_rejected' => '', 'recipients' => 'Cartelle', 'redraw' => '', 'refresh' => 'Ricarica', diff --git a/languages/ko_KR/lang.inc b/languages/ko_KR/lang.inc index cfe68ea53..763d4dd33 100644 --- a/languages/ko_KR/lang.inc +++ b/languages/ko_KR/lang.inc @@ -646,6 +646,7 @@ URL: [url]', 'missing_checksum' => '검사 누락', 'missing_file' => '누락 된 파일', 'missing_filesize' => '누락 된 파일 크기', +'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => '변화에 대한 사용자 / 그룹을 누락', 'monday' => '월요일', @@ -800,6 +801,10 @@ URL : [url]', 'receipt_request_email_subject' => '이메일 제목 확인 요청', 'receipt_status' => '', 'receipt_summary' => '접수증 요약', +'reception' => '', +'reception_acknowleged' => '', +'reception_noaction' => '', +'reception_rejected' => '', 'recipients' => '받는 사람', 'redraw' => '', 'refresh' => '새로 고침', diff --git a/languages/nl_NL/lang.inc b/languages/nl_NL/lang.inc index fcf2c96af..882ff9384 100644 --- a/languages/nl_NL/lang.inc +++ b/languages/nl_NL/lang.inc @@ -639,6 +639,7 @@ URL: [url]', 'missing_checksum' => 'Controlesom ontbreekt', 'missing_file' => 'File ontbreekt', 'missing_filesize' => 'Bestandsgrootte ontbreekt', +'missing_reception' => '', 'missing_request_object' => 'Gevraagd object ontbreekt', 'missing_transition_user_group' => 'Gebruiker / groep ontbreekt voor de overdracht', 'monday' => 'Maandag', @@ -806,6 +807,10 @@ URL: [url]', 'receipt_request_email_subject' => '[sitename]: [name] – Verzoek ontvangen', 'receipt_status' => 'Status ontvangst', 'receipt_summary' => 'Samenvatting', +'reception' => '', +'reception_acknowleged' => '', +'reception_noaction' => '', +'reception_rejected' => '', 'recipients' => 'Ontvangers', 'redraw' => '', 'refresh' => 'Verversen', diff --git a/languages/pl_PL/lang.inc b/languages/pl_PL/lang.inc index 870136649..5ea969ad5 100644 --- a/languages/pl_PL/lang.inc +++ b/languages/pl_PL/lang.inc @@ -634,6 +634,7 @@ URL: [url]', 'missing_checksum' => 'Brak sumy kontrolnej', 'missing_file' => '', 'missing_filesize' => 'Brakujący rozmiar pliku', +'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => 'Brak użytkownika / grupy dla przejścia', 'monday' => 'Poniedziałek', @@ -796,6 +797,10 @@ Jeśli nadal będą problemy z zalogowaniem, prosimy o kontakt z administratorem 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'reception' => '', +'reception_acknowleged' => '', +'reception_noaction' => '', +'reception_rejected' => '', 'recipients' => '', 'redraw' => '', 'refresh' => 'Odśwież', diff --git a/languages/pt_BR/lang.inc b/languages/pt_BR/lang.inc index 492751378..f22e30a73 100644 --- a/languages/pt_BR/lang.inc +++ b/languages/pt_BR/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (915), flaviove (627), lfcristofoli (352) +// Translators: Admin (924), flaviove (627), lfcristofoli (352) $text = array( '2_factor_auth' => '', @@ -409,7 +409,7 @@ URL: [url]', 'edit_user' => 'Editar usuário', 'edit_user_details' => 'Editar Perfil', 'edit_version' => '', -'el_GR' => '', +'el_GR' => 'Grego', 'email' => 'Email', 'email_error_title' => 'Nenhum email informado', 'email_footer' => 'You can always change your e-mail settings using \'My Account\' functions', @@ -432,7 +432,7 @@ URL: [url]', 'error_toogle_permission' => '', 'es_ES' => 'Espanhol', 'event_details' => 'Event details', -'exclude_items' => '', +'exclude_items' => 'Excluir ítens', 'expired' => 'Expirado', 'expires' => 'Expira', 'expiry_changed_email' => 'Data de validade mudou', @@ -640,6 +640,7 @@ URL: [url]', 'missing_checksum' => 'Falta de verificação', 'missing_file' => '', 'missing_filesize' => 'Falta tamanho do arquivo', +'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => 'Falta usuário/grupo para transição', 'monday' => 'Monday', @@ -801,6 +802,10 @@ Se você ainda tiver problemas para fazer o login, por favor, contate o administ 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'reception' => '', +'reception_acknowleged' => '', +'reception_noaction' => '', +'reception_rejected' => '', 'recipients' => '', 'redraw' => '', 'refresh' => 'Atualizar', @@ -1365,13 +1370,13 @@ URL: [url]', 'timeline_full_add_version' => '', 'timeline_full_status_change' => '', 'timeline_selected_item' => '', -'timeline_skip_add_file' => '', -'timeline_skip_status_change_-1' => '', -'timeline_skip_status_change_-3' => '', -'timeline_skip_status_change_0' => '', -'timeline_skip_status_change_1' => '', -'timeline_skip_status_change_2' => '', -'timeline_skip_status_change_3' => '', +'timeline_skip_add_file' => 'anexo adicionado', +'timeline_skip_status_change_-1' => 'rejeitado', +'timeline_skip_status_change_-3' => 'expirado', +'timeline_skip_status_change_0' => 'revisão pendente', +'timeline_skip_status_change_1' => 'aprovação pendente', +'timeline_skip_status_change_2' => 'liberado', +'timeline_skip_status_change_3' => 'dentro do fluxo de trabalho', 'timeline_status_change' => 'Versão [versão]: [estado]', 'to' => 'To', 'toggle_manager' => 'Toggle manager', diff --git a/languages/ro_RO/lang.inc b/languages/ro_RO/lang.inc index ee32629ad..523c637dd 100644 --- a/languages/ro_RO/lang.inc +++ b/languages/ro_RO/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (1045), balan (87) +// Translators: Admin (1046), balan (87) $text = array( '2_factor_auth' => '', @@ -415,7 +415,7 @@ URL: [url]', 'edit_user' => 'Editează utilizator', 'edit_user_details' => 'Editează detalii utilizator', 'edit_version' => '', -'el_GR' => '', +'el_GR' => 'Greaca', 'email' => 'Email', 'email_error_title' => 'Nici un email introdus', 'email_footer' => 'Puteți schimba oricând setările de e-mail folosind functionalitatile din \'Contul meu\'', @@ -646,6 +646,7 @@ URL: [url]', 'missing_checksum' => 'Lipsește suma de control(checksum)', 'missing_file' => '', 'missing_filesize' => 'Lipsește dimensiunea fișierului', +'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => 'Lipsește utilizatorul/grupul pentru tranziție', 'monday' => 'Luni', @@ -808,6 +809,10 @@ Dacă aveți în continuare probleme la autentificare, vă rugăm să contactaț 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'reception' => '', +'reception_acknowleged' => '', +'reception_noaction' => '', +'reception_rejected' => '', 'recipients' => 'Destinatari', 'redraw' => '', 'refresh' => 'Refresh', diff --git a/languages/ru_RU/lang.inc b/languages/ru_RU/lang.inc index 67ef63a59..03b2a6351 100644 --- a/languages/ru_RU/lang.inc +++ b/languages/ru_RU/lang.inc @@ -646,6 +646,7 @@ URL: [url]', 'missing_checksum' => 'Отсутствует контрольная сумма', 'missing_file' => 'Отсутствует файл', 'missing_filesize' => 'Отсутствует размер файла', +'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => 'Отсутствует пользователь/группа для изменения.', 'monday' => 'Понедельник', @@ -810,6 +811,10 @@ URL: [url]', 'receipt_request_email_subject' => '[sitename]: [name] - Запрос получения', 'receipt_status' => '', 'receipt_summary' => 'Сводка по получению', +'reception' => '', +'reception_acknowleged' => '', +'reception_noaction' => '', +'reception_rejected' => '', 'recipients' => 'Получатели', 'redraw' => '', 'refresh' => 'Обновить', diff --git a/languages/sk_SK/lang.inc b/languages/sk_SK/lang.inc index 47f746752..46d37a6a4 100644 --- a/languages/sk_SK/lang.inc +++ b/languages/sk_SK/lang.inc @@ -569,6 +569,7 @@ URL: [url]', 'missing_checksum' => '', 'missing_file' => '', 'missing_filesize' => '', +'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => '', 'monday' => 'Pondelok', @@ -693,6 +694,10 @@ URL: [url]', 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'reception' => '', +'reception_acknowleged' => '', +'reception_noaction' => '', +'reception_rejected' => '', 'recipients' => '', 'redraw' => '', 'refresh' => '', diff --git a/languages/sv_SE/lang.inc b/languages/sv_SE/lang.inc index a3efd7e43..c347cd77c 100644 --- a/languages/sv_SE/lang.inc +++ b/languages/sv_SE/lang.inc @@ -634,6 +634,7 @@ URL: [url]', 'missing_checksum' => 'Checksumma saknas', 'missing_file' => '', 'missing_filesize' => 'Filstorlek saknas', +'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => 'Användare/grupp saknas för övergång', 'monday' => 'måndag', @@ -788,6 +789,10 @@ URL: [url]', 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'reception' => '', +'reception_acknowleged' => '', +'reception_noaction' => '', +'reception_rejected' => '', 'recipients' => '', 'redraw' => '', 'refresh' => 'Uppdatera', diff --git a/languages/tr_TR/lang.inc b/languages/tr_TR/lang.inc index a30741129..901a5ccd8 100644 --- a/languages/tr_TR/lang.inc +++ b/languages/tr_TR/lang.inc @@ -640,6 +640,7 @@ URL: [url]', 'missing_checksum' => 'Sağlama toplamı eksik', 'missing_file' => '', 'missing_filesize' => 'Dosya boyutu eksik', +'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => 'Geçiş için kullanıcı/grup bilgisi eksik', 'monday' => 'Pazartesi', @@ -804,6 +805,10 @@ Giriş yaparken halen sorun yaşıyorsanız lütfen sistem yöneticinizle görü 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'reception' => '', +'reception_acknowleged' => '', +'reception_noaction' => '', +'reception_rejected' => '', 'recipients' => '', 'redraw' => '', 'refresh' => 'Yenile', diff --git a/languages/uk_UA/lang.inc b/languages/uk_UA/lang.inc index 538036853..5bd866f0e 100644 --- a/languages/uk_UA/lang.inc +++ b/languages/uk_UA/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (1326) +// Translators: Admin (1329) $text = array( '2_factor_auth' => '', @@ -243,7 +243,7 @@ URL: [url]', 'choose_workflow_action' => 'Оберіть дію процесу', 'choose_workflow_state' => 'Оберіть статус процесу', 'class_name' => '', -'clear_cache' => '', +'clear_cache' => 'Очистити кеш', 'clear_clipboard' => 'Очистити буфер обміну', 'clear_password' => '', 'clipboard' => 'Буфер обміну', @@ -415,7 +415,7 @@ URL: [url]', 'edit_user' => 'Редагувати користувача', 'edit_user_details' => 'Змінити дані користувача', 'edit_version' => '', -'el_GR' => '', +'el_GR' => 'Грецька', 'email' => 'E-mail', 'email_error_title' => 'Не вказано e-mail', 'email_footer' => 'Ви можете змінити e-mail використовуючи меню «Мій обліковий запис».', @@ -534,7 +534,7 @@ URL: [url]', 'identical_version' => 'Нова версія ідентична поточній.', 'import' => '', 'importfs' => '', -'import_fs' => '', +'import_fs' => 'Імпортувати з файлової системи', 'import_fs_warning' => '', 'include_content' => 'Включно з вмістом', 'include_documents' => 'Включно з документами', @@ -646,6 +646,7 @@ URL: [url]', 'missing_checksum' => 'Відсутня контрольна сума', 'missing_file' => 'Відсутній файл', 'missing_filesize' => 'Відсутній розмір файлу', +'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => 'Відсутній користувач/група для зміни.', 'monday' => 'Понеділок', @@ -810,6 +811,10 @@ URL: [url]', 'receipt_request_email_subject' => '[sitename]: [name] - Запит отримання', 'receipt_status' => '', 'receipt_summary' => 'Підсумки отримання', +'reception' => '', +'reception_acknowleged' => '', +'reception_noaction' => '', +'reception_rejected' => '', 'recipients' => 'Отримувачі', 'redraw' => '', 'refresh' => 'Оновити', diff --git a/languages/zh_CN/lang.inc b/languages/zh_CN/lang.inc index 967d6a386..2ba19fdac 100644 --- a/languages/zh_CN/lang.inc +++ b/languages/zh_CN/lang.inc @@ -571,6 +571,7 @@ URL: [url]', 'missing_checksum' => '缺失校验', 'missing_file' => '', 'missing_filesize' => '缺失文件大小', +'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => '', 'monday' => 'Monday', @@ -695,6 +696,10 @@ URL: [url]', 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'reception' => '', +'reception_acknowleged' => '', +'reception_noaction' => '', +'reception_rejected' => '', 'recipients' => '', 'redraw' => '', 'refresh' => '', diff --git a/languages/zh_TW/lang.inc b/languages/zh_TW/lang.inc index 1d85ad8a5..e9cedfc56 100644 --- a/languages/zh_TW/lang.inc +++ b/languages/zh_TW/lang.inc @@ -569,6 +569,7 @@ URL: [url]', 'missing_checksum' => '', 'missing_file' => '', 'missing_filesize' => '', +'missing_reception' => '', 'missing_request_object' => '', 'missing_transition_user_group' => '', 'monday' => 'Monday', @@ -693,6 +694,10 @@ URL: [url]', 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'reception' => '', +'reception_acknowleged' => '', +'reception_noaction' => '', +'reception_rejected' => '', 'recipients' => '', 'redraw' => '', 'refresh' => '', From 1790e5f6e78d63475fcf6b87c802dc48e589e676 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 Oct 2016 15:01:10 +0200 Subject: [PATCH 008/164] refresh folder tree after document/folder move, make drag&drop work in Edge Closes #286 and #288 --- styles/bootstrap/application.js | 58 +++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 14 deletions(-) diff --git a/styles/bootstrap/application.js b/styles/bootstrap/application.js index 46356deb3..3f869de8d 100644 --- a/styles/bootstrap/application.js +++ b/styles/bootstrap/application.js @@ -240,6 +240,7 @@ $(document).ready( function() { { command: 'movefolder', folderid: attr_source, targetfolderid: attr_dest, formtoken: attr_formtoken }, function(data) { if(data.success) { + $('#table-row-folder-'+attr_source).hide('slow'); noty({ text: data.msg, type: data.success ? 'success' : 'error', @@ -264,6 +265,7 @@ $(document).ready( function() { { command: 'movedocument', docid: attr_source, targetfolderid: attr_dest, formtoken: attr_formtoken }, function(data) { if(data.success) { + $('#table-row-document-'+attr_source).hide('slow'); noty({ text: data.msg, type: data.success ? 'success' : 'error', @@ -409,8 +411,12 @@ $(document).ready( function() { function onAddClipboard(ev) { /* {{{ */ ev.preventDefault(); - source_type = ev.originalEvent.dataTransfer.getData("type"); - source_id = ev.originalEvent.dataTransfer.getData("id"); + var source_info = JSON.parse(e.originalEvent.dataTransfer.getData("text")); + source_type = source_info.type; + source_id = source_info.id; + formtoken = source_info.formtoken; +// source_type = ev.originalEvent.dataTransfer.getData("type"); +// source_id = ev.originalEvent.dataTransfer.getData("id"); if(source_type == 'document' || source_type == 'folder') { $.get('../op/op.Ajax.php', { command: 'addtoclipboard', type: source_type, id: source_id }, @@ -642,9 +648,13 @@ $(document).ready(function() { attr_rel = $(e.currentTarget).attr('rel'); target_type = attr_rel.split("_")[0]; target_id = attr_rel.split("_")[1]; - source_type = e.originalEvent.dataTransfer.getData("type"); - source_id = e.originalEvent.dataTransfer.getData("id"); - formtoken = e.originalEvent.dataTransfer.getData("formtoken"); + var source_info = JSON.parse(e.originalEvent.dataTransfer.getData("text")); + source_type = source_info.type; + source_id = source_info.id; + formtoken = source_info.formtoken; +// source_type = e.originalEvent.dataTransfer.getData("type"); +// source_id = e.originalEvent.dataTransfer.getData("id"); +// formtoken = e.originalEvent.dataTransfer.getData("formtoken"); if(source_type == 'document') { bootbox.dialog(trans.confirm_move_document, [{ "label" : " "+trans.move_document, @@ -654,6 +664,7 @@ $(document).ready(function() { { command: 'movedocument', docid: source_id, targetfolderid: target_id, formtoken: formtoken }, function(data) { if(data.success) { + $('#table-row-document-'+source_id).hide('slow'); noty({ text: data.message, type: 'success', @@ -694,6 +705,7 @@ $(document).ready(function() { { command: 'movefolder', folderid: source_id, targetfolderid: target_id, formtoken: formtoken }, function(data) { if(data.success) { + $('#table-row-folder-'+source_id).hide('slow'); noty({ text: data.message, type: 'success', @@ -731,18 +743,30 @@ $(document).ready(function() { attr_rel = $(e.target).attr('rel'); if(typeof attr_rel == 'undefined') return; - e.originalEvent.dataTransfer.setData("id", attr_rel.split("_")[1]); - e.originalEvent.dataTransfer.setData("type","folder"); - e.originalEvent.dataTransfer.setData("formtoken", $(e.target).attr('formtoken')); + var dragStartInfo = { + id : attr_rel.split("_")[1], + type : "folder", + formtoken : $(e.target).attr('formtoken') + }; + e.originalEvent.dataTransfer.setData("text", JSON.stringify(dragStartInfo)); +// e.originalEvent.dataTransfer.setData("id", attr_rel.split("_")[1]); +// e.originalEvent.dataTransfer.setData("type","folder"); +// e.originalEvent.dataTransfer.setData("formtoken", $(e.target).attr('formtoken')); }); $(document).on('dragstart', '.table-row-document', function (e) { attr_rel = $(e.target).attr('rel'); if(typeof attr_rel == 'undefined') return; - e.originalEvent.dataTransfer.setData("id", attr_rel.split("_")[1]); - e.originalEvent.dataTransfer.setData("type","document"); - e.originalEvent.dataTransfer.setData("formtoken", $(e.target).attr('formtoken')); + var dragStartInfo = { + id : attr_rel.split("_")[1], + type : "document", + formtoken : $(e.target).attr('formtoken') + }; + e.originalEvent.dataTransfer.setData("text", JSON.stringify(dragStartInfo)); +// e.originalEvent.dataTransfer.setData("id", attr_rel.split("_")[1]); +// e.originalEvent.dataTransfer.setData("type","document"); +// e.originalEvent.dataTransfer.setData("formtoken", $(e.target).attr('formtoken')); }); /* Dropping item on alert below clipboard */ @@ -791,9 +815,13 @@ $(document).ready(function() { $(e.target).parent().css('border', '0px solid white'); target_type = attr_rel.split("_")[0]; target_id = attr_rel.split("_")[1]; - source_type = e.originalEvent.dataTransfer.getData("type"); - source_id = e.originalEvent.dataTransfer.getData("id"); - formtoken = e.originalEvent.dataTransfer.getData("formtoken"); + var source_info = JSON.parse(e.originalEvent.dataTransfer.getData("text")); + source_type = source_info.type; + source_id = source_info.id; + formtoken = source_info.formtoken; +// source_type = e.originalEvent.dataTransfer.getData("type"); +// source_id = e.originalEvent.dataTransfer.getData("id"); +// formtoken = e.originalEvent.dataTransfer.getData("formtoken"); if(source_type == 'document') { bootbox.dialog(trans.confirm_move_document, [{ "label" : " "+trans.move_document, @@ -803,6 +831,7 @@ $(document).ready(function() { { command: 'movedocument', docid: source_id, targetfolderid: target_id, formtoken: formtoken }, function(data) { if(data.success) { + $('#table-row-document-'+source_id).hide('slow'); noty({ text: data.message, type: 'success', @@ -843,6 +872,7 @@ $(document).ready(function() { { command: 'movefolder', folderid: source_id, targetfolderid: target_id, formtoken: formtoken }, function(data) { if(data.success) { + $('#table-row-folder-'+source_id).hide('slow'); noty({ text: data.message, type: 'success', From 074bc975f023f016035e86b83ffc7bd74302485d Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 Oct 2016 15:02:16 +0200 Subject: [PATCH 009/164] add changes for 4.3.30 --- CHANGELOG | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 3d5cd3ebd..df86bddfc 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,8 @@ Changes in version 4.3.30 -------------------------------------------------------------------------------- - fix adding new workflows +- fix moving documents/folders via drag&drop in Edge (Closes #286) +- upate folder tree after moving a document/folder with drag&drop (Closes #288) -------------------------------------------------------------------------------- Changes in version 4.3.29 From 9fa5ececb7251a8ac8693067f395df6774af3a12 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 Oct 2016 16:54:16 +0200 Subject: [PATCH 010/164] add showSingleSearchHit config option --- inc/inc.ClassSettings.php | 4 ++++ op/op.Settings.php | 1 + out/out.Search.php | 2 +- views/bootstrap/class.Settings.php | 4 ++++ 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/inc/inc.ClassSettings.php b/inc/inc.ClassSettings.php index 604df1eea..00aabc562 100644 --- a/inc/inc.ClassSettings.php +++ b/inc/inc.ClassSettings.php @@ -97,6 +97,8 @@ class Settings { /* {{{ */ var $_fullSearchEngine = 'lucene'; // default search method var $_defaultSearchMethod = 'database'; // or 'fulltext' + // jump straight to the document if it is the only hit of a search + var $_showSingleSearchHit = true; // contentOffsetDirTo var $_contentOffsetDir = "1048576"; // Maximum number of sub-directories per parent directory @@ -397,6 +399,7 @@ class Settings { /* {{{ */ $this->_maxSizeForFullText = intval($tab["maxSizeForFullText"]); $this->_fullSearchEngine = strval($tab["fullSearchEngine"]); $this->_defaultSearchMethod = strval($tab["defaultSearchMethod"]); + $this->_showSingleSearchHit = Settings::boolVal($tab["showSingleSearchHit"]); $this->_stopWordsFile = strval($tab["stopWordsFile"]); $this->_sortUsersInList = strval($tab["sortUsersInList"]); $this->_sortFoldersDefault = strval($tab["sortFoldersDefault"]); @@ -678,6 +681,7 @@ class Settings { /* {{{ */ $this->setXMLAttributValue($node, "maxSizeForFullText", $this->_maxSizeForFullText); $this->setXMLAttributValue($node, "fullSearchEngine", $this->_fullSearchEngine); $this->setXMLAttributValue($node, "defaultSearchMethod", $this->_defaultSearchMethod); + $this->setXMLAttributValue($node, "showSingleSearchHit", $this->_showSingleSearchHit); $this->setXMLAttributValue($node, "expandFolderTree", $this->_expandFolderTree); $this->setXMLAttributValue($node, "stopWordsFile", $this->_stopWordsFile); $this->setXMLAttributValue($node, "sortUsersInList", $this->_sortUsersInList); diff --git a/op/op.Settings.php b/op/op.Settings.php index da55f7ddc..7873ea292 100644 --- a/op/op.Settings.php +++ b/op/op.Settings.php @@ -72,6 +72,7 @@ if ($action == "saveSettings") $settings->_maxSizeForFullText = intval($_POST["maxSizeForFullText"]); $settings->_fullSearchEngine = $_POST["fullSearchEngine"]; $settings->_defaultSearchMethod = $_POST["defaultSearchMethod"]; + $settings->_showSingleSearchHit = $_POST["showSingleSearchHit"]; $settings->_enableClipboard = getBoolValue("enableClipboard"); $settings->_enableDropUpload = getBoolValue("enableDropUpload"); $settings->_enableFolderTree = getBoolValue("enableFolderTree"); diff --git a/out/out.Search.php b/out/out.Search.php index 3bf6bf7d1..24559d48d 100644 --- a/out/out.Search.php +++ b/out/out.Search.php @@ -389,7 +389,7 @@ if(isset($_GET["fullsearch"]) && $_GET["fullsearch"] && $settings->_enableFullSe // -------------- Output results -------------------------------------------- -if(count($entries) == 1) { +if($settings->_showSingleSearchHit && count($entries) == 1) { $entry = $entries[0]; if(get_class($entry) == 'SeedDMS_Core_Document') { header('Location: ../out/out.ViewDocument.php?documentid='.$entry->getID()); diff --git a/views/bootstrap/class.Settings.php b/views/bootstrap/class.Settings.php index 181fc97a5..d680b5ed3 100644 --- a/views/bootstrap/class.Settings.php +++ b/views/bootstrap/class.Settings.php @@ -208,6 +208,10 @@ if(!is_writeable($settings->_configFilePath)) { +
    "> + + + "> From f987efb7c2e12514208663fd4c7626c10acc8867 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 Oct 2016 17:05:07 +0200 Subject: [PATCH 011/164] add optional parameter norequire to printAttributeEditField() --- views/bootstrap/class.Bootstrap.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/views/bootstrap/class.Bootstrap.php b/views/bootstrap/class.Bootstrap.php index 82e9eeaac..ef9e100be 100644 --- a/views/bootstrap/class.Bootstrap.php +++ b/views/bootstrap/class.Bootstrap.php @@ -1063,7 +1063,7 @@ $('#acceptkeywords').click(function(ev) { getType()) { case SeedDMS_Core_AttributeDefinition::type_boolean: echo "getId()."]\" value=\"0\" />"; @@ -1086,7 +1086,7 @@ $('#acceptkeywords').click(function(ev) { } else { echo "\""; } - echo "".($attrdef->getMinValues() > 0 ? ' required' : '').">"; + echo "".((!$norequire && $attrdef->getMinValues() > 0) ? ' required' : '').">"; if(!$attrdef->getMultipleValues()) { echo ""; } @@ -1103,9 +1103,9 @@ $('#acceptkeywords').click(function(ev) { echo ""; } else { if (strlen($objvalue) > 80) { - echo ''; + echo '"; } else { - echo "getId()."]\" value=\"".htmlspecialchars($objvalue)."\"".($attrdef->getMinValues() > 0 ? ' required' : '').($attrdef->getType() == SeedDMS_Core_AttributeDefinition::type_int ? ' data-rule-digits="true"' : '')." />"; + echo "getId()."]\" value=\"".htmlspecialchars($objvalue)."\"".((!$norequire && $attrdef->getMinValues() > 0) ? ' required' : '').($attrdef->getType() == SeedDMS_Core_AttributeDefinition::type_int ? ' data-rule-digits="true"' : '')." />"; } } break; From b29dfb2f500168635eb45bffe5648e647b12f595 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 Oct 2016 17:05:46 +0200 Subject: [PATCH 012/164] call printAttributeEditField() with optional parameter norequire=true --- views/bootstrap/class.Search.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/views/bootstrap/class.Search.php b/views/bootstrap/class.Search.php index b9ba05620..182624985 100644 --- a/views/bootstrap/class.Search.php +++ b/views/bootstrap/class.Search.php @@ -198,7 +198,7 @@ class SeedDMS_View_Search extends SeedDMS_Bootstrap_Style { ?> - + - + - + Date: Tue, 4 Oct 2016 20:46:08 +0200 Subject: [PATCH 013/164] add phrase settings_showSingleSearchHit and settings_showSingleSearchHit_desc --- languages/ar_EG/lang.inc | 2 ++ languages/bg_BG/lang.inc | 2 ++ languages/ca_ES/lang.inc | 2 ++ languages/cs_CZ/lang.inc | 2 ++ languages/de_DE/lang.inc | 8 +++++--- languages/el_GR/lang.inc | 2 ++ languages/en_GB/lang.inc | 4 +++- languages/es_ES/lang.inc | 6 ++++-- languages/fr_FR/lang.inc | 2 ++ languages/hr_HR/lang.inc | 2 ++ languages/hu_HU/lang.inc | 2 ++ languages/it_IT/lang.inc | 2 ++ languages/ko_KR/lang.inc | 2 ++ languages/nl_NL/lang.inc | 2 ++ languages/pl_PL/lang.inc | 2 ++ languages/pt_BR/lang.inc | 2 ++ languages/ro_RO/lang.inc | 2 ++ languages/ru_RU/lang.inc | 8 +++++--- languages/sk_SK/lang.inc | 2 ++ languages/sv_SE/lang.inc | 10 ++++++---- languages/tr_TR/lang.inc | 2 ++ languages/uk_UA/lang.inc | 2 ++ languages/zh_CN/lang.inc | 2 ++ languages/zh_TW/lang.inc | 2 ++ 24 files changed, 61 insertions(+), 13 deletions(-) diff --git a/languages/ar_EG/lang.inc b/languages/ar_EG/lang.inc index d3af6c075..44bd9f8fb 100644 --- a/languages/ar_EG/lang.inc +++ b/languages/ar_EG/lang.inc @@ -1194,6 +1194,8 @@ URL: [url]', 'settings_Server' => '', 'settings_showMissingTranslations' => '', 'settings_showMissingTranslations_desc' => '', +'settings_showSingleSearchHit' => '', +'settings_showSingleSearchHit_desc' => '', 'settings_Site' => 'الموقع', 'settings_siteDefaultPage' => '', 'settings_siteDefaultPage_desc' => '', diff --git a/languages/bg_BG/lang.inc b/languages/bg_BG/lang.inc index 49f03d5d2..6cbd93086 100644 --- a/languages/bg_BG/lang.inc +++ b/languages/bg_BG/lang.inc @@ -1059,6 +1059,8 @@ $text = array( 'settings_Server' => 'Настройки на сървъра', 'settings_showMissingTranslations' => '', 'settings_showMissingTranslations_desc' => '', +'settings_showSingleSearchHit' => '', +'settings_showSingleSearchHit_desc' => '', 'settings_Site' => 'Сайт', 'settings_siteDefaultPage' => 'Страница по подразбиране', 'settings_siteDefaultPage_desc' => 'Страница,показвана след влизане. Ако е празно, то out/out.ViewFolder.php', diff --git a/languages/ca_ES/lang.inc b/languages/ca_ES/lang.inc index ee8470fb3..3d7400dcd 100644 --- a/languages/ca_ES/lang.inc +++ b/languages/ca_ES/lang.inc @@ -1064,6 +1064,8 @@ URL: [url]', 'settings_Server' => '', 'settings_showMissingTranslations' => '', 'settings_showMissingTranslations_desc' => '', +'settings_showSingleSearchHit' => '', +'settings_showSingleSearchHit_desc' => '', 'settings_Site' => 'Site', 'settings_siteDefaultPage' => '', 'settings_siteDefaultPage_desc' => '', diff --git a/languages/cs_CZ/lang.inc b/languages/cs_CZ/lang.inc index 2b6dea69c..68c69495b 100644 --- a/languages/cs_CZ/lang.inc +++ b/languages/cs_CZ/lang.inc @@ -1203,6 +1203,8 @@ URL: [url]', 'settings_Server' => '', 'settings_showMissingTranslations' => 'Zobrazit chybějící překlady', 'settings_showMissingTranslations_desc' => 'Vypsat všechny chybějící překlady na stránce v dolní části. Přihlášený uživatel bude moci předložit návrh na chybějící překlad, který bude uložen v souboru CSV. Nezapínejte tuto funkci v produkčním prostředí!', +'settings_showSingleSearchHit' => '', +'settings_showSingleSearchHit_desc' => '', 'settings_Site' => 'Site', 'settings_siteDefaultPage' => 'Site Default Page', 'settings_siteDefaultPage_desc' => '', diff --git a/languages/de_DE/lang.inc b/languages/de_DE/lang.inc index 815186553..b17de6ad0 100644 --- a/languages/de_DE/lang.inc +++ b/languages/de_DE/lang.inc @@ -19,11 +19,11 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (2299), dgrutsch (21) +// Translators: Admin (2303), dgrutsch (21) $text = array( '2_factor_auth' => '2-Faktor Authentifizierung', -'2_factor_auth_info' => 'Dieses System erfordert 2-Faktor-Authentifikation. Dazu brauchen den Google Authenticator auf Ihrem Mobiltelefon. Unten sehen Sie zwei QR-Codes. Der rechte Code beinhaltet Ihren aktuellen geheimen Schlüssel. Auf der linken Seite wird ein neuer Schlüssel angezeigt. Wenn Sie den neuen Schlüssel speichern, dann stellen Sie zuvor sicher, dass sie ihn mit dem Google Authenticator zuvor eingescant haben.', +'2_factor_auth_info' => 'Dieses System erfordert 2-Faktor-Authentifikation. Dazu brauchen Sie den Google Authenticator auf Ihrem Mobiltelefon. Unten sehen Sie zwei QR-Codes. Der rechte Code beinhaltet Ihren aktuellen geheimen Schlüssel. Auf der linken Seite wird ein neuer Schlüssel angezeigt. Wenn Sie den neuen Schlüssel speichern, dann stellen Sie zuvor sicher, dass sie ihn mit dem Google Authenticator zuvor eingescant haben.', '2_fact_auth_secret' => 'Schlüssel', 'accept' => 'Übernehmen', 'access_control' => 'Zugriffskontrolle', @@ -697,7 +697,7 @@ URL: [url]', 'new_subfolder_email_subject' => '[sitename]: [folder_name] - Neuer Ordner', 'new_user_image' => 'Neues Bild', 'next_state' => 'Neuer Status', -'nl_NL' => 'Hollandisch', +'nl_NL' => 'Holländisch', 'no' => 'Nein', 'notify_added_email' => 'Benachrichtigung per Mail wurde eingerichtet', 'notify_added_email_body' => 'Added to notification list @@ -1240,6 +1240,8 @@ URL: [url]', 'settings_Server' => 'Server-Einstellungen', 'settings_showMissingTranslations' => 'Zeige fehlende Übersetzungen', 'settings_showMissingTranslations_desc' => 'Listet die fehlenden Übersetzungen der Seite unterhalb der Fußzeile und erlaubt dem Benutzer Vorschläge einzureichen. Diese Vorschläge werden in einer CSV-Datei gespeichert. Diese Funktion sollte nicht in Produktionssystemen eingeschaltet sein.', +'settings_showSingleSearchHit' => 'Springe zu direkt zu einem einzelnen Suchtreffer.', +'settings_showSingleSearchHit_desc' => 'Wenn die Suche nur einen Treffer liefert, dann wird dieser direkt angezeigt und nicht die Liste der Treffer.', 'settings_Site' => 'Site', 'settings_siteDefaultPage' => 'Startseite', 'settings_siteDefaultPage_desc' => 'Erste Seite nach der Anmeldung. Voreingestellt ist \'out/out.ViewFolder.php\'', diff --git a/languages/el_GR/lang.inc b/languages/el_GR/lang.inc index 294a0b183..925e46ce6 100644 --- a/languages/el_GR/lang.inc +++ b/languages/el_GR/lang.inc @@ -1070,6 +1070,8 @@ URL: [url]', 'settings_Server' => '', 'settings_showMissingTranslations' => '', 'settings_showMissingTranslations_desc' => '', +'settings_showSingleSearchHit' => '', +'settings_showSingleSearchHit_desc' => '', 'settings_Site' => '', 'settings_siteDefaultPage' => '', 'settings_siteDefaultPage_desc' => '', diff --git a/languages/en_GB/lang.inc b/languages/en_GB/lang.inc index 09ce38f47..2daebc017 100644 --- a/languages/en_GB/lang.inc +++ b/languages/en_GB/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (1445), dgrutsch (7), netixw (14) +// Translators: Admin (1447), dgrutsch (7), netixw (14) $text = array( '2_factor_auth' => '2-factor authentication', @@ -1241,6 +1241,8 @@ URL: [url]', 'settings_Server' => 'Server settings', 'settings_showMissingTranslations' => 'Show missing translations', 'settings_showMissingTranslations_desc' => 'List all missing translations on the page at the bottom of the page. The logged in user will be able to submit a proposal for a missing translation which will be saved in a csv file. Do not turn this function on if in a production environment!', +'settings_showSingleSearchHit' => 'Jump right to a single search hit', +'settings_showSingleSearchHit_desc' => 'If the search results into just one hit, then it will be displayed right away instead of the result list.', 'settings_Site' => 'Site', 'settings_siteDefaultPage' => 'Site Default Page', 'settings_siteDefaultPage_desc' => 'Default page on login. If empty defaults to out/out.ViewFolder.php', diff --git a/languages/es_ES/lang.inc b/languages/es_ES/lang.inc index 0f8851242..e01f9ae5e 100644 --- a/languages/es_ES/lang.inc +++ b/languages/es_ES/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: acabello (20), Admin (998), angel (123), francisco (2), jaimem (14) +// Translators: acabello (20), Admin (999), angel (123), francisco (2), jaimem (14) $text = array( '2_factor_auth' => '', @@ -529,7 +529,7 @@ URL: [url]', 'identical_version' => 'La nueva versión es idéntica a la actual.', 'import' => 'Importar', 'importfs' => '', -'import_fs' => 'Importar desde sistema de aechivos', +'import_fs' => 'Importar desde sistema de archivos', 'import_fs_warning' => '', 'include_content' => '', 'include_documents' => 'Incluir documentos', @@ -1209,6 +1209,8 @@ URL: [url]', 'settings_Server' => 'Configuración del servidor', 'settings_showMissingTranslations' => 'Mostrar traducciones faltantes', 'settings_showMissingTranslations_desc' => 'Listar todos los términos pendientes de traducción de esta página al final de la misma. En entorno productivo no activar esta función', +'settings_showSingleSearchHit' => '', +'settings_showSingleSearchHit_desc' => '', 'settings_Site' => 'Sitio', 'settings_siteDefaultPage' => 'Página por defecto del sitio', 'settings_siteDefaultPage_desc' => 'Página por defecto al conectar. Si está vacío se dirige a out/out.ViewFolder.php', diff --git a/languages/fr_FR/lang.inc b/languages/fr_FR/lang.inc index ccc138e2d..2e4a46d95 100644 --- a/languages/fr_FR/lang.inc +++ b/languages/fr_FR/lang.inc @@ -1185,6 +1185,8 @@ URL: [url]', 'settings_Server' => 'Paramètres serveur', 'settings_showMissingTranslations' => 'Afficher les traductions manquantes', 'settings_showMissingTranslations_desc' => 'Lister toutes les traductions manquantes de la page dans le bas de la page. L\'utilisateur connecté pourra proposer une traduction manquante qui sera sauvegardée dans un fichier CSV. Ne pas activer cette fonction en production.', +'settings_showSingleSearchHit' => '', +'settings_showSingleSearchHit_desc' => '', 'settings_Site' => 'Site', 'settings_siteDefaultPage' => 'Page par défaut du site', 'settings_siteDefaultPage_desc' => 'Page par défaut lors de la connexion. Si vide, valeur par défaut à out/out.ViewFolder.php', diff --git a/languages/hr_HR/lang.inc b/languages/hr_HR/lang.inc index 3ae98272d..17ffd5ce2 100644 --- a/languages/hr_HR/lang.inc +++ b/languages/hr_HR/lang.inc @@ -1230,6 +1230,8 @@ Internet poveznica: [url]', 'settings_Server' => 'Postavke servera', 'settings_showMissingTranslations' => 'Prikaži prijevode koji nedostaju', 'settings_showMissingTranslations_desc' => 'Navedi sve prijevode koji nedostaju na stranici na dnu stranice. Prijavljeni korisnik će moći podnijeti prijedlog za prijevode koji nedostaju koji će biti pohranjen u csv datoteku. Ne uključujte ovu funkciju ako ste u proizvodnoj okolini!', +'settings_showSingleSearchHit' => '', +'settings_showSingleSearchHit_desc' => '', 'settings_Site' => 'Stranica', 'settings_siteDefaultPage' => 'Zadana stranica', 'settings_siteDefaultPage_desc' => 'Zadana stranica kod prijave. Ako je prazno, zadano je out/out.ViewFolder.php', diff --git a/languages/hu_HU/lang.inc b/languages/hu_HU/lang.inc index 39f772342..dfafd8e8e 100644 --- a/languages/hu_HU/lang.inc +++ b/languages/hu_HU/lang.inc @@ -1208,6 +1208,8 @@ URL: [url]', 'settings_Server' => 'Kiszolgáló beállítások', 'settings_showMissingTranslations' => 'Jelenítse meg a hiányzó fordításokat', 'settings_showMissingTranslations_desc' => 'Felsorolja az összes hiányzó fordítást a lap alján. A bejelentkezett felhasználó képes lesz arra, hogy javaslatot nyújtson be a hiányzó fordításokra, amelyek egy csv állományba kerülnek mentésre. Ne kapcsolja be ezt a funkciót élse környezetben!', +'settings_showSingleSearchHit' => '', +'settings_showSingleSearchHit_desc' => '', 'settings_Site' => 'Webhely', 'settings_siteDefaultPage' => 'Webhely kezdőlap', 'settings_siteDefaultPage_desc' => 'Alapértelmezett oldal a bejelentkezést követően. Ha üres, akkor az alapértelmezett out/out.ViewFolder.php', diff --git a/languages/it_IT/lang.inc b/languages/it_IT/lang.inc index 1b13db7b0..4d1d62990 100644 --- a/languages/it_IT/lang.inc +++ b/languages/it_IT/lang.inc @@ -1242,6 +1242,8 @@ URL: [url]', 'settings_Server' => 'Impostazioni Server', 'settings_showMissingTranslations' => 'Mostra traduzioni mancanti', 'settings_showMissingTranslations_desc' => 'Elenca tutte le traduzioni mancanti alla fine della pagina. L\'utente collegato potrà sottoporre una proposta per le traduzioni mancanti che verrà salvata in un file .csv. Da non usarsi in un ambiente di produzione.', +'settings_showSingleSearchHit' => '', +'settings_showSingleSearchHit_desc' => '', 'settings_Site' => 'Sito', 'settings_siteDefaultPage' => 'Pagina iniziale', 'settings_siteDefaultPage_desc' => 'Pagina iniziale di default del sito. Se lasciato vuoto punta su: out/out.ViewFolder.php', diff --git a/languages/ko_KR/lang.inc b/languages/ko_KR/lang.inc index 763d4dd33..446bc3731 100644 --- a/languages/ko_KR/lang.inc +++ b/languages/ko_KR/lang.inc @@ -1223,6 +1223,8 @@ URL : [url]', 'settings_Server' => '서버 설정', 'settings_showMissingTranslations' => '누락된 번역보기', 'settings_showMissingTranslations_desc' => '페이지 하단에 현재 페이지의 부족한 번역을 나열 합니다. 로그인 한 사용자는 부족한 번역을 제안 및 제출 할 수 있게 되며 CSV 파일로 저장됩니다. 프로덕션 환경의 경우이 기능을 이기능을 선택하지 마십시오!', +'settings_showSingleSearchHit' => '', +'settings_showSingleSearchHit_desc' => '', 'settings_Site' => '사이트', 'settings_siteDefaultPage' => '사이트의 기본 페이지', 'settings_siteDefaultPage_desc' => '로그인시 기본 페이지. 만약 빈 값이면 /out.ViewFolder.php로 이동', diff --git a/languages/nl_NL/lang.inc b/languages/nl_NL/lang.inc index 882ff9384..0f157556a 100644 --- a/languages/nl_NL/lang.inc +++ b/languages/nl_NL/lang.inc @@ -1236,6 +1236,8 @@ URL: [url]', 'settings_Server' => 'Server instellingen', 'settings_showMissingTranslations' => 'Ontbrekende vertalingen weergeven', 'settings_showMissingTranslations_desc' => 'Geef alle ontbrekende vertalingen onder aan de pagina weer. De gebruiker kan een verzoek tot vertaling indienen dat wordt opgeslagen als csv bestand. Let op! Zet deze functie niet aan in productieomgevingen!', +'settings_showSingleSearchHit' => '', +'settings_showSingleSearchHit_desc' => '', 'settings_Site' => 'Web Locatie', 'settings_siteDefaultPage' => 'Locatie standaard pagina', 'settings_siteDefaultPage_desc' => 'Standaard pagina bij inloggen. Indien leeg is out/out.ViewFolder.php de standaard', diff --git a/languages/pl_PL/lang.inc b/languages/pl_PL/lang.inc index 5ea969ad5..c51fc359d 100644 --- a/languages/pl_PL/lang.inc +++ b/languages/pl_PL/lang.inc @@ -1188,6 +1188,8 @@ URL: [url]', 'settings_Server' => 'Ustawienia serwera', 'settings_showMissingTranslations' => '', 'settings_showMissingTranslations_desc' => '', +'settings_showSingleSearchHit' => '', +'settings_showSingleSearchHit_desc' => '', 'settings_Site' => 'Strona', 'settings_siteDefaultPage' => 'Domyślna strona', 'settings_siteDefaultPage_desc' => 'Strona wyświetlana domyślnie po zalogowaniu. Domyślnie jest to out/out.ViewFolder.php', diff --git a/languages/pt_BR/lang.inc b/languages/pt_BR/lang.inc index f22e30a73..a3bafdd7c 100644 --- a/languages/pt_BR/lang.inc +++ b/languages/pt_BR/lang.inc @@ -1206,6 +1206,8 @@ URL: [url]', 'settings_Server' => 'Configuraçoes do servidor', 'settings_showMissingTranslations' => 'Mostrar traduções em falta', 'settings_showMissingTranslations_desc' => 'Listar todas as traduções faltando na página na parte inferior da página. O usuário conectado será capaz de apresentar uma proposta para uma tradução em falta que serão salvos em um arquivo CSV. Não ativar eáa função, se em um ambiente de produção!', +'settings_showSingleSearchHit' => '', +'settings_showSingleSearchHit_desc' => '', 'settings_Site' => 'Site', 'settings_siteDefaultPage' => 'Página Padrão do Site', 'settings_siteDefaultPage_desc' => 'Página padrão no login. Se os padrões estiverem vazios para out/out.ViewFolder.php', diff --git a/languages/ro_RO/lang.inc b/languages/ro_RO/lang.inc index 523c637dd..43e6d0a0e 100644 --- a/languages/ro_RO/lang.inc +++ b/languages/ro_RO/lang.inc @@ -1231,6 +1231,8 @@ URL: [url]', 'settings_Server' => 'Setări server', 'settings_showMissingTranslations' => 'Arată traducerile lipsă', 'settings_showMissingTranslations_desc' => 'Listează toate traducerile lipsă în partea de jos a paginii. Utilizatorul autentificat va putea să propună o traducere lipsă care va fi apoi salvată într-un fișier csv. Nu porniți această funcționalitate într-un mediu de producție!', +'settings_showSingleSearchHit' => '', +'settings_showSingleSearchHit_desc' => '', 'settings_Site' => 'Site', 'settings_siteDefaultPage' => 'Pagină implicită site (Home page)', 'settings_siteDefaultPage_desc' => 'Pagina implicită dupa logare. Dacă se lasă gol, implicit este ViewFolder.php', diff --git a/languages/ru_RU/lang.inc b/languages/ru_RU/lang.inc index 03b2a6351..23a47cd4f 100644 --- a/languages/ru_RU/lang.inc +++ b/languages/ru_RU/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (1545) +// Translators: Admin (1547) $text = array( '2_factor_auth' => '', @@ -415,7 +415,7 @@ URL: [url]', 'edit_user' => 'Редактировать пользователя', 'edit_user_details' => 'Изменить данные пользователя', 'edit_version' => '', -'el_GR' => '', +'el_GR' => 'греческий', 'email' => 'E-mail', 'email_error_title' => 'Не указан e-mail', 'email_footer' => 'Вы можете изменить e-mail используя меню «Моя учётка».', @@ -534,7 +534,7 @@ URL: [url]', 'identical_version' => 'Новая версия идентична текущей.', 'import' => '', 'importfs' => '', -'import_fs' => '', +'import_fs' => 'импорт из файловой системы', 'import_fs_warning' => '', 'include_content' => 'Включая содержимое', 'include_documents' => 'Включая документы', @@ -1238,6 +1238,8 @@ URL: [url]', 'settings_Server' => 'Настройки сервера', 'settings_showMissingTranslations' => 'Фразы которые нужно перевести', 'settings_showMissingTranslations_desc' => 'Отображать внизу страницы фразы, которые нуждаются в переводе', +'settings_showSingleSearchHit' => '', +'settings_showSingleSearchHit_desc' => '', 'settings_Site' => 'Сайт', 'settings_siteDefaultPage' => 'Страница по умолчанию', 'settings_siteDefaultPage_desc' => 'Страница, отображаемая после входа. По умолчанию: out/out.ViewFolder.php', diff --git a/languages/sk_SK/lang.inc b/languages/sk_SK/lang.inc index 46d37a6a4..86893a2c1 100644 --- a/languages/sk_SK/lang.inc +++ b/languages/sk_SK/lang.inc @@ -1063,6 +1063,8 @@ URL: [url]', 'settings_Server' => '', 'settings_showMissingTranslations' => '', 'settings_showMissingTranslations_desc' => '', +'settings_showSingleSearchHit' => '', +'settings_showSingleSearchHit_desc' => '', 'settings_Site' => 'Stránka', 'settings_siteDefaultPage' => '', 'settings_siteDefaultPage_desc' => '', diff --git a/languages/sv_SE/lang.inc b/languages/sv_SE/lang.inc index c347cd77c..7ef9e7074 100644 --- a/languages/sv_SE/lang.inc +++ b/languages/sv_SE/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (1130), tmichelfelder (106) +// Translators: Admin (1133), tmichelfelder (106) $text = array( '2_factor_auth' => '', @@ -403,7 +403,7 @@ URL: [url]', 'edit_user' => 'Ändra användare', 'edit_user_details' => 'Ändra användarens information', 'edit_version' => '', -'el_GR' => '', +'el_GR' => 'grekisk', 'email' => 'E-post', 'email_error_title' => 'E-post saknas', 'email_footer' => 'Du kan alltid ändra dina e-postinställningar genom att gå till \'Min Sida\'', @@ -522,7 +522,7 @@ URL: [url]', 'identical_version' => 'Ny version är lika med den aktuella versionen.', 'import' => '', 'importfs' => '', -'import_fs' => '', +'import_fs' => 'Import från filsystem', 'import_fs_warning' => '', 'include_content' => '', 'include_documents' => 'Inkludera dokument', @@ -1194,6 +1194,8 @@ URL: [url]', 'settings_Server' => 'Server-inställningar', 'settings_showMissingTranslations' => 'Visa saknade översättningar', 'settings_showMissingTranslations_desc' => 'Lista alla saknade översättningar längst ner på sidan. Den inloggade användaren får möjligheten att skicka in ett förslag för saknade översättningar som kommer sparas i en CSV fil. Sätt denna option inte på, på ett DMS som används i verksamheten.', +'settings_showSingleSearchHit' => '', +'settings_showSingleSearchHit_desc' => '', 'settings_Site' => 'Sida', 'settings_siteDefaultPage' => 'Standardsida', 'settings_siteDefaultPage_desc' => 'Standardsida efter inloggning. Om fältet är tomt, används standard-out/out.ViewFolder.php', @@ -1352,7 +1354,7 @@ URL: [url]', 'thursday' => 'torsdag', 'thursday_abbr' => 'to', 'timeline' => 'Tidslinje', -'timeline_add_file' => '', +'timeline_add_file' => 'Ny bilaga', 'timeline_add_version' => '', 'timeline_full_add_file' => '', 'timeline_full_add_version' => '', diff --git a/languages/tr_TR/lang.inc b/languages/tr_TR/lang.inc index 901a5ccd8..3e609cdf5 100644 --- a/languages/tr_TR/lang.inc +++ b/languages/tr_TR/lang.inc @@ -1210,6 +1210,8 @@ URL: [url]', 'settings_Server' => 'Sunucu ayarları', 'settings_showMissingTranslations' => 'Eksik çevirileri göster', 'settings_showMissingTranslations_desc' => 'Eksik çevirilerin tamamı sayfanın en altında listelenir. Giriş yapan kullanıclıar yapacakları çevirileri csv formatında gönderebilirler. Gerçekte kullanılan sistemlerde bunu açmamanız önerilir!', +'settings_showSingleSearchHit' => '', +'settings_showSingleSearchHit_desc' => '', 'settings_Site' => 'Site', 'settings_siteDefaultPage' => 'Site Varsayılan Sayfası', 'settings_siteDefaultPage_desc' => 'Giriş yapıldığında varsayılan olarak gelecek sayfa. Boş bırakılırsa out/out.ViewFolder.php sayfası gelir.', diff --git a/languages/uk_UA/lang.inc b/languages/uk_UA/lang.inc index 5bd866f0e..fb360ec6f 100644 --- a/languages/uk_UA/lang.inc +++ b/languages/uk_UA/lang.inc @@ -1231,6 +1231,8 @@ URL: [url]', 'settings_Server' => 'Налаштування сервера', 'settings_showMissingTranslations' => 'Фрази, як потребують перекладу', 'settings_showMissingTranslations_desc' => 'Відображати внизу сторінки фрази, які потребують перекладу', +'settings_showSingleSearchHit' => '', +'settings_showSingleSearchHit_desc' => '', 'settings_Site' => 'Сайт', 'settings_siteDefaultPage' => 'Сторінка по замовчуванню', 'settings_siteDefaultPage_desc' => 'Сторінка, яка відображається після авторизації. По замовчуванню: out/out.ViewFolder.php', diff --git a/languages/zh_CN/lang.inc b/languages/zh_CN/lang.inc index 2ba19fdac..1034bf1ee 100644 --- a/languages/zh_CN/lang.inc +++ b/languages/zh_CN/lang.inc @@ -1065,6 +1065,8 @@ URL: [url]', 'settings_Server' => '', 'settings_showMissingTranslations' => '显示丢失的翻译', 'settings_showMissingTranslations_desc' => '', +'settings_showSingleSearchHit' => '', +'settings_showSingleSearchHit_desc' => '', 'settings_Site' => '站点设置', 'settings_siteDefaultPage' => '网站的默认页', 'settings_siteDefaultPage_desc' => '', diff --git a/languages/zh_TW/lang.inc b/languages/zh_TW/lang.inc index e9cedfc56..c442ffdf0 100644 --- a/languages/zh_TW/lang.inc +++ b/languages/zh_TW/lang.inc @@ -1063,6 +1063,8 @@ URL: [url]', 'settings_Server' => '', 'settings_showMissingTranslations' => '', 'settings_showMissingTranslations_desc' => '', +'settings_showSingleSearchHit' => '', +'settings_showSingleSearchHit_desc' => '', 'settings_Site' => '', 'settings_siteDefaultPage' => '網站的默認頁', 'settings_siteDefaultPage_desc' => '', From 86cc5df53e2a968806849333e0ebb0083acd3f3e Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 4 Oct 2016 20:56:18 +0200 Subject: [PATCH 014/164] start change log fro 5.0.7 --- CHANGELOG | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 4f6fef0f3..df19e5887 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,8 @@ +-------------------------------------------------------------------------------- + Changes in version 5.0.7 +-------------------------------------------------------------------------------- +- merged changes from 4.3.30 + -------------------------------------------------------------------------------- Changes in version 5.0.6 -------------------------------------------------------------------------------- From d41937735efae9fcbe04f46dd5a778d1103920c0 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 5 Oct 2016 09:14:03 +0200 Subject: [PATCH 015/164] remove method login(), update documentation --- SeedDMS_Core/Core/inc.ClassDMS.php | 68 +++++++++++++++--------------- 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/SeedDMS_Core/Core/inc.ClassDMS.php b/SeedDMS_Core/Core/inc.ClassDMS.php index 7d2da070d..c0f70e9e1 100644 --- a/SeedDMS_Core/Core/inc.ClassDMS.php +++ b/SeedDMS_Core/Core/inc.ClassDMS.php @@ -43,15 +43,16 @@ require_once("inc.ClassAttribute.php"); * by design. It is up to the calling application to use the methods * {@link SeedDMS_Core_Folder::getAccessMode()} and * {@link SeedDMS_Core_Document::getAccessMode()} and interpret them as desired. - * Though, there are two convinient functions to filter a list of + * Though, there are two convenient functions to filter a list of * documents/folders for which users have access rights for. See - * {@link SeedDMS_Core_DMS::filterAccess()} - * and {@link SeedDMS_Core_DMS::filterUsersByAccess()} + * {@link filterAccess()} + * and {@link filterUsersByAccess()} * - * Though, this class has two methods to set the currently logged in user - * ({@link setUser} and {@link login}), none of them need to be called, because + * Though, this class has a method to set the currently logged in user + * ({@link setUser}), it does not have to be called, because * there is currently no class within the SeedDMS core which needs the logged - * in user. + * in user. {@link SeedDMS_Core_DMS} itself does not do any user authentication. + * It is up to the application using this class. * * * viewOnlineFileTypes = $types; } /* }}} */ - /** - * Login as a user - * - * Checks if the given credentials are valid and returns a user object. - * It also sets the property $user for later access on the currently - * logged in user - * - * @param string $username login name of user - * @param string $password password of user - * - * @return object instance of class {@link SeedDMS_Core_User} or false - */ - function login($username, $password) { /* {{{ */ - } /* }}} */ - /** * Set the logged in user * From c1e434788d9b52fdc33eb3e02b0a3019840b1647 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 5 Oct 2016 10:22:35 +0200 Subject: [PATCH 016/164] set showtree in documentListRow() --- views/bootstrap/class.Bootstrap.php | 1 + 1 file changed, 1 insertion(+) diff --git a/views/bootstrap/class.Bootstrap.php b/views/bootstrap/class.Bootstrap.php index ef9e100be..ead8a14cd 100644 --- a/views/bootstrap/class.Bootstrap.php +++ b/views/bootstrap/class.Bootstrap.php @@ -1674,6 +1674,7 @@ $(document).ready( function() { function documentListRow($document, $previewer, $skipcont=false) { /* {{{ */ $dms = $this->params['dms']; $user = $this->params['user']; + $showtree = $this->params['showtree']; $workflowmode = $this->params['workflowmode']; $previewwidth = $this->params['previewWidthList']; $enableClipboard = $this->params['enableclipboard']; From 097bba459171f4e7e0bed3ee62633c40d979ade9 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 5 Oct 2016 13:33:28 +0200 Subject: [PATCH 017/164] add some missing phrases --- languages/ar_EG/lang.inc | 3 +++ languages/bg_BG/lang.inc | 3 +++ languages/ca_ES/lang.inc | 3 +++ languages/cs_CZ/lang.inc | 3 +++ languages/de_DE/lang.inc | 13 +++++++++++-- languages/el_GR/lang.inc | 3 +++ languages/en_GB/lang.inc | 5 ++++- languages/es_ES/lang.inc | 3 +++ languages/fr_FR/lang.inc | 3 +++ languages/hr_HR/lang.inc | 3 +++ languages/hu_HU/lang.inc | 3 +++ languages/it_IT/lang.inc | 3 +++ languages/ko_KR/lang.inc | 3 +++ languages/nl_NL/lang.inc | 3 +++ languages/pl_PL/lang.inc | 3 +++ languages/pt_BR/lang.inc | 3 +++ languages/ro_RO/lang.inc | 3 +++ languages/ru_RU/lang.inc | 3 +++ languages/sk_SK/lang.inc | 3 +++ languages/sv_SE/lang.inc | 3 +++ languages/tr_TR/lang.inc | 3 +++ languages/uk_UA/lang.inc | 3 +++ languages/zh_CN/lang.inc | 3 +++ languages/zh_TW/lang.inc | 3 +++ 24 files changed, 81 insertions(+), 3 deletions(-) diff --git a/languages/ar_EG/lang.inc b/languages/ar_EG/lang.inc index 44bd9f8fb..1caed9c4f 100644 --- a/languages/ar_EG/lang.inc +++ b/languages/ar_EG/lang.inc @@ -784,11 +784,14 @@ URL: [url]', 'quota_exceeded' => 'لقد قمت بتعدي المساحة المخصصة لك بمقدار [bytes].', 'quota_is_disabled' => '', 'quota_warning' => 'اقصى مساحة للقرص الصلب تم تعديها بمقدار [bytes]. من فضلك قم بمسح بعض المستندات او اصدارات سابقة منها', +'receipt_deletion_email_body' => '', +'receipt_deletion_email_subject' => '', 'receipt_log' => '', 'receipt_request_email_body' => '', 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'receipt_update_failed' => '', 'reception' => '', 'reception_acknowleged' => '', 'reception_noaction' => '', diff --git a/languages/bg_BG/lang.inc b/languages/bg_BG/lang.inc index 6cbd93086..fcf7b7e2b 100644 --- a/languages/bg_BG/lang.inc +++ b/languages/bg_BG/lang.inc @@ -685,11 +685,14 @@ $text = array( 'quota_exceeded' => 'Вашата дискова квота е превишена с [bytes].', 'quota_is_disabled' => '', 'quota_warning' => 'Вашето max. използуване на диска е превишена с [bytes]. Please remove documents or previous versions.', +'receipt_deletion_email_body' => '', +'receipt_deletion_email_subject' => '', 'receipt_log' => '', 'receipt_request_email_body' => '', 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'receipt_update_failed' => '', 'reception' => '', 'reception_acknowleged' => '', 'reception_noaction' => '', diff --git a/languages/ca_ES/lang.inc b/languages/ca_ES/lang.inc index 3d7400dcd..da60fac74 100644 --- a/languages/ca_ES/lang.inc +++ b/languages/ca_ES/lang.inc @@ -690,11 +690,14 @@ URL: [url]', 'quota_exceeded' => '', 'quota_is_disabled' => '', 'quota_warning' => '', +'receipt_deletion_email_body' => '', +'receipt_deletion_email_subject' => '', 'receipt_log' => '', 'receipt_request_email_body' => '', 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'receipt_update_failed' => '', 'reception' => '', 'reception_acknowleged' => '', 'reception_noaction' => '', diff --git a/languages/cs_CZ/lang.inc b/languages/cs_CZ/lang.inc index 68c69495b..b6aa08fc8 100644 --- a/languages/cs_CZ/lang.inc +++ b/languages/cs_CZ/lang.inc @@ -795,11 +795,14 @@ Pokud budete mít problém s přihlášením i po změně hesla, kontaktujte Adm 'quota_exceeded' => 'Vaše kvóta disku je překročena o [bytes].', 'quota_is_disabled' => 'Podpora kvót je v současné době zakázána v nastavení. Nastavení uživatelských kvót nebude mít žádný vliv, dokud se znovu neaktivuje.', 'quota_warning' => 'Vaše maximální využití disku je překročeno o [bajtů]. Prosím, odstraňte dokumenty nebo předchozí verze.', +'receipt_deletion_email_body' => '', +'receipt_deletion_email_subject' => '', 'receipt_log' => '', 'receipt_request_email_body' => '', 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'receipt_update_failed' => '', 'reception' => '', 'reception_acknowleged' => '', 'reception_noaction' => '', diff --git a/languages/de_DE/lang.inc b/languages/de_DE/lang.inc index b17de6ad0..1dcb9b18f 100644 --- a/languages/de_DE/lang.inc +++ b/languages/de_DE/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (2303), dgrutsch (21) +// Translators: Admin (2310), dgrutsch (21) $text = array( '2_factor_auth' => '2-Faktor Authentifizierung', @@ -803,6 +803,14 @@ Sollen Sie danach immer noch Problem bei der Anmeldung haben, dann kontaktieren 'quota_exceeded' => 'Ihr maximal verfügbarer Plattenplatz wurde um [bytes] überschritten.', 'quota_is_disabled' => 'Quota-Unterstützung ist zur Zeit ausgeschaltet. Benutzer-Quota werden ignoriert bis Quota-Unterstützung in den Einstellungen eingeschaltet wird.', 'quota_warning' => 'Ihr maximal verfügbarer Plattenplatz wurde um [bytes] überschritten. Bitte löschen Sie Dokumente oder ältere Versionen.', +'receipt_deletion_email_body' => 'Benutzer von Liste der Empfänger gelöscht +Dokument: [name] +Version: [version] +Elternordner: [folder_path] +Empfänger: [recipient] +Benutzer: [username] +URL: [url]', +'receipt_deletion_email_subject' => '[sitename]: [name] - Empfänger gelöscht', 'receipt_log' => 'Protokoll der Empfangsbestätigungen', 'receipt_request_email_body' => 'Aufforderung zur Empfangsbestätigung Dokument: [name] @@ -813,6 +821,7 @@ URL: [url]', 'receipt_request_email_subject' => '[sitename]: [name] - Aufforderung zur Empfangsbestätigung', 'receipt_status' => 'Status', 'receipt_summary' => 'Übersicht Bestätigungen', +'receipt_update_failed' => 'Setzen der Empfangsbestätigung fehlgeschlagen', 'reception' => 'Empfangsbestätigung', 'reception_acknowleged' => 'Empfang bestätigt', 'reception_noaction' => 'Keine Aktion', @@ -1240,7 +1249,7 @@ URL: [url]', 'settings_Server' => 'Server-Einstellungen', 'settings_showMissingTranslations' => 'Zeige fehlende Übersetzungen', 'settings_showMissingTranslations_desc' => 'Listet die fehlenden Übersetzungen der Seite unterhalb der Fußzeile und erlaubt dem Benutzer Vorschläge einzureichen. Diese Vorschläge werden in einer CSV-Datei gespeichert. Diese Funktion sollte nicht in Produktionssystemen eingeschaltet sein.', -'settings_showSingleSearchHit' => 'Springe zu direkt zu einem einzelnen Suchtreffer.', +'settings_showSingleSearchHit' => 'Springe direkt zu einem einzelnen Suchtreffer', 'settings_showSingleSearchHit_desc' => 'Wenn die Suche nur einen Treffer liefert, dann wird dieser direkt angezeigt und nicht die Liste der Treffer.', 'settings_Site' => 'Site', 'settings_siteDefaultPage' => 'Startseite', diff --git a/languages/el_GR/lang.inc b/languages/el_GR/lang.inc index 925e46ce6..aeba14e17 100644 --- a/languages/el_GR/lang.inc +++ b/languages/el_GR/lang.inc @@ -696,11 +696,14 @@ URL: [url]', 'quota_exceeded' => '', 'quota_is_disabled' => '', 'quota_warning' => '', +'receipt_deletion_email_body' => '', +'receipt_deletion_email_subject' => '', 'receipt_log' => '', 'receipt_request_email_body' => '', 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'receipt_update_failed' => '', 'reception' => '', 'reception_acknowleged' => '', 'reception_noaction' => '', diff --git a/languages/en_GB/lang.inc b/languages/en_GB/lang.inc index 2daebc017..87aebd690 100644 --- a/languages/en_GB/lang.inc +++ b/languages/en_GB/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (1447), dgrutsch (7), netixw (14) +// Translators: Admin (1448), dgrutsch (7), netixw (14) $text = array( '2_factor_auth' => '2-factor authentication', @@ -804,6 +804,8 @@ If you have still problems to login, then please contact your administrator.', 'quota_exceeded' => 'Your disk quota is exceeded by [bytes].', 'quota_is_disabled' => 'Quota support is currently disabled in the settings. Setting a user quota will have no effect until it is enabled again.', 'quota_warning' => 'Your maximum disc usage is exceeded by [bytes]. Please remove documents or previous versions.', +'receipt_deletion_email_body' => '', +'receipt_deletion_email_subject' => '', 'receipt_log' => 'Reception Log', 'receipt_request_email_body' => 'Reception request Document: [name] @@ -814,6 +816,7 @@ URL: [url]', 'receipt_request_email_subject' => '[sitename]: [name] - Reception request', 'receipt_status' => 'Status', 'receipt_summary' => 'Receipt summary', +'receipt_update_failed' => 'Acknowledging reception failed', 'reception' => 'Reception', 'reception_acknowleged' => 'Reception acknowledged', 'reception_noaction' => 'No action', diff --git a/languages/es_ES/lang.inc b/languages/es_ES/lang.inc index e01f9ae5e..4dd98376d 100644 --- a/languages/es_ES/lang.inc +++ b/languages/es_ES/lang.inc @@ -799,11 +799,14 @@ Si continua teniendo problemas de acceso, por favor contacte con el administrado 'quota_exceeded' => 'Su cuota de disco se ha excedido en [bytes].', 'quota_is_disabled' => 'La cuota está actualmente deshabilitada en las opciones. Establecer una cuota de usuario no tendrá efecto hasta que sea habilitada de nuevo.', 'quota_warning' => 'El máximo de uso de disco se ha excedido en [bytes]. Por favor eliminar documentos o versiones anteriores.', +'receipt_deletion_email_body' => '', +'receipt_deletion_email_subject' => '', 'receipt_log' => '', 'receipt_request_email_body' => '', 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'receipt_update_failed' => '', 'reception' => '', 'reception_acknowleged' => '', 'reception_noaction' => '', diff --git a/languages/fr_FR/lang.inc b/languages/fr_FR/lang.inc index 2e4a46d95..9912ae2e0 100644 --- a/languages/fr_FR/lang.inc +++ b/languages/fr_FR/lang.inc @@ -796,11 +796,14 @@ En cas de problème persistant, veuillez contacter votre administrateur.', 'quota_exceeded' => 'Votre quota de disque est dépassé de [bytes].', 'quota_is_disabled' => 'Le support des quota est actuellement désactivé dans les réglages. Affecter un quota utilisateur n\'aura pas d\'effet jusqu\'à ce qu\'il soit de nouveau activé.', 'quota_warning' => 'Votre taille maximale de disque est dépassée de [bytes]. SVP supprimer des documents ou d\'anciennes versions.', +'receipt_deletion_email_body' => '', +'receipt_deletion_email_subject' => '', 'receipt_log' => '', 'receipt_request_email_body' => '', 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'receipt_update_failed' => '', 'reception' => '', 'reception_acknowleged' => '', 'reception_noaction' => '', diff --git a/languages/hr_HR/lang.inc b/languages/hr_HR/lang.inc index 17ffd5ce2..a8abac456 100644 --- a/languages/hr_HR/lang.inc +++ b/languages/hr_HR/lang.inc @@ -803,11 +803,14 @@ Ako i dalje imate problema s prijavom, molimo kontaktirajte Vašeg administrator 'quota_exceeded' => 'Vaša kvota na disku je premašena za [bytes].', 'quota_is_disabled' => 'Podrška kvoti je trenutno onemogućena u postavkama. Postavka korisničke kvote neće imati utjecaja dok se ponovno ne omogući.', 'quota_warning' => 'Vaš maksimalni prostor na disku je premašen za [bytes]. Molimo uklonite dokumente ili prethodne verzije.', +'receipt_deletion_email_body' => '', +'receipt_deletion_email_subject' => '', 'receipt_log' => 'Zapisi prijema', 'receipt_request_email_body' => '', 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => 'Sažetak prijema', +'receipt_update_failed' => '', 'reception' => '', 'reception_acknowleged' => '', 'reception_noaction' => '', diff --git a/languages/hu_HU/lang.inc b/languages/hu_HU/lang.inc index dfafd8e8e..9d3515147 100644 --- a/languages/hu_HU/lang.inc +++ b/languages/hu_HU/lang.inc @@ -799,11 +799,14 @@ Amennyiben problémákba ütközik a bejelentkezés során, kérjük vegye fel a 'quota_exceeded' => 'Túllépte a lemezterület korlátot [bytes].', 'quota_is_disabled' => 'Kvóta támogatás jelenleg le van tiltva a beállításoknál. Felhasználói korlát beállítások nem kerülnek érvényesítésre amíg nincs újra engedélyezve.', 'quota_warning' => 'Túllépte lemez korlátot [bytes] bájttal. Kérjük távolítson el dokumentumokat vagy korábbi változatokat.', +'receipt_deletion_email_body' => '', +'receipt_deletion_email_subject' => '', 'receipt_log' => '', 'receipt_request_email_body' => '', 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'receipt_update_failed' => '', 'reception' => '', 'reception_acknowleged' => '', 'reception_noaction' => '', diff --git a/languages/it_IT/lang.inc b/languages/it_IT/lang.inc index 4d1d62990..ac0037984 100644 --- a/languages/it_IT/lang.inc +++ b/languages/it_IT/lang.inc @@ -805,6 +805,8 @@ Dovessero esserci ancora problemi al login, prego contatta l\'Amministratore di 'quota_exceeded' => 'La quota-disco è stata superata di [bytes].', 'quota_is_disabled' => 'Il supporto per le quote è attualmente disattivato nelle impostazioni. L\'impostazione di una quota-utente non avrà alcun effetto finché tale funzionalità non verrà nuovamente attivata.', 'quota_warning' => 'Il vostro utilizzo massimo di spazio è stato superato di [bytes]. Si prega di rimuovere documenti o versioni obsolete.', +'receipt_deletion_email_body' => '', +'receipt_deletion_email_subject' => '', 'receipt_log' => 'Ricezione Log', 'receipt_request_email_body' => 'Richiesta di ricezione Document: [name] @@ -815,6 +817,7 @@ URL: [url]', 'receipt_request_email_subject' => '[sitename]: [name] - Richiesta di ricezione', 'receipt_status' => 'Status', 'receipt_summary' => 'Sommario ricezione', +'receipt_update_failed' => '', 'reception' => '', 'reception_acknowleged' => '', 'reception_noaction' => '', diff --git a/languages/ko_KR/lang.inc b/languages/ko_KR/lang.inc index 446bc3731..881a6f7b7 100644 --- a/languages/ko_KR/lang.inc +++ b/languages/ko_KR/lang.inc @@ -796,11 +796,14 @@ URL : [url]', 'quota_exceeded' => '당신은 디스크 할당량 [bytes]을 초과한다.', 'quota_is_disabled' => '할당량 지원이 설정에서 비활성화되어 있습니다. 다시 활성화 될 때까지 사용자의 할당량 설정은 적용되지 않습니다.', 'quota_warning' => '당신의 최대 디스크 사용량 [bytes] 초과됩니다. 문서 또는 이전 버전을 제거하십시오.', +'receipt_deletion_email_body' => '', +'receipt_deletion_email_subject' => '', 'receipt_log' => '로그 수신', 'receipt_request_email_body' => '이메일 내용 확인 요청', 'receipt_request_email_subject' => '이메일 제목 확인 요청', 'receipt_status' => '', 'receipt_summary' => '접수증 요약', +'receipt_update_failed' => '', 'reception' => '', 'reception_acknowleged' => '', 'reception_noaction' => '', diff --git a/languages/nl_NL/lang.inc b/languages/nl_NL/lang.inc index 0f157556a..4548952a6 100644 --- a/languages/nl_NL/lang.inc +++ b/languages/nl_NL/lang.inc @@ -797,6 +797,8 @@ Mocht u de komende minuten geen email ontvangen, probeer het dan nogmaals en con 'quota_exceeded' => 'Uw data quotum is overschreden met [bytes].', 'quota_is_disabled' => 'Quota support is momenteel niet actief in de eigenschappen. Een user-quotum instellen zal geen effect hebben tot quota actief zijn', 'quota_warning' => 'Uw maximale datagebruik is overschreden met [bytes]. Gelieve documenten of eerdere versies te verwijderen.', +'receipt_deletion_email_body' => '', +'receipt_deletion_email_subject' => '', 'receipt_log' => 'Log ontvangst', 'receipt_request_email_body' => 'Verzoek ontvangen Document: [name] @@ -807,6 +809,7 @@ URL: [url]', 'receipt_request_email_subject' => '[sitename]: [name] – Verzoek ontvangen', 'receipt_status' => 'Status ontvangst', 'receipt_summary' => 'Samenvatting', +'receipt_update_failed' => '', 'reception' => '', 'reception_acknowleged' => '', 'reception_noaction' => '', diff --git a/languages/pl_PL/lang.inc b/languages/pl_PL/lang.inc index c51fc359d..4ab736c96 100644 --- a/languages/pl_PL/lang.inc +++ b/languages/pl_PL/lang.inc @@ -792,11 +792,14 @@ Jeśli nadal będą problemy z zalogowaniem, prosimy o kontakt z administratorem 'quota_exceeded' => 'Twój limit przydzielonej przestrzeni dyskowej został przekroczony o [bytes].', 'quota_is_disabled' => 'Wsparcie limitów dyskowych jest obecnie wyłączone w ustawieniach. Ustawiony limit dyskowy użytkownika nie będzie działał dopóki wparcie nie zostanie ponownie włączone.', 'quota_warning' => 'Przekroczono użycie dysku o [bytes]. Usuń dokumenty lub poprzednie wersje.', +'receipt_deletion_email_body' => '', +'receipt_deletion_email_subject' => '', 'receipt_log' => '', 'receipt_request_email_body' => '', 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'receipt_update_failed' => '', 'reception' => '', 'reception_acknowleged' => '', 'reception_noaction' => '', diff --git a/languages/pt_BR/lang.inc b/languages/pt_BR/lang.inc index a3bafdd7c..c26e769fa 100644 --- a/languages/pt_BR/lang.inc +++ b/languages/pt_BR/lang.inc @@ -797,11 +797,14 @@ Se você ainda tiver problemas para fazer o login, por favor, contate o administ 'quota_exceeded' => 'Sua cota de disco foi ultrapassada em [bytes].', 'quota_is_disabled' => 'Suporte a cota está desativado nas configurações. A definição de cota do usuário não terá efeito até que seja habilitada novamente.', 'quota_warning' => 'Seu uso máximo do disco foi ultrapassado em [bytes]. Por favor, remova documentos ou versões anteriores.', +'receipt_deletion_email_body' => '', +'receipt_deletion_email_subject' => '', 'receipt_log' => '', 'receipt_request_email_body' => '', 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'receipt_update_failed' => '', 'reception' => '', 'reception_acknowleged' => '', 'reception_noaction' => '', diff --git a/languages/ro_RO/lang.inc b/languages/ro_RO/lang.inc index 43e6d0a0e..92aa89afe 100644 --- a/languages/ro_RO/lang.inc +++ b/languages/ro_RO/lang.inc @@ -804,11 +804,14 @@ Dacă aveți în continuare probleme la autentificare, vă rugăm să contactaț 'quota_exceeded' => 'Spatiul tău alocat pe disc este depășit cu [bytes].', 'quota_is_disabled' => 'Spatiu alocat este dezactivată în setări. Stabilirea unui spatiu alocat pentru utilizator nu va avea nici un efect până când setarea este reactivată din nou.', 'quota_warning' => 'Dimensiunea dumneavoastră maximă este depasită cu [bytes]. Vă rugăm să eliminați documente sau versiuni anterioare.', +'receipt_deletion_email_body' => '', +'receipt_deletion_email_subject' => '', 'receipt_log' => '', 'receipt_request_email_body' => '', 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'receipt_update_failed' => '', 'reception' => '', 'reception_acknowleged' => '', 'reception_noaction' => '', diff --git a/languages/ru_RU/lang.inc b/languages/ru_RU/lang.inc index 23a47cd4f..a3fceaa75 100644 --- a/languages/ru_RU/lang.inc +++ b/languages/ru_RU/lang.inc @@ -801,6 +801,8 @@ URL: [url]', 'quota_exceeded' => 'Ваша дисковая квота превышена на [bytes].', 'quota_is_disabled' => 'Поддержка квот в настоящее время отключена в настройках.', 'quota_warning' => 'Ваша дисковая квота превышена на [bytes]. Удалите ненужные документы или их предыдущие версии.', +'receipt_deletion_email_body' => '', +'receipt_deletion_email_subject' => '', 'receipt_log' => 'Лог получения', 'receipt_request_email_body' => 'Запрос получения Документ: [name] @@ -811,6 +813,7 @@ URL: [url]', 'receipt_request_email_subject' => '[sitename]: [name] - Запрос получения', 'receipt_status' => '', 'receipt_summary' => 'Сводка по получению', +'receipt_update_failed' => '', 'reception' => '', 'reception_acknowleged' => '', 'reception_noaction' => '', diff --git a/languages/sk_SK/lang.inc b/languages/sk_SK/lang.inc index 86893a2c1..28fba6e79 100644 --- a/languages/sk_SK/lang.inc +++ b/languages/sk_SK/lang.inc @@ -689,11 +689,14 @@ URL: [url]', 'quota_exceeded' => '', 'quota_is_disabled' => '', 'quota_warning' => '', +'receipt_deletion_email_body' => '', +'receipt_deletion_email_subject' => '', 'receipt_log' => '', 'receipt_request_email_body' => '', 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'receipt_update_failed' => '', 'reception' => '', 'reception_acknowleged' => '', 'reception_noaction' => '', diff --git a/languages/sv_SE/lang.inc b/languages/sv_SE/lang.inc index 7ef9e7074..90ea07f5b 100644 --- a/languages/sv_SE/lang.inc +++ b/languages/sv_SE/lang.inc @@ -784,11 +784,14 @@ URL: [url]', 'quota_exceeded' => 'Din minneskvot har överskridits med [bytes].', 'quota_is_disabled' => 'Kvot stöd är för närvarande inaktiverad i inställningarna. Ställa in en användarkvot kommer att ha någon effekt förrän den är aktiverad igen.', 'quota_warning' => 'Din maximala minneskvot har överskridits med [bytes]. Ta bort dokument eller tidigare versioner.', +'receipt_deletion_email_body' => '', +'receipt_deletion_email_subject' => '', 'receipt_log' => '', 'receipt_request_email_body' => '', 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'receipt_update_failed' => '', 'reception' => '', 'reception_acknowleged' => '', 'reception_noaction' => '', diff --git a/languages/tr_TR/lang.inc b/languages/tr_TR/lang.inc index 3e609cdf5..91b22bcae 100644 --- a/languages/tr_TR/lang.inc +++ b/languages/tr_TR/lang.inc @@ -800,11 +800,14 @@ Giriş yaparken halen sorun yaşıyorsanız lütfen sistem yöneticinizle görü 'quota_exceeded' => 'Size ayrılan disk kotası [bytes] aşıldı.', 'quota_is_disabled' => 'Kota desteği ayarlardan kapatılmış durumda. Açılana kadar kullanıcıya kota tanımlamanın bir etkisi olmaz.', 'quota_warning' => 'Size ayrılan disk kotası [bytes] aşıldı. Lütfen gereksiz olduğunu düşündüğünüz dokümanları veya eski versiyonları silin.', +'receipt_deletion_email_body' => '', +'receipt_deletion_email_subject' => '', 'receipt_log' => '', 'receipt_request_email_body' => '', 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'receipt_update_failed' => '', 'reception' => '', 'reception_acknowleged' => '', 'reception_noaction' => '', diff --git a/languages/uk_UA/lang.inc b/languages/uk_UA/lang.inc index fb360ec6f..cb5a44676 100644 --- a/languages/uk_UA/lang.inc +++ b/languages/uk_UA/lang.inc @@ -801,6 +801,8 @@ URL: [url]', 'quota_exceeded' => 'Ваша дискова квота перевищена на [bytes].', 'quota_is_disabled' => 'Квотування відключено', 'quota_warning' => 'Ваша дискова квота перевищена на [bytes]. Видаліть непотрібні документи або їх попередні версії.', +'receipt_deletion_email_body' => '', +'receipt_deletion_email_subject' => '', 'receipt_log' => 'Лог отримання', 'receipt_request_email_body' => 'Запит отримання Документ: [name] @@ -811,6 +813,7 @@ URL: [url]', 'receipt_request_email_subject' => '[sitename]: [name] - Запит отримання', 'receipt_status' => '', 'receipt_summary' => 'Підсумки отримання', +'receipt_update_failed' => '', 'reception' => '', 'reception_acknowleged' => '', 'reception_noaction' => '', diff --git a/languages/zh_CN/lang.inc b/languages/zh_CN/lang.inc index 1034bf1ee..acef42999 100644 --- a/languages/zh_CN/lang.inc +++ b/languages/zh_CN/lang.inc @@ -691,11 +691,14 @@ URL: [url]', 'quota_exceeded' => '', 'quota_is_disabled' => '配额的支持', 'quota_warning' => '', +'receipt_deletion_email_body' => '', +'receipt_deletion_email_subject' => '', 'receipt_log' => '', 'receipt_request_email_body' => '', 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'receipt_update_failed' => '', 'reception' => '', 'reception_acknowleged' => '', 'reception_noaction' => '', diff --git a/languages/zh_TW/lang.inc b/languages/zh_TW/lang.inc index c442ffdf0..b23d20448 100644 --- a/languages/zh_TW/lang.inc +++ b/languages/zh_TW/lang.inc @@ -689,11 +689,14 @@ URL: [url]', 'quota_exceeded' => '', 'quota_is_disabled' => '', 'quota_warning' => '', +'receipt_deletion_email_body' => '', +'receipt_deletion_email_subject' => '', 'receipt_log' => '', 'receipt_request_email_body' => '', 'receipt_request_email_subject' => '', 'receipt_status' => '', 'receipt_summary' => '', +'receipt_update_failed' => '', 'reception' => '', 'reception_acknowleged' => '', 'reception_noaction' => '', From aa62818e9048390dad220cf8c7be0551b3297be6 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 5 Oct 2016 16:03:47 +0200 Subject: [PATCH 018/164] make sure $success has a value in validation method --- SeedDMS_Core/Core/inc.ClassAttribute.php | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/SeedDMS_Core/Core/inc.ClassAttribute.php b/SeedDMS_Core/Core/inc.ClassAttribute.php index e718e3820..e16272511 100644 --- a/SeedDMS_Core/Core/inc.ClassAttribute.php +++ b/SeedDMS_Core/Core/inc.ClassAttribute.php @@ -877,21 +877,19 @@ class SeedDMS_Core_AttributeDefinition { /* {{{ */ return false; } + $success = true; switch((string) $this->getType()) { case self::type_int: - $success = true; foreach($values as $value) { $success &= preg_match('/^[0-9]*$/', $value) ? true : false; } break; case self::type_float: - $success = true; foreach($values as $value) { $success &= is_numeric($value); } break; case self::type_string: - $success = true; if(trim($this->getRegex()) != '') { foreach($values as $value) { $success &= preg_match($this->getRegex(), $value) ? true : false; @@ -901,20 +899,17 @@ class SeedDMS_Core_AttributeDefinition { /* {{{ */ $this->_validation_error = 3; break; case self::type_boolean: - $success = true; foreach($values as $value) { $success &= preg_match('/^[01]$/', $value); } break; case self::type_email: - $success = true; foreach($values as $value) { } if(!$success) $this->_validation_error = 5; break; case self::type_url: - $success = true; foreach($values as $value) { $success &= preg_match('/^http(s)?:\/\/[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(\/.*)?$/i', $value); } From c670ca463928d5854ea2eb2fa4f9e3626dc82d7b Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 5 Oct 2016 16:23:22 +0200 Subject: [PATCH 019/164] fix typo --- op/op.AddDocument.php | 2 +- op/op.AddSubFolder.php | 2 +- op/op.AddTransitionToWorkflow.php | 2 +- op/op.ApproveDocument.php | 2 +- op/op.AttributeMgr.php | 6 +++--- op/op.Categories.php | 6 +++--- op/op.ClearCache.php | 2 +- op/op.DefaultKeywords.php | 12 ++++++------ op/op.DocumentAccess.php | 2 +- op/op.EditAttributes.php | 2 +- op/op.EditComment.php | 2 +- op/op.EditEvent.php | 2 +- op/op.FolderAccess.php | 2 +- op/op.GroupMgr.php | 12 ++++++------ op/op.RemoveArchive.php | 2 +- op/op.RemoveDocument.php | 2 +- op/op.RemoveDocumentFile.php | 2 +- op/op.RemoveDocumentLink.php | 2 +- op/op.RemoveDump.php | 2 +- op/op.RemoveEvent.php | 2 +- op/op.RemoveFolder.php | 2 +- op/op.RemoveFolderFiles.php | 2 +- op/op.RemoveLog.php | 2 +- op/op.RemoveTransitionFromWorkflow.php | 2 +- op/op.RemoveVersion.php | 2 +- op/op.RemoveWorkflow.php | 2 +- op/op.RemoveWorkflowAction.php | 2 +- op/op.RemoveWorkflowFromDocument.php | 2 +- op/op.RemoveWorkflowState.php | 2 +- op/op.ReturnFromSubWorkflow.php | 2 +- op/op.ReviewDocument.php | 2 +- op/op.RewindWorkflow.php | 2 +- op/op.RunSubWorkflow.php | 2 +- op/op.SetWorkflow.php | 2 +- op/op.TriggerWorkflow.php | 2 +- op/op.UsrMgr.php | 6 +++--- op/op.WorkflowActionsMgr.php | 6 +++--- op/op.WorkflowMgr.php | 6 +++--- op/op.WorkflowStatesMgr.php | 6 +++--- 39 files changed, 61 insertions(+), 61 deletions(-) diff --git a/op/op.AddDocument.php b/op/op.AddDocument.php index 3ade3559a..803725d91 100644 --- a/op/op.AddDocument.php +++ b/op/op.AddDocument.php @@ -27,7 +27,7 @@ include("../inc/inc.Language.php"); include("../inc/inc.ClassUI.php"); include("../inc/inc.Authentication.php"); -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('adddocument')) { UI::exitError(getMLText("folder_title", array("foldername" => getMLText("invalid_request_token"))),getMLText("invalid_request_token")); } diff --git a/op/op.AddSubFolder.php b/op/op.AddSubFolder.php index ba6c929fb..b9f1ae322 100644 --- a/op/op.AddSubFolder.php +++ b/op/op.AddSubFolder.php @@ -27,7 +27,7 @@ include("../inc/inc.Language.php"); include("../inc/inc.ClassUI.php"); include("../inc/inc.Authentication.php"); -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('addsubfolder')) { UI::exitError(getMLText("folder_title", array("foldername" => getMLText("invalid_request_token"))),getMLText("invalid_request_token")); } diff --git a/op/op.AddTransitionToWorkflow.php b/op/op.AddTransitionToWorkflow.php index 1a76b1af1..b11ed93cb 100644 --- a/op/op.AddTransitionToWorkflow.php +++ b/op/op.AddTransitionToWorkflow.php @@ -30,7 +30,7 @@ if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('addtransitiontoworkflow')) { UI::exitError(getMLText("workflow_title"),getMLText("invalid_request_token")); } diff --git a/op/op.ApproveDocument.php b/op/op.ApproveDocument.php index 5fcca5958..5557e76b2 100644 --- a/op/op.ApproveDocument.php +++ b/op/op.ApproveDocument.php @@ -27,7 +27,7 @@ include("../inc/inc.ClassUI.php"); include("../inc/inc.ClassAccessOperation.php"); include("../inc/inc.Authentication.php"); -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('approvedocument')) { UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token")); } diff --git a/op/op.AttributeMgr.php b/op/op.AttributeMgr.php index 20ba49377..a932f0937 100644 --- a/op/op.AttributeMgr.php +++ b/op/op.AttributeMgr.php @@ -34,7 +34,7 @@ else $action=NULL; // add new attribute definition --------------------------------------------- if ($action == "addattrdef") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('addattrdef')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } @@ -81,7 +81,7 @@ if ($action == "addattrdef") { // delete attribute definition ----------------------------------------------- else if ($action == "removeattrdef") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('removeattrdef')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } @@ -108,7 +108,7 @@ else if ($action == "removeattrdef") { // edit attribute definition ----------------------------------------------- else if ($action == "editattrdef") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('editattrdef')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } diff --git a/op/op.Categories.php b/op/op.Categories.php index 651a9d193..050eacd1f 100644 --- a/op/op.Categories.php +++ b/op/op.Categories.php @@ -34,7 +34,7 @@ else $action=NULL; //Neue Kategorie anlegen ----------------------------------------------------------------------------- if ($action == "addcategory") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('addcategory')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } @@ -56,7 +56,7 @@ if ($action == "addcategory") { //Kategorie lschen ---------------------------------------------------------------------------------- else if ($action == "removecategory") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('removecategory')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } @@ -79,7 +79,7 @@ else if ($action == "removecategory") { //Kategorie bearbeiten: Neuer Name -------------------------------------------------------------------- else if ($action == "editcategory") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('editcategory')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } diff --git a/op/op.ClearCache.php b/op/op.ClearCache.php index 9f62e75e8..7f4101a6f 100644 --- a/op/op.ClearCache.php +++ b/op/op.ClearCache.php @@ -23,7 +23,7 @@ include("../inc/inc.Language.php"); include("../inc/inc.ClassUI.php"); include("../inc/inc.Authentication.php"); -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('clearcache')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } diff --git a/op/op.DefaultKeywords.php b/op/op.DefaultKeywords.php index 382c9ddac..1566806fd 100644 --- a/op/op.DefaultKeywords.php +++ b/op/op.DefaultKeywords.php @@ -34,7 +34,7 @@ else $action=NULL; // Create new keyword category ------------------------------------------ if ($action == "addcategory") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('addcategory')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } @@ -56,7 +56,7 @@ if ($action == "addcategory") { // Delete keyword categorie --------------------------------------------- else if ($action == "removecategory") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('removecategory')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } @@ -83,7 +83,7 @@ else if ($action == "removecategory") { // Modify keyword categorie: new name ----------------------------------- else if ($action == "editcategory") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('editcategory')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } @@ -111,7 +111,7 @@ else if ($action == "editcategory") { // Modify keyword categorie: new list of keywords ----------------------- else if ($action == "newkeywords") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('newkeywords')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } @@ -134,7 +134,7 @@ else if ($action == "newkeywords") { // Modify keyword categorie: modify list of keywords ------------------- else if ($action == "editkeywords") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('editkeywords')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } @@ -168,7 +168,7 @@ else if ($action == "editkeywords") // Modify keyword categorie: delete list of keywords -------------------- else if ($action == "removekeywords") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('removekeywords')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } diff --git a/op/op.DocumentAccess.php b/op/op.DocumentAccess.php index 67d2893ef..4a04a8bfb 100644 --- a/op/op.DocumentAccess.php +++ b/op/op.DocumentAccess.php @@ -43,7 +43,7 @@ if ($document->getAccessMode($user) < M_ALL) { UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("access_denied")); } -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ /* FIXME: Currently GET request are allowed. */ if(!checkFormKey('documentaccess', 'GET')) { UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("invalid_request_token")); diff --git a/op/op.EditAttributes.php b/op/op.EditAttributes.php index bce564653..cd6377999 100644 --- a/op/op.EditAttributes.php +++ b/op/op.EditAttributes.php @@ -27,7 +27,7 @@ include("../inc/inc.Language.php"); include("../inc/inc.ClassUI.php"); include("../inc/inc.Authentication.php"); -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('editattributes')) { UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token")); } diff --git a/op/op.EditComment.php b/op/op.EditComment.php index 70f8b60de..db836ccf6 100644 --- a/op/op.EditComment.php +++ b/op/op.EditComment.php @@ -27,7 +27,7 @@ include("../inc/inc.Language.php"); include("../inc/inc.ClassUI.php"); include("../inc/inc.Authentication.php"); -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('editcomment')) { UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token")); } diff --git a/op/op.EditEvent.php b/op/op.EditEvent.php index 45d6b636a..8b9ebdcf2 100644 --- a/op/op.EditEvent.php +++ b/op/op.EditEvent.php @@ -32,7 +32,7 @@ if ($user->isGuest()) { UI::exitError(getMLText("edit_event"),getMLText("access_denied")); } -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('editevent')) { UI::exitError(getMLText("edit_event"),getMLText("invalid_request_token")); } diff --git a/op/op.FolderAccess.php b/op/op.FolderAccess.php index 77d9fef48..e3aad918f 100644 --- a/op/op.FolderAccess.php +++ b/op/op.FolderAccess.php @@ -43,7 +43,7 @@ if ($folder->getAccessMode($user) < M_ALL) { UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("access_denied")); } -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ /* FIXME: Currently GET request are allowed. */ if(!checkFormKey('folderaccess', 'GET')) { UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("invalid_request_token")); diff --git a/op/op.GroupMgr.php b/op/op.GroupMgr.php index 3eea7a4bb..3a04c101e 100644 --- a/op/op.GroupMgr.php +++ b/op/op.GroupMgr.php @@ -36,7 +36,7 @@ else $action = null; // Create new group -------------------------------------------------------- if ($action == "addgroup") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('addgroup')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } @@ -63,7 +63,7 @@ if ($action == "addgroup") { // Delete group ------------------------------------------------------------- else if ($action == "removegroup") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('removegroup')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } @@ -91,7 +91,7 @@ else if ($action == "removegroup") { // Modifiy group ------------------------------------------------------------ else if ($action == "editgroup") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('editgroup')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } @@ -123,7 +123,7 @@ else if ($action == "editgroup") { // Add user to group -------------------------------------------------------- else if ($action == "addmember") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('addmember')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } @@ -161,7 +161,7 @@ else if ($action == "addmember") { // Remove user from group -------------------------------------------------- else if ($action == "rmmember") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('rmmember')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } @@ -196,7 +196,7 @@ else if ($action == "rmmember") { // toggle manager flag else if ($action == "tmanager") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('tmanager')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } diff --git a/op/op.RemoveArchive.php b/op/op.RemoveArchive.php index 9e69bd803..289e505f5 100644 --- a/op/op.RemoveArchive.php +++ b/op/op.RemoveArchive.php @@ -28,7 +28,7 @@ if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('removearchive')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } diff --git a/op/op.RemoveDocument.php b/op/op.RemoveDocument.php index 3beb6dce2..b8fd9d6e6 100644 --- a/op/op.RemoveDocument.php +++ b/op/op.RemoveDocument.php @@ -25,7 +25,7 @@ include("../inc/inc.Language.php"); include("../inc/inc.ClassUI.php"); include("../inc/inc.Authentication.php"); -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('removedocument')) { UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token")); } diff --git a/op/op.RemoveDocumentFile.php b/op/op.RemoveDocumentFile.php index e27d2d05c..dd6c5feb7 100644 --- a/op/op.RemoveDocumentFile.php +++ b/op/op.RemoveDocumentFile.php @@ -24,7 +24,7 @@ include("../inc/inc.Language.php"); include("../inc/inc.ClassUI.php"); include("../inc/inc.Authentication.php"); -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('removedocumentfile')) { UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token")); } diff --git a/op/op.RemoveDocumentLink.php b/op/op.RemoveDocumentLink.php index 3562386ed..9ec56686e 100644 --- a/op/op.RemoveDocumentLink.php +++ b/op/op.RemoveDocumentLink.php @@ -24,7 +24,7 @@ include("../inc/inc.Language.php"); include("../inc/inc.ClassUI.php"); include("../inc/inc.Authentication.php"); -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('removedocumentlink')) { UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token")); } diff --git a/op/op.RemoveDump.php b/op/op.RemoveDump.php index e27e62ad9..0ba68adb6 100644 --- a/op/op.RemoveDump.php +++ b/op/op.RemoveDump.php @@ -28,7 +28,7 @@ if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('removedump')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } diff --git a/op/op.RemoveEvent.php b/op/op.RemoveEvent.php index 81ce0a384..ba29fee9c 100644 --- a/op/op.RemoveEvent.php +++ b/op/op.RemoveEvent.php @@ -28,7 +28,7 @@ include("../inc/inc.ClassUI.php"); include("../inc/inc.Calendar.php"); include("../inc/inc.Authentication.php"); -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('removeevent')) { UI::exitError(getMLText("edit_event"),getMLText("invalid_request_token")); } diff --git a/op/op.RemoveFolder.php b/op/op.RemoveFolder.php index 3cc78c046..11a40bd85 100644 --- a/op/op.RemoveFolder.php +++ b/op/op.RemoveFolder.php @@ -25,7 +25,7 @@ include("../inc/inc.Language.php"); include("../inc/inc.ClassUI.php"); include("../inc/inc.Authentication.php"); -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('removefolder')) { UI::exitError(getMLText("folder_title", array("foldername" => getMLText("invalid_request_token"))),getMLText("invalid_request_token")); } diff --git a/op/op.RemoveFolderFiles.php b/op/op.RemoveFolderFiles.php index f514a8187..0b70c8f6d 100644 --- a/op/op.RemoveFolderFiles.php +++ b/op/op.RemoveFolderFiles.php @@ -28,7 +28,7 @@ if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('removefolderfiles')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } diff --git a/op/op.RemoveLog.php b/op/op.RemoveLog.php index c98d686b4..98226c54a 100644 --- a/op/op.RemoveLog.php +++ b/op/op.RemoveLog.php @@ -24,7 +24,7 @@ include("../inc/inc.Language.php"); include("../inc/inc.ClassUI.php"); include("../inc/inc.Authentication.php"); -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('removelog')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } diff --git a/op/op.RemoveTransitionFromWorkflow.php b/op/op.RemoveTransitionFromWorkflow.php index 906e27cc5..4116b0275 100644 --- a/op/op.RemoveTransitionFromWorkflow.php +++ b/op/op.RemoveTransitionFromWorkflow.php @@ -29,7 +29,7 @@ if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('removetransitionfromworkflow')) { UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token")); } diff --git a/op/op.RemoveVersion.php b/op/op.RemoveVersion.php index e901b81ef..4e3c8646d 100644 --- a/op/op.RemoveVersion.php +++ b/op/op.RemoveVersion.php @@ -25,7 +25,7 @@ include("../inc/inc.Language.php"); include("../inc/inc.ClassUI.php"); include("../inc/inc.Authentication.php"); -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('removeversion')) { UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token")); } diff --git a/op/op.RemoveWorkflow.php b/op/op.RemoveWorkflow.php index 58496121c..5602a6633 100644 --- a/op/op.RemoveWorkflow.php +++ b/op/op.RemoveWorkflow.php @@ -29,7 +29,7 @@ if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('removeworkflow')) { UI::exitError(getMLText("workflow_editor"), getMLText("invalid_request_token")); } diff --git a/op/op.RemoveWorkflowAction.php b/op/op.RemoveWorkflowAction.php index 6b80bba5d..0d04c46f5 100644 --- a/op/op.RemoveWorkflowAction.php +++ b/op/op.RemoveWorkflowAction.php @@ -29,7 +29,7 @@ if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('removeworkflowaction')) { UI::exitError(getMLText("workflow_editor"), getMLText("invalid_request_token")); } diff --git a/op/op.RemoveWorkflowFromDocument.php b/op/op.RemoveWorkflowFromDocument.php index 98a382509..89d572295 100644 --- a/op/op.RemoveWorkflowFromDocument.php +++ b/op/op.RemoveWorkflowFromDocument.php @@ -29,7 +29,7 @@ if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('removeworkflowfromdocument')) { UI::exitError(getMLText("workflow_editor"), getMLText("invalid_request_token")); } diff --git a/op/op.RemoveWorkflowState.php b/op/op.RemoveWorkflowState.php index 2b4fa20bc..74fa2d507 100644 --- a/op/op.RemoveWorkflowState.php +++ b/op/op.RemoveWorkflowState.php @@ -29,7 +29,7 @@ if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('removeworkflowstate')) { UI::exitError(getMLText("workflow_editor"), getMLText("invalid_request_token")); } diff --git a/op/op.ReturnFromSubWorkflow.php b/op/op.ReturnFromSubWorkflow.php index f57626559..fc9ed328d 100644 --- a/op/op.ReturnFromSubWorkflow.php +++ b/op/op.ReturnFromSubWorkflow.php @@ -25,7 +25,7 @@ include("../inc/inc.Language.php"); include("../inc/inc.ClassUI.php"); include("../inc/inc.Authentication.php"); -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('returnfromsubworkflow')) { UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token")); } diff --git a/op/op.ReviewDocument.php b/op/op.ReviewDocument.php index cc6fa0bf3..593e3c809 100644 --- a/op/op.ReviewDocument.php +++ b/op/op.ReviewDocument.php @@ -27,7 +27,7 @@ include("../inc/inc.ClassUI.php"); include("../inc/inc.ClassAccessOperation.php"); include("../inc/inc.Authentication.php"); -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('reviewdocument')) { UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token")); } diff --git a/op/op.RewindWorkflow.php b/op/op.RewindWorkflow.php index 90f8fc92e..c54281a22 100644 --- a/op/op.RewindWorkflow.php +++ b/op/op.RewindWorkflow.php @@ -29,7 +29,7 @@ if (!$user->isAdmin()) { UI::exitError(getMLText("admin_tools"),getMLText("access_denied")); } -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('rewindworkflow')) { UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token")); } diff --git a/op/op.RunSubWorkflow.php b/op/op.RunSubWorkflow.php index 6ca991719..a4830ec9b 100644 --- a/op/op.RunSubWorkflow.php +++ b/op/op.RunSubWorkflow.php @@ -25,7 +25,7 @@ include("../inc/inc.Language.php"); include("../inc/inc.ClassUI.php"); include("../inc/inc.Authentication.php"); -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('runsubworkflow')) { UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token")); } diff --git a/op/op.SetWorkflow.php b/op/op.SetWorkflow.php index 19c16b098..f043fcb12 100644 --- a/op/op.SetWorkflow.php +++ b/op/op.SetWorkflow.php @@ -26,7 +26,7 @@ include("../inc/inc.Language.php"); include("../inc/inc.ClassUI.php"); include("../inc/inc.Authentication.php"); -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('setworkflow')) { UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token")); } diff --git a/op/op.TriggerWorkflow.php b/op/op.TriggerWorkflow.php index 6167a8cf2..679a517aa 100644 --- a/op/op.TriggerWorkflow.php +++ b/op/op.TriggerWorkflow.php @@ -25,7 +25,7 @@ include("../inc/inc.Language.php"); include("../inc/inc.ClassUI.php"); include("../inc/inc.Authentication.php"); -/* Check if the form data comes for a trusted request */ +/* Check if the form data comes from a trusted request */ if(!checkFormKey('triggerworkflow')) { UI::exitError(getMLText("document_title", array("documentname" => getMLText("invalid_request_token"))),getMLText("invalid_request_token")); } diff --git a/op/op.UsrMgr.php b/op/op.UsrMgr.php index c01b988f1..fac14da08 100644 --- a/op/op.UsrMgr.php +++ b/op/op.UsrMgr.php @@ -38,7 +38,7 @@ else $action=NULL; // add new user --------------------------------------------------------- if ($action == "adduser") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('adduser')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } @@ -133,7 +133,7 @@ if ($action == "adduser") { // delete user ------------------------------------------------------------ else if ($action == "removeuser") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('removeuser')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } @@ -176,7 +176,7 @@ else if ($action == "removeuser") { // modify user ------------------------------------------------------------ else if ($action == "edituser") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('edituser')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } diff --git a/op/op.WorkflowActionsMgr.php b/op/op.WorkflowActionsMgr.php index 54f61bf3c..47093c380 100644 --- a/op/op.WorkflowActionsMgr.php +++ b/op/op.WorkflowActionsMgr.php @@ -38,7 +38,7 @@ else $action=NULL; // add new workflow --------------------------------------------------------- if ($action == "addworkflowaction") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('addworkflowaction')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } @@ -61,7 +61,7 @@ if ($action == "addworkflowaction") { // delete user ------------------------------------------------------------ else if ($action == "removeworkflowaction") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('removeworkflowaction')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } @@ -91,7 +91,7 @@ else if ($action == "removeworkflowaction") { // modify workflow --------------------------------------------------------- else if ($action == "editworkflowaction") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('editworkflowaction')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } diff --git a/op/op.WorkflowMgr.php b/op/op.WorkflowMgr.php index e7bfc671e..80483c9a5 100644 --- a/op/op.WorkflowMgr.php +++ b/op/op.WorkflowMgr.php @@ -38,7 +38,7 @@ else $action=NULL; // add new workflow --------------------------------------------------------- if ($action == "addworkflow") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('addworkflow')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } @@ -71,7 +71,7 @@ if ($action == "addworkflow") { // delete workflow -------------------------------------------------------- else if ($action == "removeworkflow") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('removeworkflow')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } @@ -101,7 +101,7 @@ else if ($action == "removeworkflow") { // modify workflow --------------------------------------------------------- else if ($action == "editworkflow") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('editworkflow')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } diff --git a/op/op.WorkflowStatesMgr.php b/op/op.WorkflowStatesMgr.php index 5412af441..726666e2d 100644 --- a/op/op.WorkflowStatesMgr.php +++ b/op/op.WorkflowStatesMgr.php @@ -38,7 +38,7 @@ else $action=NULL; // add new workflow --------------------------------------------------------- if ($action == "addworkflowstate") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('addworkflowstate')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } @@ -62,7 +62,7 @@ if ($action == "addworkflowstate") { // delete user ------------------------------------------------------------ else if ($action == "removeworkflowstate") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('removeworkflowstate')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } @@ -92,7 +92,7 @@ else if ($action == "removeworkflowstate") { // modify workflow --------------------------------------------------------- else if ($action == "editworkflowstate") { - /* Check if the form data comes for a trusted request */ + /* Check if the form data comes from a trusted request */ if(!checkFormKey('editworkflowstate')) { UI::exitError(getMLText("admin_tools"),getMLText("invalid_request_token")); } From 3e505cabc94cba8914cf9cdf23e4b4fd3a13ed80 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 5 Oct 2016 16:32:48 +0200 Subject: [PATCH 020/164] log only some actions if they were successful --- op/op.Ajax.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/op/op.Ajax.php b/op/op.Ajax.php index bda2796f1..368d5714e 100644 --- a/op/op.Ajax.php +++ b/op/op.Ajax.php @@ -238,6 +238,7 @@ switch($command) { if($mfolder->setParent($folder)) { header('Content-Type: application/json'); echo json_encode(array('success'=>true, 'message'=>getMLText('splash_move_folder'), 'data'=>'')); + add_log_line(); } else { header('Content-Type: application/json'); echo json_encode(array('success'=>false, 'message'=>'Error moving folder', 'data'=>'')); @@ -276,6 +277,7 @@ switch($command) { if($mdocument->setFolder($folder)) { header('Content-Type: application/json'); echo json_encode(array('success'=>true, 'message'=>getMLText('splash_move_document'), 'data'=>'')); + add_log_line(); } else { header('Content-Type: application/json'); echo json_encode(array('success'=>false, 'message'=>'Error moving document', 'data'=>'')); @@ -330,6 +332,7 @@ switch($command) { } header('Content-Type: application/json'); echo json_encode(array('success'=>true, 'message'=>'', 'data'=>'')); + add_log_line(); } else { header('Content-Type: application/json'); echo json_encode(array('success'=>false, 'message'=>'Error removing folder', 'data'=>'')); @@ -394,6 +397,7 @@ switch($command) { header('Content-Type: application/json'); echo json_encode(array('success'=>true, 'message'=>'', 'data'=>'')); + add_log_line(); } else { header('Content-Type: application/json'); echo json_encode(array('success'=>false, 'message'=>'Error removing document', 'data'=>'')); @@ -436,6 +440,7 @@ switch($command) { } else { header('Content-Type: application/json'); echo json_encode(array('success'=>true, 'message'=>getMLText('splash_document_locked'), 'data'=>'')); + add_log_line(); } } } else { @@ -700,6 +705,7 @@ switch($command) { } header('Content-Type: application/json'); echo json_encode(array('success'=>true, 'message'=>getMLText('splash_document_added'), 'data'=>$document->getID())); + add_log_line(); } else { header('Content-Type: application/json'); echo json_encode(array('success'=>false, 'message'=>getMLText('invalid_request_token'), 'data'=>'')); @@ -708,5 +714,4 @@ switch($command) { break; /* }}} */ } -add_log_line(); ?> From f1bd74426e77c437e3869be9be1af5425235dd2c Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 6 Oct 2016 08:01:57 +0200 Subject: [PATCH 021/164] trim values in value set when retrieving it --- SeedDMS_Core/Core/inc.ClassAttribute.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SeedDMS_Core/Core/inc.ClassAttribute.php b/SeedDMS_Core/Core/inc.ClassAttribute.php index 1c55d9325..aa1e3d867 100644 --- a/SeedDMS_Core/Core/inc.ClassAttribute.php +++ b/SeedDMS_Core/Core/inc.ClassAttribute.php @@ -553,7 +553,7 @@ class SeedDMS_Core_AttributeDefinition { /* {{{ */ */ function getValueSetAsArray() { /* {{{ */ if(strlen($this->_valueset) > 1) - return explode($this->_valueset[0], substr($this->_valueset, 1)); + return array_map('trim', explode($this->_valueset[0], substr($this->_valueset, 1))); else return array(); } /* }}} */ @@ -569,7 +569,7 @@ class SeedDMS_Core_AttributeDefinition { /* {{{ */ if(strlen($this->_valueset) > 1) { $tmp = explode($this->_valueset[0], substr($this->_valueset, 1)); if(isset($tmp[$ind])) - return $tmp[$ind]; + return trim($tmp[$ind]); else return false; } else From 96ca9bc75b6b904f80b35ac7da7d13e642a4e61f Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 6 Oct 2016 08:02:32 +0200 Subject: [PATCH 022/164] use textarea for valueset if longer than 30 chars --- views/bootstrap/class.AttributeMgr.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/views/bootstrap/class.AttributeMgr.php b/views/bootstrap/class.AttributeMgr.php index 731291cea..461372e77 100644 --- a/views/bootstrap/class.AttributeMgr.php +++ b/views/bootstrap/class.AttributeMgr.php @@ -221,7 +221,11 @@ $(document).ready( function() { : From 5658cbbe54074a2cfc233cb446afa554ff7936c8 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 6 Oct 2016 15:26:28 +0200 Subject: [PATCH 023/164] set initial role to '0' not '1' --- inc/inc.ClassLdapAuthentication.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/inc.ClassLdapAuthentication.php b/inc/inc.ClassLdapAuthentication.php index 7f876dc37..93d5d6169 100644 --- a/inc/inc.ClassLdapAuthentication.php +++ b/inc/inc.ClassLdapAuthentication.php @@ -140,7 +140,7 @@ class SeedDMS_LdapAuthentication extends SeedDMS_Authentication { if (!is_bool($search)) { $info = ldap_get_entries($ds, $search); if (!is_bool($info) && $info["count"]==1 && $info[0]["count"]>0) { - $user = $dms->addUser($username, null, $info[0]['cn'][0], $info[0]['mail'][0], $settings->_language, $settings->_theme, "", 1); + $user = $dms->addUser($username, null, $info[0]['cn'][0], $info[0]['mail'][0], $settings->_language, $settings->_theme, "", 0); } } } From e0880e8ebd83274282eee116e9ef8f066d2499ad Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 7 Oct 2016 11:37:35 +0200 Subject: [PATCH 024/164] add new method getValueSetSeparator() --- SeedDMS_Core/Core/inc.ClassAttribute.php | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/SeedDMS_Core/Core/inc.ClassAttribute.php b/SeedDMS_Core/Core/inc.ClassAttribute.php index aa1e3d867..b1bc22a2c 100644 --- a/SeedDMS_Core/Core/inc.ClassAttribute.php +++ b/SeedDMS_Core/Core/inc.ClassAttribute.php @@ -545,6 +545,20 @@ class SeedDMS_Core_AttributeDefinition { /* {{{ */ return $this->_valueset; } /* }}} */ + /** + * Get the separator used for the value set + * + * This is the first char of the value set string. + * + * @return string separator or an empty string if a value set is not set + */ + function getValueSetSeparator() { /* {{{ */ + if(strlen($this->_valueset) > 1) + return $this->_valueset[0]; + else + return ''; + } /* }}} */ + /** * Get the whole value set as an array * @@ -594,7 +608,12 @@ class SeedDMS_Core_AttributeDefinition { /* {{{ */ } $valuesetstr = implode(",", $tmp); */ - $valuesetstr = $valueset; + if(trim($valueset)) { + $valuesetarr = array_map('trim', explode($valueset[0], substr($valueset, 1))); + $valuesetstr = $valueset[0].implode($valueset[0], $valuesetarr); + } else { + $valuesetstr = ''; + } $db = $this->_dms->getDB(); From 9bd1c111c8edd7cfe7f979e60fa29cfb7716e6e1 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 7 Oct 2016 11:38:04 +0200 Subject: [PATCH 025/164] clean up valueset in addAttributeDefintion() will remove all spaces from each value in the valueset --- SeedDMS_Core/Core/inc.ClassDMS.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/SeedDMS_Core/Core/inc.ClassDMS.php b/SeedDMS_Core/Core/inc.ClassDMS.php index c0f70e9e1..b584ff2df 100644 --- a/SeedDMS_Core/Core/inc.ClassDMS.php +++ b/SeedDMS_Core/Core/inc.ClassDMS.php @@ -1745,6 +1745,12 @@ class SeedDMS_Core_DMS { } if(!$type) return false; + if(trim($valueset)) { + $valuesetarr = array_map('trim', explode($valueset[0], substr($valueset, 1))); + $valueset = $valueset[0].implode($valueset[0], $valuesetarr); + } else { + $valueset = ''; + } $queryStr = "INSERT INTO tblAttributeDefinitions (name, objtype, type, multiple, minvalues, maxvalues, valueset, regex) VALUES (".$this->db->qstr($name).", ".intval($objtype).", ".intval($type).", ".intval($multiple).", ".intval($minvalues).", ".intval($maxvalues).", ".$this->db->qstr($valueset).", ".$this->db->qstr($regex).")"; $res = $this->db->getResult($queryStr); if (!$res) From 93ccbcf86e0d82c2bcb679bfba1a79542563c1bb Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 7 Oct 2016 11:39:33 +0200 Subject: [PATCH 026/164] reformat valueset if string is longer 30 chars will put each value onto its one line. This is allowed since saving the value set will trim each value --- views/bootstrap/class.AttributeMgr.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/bootstrap/class.AttributeMgr.php b/views/bootstrap/class.AttributeMgr.php index 461372e77..7fd0702a5 100644 --- a/views/bootstrap/class.AttributeMgr.php +++ b/views/bootstrap/class.AttributeMgr.php @@ -222,7 +222,7 @@ $(document).ready( function() { - + Date: Tue, 25 Oct 2016 07:55:27 +0200 Subject: [PATCH 034/164] add check for valid email address --- SeedDMS_Core/Core/inc.ClassAttribute.php | 1 + 1 file changed, 1 insertion(+) diff --git a/SeedDMS_Core/Core/inc.ClassAttribute.php b/SeedDMS_Core/Core/inc.ClassAttribute.php index e50662387..e96ae8ed5 100644 --- a/SeedDMS_Core/Core/inc.ClassAttribute.php +++ b/SeedDMS_Core/Core/inc.ClassAttribute.php @@ -924,6 +924,7 @@ class SeedDMS_Core_AttributeDefinition { /* {{{ */ break; case self::type_email: foreach($values as $value) { + $success &= preg_match('/^[a-z0-9._-]+@+[a-z0-9._-]+\.+[a-z]{2,4}$/i', $value); } if(!$success) $this->_validation_error = 5; From 8b2668115301adbf5eed3f79e665a57cb522f263 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 25 Oct 2016 07:58:28 +0200 Subject: [PATCH 035/164] add attribute data-rule-email to seeddms attribute of type email --- views/bootstrap/class.Bootstrap.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/views/bootstrap/class.Bootstrap.php b/views/bootstrap/class.Bootstrap.php index d6dfacb67..9fc963a07 100644 --- a/views/bootstrap/class.Bootstrap.php +++ b/views/bootstrap/class.Bootstrap.php @@ -1140,6 +1140,9 @@ $('#acceptkeywords').click(function(ev) { getId()."]\" value=\"".htmlspecialchars($objvalue)."\"".((!$norequire && $attrdef->getMinValues() > 0) ? ' required' : '').' data-rule-email="true"'." />"; + break; default: if($valueset = $attrdef->getValueSetAsArray()) { echo "getId()."]\" value=\"\" />"; From 4d6d184944733007ae67379c41ba38a6163052d6 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 25 Oct 2016 08:03:18 +0200 Subject: [PATCH 036/164] set default value of attribute of type email --- views/bootstrap/class.Bootstrap.php | 1 + 1 file changed, 1 insertion(+) diff --git a/views/bootstrap/class.Bootstrap.php b/views/bootstrap/class.Bootstrap.php index 9fc963a07..12420e694 100644 --- a/views/bootstrap/class.Bootstrap.php +++ b/views/bootstrap/class.Bootstrap.php @@ -1141,6 +1141,7 @@ $('#acceptkeywords').click(function(ev) { getValue() : $attribute) : ''; echo "getId()."]\" value=\"".htmlspecialchars($objvalue)."\"".((!$norequire && $attrdef->getMinValues() > 0) ? ' required' : '').' data-rule-email="true"'." />"; break; default: From bfd02591c86fe587f74ad74d77d9b86bc9ea9891 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 25 Oct 2016 09:56:49 +0200 Subject: [PATCH 037/164] make getConfigDir static --- inc/inc.ClassSettings.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/inc.ClassSettings.php b/inc/inc.ClassSettings.php index 00aabc562..312b6fe84 100644 --- a/inc/inc.ClassSettings.php +++ b/inc/inc.ClassSettings.php @@ -872,7 +872,7 @@ class Settings { /* {{{ */ function searchConfigFilePath() { /* {{{ */ $configFilePath = null; - if($configDir = $this->getConfigDir()) { + if($configDir = Settings::getConfigDir()) { if (file_exists($configDir."/settings.xml")) return $configDir."/settings.xml"; } @@ -888,7 +888,7 @@ class Settings { /* {{{ */ * 3. The directory /etc/seeddms * @return NULL|string config directory */ - function getConfigDir() { /* {{{ */ + static function getConfigDir() { /* {{{ */ $_tmp = dirname($_SERVER['SCRIPT_FILENAME']); $_arr = preg_split('/\//', rtrim(str_replace('\\', '/', $_tmp))); $configDir = null; From 74c97ee46642be9c26b638e1548f45d01bdc2fa9 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 25 Oct 2016 10:01:51 +0200 Subject: [PATCH 038/164] add entry for 5.0.7 --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index 47f5e1e53..00ede1086 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,7 @@ Changes in version 5.0.7 -------------------------------------------------------------------------------- - merged changes from 4.3.30 +- validate email address of attributes of type email -------------------------------------------------------------------------------- Changes in version 5.0.6 From 92b7f1fe41234dd2b9e23f22c502141eda88bbda Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 26 Oct 2016 19:28:10 +0200 Subject: [PATCH 039/164] get boolean value of showSingleSearchHit with getBoolValue() --- op/op.Settings.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/op/op.Settings.php b/op/op.Settings.php index 7873ea292..a4f346ec5 100644 --- a/op/op.Settings.php +++ b/op/op.Settings.php @@ -72,7 +72,7 @@ if ($action == "saveSettings") $settings->_maxSizeForFullText = intval($_POST["maxSizeForFullText"]); $settings->_fullSearchEngine = $_POST["fullSearchEngine"]; $settings->_defaultSearchMethod = $_POST["defaultSearchMethod"]; - $settings->_showSingleSearchHit = $_POST["showSingleSearchHit"]; + $settings->_showSingleSearchHit = getBoolValue("showSingleSearchHit"); $settings->_enableClipboard = getBoolValue("enableClipboard"); $settings->_enableDropUpload = getBoolValue("enableDropUpload"); $settings->_enableFolderTree = getBoolValue("enableFolderTree"); From 4647856c77c1a64b1b0c8b955b7d6bee6fb7ff7c Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 27 Oct 2016 07:04:32 +0200 Subject: [PATCH 040/164] =?UTF-8?q?check=20if=20used=20values=20are=20in?= =?UTF-8?q?=20value=D1=95et?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- views/bootstrap/class.AttributeMgr.php | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/views/bootstrap/class.AttributeMgr.php b/views/bootstrap/class.AttributeMgr.php index 7fd0702a5..0807a8249 100644 --- a/views/bootstrap/class.AttributeMgr.php +++ b/views/bootstrap/class.AttributeMgr.php @@ -76,7 +76,7 @@ $(document).ready( function() {
    @@ -89,9 +89,21 @@ $(document).ready( function() { print "
    \n\n"; print "\n"; print "\n"; + print "\n"; print "\n\n"; foreach($res['frequencies'][$type] as $entry) { - echo ""; + echo ""; + echo ""; + /* various checks, if the value is valid */ + echo ""; + echo ""; } print "
    :_showSingleSearchHit) echo "checked" ?> />
    : showTextField("stopWordsFile", $settings->_stopWordsFile); ?>
    getName()); ?>:printAttributeEditField($attrdef, isset($attributes[$attrdef->getID()]) ? $attributes[$attrdef->getID()] : '') ?>printAttributeEditField($attrdef, isset($attributes[$attrdef->getID()]) ? $attributes[$attrdef->getID()] : '', 'attributes', true) ?>
    getName()); ?>:printAttributeEditField($attrdef, isset($attributes[$attrdef->getID()]) ? $attributes[$attrdef->getID()] : '') ?>printAttributeEditField($attrdef, isset($attributes[$attrdef->getID()]) ? $attributes[$attrdef->getID()] : '', 'attributes', true) ?>
    getName()); ?>:printAttributeEditField($attrdef, isset($attributes[$attrdef->getID()]) ? $attributes[$attrdef->getID()] : '') ?>printAttributeEditField($attrdef, isset($attributes[$attrdef->getID()]) ? $attributes[$attrdef->getID()] : '', 'attributes', true) ?>
    + getValueSet()) > 30) { ?> + + +
    getValueSet()) > 30) { ?> - + From eadd78cabfe0612eb38ced7c6d572215b558c9e4 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 7 Oct 2016 11:43:27 +0200 Subject: [PATCH 027/164] add entries for 4.3.30 --- CHANGELOG | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index df86bddfc..d4fc346dc 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,7 +3,10 @@ -------------------------------------------------------------------------------- - fix adding new workflows - fix moving documents/folders via drag&drop in Edge (Closes #286) -- upate folder tree after moving a document/folder with drag&drop (Closes #288) +- update folder tree after moving a document/folder with drag&drop (Closes #288) +- trim each value of a value sets of attribute definitions bevor saving +- assign role 'user' instead of 'admin' to accounts automatically created during + ldap authentication -------------------------------------------------------------------------------- Changes in version 4.3.29 From 3ea94f4159441f92473e10308fd8f9d34f1a3d49 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 7 Oct 2016 16:05:19 +0200 Subject: [PATCH 028/164] new version 4.3.30 --- SeedDMS_Core/package.xml | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/SeedDMS_Core/package.xml b/SeedDMS_Core/package.xml index e7732e01e..008c15cbe 100644 --- a/SeedDMS_Core/package.xml +++ b/SeedDMS_Core/package.xml @@ -12,11 +12,11 @@ uwe@steinmann.cx yes - 2016-09-06 + 2016-10-07 - 4.3.29 - 4.3.29 + 4.3.30 + 4.3.30 stable @@ -24,11 +24,8 @@ GPL License -- SeedDMЅ_Core_Object::getAttributes() orders attributes by name of attribute definition -- SeedDMЅ_Core_Workflow::addTransition() force reload of transition list after adding a -- SeedDMЅ_Core_Document::rewrite[Review|Approval]Log() will also copy file if it exists -- add method SeedDMЅ_Core_Document::rewriteWorkflowLog() -new transition +- new method SeedDMЅ_Core_AttributeDefinition::getValueSetSeparator() +- trim each value of a value set before saving the complete value set as a string @@ -1037,5 +1034,25 @@ SeedDMS_Core_DMS::getNotificationsByUser() are deprecated - SeedDMЅ_Core_DMS::search() searches also comment of document version + + 2016-09-06 + + + 4.3.29 + 4.3.29 + + + stable + stable + + GPL License + +- SeedDMЅ_Core_Object::getAttributes() orders attributes by name of attribute definition +- SeedDMЅ_Core_Workflow::addTransition() force reload of transition list after adding a +- SeedDMЅ_Core_Document::rewrite[Review|Approval]Log() will also copy file if it exists +- add method SeedDMЅ_Core_Document::rewriteWorkflowLog() +new transition + + From 0904130f0f2c821b4d0021ea46222c664ba55539 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 7 Oct 2016 16:08:00 +0200 Subject: [PATCH 029/164] new version 5.0.7 --- SeedDMS_Core/package.xml | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/SeedDMS_Core/package.xml b/SeedDMS_Core/package.xml index 3cc172094..f5ccb5490 100644 --- a/SeedDMS_Core/package.xml +++ b/SeedDMS_Core/package.xml @@ -12,11 +12,11 @@ uwe@steinmann.cx yes - 2016-09-06 + 2016-10-07 - 5.0.6 - 5.0.6 + 5.0.7 + 5.0.7 stable @@ -24,7 +24,7 @@ GPL License -- all changes from 4.3.29 merged +- all changes from 4.3.30 merged @@ -1190,5 +1190,21 @@ SeedDMS_Core_DMS::getNotificationsByUser() are deprecated - all changes from 4.3.28 merged + + 2016-09-06 + + + 5.0.6 + 5.0.6 + + + stable + stable + + GPL License + +- all changes from 4.3.29 merged + + From 754d25653265194aa65002b972aa86ffeb9173fa Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 7 Oct 2016 16:10:49 +0200 Subject: [PATCH 030/164] prepare for next version 5.0.7 --- Makefile | 2 +- SeedDMS_Core/Core/inc.ClassDMS.php | 2 +- inc/inc.Version.php | 2 +- install/install.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 5baecf72c..0743c1aaa 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -VERSION=5.0.6 +VERSION=5.0.7 SRC=CHANGELOG inc conf utils index.php languages views op out controllers doc drop-tables-innodb.sql styles js TODO LICENSE Makefile webdav install restapi # webapp diff --git a/SeedDMS_Core/Core/inc.ClassDMS.php b/SeedDMS_Core/Core/inc.ClassDMS.php index 20985b1fe..a8a921f32 100644 --- a/SeedDMS_Core/Core/inc.ClassDMS.php +++ b/SeedDMS_Core/Core/inc.ClassDMS.php @@ -328,7 +328,7 @@ class SeedDMS_Core_DMS { $this->callbacks = array(); $this->version = '@package_version@'; if($this->version[0] == '@') - $this->version = '5.0.6'; + $this->version = '5.0.7'; } /* }}} */ /** diff --git a/inc/inc.Version.php b/inc/inc.Version.php index 52f425fd4..117bcd580 100644 --- a/inc/inc.Version.php +++ b/inc/inc.Version.php @@ -20,7 +20,7 @@ class SeedDMS_Version { - public $_number = "5.0.6"; + public $_number = "5.0.7"; private $_string = "SeedDMS"; function __construct() { diff --git a/install/install.php b/install/install.php index c7e837010..2eb66b54f 100644 --- a/install/install.php +++ b/install/install.php @@ -118,7 +118,7 @@ function fileExistsInIncludePath($file) { /* {{{ */ * Load default settings + set */ define("SEEDDMS_INSTALL", "on"); -define("SEEDDMS_VERSION", "5.0.6"); +define("SEEDDMS_VERSION", "5.0.7"); require_once('../inc/inc.ClassSettings.php'); From e69fb26dcc1cb7ca3c4333717e9363fb0e177f3a Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 7 Oct 2016 16:11:29 +0200 Subject: [PATCH 031/164] prepare for new version 4.3.30 --- SeedDMS_Core/Core/inc.ClassDMS.php | 2 +- inc/inc.Version.php | 2 +- install/install.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/SeedDMS_Core/Core/inc.ClassDMS.php b/SeedDMS_Core/Core/inc.ClassDMS.php index b584ff2df..d28f62893 100644 --- a/SeedDMS_Core/Core/inc.ClassDMS.php +++ b/SeedDMS_Core/Core/inc.ClassDMS.php @@ -291,7 +291,7 @@ class SeedDMS_Core_DMS { $this->callbacks = array(); $this->version = '@package_version@'; if($this->version[0] == '@') - $this->version = '4.3.29'; + $this->version = '4.3.30'; } /* }}} */ /** diff --git a/inc/inc.Version.php b/inc/inc.Version.php index 57787a1ca..238f82aa3 100644 --- a/inc/inc.Version.php +++ b/inc/inc.Version.php @@ -20,7 +20,7 @@ class SeedDMS_Version { - public $_number = "4.3.29"; + public $_number = "4.3.30"; private $_string = "SeedDMS"; function __construct() { diff --git a/install/install.php b/install/install.php index 97f3aaf64..8229f9cc2 100644 --- a/install/install.php +++ b/install/install.php @@ -118,7 +118,7 @@ function fileExistsInIncludePath($file) { /* {{{ */ * Load default settings + set */ define("SEEDDMS_INSTALL", "on"); -define("SEEDDMS_VERSION", "4.3.29"); +define("SEEDDMS_VERSION", "4.3.30"); require_once('../inc/inc.ClassSettings.php'); From 894466b1028f29b48f40ae71dcd811172cc95264 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 20 Oct 2016 18:27:43 +0200 Subject: [PATCH 032/164] add code for taking over attribute value of previous version --- views/bootstrap/class.Bootstrap.php | 93 +++++++++++++++++++++++++++-- 1 file changed, 88 insertions(+), 5 deletions(-) diff --git a/views/bootstrap/class.Bootstrap.php b/views/bootstrap/class.Bootstrap.php index ead8a14cd..4ac13cd9c 100644 --- a/views/bootstrap/class.Bootstrap.php +++ b/views/bootstrap/class.Bootstrap.php @@ -1067,12 +1067,12 @@ $('#acceptkeywords').click(function(ev) { switch($attrdef->getType()) { case SeedDMS_Core_AttributeDefinition::type_boolean: echo "getId()."]\" value=\"0\" />"; - echo "getId()."]\" value=\"1\" ".($objvalue ? 'checked' : '')." />"; + echo "getId()."\" name=\"".$fieldname."[".$attrdef->getId()."]\" value=\"1\" ".($objvalue ? 'checked' : '')." />"; break; case SeedDMS_Core_AttributeDefinition::type_date: ?> - "> + getId();?>" class="span4" size="16" name="[getId() ?>]" type="text" value=""> getValueSetAsArray()) { echo "getId()."]\" value=\"\" />"; - echo "getId()."\" name=\"".$fieldname."[".$attrdef->getId()."]"; if($attrdef->getMultipleValues()) { echo "[]\" multiple"; } else { @@ -1103,9 +1103,9 @@ $('#acceptkeywords').click(function(ev) { echo ""; } else { if (strlen($objvalue) > 80) { - echo '"; + echo '"; } else { - echo "getId()."]\" value=\"".htmlspecialchars($objvalue)."\"".((!$norequire && $attrdef->getMinValues() > 0) ? ' required' : '').($attrdef->getType() == SeedDMS_Core_AttributeDefinition::type_int ? ' data-rule-digits="true"' : '')." />"; + echo "getId()."\" name=\"".$fieldname."[".$attrdef->getId()."]\" value=\"".htmlspecialchars($objvalue)."\"".((!$norequire && $attrdef->getMinValues() > 0) ? ' required' : '').($attrdef->getType() == SeedDMS_Core_AttributeDefinition::type_int ? ' data-rule-digits="true"' : '')." />"; } } break; @@ -1664,6 +1664,89 @@ $(document).ready( function() { + " data-ref="" data-text=""> + +$(document).ready( function() { + $('.inputpreset_btn').click(function(ev){ + ev.preventDefault(); + if (typeof $(ev.currentTarget).data('text') != 'undefined') { + target = $(ev.currentTarget).data('ref'); + value = $(ev.currentTarget).data('text'); + sep = $(ev.currentTarget).data('sep'); + if(sep) { + // Use attr() instead of data() because data() converts to int which cannot be split + arr = value.split(sep); + for(var i in arr) { + $("#"+target+" option[value='"+arr[i]+"']").attr("selected", "selected"); + } + } else { + $("#"+target).val(value); + } + } + }); +}); + + " data-ref="" data-text=""> + +$(document).ready( function() { + $('.checkboxpreset_btn').click(function(ev){ + ev.preventDefault(); + if (typeof $(ev.currentTarget).data('text') != 'undefined') { + target = $(ev.currentTarget).data('ref'); + value = $(ev.currentTarget).data('text'); + if(value) { + $("#"+target).attr('checked', ''); + } else { + $("#"+target).removeAttribute('checked'); + } + } + }); +}); + Date: Thu, 20 Oct 2016 18:28:25 +0200 Subject: [PATCH 033/164] add preset button for attributes takes over attribute value from previous version --- views/bootstrap/class.UpdateDocument.php | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/views/bootstrap/class.UpdateDocument.php b/views/bootstrap/class.UpdateDocument.php index 3bf912e2b..6da53d5b7 100644 --- a/views/bootstrap/class.UpdateDocument.php +++ b/views/bootstrap/class.UpdateDocument.php @@ -37,6 +37,8 @@ class SeedDMS_View_UpdateDocument extends SeedDMS_Bootstrap_Style { header('Content-Type: application/javascript'); $this->printDropFolderChooserJs("form1"); $this->printSelectPresetButtonJs(); + $this->printInputPresetButtonJs(); + $this->printCheckboxPresetButtonJs(); ?> function checkForm() { @@ -233,7 +235,23 @@ console.log(element); ?>
    getName()); ?>:printAttributeEditField($attrdef, '') ?>printAttributeEditField($attrdef, '') ?> +getAttributeValue($attrdef)) { + switch($attrdef->getType()) { + case SeedDMS_Core_AttributeDefinition::type_string: + case SeedDMS_Core_AttributeDefinition::type_date: + case SeedDMS_Core_AttributeDefinition::type_int: + case SeedDMS_Core_AttributeDefinition::type_float: + $this->printInputPresetButtonHtml('attributes_'.$attrdef->getID(), $latestContent->getAttributeValue($attrdef), $attrdef->getValueSetSeparator()); + break; + case SeedDMS_Core_AttributeDefinition::type_boolean: + $this->printCheckboxPresetButtonHtml('attributes_'.$attrdef->getID(), $latestContent->getAttributeValue($attrdef)); + break; + } +// print_r($latestContent->getAttributeValue($attrdef)); + } +?>
    ".getMLText("attribute_value")."".getMLText("attribute_count")."
    ".$entry['value']."".$entry['c']."
    ".$entry['value']."".$entry['c'].""; + /* Check if value is in value set */ + if($selattrdef->getValueSet()) { + if(false === array_search($entry['value'], $selattrdef->getValueSetAsArray())) + printMLText("attribute_value_not_in_valueset"); + } else { + } + echo "
    "; } From 269db21067239908fd0ed79a6950c5a7720a4b58 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 27 Oct 2016 07:09:15 +0200 Subject: [PATCH 041/164] use in_array() instead of array_search() --- views/bootstrap/class.AttributeMgr.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/views/bootstrap/class.AttributeMgr.php b/views/bootstrap/class.AttributeMgr.php index 0807a8249..994c5716f 100644 --- a/views/bootstrap/class.AttributeMgr.php +++ b/views/bootstrap/class.AttributeMgr.php @@ -98,9 +98,8 @@ $(document).ready( function() { echo ""; /* Check if value is in value set */ if($selattrdef->getValueSet()) { - if(false === array_search($entry['value'], $selattrdef->getValueSetAsArray())) + if(in_array($entry['value'], $selattrdef->getValueSetAsArray())) printMLText("attribute_value_not_in_valueset"); - } else { } echo ""; echo ""; From f616256509c73607bac40f28546607ae8c7418fb Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 27 Oct 2016 09:17:14 +0200 Subject: [PATCH 042/164] set check for boolean and date values, set more validation errors --- SeedDMS_Core/Core/inc.ClassAttribute.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/SeedDMS_Core/Core/inc.ClassAttribute.php b/SeedDMS_Core/Core/inc.ClassAttribute.php index e96ae8ed5..9962c0d81 100644 --- a/SeedDMS_Core/Core/inc.ClassAttribute.php +++ b/SeedDMS_Core/Core/inc.ClassAttribute.php @@ -898,15 +898,33 @@ class SeedDMS_Core_AttributeDefinition { /* {{{ */ $success = true; switch((string) $this->getType()) { + case self::type_boolean: + foreach($values as $value) { + $success &= preg_match('/^[01]$/', $value) ? true : false; + } + if(!$success) + $this->_validation_error = 8; + break; case self::type_int: foreach($values as $value) { $success &= preg_match('/^[0-9]*$/', $value) ? true : false; } + if(!$success) + $this->_validation_error = 6; + break; + case self::type_date: + foreach($values as $value) { + $success &= preg_match('/^[12][0-9]{3}-[01][0-9]-[0-9]{2}$/', $value) ? true : false; + } + if(!$success) + $this->_validation_error = 9; break; case self::type_float: foreach($values as $value) { $success &= is_numeric($value); } + if(!$success) + $this->_validation_error = 7; break; case self::type_string: if(trim($this->getRegex()) != '') { From 0c1f318709bb8cead2e37e37f965cdd1abe168ca Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 27 Oct 2016 09:18:01 +0200 Subject: [PATCH 043/164] add note for 5.0.7 --- SeedDMS_Core/package.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/SeedDMS_Core/package.xml b/SeedDMS_Core/package.xml index f5ccb5490..ba0ca53d0 100644 --- a/SeedDMS_Core/package.xml +++ b/SeedDMS_Core/package.xml @@ -25,6 +25,7 @@ GPL License - all changes from 4.3.30 merged +- better attribute value checking From 44f89b99497d9e5f90868d94fece89d5f33009aa Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 27 Oct 2016 09:18:45 +0200 Subject: [PATCH 044/164] add function getAttributeValidationText() --- inc/inc.Language.php | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/inc/inc.Language.php b/inc/inc.Language.php index d1f51ab14..68fac45bb 100644 --- a/inc/inc.Language.php +++ b/inc/inc.Language.php @@ -250,4 +250,42 @@ function getOverallStatusText($status) { /* {{{ */ } } /* }}} */ +function getAttributeValidationText($error, $attrname='', $attrvalue='') { /* {{{ */ + switch($error) { + case 10: + return getMLText("attr_not_in_valueset", array('attrname'=>$attrname, 'value'=>$attrvalue)); + break; + case 8: + return getMLText("attr_malformed_date", array('attrname'=>$attrname, 'value'=>$attrvalue)); + break; + case 8: + return getMLText("attr_malformed_boolean", array('attrname'=>$attrname, 'value'=>$attrvalue)); + break; + case 7: + return getMLText("attr_malformed_float", array('attrname'=>$attrname, 'value'=>$attrvalue)); + break; + case 6: + return getMLText("attr_malformed_int", array('attrname'=>$attrname, 'value'=>$attrvalue)); + break; + case 5: + return getMLText("attr_malformed_email", array('attrname'=>$attrname, 'value'=>$attrvalue)); + break; + case 4: + return getMLText("attr_malformed_url", array('attrname'=>$attrname, 'value'=>$attrvalue)); + break; + case 3: + return getMLText("attr_no_regex_match", array('attrname'=>$attrname, 'value'=>$attrvalue)); + break; + case 2: + return getMLText("attr_max_values", array('attrname'=>$attrname, 'value'=>$attrvalue)); + break; + case 1: + return getMLText("attr_min_values", array('attrname'=>$attrname, 'value'=>$attrvalue)); + break; + default: + return getMLText("attr_validation_error", array('attrname'=>$attrname, 'value'=>$attrvalue)); + break; + } +} /* }}} */ + ?> From 02d641786bf96f00d171c5b9626032b8227c3322 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 27 Oct 2016 09:19:35 +0200 Subject: [PATCH 045/164] use same attribute validation based on SeedDMS_Core::AttributeDefinition->validate() and getAttributeValidationText() --- controllers/class.EditFolder.php | 40 ++------------------------ op/op.AddDocument.php | 17 ++--------- op/op.AddSubFolder.php | 15 ++-------- op/op.EditDocument.php | 36 ++--------------------- views/bootstrap/class.AttributeMgr.php | 5 ++-- 5 files changed, 12 insertions(+), 101 deletions(-) diff --git a/controllers/class.EditFolder.php b/controllers/class.EditFolder.php index 03d01c327..44b0c174d 100644 --- a/controllers/class.EditFolder.php +++ b/controllers/class.EditFolder.php @@ -55,46 +55,10 @@ class SeedDMS_Controller_EditFolder extends SeedDMS_Controller_Common { $attrdef = $dms->getAttributeDefinition($attrdefid); if($attribute) { if(!$attrdef->validate($attribute)) { - $this->error = $attrdef->getValidationError(); - switch($attrdef->getValidationError()) { - case 5: - $this->errormsg = getMLText("attr_malformed_email", array("attrname"=>$attrdef->getName(), "value"=>$attribute)); - break; - case 4: - $this->errormsg = getMLText("attr_malformed_url", array("attrname"=>$attrdef->getName(), "value"=>$attribute)); - break; - case 3: - $this->errormsg = getMLText("attr_no_regex_match", array("attrname"=>$attrdef->getName(), "value"=>$attribute, "regex"=>$attrdef->getRegex())); - break; - case 2: - $this->errormsg = getMLText("attr_max_values", array("attrname"=>$attrdef->getName())); - break; - case 1: - $this->errormsg = getMLText("attr_min_values", array("attrname"=>$attrdef->getName())); - break; - default: - $this->errormsg = getMLText("error_occured"); - } + $this->errormsg = getAttributeValidationText($attrdef->getValidationError(), $attrdef->getName(), $attribute); return false; } - /* - if($attrdef->getRegex()) { - if(!preg_match($attrdef->getRegex(), $attribute)) { - $this->error = 1; - return false; - } - } - if(is_array($attribute)) { - if($attrdef->getMinValues() > count($attribute)) { - $this->error = 2; - return false; - } - if($attrdef->getMaxValues() && $attrdef->getMaxValues() < count($attribute)) { - $this->error = 3; - return false; - } - } - */ + if(!isset($oldattributes[$attrdefid]) || $attribute != $oldattributes[$attrdefid]->getValue()) { if(!$folder->setAttributeValue($dms->getAttributeDefinition($attrdefid), $attribute)) return false; diff --git a/op/op.AddDocument.php b/op/op.AddDocument.php index 7068a184a..2741aed8c 100644 --- a/op/op.AddDocument.php +++ b/op/op.AddDocument.php @@ -97,21 +97,10 @@ else foreach($attributes_version as $attrdefid=>$attribute) { $attrdef = $dms->getAttributeDefinition($attrdefid); if($attribute) { - if($attrdef->getRegex()) { - if(!preg_match($attrdef->getRegex(), $attribute)) { - UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("attr_no_regex_match")); - } + if(!$attrdef->validate($attribute)) { + $errmsg = getAttributeValidationText($attrdef->getValidationError(), $attrdef->getName(), $attribute); + UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),$errmsg); } - if(is_array($attribute)) { - if($attrdef->getMinValues() > count($attribute)) { - UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("attr_min_values", array("attrname"=>$attrdef->getName()))); - } - if($attrdef->getMaxValues() && $attrdef->getMaxValues() < count($attribute)) { - UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("attr_max_values", array("attrname"=>$attrdef->getName()))); - } - } - } elseif($attrdef->getMinValues() > 0) { - UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("attr_min_values", array("attrname"=>$attrdef->getName()))); } } diff --git a/op/op.AddSubFolder.php b/op/op.AddSubFolder.php index 4ebd2fe9e..eedd0cda8 100644 --- a/op/op.AddSubFolder.php +++ b/op/op.AddSubFolder.php @@ -66,18 +66,9 @@ else foreach($attributes as $attrdefid=>$attribute) { $attrdef = $dms->getAttributeDefinition($attrdefid); if($attribute) { - if($attrdef->getRegex()) { - if(!preg_match($attrdef->getRegex(), $attribute)) { - UI::exitError(getMLText("folder_title", array("foldername" => $document->getName())),getMLText("attr_no_regex_match")); - } - } - if(is_array($attribute)) { - if($attrdef->getMinValues() > count($attribute)) { - UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("attr_min_values", array("attrname"=>$attrdef->getName()))); - } - if($attrdef->getMaxValues() && $attrdef->getMaxValues() < count($attribute)) { - UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("attr_max_values", array("attrname"=>$attrdef->getName()))); - } + if(!$attrdef->validate($attribute)) { + $errmsg = getAttributeValidationText($attrdef->getValidationError(), $attrdef->getName(), $attribute); + UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())), $errmsg); } } } diff --git a/op/op.EditDocument.php b/op/op.EditDocument.php index 046cabe31..d8fd39f18 100644 --- a/op/op.EditDocument.php +++ b/op/op.EditDocument.php @@ -261,41 +261,9 @@ if($attributes) { $attrdef = $dms->getAttributeDefinition($attrdefid); if($attribute) { if(!$attrdef->validate($attribute)) { - switch($attrdef->getValidationError()) { - case 5: - UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("attr_malformed_email", array("attrname"=>$attrdef->getName(), "value"=>$attribute))); - break; - case 4: - UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("attr_malformed_url", array("attrname"=>$attrdef->getName(), "value"=>$attribute))); - break; - case 3: - UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("attr_no_regex_match", array("attrname"=>$attrdef->getName(), "value"=>$attribute, "regex"=>$attrdef->getRegex()))); - break; - case 2: - UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("attr_max_values", array("attrname"=>$attrdef->getName()))); - break; - case 1: - UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("attr_min_values", array("attrname"=>$attrdef->getName()))); - break; - default: - UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("error_occured")); - } + $errmsg = getAttributeValidationText($attrdef->getValidationError(), $attrdef->getName(), $attribute); + UI::exitError(getMLText("document_title", array("documentname" => $document->getName())), $errmsg); } - /* - if($attrdef->getRegex()) { - if(!preg_match($attrdef->getRegex(), $attribute)) { - UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("attr_no_regex_match")); - } - } - if(is_array($attribute)) { - if($attrdef->getMinValues() > count($attribute)) { - UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("attr_min_values", array("attrname"=>$attrdef->getName()))); - } - if($attrdef->getMaxValues() && $attrdef->getMaxValues() < count($attribute)) { - UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("attr_max_values", array("attrname"=>$attrdef->getName()))); - } - } - */ if(!isset($oldattributes[$attrdefid]) || $attribute != $oldattributes[$attrdefid]->getValue()) { if(!$document->setAttributeValue($dms->getAttributeDefinition($attrdefid), $attribute)) UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("error_occured")); diff --git a/views/bootstrap/class.AttributeMgr.php b/views/bootstrap/class.AttributeMgr.php index 25742ae84..799118689 100644 --- a/views/bootstrap/class.AttributeMgr.php +++ b/views/bootstrap/class.AttributeMgr.php @@ -97,9 +97,8 @@ $(document).ready( function() { /* various checks, if the value is valid */ echo ""; /* Check if value is in value set */ - if($selattrdef->getValueSet()) { - if(in_array($entry['value'], $selattrdef->getValueSetAsArray())) - printMLText("attribute_value_not_in_valueset"); + if(!$selattrdef->validate($entry['value'])) { + echo getAttributeValidationText($selattrdef->getValidationError(), $selattrdef->getName(), $entry['value']); } echo ""; echo ""; From 8ab2db8e686a022d5cc8f75576167403f0537b04 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 27 Oct 2016 09:21:13 +0200 Subject: [PATCH 046/164] add more error messages for attribute value validation --- languages/ar_EG/lang.inc | 7 +++++++ languages/bg_BG/lang.inc | 7 +++++++ languages/ca_ES/lang.inc | 7 +++++++ languages/cs_CZ/lang.inc | 7 +++++++ languages/de_DE/lang.inc | 13 ++++++++++--- languages/el_GR/lang.inc | 7 +++++++ languages/en_GB/lang.inc | 9 ++++++++- languages/es_ES/lang.inc | 7 +++++++ languages/fr_FR/lang.inc | 7 +++++++ languages/hr_HR/lang.inc | 7 +++++++ languages/hu_HU/lang.inc | 7 +++++++ languages/it_IT/lang.inc | 7 +++++++ languages/ko_KR/lang.inc | 7 +++++++ languages/nl_NL/lang.inc | 7 +++++++ languages/pl_PL/lang.inc | 7 +++++++ languages/pt_BR/lang.inc | 7 +++++++ languages/ro_RO/lang.inc | 7 +++++++ languages/ru_RU/lang.inc | 7 +++++++ languages/sk_SK/lang.inc | 7 +++++++ languages/sv_SE/lang.inc | 7 +++++++ languages/tr_TR/lang.inc | 7 +++++++ languages/uk_UA/lang.inc | 7 +++++++ languages/zh_CN/lang.inc | 7 +++++++ languages/zh_TW/lang.inc | 7 +++++++ 24 files changed, 172 insertions(+), 4 deletions(-) diff --git a/languages/ar_EG/lang.inc b/languages/ar_EG/lang.inc index 1caed9c4f..1797e244e 100644 --- a/languages/ar_EG/lang.inc +++ b/languages/ar_EG/lang.inc @@ -158,11 +158,17 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - تم تغيير سمة', 'attribute_count' => 'ﻉﺩﺩ ﻡﺭﺎﺗ ﺍﻸﺴﺘﺧﺩﺎﻣ', 'attribute_value' => 'ﻖﻴﻣﺓ ﺎﻠﺴﻣﺓ', +'attr_malformed_boolean' => '', +'attr_malformed_date' => '', 'attr_malformed_email' => '', +'attr_malformed_float' => '', +'attr_malformed_int' => '', 'attr_malformed_url' => '', 'attr_max_values' => '', 'attr_min_values' => '', +'attr_not_in_valueset' => '', 'attr_no_regex_match' => '', +'attr_validation_error' => '', 'at_least_n_users_of_group' => '', 'august' => 'أغسطس', 'authentication' => '', @@ -1271,6 +1277,7 @@ URL: [url]', 'splash_add_group_member' => '', 'splash_add_role' => '', 'splash_add_to_transmittal' => '', +'splash_add_transmittal' => '', 'splash_add_user' => '', 'splash_clearcache' => '', 'splash_cleared_clipboard' => '', diff --git a/languages/bg_BG/lang.inc b/languages/bg_BG/lang.inc index fcf7b7e2b..8084082c1 100644 --- a/languages/bg_BG/lang.inc +++ b/languages/bg_BG/lang.inc @@ -143,11 +143,17 @@ $text = array( 'attribute_changed_email_subject' => '', 'attribute_count' => '', 'attribute_value' => '', +'attr_malformed_boolean' => '', +'attr_malformed_date' => '', 'attr_malformed_email' => '', +'attr_malformed_float' => '', +'attr_malformed_int' => '', 'attr_malformed_url' => '', 'attr_max_values' => '', 'attr_min_values' => '', +'attr_not_in_valueset' => '', 'attr_no_regex_match' => '', +'attr_validation_error' => '', 'at_least_n_users_of_group' => '', 'august' => 'Август', 'authentication' => '', @@ -1136,6 +1142,7 @@ $text = array( 'splash_add_group_member' => '', 'splash_add_role' => '', 'splash_add_to_transmittal' => '', +'splash_add_transmittal' => '', 'splash_add_user' => '', 'splash_clearcache' => '', 'splash_cleared_clipboard' => '', diff --git a/languages/ca_ES/lang.inc b/languages/ca_ES/lang.inc index da60fac74..65cf5696c 100644 --- a/languages/ca_ES/lang.inc +++ b/languages/ca_ES/lang.inc @@ -148,11 +148,17 @@ URL: [url]', 'attribute_changed_email_subject' => '', 'attribute_count' => '', 'attribute_value' => '', +'attr_malformed_boolean' => '', +'attr_malformed_date' => '', 'attr_malformed_email' => '', +'attr_malformed_float' => '', +'attr_malformed_int' => '', 'attr_malformed_url' => '', 'attr_max_values' => '', 'attr_min_values' => '', +'attr_not_in_valueset' => '', 'attr_no_regex_match' => '', +'attr_validation_error' => '', 'at_least_n_users_of_group' => '', 'august' => 'Agost', 'authentication' => '', @@ -1141,6 +1147,7 @@ URL: [url]', 'splash_add_group_member' => '', 'splash_add_role' => '', 'splash_add_to_transmittal' => '', +'splash_add_transmittal' => '', 'splash_add_user' => '', 'splash_clearcache' => '', 'splash_cleared_clipboard' => '', diff --git a/languages/cs_CZ/lang.inc b/languages/cs_CZ/lang.inc index b6aa08fc8..198a250d8 100644 --- a/languages/cs_CZ/lang.inc +++ b/languages/cs_CZ/lang.inc @@ -165,11 +165,17 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Atributy změněny', 'attribute_count' => 'Počet použití', 'attribute_value' => 'Hodnota atributu', +'attr_malformed_boolean' => '', +'attr_malformed_date' => '', 'attr_malformed_email' => '', +'attr_malformed_float' => '', +'attr_malformed_int' => '', 'attr_malformed_url' => '', 'attr_max_values' => 'Maximální počet pažadovaných hodnot pro atribut [attrname] je překročen.', 'attr_min_values' => 'Není dosaženo minimálního počtu požadovaných hodnot pro atribut [attrname].', +'attr_not_in_valueset' => '', 'attr_no_regex_match' => 'Hodnota atributu nesouhlasí s regulárním výrazem', +'attr_validation_error' => '', 'at_least_n_users_of_group' => 'Alespoň [number_of_users] uživatelů z [group]', 'august' => 'Srpen', 'authentication' => 'Autentizace', @@ -1280,6 +1286,7 @@ URL: [url]', 'splash_add_group_member' => 'Přidán nový člen skupiny', 'splash_add_role' => '', 'splash_add_to_transmittal' => '', +'splash_add_transmittal' => '', 'splash_add_user' => 'Přidán nový uživatel', 'splash_clearcache' => '', 'splash_cleared_clipboard' => 'Schránka vymazána', diff --git a/languages/de_DE/lang.inc b/languages/de_DE/lang.inc index 1dcb9b18f..6139d6a2f 100644 --- a/languages/de_DE/lang.inc +++ b/languages/de_DE/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (2310), dgrutsch (21) +// Translators: Admin (2319), dgrutsch (21) $text = array( '2_factor_auth' => '2-Faktor Authentifizierung', @@ -170,11 +170,17 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Attribut geändert', 'attribute_count' => 'Anzahl Verwendungen', 'attribute_value' => 'Attributwert', +'attr_malformed_boolean' => 'Der Attributwert \'[value]\' des Attributs \'[attrname]\' ist kein gültiger Ja/Nein-Wert.', +'attr_malformed_date' => 'Der Attributwert \'[value]\' des Attributs \'[attrname]\' ist kein gültiges Datum.', 'attr_malformed_email' => 'Der Attributwert \'[value]\' des Attributs \'[attrname]\' ist keine gültige E-Mail.', +'attr_malformed_float' => 'Der Attributwert \'[value]\' des Attributs \'[attrname]\' ist keine Dezimalzahl.', +'attr_malformed_int' => 'Der Attributwert \'[value]\' des Attributs \'[attrname]\' ist kein ganzzahliger Wert.', 'attr_malformed_url' => 'Der Attributwert \'[value]\' des Attributs \'[attrname]\' ist keine gültige URL.', 'attr_max_values' => 'Die maximale Anzahl der erlaubten Werte für das Attribut [attrname] ist überschritten.', 'attr_min_values' => 'Die minimal Anzahl von Werte für das Attribut [attrname] ist nicht erreicht.', +'attr_not_in_valueset' => 'Der Attributwert \'[value]\' des Attributs \'[attrname]\' ist nicht in der Werteauswahl.', 'attr_no_regex_match' => 'Der Attributwert \'[value]\' des Attributs \'[attrname]\' passt nicht zum regulären Ausdruck \'[regex]\'', +'attr_validation_error' => 'Der Attributwert \'[value]\' des Attributs \'[attrname]\' ist ungültig.', 'at_least_n_users_of_group' => 'Mindestens [number_of_users] Benutzer der Gruppe [group]', 'august' => 'August', 'authentication' => 'Authentifizierung', @@ -1084,8 +1090,8 @@ URL: [url]', 'settings_Edition' => 'Funktions-Einstellungen', 'settings_editOnlineFileTypes' => 'Dateitypen für Online-Editieren:', 'settings_editOnlineFileTypes_desc' => 'Dateien mit den angegebenen Endungen können Online editiert werden (benutzen Sie ausschließlich Kleinbuchstaben).', -'settings_enable2FactorAuthentication' => '', -'settings_enable2FactorAuthentication_desc' => '', +'settings_enable2FactorAuthentication' => '2-Faktor Authentifizierung einschalten', +'settings_enable2FactorAuthentication_desc' => 'Schaltet die 2-Faktor Authentifizierung ein, welche den Google Authenticator auf dem Mobiltelefon erfordert.', 'settings_enableAcknowledgeWorkflow' => 'Ermögliche Bestätigung des Dokumentenempfang', 'settings_enableAcknowledgeWorkflow_desc' => 'Anwählen, um den Workflow zur Kenntnisnahme von Dokumenten einzuschalten', 'settings_enableAdminRevApp' => 'Admin darf freigeben/prüfen', @@ -1323,6 +1329,7 @@ URL: [url]', 'splash_add_group_member' => 'Neues Gruppenmitglied hinzugefügt', 'splash_add_role' => 'Neue Rolle hinzugefügt', 'splash_add_to_transmittal' => 'Zur Dokumentenliste hinzugefügt', +'splash_add_transmittal' => 'Dokumentenliste angelegt', 'splash_add_user' => 'Neuen Benutzer hinzugefügt', 'splash_clearcache' => 'Cache geleert', 'splash_cleared_clipboard' => 'Zwischenablage geleert', diff --git a/languages/el_GR/lang.inc b/languages/el_GR/lang.inc index aeba14e17..3df67683b 100644 --- a/languages/el_GR/lang.inc +++ b/languages/el_GR/lang.inc @@ -143,11 +143,17 @@ $text = array( 'attribute_changed_email_subject' => '', 'attribute_count' => '', 'attribute_value' => '', +'attr_malformed_boolean' => '', +'attr_malformed_date' => '', 'attr_malformed_email' => '', +'attr_malformed_float' => '', +'attr_malformed_int' => '', 'attr_malformed_url' => '', 'attr_max_values' => '', 'attr_min_values' => '', +'attr_not_in_valueset' => '', 'attr_no_regex_match' => '', +'attr_validation_error' => '', 'at_least_n_users_of_group' => '', 'august' => 'Αύγουστος', 'authentication' => '', @@ -1147,6 +1153,7 @@ URL: [url]', 'splash_add_group_member' => '', 'splash_add_role' => '', 'splash_add_to_transmittal' => '', +'splash_add_transmittal' => '', 'splash_add_user' => '', 'splash_clearcache' => '', 'splash_cleared_clipboard' => '', diff --git a/languages/en_GB/lang.inc b/languages/en_GB/lang.inc index 87aebd690..5a252dc3c 100644 --- a/languages/en_GB/lang.inc +++ b/languages/en_GB/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (1448), dgrutsch (7), netixw (14) +// Translators: Admin (1455), dgrutsch (7), netixw (14) $text = array( '2_factor_auth' => '2-factor authentication', @@ -170,11 +170,17 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Attribute changed', 'attribute_count' => 'Number of uses', 'attribute_value' => 'Value of attribute', +'attr_malformed_boolean' => 'The attribute value \'[value]\' of attribute \'[attrname]\' is not a valid boolean.', +'attr_malformed_date' => 'The attribute value \'[value]\' of attribute \'[attrname]\' is not a valid date.', 'attr_malformed_email' => 'The attribute value \'[value]\' of attribute \'[attrname]\' is not a valid URL.', +'attr_malformed_float' => 'The attribute value \'[value]\' of attribute \'[attrname]\' is not a valid float.', +'attr_malformed_int' => 'The attribute value \'[value]\' of attribute \'[attrname]\' is not a valid integer.', 'attr_malformed_url' => 'The attribute value \'[value]\' of attribute \'[attrname]\' is not a valid URL.', 'attr_max_values' => 'The maximum number of required values for attribute [attrname] is exceeded.', 'attr_min_values' => 'The minimum number of required values for attribute [attrname] is not reached.', +'attr_not_in_valueset' => 'The attribute value \'[value]\' for attribute \'[attrname]\' is not contained in the valueset.', 'attr_no_regex_match' => 'The attribute value \'[value]\' for attribute \'[attrname]\' does not match the regular expression \'[regex]\'', +'attr_validation_error' => 'The value \'[value]\' of attribute \'[attrname]\' is invalid.', 'at_least_n_users_of_group' => 'At least [number_of_users] users of [group]', 'august' => 'August', 'authentication' => 'Authentication', @@ -1318,6 +1324,7 @@ URL: [url]', 'splash_add_group_member' => 'New group member added', 'splash_add_role' => 'Added new role', 'splash_add_to_transmittal' => 'Add to transmittal', +'splash_add_transmittal' => 'Added transmittal', 'splash_add_user' => 'New user added', 'splash_clearcache' => 'Cache cleared', 'splash_cleared_clipboard' => 'Clipboard cleared', diff --git a/languages/es_ES/lang.inc b/languages/es_ES/lang.inc index 4dd98376d..2af9a3861 100644 --- a/languages/es_ES/lang.inc +++ b/languages/es_ES/lang.inc @@ -165,11 +165,17 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Atributo modificado', 'attribute_count' => 'Cantidad de usos', 'attribute_value' => 'Valor del atributo', +'attr_malformed_boolean' => '', +'attr_malformed_date' => '', 'attr_malformed_email' => '', +'attr_malformed_float' => '', +'attr_malformed_int' => '', 'attr_malformed_url' => '', 'attr_max_values' => '', 'attr_min_values' => '', +'attr_not_in_valueset' => '', 'attr_no_regex_match' => 'El valor del atributo no concuerda con la expresión regular', +'attr_validation_error' => '', 'at_least_n_users_of_group' => 'Al menos [number_of_users] usuarios de [group]', 'august' => 'Agosto', 'authentication' => 'Autenticación', @@ -1286,6 +1292,7 @@ URL: [url]', 'splash_add_group_member' => 'Nuevo miembro del grupo agregado', 'splash_add_role' => '', 'splash_add_to_transmittal' => '', +'splash_add_transmittal' => '', 'splash_add_user' => 'Nuevo usuario agregado', 'splash_clearcache' => '', 'splash_cleared_clipboard' => 'Portapapeles limpiado', diff --git a/languages/fr_FR/lang.inc b/languages/fr_FR/lang.inc index 9912ae2e0..98abda493 100644 --- a/languages/fr_FR/lang.inc +++ b/languages/fr_FR/lang.inc @@ -165,11 +165,17 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Attribut changé', 'attribute_count' => 'Nombre d\'utilisations', 'attribute_value' => 'Valeur de l\'attribut', +'attr_malformed_boolean' => '', +'attr_malformed_date' => '', 'attr_malformed_email' => '', +'attr_malformed_float' => '', +'attr_malformed_int' => '', 'attr_malformed_url' => '', 'attr_max_values' => 'Le nombre maximum de valeurs pour l\'attribut [attrname] est dépassé', 'attr_min_values' => 'Le nombre minimum de valeurs pour l\'attribut [attrname] n\'est pas atteint', +'attr_not_in_valueset' => '', 'attr_no_regex_match' => 'La valeur de l\'attribut ne correspond pas à l\'expression régulière.', +'attr_validation_error' => '', 'at_least_n_users_of_group' => 'Au moins [number_of_users] utilisateurs de [group]', 'august' => 'Août', 'authentication' => 'Authentification', @@ -1262,6 +1268,7 @@ URL: [url]', 'splash_add_group_member' => 'Nouveau membre ajouté au groupe', 'splash_add_role' => '', 'splash_add_to_transmittal' => '', +'splash_add_transmittal' => '', 'splash_add_user' => 'Nouvel utilisateur ajouté', 'splash_clearcache' => '', 'splash_cleared_clipboard' => 'Presse-papier vidé', diff --git a/languages/hr_HR/lang.inc b/languages/hr_HR/lang.inc index a8abac456..7ea0151de 100644 --- a/languages/hr_HR/lang.inc +++ b/languages/hr_HR/lang.inc @@ -170,11 +170,17 @@ Internet poveznica: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Promijenjen atribut', 'attribute_count' => 'Broj uporaba', 'attribute_value' => 'Vrijednost atributa', +'attr_malformed_boolean' => '', +'attr_malformed_date' => '', 'attr_malformed_email' => 'Vrijednost atributa \'[value]\' za atribut \'[attrname]\' nije važeći URL.', +'attr_malformed_float' => '', +'attr_malformed_int' => '', 'attr_malformed_url' => 'Vrijednost atributa \'[value]\' za atribut \'[attrname]\' nije važeći URL.', 'attr_max_values' => 'Premašen je maksimalni broj zahtjevanih vrijednosti za atribute[attrname].', 'attr_min_values' => 'Minimalni broj zahtjevanih vrijednosti za atribute[attrname] nije dostignut.', +'attr_not_in_valueset' => '', 'attr_no_regex_match' => 'Vrijednost atributa ne odgovara pravilnom izrazu', +'attr_validation_error' => '', 'at_least_n_users_of_group' => 'Najmanje [number_of_users] korisnika iz [group]', 'august' => 'Kolovoz', 'authentication' => 'Ovjera', @@ -1307,6 +1313,7 @@ Internet poveznica: [url]', 'splash_add_group_member' => 'Dodan novi član grupe', 'splash_add_role' => '', 'splash_add_to_transmittal' => '', +'splash_add_transmittal' => '', 'splash_add_user' => 'Dodan novi korisnik', 'splash_clearcache' => '', 'splash_cleared_clipboard' => 'Očišćen međuspremnik', diff --git a/languages/hu_HU/lang.inc b/languages/hu_HU/lang.inc index 9d3515147..8be5f45f6 100644 --- a/languages/hu_HU/lang.inc +++ b/languages/hu_HU/lang.inc @@ -165,11 +165,17 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Jellemző módosult', 'attribute_count' => 'Felhasználók száma', 'attribute_value' => 'Tulajdonság értéke', +'attr_malformed_boolean' => '', +'attr_malformed_date' => '', 'attr_malformed_email' => '', +'attr_malformed_float' => '', +'attr_malformed_int' => '', 'attr_malformed_url' => '', 'attr_max_values' => '', 'attr_min_values' => '', +'attr_not_in_valueset' => '', 'attr_no_regex_match' => 'A jellemző értéke nem felel meg a szabályos kifejezésnek', +'attr_validation_error' => '', 'at_least_n_users_of_group' => 'Legalább [number_of_users] felhasználó a [group] csoportban', 'august' => 'Augusztus', 'authentication' => 'Hitelesítés', @@ -1285,6 +1291,7 @@ URL: [url]', 'splash_add_group_member' => 'Új csoporttag hozzáadva', 'splash_add_role' => '', 'splash_add_to_transmittal' => '', +'splash_add_transmittal' => '', 'splash_add_user' => 'Új felhasználó hozzáadva', 'splash_clearcache' => '', 'splash_cleared_clipboard' => 'Vágólap törölve', diff --git a/languages/it_IT/lang.inc b/languages/it_IT/lang.inc index ac0037984..f645d50d7 100644 --- a/languages/it_IT/lang.inc +++ b/languages/it_IT/lang.inc @@ -170,12 +170,18 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Attributo modificato', 'attribute_count' => 'Numero di utilizzi', 'attribute_value' => 'Valore dell\'Attributo', +'attr_malformed_boolean' => '', +'attr_malformed_date' => '', 'attr_malformed_email' => 'Il valore di \'[value]\' dell, => attributo \'[attrname]\' non é un URL valido.', +'attr_malformed_float' => '', +'attr_malformed_int' => '', 'attr_malformed_url' => 'Il valore dell\'attributo \'[valore]\' di attributo \'[attrname]\' non è un URL valido.', 'attr_max_values' => 'Il numero massimo dei valori richiesti per l\'Attributo [attrname] è superato.', 'attr_min_values' => 'Il numero minimo di valori richiesti per l\'Attributo [attrname] non è raggiunto.', +'attr_not_in_valueset' => '', 'attr_no_regex_match' => 'Il valore dell\'Attributo non è conforme ad un\'espressione regolare.', +'attr_validation_error' => '', 'at_least_n_users_of_group' => 'Minimo [number_of_users] utenti del gruppo [group]', 'august' => 'Agosto', 'authentication' => 'Autenticazione', @@ -1319,6 +1325,7 @@ URL: [url]', 'splash_add_group_member' => 'Membro aggiunto al gruppo', 'splash_add_role' => 'Aggiunto nuovo ruolo', 'splash_add_to_transmittal' => 'Aggiungere alla trasmissione', +'splash_add_transmittal' => '', 'splash_add_user' => 'Utente aggiunto', 'splash_clearcache' => 'Cache cancellata', 'splash_cleared_clipboard' => 'Appunti cancellati', diff --git a/languages/ko_KR/lang.inc b/languages/ko_KR/lang.inc index 881a6f7b7..ce170ddc3 100644 --- a/languages/ko_KR/lang.inc +++ b/languages/ko_KR/lang.inc @@ -170,12 +170,18 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename] : [name] - 속성이 변경', 'attribute_count' => '사용자수', 'attribute_value' => '속성', +'attr_malformed_boolean' => '', +'attr_malformed_date' => '', 'attr_malformed_email' => '속성값 \'[value]\' \'[attrname]\'은(는) 유효한 URL이 아닙니다.', +'attr_malformed_float' => '', +'attr_malformed_int' => '', 'attr_malformed_url' => '속성값 \'[value]\' \'[attrname]\'은(는) 유효한 URL이 아닙니다.', 'attr_max_values' => '속성[attrname]값이 필요한 최대수에 도달하지 못했습니다.', 'attr_min_values' => '속성[attrname]값이 필요한 최소수에 도달하지 못했습니다.', +'attr_not_in_valueset' => '', 'attr_no_regex_match' => '속성값이 정규 표현식과 불일치 속성값 \'[value]\' \'[attrname]\'은(는) 정규 표현에 일치 하지 않는 \'[regex]\'', +'attr_validation_error' => '', 'at_least_n_users_of_group' => 'At least [number_of_users] users of [group] 적어도 [number_of_users]의 사용자 [group]', 'august' => '8월', @@ -1300,6 +1306,7 @@ URL : [url]', 'splash_add_group_member' => '새 그룹 구성원 추가', 'splash_add_role' => '', 'splash_add_to_transmittal' => '', +'splash_add_transmittal' => '', 'splash_add_user' => '새 사용자 추가', 'splash_clearcache' => '', 'splash_cleared_clipboard' => '클립 보드 비우기', diff --git a/languages/nl_NL/lang.inc b/languages/nl_NL/lang.inc index 4548952a6..5e3a7be7d 100644 --- a/languages/nl_NL/lang.inc +++ b/languages/nl_NL/lang.inc @@ -163,11 +163,17 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Attribuut gewijzigd', 'attribute_count' => 'Aantal maal gebruikt', 'attribute_value' => 'Waarde van het attribuut', +'attr_malformed_boolean' => '', +'attr_malformed_date' => '', 'attr_malformed_email' => 'Foute vormgeving email', +'attr_malformed_float' => '', +'attr_malformed_int' => '', 'attr_malformed_url' => 'Foute url', 'attr_max_values' => 'attribuut: maximale waarde', 'attr_min_values' => 'attribuut: minimale waarde', +'attr_not_in_valueset' => '', 'attr_no_regex_match' => 'De waarde van het attribuut komt niet overeen met de veelgebruikte uitdrukking (regular expression)', +'attr_validation_error' => '', 'at_least_n_users_of_group' => 'Minimaal [number_of_users] gebruikers van [group]', 'august' => 'augustus', 'authentication' => 'Authentificatie', @@ -1313,6 +1319,7 @@ URL: [url]', 'splash_add_group_member' => 'Nieuwe groepslid toegevoegd', 'splash_add_role' => 'Nieuwe rol toegevoegd', 'splash_add_to_transmittal' => 'Toevoegen aan verzending', +'splash_add_transmittal' => '', 'splash_add_user' => 'Nieuwe gebruiker toegevoegd', 'splash_clearcache' => '', 'splash_cleared_clipboard' => 'Klembord leeg gemaakt', diff --git a/languages/pl_PL/lang.inc b/languages/pl_PL/lang.inc index 4ab736c96..70b4f8ede 100644 --- a/languages/pl_PL/lang.inc +++ b/languages/pl_PL/lang.inc @@ -158,11 +158,17 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Zmiana atrybutu', 'attribute_count' => 'liczba użyć', 'attribute_value' => 'wartość atrybutu', +'attr_malformed_boolean' => '', +'attr_malformed_date' => '', 'attr_malformed_email' => '', +'attr_malformed_float' => '', +'attr_malformed_int' => '', 'attr_malformed_url' => '', 'attr_max_values' => '', 'attr_min_values' => '', +'attr_not_in_valueset' => '', 'attr_no_regex_match' => 'Wartość atrybutu nie pasuje do wyrażenia regularnego', +'attr_validation_error' => '', 'at_least_n_users_of_group' => 'Przynajmniej [number_of_users] użytkowników grupy [group]', 'august' => 'Sierpień', 'authentication' => 'Autoryzacja', @@ -1265,6 +1271,7 @@ URL: [url]', 'splash_add_group_member' => 'Dodano nowego członka grupy', 'splash_add_role' => '', 'splash_add_to_transmittal' => '', +'splash_add_transmittal' => '', 'splash_add_user' => 'Dodano nowego użytkownika', 'splash_clearcache' => '', 'splash_cleared_clipboard' => 'Wyczyszczono schowek', diff --git a/languages/pt_BR/lang.inc b/languages/pt_BR/lang.inc index c26e769fa..ea655b91f 100644 --- a/languages/pt_BR/lang.inc +++ b/languages/pt_BR/lang.inc @@ -165,11 +165,17 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Atributo modificado', 'attribute_count' => 'Número de utilizações', 'attribute_value' => 'Valor do atributo', +'attr_malformed_boolean' => '', +'attr_malformed_date' => '', 'attr_malformed_email' => '', +'attr_malformed_float' => '', +'attr_malformed_int' => '', 'attr_malformed_url' => '', 'attr_max_values' => '', 'attr_min_values' => '', +'attr_not_in_valueset' => '', 'attr_no_regex_match' => 'O valor do atributo não corresponde à expressão regular', +'attr_validation_error' => '', 'at_least_n_users_of_group' => 'Pelo menos [nuber_of_users] usuários de [group]', 'august' => 'August', 'authentication' => 'Autenticação', @@ -1283,6 +1289,7 @@ URL: [url]', 'splash_add_group_member' => 'Novo membro do grupo adicionado', 'splash_add_role' => '', 'splash_add_to_transmittal' => '', +'splash_add_transmittal' => '', 'splash_add_user' => 'Novo usuário adicionado', 'splash_clearcache' => '', 'splash_cleared_clipboard' => 'Área de transferência limpada', diff --git a/languages/ro_RO/lang.inc b/languages/ro_RO/lang.inc index 92aa89afe..c29fc4296 100644 --- a/languages/ro_RO/lang.inc +++ b/languages/ro_RO/lang.inc @@ -170,11 +170,17 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Atribut schimbat', 'attribute_count' => 'Numărul de utilizări', 'attribute_value' => 'Valoare atribut', +'attr_malformed_boolean' => '', +'attr_malformed_date' => '', 'attr_malformed_email' => 'Valoarea \'[value]\' a atributului \'[attrname]\' nu este o adresa URL valida.', +'attr_malformed_float' => '', +'attr_malformed_int' => '', 'attr_malformed_url' => 'Valoarea \'[value]\' a atributului \'[attrname]\' nu este o adresa URL valida.', 'attr_max_values' => 'Numărul maxim de valori necesare pentru atributul [attrname] este depășit.', 'attr_min_values' => 'Numărul minim de valori necesare pentru atributul [attrname] nu este atins.', +'attr_not_in_valueset' => '', 'attr_no_regex_match' => 'Valoarea atributului nu se potrivește cu expresia regulată', +'attr_validation_error' => '', 'at_least_n_users_of_group' => 'Cel puțin [number_of_users] utilizatori in [group]', 'august' => 'August', 'authentication' => 'Autentificare', @@ -1308,6 +1314,7 @@ URL: [url]', 'splash_add_group_member' => 'Membru grup nou adăugat', 'splash_add_role' => '', 'splash_add_to_transmittal' => '', +'splash_add_transmittal' => '', 'splash_add_user' => 'Utilizator nou adăugat', 'splash_clearcache' => '', 'splash_cleared_clipboard' => 'Clipboard golit', diff --git a/languages/ru_RU/lang.inc b/languages/ru_RU/lang.inc index a3fceaa75..842d93a99 100644 --- a/languages/ru_RU/lang.inc +++ b/languages/ru_RU/lang.inc @@ -170,11 +170,17 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: изменён атрибут «[name]»', 'attribute_count' => 'Использован раз', 'attribute_value' => 'Значение атрибута', +'attr_malformed_boolean' => '', +'attr_malformed_date' => '', 'attr_malformed_email' => 'Значение атрибута \'[value]\' атрибута \'[attrname]\' не является допустимым URL.', +'attr_malformed_float' => '', +'attr_malformed_int' => '', 'attr_malformed_url' => 'Значение атрибута \'[value]\' атрибута \'[attrname]\' не является допустимым URL.', 'attr_max_values' => 'Максимальное количество требуемых значений для атрибутов [attrname] превышено.', 'attr_min_values' => 'Минимальное количество требуемых значений для атрибутов [attrname] не достигнуто.', +'attr_not_in_valueset' => '', 'attr_no_regex_match' => 'Значение атрибута не соответствует регулярному выражению', +'attr_validation_error' => '', 'at_least_n_users_of_group' => '[number_of_users] польз. группы [group]', 'august' => 'Август', 'authentication' => 'Авторизация', @@ -1315,6 +1321,7 @@ URL: [url]', 'splash_add_group_member' => 'Добавлен новый член группы', 'splash_add_role' => '', 'splash_add_to_transmittal' => '', +'splash_add_transmittal' => '', 'splash_add_user' => 'Добавлен новый пользователь', 'splash_clearcache' => '', 'splash_cleared_clipboard' => 'Буфер обмена очищен', diff --git a/languages/sk_SK/lang.inc b/languages/sk_SK/lang.inc index 28fba6e79..b304082c9 100644 --- a/languages/sk_SK/lang.inc +++ b/languages/sk_SK/lang.inc @@ -147,11 +147,17 @@ URL: [url]', 'attribute_changed_email_subject' => '', 'attribute_count' => '', 'attribute_value' => '', +'attr_malformed_boolean' => '', +'attr_malformed_date' => '', 'attr_malformed_email' => '', +'attr_malformed_float' => '', +'attr_malformed_int' => '', 'attr_malformed_url' => '', 'attr_max_values' => '', 'attr_min_values' => '', +'attr_not_in_valueset' => '', 'attr_no_regex_match' => '', +'attr_validation_error' => '', 'at_least_n_users_of_group' => '', 'august' => 'August', 'authentication' => '', @@ -1140,6 +1146,7 @@ URL: [url]', 'splash_add_group_member' => '', 'splash_add_role' => '', 'splash_add_to_transmittal' => '', +'splash_add_transmittal' => '', 'splash_add_user' => '', 'splash_clearcache' => '', 'splash_cleared_clipboard' => '', diff --git a/languages/sv_SE/lang.inc b/languages/sv_SE/lang.inc index 90ea07f5b..e28162196 100644 --- a/languages/sv_SE/lang.inc +++ b/languages/sv_SE/lang.inc @@ -158,11 +158,17 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Ändrad attribut', 'attribute_count' => 'Antal användningar', 'attribute_value' => 'Attributvärde', +'attr_malformed_boolean' => '', +'attr_malformed_date' => '', 'attr_malformed_email' => '', +'attr_malformed_float' => '', +'attr_malformed_int' => '', 'attr_malformed_url' => '', 'attr_max_values' => '', 'attr_min_values' => '', +'attr_not_in_valueset' => '', 'attr_no_regex_match' => 'Värdet av attributet stämmer inte överens med regulära uttrycket', +'attr_validation_error' => '', 'at_least_n_users_of_group' => 'Åtminstone [number_of_users] användare av [group]', 'august' => 'augusti', 'authentication' => '', @@ -1271,6 +1277,7 @@ URL: [url]', 'splash_add_group_member' => 'Ny gruppmedlem tillagt', 'splash_add_role' => '', 'splash_add_to_transmittal' => '', +'splash_add_transmittal' => '', 'splash_add_user' => 'Ny användare tillagt', 'splash_clearcache' => '', 'splash_cleared_clipboard' => 'Urklipp rensat', diff --git a/languages/tr_TR/lang.inc b/languages/tr_TR/lang.inc index 91b22bcae..2f67aac82 100644 --- a/languages/tr_TR/lang.inc +++ b/languages/tr_TR/lang.inc @@ -164,11 +164,17 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Nitelik değişti', 'attribute_count' => 'Kullanım sayısı', 'attribute_value' => 'Niteliğin değeri', +'attr_malformed_boolean' => '', +'attr_malformed_date' => '', 'attr_malformed_email' => '', +'attr_malformed_float' => '', +'attr_malformed_int' => '', 'attr_malformed_url' => '', 'attr_max_values' => '[attrname] niteliği için maksimum gerekli olan değer aşıldı.', 'attr_min_values' => '[attrname] niteliği için minimum gerekli olan değere ulaşılmadı.', +'attr_not_in_valueset' => '', 'attr_no_regex_match' => 'Nitelik değeri düzenli ifade ile eşleşmiyor', +'attr_validation_error' => '', 'at_least_n_users_of_group' => '[group] için en az [number_of_users] kullanıcı', 'august' => 'Ağustos', 'authentication' => 'Kimlik doğrulama', @@ -1287,6 +1293,7 @@ URL: [url]', 'splash_add_group_member' => 'Yeni grup üyesi eklendi', 'splash_add_role' => '', 'splash_add_to_transmittal' => '', +'splash_add_transmittal' => '', 'splash_add_user' => 'Yeni kullanıcı eklendi', 'splash_clearcache' => '', 'splash_cleared_clipboard' => 'Pano temizlendi', diff --git a/languages/uk_UA/lang.inc b/languages/uk_UA/lang.inc index cb5a44676..6c2bc4000 100644 --- a/languages/uk_UA/lang.inc +++ b/languages/uk_UA/lang.inc @@ -170,11 +170,17 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: змінено атрибут «[name]»', 'attribute_count' => 'Використано разів', 'attribute_value' => 'Значення атрибута', +'attr_malformed_boolean' => '', +'attr_malformed_date' => '', 'attr_malformed_email' => 'Значення \'[value]\' атрибуту \'[attrname]\' не є правильною адресою email.', +'attr_malformed_float' => '', +'attr_malformed_int' => '', 'attr_malformed_url' => 'Значення \'[value]\' атрибуту \'[attrname]\' не є правильним ULR', 'attr_max_values' => 'Досягнуто максимальної кількості значень атрибуту [attrname].', 'attr_min_values' => 'Не досягнуто мінімальної кількості значень атрибуту [attrname]', +'attr_not_in_valueset' => '', 'attr_no_regex_match' => 'Значення атрибуту не відповідає регулярному виразу', +'attr_validation_error' => '', 'at_least_n_users_of_group' => '[number_of_users] користувачі групи [group]', 'august' => 'Серпень', 'authentication' => 'Авторизація', @@ -1308,6 +1314,7 @@ URL: [url]', 'splash_add_group_member' => 'Додано нового члена групи', 'splash_add_role' => '', 'splash_add_to_transmittal' => '', +'splash_add_transmittal' => '', 'splash_add_user' => 'Додано нового користувача', 'splash_clearcache' => '', 'splash_cleared_clipboard' => 'Буфер обміну очищено', diff --git a/languages/zh_CN/lang.inc b/languages/zh_CN/lang.inc index acef42999..2b0b3c05d 100644 --- a/languages/zh_CN/lang.inc +++ b/languages/zh_CN/lang.inc @@ -147,11 +147,17 @@ URL: [url]', 'attribute_changed_email_subject' => '', 'attribute_count' => '使用次数', 'attribute_value' => '属性值', +'attr_malformed_boolean' => '', +'attr_malformed_date' => '', 'attr_malformed_email' => '', +'attr_malformed_float' => '', +'attr_malformed_int' => '', 'attr_malformed_url' => '', 'attr_max_values' => '', 'attr_min_values' => '', +'attr_not_in_valueset' => '', 'attr_no_regex_match' => '', +'attr_validation_error' => '', 'at_least_n_users_of_group' => '', 'august' => '八 月', 'authentication' => '认证', @@ -1142,6 +1148,7 @@ URL: [url]', 'splash_add_group_member' => '', 'splash_add_role' => '', 'splash_add_to_transmittal' => '', +'splash_add_transmittal' => '', 'splash_add_user' => '', 'splash_clearcache' => '', 'splash_cleared_clipboard' => '', diff --git a/languages/zh_TW/lang.inc b/languages/zh_TW/lang.inc index b23d20448..c71fe6fd2 100644 --- a/languages/zh_TW/lang.inc +++ b/languages/zh_TW/lang.inc @@ -147,11 +147,17 @@ URL: [url]', 'attribute_changed_email_subject' => '', 'attribute_count' => '使用次數', 'attribute_value' => '屬性值', +'attr_malformed_boolean' => '', +'attr_malformed_date' => '', 'attr_malformed_email' => '', +'attr_malformed_float' => '', +'attr_malformed_int' => '', 'attr_malformed_url' => '', 'attr_max_values' => '', 'attr_min_values' => '', +'attr_not_in_valueset' => '', 'attr_no_regex_match' => '', +'attr_validation_error' => '', 'at_least_n_users_of_group' => '', 'august' => '八 月', 'authentication' => '', @@ -1140,6 +1146,7 @@ URL: [url]', 'splash_add_group_member' => '', 'splash_add_role' => '', 'splash_add_to_transmittal' => '', +'splash_add_transmittal' => '', 'splash_add_user' => '', 'splash_clearcache' => '', 'splash_cleared_clipboard' => '', From b8fa88b6746a08c46f34c2f6ce6643dc61463954 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 27 Oct 2016 10:55:33 +0200 Subject: [PATCH 047/164] check for min number of attribute values --- controllers/class.EditFolder.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/controllers/class.EditFolder.php b/controllers/class.EditFolder.php index 44b0c174d..30aeee6b4 100644 --- a/controllers/class.EditFolder.php +++ b/controllers/class.EditFolder.php @@ -63,6 +63,8 @@ class SeedDMS_Controller_EditFolder extends SeedDMS_Controller_Common { if(!$folder->setAttributeValue($dms->getAttributeDefinition($attrdefid), $attribute)) return false; } + } elseif($attrdef->getMinValues() > 0) { + $this->errormsg = getMLText("attr_min_values", array("attrname"=>$attrdef->getName())); } elseif(isset($oldattributes[$attrdefid])) { if(!$folder->removeAttribute($dms->getAttributeDefinition($attrdefid))) return false; From 3659ffbde51f86b73b94c5bd6b2afd6721ba22c7 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 27 Oct 2016 10:56:21 +0200 Subject: [PATCH 048/164] use new attribute validation code --- op/op.AddDocument.php | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/op/op.AddDocument.php b/op/op.AddDocument.php index 2741aed8c..c6c0dbdeb 100644 --- a/op/op.AddDocument.php +++ b/op/op.AddDocument.php @@ -72,18 +72,9 @@ else foreach($attributes as $attrdefid=>$attribute) { $attrdef = $dms->getAttributeDefinition($attrdefid); if($attribute) { - if($attrdef->getRegex()) { - if(!preg_match($attrdef->getRegex(), $attribute)) { - UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("attr_no_regex_match")); - } - } - if(is_array($attribute)) { - if($attrdef->getMinValues() > count($attribute)) { - UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("attr_min_values", array("attrname"=>$attrdef->getName()))); - } - if($attrdef->getMaxValues() && $attrdef->getMaxValues() < count($attribute)) { - UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("attr_max_values", array("attrname"=>$attrdef->getName()))); - } + if(!$attrdef->validate($attribute)) { + $errmsg = getAttributeValidationText($attrdef->getValidationError(), $attrdef->getName(), $attribute); + UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())), $errmsg); } } elseif($attrdef->getMinValues() > 0) { UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())),getMLText("attr_min_values", array("attrname"=>$attrdef->getName()))); From 6bf827f4a1cc5377e48af8450fd3c306fc7062ce Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 27 Oct 2016 10:56:56 +0200 Subject: [PATCH 049/164] check for min number of attribute values --- op/op.AddSubFolder.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/op/op.AddSubFolder.php b/op/op.AddSubFolder.php index eedd0cda8..8d6e74f26 100644 --- a/op/op.AddSubFolder.php +++ b/op/op.AddSubFolder.php @@ -70,6 +70,8 @@ foreach($attributes as $attrdefid=>$attribute) { $errmsg = getAttributeValidationText($attrdef->getValidationError(), $attrdef->getName(), $attribute); UI::exitError(getMLText("folder_title", array("foldername" => $folder->getName())), $errmsg); } + } elseif($attrdef->getMinValues() > 0) { + UI::exitError(getMLText("folder_title", array("foldername" => $document->getName())),getMLText("attr_min_values", array("attrname"=>$attrdef->getName()))); } } From e526b94a7478aa4f9e4323d46acd0078a89381d6 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 27 Oct 2016 10:58:02 +0200 Subject: [PATCH 050/164] check for min number of attribute values --- op/op.EditDocument.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/op/op.EditDocument.php b/op/op.EditDocument.php index d8fd39f18..9d90b33e3 100644 --- a/op/op.EditDocument.php +++ b/op/op.EditDocument.php @@ -268,6 +268,8 @@ if($attributes) { if(!$document->setAttributeValue($dms->getAttributeDefinition($attrdefid), $attribute)) UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("error_occured")); } + } elseif($attrdef->getMinValues() > 0) { + UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("attr_min_values", array("attrname"=>$attrdef->getName()))); } elseif(isset($oldattributes[$attrdefid])) { if(!$document->removeAttribute($dms->getAttributeDefinition($attrdefid))) UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("error_occured")); From 9deba3c960d138dac6560e6d015e6b1dd8e82f07 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 27 Oct 2016 10:58:34 +0200 Subject: [PATCH 051/164] use new attribute validation code --- op/op.EditAttributes.php | 15 +++------------ op/op.UpdateDocument.php | 15 +++------------ 2 files changed, 6 insertions(+), 24 deletions(-) diff --git a/op/op.EditAttributes.php b/op/op.EditAttributes.php index f54706bf4..d961aeec9 100644 --- a/op/op.EditAttributes.php +++ b/op/op.EditAttributes.php @@ -66,18 +66,9 @@ if($attributes) { foreach($attributes as $attrdefid=>$attribute) { $attrdef = $dms->getAttributeDefinition($attrdefid); if($attribute) { - if($attrdef->getRegex()) { - if(!preg_match($attrdef->getRegex(), $attribute)) { - UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("attr_no_regex_match")); - } - if(is_array($attribute)) { - if($attrdef->getMinValues() > count($attribute)) { - UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("attr_min_values", array("attrname"=>$attrdef->getName()))); - } - if($attrdef->getMaxValues() && $attrdef->getMaxValues() < count($attribute)) { - UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("attr_max_values", array("attrname"=>$attrdef->getName()))); - } - } + if(!$attrdef->validate($attribute)) { + $errmsg = getAttributeValidationText($attrdef->getValidationError(), $attrdef->getName(), $attribute); + UI::exitError(getMLText("document_title", array("documentname" => $document->getName())), $errmsg); } if(!isset($oldattributes[$attrdefid]) || $attribute != $oldattributes[$attrdefid]->getValue()) { if(!$version->setAttributeValue($dms->getAttributeDefinition($attrdefid), $attribute)) { diff --git a/op/op.UpdateDocument.php b/op/op.UpdateDocument.php index 869dfa199..06a16d5ce 100644 --- a/op/op.UpdateDocument.php +++ b/op/op.UpdateDocument.php @@ -209,18 +209,9 @@ if ($_FILES['userfile']['error'] == 0) { foreach($attributes as $attrdefid=>$attribute) { $attrdef = $dms->getAttributeDefinition($attrdefid); if($attribute) { - if($attrdef->getRegex()) { - if(!preg_match($attrdef->getRegex(), $attribute)) { - UI::exitError(getMLText("document_title", array("documentname" => $folder->getName())),getMLText("attr_no_regex_match")); - } - } - if(is_array($attribute)) { - if($attrdef->getMinValues() > count($attribute)) { - UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("attr_min_values", array("attrname"=>$attrdef->getName()))); - } - if($attrdef->getMaxValues() && $attrdef->getMaxValues() < count($attribute)) { - UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("attr_max_values", array("attrname"=>$attrdef->getName()))); - } + if(!$attrdef->validate($attribute)) { + $errmsg = getAttributeValidationText($attrdef->getValidationError(), $attrdef->getName(), $attribute); + UI::exitError(getMLText("document_title", array("documentname" => $document->getName())), $errmsg); } } elseif($attrdef->getMinValues() > 0) { UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("attr_min_values", array("attrname"=>$attrdef->getName()))); From 682b5dafe780f6596a5990b7a67265e3ff568fe0 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 27 Oct 2016 17:05:12 +0200 Subject: [PATCH 052/164] do not check for enableOwnerRevApp anymore a user who has been once added as a reviewer/approver may have become the owner of the document later. Such a user may still be allowed to review/approve. enableOwnerRevApp will only affect the list of users when the reviewers/approvers are set. --- views/bootstrap/class.ViewDocument.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/views/bootstrap/class.ViewDocument.php b/views/bootstrap/class.ViewDocument.php index 4619d9273..b15d18265 100644 --- a/views/bootstrap/class.ViewDocument.php +++ b/views/bootstrap/class.ViewDocument.php @@ -577,7 +577,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { } else { $reqName = htmlspecialchars($required->getFullName()." (".$required->getLogin().")"); - if($required->getId() == $user->getId() && ($user->getId() != $owner->getId() || $enableownerrevapp == 1)) + if($required->getId() == $user->getId()/* && ($user->getId() != $owner->getId() || $enableownerrevapp == 1)*/) $is_reviewer = true; } break; @@ -588,7 +588,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { } else { $reqName = "".htmlspecialchars($required->getName()).""; - if($required->isMember($user) && ($user->getId() != $owner->getId() || $enableownerrevapp == 1)) + if($required->isMember($user)/* && ($user->getId() != $owner->getId() || $enableownerrevapp == 1)*/) $is_reviewer = true; } break; @@ -657,7 +657,7 @@ class SeedDMS_View_ViewDocument extends SeedDMS_Bootstrap_Style { } else { $reqName = "".htmlspecialchars($required->getName()).""; - if($required->isMember($user) && ($user->getId() != $owner->getId() || $enableownerrevapp == 1)) + if($required->isMember($user)/* && ($user->getId() != $owner->getId() || $enableownerrevapp == 1)*/) $is_approver = true; } break; From 758ce0a24d6340348cb7c59cb172bf9d73e9be2d Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 27 Oct 2016 17:47:47 +0200 Subject: [PATCH 053/164] validate() returns early if error was found --- SeedDMS_Core/Core/inc.ClassAttribute.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/SeedDMS_Core/Core/inc.ClassAttribute.php b/SeedDMS_Core/Core/inc.ClassAttribute.php index 9962c0d81..64b2b6afc 100644 --- a/SeedDMS_Core/Core/inc.ClassAttribute.php +++ b/SeedDMS_Core/Core/inc.ClassAttribute.php @@ -956,6 +956,9 @@ class SeedDMS_Core_AttributeDefinition { /* {{{ */ break; } + if(!$success) + return $success; + /* Check if value is in value set */ if($valueset = $this->getValueSetAsArray()) { foreach($values as $value) { From 316cb377da2cced1b64e97fc8485e017fcc109d0 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 31 Oct 2016 14:53:57 +0100 Subject: [PATCH 054/164] major update --- languages/fr_FR/lang.inc | 273 +++++++++++++++++++++------------------ 1 file changed, 146 insertions(+), 127 deletions(-) diff --git a/languages/fr_FR/lang.inc b/languages/fr_FR/lang.inc index 98abda493..19e5320be 100644 --- a/languages/fr_FR/lang.inc +++ b/languages/fr_FR/lang.inc @@ -19,15 +19,15 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (1053), jeromerobert (50), lonnnew (9) +// Translators: Admin (1053), jeromerobert (50), lonnnew (9), Oudiceval (110) $text = array( -'2_factor_auth' => '', -'2_factor_auth_info' => '', -'2_fact_auth_secret' => '', +'2_factor_auth' => 'Authentification forte', +'2_factor_auth_info' => 'Ce système requiert une authentification à deux facteurs. Cela nécessite l’installation de Google Authenticator sur votre téléphone mobile. Ci-dessous sont visibles deux QR codes. Celui de droite correspond à votre clé secrète actuelle. Celui de gauche permet de définir une nouvelle clé secrète. Lorsque vous définissez une nouvelle clé secrète, assurez-vous de la scanner avec Google Authenticator.', +'2_fact_auth_secret' => 'Clé secrète', 'accept' => 'Accepter', -'access_control' => '', -'access_control_is_off' => '', +'access_control' => 'Contrôle d’accès', +'access_control_is_off' => 'Le contrôle d’accès avancé est désactivé', 'access_denied' => 'Accès refusé.', 'access_inheritance' => 'Héritage d\'accès', 'access_mode' => 'Droits d\'accès', @@ -89,9 +89,14 @@ URL: [url]', 'and' => 'et', 'apply' => 'Appliquer', 'approval_deletion_email' => 'Demande d\'approbation supprimée', -'approval_deletion_email_body' => '', -'approval_deletion_email_subject' => '', -'approval_file' => '', +'approval_deletion_email_body' => 'Demande d\'approbation supprimée +Document : [name] +Version : [version] +Dossier parent : [folder_path] +Utilisateur : [username] +URL : [url]', +'approval_deletion_email_subject' => '[sitename] : [name] - Requête d\'approbation supprimée', +'approval_file' => 'Fichier', 'approval_group' => 'Groupe d\'approbation', 'approval_log' => 'Journal des approbations', 'approval_request_email' => 'Demande d\'approbation', @@ -119,7 +124,7 @@ URL : [url]', 'approver_already_assigned' => '', 'approver_already_removed' => '', 'april' => 'Avril', -'archive_creation' => 'Création d\'archive', +'archive_creation' => 'Créer une archive', 'archive_creation_warning' => 'Avec cette fonction, vous pouvez créer une archive contenant les fichiers de tous les dossiers DMS. Après la création, l\'archive sera sauvegardée dans le dossier de données de votre serveur.
    AVERTISSEMENT: Une archive créée ainsi sera inutilisable en tant que sauvegarde du serveur.', 'ar_EG' => 'Arabe – Égypte', 'assign_approvers' => 'Approbateurs désignés', @@ -127,10 +132,10 @@ URL : [url]', 'assign_user_property_to' => 'Assigner les propriétés de l\'utilisateur à', 'assumed_released' => 'Supposé publié', 'attrdefgroup_management' => '', -'attrdefgrp_show_detail' => '', -'attrdefgrp_show_list' => '', -'attrdefgrp_show_search' => '', -'attrdefgrp_show_searchlist' => '', +'attrdefgrp_show_detail' => 'Détails', +'attrdefgrp_show_list' => 'Liste', +'attrdefgrp_show_search' => 'Recherche', +'attrdefgrp_show_searchlist' => 'Résultats de recherche', 'attrdef_exists' => 'La définition d\'attribut existe déjà', 'attrdef_info' => '', 'attrdef_in_use' => 'La définition d\'attribut est en cours d\'utilisation', @@ -147,12 +152,12 @@ URL : [url]', 'attrdef_regex' => 'Expression régulière', 'attrdef_type' => 'Type', 'attrdef_type_boolean' => 'Valeur booléenne', -'attrdef_type_date' => '', -'attrdef_type_email' => '', +'attrdef_type_date' => 'Date', +'attrdef_type_email' => 'E-mail', 'attrdef_type_float' => 'Décimal', 'attrdef_type_int' => 'Entier', 'attrdef_type_string' => 'Chaîne', -'attrdef_type_url' => '', +'attrdef_type_url' => 'URL', 'attrdef_valueset' => 'Ensemble de valeurs', 'attributes' => 'Attributs', 'attribute_changed_email_body' => 'Attribut changé @@ -165,17 +170,17 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Attribut changé', 'attribute_count' => 'Nombre d\'utilisations', 'attribute_value' => 'Valeur de l\'attribut', -'attr_malformed_boolean' => '', -'attr_malformed_date' => '', -'attr_malformed_email' => '', -'attr_malformed_float' => '', -'attr_malformed_int' => '', -'attr_malformed_url' => '', +'attr_malformed_boolean' => 'La valeur « [value] » de l’attribut « [attrname] » n’est pas un booléen valide.', +'attr_malformed_date' => 'La valeur « [value] » de l’attribut « [attrname] » n’est pas une date valide.', +'attr_malformed_email' => 'La valeur « [value] » de l’attribut « [attrname] » n’est pas une adresse e-mail valide.', +'attr_malformed_float' => 'La valeur « [value] » de l’attribut « [attrname] » n’est pas un nombre valide.', +'attr_malformed_int' => 'La valeur « [value] » de l’attribut « [attrname] » n’est pas un nombre entier.', +'attr_malformed_url' => 'La valeur « [value] » de l’attribut « [attrname] » n’est pas une URL valide.', 'attr_max_values' => 'Le nombre maximum de valeurs pour l\'attribut [attrname] est dépassé', 'attr_min_values' => 'Le nombre minimum de valeurs pour l\'attribut [attrname] n\'est pas atteint', -'attr_not_in_valueset' => '', +'attr_not_in_valueset' => 'La valeur « [value] » de l’attribut « [attrname] » ne fait pas partie des valeurs définies.', 'attr_no_regex_match' => 'La valeur de l\'attribut ne correspond pas à l\'expression régulière.', -'attr_validation_error' => '', +'attr_validation_error' => 'La valeur « [value] » de l’attribut « [attrname] » est invalide.', 'at_least_n_users_of_group' => 'Au moins [number_of_users] utilisateurs de [group]', 'august' => 'Août', 'authentication' => 'Authentification', @@ -201,11 +206,11 @@ URL: [url]', 'cannot_retrieve_review_snapshot' => 'Impossible de retrouver l\'instantané de statut de correction pour cette version du document.', 'cannot_rm_root' => 'Erreur : Dossier racine ineffaçable.', 'categories' => 'Catégories', -'categories_loading' => '', +'categories_loading' => 'Veuillez patienter durant le chargement de la liste des catégories…', 'category' => 'Catégorie', 'category_exists' => 'Catégorie déjà existante.', 'category_filter' => 'Uniquement les catégories', -'category_info' => '', +'category_info' => 'Information', 'category_in_use' => 'Cette catégorie est en cours d\'utilisation par des documents.', 'category_noname' => 'Aucun nom de catégorie fourni.', 'ca_ES' => 'Catalan', @@ -248,14 +253,14 @@ URL: [url]', 'clear_clipboard' => 'Vider le presse-papier', 'clear_password' => '', 'clipboard' => 'Presse-papier', -'close' => 'Close', +'close' => 'Fermer', 'comment' => 'Commentaire', 'comment_changed_email' => '', 'comment_for_current_version' => 'Commentaires pour la version actuelle', 'confirm_clear_cache' => 'Confirmer l\'effacement du cache', -'confirm_create_fulltext_index' => 'Oui, je souhaite recréer l\'index de texte intégral!', -'confirm_move_document' => '', -'confirm_move_folder' => '', +'confirm_create_fulltext_index' => 'Oui, je souhaite recréer l\'index de recherche plein texte !', +'confirm_move_document' => 'Veuillez confirmer le déplacement du document.', +'confirm_move_folder' => 'Veuillez confirmer le déplacement du dossier.', 'confirm_pwd' => 'Confirmer le mot de passe', 'confirm_rm_backup' => 'Voulez-vous vraiment supprimer le fichier "[arkname]"?
    Attention: Cette action ne peut pas être annulée.', 'confirm_rm_document' => 'Voulez-vous réellement supprimer le document \'[documentname]\'?
    Attention : cette action ne peut être annulée.', @@ -274,10 +279,10 @@ URL: [url]', 'content' => 'Contenu', 'continue' => 'Continuer', 'converter_new_cmd' => '', -'converter_new_mimetype' => '', +'converter_new_mimetype' => 'Nouveau type MIME', 'copied_to_checkout_as' => '', 'create_fulltext_index' => 'Créer un index de recherche plein texte', -'create_fulltext_index_warning' => 'Vous allez recréer l\'index de texte intégral. Cela peut prendre une grande quantité de temps et réduire les performances de votre système dans son ensemble. Si vous voulez vraiment recréer l\'index, merci de confirmer votre opération.', +'create_fulltext_index_warning' => 'Vous allez recréer l\'index de recherche plein texte. Cela peut prendre un temps considérable et réduire les performances de votre système dans son ensemble. Si vous voulez vraiment recréer l\'index, merci de confirmer votre opération.', 'creation_date' => 'Créé le', 'cs_CZ' => 'Tchèque', 'current_password' => 'Mot de passe actuel', @@ -303,7 +308,7 @@ URL: [url]', 'documents' => 'Documents', 'documents_checked_out_by_you' => '', 'documents_in_process' => 'Documents en cours', -'documents_locked' => '', +'documents_locked' => 'Documents verrouillés', 'documents_locked_by_you' => 'Documents verrouillés', 'documents_only' => 'Documents uniquement', 'documents_to_approve' => 'Documents en attente d\'approbation', @@ -311,7 +316,7 @@ URL: [url]', 'documents_to_receipt' => '', 'documents_to_review' => 'Documents en attente de correction', 'documents_to_revise' => '', -'documents_user_rejected' => '', +'documents_user_rejected' => 'Documents rejetés', 'documents_user_requiring_attention' => 'Documents à surveiller', 'document_already_checkedout' => '', 'document_already_locked' => 'Ce document est déjà verrouillé', @@ -324,15 +329,15 @@ Dossier parent: [folder_path] Utilisateur: [username] URL: [url]', 'document_comment_changed_email_subject' => '[sitename]: [name] - Commentaire modifié', -'document_count' => '', +'document_count' => 'Nombre de documents', 'document_deleted' => 'Document supprimé', 'document_deleted_email' => 'Document supprimé', -'document_deleted_email_body' => 'ocument supprimé -Document: [name] -Dossier parent: [folder_path] -Utilisateur: [username]', +'document_deleted_email_body' => 'Document supprimé +Document : [name] +Dossier parent : [folder_path] +Utilisateur : [username]', 'document_deleted_email_subject' => '[sitename]: [name] - ocument supprimé', -'document_duplicate_name' => 'Dupliquer le nom de document', +'document_duplicate_name' => 'Un document porte déjà ce nom !', 'document_has_no_workflow' => 'Le document n\'a pas de workflow', 'document_infos' => 'Informations sur le document', 'document_is_checked_out' => '', @@ -381,16 +386,16 @@ URL: [url]', 'do_object_setchecksum' => 'Définir checksum', 'do_object_setfilesize' => 'Définir la taille du fichier', 'do_object_unlink' => 'Supprimer la version du document', -'draft' => '', +'draft' => 'Brouillon', 'draft_pending_approval' => 'Ebauche - En cours d\'approbation', 'draft_pending_review' => 'Ebauche - En cours de correction', 'drag_icon_here' => 'Glisser/déposer le fichier ou document ici!', -'dropfolderdir_missing' => '', +'dropfolderdir_missing' => 'Votre dossier de dépôt personnel n\'existe pas sur le serveur ! Veuillez faire une demande à l\'administrateur.', 'dropfolder_file' => 'Fichier du dossier déposé', 'dropfolder_folder' => '', 'dropupload' => 'Téléchargement rapide', -'drop_files_here' => 'Glissez fichiers ici!', -'dump_creation' => 'création sauvegarde BD', +'drop_files_here' => 'Glissez les fichiers ici !', +'dump_creation' => 'Sauvegarder la base de données', 'dump_creation_warning' => 'Avec cette opération, vous pouvez créer une sauvegarde du contenu de votre base de données. Après la création, le fichier de sauvegarde sera sauvegardé dans le dossier de données de votre serveur.', 'dump_list' => 'Fichiers de sauvegarde existants', 'dump_remove' => 'Supprimer fichier de sauvegarde', @@ -421,7 +426,7 @@ URL: [url]', 'email_error_title' => 'Aucun e-mail indiqué', 'email_footer' => 'Vous pouvez modifier les paramètres de messagerie via \'Mon compte\'.', 'email_header' => 'Ceci est un message automatique généré par le serveur DMS.', -'email_not_given' => 'SVP Entrer une adresse email valide.', +'email_not_given' => 'Veuillez entrer une adresse e-mail valide.', 'empty_attribute_group_list' => '', 'empty_folder_list' => 'Pas de documents ou de dossier', 'empty_notify_list' => 'Aucune entrée', @@ -429,25 +434,25 @@ URL: [url]', 'equal_transition_states' => 'Etat de début et fin identique', 'error' => 'Erreur', 'error_add_aro' => '', -'error_add_permission' => '', +'error_add_permission' => 'Erreur lors de l’ajout de permission', 'error_clearcache' => '', 'error_importfs' => '', 'error_no_document_selected' => 'Aucun document sélectionné', 'error_no_folder_selected' => 'Aucun dossier sélectionné', 'error_occured' => 'Une erreur s\'est produite', -'error_remove_permission' => '', -'error_toogle_permission' => '', +'error_remove_permission' => 'Erreur lors de la suppression de permission', +'error_toogle_permission' => 'Erreur lors de la modification de permission', 'es_ES' => 'Espagnol', 'event_details' => 'Détails de l\'événement', 'exclude_items' => 'Exclure des élements', 'expired' => 'Expiré', 'expires' => 'Expiration', 'expiry_changed_email' => 'Date d\'expiration modifiée', -'expiry_changed_email_body' => 'EDate d\'expiration modifiée -Document: [name] -Dossier parent: [folder_path] -Utilisateur: [username] -URL: [url]', +'expiry_changed_email_body' => 'Date d\'expiration modifiée +Document : [name] +Dossier parent : [folder_path] +Utilisateur : [username] +URL : [url]', 'expiry_changed_email_subject' => '[sitename]: [name] - Date d\'expiration modifiée', 'export' => '', 'extension_manager' => 'Gestionnaire d\'extensions', @@ -524,7 +529,7 @@ URL: [url]', 'guest_login' => 'Se connecter comme invité', 'guest_login_disabled' => 'Connexion d\'invité désactivée.', 'help' => 'Aide', -'home_folder' => '', +'home_folder' => 'Dossier personnel', 'hook_name' => '', 'hourly' => 'Une fois par heure', 'hours' => 'heures', @@ -533,8 +538,8 @@ URL: [url]', 'hu_HU' => 'Hongrois', 'id' => 'ID', 'identical_version' => 'Nouvelle version identique à l\'actuelle.', -'import' => '', -'importfs' => '', +'import' => 'Importer', +'importfs' => 'Importer depuis le système de fichiers', 'import_fs' => 'Importer depuis le système de fichiers', 'import_fs_warning' => '', 'include_content' => '', @@ -577,9 +582,9 @@ URL: [url]', 'is_hidden' => 'Cacher de la liste utilisateur', 'it_IT' => 'Italien', 'january' => 'Janvier', -'js_form_error' => '', -'js_form_errors' => '', -'js_invalid_email' => '', +'js_form_error' => 'Le formulaire contient encore # erreur.', +'js_form_errors' => 'Le formulaire contient encore # erreurs.', +'js_invalid_email' => 'L\'adresse e-mail est invalide', 'js_no_approval_group' => 'SVP Sélectionnez un groupe d\'approbation', 'js_no_approval_status' => 'SVP Sélectionnez le statut d\'approbation', 'js_no_comment' => 'Il n\'y a pas de commentaires', @@ -619,7 +624,7 @@ URL: [url]', 'lock_document' => 'Verrouiller', 'lock_message' => 'Ce document a été verrouillé par [username]. Seuls les utilisateurs autorisés peuvent déverrouiller ce document (voir fin de page).', 'lock_status' => 'Statut', -'login' => 'Identifiant', +'login' => 'Identification', 'login_disabled_text' => 'Votre compte est désactivé, sans doute à cause de trop nombreuses connexions qui ont échoué.', 'login_disabled_title' => 'Compte désactivé', 'login_error_text' => 'Erreur à la connexion. Identifiant ou mot de passe incorrect.', @@ -641,7 +646,7 @@ URL: [url]', 'march' => 'Mars', 'max_upload_size' => 'Taille maximum de fichier déposé', 'may' => 'Mai', -'mimetype' => 'Type mime', +'mimetype' => 'Type MIME', 'minutes' => 'minutes', 'misc' => 'Divers', 'missing_checksum' => 'Checksum manquante', @@ -671,13 +676,13 @@ URL: [url]', 'new_default_keyword_category' => 'Ajouter une catégorie', 'new_document_category' => 'Ajouter une catégorie', 'new_document_email' => 'Nouveau document', -'new_document_email_body' => 'Nouveau document -nNom: [name] -Dossier parent: [folder_path] -Commentaire: [comment] -Commentaire de version: [version_comment] -Utilisateur: [username] -nURL: [url]', +'new_document_email_body' => 'Nouveau document +Nom : [name] +Dossier parent : [folder_path] +Commentaire : [comment] +Commentaire de version : [version_comment] +Utilisateur : [username] +URL: [url]', 'new_document_email_subject' => '[sitename]: [folder_name] - Nouveau document', 'new_file_email' => 'Nouvel attachement', 'new_file_email_body' => 'Nouvel attachement @@ -702,10 +707,11 @@ URL: [url]', 'nl_NL' => 'Danois', 'no' => 'Non', 'notify_added_email' => 'Vous avez été ajouté à la liste des notifications.', -'notify_added_email_body' => 'Ajouté à la liste des notificationsrnNom: [name] -Dossier parent: [folder_path] -Utilisateur: [username] -URL: [url]', +'notify_added_email_body' => 'Ajouté à la liste des notifications +Nom : [name] +Dossier parent : [folder_path] +Utilisateur : [username] +URL : [url]', 'notify_added_email_subject' => '[sitename]: [name] - Ajouté à la liste des notifications', 'notify_deleted_email' => 'Vous avez été supprimé de la liste des notifications.', 'notify_deleted_email_body' => 'Supprimé de la liste des notifications @@ -729,7 +735,7 @@ URL: [url]', 'no_docs_to_receipt' => '', 'no_docs_to_review' => 'Aucun document en attente de correction', 'no_docs_to_revise' => '', -'no_email_or_login' => '', +'no_email_or_login' => 'L’identifiant et l’e-mail doivent être saisis.', 'no_fulltextindex' => 'Aucun fichier d\'index disponibles', 'no_groups' => 'Aucun groupe', 'no_group_members' => 'Ce groupe ne contient aucun membre', @@ -749,7 +755,7 @@ URL: [url]', 'october' => 'Octobre', 'old' => 'Ancien', 'only_jpg_user_images' => 'Images d\'utilisateur au format .jpg seulement', -'order_by_sequence_off' => '', +'order_by_sequence_off' => 'Le tri par séquence est désactivé dans les préférences. Si vous souhaitez que ce paramètre prenne effet, vous devez l\'activer.', 'original_filename' => 'Nom de fichier original', 'owner' => 'Propriétaire', 'ownership_changed_email' => 'Propriétaire modifié', @@ -780,8 +786,8 @@ En cas de problème persistant, veuillez contacter votre administrateur.', 'password_forgotten_text' => 'Remplissez le formulaire ci-dessous et suivez les instructions dans le courrier électronique qui vous sera envoyé.', 'password_forgotten_title' => 'Mot de passe envoyé', 'password_repeat' => 'Répétez le mot de passe', -'password_send' => '', -'password_send_text' => '', +'password_send' => 'Envoi du mot de passe', +'password_send_text' => 'Votre nouveau mot de passe a été envoyé à l\'adresse fournie (si l\'identifiant et l\'adresse e-mail correspondent à un utilisateur existant). Si vous ne recevez rien dans les minutes qui suivent, assurez-vous que l\'identifiant et l\'adresse e-mail sont corrects puis relancez le processus.', 'password_strength' => 'Fiabilité du mot de passe', 'password_strength_insuffient' => 'Mot de passe trop faible', 'password_wrong' => 'Mauvais mot de passe', @@ -791,10 +797,10 @@ En cas de problème persistant, veuillez contacter votre administrateur.', 'personal_default_keywords' => 'Mots-clés personnels', 'pl_PL' => 'Polonais', 'possible_substitutes' => '', -'preview' => '', +'preview' => 'Aperçu', 'preview_converters' => '', 'preview_markdown' => '', -'preview_plain' => '', +'preview_plain' => 'Texte', 'previous_state' => 'Previous state', 'previous_versions' => 'Versions précédentes', 'pt_BR' => 'Portuguais (BR)', @@ -807,14 +813,14 @@ En cas de problème persistant, veuillez contacter votre administrateur.', 'receipt_log' => '', 'receipt_request_email_body' => '', 'receipt_request_email_subject' => '', -'receipt_status' => '', +'receipt_status' => 'Statut', 'receipt_summary' => '', 'receipt_update_failed' => '', 'reception' => '', 'reception_acknowleged' => '', 'reception_noaction' => '', 'reception_rejected' => '', -'recipients' => '', +'recipients' => 'Destinataires', 'redraw' => '', 'refresh' => 'Actualiser', 'rejected' => 'Rejeté', @@ -826,7 +832,7 @@ Document: [document] Utilisateur: [username] URL: [url]', 'removed_file_email_subject' => '[sitename]: [document] - Attachement supprimé', -'removed_recipient' => '', +'removed_recipient' => 'a été supprimé de la liste des destinataires.', 'removed_reviewer' => 'a été retiré de la liste des correcteurs.', 'removed_revispr' => '', 'removed_workflow_email_body' => 'Workflow du document supprimé: [name] @@ -842,7 +848,7 @@ URL: [url]', 'request_workflow_action_email_body' => '', 'request_workflow_action_email_subject' => '', 'reset_checkout' => '', -'restrict_access' => '', +'restrict_access' => 'Pas d\'accès', 'results_page' => 'Page de résultats', 'return_from_subworkflow' => 'Revenir du sous-workflow', 'return_from_subworkflow_email_body' => '', @@ -854,7 +860,7 @@ URL: [url]', 'review_deletion_email' => 'Demande de correction supprimée', 'review_deletion_email_body' => '', 'review_deletion_email_subject' => '', -'review_file' => '', +'review_file' => 'Fichier', 'review_group' => 'Groupe de correction', 'review_log' => 'Journal des modifications', 'review_request_email' => 'Demande de correction', @@ -910,7 +916,7 @@ URL: [url]', 'role_guest' => 'Invité', 'role_info' => '', 'role_management' => '', -'role_name' => '', +'role_name' => 'Nom', 'role_type' => '', 'role_user' => 'Utilisateur', 'ro_RO' => 'Roumain', @@ -959,7 +965,7 @@ URL: [url]', 'select_one' => 'Selectionner', 'select_users' => 'Cliquer pour choisir un utilisateur', 'select_workflow' => 'Choisir un workflow', -'send_test_mail' => '', +'send_test_mail' => 'Envoyer un e-mail test', 'september' => 'Septembre', 'sequence' => 'Position dans le répertoire', 'seq_after' => 'Après "[prevname]"', @@ -976,8 +982,8 @@ URL: [url]', 'settings_advancedAcl_desc' => '', 'settings_apache_mod_rewrite' => 'Apache - Module Rewrite', 'settings_Authentication' => 'Paramètres d\'authentification', -'settings_autoLoginUser' => '', -'settings_autoLoginUser_desc' => '', +'settings_autoLoginUser' => 'Connexion automatique', +'settings_autoLoginUser_desc' => 'Utiliser l’ID de cet utilisateur pour se connecter automatiquement. Ce type d’accès ne permet pas la création de nouveaux comptes.', 'settings_backupDir' => '', 'settings_backupDir_desc' => '', 'settings_cacheDir' => 'Dossier Cache', @@ -996,7 +1002,7 @@ URL: [url]', 'settings_contentOffsetDir_desc' => 'To work around limitations in the underlying file system, a new directory structure has been devised that exists within the content directory (Content Directory). This requires a base directory from which to begin. Usually leave this to the default setting, 1048576, but can be any number or string that does not already exist within (Content Directory)', 'settings_cookieLifetime' => 'Durée de vie des Cookies', 'settings_cookieLifetime_desc' => 'La durée de vie d\'un cooke en secondes. Si réglée à 0, le cookie sera supprimé à la fermeture du navigateur.', -'settings_coreDir' => 'Répertoire Core letoDMS', +'settings_coreDir' => 'Répertoire Core SeedDMS', 'settings_coreDir_desc' => 'Chemin vers SeedDMS_Core (optionnel)', 'settings_createCheckOutDir' => '', 'settings_createCheckOutDir_desc' => '', @@ -1018,7 +1024,7 @@ URL: [url]', 'settings_defaultSearchMethod' => 'Méthode de recherche par défaut', 'settings_defaultSearchMethod_desc' => 'Méthode de recherche par défaut, lorsque la recherche est exécutée depuis le moteur de recherche du menu principal', 'settings_defaultSearchMethod_valdatabase' => 'base de données', -'settings_defaultSearchMethod_valfulltext' => 'texto completo', +'settings_defaultSearchMethod_valfulltext' => 'Plein texte (contenu)', 'settings_delete_install_folder' => 'Pour utiliser SeedDMS, vous devez supprimer le fichier ENABLE_INSTALL_TOOL dans le répertoire de configuration', 'settings_disableSelfEdit' => 'Désactiver auto modification', 'settings_disableSelfEdit_desc' => 'Si coché, l\'utilisateur ne peut pas éditer son profil', @@ -1029,10 +1035,12 @@ URL: [url]', 'settings_Edition' => 'Paramètres d’édition', 'settings_editOnlineFileTypes' => 'Editer le type de fichier', 'settings_editOnlineFileTypes_desc' => 'Editer la description du type de fichier', -'settings_enable2FactorAuthentication' => '', -'settings_enable2FactorAuthentication_desc' => '', +'settings_enable2FactorAuthentication' => 'Activer l’authentification forte', +'settings_enable2FactorAuthentication_desc' => 'Active/désactive l\'authentification forte à 2 facteurs. Les utilisateurs devront installer Google Authenticator sur leur téléphone mobile.', 'settings_enableAcknowledgeWorkflow' => '', 'settings_enableAcknowledgeWorkflow_desc' => '', +'settings_enableAdminReceipt' => '', +'settings_enableAdminReceipt_desc' => '', 'settings_enableAdminRevApp' => 'Activer Admin Rev App', 'settings_enableAdminRevApp_desc' => 'Décochez pour ne pas lister l\'administrateur à titre de correcteur/approbateur', 'settings_enableCalendar' => 'Activer agenda', @@ -1067,8 +1075,10 @@ URL: [url]', 'settings_enableNotificationAppRev_desc' => 'Cochez pour envoyer une notification au correcteur/approbateur quand une nouvelle version du document est ajoutée', 'settings_enableNotificationWorkflow' => 'Envoyer les notifications aux utilisateurs dans le prochain workflow', 'settings_enableNotificationWorkflow_desc' => 'Si cette option est activée, les utilisateurs et les groupes qui doivent intervenir dans la prochaine transition du workflow seront notifiés. Même s\'ils n\'ont pas demandé de notification pour le document.', -'settings_enableOwnerNotification' => 'ctiver la notification par défaut du propriétaire', +'settings_enableOwnerNotification' => 'Activer la notification du propriétaire par défaut', 'settings_enableOwnerNotification_desc' => 'Cocher pour ajouter une notification pour le propriétaire si un document quand il est ajouté.', +'settings_enableOwnerReceipt' => '', +'settings_enableOwnerReceipt_desc' => '', 'settings_enableOwnerRevApp' => 'Autoriser correction/approbbation pour le propriétaire', 'settings_enableOwnerRevApp_desc' => 'A autoriser pour avoir le propriétaire d\'un document designé correcteur/approbateur et pour les transitions de workflow.', 'settings_enablePasswordForgotten' => 'Activer Mot de passe oublié', @@ -1114,15 +1124,15 @@ URL: [url]', 'settings_httpRoot_desc' => 'Le chemin relatif dans l\'URL, après le nom de domaine. Ne pas inclure le préfixe http:// ou le nom d\'hôte Internet. Par exemple Si l\'URL complète est http://www.example.com/letodms/, mettez \'/letodms/\'. Si l\'URL est http://www.example.com/, mettez \'/\'', 'settings_initialDocumentStatus' => '', 'settings_initialDocumentStatus_desc' => '', -'settings_initialDocumentStatus_draft' => '', +'settings_initialDocumentStatus_draft' => 'Brouillon', 'settings_initialDocumentStatus_released' => '', 'settings_installADOdb' => 'Installer ADOdb', 'settings_install_disabled' => 'Le fichier ENABLE_INSTALL_TOOL a été supprimé. ous pouvez maintenant vous connecter à SeedDMS et poursuivre la configuration.', 'settings_install_pear_package_log' => 'Installer le paquet Pear \'Log\'', 'settings_install_pear_package_webdav' => 'Installer le paquet Pear \'HTTP_WebDAV_Server\', si vous avez l\'intention d\'utiliser l\'interface webdav', 'settings_install_success' => 'L\'installation est terminée avec succès', -'settings_install_welcome_text' => '

    Avant de commencer l\'installation de letoDMS assurez vous d\'avoir créé un fichier \'ENABLE_INSTALL_TOOL\' dans votre répertoire de configuration, sinon l\'installation ne fonctionnera pas. Sur des systèmes Unix, cela peut se faire simplement avec \'touch / ENABLE_INSTALL_TOOL\'. Une fois que vous avez terminé l\'installation de supprimer le fichier.

    letoDMS a des exigences très minimes. Vous aurez besoin d\'une base de données mysql et un serveur web php. pour le recherche texte complète lucene, vous aurez également besoin du framework Zend installé sur le disque où elle peut être trouvée en php. Depuis la version 3.2.0 de letoDMS ADOdb ne fait plus partie de la distribution. obtenez une copie à partir de http://adodb.sourceforge.net et l\'installer. Le chemin d’accès peut être défini ultérieurement pendant l’installation.

    Si vous préférez créer la base de données avant de commencer l\'installation, créez la manuellement avec votre outil favori, éventuellement créer un utilisateur de base de données avec accès sur la base et importer une sauvegarde de base dans le répertoire de configuration. Le script d\'installation peut le faire pour vous, mais il requiert un accès à la base de données avec les droits suffisants pour créer des bases de données.

    ', -'settings_install_welcome_title' => 'Bienvenue dans l\'installation de letoDMS', +'settings_install_welcome_text' => '

    Avant de commencer l\'installation de SeedDMS, assurez-vous d\'avoir créé un fichier \'ENABLE_INSTALL_TOOL\' dans votre répertoire de configuration, sinon l\'installation ne fonctionnera pas. Sur des systèmes Unix, cela peut se faire simplement avec \'touch / ENABLE_INSTALL_TOOL\'. Une fois l\'installation terminée, supprimez le fichier.

    SeedDMS a des exigences très minimes. Vous aurez besoin d\'une base de données MySQL ou SQLite et d\'un serveur web PHP. Le package Pear "Log" doit également être installé. Pour la recherche via Lucene, vous devez également installer le framework Zend sur le disque à un emplacement accessible par PHP. Pour le serveur WebDAV, vous aurez besoin d\'installer HTTP_WebDAV_Server. Le chemin d’accès peut être défini ultérieurement pendant l’installation.

    Si vous préférez créer la base de données avant de commencer l\'installation, créez la manuellement avec votre outil favori, créez éventuellement un utilisateur de base de données avec accès sur la base et importez un export de base du répertoire de configuration. Le script d\'installation peut le faire pour vous, mais il requiert un accès à la base de données avec les droits suffisants pour créer des bases de données.

    ', +'settings_install_welcome_title' => 'Bienvenue dans l\'installation de SeedDMS', 'settings_install_zendframework' => 'Installer le Framework Zend, si vous avez l\'intention d\'utiliser le moteur de recherche texte complète', 'settings_language' => 'Langue par défaut', 'settings_language_desc' => 'Langue par défaut (nom d\'un sous-dossier dans le dossier "languages")', @@ -1145,14 +1155,14 @@ URL: [url]', 'settings_maxRecursiveCount' => 'Nombre maximal de document/dossier récursif', 'settings_maxRecursiveCount_desc' => 'Nombre maximum de documents et répertoires dont l\'accès sera vérifié, lors d\'un décompte récursif. Si ce nombre est dépassé, le nombre de documents et répertoires affichés sera approximé.', 'settings_maxSizeForFullText' => 'Taille maximum pour l\'indexation instantanée', -'settings_maxSizeForFullText_desc' => 'Toute nouvelle version d\'un document plus petite que la taille configuré sera intégralement indéxé juste après l\'upload. Dans tout les autres cas, seulement les metadonées seront indéxées.', +'settings_maxSizeForFullText_desc' => 'Toute nouvelle version d\'un document plus petite que la taille configurée sera intégralement indexée juste après l\'upload. Dans tous les autres cas, seulement les métadonnées seront indexées.', 'settings_more_settings' => 'Configurer d\'autres paramètres. Connexion par défaut: admin/admin', 'settings_notfound' => 'Introuvable', 'settings_Notification' => 'Notifications', 'settings_notwritable' => 'La configuration ne peut pas être enregistré car le fichier de configuration n\'est pas accessible en écriture.', 'settings_no_content_dir' => 'Répertoire de contenu', 'settings_overrideMimeType' => 'Passer outre le type MIME', -'settings_overrideMimeType_desc' => 'Surcharge le type Mime renvoyé par le navigateur si un fichier est téléversé. Le nouveau type Mime est calculé par SeedDMS.', +'settings_overrideMimeType_desc' => 'Ne pas tenir compte du type MIME envoyé par le navigateur quand un fichier est téléversé. Le type MIME sera déterminé par SeedDMS.', 'settings_partitionSize' => 'Taille des fichiers partiels téléchargées par jumploader', 'settings_partitionSize_desc' => 'Taille des fichiers partiels en octets, téléchargées par jumploader. Ne pas fixer une valeur plus grande que la taille de transfert maximale définie par le serveur.', 'settings_passwordExpiration' => 'Expiration du mot de passe', @@ -1179,7 +1189,7 @@ URL: [url]', 'settings_previewWidthList' => 'Largeur des vignettes (vue liste)', 'settings_previewWidthList_desc' => 'Largeur des vignettes affichées dans les listes', 'settings_printDisclaimer' => 'Afficher la clause de non-responsabilité', -'settings_printDisclaimer_desc' => 'If true the disclaimer message the lang.inc files will be print on the bottom of the page', +'settings_printDisclaimer_desc' => 'Si activé, le message d’avertissement sera affiché en bas de chaque page.', 'settings_quota' => 'Quota de l\'utilisateur', 'settings_quota_desc' => 'Le maximum de bytes qu\'un utilisateur peut utiliser sur le disque. Définir à 0 pour un espace illimité. Cette valeur peut être outrepasser pour chaque utilisation dans son profile.', 'settings_removeFromDropFolder' => 'Supprimer le fichier du dossier de dépôt après un upload résussi', @@ -1187,7 +1197,7 @@ URL: [url]', 'settings_restricted' => 'Accès restreint', 'settings_restricted_desc' => 'Autoriser les utilisateurs à se connecter seulement s\'ils ont une entrée dans la BD locale (independamment d\'une authentification réussie avec LDAP)', 'settings_rootDir' => 'Répertoire racine', -'settings_rootDir_desc' => 'Chemin où se trouve letoDMS', +'settings_rootDir_desc' => 'Chemin où se trouve SeedDMS', 'settings_rootFolderID' => 'ID du répertoire racine', 'settings_rootFolderID_desc' => 'ID du répertoire racine (la plupart du temps pas besoin de changer)', 'settings_SaveError' => 'Erreur de sauvegarde du fichier de configuration', @@ -1200,7 +1210,7 @@ URL: [url]', 'settings_siteDefaultPage' => 'Page par défaut du site', 'settings_siteDefaultPage_desc' => 'Page par défaut lors de la connexion. Si vide, valeur par défaut à out/out.ViewFolder.php', 'settings_siteName' => 'Nom du site', -'settings_siteName_desc' => 'Nom du site utilisé dans les titres de page. Par défaut: letoDMS', +'settings_siteName_desc' => 'Nom du site utilisé pour les titres de pages. Par défaut : SeedDMS', 'settings_SMTP' => 'Paramètres du serveur SMTP', 'settings_smtpPassword' => 'Mot de passe du serveur SMTP', 'settings_smtpPassword_desc' => 'Mot de passe du serveur SMTP', @@ -1237,7 +1247,7 @@ URL: [url]', 'settings_undelUserIds' => 'ID Utilisateurs Non Effaçables', 'settings_undelUserIds_desc' => 'Liste des identifiants des utilisateurs qui ne peuvent pas être supprimés. Séparer les identifiants par des virgules.', 'settings_updateDatabase' => 'Exécuter les scripts de mise à jour du schéma de la base', -'settings_updateNotifyTime' => 'Update Notify Time', +'settings_updateNotifyTime' => 'Délai de notification des modifications', 'settings_updateNotifyTime_desc' => 'Users are notified about document-changes that took place within the last \'Update Notify Time\' seconds', 'settings_upgrade_php' => 'Mettez à jour PHP vers une version au moins égale à 5.2.0', 'settings_versioningFileName' => 'Versioning filename', @@ -1256,7 +1266,7 @@ URL: [url]', 'set_owner_error' => 'Error setting owner', 'set_password' => 'Définir mot de passe', 'set_workflow' => 'Définir le Workflow', -'signed_in_as' => 'Vous êtes connecté en tant que', +'signed_in_as' => 'Connecté en tant que', 'sign_in' => 'Connexion', 'sign_out' => 'Déconnexion', 'sign_out_user' => 'Déconnecter l\'utilisateur', @@ -1283,12 +1293,12 @@ URL: [url]', 'splash_edit_user' => 'Utilisateur modifié', 'splash_error_add_to_transmittal' => '', 'splash_folder_edited' => '', -'splash_importfs' => '', +'splash_importfs' => '[docs] documents et [folders] dossiers importés', 'splash_invalid_folder_id' => 'Identifiant de répertoire invalide', 'splash_invalid_searchterm' => 'Recherche invalide', 'splash_moved_clipboard' => 'Presse-papier déplacé dans le répertoire courant', -'splash_move_document' => '', -'splash_move_folder' => '', +'splash_move_document' => 'Document déplacé', +'splash_move_folder' => 'Dossier déplacé', 'splash_removed_from_clipboard' => 'Enlevé du presse-papiers', 'splash_rm_attribute' => 'Attribut supprimé', 'splash_rm_document' => 'Document supprimé', @@ -1324,7 +1334,7 @@ URL: [url]', 'status_revisor_removed' => '', 'status_unknown' => 'Inconnu', 'storage_size' => 'Taille occupée', -'submit_2_fact_auth' => '', +'submit_2_fact_auth' => 'Enregistrer la clé secrète', 'submit_approval' => 'Soumettre approbation', 'submit_login' => 'Connexion', 'submit_password' => 'Entrez nouveau mot de passe', @@ -1337,30 +1347,30 @@ URL: [url]', 'substitute_to_user' => '', 'substitute_user' => 'Utilisateur de substitution', 'success_add_aro' => '', -'success_add_permission' => '', -'success_remove_permission' => '', -'success_toogle_permission' => '', +'success_add_permission' => 'Permission ajoutée', +'success_remove_permission' => 'Permission supprimée', +'success_toogle_permission' => 'Permission modifiée', 'sunday' => 'Dimanche', 'sunday_abbr' => 'Dim.', 'sv_SE' => 'Suédois', 'switched_to' => 'Connexion provisoire sous', -'takeOverGrpApprover' => '', -'takeOverGrpReviewer' => '', -'takeOverIndApprover' => '', -'takeOverIndReviewer' => '', -'tasks' => '', -'testmail_body' => '', -'testmail_subject' => '', +'takeOverGrpApprover' => 'Récupérer le groupe d\'approbateurs de la dernière version.', +'takeOverGrpReviewer' => 'Récupérer le groupe d\'examinateurs de la dernière version.', +'takeOverIndApprover' => 'Récupérer les approbateurs de la dernière version.', +'takeOverIndReviewer' => 'Récupérer les examinateurs de la dernière version.', +'tasks' => 'Tâches', +'testmail_body' => 'Ce message est un test pour vérifier la configuration mail de SeedDMS.', +'testmail_subject' => 'E-mail test', 'theme' => 'Thème', 'thursday' => 'Jeudi', 'thursday_abbr' => 'Jeu.', 'timeline' => 'Chronologie', 'timeline_add_file' => 'Nouvelle Pièce Jointe', -'timeline_add_version' => '', +'timeline_add_version' => 'Nouvelle version ([version])', 'timeline_full_add_file' => '', -'timeline_full_add_version' => '', -'timeline_full_status_change' => '', -'timeline_selected_item' => '', +'timeline_full_add_version' => '[document]
    Nouvelle version ([version])', +'timeline_full_status_change' => '[document]
    Version [version] : [status]', +'timeline_selected_item' => 'Document sélectionné', 'timeline_skip_add_file' => 'avec attachements', 'timeline_skip_status_change_-1' => 'rejetés', 'timeline_skip_status_change_-3' => 'expirés', @@ -1371,17 +1381,26 @@ URL: [url]', 'timeline_status_change' => 'Version [version] : [status]', 'to' => 'Au', 'toggle_manager' => 'Basculer \'Responsable\'', -'toggle_qrcode' => '', +'toggle_qrcode' => 'Afficher/masquer le QR code', 'to_before_from' => '', 'transition_triggered_email' => 'Transition de workflow activé', -'transition_triggered_email_body' => '', +'transition_triggered_email_body' => 'Transition de workflow déclenchée +Document : [name] +Version : [version] +Commentaires : [comment] +Workflow : [workflow] +État précédent : [previous_state] +État courant : [current_state] +Dossier parent : [folder_path] +Utilisateur : [username] +URL : [url]', 'transition_triggered_email_subject' => '', 'transmittal' => '', 'transmittalitem_removed' => '', 'transmittalitem_updated' => '', -'transmittal_comment' => '', -'transmittal_name' => '', -'transmittal_size' => '', +'transmittal_comment' => 'Commentaire', +'transmittal_name' => 'Nom', +'transmittal_size' => 'Taille', 'tree_loading' => 'Patientez pendant le chargement de l\'arborescence des documents', 'trigger_workflow' => 'Workflow', 'tr_TR' => 'Turc', @@ -1417,7 +1436,7 @@ URL: [url]', 'update_revisors' => '', 'update_transmittalitem' => '', 'uploaded_by' => 'Déposé par', -'uploading_failed' => 'Dépose du document échoué. SVP Contactez le responsable.', +'uploading_failed' => 'Dépôt d\'un des documents échoué. Veuillez vérifier la taille d\'envoi maximale autorisée.', 'uploading_maxsize' => 'La taille du fichier téléchargé excède la taille maximale accepté', 'uploading_zerosize' => 'Chargement d\'un fichier vide. Chargement annulé.', 'used_discspace' => 'Espace disque utilisé', From 819602ee1a2967f97e452c439eed589acd46b790 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 31 Oct 2016 14:54:19 +0100 Subject: [PATCH 055/164] some new phrases in settings --- languages/ar_EG/lang.inc | 4 ++++ languages/bg_BG/lang.inc | 4 ++++ languages/ca_ES/lang.inc | 4 ++++ languages/cs_CZ/lang.inc | 4 ++++ languages/de_DE/lang.inc | 10 +++++++--- languages/el_GR/lang.inc | 4 ++++ languages/en_GB/lang.inc | 6 +++++- languages/es_ES/lang.inc | 4 ++++ languages/hr_HR/lang.inc | 4 ++++ languages/hu_HU/lang.inc | 4 ++++ languages/it_IT/lang.inc | 4 ++++ languages/ko_KR/lang.inc | 4 ++++ languages/nl_NL/lang.inc | 4 ++++ languages/pl_PL/lang.inc | 4 ++++ languages/pt_BR/lang.inc | 4 ++++ languages/ro_RO/lang.inc | 4 ++++ languages/ru_RU/lang.inc | 4 ++++ languages/sk_SK/lang.inc | 4 ++++ languages/sv_SE/lang.inc | 4 ++++ languages/tr_TR/lang.inc | 4 ++++ languages/uk_UA/lang.inc | 4 ++++ languages/zh_CN/lang.inc | 4 ++++ languages/zh_TW/lang.inc | 4 ++++ 23 files changed, 96 insertions(+), 4 deletions(-) diff --git a/languages/ar_EG/lang.inc b/languages/ar_EG/lang.inc index 1797e244e..71671935d 100644 --- a/languages/ar_EG/lang.inc +++ b/languages/ar_EG/lang.inc @@ -1042,6 +1042,8 @@ URL: [url]', 'settings_enable2FactorAuthentication_desc' => '', 'settings_enableAcknowledgeWorkflow' => '', 'settings_enableAcknowledgeWorkflow_desc' => '', +'settings_enableAdminReceipt' => '', +'settings_enableAdminReceipt_desc' => '', 'settings_enableAdminRevApp' => '', 'settings_enableAdminRevApp_desc' => '', 'settings_enableCalendar' => '', @@ -1078,6 +1080,8 @@ URL: [url]', 'settings_enableNotificationWorkflow_desc' => '', 'settings_enableOwnerNotification' => '', 'settings_enableOwnerNotification_desc' => '', +'settings_enableOwnerReceipt' => '', +'settings_enableOwnerReceipt_desc' => '', 'settings_enableOwnerRevApp' => '', 'settings_enableOwnerRevApp_desc' => '', 'settings_enablePasswordForgotten' => '', diff --git a/languages/bg_BG/lang.inc b/languages/bg_BG/lang.inc index 8084082c1..b0a5e086b 100644 --- a/languages/bg_BG/lang.inc +++ b/languages/bg_BG/lang.inc @@ -907,6 +907,8 @@ $text = array( 'settings_enable2FactorAuthentication_desc' => '', 'settings_enableAcknowledgeWorkflow' => '', 'settings_enableAcknowledgeWorkflow_desc' => '', +'settings_enableAdminReceipt' => '', +'settings_enableAdminReceipt_desc' => '', 'settings_enableAdminRevApp' => 'Разреши Admin Rev App', 'settings_enableAdminRevApp_desc' => 'Изключи, за да скрия админа от списъка с рецензиращи/утвърждаващи', 'settings_enableCalendar' => 'Включи календаря', @@ -943,6 +945,8 @@ $text = array( 'settings_enableNotificationWorkflow_desc' => '', 'settings_enableOwnerNotification' => 'Enable owner notification by default', 'settings_enableOwnerNotification_desc' => 'Check for adding a notification for the owner if a document when it is added.', +'settings_enableOwnerReceipt' => '', +'settings_enableOwnerReceipt_desc' => '', 'settings_enableOwnerRevApp' => '', 'settings_enableOwnerRevApp_desc' => '', 'settings_enablePasswordForgotten' => 'Включи възстанавяване на парола', diff --git a/languages/ca_ES/lang.inc b/languages/ca_ES/lang.inc index 65cf5696c..1cae840b8 100644 --- a/languages/ca_ES/lang.inc +++ b/languages/ca_ES/lang.inc @@ -912,6 +912,8 @@ URL: [url]', 'settings_enable2FactorAuthentication_desc' => '', 'settings_enableAcknowledgeWorkflow' => '', 'settings_enableAcknowledgeWorkflow_desc' => '', +'settings_enableAdminReceipt' => '', +'settings_enableAdminReceipt_desc' => '', 'settings_enableAdminRevApp' => '', 'settings_enableAdminRevApp_desc' => '', 'settings_enableCalendar' => '', @@ -948,6 +950,8 @@ URL: [url]', 'settings_enableNotificationWorkflow_desc' => '', 'settings_enableOwnerNotification' => '', 'settings_enableOwnerNotification_desc' => '', +'settings_enableOwnerReceipt' => '', +'settings_enableOwnerReceipt_desc' => '', 'settings_enableOwnerRevApp' => '', 'settings_enableOwnerRevApp_desc' => '', 'settings_enablePasswordForgotten' => '', diff --git a/languages/cs_CZ/lang.inc b/languages/cs_CZ/lang.inc index 198a250d8..6a3d754e9 100644 --- a/languages/cs_CZ/lang.inc +++ b/languages/cs_CZ/lang.inc @@ -1051,6 +1051,8 @@ URL: [url]', 'settings_enable2FactorAuthentication_desc' => '', 'settings_enableAcknowledgeWorkflow' => '', 'settings_enableAcknowledgeWorkflow_desc' => '', +'settings_enableAdminReceipt' => '', +'settings_enableAdminReceipt_desc' => '', 'settings_enableAdminRevApp' => '', 'settings_enableAdminRevApp_desc' => '', 'settings_enableCalendar' => '', @@ -1087,6 +1089,8 @@ URL: [url]', 'settings_enableNotificationWorkflow_desc' => '', 'settings_enableOwnerNotification' => 'Povolit oznámení vlastníka standardně', 'settings_enableOwnerNotification_desc' => 'Označit pro přidání oznámení pro vlastníka v případě, kdy dokument je přidán.', +'settings_enableOwnerReceipt' => '', +'settings_enableOwnerReceipt_desc' => '', 'settings_enableOwnerRevApp' => 'Povolit posouzení/schválení pro majitele', 'settings_enableOwnerRevApp_desc' => 'Povolte to, pokud chcete, aby byl vlastník dokumentu uveden jako posuzovatel/schvalovatel a pro přechody pracovního postupu.', 'settings_enablePasswordForgotten' => 'Enable Password forgotten', diff --git a/languages/de_DE/lang.inc b/languages/de_DE/lang.inc index 6139d6a2f..d9d4a5ee6 100644 --- a/languages/de_DE/lang.inc +++ b/languages/de_DE/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (2319), dgrutsch (21) +// Translators: Admin (2325), dgrutsch (21) $text = array( '2_factor_auth' => '2-Faktor Authentifizierung', @@ -1094,8 +1094,10 @@ URL: [url]', 'settings_enable2FactorAuthentication_desc' => 'Schaltet die 2-Faktor Authentifizierung ein, welche den Google Authenticator auf dem Mobiltelefon erfordert.', 'settings_enableAcknowledgeWorkflow' => 'Ermögliche Bestätigung des Dokumentenempfang', 'settings_enableAcknowledgeWorkflow_desc' => 'Anwählen, um den Workflow zur Kenntnisnahme von Dokumenten einzuschalten', +'settings_enableAdminReceipt' => 'Admin darf Empfang bestätigen', +'settings_enableAdminReceipt_desc' => 'Anwählen, um Administratoren in der Liste der Personen für eine Empfangsbestätigung auszugeben', 'settings_enableAdminRevApp' => 'Admin darf freigeben/prüfen', -'settings_enableAdminRevApp_desc' => 'Anwählen, um Administratoren in der Liste der Prüfer und Freigeber auszugeben', +'settings_enableAdminRevApp_desc' => 'Anwählen, um Administratoren in der Liste der Prüfer und Freigeber und als Beteiligte in Workflows auszugeben', 'settings_enableCalendar' => 'Kalender einschalten', 'settings_enableCalendar_desc' => 'Kalender ein/ausschalten', 'settings_enableClipboard' => 'Zwischenablage einschalten', @@ -1130,6 +1132,8 @@ URL: [url]', 'settings_enableNotificationWorkflow_desc' => 'Wenn diese Option eingeschaltet ist, werden die Benutzer und Gruppen, die im nächsten Workflow-Schritt aktiv werden müssen, informiert. Selbst dann, wenn Sie für das Dokument keine Benachrichtigung eingetragen haben.', 'settings_enableOwnerNotification' => 'Besitzer als Beobachter eintragen', 'settings_enableOwnerNotification_desc' => 'Setzen Sie diese Option, wenn der Besitzer eines Dokuments nach dem Hochladen in die Liste der Beobachter eingetragen werden soll.', +'settings_enableOwnerReceipt' => 'Erlaube Empfangsbestätigung durch Besitzer', +'settings_enableOwnerReceipt_desc' => 'Anwählen, um den Besitzer eines Dokuments in der Liste der Empfänger auswählbar zu machen.', 'settings_enableOwnerRevApp' => 'Erlaube Prüfung/Freigabe durch Besitzer', 'settings_enableOwnerRevApp_desc' => 'Anwählen, um den Besitzer eines Dokuments in der Liste der Prüfer/Freigeber und für Workflow-Aktionen auswählbar zu machen.', 'settings_enablePasswordForgotten' => 'Passwort-Vergessen Funktion einschalten', @@ -1206,7 +1210,7 @@ URL: [url]', 'settings_maxRecursiveCount' => 'Max. Anzahl Anzahl rekursiver Dokumente/Ordner.', 'settings_maxRecursiveCount_desc' => 'Dies ist die maximale Anzahl der Dokumente und Ordner die auf Zugriffsrechte geprüft werden, wenn rekursiv gezählt wird. Wenn diese Anzahl überschritten wird, wird die Anzahl der Dokumente und Unterordner in der Ordner Ansicht geschätzt.', 'settings_maxSizeForFullText' => 'Maximale Dateigröße für sofortige Indezierung', -'settings_maxSizeForFullText_desc' => 'Alle neue Version eines Dokuments, die kleiner als die die konfigurierte Dateigröße sind, werden sofort indiziert. In allen anderen Fällen werden nur die Metadaten erfasst.', +'settings_maxSizeForFullText_desc' => 'Alle neuen Versionen eines Dokuments, die kleiner als die konfigurierte Dateigröße in Bytes sind, werden sofort indiziert. In allen anderen Fällen werden nur die Metadaten erfasst.', 'settings_more_settings' => 'Weitere Einstellungen. Login mit admin/admin', 'settings_notfound' => 'Nicht gefunden', 'settings_Notification' => 'Benachrichtigungen-Einstellungen', diff --git a/languages/el_GR/lang.inc b/languages/el_GR/lang.inc index 3df67683b..15802fe0b 100644 --- a/languages/el_GR/lang.inc +++ b/languages/el_GR/lang.inc @@ -918,6 +918,8 @@ URL: [url]', 'settings_enable2FactorAuthentication_desc' => '', 'settings_enableAcknowledgeWorkflow' => '', 'settings_enableAcknowledgeWorkflow_desc' => '', +'settings_enableAdminReceipt' => '', +'settings_enableAdminReceipt_desc' => '', 'settings_enableAdminRevApp' => '', 'settings_enableAdminRevApp_desc' => '', 'settings_enableCalendar' => '', @@ -954,6 +956,8 @@ URL: [url]', 'settings_enableNotificationWorkflow_desc' => '', 'settings_enableOwnerNotification' => '', 'settings_enableOwnerNotification_desc' => '', +'settings_enableOwnerReceipt' => '', +'settings_enableOwnerReceipt_desc' => '', 'settings_enableOwnerRevApp' => '', 'settings_enableOwnerRevApp_desc' => '', 'settings_enablePasswordForgotten' => '', diff --git a/languages/en_GB/lang.inc b/languages/en_GB/lang.inc index 5a252dc3c..71fdbaf77 100644 --- a/languages/en_GB/lang.inc +++ b/languages/en_GB/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (1455), dgrutsch (7), netixw (14) +// Translators: Admin (1457), dgrutsch (7), netixw (14) $text = array( '2_factor_auth' => '2-factor authentication', @@ -1089,6 +1089,8 @@ URL: [url]', 'settings_enable2FactorAuthentication_desc' => 'Enable/disable 2 factor authentication. The users will need the Google Authenticator on its mobile phone.', 'settings_enableAcknowledgeWorkflow' => 'Enable acknowledge of document reception', 'settings_enableAcknowledgeWorkflow_desc' => 'Enable, to turn on the workflow to acknowledge document reception.', +'settings_enableAdminReceipt' => 'Allow recepiton of documetns for admins', +'settings_enableAdminReceipt_desc' => 'Enable this if you want administrators to be listed as recipients of documents.', 'settings_enableAdminRevApp' => 'Allow review/approval for admins', 'settings_enableAdminRevApp_desc' => 'Enable this if you want administrators to be listed as reviewers/approvers and for workflow transitions.', 'settings_enableCalendar' => 'Enable Calendar', @@ -1125,6 +1127,8 @@ URL: [url]', 'settings_enableNotificationWorkflow_desc' => 'If this option is enabled, the users and groups which need to take action in the next workflow transition will be notified. Even if they have not added a notification for the document.', 'settings_enableOwnerNotification' => 'Enable owner notification by default', 'settings_enableOwnerNotification_desc' => 'Check for adding a notification for the owner if a document when it is added.', +'settings_enableOwnerReceipt' => '', +'settings_enableOwnerReceipt_desc' => '', 'settings_enableOwnerRevApp' => 'Allow review/approval for owner', 'settings_enableOwnerRevApp_desc' => 'Enable this if you want the owner of a document to be listed as reviewers/approvers and for workflow transitions.', 'settings_enablePasswordForgotten' => 'Enable Password forgotten', diff --git a/languages/es_ES/lang.inc b/languages/es_ES/lang.inc index 2af9a3861..8841b25cf 100644 --- a/languages/es_ES/lang.inc +++ b/languages/es_ES/lang.inc @@ -1057,6 +1057,8 @@ URL: [url]', 'settings_enable2FactorAuthentication_desc' => '', 'settings_enableAcknowledgeWorkflow' => '', 'settings_enableAcknowledgeWorkflow_desc' => '', +'settings_enableAdminReceipt' => '', +'settings_enableAdminReceipt_desc' => '', 'settings_enableAdminRevApp' => 'Habilitar Administrador Rev Apr', 'settings_enableAdminRevApp_desc' => 'Deseleccione para no mostrar al administrador como revisor/aprobador', 'settings_enableCalendar' => 'Habilitar calendario', @@ -1093,6 +1095,8 @@ URL: [url]', 'settings_enableNotificationWorkflow_desc' => 'Si esta opción esta activa, los usuarios y grupos que deban tomar una acción en la siguiente transacción del flujo, serán notificados. Incluso si ellos no han adicionado una notificación al documento.', 'settings_enableOwnerNotification' => 'Habilitar notificación al propietario por defecto', 'settings_enableOwnerNotification_desc' => 'Marcar para añadir una notificación al propietario del documento cuando es añadido.', +'settings_enableOwnerReceipt' => '', +'settings_enableOwnerReceipt_desc' => '', 'settings_enableOwnerRevApp' => 'Permitir al propietario revisar/aprobar', 'settings_enableOwnerRevApp_desc' => 'Habilitar esto si quiere que el propietario de un documento sea listado como revisor/aprobador y para las transiciones del flujo de trabajo.', 'settings_enablePasswordForgotten' => 'Habilitar recordatorio de contraseña', diff --git a/languages/hr_HR/lang.inc b/languages/hr_HR/lang.inc index 7ea0151de..b2ec028d6 100644 --- a/languages/hr_HR/lang.inc +++ b/languages/hr_HR/lang.inc @@ -1078,6 +1078,8 @@ Internet poveznica: [url]', 'settings_enable2FactorAuthentication_desc' => '', 'settings_enableAcknowledgeWorkflow' => 'Omogućavanje potvrđivanja prijema dokumenta', 'settings_enableAcknowledgeWorkflow_desc' => 'Omogućite kako bi omogućili tok rada za potvrđivajne prijema dokumenta.', +'settings_enableAdminReceipt' => '', +'settings_enableAdminReceipt_desc' => '', 'settings_enableAdminRevApp' => 'Dopusti pregled/ovjeru za administratore', 'settings_enableAdminRevApp_desc' => 'Omogući ovo ako želiš da administratori budu navedeni kao recezenti/validatori i za promjenu toka rada.', 'settings_enableCalendar' => 'Omogući Kalendar', @@ -1114,6 +1116,8 @@ Internet poveznica: [url]', 'settings_enableNotificationWorkflow_desc' => 'Ukoliko je ova opcija uključena, korisnici i grupe koji trebaju odraditi neku aktivnost prema definiciji poslovnog toka u slijedećoj fazi toka, će biti obaviješteni. Čak i u slučaju kad nisu dodali opciju obavještavanja za dokument.', 'settings_enableOwnerNotification' => 'Omogući obavješćivanje vlasnika', 'settings_enableOwnerNotification_desc' => 'Označi za dodavanje obavješćivanja vlasnika kada je dodan dokument.', +'settings_enableOwnerReceipt' => '', +'settings_enableOwnerReceipt_desc' => '', 'settings_enableOwnerRevApp' => 'Omogući vlasnika za recezenta/validatora', 'settings_enableOwnerRevApp_desc' => 'Omogućite ovo ako želite da vlasnik dokumenta bude naveden kao recezent/validator i za promjene tokova rada.', 'settings_enablePasswordForgotten' => 'Omogući zaboravljanje lozinke', diff --git a/languages/hu_HU/lang.inc b/languages/hu_HU/lang.inc index 8be5f45f6..797eb0ab6 100644 --- a/languages/hu_HU/lang.inc +++ b/languages/hu_HU/lang.inc @@ -1056,6 +1056,8 @@ URL: [url]', 'settings_enable2FactorAuthentication_desc' => '', 'settings_enableAcknowledgeWorkflow' => '', 'settings_enableAcknowledgeWorkflow_desc' => '', +'settings_enableAdminReceipt' => '', +'settings_enableAdminReceipt_desc' => '', 'settings_enableAdminRevApp' => 'Engedélyezi a felülvizsgálatot/jóváhagyást az adminisztrátorok számára', 'settings_enableAdminRevApp_desc' => 'Engedélyezze, ha szeretné, hogy az adminisztrátorok listázva legyenek a felülvizsgálóknál/jóváhagyóknál és a munkamenet átmeneteknél.', 'settings_enableCalendar' => 'Naptár engedélyezése', @@ -1092,6 +1094,8 @@ URL: [url]', 'settings_enableNotificationWorkflow_desc' => 'Ha ez az opció be van kapcsolva, a felhasználók és csoportok melyekkel műveletet kell végezni a következő munkafolyamat-átmenetnél értesítést kapnak. Akkor is, ha nem adtak hozzá értesítőt.', 'settings_enableOwnerNotification' => 'Engedélyezi a tulajdonos értesítését alapesetben', 'settings_enableOwnerNotification_desc' => 'Ellenőrzi az értesítés hozzáadását a tulajdonosnak ha egy dokumentum hozzáadásra kerül.', +'settings_enableOwnerReceipt' => '', +'settings_enableOwnerReceipt_desc' => '', 'settings_enableOwnerRevApp' => 'Engedélyezi a felülvizsgálatot/jóváhagyást a tulajdonosnak', 'settings_enableOwnerRevApp_desc' => 'Engedélyezze, ha szeretné, hogy a dokumentum tulajdonosa listázásra kerüljön a felülvizsgálóknál/jóváhagyóknál és a munkamenet átmeneteknél.', 'settings_enablePasswordForgotten' => 'Jelszó emlékeztető engedélyezése', diff --git a/languages/it_IT/lang.inc b/languages/it_IT/lang.inc index f645d50d7..ab9db0fd5 100644 --- a/languages/it_IT/lang.inc +++ b/languages/it_IT/lang.inc @@ -1090,6 +1090,8 @@ URL: [url]', 'settings_enable2FactorAuthentication_desc' => 'Abilitare / disabilitare autenticazione a due fattori. Gli utenti avranno bisogno di "Google Authenticator" sul tuo telefono cellulare.', 'settings_enableAcknowledgeWorkflow' => 'Abilitare per notifiche', 'settings_enableAcknowledgeWorkflow_desc' => 'Abilitare per attivare sul workflow le ricevute di notifica.', +'settings_enableAdminReceipt' => '', +'settings_enableAdminReceipt_desc' => '', 'settings_enableAdminRevApp' => 'Permetti la revisione/approvazione da parte degli amministratori', 'settings_enableAdminRevApp_desc' => 'Abilita per elencare gli amministratori tra i revisori/approvatori e per le transizioni del flusso di lavoro', 'settings_enableCalendar' => 'Abilita calendario', @@ -1126,6 +1128,8 @@ URL: [url]', 'settings_enableNotificationWorkflow_desc' => 'Se questa opzione è selezionata, gli utenti o i gruppi che sono coinvolti nella successiva transizione del flusso di lavoro riceveranno un avviso, anche se non hanno impostato notifiche riguardanti il documento.', 'settings_enableOwnerNotification' => 'Abilita/disabilita notifica al proprietario', 'settings_enableOwnerNotification_desc' => 'Spuntare per inviare una notifica al proprietario del documento nel momento in cui questo viene aggiunto.', +'settings_enableOwnerReceipt' => '', +'settings_enableOwnerReceipt_desc' => '', 'settings_enableOwnerRevApp' => 'Permetti la revisione/approvazione per il proprietario', 'settings_enableOwnerRevApp_desc' => 'Spuntare per aggiungere il proprietario del documento alla lista dei revisori/approvatori e per le transizioni del flusso di lavoro.', 'settings_enablePasswordForgotten' => 'Abilita recupero password', diff --git a/languages/ko_KR/lang.inc b/languages/ko_KR/lang.inc index ce170ddc3..fa7f17461 100644 --- a/languages/ko_KR/lang.inc +++ b/languages/ko_KR/lang.inc @@ -1071,6 +1071,8 @@ URL : [url]', 'settings_enable2FactorAuthentication_desc' => '', 'settings_enableAcknowledgeWorkflow' => '문서 수신의 응답 활성화', 'settings_enableAcknowledgeWorkflow_desc' => '문서의 수신 확인을 위해 워크플로어를 선택하고 활성화 합니다.', +'settings_enableAdminReceipt' => '', +'settings_enableAdminReceipt_desc' => '', 'settings_enableAdminRevApp' => '관리자에 대한 검토 / 승인 허용', 'settings_enableAdminRevApp_desc' => '관리자가 검토 / 승인으로 워크플로우를 전환 할 경우에 사용.', 'settings_enableCalendar' => '달력 활성화', @@ -1107,6 +1109,8 @@ URL : [url]', 'settings_enableNotificationWorkflow_desc' => '문서의 통지를 추가 하지 않은 경우라도 이 옵션을 활성화하면 다음 워크플로우의 이행 조치가 필요한 사용자와 그룹에 통지 됩니다.', 'settings_enableOwnerNotification' => '기본적으로 소유자 알림 사용', 'settings_enableOwnerNotification_desc' => '추가 된 문서의 경우 소유자에 대한 알림을 추가 확인합니다.', +'settings_enableOwnerReceipt' => '', +'settings_enableOwnerReceipt_desc' => '', 'settings_enableOwnerRevApp' => '소유자에 대한 검토 / 승인을 허용', 'settings_enableOwnerRevApp_desc' => '이 문서의 소유자가 검토 / 승인으로 워크 플로우 전환에 대한 나열하고자 할 경우에 사용합니다.', 'settings_enablePasswordForgotten' => '비밀번호 분실 활성화', diff --git a/languages/nl_NL/lang.inc b/languages/nl_NL/lang.inc index 5e3a7be7d..de0d78882 100644 --- a/languages/nl_NL/lang.inc +++ b/languages/nl_NL/lang.inc @@ -1084,6 +1084,8 @@ URL: [url]', 'settings_enable2FactorAuthentication_desc' => '', 'settings_enableAcknowledgeWorkflow' => 'Aanzetten Workflow-stappen', 'settings_enableAcknowledgeWorkflow_desc' => 'Aanzetten workflow-stappen', +'settings_enableAdminReceipt' => '', +'settings_enableAdminReceipt_desc' => '', 'settings_enableAdminRevApp' => 'Inschakelen Beheer Contr/Beoord', 'settings_enableAdminRevApp_desc' => 'Uitvinken om beheerder niet te tonen als controleerder/beoordeler', 'settings_enableCalendar' => 'Inschakelen Kalendar', @@ -1120,6 +1122,8 @@ URL: [url]', 'settings_enableNotificationWorkflow_desc' => 'Workflow-notificatie aanzetten', 'settings_enableOwnerNotification' => 'Inschakelen eigenaarnotificatie standaard', 'settings_enableOwnerNotification_desc' => 'Inschakelen van notificatie naar de eigenaar als een document is toegevoegd.', +'settings_enableOwnerReceipt' => '', +'settings_enableOwnerReceipt_desc' => '', 'settings_enableOwnerRevApp' => 'Beoordeling / goedkeuring voor eigenaar toestaan', 'settings_enableOwnerRevApp_desc' => 'Activeer dit als de eigenaar van een document genoteerd staat as beoordelaar/ goedkeurder en voor workflow overdrachten.', 'settings_enablePasswordForgotten' => 'Inschakelen wachtwoord vergeten', diff --git a/languages/pl_PL/lang.inc b/languages/pl_PL/lang.inc index 70b4f8ede..dbea0d887 100644 --- a/languages/pl_PL/lang.inc +++ b/languages/pl_PL/lang.inc @@ -1036,6 +1036,8 @@ URL: [url]', 'settings_enable2FactorAuthentication_desc' => '', 'settings_enableAcknowledgeWorkflow' => '', 'settings_enableAcknowledgeWorkflow_desc' => '', +'settings_enableAdminReceipt' => '', +'settings_enableAdminReceipt_desc' => '', 'settings_enableAdminRevApp' => 'Dołącz Administratora do recenzji/rewizji', 'settings_enableAdminRevApp_desc' => 'Odznacz aby usunąć Administratora z listy zatwierdzających/recenzentów', 'settings_enableCalendar' => 'Włącz kalendarz', @@ -1072,6 +1074,8 @@ URL: [url]', 'settings_enableNotificationWorkflow_desc' => '', 'settings_enableOwnerNotification' => 'Włącz domyślne powiadamianie właściciela', 'settings_enableOwnerNotification_desc' => 'Zaznacz aby właściciel pliku był powiadamiany zmianach w pliku.', +'settings_enableOwnerReceipt' => '', +'settings_enableOwnerReceipt_desc' => '', 'settings_enableOwnerRevApp' => 'Pozwól przeglądać/zatwierdzenia właściciela', 'settings_enableOwnerRevApp_desc' => 'Włącz tę opcję jeżeli właściciel dokumentu powinien być wymieniony jako zatwierdzających/recenzentów oraz dla przepływu procesu', 'settings_enablePasswordForgotten' => 'Włącz odzyskiwanie hasła po jego zapomnieniu', diff --git a/languages/pt_BR/lang.inc b/languages/pt_BR/lang.inc index ea655b91f..b7c953fd3 100644 --- a/languages/pt_BR/lang.inc +++ b/languages/pt_BR/lang.inc @@ -1054,6 +1054,8 @@ URL: [url]', 'settings_enable2FactorAuthentication_desc' => '', 'settings_enableAcknowledgeWorkflow' => '', 'settings_enableAcknowledgeWorkflow_desc' => '', +'settings_enableAdminReceipt' => '', +'settings_enableAdminReceipt_desc' => '', 'settings_enableAdminRevApp' => 'Permitir revisão/aprovação para administradores', 'settings_enableAdminRevApp_desc' => 'Ative esta opção se quiser que os administradores sejam listados como revisores/aprovadores e para transições de fluxo de trabalho.', 'settings_enableCalendar' => 'Habilitar Calendário', @@ -1090,6 +1092,8 @@ URL: [url]', 'settings_enableNotificationWorkflow_desc' => '', 'settings_enableOwnerNotification' => 'Habilitar notificações ao proprietário por padrão', 'settings_enableOwnerNotification_desc' => 'Verifique se há adição de uma notificação para o proprietário, se um documento for adicionado.', +'settings_enableOwnerReceipt' => '', +'settings_enableOwnerReceipt_desc' => '', 'settings_enableOwnerRevApp' => 'Permitir revisão/aprovação para o proprietário', 'settings_enableOwnerRevApp_desc' => 'Habilite esta opção se quiser que o proprietário de um documento seja listado como revisores/aprovadores e para transições de fluxo de trabalho.', 'settings_enablePasswordForgotten' => 'Ativar Senhas esquecidas', diff --git a/languages/ro_RO/lang.inc b/languages/ro_RO/lang.inc index c29fc4296..06e9fae2c 100644 --- a/languages/ro_RO/lang.inc +++ b/languages/ro_RO/lang.inc @@ -1079,6 +1079,8 @@ URL: [url]', 'settings_enable2FactorAuthentication_desc' => '', 'settings_enableAcknowledgeWorkflow' => '', 'settings_enableAcknowledgeWorkflow_desc' => '', +'settings_enableAdminReceipt' => '', +'settings_enableAdminReceipt_desc' => '', 'settings_enableAdminRevApp' => 'Permite revizuirea/aprobarea pentru admini', 'settings_enableAdminRevApp_desc' => 'Activați această opțiune dacă doriți ca administratorii să fie listati ca revizuitori/aprobatori sau in tranzițiile workflow-ului.', 'settings_enableCalendar' => 'Activare Calendar', @@ -1115,6 +1117,8 @@ URL: [url]', 'settings_enableNotificationWorkflow_desc' => 'Daca aceasta optiune este activata, utilizatorii si grupurile care trebuie sa ia masuri in urmatorul pas din workflow vor fi notificati. Chiar daca ei nu au adaugat o notificare pentru document.', 'settings_enableOwnerNotification' => 'Activarea notificarii proprietarului, în mod implicit', 'settings_enableOwnerNotification_desc' => 'Bifati pentru a adăuga o notificare pentru proprietar în cazul în care un document este adăugat.', +'settings_enableOwnerReceipt' => '', +'settings_enableOwnerReceipt_desc' => '', 'settings_enableOwnerRevApp' => 'Permite revizuirea/aprobarea de catre proprietar', 'settings_enableOwnerRevApp_desc' => 'Activați această opțiune dacă doriți ca proprietarul unui document să fie listat ca revizuitor/aprobator sau in tranzițiile workflow-ului.', 'settings_enablePasswordForgotten' => 'Activați Am uitat parola', diff --git a/languages/ru_RU/lang.inc b/languages/ru_RU/lang.inc index 842d93a99..56f6ef6ff 100644 --- a/languages/ru_RU/lang.inc +++ b/languages/ru_RU/lang.inc @@ -1086,6 +1086,8 @@ URL: [url]', 'settings_enable2FactorAuthentication_desc' => '', 'settings_enableAcknowledgeWorkflow' => 'Включить подтверждение получения документа', 'settings_enableAcknowledgeWorkflow_desc' => 'Включить для активации функции подтверждения получения документа', +'settings_enableAdminReceipt' => '', +'settings_enableAdminReceipt_desc' => '', 'settings_enableAdminRevApp' => 'Администратор как
    рецензирующий и утверждающий', 'settings_enableAdminRevApp_desc' => 'Если отключено, администратор не отображается в списке рецензирующих и утверждающих.', 'settings_enableCalendar' => 'Включить календарь', @@ -1122,6 +1124,8 @@ URL: [url]', 'settings_enableNotificationWorkflow_desc' => 'Если эта опция включена, пользователи и группы, которым необходимо совершить действия в следующей стадии процесса, будут уведомлены. Даже если они не подписаны на уведомления для данного документа.', 'settings_enableOwnerNotification' => 'Извещать владельца по умолчанию', 'settings_enableOwnerNotification_desc' => 'Включите для отправки извещения владельцу при добавлении документа.', +'settings_enableOwnerReceipt' => '', +'settings_enableOwnerReceipt_desc' => '', 'settings_enableOwnerRevApp' => 'Разрешить рецензию/утверждение
    владельцем', 'settings_enableOwnerRevApp_desc' => 'Включите для того, чтобы владелец документа был в списке рецензентов/утверждающих и в изменении процесса.', 'settings_enablePasswordForgotten' => 'Включить восстановление пароля', diff --git a/languages/sk_SK/lang.inc b/languages/sk_SK/lang.inc index b304082c9..0f7b195b2 100644 --- a/languages/sk_SK/lang.inc +++ b/languages/sk_SK/lang.inc @@ -911,6 +911,8 @@ URL: [url]', 'settings_enable2FactorAuthentication_desc' => '', 'settings_enableAcknowledgeWorkflow' => '', 'settings_enableAcknowledgeWorkflow_desc' => '', +'settings_enableAdminReceipt' => '', +'settings_enableAdminReceipt_desc' => '', 'settings_enableAdminRevApp' => '', 'settings_enableAdminRevApp_desc' => '', 'settings_enableCalendar' => '', @@ -947,6 +949,8 @@ URL: [url]', 'settings_enableNotificationWorkflow_desc' => '', 'settings_enableOwnerNotification' => '', 'settings_enableOwnerNotification_desc' => '', +'settings_enableOwnerReceipt' => '', +'settings_enableOwnerReceipt_desc' => '', 'settings_enableOwnerRevApp' => '', 'settings_enableOwnerRevApp_desc' => '', 'settings_enablePasswordForgotten' => '', diff --git a/languages/sv_SE/lang.inc b/languages/sv_SE/lang.inc index e28162196..803b8ce28 100644 --- a/languages/sv_SE/lang.inc +++ b/languages/sv_SE/lang.inc @@ -1042,6 +1042,8 @@ URL: [url]', 'settings_enable2FactorAuthentication_desc' => '', 'settings_enableAcknowledgeWorkflow' => '', 'settings_enableAcknowledgeWorkflow_desc' => '', +'settings_enableAdminReceipt' => '', +'settings_enableAdminReceipt_desc' => '', 'settings_enableAdminRevApp' => 'Visa Admin i listan granska/godkänna', 'settings_enableAdminRevApp_desc' => 'Ta bort utval, så att administratören inte kan väljas som person som kan granska/godkänna', 'settings_enableCalendar' => 'Aktivera kalendern', @@ -1078,6 +1080,8 @@ URL: [url]', 'settings_enableNotificationWorkflow_desc' => '', 'settings_enableOwnerNotification' => 'Aktivera meddelande till dokumentägaren', 'settings_enableOwnerNotification_desc' => 'Kryssa i, för att skapa ett meddelande till ägaren av dokumentet, när en ny version av dokumentet har laddats upp.', +'settings_enableOwnerReceipt' => '', +'settings_enableOwnerReceipt_desc' => '', 'settings_enableOwnerRevApp' => 'Tillåt granskning/godkänning av dokumentägare', 'settings_enableOwnerRevApp_desc' => 'Aktivera om du vill att en dokumentägare visas i listan för personer som granskar/godkänner dokumentet och i övergång på arbetsflöden.', 'settings_enablePasswordForgotten' => 'Aktivera glömt lösenord', diff --git a/languages/tr_TR/lang.inc b/languages/tr_TR/lang.inc index 2f67aac82..8ae66ac44 100644 --- a/languages/tr_TR/lang.inc +++ b/languages/tr_TR/lang.inc @@ -1058,6 +1058,8 @@ URL: [url]', 'settings_enable2FactorAuthentication_desc' => '', 'settings_enableAcknowledgeWorkflow' => '', 'settings_enableAcknowledgeWorkflow_desc' => '', +'settings_enableAdminReceipt' => '', +'settings_enableAdminReceipt_desc' => '', 'settings_enableAdminRevApp' => 'Yöneticilere kontrol/onay izni ver', 'settings_enableAdminRevApp_desc' => 'Yöneticilerin kontrol/onay listesine eklenmesi ve iş akış süreçlerini yapabilmeleri için bu ayarı etkinleştirin.', 'settings_enableCalendar' => 'Takvimi Etkinleştir', @@ -1094,6 +1096,8 @@ URL: [url]', 'settings_enableNotificationWorkflow_desc' => '', 'settings_enableOwnerNotification' => 'Varsayılan olarak sahip bilgilendirmesi etkin.', 'settings_enableOwnerNotification_desc' => 'Yeni bir doküman eklendiğinde dokümanın sahibini bilgilendirmek için bunu etkinleştirin.', +'settings_enableOwnerReceipt' => '', +'settings_enableOwnerReceipt_desc' => '', 'settings_enableOwnerRevApp' => 'Sahip için kontrol etme/onaylamayı etkinleştir.', 'settings_enableOwnerRevApp_desc' => 'Bir dokümanın sahibinin kontrol eden/onaylayan listesinde ve iş akışında olmasını isterseniz bunu etkinleştirin.', 'settings_enablePasswordForgotten' => 'Parola Kurtarmayı Etkinleştir', diff --git a/languages/uk_UA/lang.inc b/languages/uk_UA/lang.inc index 6c2bc4000..9864b1954 100644 --- a/languages/uk_UA/lang.inc +++ b/languages/uk_UA/lang.inc @@ -1079,6 +1079,8 @@ URL: [url]', 'settings_enable2FactorAuthentication_desc' => '', 'settings_enableAcknowledgeWorkflow' => 'Увімкнути підтвердження отримання документу', 'settings_enableAcknowledgeWorkflow_desc' => 'Включіть для активації функції підтвердження отримання документу', +'settings_enableAdminReceipt' => '', +'settings_enableAdminReceipt_desc' => '', 'settings_enableAdminRevApp' => 'Адміністратор може бути
    рецензент і затверджувач', 'settings_enableAdminRevApp_desc' => 'Якщо відключено, адміністратор не відображається у списку рецензентів і затверджувачів.', 'settings_enableCalendar' => 'Увімкнути календар', @@ -1115,6 +1117,8 @@ URL: [url]', 'settings_enableNotificationWorkflow_desc' => 'Якщо ця опція активована, користувачі і групи, які повинні виконати якісь дії для виконання наступної стадії процесу, отримуватимуть сповіщення. Навіть якщо вони не включені в список сповіщення.', 'settings_enableOwnerNotification' => 'Сповіщати власника по замовчуванню', 'settings_enableOwnerNotification_desc' => 'Увімкніть для відправлення сповіщення власникові при додаванні документа.', +'settings_enableOwnerReceipt' => '', +'settings_enableOwnerReceipt_desc' => '', 'settings_enableOwnerRevApp' => 'Дозволити рецензію/затвердження
    власником', 'settings_enableOwnerRevApp_desc' => 'Увімкніть для того, щоб власник відображався в списку рецензентів/затверджувачів і для зміни процесу.', 'settings_enablePasswordForgotten' => 'Включити відновлення паролю', diff --git a/languages/zh_CN/lang.inc b/languages/zh_CN/lang.inc index 2b0b3c05d..b0de8692b 100644 --- a/languages/zh_CN/lang.inc +++ b/languages/zh_CN/lang.inc @@ -913,6 +913,8 @@ URL: [url]', 'settings_enable2FactorAuthentication_desc' => '', 'settings_enableAcknowledgeWorkflow' => '', 'settings_enableAcknowledgeWorkflow_desc' => '', +'settings_enableAdminReceipt' => '', +'settings_enableAdminReceipt_desc' => '', 'settings_enableAdminRevApp' => '', 'settings_enableAdminRevApp_desc' => '', 'settings_enableCalendar' => '', @@ -949,6 +951,8 @@ URL: [url]', 'settings_enableNotificationWorkflow_desc' => '', 'settings_enableOwnerNotification' => '', 'settings_enableOwnerNotification_desc' => '', +'settings_enableOwnerReceipt' => '', +'settings_enableOwnerReceipt_desc' => '', 'settings_enableOwnerRevApp' => '', 'settings_enableOwnerRevApp_desc' => '', 'settings_enablePasswordForgotten' => '', diff --git a/languages/zh_TW/lang.inc b/languages/zh_TW/lang.inc index c71fe6fd2..46f7c6091 100644 --- a/languages/zh_TW/lang.inc +++ b/languages/zh_TW/lang.inc @@ -911,6 +911,8 @@ URL: [url]', 'settings_enable2FactorAuthentication_desc' => '', 'settings_enableAcknowledgeWorkflow' => '', 'settings_enableAcknowledgeWorkflow_desc' => '', +'settings_enableAdminReceipt' => '', +'settings_enableAdminReceipt_desc' => '', 'settings_enableAdminRevApp' => '', 'settings_enableAdminRevApp_desc' => '', 'settings_enableCalendar' => '', @@ -947,6 +949,8 @@ URL: [url]', 'settings_enableNotificationWorkflow_desc' => '', 'settings_enableOwnerNotification' => '', 'settings_enableOwnerNotification_desc' => '', +'settings_enableOwnerReceipt' => '', +'settings_enableOwnerReceipt_desc' => '', 'settings_enableOwnerRevApp' => '', 'settings_enableOwnerRevApp_desc' => '', 'settings_enablePasswordForgotten' => '', From 77a77d12e6417d5b1c176416306e8198dafc8a0f Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 31 Oct 2016 15:05:39 +0100 Subject: [PATCH 056/164] new version 4.3.30 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 75dbff9d2..949e83eba 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -VERSION=4.3.29 +VERSION=4.3.30 SRC=CHANGELOG inc conf utils index.php languages views op out doc drop-tables-innodb.sql styles js TODO LICENSE Makefile webdav install restapi # webapp From 7248c1a6302be02866587d8997a9fa4b23f1a4fd Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 2 Nov 2016 12:24:13 +0100 Subject: [PATCH 057/164] add replacement for chosen --- .../select2/css/select2-bootstrap.css | 165 + styles/bootstrap/select2/css/select2.css | 484 ++ styles/bootstrap/select2/css/select2.min.css | 1 + styles/bootstrap/select2/js/i18n/ar.js | 3 + styles/bootstrap/select2/js/i18n/az.js | 3 + styles/bootstrap/select2/js/i18n/bg.js | 3 + styles/bootstrap/select2/js/i18n/ca.js | 3 + styles/bootstrap/select2/js/i18n/cs.js | 3 + styles/bootstrap/select2/js/i18n/da.js | 3 + styles/bootstrap/select2/js/i18n/de.js | 3 + styles/bootstrap/select2/js/i18n/el.js | 3 + styles/bootstrap/select2/js/i18n/en.js | 3 + styles/bootstrap/select2/js/i18n/es.js | 3 + styles/bootstrap/select2/js/i18n/et.js | 3 + styles/bootstrap/select2/js/i18n/eu.js | 3 + styles/bootstrap/select2/js/i18n/fa.js | 3 + styles/bootstrap/select2/js/i18n/fi.js | 3 + styles/bootstrap/select2/js/i18n/fr.js | 3 + styles/bootstrap/select2/js/i18n/gl.js | 3 + styles/bootstrap/select2/js/i18n/he.js | 3 + styles/bootstrap/select2/js/i18n/hi.js | 3 + styles/bootstrap/select2/js/i18n/hr.js | 3 + styles/bootstrap/select2/js/i18n/hu.js | 3 + styles/bootstrap/select2/js/i18n/id.js | 3 + styles/bootstrap/select2/js/i18n/is.js | 3 + styles/bootstrap/select2/js/i18n/it.js | 3 + styles/bootstrap/select2/js/i18n/ja.js | 3 + styles/bootstrap/select2/js/i18n/km.js | 3 + styles/bootstrap/select2/js/i18n/ko.js | 3 + styles/bootstrap/select2/js/i18n/lt.js | 3 + styles/bootstrap/select2/js/i18n/lv.js | 3 + styles/bootstrap/select2/js/i18n/mk.js | 3 + styles/bootstrap/select2/js/i18n/ms.js | 3 + styles/bootstrap/select2/js/i18n/nb.js | 3 + styles/bootstrap/select2/js/i18n/nl.js | 3 + styles/bootstrap/select2/js/i18n/pl.js | 3 + styles/bootstrap/select2/js/i18n/pt-BR.js | 3 + styles/bootstrap/select2/js/i18n/pt.js | 3 + styles/bootstrap/select2/js/i18n/ro.js | 3 + styles/bootstrap/select2/js/i18n/ru.js | 3 + styles/bootstrap/select2/js/i18n/sk.js | 3 + styles/bootstrap/select2/js/i18n/sr-Cyrl.js | 3 + styles/bootstrap/select2/js/i18n/sr.js | 3 + styles/bootstrap/select2/js/i18n/sv.js | 3 + styles/bootstrap/select2/js/i18n/th.js | 3 + styles/bootstrap/select2/js/i18n/tr.js | 3 + styles/bootstrap/select2/js/i18n/uk.js | 3 + styles/bootstrap/select2/js/i18n/vi.js | 3 + styles/bootstrap/select2/js/i18n/zh-CN.js | 3 + styles/bootstrap/select2/js/i18n/zh-TW.js | 3 + styles/bootstrap/select2/js/select2.full.js | 6436 +++++++++++++++++ .../bootstrap/select2/js/select2.full.min.js | 3 + styles/bootstrap/select2/js/select2.js | 5725 +++++++++++++++ styles/bootstrap/select2/js/select2.min.js | 3 + 54 files changed, 12958 insertions(+) create mode 100644 styles/bootstrap/select2/css/select2-bootstrap.css create mode 100644 styles/bootstrap/select2/css/select2.css create mode 100644 styles/bootstrap/select2/css/select2.min.css create mode 100644 styles/bootstrap/select2/js/i18n/ar.js create mode 100644 styles/bootstrap/select2/js/i18n/az.js create mode 100644 styles/bootstrap/select2/js/i18n/bg.js create mode 100644 styles/bootstrap/select2/js/i18n/ca.js create mode 100644 styles/bootstrap/select2/js/i18n/cs.js create mode 100644 styles/bootstrap/select2/js/i18n/da.js create mode 100644 styles/bootstrap/select2/js/i18n/de.js create mode 100644 styles/bootstrap/select2/js/i18n/el.js create mode 100644 styles/bootstrap/select2/js/i18n/en.js create mode 100644 styles/bootstrap/select2/js/i18n/es.js create mode 100644 styles/bootstrap/select2/js/i18n/et.js create mode 100644 styles/bootstrap/select2/js/i18n/eu.js create mode 100644 styles/bootstrap/select2/js/i18n/fa.js create mode 100644 styles/bootstrap/select2/js/i18n/fi.js create mode 100644 styles/bootstrap/select2/js/i18n/fr.js create mode 100644 styles/bootstrap/select2/js/i18n/gl.js create mode 100644 styles/bootstrap/select2/js/i18n/he.js create mode 100644 styles/bootstrap/select2/js/i18n/hi.js create mode 100644 styles/bootstrap/select2/js/i18n/hr.js create mode 100644 styles/bootstrap/select2/js/i18n/hu.js create mode 100644 styles/bootstrap/select2/js/i18n/id.js create mode 100644 styles/bootstrap/select2/js/i18n/is.js create mode 100644 styles/bootstrap/select2/js/i18n/it.js create mode 100644 styles/bootstrap/select2/js/i18n/ja.js create mode 100644 styles/bootstrap/select2/js/i18n/km.js create mode 100644 styles/bootstrap/select2/js/i18n/ko.js create mode 100644 styles/bootstrap/select2/js/i18n/lt.js create mode 100644 styles/bootstrap/select2/js/i18n/lv.js create mode 100644 styles/bootstrap/select2/js/i18n/mk.js create mode 100644 styles/bootstrap/select2/js/i18n/ms.js create mode 100644 styles/bootstrap/select2/js/i18n/nb.js create mode 100644 styles/bootstrap/select2/js/i18n/nl.js create mode 100644 styles/bootstrap/select2/js/i18n/pl.js create mode 100644 styles/bootstrap/select2/js/i18n/pt-BR.js create mode 100644 styles/bootstrap/select2/js/i18n/pt.js create mode 100644 styles/bootstrap/select2/js/i18n/ro.js create mode 100644 styles/bootstrap/select2/js/i18n/ru.js create mode 100644 styles/bootstrap/select2/js/i18n/sk.js create mode 100644 styles/bootstrap/select2/js/i18n/sr-Cyrl.js create mode 100644 styles/bootstrap/select2/js/i18n/sr.js create mode 100644 styles/bootstrap/select2/js/i18n/sv.js create mode 100644 styles/bootstrap/select2/js/i18n/th.js create mode 100644 styles/bootstrap/select2/js/i18n/tr.js create mode 100644 styles/bootstrap/select2/js/i18n/uk.js create mode 100644 styles/bootstrap/select2/js/i18n/vi.js create mode 100644 styles/bootstrap/select2/js/i18n/zh-CN.js create mode 100644 styles/bootstrap/select2/js/i18n/zh-TW.js create mode 100644 styles/bootstrap/select2/js/select2.full.js create mode 100644 styles/bootstrap/select2/js/select2.full.min.js create mode 100644 styles/bootstrap/select2/js/select2.js create mode 100644 styles/bootstrap/select2/js/select2.min.js diff --git a/styles/bootstrap/select2/css/select2-bootstrap.css b/styles/bootstrap/select2/css/select2-bootstrap.css new file mode 100644 index 000000000..7e56c4dff --- /dev/null +++ b/styles/bootstrap/select2/css/select2-bootstrap.css @@ -0,0 +1,165 @@ +/** + * Select2 Bootstrap CSS v1.2.5 + * Tested with Bootstrap v2.3.1, v2.3.2 and Select2 v3.3.2, v3.4.1 + * MIT License + */ +.select2-container { + vertical-align: middle; +} +.select2-container.input-mini { + width: 60px; +} +.select2-container.input-small { + width: 90px; +} +.select2-container.input-medium { + width: 150px; +} +.select2-container.input-large { + width: 210px; +} +.select2-container.input-xlarge { + width: 270px; +} +.select2-container.input-xxlarge { + width: 530px; +} +.select2-container.input-default { + width: 220px; +} +.select2-container[class*="span"] { + float: none; + margin-left: 0; +} + +.select2-container--default .select2-selection--multiple { + border: 1px solid #cccccc; +} +.select2-container--default .select2-selection--single { + border: 1px solid #cccccc; +} + +.select2-container--default.select2-container--focus .select2-selection--multiple { + border: 1px solid #cccccc; +} + +.select2-container .select2-choice, +.select2-container-multi .select2-choices { + height: 28px; + line-height: 29px; + border: 1px solid #ccc; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + background: none; + background-color: #fff; + filter: none; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.select2-container .select2-choice div, .select2-container .select2-choice .select2-arrow, +.select2-container.select2-container-disabled .select2-choice div, +.select2-container.select2-container-disabled .select2-choice .select2-arrow { + border-left: none; + background: none; + filter: none; +} + +.control-group.error [class^="select2-choice"] { + border-color: #b94a48; +} + +.select2-container-multi .select2-choices .select2-search-field { + height: 28px; + line-height: 27px; +} + +.select2-drop.select2-drop-active, +.select2-container-active .select2-choice, +.select2-container-multi.select2-container-active .select2-choices { + border-color: rgba(82, 168, 236, 0.8); + border-color: #ccc\0; + outline: none; +} + +.select2-container-active .select2-choice, +.select2-container-multi.select2-container-active .select2-choices { + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); +} + +.select2-container--default .select2-results__option--highlighted[aria-selected] { + background-color: #3875d7; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc)); + background-image: -webkit-linear-gradient(#3875d7 20%, #2a62bc 90%); + background-image: -moz-linear-gradient(#3875d7 20%, #2a62bc 90%); + background-image: -o-linear-gradient(#3875d7 20%, #2a62bc 90%); + background-image: linear-gradient(#3875d7 20%, #2a62bc 90%); + color: #fff; +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice { + margin: 3px 5px 3px 0; + padding: 5px 10px 5px 5px; + border: 1px solid #aaa; + max-width: 100%; + border-radius: 3px; + background-color: #eeeeee; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee)); + background-image: -webkit-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -moz-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -o-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-size: 100% 19px; + background-repeat: repeat-x; + background-clip: padding-box; + box-shadow: 0 0 2px white inset, 0 1px 0 rgba(0, 0, 0, 0.05); + color: #333; + line-height: 13px; + cursor: default; +} + +.select2-container .select2-selection--single .select2-selection__rendered { + padding-left: 5px; +} + +[class^="input-"] .select2-container { + font-size: 14px; +} + +.input-prepend [class^="select2-choice"] { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.input-append [class^="select2-choice"] { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.select2-dropdown-open [class^="select2-choice"] { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.select2-dropdown-open.select2-drop-above [class^="select2-choice"] { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +[class^="input-"] .select2-offscreen { + position: absolute; +} + +/** + * This stops the quick flash when a native selectbox is shown and + * then replaced by a select2 input when javascript kicks in. This can be + * removed if javascript is not present + */ +select.select2 { + height: 28px; + visibility: hidden; +} diff --git a/styles/bootstrap/select2/css/select2.css b/styles/bootstrap/select2/css/select2.css new file mode 100644 index 000000000..447b2b86c --- /dev/null +++ b/styles/bootstrap/select2/css/select2.css @@ -0,0 +1,484 @@ +.select2-container { + box-sizing: border-box; + display: inline-block; + margin: 0; + position: relative; + vertical-align: middle; } + .select2-container .select2-selection--single { + box-sizing: border-box; + cursor: pointer; + display: block; + height: 28px; + user-select: none; + -webkit-user-select: none; } + .select2-container .select2-selection--single .select2-selection__rendered { + display: block; + padding-left: 8px; + padding-right: 20px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } + .select2-container .select2-selection--single .select2-selection__clear { + position: relative; } + .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { + padding-right: 8px; + padding-left: 20px; } + .select2-container .select2-selection--multiple { + box-sizing: border-box; + cursor: pointer; + display: block; + min-height: 32px; + user-select: none; + -webkit-user-select: none; } + .select2-container .select2-selection--multiple .select2-selection__rendered { + display: inline-block; + overflow: hidden; + padding-left: 8px; + text-overflow: ellipsis; + white-space: nowrap; } + .select2-container .select2-search--inline { + float: left; } + .select2-container .select2-search--inline .select2-search__field { + box-sizing: border-box; + border: none; + font-size: 100%; + margin-top: 5px; + padding: 0; } + .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none; } + +.select2-dropdown { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + box-sizing: border-box; + display: block; + position: absolute; + left: -100000px; + width: 100%; + z-index: 1051; } + +.select2-results { + display: block; } + +.select2-results__options { + list-style: none; + margin: 0; + padding: 0; } + +.select2-results__option { + padding: 6px; + user-select: none; + -webkit-user-select: none; } + .select2-results__option[aria-selected] { + cursor: pointer; } + +.select2-container--open .select2-dropdown { + left: 0; } + +.select2-container--open .select2-dropdown--above { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } + +.select2-container--open .select2-dropdown--below { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.select2-search--dropdown { + display: block; + padding: 4px; } + .select2-search--dropdown .select2-search__field { + padding: 4px; + width: 100%; + box-sizing: border-box; } + .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none; } + .select2-search--dropdown.select2-search--hide { + display: none; } + +.select2-close-mask { + border: 0; + margin: 0; + padding: 0; + display: block; + position: fixed; + left: 0; + top: 0; + min-height: 100%; + min-width: 100%; + height: auto; + width: auto; + opacity: 0; + z-index: 99; + background-color: #fff; + filter: alpha(opacity=0); } + +.select2-hidden-accessible { + border: 0 !important; + clip: rect(0 0 0 0) !important; + height: 1px !important; + margin: -1px !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + width: 1px !important; } + +.select2-container--default .select2-selection--single { + background-color: #fff; + border: 1px solid #aaa; + border-radius: 4px; } + .select2-container--default .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: 28px; } + .select2-container--default .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; } + .select2-container--default .select2-selection--single .select2-selection__placeholder { + color: #999; } + .select2-container--default .select2-selection--single .select2-selection__arrow { + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; } + .select2-container--default .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; } + +.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; } + +.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow { + left: 1px; + right: auto; } + +.select2-container--default.select2-container--disabled .select2-selection--single { + background-color: #eee; + cursor: default; } + .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear { + display: none; } + +.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; } + +.select2-container--default .select2-selection--multiple { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + cursor: text; } + .select2-container--default .select2-selection--multiple .select2-selection__rendered { + box-sizing: border-box; + list-style: none; + margin: 0; + padding: 0 5px; + width: 100%; } + .select2-container--default .select2-selection--multiple .select2-selection__rendered li { + list-style: none; } + .select2-container--default .select2-selection--multiple .select2-selection__placeholder { + color: #999; + margin-top: 5px; + float: left; } + .select2-container--default .select2-selection--multiple .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin-top: 5px; + margin-right: 10px; } + .select2-container--default .select2-selection--multiple .select2-selection__choice { + background-color: #e4e4e4; + border: 1px solid #aaa; + border-radius: 4px; + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px; + padding: 0 5px; } + .select2-container--default .select2-selection--multiple .select2-selection__choice__remove { + color: #999; + cursor: pointer; + display: inline-block; + font-weight: bold; + margin-right: 2px; } + .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #333; } + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline { + float: right; } + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + margin-left: 5px; + margin-right: auto; } + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto; } + +.select2-container--default.select2-container--focus .select2-selection--multiple { + border: solid black 1px; + outline: 0; } + +.select2-container--default.select2-container--disabled .select2-selection--multiple { + background-color: #eee; + cursor: default; } + +.select2-container--default.select2-container--disabled .select2-selection__choice__remove { + display: none; } + +.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple { + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } + +.select2-container--default .select2-search--dropdown .select2-search__field { + border: 1px solid #aaa; } + +.select2-container--default .select2-search--inline .select2-search__field { + background: transparent; + border: none; + outline: 0; + box-shadow: none; + -webkit-appearance: textfield; } + +.select2-container--default .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; } + +.select2-container--default .select2-results__option[role=group] { + padding: 0; } + +.select2-container--default .select2-results__option[aria-disabled=true] { + color: #999; } + +.select2-container--default .select2-results__option[aria-selected=true] { + background-color: #ddd; } + +.select2-container--default .select2-results__option .select2-results__option { + padding-left: 1em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__group { + padding-left: 0; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option { + margin-left: -1em; + padding-left: 2em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -2em; + padding-left: 3em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -3em; + padding-left: 4em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -4em; + padding-left: 5em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -5em; + padding-left: 6em; } + +.select2-container--default .select2-results__option--highlighted[aria-selected] { + background-color: #5897fb; + color: white; } + +.select2-container--default .select2-results__group { + cursor: default; + display: block; + padding: 6px; } + +.select2-container--classic .select2-selection--single { + background-color: #f7f7f7; + border: 1px solid #aaa; + border-radius: 4px; + outline: 0; + background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%); + background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%); + background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } + .select2-container--classic .select2-selection--single:focus { + border: 1px solid #5897fb; } + .select2-container--classic .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: 28px; } + .select2-container--classic .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin-right: 10px; } + .select2-container--classic .select2-selection--single .select2-selection__placeholder { + color: #999; } + .select2-container--classic .select2-selection--single .select2-selection__arrow { + background-color: #ddd; + border: none; + border-left: 1px solid #aaa; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; + background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%); + background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%); + background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); } + .select2-container--classic .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; } + +.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; } + +.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow { + border: none; + border-right: 1px solid #aaa; + border-radius: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + left: 1px; + right: auto; } + +.select2-container--classic.select2-container--open .select2-selection--single { + border: 1px solid #5897fb; } + .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow { + background: transparent; + border: none; } + .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; } + +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%); + background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%); + background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } + +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%); + background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%); + background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); } + +.select2-container--classic .select2-selection--multiple { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + cursor: text; + outline: 0; } + .select2-container--classic .select2-selection--multiple:focus { + border: 1px solid #5897fb; } + .select2-container--classic .select2-selection--multiple .select2-selection__rendered { + list-style: none; + margin: 0; + padding: 0 5px; } + .select2-container--classic .select2-selection--multiple .select2-selection__clear { + display: none; } + .select2-container--classic .select2-selection--multiple .select2-selection__choice { + background-color: #e4e4e4; + border: 1px solid #aaa; + border-radius: 4px; + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px; + padding: 0 5px; } + .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { + color: #888; + cursor: pointer; + display: inline-block; + font-weight: bold; + margin-right: 2px; } + .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #555; } + +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + float: right; } + +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + margin-left: 5px; + margin-right: auto; } + +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto; } + +.select2-container--classic.select2-container--open .select2-selection--multiple { + border: 1px solid #5897fb; } + +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } + +.select2-container--classic .select2-search--dropdown .select2-search__field { + border: 1px solid #aaa; + outline: 0; } + +.select2-container--classic .select2-search--inline .select2-search__field { + outline: 0; + box-shadow: none; } + +.select2-container--classic .select2-dropdown { + background-color: white; + border: 1px solid transparent; } + +.select2-container--classic .select2-dropdown--above { + border-bottom: none; } + +.select2-container--classic .select2-dropdown--below { + border-top: none; } + +.select2-container--classic .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; } + +.select2-container--classic .select2-results__option[role=group] { + padding: 0; } + +.select2-container--classic .select2-results__option[aria-disabled=true] { + color: grey; } + +.select2-container--classic .select2-results__option--highlighted[aria-selected] { + background-color: #3875d7; + color: white; } + +.select2-container--classic .select2-results__group { + cursor: default; + display: block; + padding: 6px; } + +.select2-container--classic.select2-container--open .select2-dropdown { + border-color: #5897fb; } diff --git a/styles/bootstrap/select2/css/select2.min.css b/styles/bootstrap/select2/css/select2.min.css new file mode 100644 index 000000000..76de04d92 --- /dev/null +++ b/styles/bootstrap/select2/css/select2.min.css @@ -0,0 +1 @@ +.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;height:1px !important;margin:-1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} diff --git a/styles/bootstrap/select2/js/i18n/ar.js b/styles/bootstrap/select2/js/i18n/ar.js new file mode 100644 index 000000000..01a688294 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/ar.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ar",[],function(){return{errorLoading:function(){return"لا يمكن تحميل النتائج"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="الرجاء حذف "+t+" عناصر";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="الرجاء إضافة "+t+" عناصر";return n},loadingMore:function(){return"جاري تحميل نتائج إضافية..."},maximumSelected:function(e){var t="تستطيع إختيار "+e.maximum+" بنود فقط";return t},noResults:function(){return"لم يتم العثور على أي نتائج"},searching:function(){return"جاري البحث…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/az.js b/styles/bootstrap/select2/js/i18n/az.js new file mode 100644 index 000000000..2accb973f --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/az.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/az",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return t+" simvol silin"},inputTooShort:function(e){var t=e.minimum-e.input.length;return t+" simvol daxil edin"},loadingMore:function(){return"Daha çox nəticə yüklənir…"},maximumSelected:function(e){return"Sadəcə "+e.maximum+" element seçə bilərsiniz"},noResults:function(){return"Nəticə tapılmadı"},searching:function(){return"Axtarılır…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/bg.js b/styles/bootstrap/select2/js/i18n/bg.js new file mode 100644 index 000000000..35ae98944 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/bg.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/bg",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Моля въведете с "+t+" по-малко символ";return t>1&&(n+="a"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Моля въведете още "+t+" символ";return t>1&&(n+="a"),n},loadingMore:function(){return"Зареждат се още…"},maximumSelected:function(e){var t="Можете да направите до "+e.maximum+" ";return e.maximum>1?t+="избора":t+="избор",t},noResults:function(){return"Няма намерени съвпадения"},searching:function(){return"Търсене…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/ca.js b/styles/bootstrap/select2/js/i18n/ca.js new file mode 100644 index 000000000..fdb5f3d2a --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/ca.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ca",[],function(){return{errorLoading:function(){return"La càrrega ha fallat"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Si us plau, elimina "+t+" car";return t==1?n+="àcter":n+="àcters",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Si us plau, introdueix "+t+" car";return t==1?n+="àcter":n+="àcters",n},loadingMore:function(){return"Carregant més resultats…"},maximumSelected:function(e){var t="Només es pot seleccionar "+e.maximum+" element";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No s'han trobat resultats"},searching:function(){return"Cercant…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/cs.js b/styles/bootstrap/select2/js/i18n/cs.js new file mode 100644 index 000000000..9651378a6 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/cs.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/cs",[],function(){function e(e,t){switch(e){case 2:return t?"dva":"dvě";case 3:return"tři";case 4:return"čtyři"}return""}return{errorLoading:function(){return"Výsledky nemohly být načteny."},inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?"Prosím zadejte o jeden znak méně":n<=4?"Prosím zadejte o "+e(n,!0)+" znaky méně":"Prosím zadejte o "+n+" znaků méně"},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím zadejte ještě jeden znak":n<=4?"Prosím zadejte ještě další "+e(n,!0)+" znaky":"Prosím zadejte ještě dalších "+n+" znaků"},loadingMore:function(){return"Načítají se další výsledky…"},maximumSelected:function(t){var n=t.maximum;return n==1?"Můžete zvolit jen jednu položku":n<=4?"Můžete zvolit maximálně "+e(n,!1)+" položky":"Můžete zvolit maximálně "+n+" položek"},noResults:function(){return"Nenalezeny žádné položky"},searching:function(){return"Vyhledávání…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/da.js b/styles/bootstrap/select2/js/i18n/da.js new file mode 100644 index 000000000..501c51e93 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/da.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/da",[],function(){return{errorLoading:function(){return"Resultaterne kunne ikke indlæses."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Angiv venligst "+t+" tegn mindre";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Angiv venligst "+t+" tegn mere";return n},loadingMore:function(){return"Indlæser flere resultater…"},maximumSelected:function(e){var t="Du kan kun vælge "+e.maximum+" emne";return e.maximum!=1&&(t+="r"),t},noResults:function(){return"Ingen resultater fundet"},searching:function(){return"Søger…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/de.js b/styles/bootstrap/select2/js/i18n/de.js new file mode 100644 index 000000000..9a6d55366 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/de.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/de",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Bitte "+t+" Zeichen weniger eingeben"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Bitte "+t+" Zeichen mehr eingeben"},loadingMore:function(){return"Lade mehr Ergebnisse…"},maximumSelected:function(e){var t="Sie können nur "+e.maximum+" Eintr";return e.maximum===1?t+="ag":t+="äge",t+=" auswählen",t},noResults:function(){return"Keine Übereinstimmungen gefunden"},searching:function(){return"Suche…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/el.js b/styles/bootstrap/select2/js/i18n/el.js new file mode 100644 index 000000000..4735d1405 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/el.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/el",[],function(){return{errorLoading:function(){return"Τα αποτελέσματα δεν μπόρεσαν να φορτώσουν."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Παρακαλώ διαγράψτε "+t+" χαρακτήρ";return t==1&&(n+="α"),t!=1&&(n+="ες"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Παρακαλώ συμπληρώστε "+t+" ή περισσότερους χαρακτήρες";return n},loadingMore:function(){return"Φόρτωση περισσότερων αποτελεσμάτων…"},maximumSelected:function(e){var t="Μπορείτε να επιλέξετε μόνο "+e.maximum+" επιλογ";return e.maximum==1&&(t+="ή"),e.maximum!=1&&(t+="ές"),t},noResults:function(){return"Δεν βρέθηκαν αποτελέσματα"},searching:function(){return"Αναζήτηση…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/en.js b/styles/bootstrap/select2/js/i18n/en.js new file mode 100644 index 000000000..8e80ede8d --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/en.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Please delete "+t+" character";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Please enter "+t+" or more characters";return n},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var t="You can only select "+e.maximum+" item";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/es.js b/styles/bootstrap/select2/js/i18n/es.js new file mode 100644 index 000000000..0a096502d --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/es.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/es",[],function(){return{errorLoading:function(){return"La carga falló"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor, elimine "+t+" car";return t==1?n+="ácter":n+="acteres",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Por favor, introduzca "+t+" car";return t==1?n+="ácter":n+="acteres",n},loadingMore:function(){return"Cargando más resultados…"},maximumSelected:function(e){var t="Sólo puede seleccionar "+e.maximum+" elemento";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/et.js b/styles/bootstrap/select2/js/i18n/et.js new file mode 100644 index 000000000..c70f4a5b3 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/et.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/et",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Sisesta "+t+" täht";return t!=1&&(n+="e"),n+=" vähem",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Sisesta "+t+" täht";return t!=1&&(n+="e"),n+=" rohkem",n},loadingMore:function(){return"Laen tulemusi…"},maximumSelected:function(e){var t="Saad vaid "+e.maximum+" tulemus";return e.maximum==1?t+="e":t+="t",t+=" valida",t},noResults:function(){return"Tulemused puuduvad"},searching:function(){return"Otsin…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/eu.js b/styles/bootstrap/select2/js/i18n/eu.js new file mode 100644 index 000000000..9336053a7 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/eu.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/eu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Idatzi ";return t==1?n+="karaktere bat":n+=t+" karaktere",n+=" gutxiago",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Idatzi ";return t==1?n+="karaktere bat":n+=t+" karaktere",n+=" gehiago",n},loadingMore:function(){return"Emaitza gehiago kargatzen…"},maximumSelected:function(e){return e.maximum===1?"Elementu bakarra hauta dezakezu":e.maximum+" elementu hauta ditzakezu soilik"},noResults:function(){return"Ez da bat datorrenik aurkitu"},searching:function(){return"Bilatzen…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/fa.js b/styles/bootstrap/select2/js/i18n/fa.js new file mode 100644 index 000000000..5118cd28f --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/fa.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fa",[],function(){return{errorLoading:function(){return"امکان بارگذاری نتایج وجود ندارد."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="لطفاً "+t+" کاراکتر را حذف نمایید";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="لطفاً تعداد "+t+" کاراکتر یا بیشتر وارد نمایید";return n},loadingMore:function(){return"در حال بارگذاری نتایج بیشتر..."},maximumSelected:function(e){var t="شما تنها می‌توانید "+e.maximum+" آیتم را انتخاب نمایید";return t},noResults:function(){return"هیچ نتیجه‌ای یافت نشد"},searching:function(){return"در حال جستجو..."}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/fi.js b/styles/bootstrap/select2/js/i18n/fi.js new file mode 100644 index 000000000..9e60f26a0 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/fi.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fi",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Ole hyvä ja anna "+t+" merkkiä vähemmän"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Ole hyvä ja anna "+t+" merkkiä lisää"},loadingMore:function(){return"Ladataan lisää tuloksia…"},maximumSelected:function(e){return"Voit valita ainoastaan "+e.maximum+" kpl"},noResults:function(){return"Ei tuloksia"},searching:function(){}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/fr.js b/styles/bootstrap/select2/js/i18n/fr.js new file mode 100644 index 000000000..e4a665009 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/fr.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fr",[],function(){return{errorLoading:function(){return"Les résultats ne peuvent pas être chargés."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Supprimez "+t+" caractère";return t!==1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Saisissez "+t+" caractère";return t!==1&&(n+="s"),n},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){var t="Vous pouvez seulement sélectionner "+e.maximum+" élément";return e.maximum!==1&&(t+="s"),t},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/gl.js b/styles/bootstrap/select2/js/i18n/gl.js new file mode 100644 index 000000000..02f258f92 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/gl.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/gl",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Elimine ";return t===1?n+="un carácter":n+=t+" caracteres",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Engada ";return t===1?n+="un carácter":n+=t+" caracteres",n},loadingMore:function(){return"Cargando máis resultados…"},maximumSelected:function(e){var t="Só pode ";return e.maximum===1?t+="un elemento":t+=e.maximum+" elementos",t},noResults:function(){return"Non se atoparon resultados"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/he.js b/styles/bootstrap/select2/js/i18n/he.js new file mode 100644 index 000000000..881f8d389 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/he.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/he",[],function(){return{errorLoading:function(){return"שגיאה בטעינת התוצאות"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="נא למחוק ";return t===1?n+="תו אחד":n+=t+" תווים",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="נא להכניס ";return t===1?n+="תו אחד":n+=t+" תווים",n+=" או יותר",n},loadingMore:function(){return"טוען תוצאות נוספות…"},maximumSelected:function(e){var t="באפשרותך לבחור עד ";return e.maximum===1?t+="פריט אחד":t+=e.maximum+" פריטים",t},noResults:function(){return"לא נמצאו תוצאות"},searching:function(){return"מחפש…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/hi.js b/styles/bootstrap/select2/js/i18n/hi.js new file mode 100644 index 000000000..e82968426 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/hi.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hi",[],function(){return{errorLoading:function(){return"परिणामों को लोड नहीं किया जा सका।"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" अक्षर को हटा दें";return t>1&&(n=t+" अक्षरों को हटा दें "),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="कृपया "+t+" या अधिक अक्षर दर्ज करें";return n},loadingMore:function(){return"अधिक परिणाम लोड हो रहे है..."},maximumSelected:function(e){var t="आप केवल "+e.maximum+" आइटम का चयन कर सकते हैं";return t},noResults:function(){return"कोई परिणाम नहीं मिला"},searching:function(){return"खोज रहा है..."}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/hr.js b/styles/bootstrap/select2/js/i18n/hr.js new file mode 100644 index 000000000..89f7b12bf --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/hr.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hr",[],function(){function e(e){var t=" "+e+" znak";return e%10<5&&e%10>0&&(e%100<5||e%100>19)?e%10>1&&(t+="a"):t+="ova",t}return{errorLoading:function(){return"Preuzimanje nije uspjelo."},inputTooLong:function(t){var n=t.input.length-t.maximum;return"Unesite "+e(n)},inputTooShort:function(t){var n=t.minimum-t.input.length;return"Unesite još "+e(n)},loadingMore:function(){return"Učitavanje rezultata…"},maximumSelected:function(e){return"Maksimalan broj odabranih stavki je "+e.maximum},noResults:function(){return"Nema rezultata"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/hu.js b/styles/bootstrap/select2/js/i18n/hu.js new file mode 100644 index 000000000..74c8a90de --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/hu.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Túl hosszú. "+t+" karakterrel több, mint kellene."},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Túl rövid. Még "+t+" karakter hiányzik."},loadingMore:function(){return"Töltés…"},maximumSelected:function(e){return"Csak "+e.maximum+" elemet lehet kiválasztani."},noResults:function(){return"Nincs találat."},searching:function(){return"Keresés…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/id.js b/styles/bootstrap/select2/js/i18n/id.js new file mode 100644 index 000000000..958678261 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/id.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/id",[],function(){return{errorLoading:function(){return"Data tidak boleh diambil."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Hapuskan "+t+" huruf"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Masukkan "+t+" huruf lagi"},loadingMore:function(){return"Mengambil data…"},maximumSelected:function(e){return"Anda hanya dapat memilih "+e.maximum+" pilihan"},noResults:function(){return"Tidak ada data yang sesuai"},searching:function(){return"Mencari…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/is.js b/styles/bootstrap/select2/js/i18n/is.js new file mode 100644 index 000000000..ab97a14d1 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/is.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/is",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vinsamlegast styttið texta um "+t+" staf";return t<=1?n:n+"i"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vinsamlegast skrifið "+t+" staf";return t>1&&(n+="i"),n+=" í viðbót",n},loadingMore:function(){return"Sæki fleiri niðurstöður…"},maximumSelected:function(e){return"Þú getur aðeins valið "+e.maximum+" atriði"},noResults:function(){return"Ekkert fannst"},searching:function(){return"Leita…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/it.js b/styles/bootstrap/select2/js/i18n/it.js new file mode 100644 index 000000000..7796b9f76 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/it.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/it",[],function(){return{errorLoading:function(){return"I risultati non possono essere caricati."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Per favore cancella "+t+" caratter";return t!==1?n+="i":n+="e",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Per favore inserisci "+t+" o più caratteri";return n},loadingMore:function(){return"Caricando più risultati…"},maximumSelected:function(e){var t="Puoi selezionare solo "+e.maximum+" element";return e.maximum!==1?t+="i":t+="o",t},noResults:function(){return"Nessun risultato trovato"},searching:function(){return"Sto cercando…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/ja.js b/styles/bootstrap/select2/js/i18n/ja.js new file mode 100644 index 000000000..9f4fff6cb --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/ja.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ja",[],function(){return{errorLoading:function(){return"結果が読み込まれませんでした"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" 文字を削除してください";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="少なくとも "+t+" 文字を入力してください";return n},loadingMore:function(){return"読み込み中…"},maximumSelected:function(e){var t=e.maximum+" 件しか選択できません";return t},noResults:function(){return"対象が見つかりません"},searching:function(){return"検索しています…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/km.js b/styles/bootstrap/select2/js/i18n/km.js new file mode 100644 index 000000000..8e94adcf3 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/km.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/km",[],function(){return{errorLoading:function(){return"មិនអាចទាញយកទិន្នន័យ"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="សូមលុបចេញ "+t+" អក្សរ";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="សូមបញ្ចូល"+t+" អក្សរ រឺ ច្រើនជាងនេះ";return n},loadingMore:function(){return"កំពុងទាញយកទិន្នន័យបន្ថែម..."},maximumSelected:function(e){var t="អ្នកអាចជ្រើសរើសបានតែ "+e.maximum+" ជម្រើសប៉ុណ្ណោះ";return t},noResults:function(){return"មិនមានលទ្ធផល"},searching:function(){return"កំពុងស្វែងរក..."}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/ko.js b/styles/bootstrap/select2/js/i18n/ko.js new file mode 100644 index 000000000..4ed03215f --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/ko.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="너무 깁니다. "+t+" 글자 지워주세요.";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="너무 짧습니다. "+t+" 글자 더 입력해주세요.";return n},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(e){var t="최대 "+e.maximum+"개까지만 선택 가능합니다.";return t},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/lt.js b/styles/bootstrap/select2/js/i18n/lt.js new file mode 100644 index 000000000..05f3a6e5e --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/lt.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/lt",[],function(){function e(e,t,n,r){return e%10===1&&(e%100<11||e%100>19)?t:e%10>=2&&e%10<=9&&(e%100<11||e%100>19)?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Pašalinkite "+n+" simbol";return r+=e(n,"į","ius","ių"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Įrašykite dar "+n+" simbol";return r+=e(n,"į","ius","ių"),r},loadingMore:function(){return"Kraunama daugiau rezultatų…"},maximumSelected:function(t){var n="Jūs galite pasirinkti tik "+t.maximum+" element";return n+=e(t.maximum,"ą","us","ų"),n},noResults:function(){return"Atitikmenų nerasta"},searching:function(){return"Ieškoma…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/lv.js b/styles/bootstrap/select2/js/i18n/lv.js new file mode 100644 index 000000000..df8ee9423 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/lv.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/lv",[],function(){function e(e,t,n,r){return e===11?t:e%10===1?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Lūdzu ievadiet par "+n;return r+=" simbol"+e(n,"iem","u","iem"),r+" mazāk"},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Lūdzu ievadiet vēl "+n;return r+=" simbol"+e(n,"us","u","us"),r},loadingMore:function(){return"Datu ielāde…"},maximumSelected:function(t){var n="Jūs varat izvēlēties ne vairāk kā "+t.maximum;return n+=" element"+e(t.maximum,"us","u","us"),n},noResults:function(){return"Sakritību nav"},searching:function(){return"Meklēšana…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/mk.js b/styles/bootstrap/select2/js/i18n/mk.js new file mode 100644 index 000000000..319ecca14 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/mk.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/mk",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Ве молиме внесете "+e.maximum+" помалку карактер";return e.maximum!==1&&(n+="и"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Ве молиме внесете уште "+e.maximum+" карактер";return e.maximum!==1&&(n+="и"),n},loadingMore:function(){return"Вчитување резултати…"},maximumSelected:function(e){var t="Можете да изберете само "+e.maximum+" ставк";return e.maximum===1?t+="а":t+="и",t},noResults:function(){return"Нема пронајдено совпаѓања"},searching:function(){return"Пребарување…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/ms.js b/styles/bootstrap/select2/js/i18n/ms.js new file mode 100644 index 000000000..4258f125b --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/ms.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ms",[],function(){return{errorLoading:function(){return"Keputusan tidak berjaya dimuatkan."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Sila hapuskan "+t+" aksara"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Sila masukkan "+t+" atau lebih aksara"},loadingMore:function(){return"Sedang memuatkan keputusan…"},maximumSelected:function(e){return"Anda hanya boleh memilih "+e.maximum+" pilihan"},noResults:function(){return"Tiada padanan yang ditemui"},searching:function(){return"Mencari…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/nb.js b/styles/bootstrap/select2/js/i18n/nb.js new file mode 100644 index 000000000..6770087ce --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/nb.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/nb",[],function(){return{errorLoading:function(){return"Kunne ikke hente resultater."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Vennligst fjern "+t+" tegn"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vennligst skriv inn ";return t>1?n+=" flere tegn":n+=" tegn til",n},loadingMore:function(){return"Laster flere resultater…"},maximumSelected:function(e){return"Du kan velge maks "+e.maximum+" elementer"},noResults:function(){return"Ingen treff"},searching:function(){return"Søker…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/nl.js b/styles/bootstrap/select2/js/i18n/nl.js new file mode 100644 index 000000000..8bd5e3cf4 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/nl.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/nl",[],function(){return{errorLoading:function(){return"De resultaten konden niet worden geladen."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Gelieve "+t+" karakters te verwijderen";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Gelieve "+t+" of meer karakters in te voeren";return n},loadingMore:function(){return"Meer resultaten laden…"},maximumSelected:function(e){var t=e.maximum==1?"kan":"kunnen",n="Er "+t+" maar "+e.maximum+" item";return e.maximum!=1&&(n+="s"),n+=" worden geselecteerd",n},noResults:function(){return"Geen resultaten gevonden…"},searching:function(){return"Zoeken…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/pl.js b/styles/bootstrap/select2/js/i18n/pl.js new file mode 100644 index 000000000..54ba28e9b --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/pl.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pl",[],function(){var e=["znak","znaki","znaków"],t=["element","elementy","elementów"],n=function(t,n){if(t===1)return n[0];if(t>1&&t<=4)return n[1];if(t>=5)return n[2]};return{errorLoading:function(){return"Nie można załadować wyników."},inputTooLong:function(t){var r=t.input.length-t.maximum;return"Usuń "+r+" "+n(r,e)},inputTooShort:function(t){var r=t.minimum-t.input.length;return"Podaj przynajmniej "+r+" "+n(r,e)},loadingMore:function(){return"Trwa ładowanie…"},maximumSelected:function(e){return"Możesz zaznaczyć tylko "+e.maximum+" "+n(e.maximum,t)},noResults:function(){return"Brak wyników"},searching:function(){return"Trwa wyszukiwanie…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/pt-BR.js b/styles/bootstrap/select2/js/i18n/pt-BR.js new file mode 100644 index 000000000..a6629c8ae --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/pt-BR.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pt-BR",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Apague "+t+" caracter";return t!=1&&(n+="es"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Digite "+t+" ou mais caracteres";return n},loadingMore:function(){return"Carregando mais resultados…"},maximumSelected:function(e){var t="Você só pode selecionar "+e.maximum+" ite";return e.maximum==1?t+="m":t+="ns",t},noResults:function(){return"Nenhum resultado encontrado"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/pt.js b/styles/bootstrap/select2/js/i18n/pt.js new file mode 100644 index 000000000..0cbda561b --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/pt.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pt",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor apague "+t+" ";return n+=t!=1?"caracteres":"carácter",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Introduza "+t+" ou mais caracteres";return n},loadingMore:function(){return"A carregar mais resultados…"},maximumSelected:function(e){var t="Apenas pode seleccionar "+e.maximum+" ";return t+=e.maximum!=1?"itens":"item",t},noResults:function(){return"Sem resultados"},searching:function(){return"A procurar…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/ro.js b/styles/bootstrap/select2/js/i18n/ro.js new file mode 100644 index 000000000..788a26376 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/ro.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ro",[],function(){return{errorLoading:function(){return"Rezultatele nu au putut fi incărcate."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vă rugăm să ștergeți"+t+" caracter";return t!==1&&(n+="e"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vă rugăm să introduceți "+t+"sau mai multe caractere";return n},loadingMore:function(){return"Se încarcă mai multe rezultate…"},maximumSelected:function(e){var t="Aveți voie să selectați cel mult "+e.maximum;return t+=" element",e.maximum!==1&&(t+="e"),t},noResults:function(){return"Nu au fost găsite rezultate"},searching:function(){return"Căutare…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/ru.js b/styles/bootstrap/select2/js/i18n/ru.js new file mode 100644 index 000000000..9ecab8091 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/ru.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ru",[],function(){function e(e,t,n,r){return e%10<5&&e%10>0&&e%100<5||e%100>20?e%10>1?n:t:r}return{errorLoading:function(){return"Невозможно загрузить результаты"},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Пожалуйста, введите на "+n+" символ";return r+=e(n,"","a","ов"),r+=" меньше",r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Пожалуйста, введите еще хотя бы "+n+" символ";return r+=e(n,"","a","ов"),r},loadingMore:function(){return"Загрузка данных…"},maximumSelected:function(t){var n="Вы можете выбрать не более "+t.maximum+" элемент";return n+=e(t.maximum,"","a","ов"),n},noResults:function(){return"Совпадений не найдено"},searching:function(){return"Поиск…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/sk.js b/styles/bootstrap/select2/js/i18n/sk.js new file mode 100644 index 000000000..82f294138 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/sk.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sk",[],function(){var e={2:function(e){return e?"dva":"dve"},3:function(){return"tri"},4:function(){return"štyri"}};return{inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?"Prosím, zadajte o jeden znak menej":n>=2&&n<=4?"Prosím, zadajte o "+e[n](!0)+" znaky menej":"Prosím, zadajte o "+n+" znakov menej"},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím, zadajte ešte jeden znak":n<=4?"Prosím, zadajte ešte ďalšie "+e[n](!0)+" znaky":"Prosím, zadajte ešte ďalších "+n+" znakov"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(t){return t.maximum==1?"Môžete zvoliť len jednu položku":t.maximum>=2&&t.maximum<=4?"Môžete zvoliť najviac "+e[t.maximum](!1)+" položky":"Môžete zvoliť najviac "+t.maximum+" položiek"},noResults:function(){return"Nenašli sa žiadne položky"},searching:function(){return"Vyhľadávanie…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/sr-Cyrl.js b/styles/bootstrap/select2/js/i18n/sr-Cyrl.js new file mode 100644 index 000000000..e9453940c --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/sr-Cyrl.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sr-Cyrl",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{errorLoading:function(){return"Преузимање није успело."},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Обришите "+n+" симбол";return r+=e(n,"","а","а"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Укуцајте бар још "+n+" симбол";return r+=e(n,"","а","а"),r},loadingMore:function(){return"Преузимање још резултата…"},maximumSelected:function(t){var n="Можете изабрати само "+t.maximum+" ставк";return n+=e(t.maximum,"у","е","и"),n},noResults:function(){return"Ништа није пронађено"},searching:function(){return"Претрага…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/sr.js b/styles/bootstrap/select2/js/i18n/sr.js new file mode 100644 index 000000000..ac0cc721f --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/sr.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sr",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{errorLoading:function(){return"Preuzimanje nije uspelo."},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Obrišite "+n+" simbol";return r+=e(n,"","a","a"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Ukucajte bar još "+n+" simbol";return r+=e(n,"","a","a"),r},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(t){var n="Možete izabrati samo "+t.maximum+" stavk";return n+=e(t.maximum,"u","e","i"),n},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/sv.js b/styles/bootstrap/select2/js/i18n/sv.js new file mode 100644 index 000000000..bedac08c4 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/sv.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sv",[],function(){return{errorLoading:function(){return"Resultat kunde inte laddas."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vänligen sudda ut "+t+" tecken";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vänligen skriv in "+t+" eller fler tecken";return n},loadingMore:function(){return"Laddar fler resultat…"},maximumSelected:function(e){var t="Du kan max välja "+e.maximum+" element";return t},noResults:function(){return"Inga träffar"},searching:function(){return"Söker…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/th.js b/styles/bootstrap/select2/js/i18n/th.js new file mode 100644 index 000000000..097a86c69 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/th.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/th",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="โปรดลบออก "+t+" ตัวอักษร";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="โปรดพิมพ์เพิ่มอีก "+t+" ตัวอักษร";return n},loadingMore:function(){return"กำลังค้นข้อมูลเพิ่ม…"},maximumSelected:function(e){var t="คุณสามารถเลือกได้ไม่เกิน "+e.maximum+" รายการ";return t},noResults:function(){return"ไม่พบข้อมูล"},searching:function(){return"กำลังค้นข้อมูล…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/tr.js b/styles/bootstrap/select2/js/i18n/tr.js new file mode 100644 index 000000000..25d27a877 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/tr.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/tr",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" karakter daha girmelisiniz";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="En az "+t+" karakter daha girmelisiniz";return n},loadingMore:function(){return"Daha fazla…"},maximumSelected:function(e){var t="Sadece "+e.maximum+" seçim yapabilirsiniz";return t},noResults:function(){return"Sonuç bulunamadı"},searching:function(){return"Aranıyor…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/uk.js b/styles/bootstrap/select2/js/i18n/uk.js new file mode 100644 index 000000000..eb3ca8903 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/uk.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/uk",[],function(){function e(e,t,n,r){return e%100>10&&e%100<15?r:e%10===1?t:e%10>1&&e%10<5?n:r}return{errorLoading:function(){return"Неможливо завантажити результати"},inputTooLong:function(t){var n=t.input.length-t.maximum;return"Будь ласка, видаліть "+n+" "+e(t.maximum,"літеру","літери","літер")},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Будь ласка, введіть "+t+" або більше літер"},loadingMore:function(){return"Завантаження інших результатів…"},maximumSelected:function(t){return"Ви можете вибрати лише "+t.maximum+" "+e(t.maximum,"пункт","пункти","пунктів")},noResults:function(){return"Нічого не знайдено"},searching:function(){return"Пошук…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/vi.js b/styles/bootstrap/select2/js/i18n/vi.js new file mode 100644 index 000000000..8975b8ac6 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/vi.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/vi",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vui lòng nhập ít hơn "+t+" ký tự";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vui lòng nhập nhiều hơn "+t+' ký tự"';return n},loadingMore:function(){return"Đang lấy thêm kết quả…"},maximumSelected:function(e){var t="Chỉ có thể chọn được "+e.maximum+" lựa chọn";return t},noResults:function(){return"Không tìm thấy kết quả"},searching:function(){return"Đang tìm…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/zh-CN.js b/styles/bootstrap/select2/js/i18n/zh-CN.js new file mode 100644 index 000000000..2ed959723 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/zh-CN.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/zh-CN",[],function(){return{errorLoading:function(){return"无法载入结果。"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="请删除"+t+"个字符";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="请再输入至少"+t+"个字符";return n},loadingMore:function(){return"载入更多结果…"},maximumSelected:function(e){var t="最多只能选择"+e.maximum+"个项目";return t},noResults:function(){return"未找到结果"},searching:function(){return"搜索中…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/i18n/zh-TW.js b/styles/bootstrap/select2/js/i18n/zh-TW.js new file mode 100644 index 000000000..ea0812ee0 --- /dev/null +++ b/styles/bootstrap/select2/js/i18n/zh-TW.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/zh-TW",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="請刪掉"+t+"個字元";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="請再輸入"+t+"個字元";return n},loadingMore:function(){return"載入中…"},maximumSelected:function(e){var t="你只能選擇最多"+e.maximum+"項";return t},noResults:function(){return"沒有找到相符的項目"},searching:function(){return"搜尋中…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/styles/bootstrap/select2/js/select2.full.js b/styles/bootstrap/select2/js/select2.full.js new file mode 100644 index 000000000..e750834ef --- /dev/null +++ b/styles/bootstrap/select2/js/select2.full.js @@ -0,0 +1,6436 @@ +/*! + * Select2 4.0.3 + * https://select2.github.io + * + * Released under the MIT license + * https://github.com/select2/select2/blob/master/LICENSE.md + */ +(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS + factory(require('jquery')); + } else { + // Browser globals + factory(jQuery); + } +}(function (jQuery) { + // This is needed so we can catch the AMD loader configuration and use it + // The inner file should be wrapped (by `banner.start.js`) in a function that + // returns the AMD loader references. + var S2 = +(function () { + // Restore the Select2 AMD loader so it can be used + // Needed mostly in the language files, where the loader is not inserted + if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) { + var S2 = jQuery.fn.select2.amd; + } +var S2;(function () { if (!S2 || !S2.requirejs) { +if (!S2) { S2 = {}; } else { require = S2; } +/** + * @license almond 0.3.1 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved. + * Available via the MIT or new BSD license. + * see: http://github.com/jrburke/almond for details + */ +//Going sloppy to avoid 'use strict' string cost, but strict practices should +//be followed. +/*jslint sloppy: true */ +/*global setTimeout: false */ + +var requirejs, require, define; +(function (undef) { + var main, req, makeMap, handlers, + defined = {}, + waiting = {}, + config = {}, + defining = {}, + hasOwn = Object.prototype.hasOwnProperty, + aps = [].slice, + jsSuffixRegExp = /\.js$/; + + function hasProp(obj, prop) { + return hasOwn.call(obj, prop); + } + + /** + * Given a relative module name, like ./something, normalize it to + * a real name that can be mapped to a path. + * @param {String} name the relative name + * @param {String} baseName a real name that the name arg is relative + * to. + * @returns {String} normalized name + */ + function normalize(name, baseName) { + var nameParts, nameSegment, mapValue, foundMap, lastIndex, + foundI, foundStarMap, starI, i, j, part, + baseParts = baseName && baseName.split("/"), + map = config.map, + starMap = (map && map['*']) || {}; + + //Adjust any relative paths. + if (name && name.charAt(0) === ".") { + //If have a base name, try to normalize against it, + //otherwise, assume it is a top-level require that will + //be relative to baseUrl in the end. + if (baseName) { + name = name.split('/'); + lastIndex = name.length - 1; + + // Node .js allowance: + if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) { + name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, ''); + } + + //Lop off the last part of baseParts, so that . matches the + //"directory" and not name of the baseName's module. For instance, + //baseName of "one/two/three", maps to "one/two/three.js", but we + //want the directory, "one/two" for this normalization. + name = baseParts.slice(0, baseParts.length - 1).concat(name); + + //start trimDots + for (i = 0; i < name.length; i += 1) { + part = name[i]; + if (part === ".") { + name.splice(i, 1); + i -= 1; + } else if (part === "..") { + if (i === 1 && (name[2] === '..' || name[0] === '..')) { + //End of the line. Keep at least one non-dot + //path segment at the front so it can be mapped + //correctly to disk. Otherwise, there is likely + //no path mapping for a path starting with '..'. + //This can still fail, but catches the most reasonable + //uses of .. + break; + } else if (i > 0) { + name.splice(i - 1, 2); + i -= 2; + } + } + } + //end trimDots + + name = name.join("/"); + } else if (name.indexOf('./') === 0) { + // No baseName, so this is ID is resolved relative + // to baseUrl, pull off the leading dot. + name = name.substring(2); + } + } + + //Apply map config if available. + if ((baseParts || starMap) && map) { + nameParts = name.split('/'); + + for (i = nameParts.length; i > 0; i -= 1) { + nameSegment = nameParts.slice(0, i).join("/"); + + if (baseParts) { + //Find the longest baseName segment match in the config. + //So, do joins on the biggest to smallest lengths of baseParts. + for (j = baseParts.length; j > 0; j -= 1) { + mapValue = map[baseParts.slice(0, j).join('/')]; + + //baseName segment has config, find if it has one for + //this name. + if (mapValue) { + mapValue = mapValue[nameSegment]; + if (mapValue) { + //Match, update name to the new value. + foundMap = mapValue; + foundI = i; + break; + } + } + } + } + + if (foundMap) { + break; + } + + //Check for a star map match, but just hold on to it, + //if there is a shorter segment match later in a matching + //config, then favor over this star map. + if (!foundStarMap && starMap && starMap[nameSegment]) { + foundStarMap = starMap[nameSegment]; + starI = i; + } + } + + if (!foundMap && foundStarMap) { + foundMap = foundStarMap; + foundI = starI; + } + + if (foundMap) { + nameParts.splice(0, foundI, foundMap); + name = nameParts.join('/'); + } + } + + return name; + } + + function makeRequire(relName, forceSync) { + return function () { + //A version of a require function that passes a moduleName + //value for items that may need to + //look up paths relative to the moduleName + var args = aps.call(arguments, 0); + + //If first arg is not require('string'), and there is only + //one arg, it is the array form without a callback. Insert + //a null so that the following concat is correct. + if (typeof args[0] !== 'string' && args.length === 1) { + args.push(null); + } + return req.apply(undef, args.concat([relName, forceSync])); + }; + } + + function makeNormalize(relName) { + return function (name) { + return normalize(name, relName); + }; + } + + function makeLoad(depName) { + return function (value) { + defined[depName] = value; + }; + } + + function callDep(name) { + if (hasProp(waiting, name)) { + var args = waiting[name]; + delete waiting[name]; + defining[name] = true; + main.apply(undef, args); + } + + if (!hasProp(defined, name) && !hasProp(defining, name)) { + throw new Error('No ' + name); + } + return defined[name]; + } + + //Turns a plugin!resource to [plugin, resource] + //with the plugin being undefined if the name + //did not have a plugin prefix. + function splitPrefix(name) { + var prefix, + index = name ? name.indexOf('!') : -1; + if (index > -1) { + prefix = name.substring(0, index); + name = name.substring(index + 1, name.length); + } + return [prefix, name]; + } + + /** + * Makes a name map, normalizing the name, and using a plugin + * for normalization if necessary. Grabs a ref to plugin + * too, as an optimization. + */ + makeMap = function (name, relName) { + var plugin, + parts = splitPrefix(name), + prefix = parts[0]; + + name = parts[1]; + + if (prefix) { + prefix = normalize(prefix, relName); + plugin = callDep(prefix); + } + + //Normalize according + if (prefix) { + if (plugin && plugin.normalize) { + name = plugin.normalize(name, makeNormalize(relName)); + } else { + name = normalize(name, relName); + } + } else { + name = normalize(name, relName); + parts = splitPrefix(name); + prefix = parts[0]; + name = parts[1]; + if (prefix) { + plugin = callDep(prefix); + } + } + + //Using ridiculous property names for space reasons + return { + f: prefix ? prefix + '!' + name : name, //fullName + n: name, + pr: prefix, + p: plugin + }; + }; + + function makeConfig(name) { + return function () { + return (config && config.config && config.config[name]) || {}; + }; + } + + handlers = { + require: function (name) { + return makeRequire(name); + }, + exports: function (name) { + var e = defined[name]; + if (typeof e !== 'undefined') { + return e; + } else { + return (defined[name] = {}); + } + }, + module: function (name) { + return { + id: name, + uri: '', + exports: defined[name], + config: makeConfig(name) + }; + } + }; + + main = function (name, deps, callback, relName) { + var cjsModule, depName, ret, map, i, + args = [], + callbackType = typeof callback, + usingExports; + + //Use name if no relName + relName = relName || name; + + //Call the callback to define the module, if necessary. + if (callbackType === 'undefined' || callbackType === 'function') { + //Pull out the defined dependencies and pass the ordered + //values to the callback. + //Default to [require, exports, module] if no deps + deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps; + for (i = 0; i < deps.length; i += 1) { + map = makeMap(deps[i], relName); + depName = map.f; + + //Fast path CommonJS standard dependencies. + if (depName === "require") { + args[i] = handlers.require(name); + } else if (depName === "exports") { + //CommonJS module spec 1.1 + args[i] = handlers.exports(name); + usingExports = true; + } else if (depName === "module") { + //CommonJS module spec 1.1 + cjsModule = args[i] = handlers.module(name); + } else if (hasProp(defined, depName) || + hasProp(waiting, depName) || + hasProp(defining, depName)) { + args[i] = callDep(depName); + } else if (map.p) { + map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {}); + args[i] = defined[depName]; + } else { + throw new Error(name + ' missing ' + depName); + } + } + + ret = callback ? callback.apply(defined[name], args) : undefined; + + if (name) { + //If setting exports via "module" is in play, + //favor that over return value and exports. After that, + //favor a non-undefined return value over exports use. + if (cjsModule && cjsModule.exports !== undef && + cjsModule.exports !== defined[name]) { + defined[name] = cjsModule.exports; + } else if (ret !== undef || !usingExports) { + //Use the return value from the function. + defined[name] = ret; + } + } + } else if (name) { + //May just be an object definition for the module. Only + //worry about defining if have a module name. + defined[name] = callback; + } + }; + + requirejs = require = req = function (deps, callback, relName, forceSync, alt) { + if (typeof deps === "string") { + if (handlers[deps]) { + //callback in this case is really relName + return handlers[deps](callback); + } + //Just return the module wanted. In this scenario, the + //deps arg is the module name, and second arg (if passed) + //is just the relName. + //Normalize module name, if it contains . or .. + return callDep(makeMap(deps, callback).f); + } else if (!deps.splice) { + //deps is a config object, not an array. + config = deps; + if (config.deps) { + req(config.deps, config.callback); + } + if (!callback) { + return; + } + + if (callback.splice) { + //callback is an array, which means it is a dependency list. + //Adjust args if there are dependencies + deps = callback; + callback = relName; + relName = null; + } else { + deps = undef; + } + } + + //Support require(['a']) + callback = callback || function () {}; + + //If relName is a function, it is an errback handler, + //so remove it. + if (typeof relName === 'function') { + relName = forceSync; + forceSync = alt; + } + + //Simulate async callback; + if (forceSync) { + main(undef, deps, callback, relName); + } else { + //Using a non-zero value because of concern for what old browsers + //do, and latest browsers "upgrade" to 4 if lower value is used: + //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout: + //If want a value immediately, use require('id') instead -- something + //that works in almond on the global level, but not guaranteed and + //unlikely to work in other AMD implementations. + setTimeout(function () { + main(undef, deps, callback, relName); + }, 4); + } + + return req; + }; + + /** + * Just drops the config on the floor, but returns req in case + * the config return value is used. + */ + req.config = function (cfg) { + return req(cfg); + }; + + /** + * Expose module registry for debugging and tooling + */ + requirejs._defined = defined; + + define = function (name, deps, callback) { + if (typeof name !== 'string') { + throw new Error('See almond README: incorrect module build, no module name'); + } + + //This module may not have dependencies + if (!deps.splice) { + //deps is not an array, so probably means + //an object literal or factory function for + //the value. Adjust args. + callback = deps; + deps = []; + } + + if (!hasProp(defined, name) && !hasProp(waiting, name)) { + waiting[name] = [name, deps, callback]; + } + }; + + define.amd = { + jQuery: true + }; +}()); + +S2.requirejs = requirejs;S2.require = require;S2.define = define; +} +}()); +S2.define("almond", function(){}); + +/* global jQuery:false, $:false */ +S2.define('jquery',[],function () { + var _$ = jQuery || $; + + if (_$ == null && console && console.error) { + console.error( + 'Select2: An instance of jQuery or a jQuery-compatible library was not ' + + 'found. Make sure that you are including jQuery before Select2 on your ' + + 'web page.' + ); + } + + return _$; +}); + +S2.define('select2/utils',[ + 'jquery' +], function ($) { + var Utils = {}; + + Utils.Extend = function (ChildClass, SuperClass) { + var __hasProp = {}.hasOwnProperty; + + function BaseConstructor () { + this.constructor = ChildClass; + } + + for (var key in SuperClass) { + if (__hasProp.call(SuperClass, key)) { + ChildClass[key] = SuperClass[key]; + } + } + + BaseConstructor.prototype = SuperClass.prototype; + ChildClass.prototype = new BaseConstructor(); + ChildClass.__super__ = SuperClass.prototype; + + return ChildClass; + }; + + function getMethods (theClass) { + var proto = theClass.prototype; + + var methods = []; + + for (var methodName in proto) { + var m = proto[methodName]; + + if (typeof m !== 'function') { + continue; + } + + if (methodName === 'constructor') { + continue; + } + + methods.push(methodName); + } + + return methods; + } + + Utils.Decorate = function (SuperClass, DecoratorClass) { + var decoratedMethods = getMethods(DecoratorClass); + var superMethods = getMethods(SuperClass); + + function DecoratedClass () { + var unshift = Array.prototype.unshift; + + var argCount = DecoratorClass.prototype.constructor.length; + + var calledConstructor = SuperClass.prototype.constructor; + + if (argCount > 0) { + unshift.call(arguments, SuperClass.prototype.constructor); + + calledConstructor = DecoratorClass.prototype.constructor; + } + + calledConstructor.apply(this, arguments); + } + + DecoratorClass.displayName = SuperClass.displayName; + + function ctr () { + this.constructor = DecoratedClass; + } + + DecoratedClass.prototype = new ctr(); + + for (var m = 0; m < superMethods.length; m++) { + var superMethod = superMethods[m]; + + DecoratedClass.prototype[superMethod] = + SuperClass.prototype[superMethod]; + } + + var calledMethod = function (methodName) { + // Stub out the original method if it's not decorating an actual method + var originalMethod = function () {}; + + if (methodName in DecoratedClass.prototype) { + originalMethod = DecoratedClass.prototype[methodName]; + } + + var decoratedMethod = DecoratorClass.prototype[methodName]; + + return function () { + var unshift = Array.prototype.unshift; + + unshift.call(arguments, originalMethod); + + return decoratedMethod.apply(this, arguments); + }; + }; + + for (var d = 0; d < decoratedMethods.length; d++) { + var decoratedMethod = decoratedMethods[d]; + + DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod); + } + + return DecoratedClass; + }; + + var Observable = function () { + this.listeners = {}; + }; + + Observable.prototype.on = function (event, callback) { + this.listeners = this.listeners || {}; + + if (event in this.listeners) { + this.listeners[event].push(callback); + } else { + this.listeners[event] = [callback]; + } + }; + + Observable.prototype.trigger = function (event) { + var slice = Array.prototype.slice; + var params = slice.call(arguments, 1); + + this.listeners = this.listeners || {}; + + // Params should always come in as an array + if (params == null) { + params = []; + } + + // If there are no arguments to the event, use a temporary object + if (params.length === 0) { + params.push({}); + } + + // Set the `_type` of the first object to the event + params[0]._type = event; + + if (event in this.listeners) { + this.invoke(this.listeners[event], slice.call(arguments, 1)); + } + + if ('*' in this.listeners) { + this.invoke(this.listeners['*'], arguments); + } + }; + + Observable.prototype.invoke = function (listeners, params) { + for (var i = 0, len = listeners.length; i < len; i++) { + listeners[i].apply(this, params); + } + }; + + Utils.Observable = Observable; + + Utils.generateChars = function (length) { + var chars = ''; + + for (var i = 0; i < length; i++) { + var randomChar = Math.floor(Math.random() * 36); + chars += randomChar.toString(36); + } + + return chars; + }; + + Utils.bind = function (func, context) { + return function () { + func.apply(context, arguments); + }; + }; + + Utils._convertData = function (data) { + for (var originalKey in data) { + var keys = originalKey.split('-'); + + var dataLevel = data; + + if (keys.length === 1) { + continue; + } + + for (var k = 0; k < keys.length; k++) { + var key = keys[k]; + + // Lowercase the first letter + // By default, dash-separated becomes camelCase + key = key.substring(0, 1).toLowerCase() + key.substring(1); + + if (!(key in dataLevel)) { + dataLevel[key] = {}; + } + + if (k == keys.length - 1) { + dataLevel[key] = data[originalKey]; + } + + dataLevel = dataLevel[key]; + } + + delete data[originalKey]; + } + + return data; + }; + + Utils.hasScroll = function (index, el) { + // Adapted from the function created by @ShadowScripter + // and adapted by @BillBarry on the Stack Exchange Code Review website. + // The original code can be found at + // http://codereview.stackexchange.com/q/13338 + // and was designed to be used with the Sizzle selector engine. + + var $el = $(el); + var overflowX = el.style.overflowX; + var overflowY = el.style.overflowY; + + //Check both x and y declarations + if (overflowX === overflowY && + (overflowY === 'hidden' || overflowY === 'visible')) { + return false; + } + + if (overflowX === 'scroll' || overflowY === 'scroll') { + return true; + } + + return ($el.innerHeight() < el.scrollHeight || + $el.innerWidth() < el.scrollWidth); + }; + + Utils.escapeMarkup = function (markup) { + var replaceMap = { + '\\': '\', + '&': '&', + '<': '<', + '>': '>', + '"': '"', + '\'': ''', + '/': '/' + }; + + // Do not try to escape the markup if it's not a string + if (typeof markup !== 'string') { + return markup; + } + + return String(markup).replace(/[&<>"'\/\\]/g, function (match) { + return replaceMap[match]; + }); + }; + + // Append an array of jQuery nodes to a given element. + Utils.appendMany = function ($element, $nodes) { + // jQuery 1.7.x does not support $.fn.append() with an array + // Fall back to a jQuery object collection using $.fn.add() + if ($.fn.jquery.substr(0, 3) === '1.7') { + var $jqNodes = $(); + + $.map($nodes, function (node) { + $jqNodes = $jqNodes.add(node); + }); + + $nodes = $jqNodes; + } + + $element.append($nodes); + }; + + return Utils; +}); + +S2.define('select2/results',[ + 'jquery', + './utils' +], function ($, Utils) { + function Results ($element, options, dataAdapter) { + this.$element = $element; + this.data = dataAdapter; + this.options = options; + + Results.__super__.constructor.call(this); + } + + Utils.Extend(Results, Utils.Observable); + + Results.prototype.render = function () { + var $results = $( + '
      ' + ); + + if (this.options.get('multiple')) { + $results.attr('aria-multiselectable', 'true'); + } + + this.$results = $results; + + return $results; + }; + + Results.prototype.clear = function () { + this.$results.empty(); + }; + + Results.prototype.displayMessage = function (params) { + var escapeMarkup = this.options.get('escapeMarkup'); + + this.clear(); + this.hideLoading(); + + var $message = $( + '
    • ' + ); + + var message = this.options.get('translations').get(params.message); + + $message.append( + escapeMarkup( + message(params.args) + ) + ); + + $message[0].className += ' select2-results__message'; + + this.$results.append($message); + }; + + Results.prototype.hideMessages = function () { + this.$results.find('.select2-results__message').remove(); + }; + + Results.prototype.append = function (data) { + this.hideLoading(); + + var $options = []; + + if (data.results == null || data.results.length === 0) { + if (this.$results.children().length === 0) { + this.trigger('results:message', { + message: 'noResults' + }); + } + + return; + } + + data.results = this.sort(data.results); + + for (var d = 0; d < data.results.length; d++) { + var item = data.results[d]; + + var $option = this.option(item); + + $options.push($option); + } + + this.$results.append($options); + }; + + Results.prototype.position = function ($results, $dropdown) { + var $resultsContainer = $dropdown.find('.select2-results'); + $resultsContainer.append($results); + }; + + Results.prototype.sort = function (data) { + var sorter = this.options.get('sorter'); + + return sorter(data); + }; + + Results.prototype.highlightFirstItem = function () { + var $options = this.$results + .find('.select2-results__option[aria-selected]'); + + var $selected = $options.filter('[aria-selected=true]'); + + // Check if there are any selected options + if ($selected.length > 0) { + // If there are selected options, highlight the first + $selected.first().trigger('mouseenter'); + } else { + // If there are no selected options, highlight the first option + // in the dropdown + $options.first().trigger('mouseenter'); + } + + this.ensureHighlightVisible(); + }; + + Results.prototype.setClasses = function () { + var self = this; + + this.data.current(function (selected) { + var selectedIds = $.map(selected, function (s) { + return s.id.toString(); + }); + + var $options = self.$results + .find('.select2-results__option[aria-selected]'); + + $options.each(function () { + var $option = $(this); + + var item = $.data(this, 'data'); + + // id needs to be converted to a string when comparing + var id = '' + item.id; + + if ((item.element != null && item.element.selected) || + (item.element == null && $.inArray(id, selectedIds) > -1)) { + $option.attr('aria-selected', 'true'); + } else { + $option.attr('aria-selected', 'false'); + } + }); + + }); + }; + + Results.prototype.showLoading = function (params) { + this.hideLoading(); + + var loadingMore = this.options.get('translations').get('searching'); + + var loading = { + disabled: true, + loading: true, + text: loadingMore(params) + }; + var $loading = this.option(loading); + $loading.className += ' loading-results'; + + this.$results.prepend($loading); + }; + + Results.prototype.hideLoading = function () { + this.$results.find('.loading-results').remove(); + }; + + Results.prototype.option = function (data) { + var option = document.createElement('li'); + option.className = 'select2-results__option'; + + var attrs = { + 'role': 'treeitem', + 'aria-selected': 'false' + }; + + if (data.disabled) { + delete attrs['aria-selected']; + attrs['aria-disabled'] = 'true'; + } + + if (data.id == null) { + delete attrs['aria-selected']; + } + + if (data._resultId != null) { + option.id = data._resultId; + } + + if (data.title) { + option.title = data.title; + } + + if (data.children) { + attrs.role = 'group'; + attrs['aria-label'] = data.text; + delete attrs['aria-selected']; + } + + for (var attr in attrs) { + var val = attrs[attr]; + + option.setAttribute(attr, val); + } + + if (data.children) { + var $option = $(option); + + var label = document.createElement('strong'); + label.className = 'select2-results__group'; + + var $label = $(label); + this.template(data, label); + + var $children = []; + + for (var c = 0; c < data.children.length; c++) { + var child = data.children[c]; + + var $child = this.option(child); + + $children.push($child); + } + + var $childrenContainer = $('
        ', { + 'class': 'select2-results__options select2-results__options--nested' + }); + + $childrenContainer.append($children); + + $option.append(label); + $option.append($childrenContainer); + } else { + this.template(data, option); + } + + $.data(option, 'data', data); + + return option; + }; + + Results.prototype.bind = function (container, $container) { + var self = this; + + var id = container.id + '-results'; + + this.$results.attr('id', id); + + container.on('results:all', function (params) { + self.clear(); + self.append(params.data); + + if (container.isOpen()) { + self.setClasses(); + self.highlightFirstItem(); + } + }); + + container.on('results:append', function (params) { + self.append(params.data); + + if (container.isOpen()) { + self.setClasses(); + } + }); + + container.on('query', function (params) { + self.hideMessages(); + self.showLoading(params); + }); + + container.on('select', function () { + if (!container.isOpen()) { + return; + } + + self.setClasses(); + self.highlightFirstItem(); + }); + + container.on('unselect', function () { + if (!container.isOpen()) { + return; + } + + self.setClasses(); + self.highlightFirstItem(); + }); + + container.on('open', function () { + // When the dropdown is open, aria-expended="true" + self.$results.attr('aria-expanded', 'true'); + self.$results.attr('aria-hidden', 'false'); + + self.setClasses(); + self.ensureHighlightVisible(); + }); + + container.on('close', function () { + // When the dropdown is closed, aria-expended="false" + self.$results.attr('aria-expanded', 'false'); + self.$results.attr('aria-hidden', 'true'); + self.$results.removeAttr('aria-activedescendant'); + }); + + container.on('results:toggle', function () { + var $highlighted = self.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + $highlighted.trigger('mouseup'); + }); + + container.on('results:select', function () { + var $highlighted = self.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + var data = $highlighted.data('data'); + + if ($highlighted.attr('aria-selected') == 'true') { + self.trigger('close', {}); + } else { + self.trigger('select', { + data: data + }); + } + }); + + container.on('results:previous', function () { + var $highlighted = self.getHighlightedResults(); + + var $options = self.$results.find('[aria-selected]'); + + var currentIndex = $options.index($highlighted); + + // If we are already at te top, don't move further + if (currentIndex === 0) { + return; + } + + var nextIndex = currentIndex - 1; + + // If none are highlighted, highlight the first + if ($highlighted.length === 0) { + nextIndex = 0; + } + + var $next = $options.eq(nextIndex); + + $next.trigger('mouseenter'); + + var currentOffset = self.$results.offset().top; + var nextTop = $next.offset().top; + var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset); + + if (nextIndex === 0) { + self.$results.scrollTop(0); + } else if (nextTop - currentOffset < 0) { + self.$results.scrollTop(nextOffset); + } + }); + + container.on('results:next', function () { + var $highlighted = self.getHighlightedResults(); + + var $options = self.$results.find('[aria-selected]'); + + var currentIndex = $options.index($highlighted); + + var nextIndex = currentIndex + 1; + + // If we are at the last option, stay there + if (nextIndex >= $options.length) { + return; + } + + var $next = $options.eq(nextIndex); + + $next.trigger('mouseenter'); + + var currentOffset = self.$results.offset().top + + self.$results.outerHeight(false); + var nextBottom = $next.offset().top + $next.outerHeight(false); + var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset; + + if (nextIndex === 0) { + self.$results.scrollTop(0); + } else if (nextBottom > currentOffset) { + self.$results.scrollTop(nextOffset); + } + }); + + container.on('results:focus', function (params) { + params.element.addClass('select2-results__option--highlighted'); + }); + + container.on('results:message', function (params) { + self.displayMessage(params); + }); + + if ($.fn.mousewheel) { + this.$results.on('mousewheel', function (e) { + var top = self.$results.scrollTop(); + + var bottom = self.$results.get(0).scrollHeight - top + e.deltaY; + + var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0; + var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height(); + + if (isAtTop) { + self.$results.scrollTop(0); + + e.preventDefault(); + e.stopPropagation(); + } else if (isAtBottom) { + self.$results.scrollTop( + self.$results.get(0).scrollHeight - self.$results.height() + ); + + e.preventDefault(); + e.stopPropagation(); + } + }); + } + + this.$results.on('mouseup', '.select2-results__option[aria-selected]', + function (evt) { + var $this = $(this); + + var data = $this.data('data'); + + if ($this.attr('aria-selected') === 'true') { + if (self.options.get('multiple')) { + self.trigger('unselect', { + originalEvent: evt, + data: data + }); + } else { + self.trigger('close', {}); + } + + return; + } + + self.trigger('select', { + originalEvent: evt, + data: data + }); + }); + + this.$results.on('mouseenter', '.select2-results__option[aria-selected]', + function (evt) { + var data = $(this).data('data'); + + self.getHighlightedResults() + .removeClass('select2-results__option--highlighted'); + + self.trigger('results:focus', { + data: data, + element: $(this) + }); + }); + }; + + Results.prototype.getHighlightedResults = function () { + var $highlighted = this.$results + .find('.select2-results__option--highlighted'); + + return $highlighted; + }; + + Results.prototype.destroy = function () { + this.$results.remove(); + }; + + Results.prototype.ensureHighlightVisible = function () { + var $highlighted = this.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + var $options = this.$results.find('[aria-selected]'); + + var currentIndex = $options.index($highlighted); + + var currentOffset = this.$results.offset().top; + var nextTop = $highlighted.offset().top; + var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset); + + var offsetDelta = nextTop - currentOffset; + nextOffset -= $highlighted.outerHeight(false) * 2; + + if (currentIndex <= 2) { + this.$results.scrollTop(0); + } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) { + this.$results.scrollTop(nextOffset); + } + }; + + Results.prototype.template = function (result, container) { + var template = this.options.get('templateResult'); + var escapeMarkup = this.options.get('escapeMarkup'); + + var content = template(result, container); + + if (content == null) { + container.style.display = 'none'; + } else if (typeof content === 'string') { + container.innerHTML = escapeMarkup(content); + } else { + $(container).append(content); + } + }; + + return Results; +}); + +S2.define('select2/keys',[ + +], function () { + var KEYS = { + BACKSPACE: 8, + TAB: 9, + ENTER: 13, + SHIFT: 16, + CTRL: 17, + ALT: 18, + ESC: 27, + SPACE: 32, + PAGE_UP: 33, + PAGE_DOWN: 34, + END: 35, + HOME: 36, + LEFT: 37, + UP: 38, + RIGHT: 39, + DOWN: 40, + DELETE: 46 + }; + + return KEYS; +}); + +S2.define('select2/selection/base',[ + 'jquery', + '../utils', + '../keys' +], function ($, Utils, KEYS) { + function BaseSelection ($element, options) { + this.$element = $element; + this.options = options; + + BaseSelection.__super__.constructor.call(this); + } + + Utils.Extend(BaseSelection, Utils.Observable); + + BaseSelection.prototype.render = function () { + var $selection = $( + '' + ); + + this._tabindex = 0; + + if (this.$element.data('old-tabindex') != null) { + this._tabindex = this.$element.data('old-tabindex'); + } else if (this.$element.attr('tabindex') != null) { + this._tabindex = this.$element.attr('tabindex'); + } + + $selection.attr('title', this.$element.attr('title')); + $selection.attr('tabindex', this._tabindex); + + this.$selection = $selection; + + return $selection; + }; + + BaseSelection.prototype.bind = function (container, $container) { + var self = this; + + var id = container.id + '-container'; + var resultsId = container.id + '-results'; + + this.container = container; + + this.$selection.on('focus', function (evt) { + self.trigger('focus', evt); + }); + + this.$selection.on('blur', function (evt) { + self._handleBlur(evt); + }); + + this.$selection.on('keydown', function (evt) { + self.trigger('keypress', evt); + + if (evt.which === KEYS.SPACE) { + evt.preventDefault(); + } + }); + + container.on('results:focus', function (params) { + self.$selection.attr('aria-activedescendant', params.data._resultId); + }); + + container.on('selection:update', function (params) { + self.update(params.data); + }); + + container.on('open', function () { + // When the dropdown is open, aria-expanded="true" + self.$selection.attr('aria-expanded', 'true'); + self.$selection.attr('aria-owns', resultsId); + + self._attachCloseHandler(container); + }); + + container.on('close', function () { + // When the dropdown is closed, aria-expanded="false" + self.$selection.attr('aria-expanded', 'false'); + self.$selection.removeAttr('aria-activedescendant'); + self.$selection.removeAttr('aria-owns'); + + self.$selection.focus(); + + self._detachCloseHandler(container); + }); + + container.on('enable', function () { + self.$selection.attr('tabindex', self._tabindex); + }); + + container.on('disable', function () { + self.$selection.attr('tabindex', '-1'); + }); + }; + + BaseSelection.prototype._handleBlur = function (evt) { + var self = this; + + // This needs to be delayed as the active element is the body when the tab + // key is pressed, possibly along with others. + window.setTimeout(function () { + // Don't trigger `blur` if the focus is still in the selection + if ( + (document.activeElement == self.$selection[0]) || + ($.contains(self.$selection[0], document.activeElement)) + ) { + return; + } + + self.trigger('blur', evt); + }, 1); + }; + + BaseSelection.prototype._attachCloseHandler = function (container) { + var self = this; + + $(document.body).on('mousedown.select2.' + container.id, function (e) { + var $target = $(e.target); + + var $select = $target.closest('.select2'); + + var $all = $('.select2.select2-container--open'); + + $all.each(function () { + var $this = $(this); + + if (this == $select[0]) { + return; + } + + var $element = $this.data('element'); + + $element.select2('close'); + }); + }); + }; + + BaseSelection.prototype._detachCloseHandler = function (container) { + $(document.body).off('mousedown.select2.' + container.id); + }; + + BaseSelection.prototype.position = function ($selection, $container) { + var $selectionContainer = $container.find('.selection'); + $selectionContainer.append($selection); + }; + + BaseSelection.prototype.destroy = function () { + this._detachCloseHandler(this.container); + }; + + BaseSelection.prototype.update = function (data) { + throw new Error('The `update` method must be defined in child classes.'); + }; + + return BaseSelection; +}); + +S2.define('select2/selection/single',[ + 'jquery', + './base', + '../utils', + '../keys' +], function ($, BaseSelection, Utils, KEYS) { + function SingleSelection () { + SingleSelection.__super__.constructor.apply(this, arguments); + } + + Utils.Extend(SingleSelection, BaseSelection); + + SingleSelection.prototype.render = function () { + var $selection = SingleSelection.__super__.render.call(this); + + $selection.addClass('select2-selection--single'); + + $selection.html( + '' + + '' + + '' + + '' + ); + + return $selection; + }; + + SingleSelection.prototype.bind = function (container, $container) { + var self = this; + + SingleSelection.__super__.bind.apply(this, arguments); + + var id = container.id + '-container'; + + this.$selection.find('.select2-selection__rendered').attr('id', id); + this.$selection.attr('aria-labelledby', id); + + this.$selection.on('mousedown', function (evt) { + // Only respond to left clicks + if (evt.which !== 1) { + return; + } + + self.trigger('toggle', { + originalEvent: evt + }); + }); + + this.$selection.on('focus', function (evt) { + // User focuses on the container + }); + + this.$selection.on('blur', function (evt) { + // User exits the container + }); + + container.on('focus', function (evt) { + if (!container.isOpen()) { + self.$selection.focus(); + } + }); + + container.on('selection:update', function (params) { + self.update(params.data); + }); + }; + + SingleSelection.prototype.clear = function () { + this.$selection.find('.select2-selection__rendered').empty(); + }; + + SingleSelection.prototype.display = function (data, container) { + var template = this.options.get('templateSelection'); + var escapeMarkup = this.options.get('escapeMarkup'); + + return escapeMarkup(template(data, container)); + }; + + SingleSelection.prototype.selectionContainer = function () { + return $(''); + }; + + SingleSelection.prototype.update = function (data) { + if (data.length === 0) { + this.clear(); + return; + } + + var selection = data[0]; + + var $rendered = this.$selection.find('.select2-selection__rendered'); + var formatted = this.display(selection, $rendered); + + $rendered.empty().append(formatted); + $rendered.prop('title', selection.title || selection.text); + }; + + return SingleSelection; +}); + +S2.define('select2/selection/multiple',[ + 'jquery', + './base', + '../utils' +], function ($, BaseSelection, Utils) { + function MultipleSelection ($element, options) { + MultipleSelection.__super__.constructor.apply(this, arguments); + } + + Utils.Extend(MultipleSelection, BaseSelection); + + MultipleSelection.prototype.render = function () { + var $selection = MultipleSelection.__super__.render.call(this); + + $selection.addClass('select2-selection--multiple'); + + $selection.html( + '
          ' + ); + + return $selection; + }; + + MultipleSelection.prototype.bind = function (container, $container) { + var self = this; + + MultipleSelection.__super__.bind.apply(this, arguments); + + this.$selection.on('click', function (evt) { + self.trigger('toggle', { + originalEvent: evt + }); + }); + + this.$selection.on( + 'click', + '.select2-selection__choice__remove', + function (evt) { + // Ignore the event if it is disabled + if (self.options.get('disabled')) { + return; + } + + var $remove = $(this); + var $selection = $remove.parent(); + + var data = $selection.data('data'); + + self.trigger('unselect', { + originalEvent: evt, + data: data + }); + } + ); + }; + + MultipleSelection.prototype.clear = function () { + this.$selection.find('.select2-selection__rendered').empty(); + }; + + MultipleSelection.prototype.display = function (data, container) { + var template = this.options.get('templateSelection'); + var escapeMarkup = this.options.get('escapeMarkup'); + + return escapeMarkup(template(data, container)); + }; + + MultipleSelection.prototype.selectionContainer = function () { + var $container = $( + '
        • ' + + '' + + '×' + + '' + + '
        • ' + ); + + return $container; + }; + + MultipleSelection.prototype.update = function (data) { + this.clear(); + + if (data.length === 0) { + return; + } + + var $selections = []; + + for (var d = 0; d < data.length; d++) { + var selection = data[d]; + + var $selection = this.selectionContainer(); + var formatted = this.display(selection, $selection); + + $selection.append(formatted); + $selection.prop('title', selection.title || selection.text); + + $selection.data('data', selection); + + $selections.push($selection); + } + + var $rendered = this.$selection.find('.select2-selection__rendered'); + + Utils.appendMany($rendered, $selections); + }; + + return MultipleSelection; +}); + +S2.define('select2/selection/placeholder',[ + '../utils' +], function (Utils) { + function Placeholder (decorated, $element, options) { + this.placeholder = this.normalizePlaceholder(options.get('placeholder')); + + decorated.call(this, $element, options); + } + + Placeholder.prototype.normalizePlaceholder = function (_, placeholder) { + if (typeof placeholder === 'string') { + placeholder = { + id: '', + text: placeholder + }; + } + + return placeholder; + }; + + Placeholder.prototype.createPlaceholder = function (decorated, placeholder) { + var $placeholder = this.selectionContainer(); + + $placeholder.html(this.display(placeholder)); + $placeholder.addClass('select2-selection__placeholder') + .removeClass('select2-selection__choice'); + + return $placeholder; + }; + + Placeholder.prototype.update = function (decorated, data) { + var singlePlaceholder = ( + data.length == 1 && data[0].id != this.placeholder.id + ); + var multipleSelections = data.length > 1; + + if (multipleSelections || singlePlaceholder) { + return decorated.call(this, data); + } + + this.clear(); + + var $placeholder = this.createPlaceholder(this.placeholder); + + this.$selection.find('.select2-selection__rendered').append($placeholder); + }; + + return Placeholder; +}); + +S2.define('select2/selection/allowClear',[ + 'jquery', + '../keys' +], function ($, KEYS) { + function AllowClear () { } + + AllowClear.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + if (this.placeholder == null) { + if (this.options.get('debug') && window.console && console.error) { + console.error( + 'Select2: The `allowClear` option should be used in combination ' + + 'with the `placeholder` option.' + ); + } + } + + this.$selection.on('mousedown', '.select2-selection__clear', + function (evt) { + self._handleClear(evt); + }); + + container.on('keypress', function (evt) { + self._handleKeyboardClear(evt, container); + }); + }; + + AllowClear.prototype._handleClear = function (_, evt) { + // Ignore the event if it is disabled + if (this.options.get('disabled')) { + return; + } + + var $clear = this.$selection.find('.select2-selection__clear'); + + // Ignore the event if nothing has been selected + if ($clear.length === 0) { + return; + } + + evt.stopPropagation(); + + var data = $clear.data('data'); + + for (var d = 0; d < data.length; d++) { + var unselectData = { + data: data[d] + }; + + // Trigger the `unselect` event, so people can prevent it from being + // cleared. + this.trigger('unselect', unselectData); + + // If the event was prevented, don't clear it out. + if (unselectData.prevented) { + return; + } + } + + this.$element.val(this.placeholder.id).trigger('change'); + + this.trigger('toggle', {}); + }; + + AllowClear.prototype._handleKeyboardClear = function (_, evt, container) { + if (container.isOpen()) { + return; + } + + if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) { + this._handleClear(evt); + } + }; + + AllowClear.prototype.update = function (decorated, data) { + decorated.call(this, data); + + if (this.$selection.find('.select2-selection__placeholder').length > 0 || + data.length === 0) { + return; + } + + var $remove = $( + '' + + '×' + + '' + ); + $remove.data('data', data); + + this.$selection.find('.select2-selection__rendered').prepend($remove); + }; + + return AllowClear; +}); + +S2.define('select2/selection/search',[ + 'jquery', + '../utils', + '../keys' +], function ($, Utils, KEYS) { + function Search (decorated, $element, options) { + decorated.call(this, $element, options); + } + + Search.prototype.render = function (decorated) { + var $search = $( + '' + ); + + this.$searchContainer = $search; + this.$search = $search.find('input'); + + var $rendered = decorated.call(this); + + this._transferTabIndex(); + + return $rendered; + }; + + Search.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('open', function () { + self.$search.trigger('focus'); + }); + + container.on('close', function () { + self.$search.val(''); + self.$search.removeAttr('aria-activedescendant'); + self.$search.trigger('focus'); + }); + + container.on('enable', function () { + self.$search.prop('disabled', false); + + self._transferTabIndex(); + }); + + container.on('disable', function () { + self.$search.prop('disabled', true); + }); + + container.on('focus', function (evt) { + self.$search.trigger('focus'); + }); + + container.on('results:focus', function (params) { + self.$search.attr('aria-activedescendant', params.id); + }); + + this.$selection.on('focusin', '.select2-search--inline', function (evt) { + self.trigger('focus', evt); + }); + + this.$selection.on('focusout', '.select2-search--inline', function (evt) { + self._handleBlur(evt); + }); + + this.$selection.on('keydown', '.select2-search--inline', function (evt) { + evt.stopPropagation(); + + self.trigger('keypress', evt); + + self._keyUpPrevented = evt.isDefaultPrevented(); + + var key = evt.which; + + if (key === KEYS.BACKSPACE && self.$search.val() === '') { + var $previousChoice = self.$searchContainer + .prev('.select2-selection__choice'); + + if ($previousChoice.length > 0) { + var item = $previousChoice.data('data'); + + self.searchRemoveChoice(item); + + evt.preventDefault(); + } + } + }); + + // Try to detect the IE version should the `documentMode` property that + // is stored on the document. This is only implemented in IE and is + // slightly cleaner than doing a user agent check. + // This property is not available in Edge, but Edge also doesn't have + // this bug. + var msie = document.documentMode; + var disableInputEvents = msie && msie <= 11; + + // Workaround for browsers which do not support the `input` event + // This will prevent double-triggering of events for browsers which support + // both the `keyup` and `input` events. + this.$selection.on( + 'input.searchcheck', + '.select2-search--inline', + function (evt) { + // IE will trigger the `input` event when a placeholder is used on a + // search box. To get around this issue, we are forced to ignore all + // `input` events in IE and keep using `keyup`. + if (disableInputEvents) { + self.$selection.off('input.search input.searchcheck'); + return; + } + + // Unbind the duplicated `keyup` event + self.$selection.off('keyup.search'); + } + ); + + this.$selection.on( + 'keyup.search input.search', + '.select2-search--inline', + function (evt) { + // IE will trigger the `input` event when a placeholder is used on a + // search box. To get around this issue, we are forced to ignore all + // `input` events in IE and keep using `keyup`. + if (disableInputEvents && evt.type === 'input') { + self.$selection.off('input.search input.searchcheck'); + return; + } + + var key = evt.which; + + // We can freely ignore events from modifier keys + if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) { + return; + } + + // Tabbing will be handled during the `keydown` phase + if (key == KEYS.TAB) { + return; + } + + self.handleSearch(evt); + } + ); + }; + + /** + * This method will transfer the tabindex attribute from the rendered + * selection to the search box. This allows for the search box to be used as + * the primary focus instead of the selection container. + * + * @private + */ + Search.prototype._transferTabIndex = function (decorated) { + this.$search.attr('tabindex', this.$selection.attr('tabindex')); + this.$selection.attr('tabindex', '-1'); + }; + + Search.prototype.createPlaceholder = function (decorated, placeholder) { + this.$search.attr('placeholder', placeholder.text); + }; + + Search.prototype.update = function (decorated, data) { + var searchHadFocus = this.$search[0] == document.activeElement; + + this.$search.attr('placeholder', ''); + + decorated.call(this, data); + + this.$selection.find('.select2-selection__rendered') + .append(this.$searchContainer); + + this.resizeSearch(); + if (searchHadFocus) { + this.$search.focus(); + } + }; + + Search.prototype.handleSearch = function () { + this.resizeSearch(); + + if (!this._keyUpPrevented) { + var input = this.$search.val(); + + this.trigger('query', { + term: input + }); + } + + this._keyUpPrevented = false; + }; + + Search.prototype.searchRemoveChoice = function (decorated, item) { + this.trigger('unselect', { + data: item + }); + + this.$search.val(item.text); + this.handleSearch(); + }; + + Search.prototype.resizeSearch = function () { + this.$search.css('width', '25px'); + + var width = ''; + + if (this.$search.attr('placeholder') !== '') { + width = this.$selection.find('.select2-selection__rendered').innerWidth(); + } else { + var minimumWidth = this.$search.val().length + 1; + + width = (minimumWidth * 0.75) + 'em'; + } + + this.$search.css('width', width); + }; + + return Search; +}); + +S2.define('select2/selection/eventRelay',[ + 'jquery' +], function ($) { + function EventRelay () { } + + EventRelay.prototype.bind = function (decorated, container, $container) { + var self = this; + var relayEvents = [ + 'open', 'opening', + 'close', 'closing', + 'select', 'selecting', + 'unselect', 'unselecting' + ]; + + var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting']; + + decorated.call(this, container, $container); + + container.on('*', function (name, params) { + // Ignore events that should not be relayed + if ($.inArray(name, relayEvents) === -1) { + return; + } + + // The parameters should always be an object + params = params || {}; + + // Generate the jQuery event for the Select2 event + var evt = $.Event('select2:' + name, { + params: params + }); + + self.$element.trigger(evt); + + // Only handle preventable events if it was one + if ($.inArray(name, preventableEvents) === -1) { + return; + } + + params.prevented = evt.isDefaultPrevented(); + }); + }; + + return EventRelay; +}); + +S2.define('select2/translation',[ + 'jquery', + 'require' +], function ($, require) { + function Translation (dict) { + this.dict = dict || {}; + } + + Translation.prototype.all = function () { + return this.dict; + }; + + Translation.prototype.get = function (key) { + return this.dict[key]; + }; + + Translation.prototype.extend = function (translation) { + this.dict = $.extend({}, translation.all(), this.dict); + }; + + // Static functions + + Translation._cache = {}; + + Translation.loadPath = function (path) { + if (!(path in Translation._cache)) { + var translations = require(path); + + Translation._cache[path] = translations; + } + + return new Translation(Translation._cache[path]); + }; + + return Translation; +}); + +S2.define('select2/diacritics',[ + +], function () { + var diacritics = { + '\u24B6': 'A', + '\uFF21': 'A', + '\u00C0': 'A', + '\u00C1': 'A', + '\u00C2': 'A', + '\u1EA6': 'A', + '\u1EA4': 'A', + '\u1EAA': 'A', + '\u1EA8': 'A', + '\u00C3': 'A', + '\u0100': 'A', + '\u0102': 'A', + '\u1EB0': 'A', + '\u1EAE': 'A', + '\u1EB4': 'A', + '\u1EB2': 'A', + '\u0226': 'A', + '\u01E0': 'A', + '\u00C4': 'A', + '\u01DE': 'A', + '\u1EA2': 'A', + '\u00C5': 'A', + '\u01FA': 'A', + '\u01CD': 'A', + '\u0200': 'A', + '\u0202': 'A', + '\u1EA0': 'A', + '\u1EAC': 'A', + '\u1EB6': 'A', + '\u1E00': 'A', + '\u0104': 'A', + '\u023A': 'A', + '\u2C6F': 'A', + '\uA732': 'AA', + '\u00C6': 'AE', + '\u01FC': 'AE', + '\u01E2': 'AE', + '\uA734': 'AO', + '\uA736': 'AU', + '\uA738': 'AV', + '\uA73A': 'AV', + '\uA73C': 'AY', + '\u24B7': 'B', + '\uFF22': 'B', + '\u1E02': 'B', + '\u1E04': 'B', + '\u1E06': 'B', + '\u0243': 'B', + '\u0182': 'B', + '\u0181': 'B', + '\u24B8': 'C', + '\uFF23': 'C', + '\u0106': 'C', + '\u0108': 'C', + '\u010A': 'C', + '\u010C': 'C', + '\u00C7': 'C', + '\u1E08': 'C', + '\u0187': 'C', + '\u023B': 'C', + '\uA73E': 'C', + '\u24B9': 'D', + '\uFF24': 'D', + '\u1E0A': 'D', + '\u010E': 'D', + '\u1E0C': 'D', + '\u1E10': 'D', + '\u1E12': 'D', + '\u1E0E': 'D', + '\u0110': 'D', + '\u018B': 'D', + '\u018A': 'D', + '\u0189': 'D', + '\uA779': 'D', + '\u01F1': 'DZ', + '\u01C4': 'DZ', + '\u01F2': 'Dz', + '\u01C5': 'Dz', + '\u24BA': 'E', + '\uFF25': 'E', + '\u00C8': 'E', + '\u00C9': 'E', + '\u00CA': 'E', + '\u1EC0': 'E', + '\u1EBE': 'E', + '\u1EC4': 'E', + '\u1EC2': 'E', + '\u1EBC': 'E', + '\u0112': 'E', + '\u1E14': 'E', + '\u1E16': 'E', + '\u0114': 'E', + '\u0116': 'E', + '\u00CB': 'E', + '\u1EBA': 'E', + '\u011A': 'E', + '\u0204': 'E', + '\u0206': 'E', + '\u1EB8': 'E', + '\u1EC6': 'E', + '\u0228': 'E', + '\u1E1C': 'E', + '\u0118': 'E', + '\u1E18': 'E', + '\u1E1A': 'E', + '\u0190': 'E', + '\u018E': 'E', + '\u24BB': 'F', + '\uFF26': 'F', + '\u1E1E': 'F', + '\u0191': 'F', + '\uA77B': 'F', + '\u24BC': 'G', + '\uFF27': 'G', + '\u01F4': 'G', + '\u011C': 'G', + '\u1E20': 'G', + '\u011E': 'G', + '\u0120': 'G', + '\u01E6': 'G', + '\u0122': 'G', + '\u01E4': 'G', + '\u0193': 'G', + '\uA7A0': 'G', + '\uA77D': 'G', + '\uA77E': 'G', + '\u24BD': 'H', + '\uFF28': 'H', + '\u0124': 'H', + '\u1E22': 'H', + '\u1E26': 'H', + '\u021E': 'H', + '\u1E24': 'H', + '\u1E28': 'H', + '\u1E2A': 'H', + '\u0126': 'H', + '\u2C67': 'H', + '\u2C75': 'H', + '\uA78D': 'H', + '\u24BE': 'I', + '\uFF29': 'I', + '\u00CC': 'I', + '\u00CD': 'I', + '\u00CE': 'I', + '\u0128': 'I', + '\u012A': 'I', + '\u012C': 'I', + '\u0130': 'I', + '\u00CF': 'I', + '\u1E2E': 'I', + '\u1EC8': 'I', + '\u01CF': 'I', + '\u0208': 'I', + '\u020A': 'I', + '\u1ECA': 'I', + '\u012E': 'I', + '\u1E2C': 'I', + '\u0197': 'I', + '\u24BF': 'J', + '\uFF2A': 'J', + '\u0134': 'J', + '\u0248': 'J', + '\u24C0': 'K', + '\uFF2B': 'K', + '\u1E30': 'K', + '\u01E8': 'K', + '\u1E32': 'K', + '\u0136': 'K', + '\u1E34': 'K', + '\u0198': 'K', + '\u2C69': 'K', + '\uA740': 'K', + '\uA742': 'K', + '\uA744': 'K', + '\uA7A2': 'K', + '\u24C1': 'L', + '\uFF2C': 'L', + '\u013F': 'L', + '\u0139': 'L', + '\u013D': 'L', + '\u1E36': 'L', + '\u1E38': 'L', + '\u013B': 'L', + '\u1E3C': 'L', + '\u1E3A': 'L', + '\u0141': 'L', + '\u023D': 'L', + '\u2C62': 'L', + '\u2C60': 'L', + '\uA748': 'L', + '\uA746': 'L', + '\uA780': 'L', + '\u01C7': 'LJ', + '\u01C8': 'Lj', + '\u24C2': 'M', + '\uFF2D': 'M', + '\u1E3E': 'M', + '\u1E40': 'M', + '\u1E42': 'M', + '\u2C6E': 'M', + '\u019C': 'M', + '\u24C3': 'N', + '\uFF2E': 'N', + '\u01F8': 'N', + '\u0143': 'N', + '\u00D1': 'N', + '\u1E44': 'N', + '\u0147': 'N', + '\u1E46': 'N', + '\u0145': 'N', + '\u1E4A': 'N', + '\u1E48': 'N', + '\u0220': 'N', + '\u019D': 'N', + '\uA790': 'N', + '\uA7A4': 'N', + '\u01CA': 'NJ', + '\u01CB': 'Nj', + '\u24C4': 'O', + '\uFF2F': 'O', + '\u00D2': 'O', + '\u00D3': 'O', + '\u00D4': 'O', + '\u1ED2': 'O', + '\u1ED0': 'O', + '\u1ED6': 'O', + '\u1ED4': 'O', + '\u00D5': 'O', + '\u1E4C': 'O', + '\u022C': 'O', + '\u1E4E': 'O', + '\u014C': 'O', + '\u1E50': 'O', + '\u1E52': 'O', + '\u014E': 'O', + '\u022E': 'O', + '\u0230': 'O', + '\u00D6': 'O', + '\u022A': 'O', + '\u1ECE': 'O', + '\u0150': 'O', + '\u01D1': 'O', + '\u020C': 'O', + '\u020E': 'O', + '\u01A0': 'O', + '\u1EDC': 'O', + '\u1EDA': 'O', + '\u1EE0': 'O', + '\u1EDE': 'O', + '\u1EE2': 'O', + '\u1ECC': 'O', + '\u1ED8': 'O', + '\u01EA': 'O', + '\u01EC': 'O', + '\u00D8': 'O', + '\u01FE': 'O', + '\u0186': 'O', + '\u019F': 'O', + '\uA74A': 'O', + '\uA74C': 'O', + '\u01A2': 'OI', + '\uA74E': 'OO', + '\u0222': 'OU', + '\u24C5': 'P', + '\uFF30': 'P', + '\u1E54': 'P', + '\u1E56': 'P', + '\u01A4': 'P', + '\u2C63': 'P', + '\uA750': 'P', + '\uA752': 'P', + '\uA754': 'P', + '\u24C6': 'Q', + '\uFF31': 'Q', + '\uA756': 'Q', + '\uA758': 'Q', + '\u024A': 'Q', + '\u24C7': 'R', + '\uFF32': 'R', + '\u0154': 'R', + '\u1E58': 'R', + '\u0158': 'R', + '\u0210': 'R', + '\u0212': 'R', + '\u1E5A': 'R', + '\u1E5C': 'R', + '\u0156': 'R', + '\u1E5E': 'R', + '\u024C': 'R', + '\u2C64': 'R', + '\uA75A': 'R', + '\uA7A6': 'R', + '\uA782': 'R', + '\u24C8': 'S', + '\uFF33': 'S', + '\u1E9E': 'S', + '\u015A': 'S', + '\u1E64': 'S', + '\u015C': 'S', + '\u1E60': 'S', + '\u0160': 'S', + '\u1E66': 'S', + '\u1E62': 'S', + '\u1E68': 'S', + '\u0218': 'S', + '\u015E': 'S', + '\u2C7E': 'S', + '\uA7A8': 'S', + '\uA784': 'S', + '\u24C9': 'T', + '\uFF34': 'T', + '\u1E6A': 'T', + '\u0164': 'T', + '\u1E6C': 'T', + '\u021A': 'T', + '\u0162': 'T', + '\u1E70': 'T', + '\u1E6E': 'T', + '\u0166': 'T', + '\u01AC': 'T', + '\u01AE': 'T', + '\u023E': 'T', + '\uA786': 'T', + '\uA728': 'TZ', + '\u24CA': 'U', + '\uFF35': 'U', + '\u00D9': 'U', + '\u00DA': 'U', + '\u00DB': 'U', + '\u0168': 'U', + '\u1E78': 'U', + '\u016A': 'U', + '\u1E7A': 'U', + '\u016C': 'U', + '\u00DC': 'U', + '\u01DB': 'U', + '\u01D7': 'U', + '\u01D5': 'U', + '\u01D9': 'U', + '\u1EE6': 'U', + '\u016E': 'U', + '\u0170': 'U', + '\u01D3': 'U', + '\u0214': 'U', + '\u0216': 'U', + '\u01AF': 'U', + '\u1EEA': 'U', + '\u1EE8': 'U', + '\u1EEE': 'U', + '\u1EEC': 'U', + '\u1EF0': 'U', + '\u1EE4': 'U', + '\u1E72': 'U', + '\u0172': 'U', + '\u1E76': 'U', + '\u1E74': 'U', + '\u0244': 'U', + '\u24CB': 'V', + '\uFF36': 'V', + '\u1E7C': 'V', + '\u1E7E': 'V', + '\u01B2': 'V', + '\uA75E': 'V', + '\u0245': 'V', + '\uA760': 'VY', + '\u24CC': 'W', + '\uFF37': 'W', + '\u1E80': 'W', + '\u1E82': 'W', + '\u0174': 'W', + '\u1E86': 'W', + '\u1E84': 'W', + '\u1E88': 'W', + '\u2C72': 'W', + '\u24CD': 'X', + '\uFF38': 'X', + '\u1E8A': 'X', + '\u1E8C': 'X', + '\u24CE': 'Y', + '\uFF39': 'Y', + '\u1EF2': 'Y', + '\u00DD': 'Y', + '\u0176': 'Y', + '\u1EF8': 'Y', + '\u0232': 'Y', + '\u1E8E': 'Y', + '\u0178': 'Y', + '\u1EF6': 'Y', + '\u1EF4': 'Y', + '\u01B3': 'Y', + '\u024E': 'Y', + '\u1EFE': 'Y', + '\u24CF': 'Z', + '\uFF3A': 'Z', + '\u0179': 'Z', + '\u1E90': 'Z', + '\u017B': 'Z', + '\u017D': 'Z', + '\u1E92': 'Z', + '\u1E94': 'Z', + '\u01B5': 'Z', + '\u0224': 'Z', + '\u2C7F': 'Z', + '\u2C6B': 'Z', + '\uA762': 'Z', + '\u24D0': 'a', + '\uFF41': 'a', + '\u1E9A': 'a', + '\u00E0': 'a', + '\u00E1': 'a', + '\u00E2': 'a', + '\u1EA7': 'a', + '\u1EA5': 'a', + '\u1EAB': 'a', + '\u1EA9': 'a', + '\u00E3': 'a', + '\u0101': 'a', + '\u0103': 'a', + '\u1EB1': 'a', + '\u1EAF': 'a', + '\u1EB5': 'a', + '\u1EB3': 'a', + '\u0227': 'a', + '\u01E1': 'a', + '\u00E4': 'a', + '\u01DF': 'a', + '\u1EA3': 'a', + '\u00E5': 'a', + '\u01FB': 'a', + '\u01CE': 'a', + '\u0201': 'a', + '\u0203': 'a', + '\u1EA1': 'a', + '\u1EAD': 'a', + '\u1EB7': 'a', + '\u1E01': 'a', + '\u0105': 'a', + '\u2C65': 'a', + '\u0250': 'a', + '\uA733': 'aa', + '\u00E6': 'ae', + '\u01FD': 'ae', + '\u01E3': 'ae', + '\uA735': 'ao', + '\uA737': 'au', + '\uA739': 'av', + '\uA73B': 'av', + '\uA73D': 'ay', + '\u24D1': 'b', + '\uFF42': 'b', + '\u1E03': 'b', + '\u1E05': 'b', + '\u1E07': 'b', + '\u0180': 'b', + '\u0183': 'b', + '\u0253': 'b', + '\u24D2': 'c', + '\uFF43': 'c', + '\u0107': 'c', + '\u0109': 'c', + '\u010B': 'c', + '\u010D': 'c', + '\u00E7': 'c', + '\u1E09': 'c', + '\u0188': 'c', + '\u023C': 'c', + '\uA73F': 'c', + '\u2184': 'c', + '\u24D3': 'd', + '\uFF44': 'd', + '\u1E0B': 'd', + '\u010F': 'd', + '\u1E0D': 'd', + '\u1E11': 'd', + '\u1E13': 'd', + '\u1E0F': 'd', + '\u0111': 'd', + '\u018C': 'd', + '\u0256': 'd', + '\u0257': 'd', + '\uA77A': 'd', + '\u01F3': 'dz', + '\u01C6': 'dz', + '\u24D4': 'e', + '\uFF45': 'e', + '\u00E8': 'e', + '\u00E9': 'e', + '\u00EA': 'e', + '\u1EC1': 'e', + '\u1EBF': 'e', + '\u1EC5': 'e', + '\u1EC3': 'e', + '\u1EBD': 'e', + '\u0113': 'e', + '\u1E15': 'e', + '\u1E17': 'e', + '\u0115': 'e', + '\u0117': 'e', + '\u00EB': 'e', + '\u1EBB': 'e', + '\u011B': 'e', + '\u0205': 'e', + '\u0207': 'e', + '\u1EB9': 'e', + '\u1EC7': 'e', + '\u0229': 'e', + '\u1E1D': 'e', + '\u0119': 'e', + '\u1E19': 'e', + '\u1E1B': 'e', + '\u0247': 'e', + '\u025B': 'e', + '\u01DD': 'e', + '\u24D5': 'f', + '\uFF46': 'f', + '\u1E1F': 'f', + '\u0192': 'f', + '\uA77C': 'f', + '\u24D6': 'g', + '\uFF47': 'g', + '\u01F5': 'g', + '\u011D': 'g', + '\u1E21': 'g', + '\u011F': 'g', + '\u0121': 'g', + '\u01E7': 'g', + '\u0123': 'g', + '\u01E5': 'g', + '\u0260': 'g', + '\uA7A1': 'g', + '\u1D79': 'g', + '\uA77F': 'g', + '\u24D7': 'h', + '\uFF48': 'h', + '\u0125': 'h', + '\u1E23': 'h', + '\u1E27': 'h', + '\u021F': 'h', + '\u1E25': 'h', + '\u1E29': 'h', + '\u1E2B': 'h', + '\u1E96': 'h', + '\u0127': 'h', + '\u2C68': 'h', + '\u2C76': 'h', + '\u0265': 'h', + '\u0195': 'hv', + '\u24D8': 'i', + '\uFF49': 'i', + '\u00EC': 'i', + '\u00ED': 'i', + '\u00EE': 'i', + '\u0129': 'i', + '\u012B': 'i', + '\u012D': 'i', + '\u00EF': 'i', + '\u1E2F': 'i', + '\u1EC9': 'i', + '\u01D0': 'i', + '\u0209': 'i', + '\u020B': 'i', + '\u1ECB': 'i', + '\u012F': 'i', + '\u1E2D': 'i', + '\u0268': 'i', + '\u0131': 'i', + '\u24D9': 'j', + '\uFF4A': 'j', + '\u0135': 'j', + '\u01F0': 'j', + '\u0249': 'j', + '\u24DA': 'k', + '\uFF4B': 'k', + '\u1E31': 'k', + '\u01E9': 'k', + '\u1E33': 'k', + '\u0137': 'k', + '\u1E35': 'k', + '\u0199': 'k', + '\u2C6A': 'k', + '\uA741': 'k', + '\uA743': 'k', + '\uA745': 'k', + '\uA7A3': 'k', + '\u24DB': 'l', + '\uFF4C': 'l', + '\u0140': 'l', + '\u013A': 'l', + '\u013E': 'l', + '\u1E37': 'l', + '\u1E39': 'l', + '\u013C': 'l', + '\u1E3D': 'l', + '\u1E3B': 'l', + '\u017F': 'l', + '\u0142': 'l', + '\u019A': 'l', + '\u026B': 'l', + '\u2C61': 'l', + '\uA749': 'l', + '\uA781': 'l', + '\uA747': 'l', + '\u01C9': 'lj', + '\u24DC': 'm', + '\uFF4D': 'm', + '\u1E3F': 'm', + '\u1E41': 'm', + '\u1E43': 'm', + '\u0271': 'm', + '\u026F': 'm', + '\u24DD': 'n', + '\uFF4E': 'n', + '\u01F9': 'n', + '\u0144': 'n', + '\u00F1': 'n', + '\u1E45': 'n', + '\u0148': 'n', + '\u1E47': 'n', + '\u0146': 'n', + '\u1E4B': 'n', + '\u1E49': 'n', + '\u019E': 'n', + '\u0272': 'n', + '\u0149': 'n', + '\uA791': 'n', + '\uA7A5': 'n', + '\u01CC': 'nj', + '\u24DE': 'o', + '\uFF4F': 'o', + '\u00F2': 'o', + '\u00F3': 'o', + '\u00F4': 'o', + '\u1ED3': 'o', + '\u1ED1': 'o', + '\u1ED7': 'o', + '\u1ED5': 'o', + '\u00F5': 'o', + '\u1E4D': 'o', + '\u022D': 'o', + '\u1E4F': 'o', + '\u014D': 'o', + '\u1E51': 'o', + '\u1E53': 'o', + '\u014F': 'o', + '\u022F': 'o', + '\u0231': 'o', + '\u00F6': 'o', + '\u022B': 'o', + '\u1ECF': 'o', + '\u0151': 'o', + '\u01D2': 'o', + '\u020D': 'o', + '\u020F': 'o', + '\u01A1': 'o', + '\u1EDD': 'o', + '\u1EDB': 'o', + '\u1EE1': 'o', + '\u1EDF': 'o', + '\u1EE3': 'o', + '\u1ECD': 'o', + '\u1ED9': 'o', + '\u01EB': 'o', + '\u01ED': 'o', + '\u00F8': 'o', + '\u01FF': 'o', + '\u0254': 'o', + '\uA74B': 'o', + '\uA74D': 'o', + '\u0275': 'o', + '\u01A3': 'oi', + '\u0223': 'ou', + '\uA74F': 'oo', + '\u24DF': 'p', + '\uFF50': 'p', + '\u1E55': 'p', + '\u1E57': 'p', + '\u01A5': 'p', + '\u1D7D': 'p', + '\uA751': 'p', + '\uA753': 'p', + '\uA755': 'p', + '\u24E0': 'q', + '\uFF51': 'q', + '\u024B': 'q', + '\uA757': 'q', + '\uA759': 'q', + '\u24E1': 'r', + '\uFF52': 'r', + '\u0155': 'r', + '\u1E59': 'r', + '\u0159': 'r', + '\u0211': 'r', + '\u0213': 'r', + '\u1E5B': 'r', + '\u1E5D': 'r', + '\u0157': 'r', + '\u1E5F': 'r', + '\u024D': 'r', + '\u027D': 'r', + '\uA75B': 'r', + '\uA7A7': 'r', + '\uA783': 'r', + '\u24E2': 's', + '\uFF53': 's', + '\u00DF': 's', + '\u015B': 's', + '\u1E65': 's', + '\u015D': 's', + '\u1E61': 's', + '\u0161': 's', + '\u1E67': 's', + '\u1E63': 's', + '\u1E69': 's', + '\u0219': 's', + '\u015F': 's', + '\u023F': 's', + '\uA7A9': 's', + '\uA785': 's', + '\u1E9B': 's', + '\u24E3': 't', + '\uFF54': 't', + '\u1E6B': 't', + '\u1E97': 't', + '\u0165': 't', + '\u1E6D': 't', + '\u021B': 't', + '\u0163': 't', + '\u1E71': 't', + '\u1E6F': 't', + '\u0167': 't', + '\u01AD': 't', + '\u0288': 't', + '\u2C66': 't', + '\uA787': 't', + '\uA729': 'tz', + '\u24E4': 'u', + '\uFF55': 'u', + '\u00F9': 'u', + '\u00FA': 'u', + '\u00FB': 'u', + '\u0169': 'u', + '\u1E79': 'u', + '\u016B': 'u', + '\u1E7B': 'u', + '\u016D': 'u', + '\u00FC': 'u', + '\u01DC': 'u', + '\u01D8': 'u', + '\u01D6': 'u', + '\u01DA': 'u', + '\u1EE7': 'u', + '\u016F': 'u', + '\u0171': 'u', + '\u01D4': 'u', + '\u0215': 'u', + '\u0217': 'u', + '\u01B0': 'u', + '\u1EEB': 'u', + '\u1EE9': 'u', + '\u1EEF': 'u', + '\u1EED': 'u', + '\u1EF1': 'u', + '\u1EE5': 'u', + '\u1E73': 'u', + '\u0173': 'u', + '\u1E77': 'u', + '\u1E75': 'u', + '\u0289': 'u', + '\u24E5': 'v', + '\uFF56': 'v', + '\u1E7D': 'v', + '\u1E7F': 'v', + '\u028B': 'v', + '\uA75F': 'v', + '\u028C': 'v', + '\uA761': 'vy', + '\u24E6': 'w', + '\uFF57': 'w', + '\u1E81': 'w', + '\u1E83': 'w', + '\u0175': 'w', + '\u1E87': 'w', + '\u1E85': 'w', + '\u1E98': 'w', + '\u1E89': 'w', + '\u2C73': 'w', + '\u24E7': 'x', + '\uFF58': 'x', + '\u1E8B': 'x', + '\u1E8D': 'x', + '\u24E8': 'y', + '\uFF59': 'y', + '\u1EF3': 'y', + '\u00FD': 'y', + '\u0177': 'y', + '\u1EF9': 'y', + '\u0233': 'y', + '\u1E8F': 'y', + '\u00FF': 'y', + '\u1EF7': 'y', + '\u1E99': 'y', + '\u1EF5': 'y', + '\u01B4': 'y', + '\u024F': 'y', + '\u1EFF': 'y', + '\u24E9': 'z', + '\uFF5A': 'z', + '\u017A': 'z', + '\u1E91': 'z', + '\u017C': 'z', + '\u017E': 'z', + '\u1E93': 'z', + '\u1E95': 'z', + '\u01B6': 'z', + '\u0225': 'z', + '\u0240': 'z', + '\u2C6C': 'z', + '\uA763': 'z', + '\u0386': '\u0391', + '\u0388': '\u0395', + '\u0389': '\u0397', + '\u038A': '\u0399', + '\u03AA': '\u0399', + '\u038C': '\u039F', + '\u038E': '\u03A5', + '\u03AB': '\u03A5', + '\u038F': '\u03A9', + '\u03AC': '\u03B1', + '\u03AD': '\u03B5', + '\u03AE': '\u03B7', + '\u03AF': '\u03B9', + '\u03CA': '\u03B9', + '\u0390': '\u03B9', + '\u03CC': '\u03BF', + '\u03CD': '\u03C5', + '\u03CB': '\u03C5', + '\u03B0': '\u03C5', + '\u03C9': '\u03C9', + '\u03C2': '\u03C3' + }; + + return diacritics; +}); + +S2.define('select2/data/base',[ + '../utils' +], function (Utils) { + function BaseAdapter ($element, options) { + BaseAdapter.__super__.constructor.call(this); + } + + Utils.Extend(BaseAdapter, Utils.Observable); + + BaseAdapter.prototype.current = function (callback) { + throw new Error('The `current` method must be defined in child classes.'); + }; + + BaseAdapter.prototype.query = function (params, callback) { + throw new Error('The `query` method must be defined in child classes.'); + }; + + BaseAdapter.prototype.bind = function (container, $container) { + // Can be implemented in subclasses + }; + + BaseAdapter.prototype.destroy = function () { + // Can be implemented in subclasses + }; + + BaseAdapter.prototype.generateResultId = function (container, data) { + var id = container.id + '-result-'; + + id += Utils.generateChars(4); + + if (data.id != null) { + id += '-' + data.id.toString(); + } else { + id += '-' + Utils.generateChars(4); + } + return id; + }; + + return BaseAdapter; +}); + +S2.define('select2/data/select',[ + './base', + '../utils', + 'jquery' +], function (BaseAdapter, Utils, $) { + function SelectAdapter ($element, options) { + this.$element = $element; + this.options = options; + + SelectAdapter.__super__.constructor.call(this); + } + + Utils.Extend(SelectAdapter, BaseAdapter); + + SelectAdapter.prototype.current = function (callback) { + var data = []; + var self = this; + + this.$element.find(':selected').each(function () { + var $option = $(this); + + var option = self.item($option); + + data.push(option); + }); + + callback(data); + }; + + SelectAdapter.prototype.select = function (data) { + var self = this; + + data.selected = true; + + // If data.element is a DOM node, use it instead + if ($(data.element).is('option')) { + data.element.selected = true; + + this.$element.trigger('change'); + + return; + } + + if (this.$element.prop('multiple')) { + this.current(function (currentData) { + var val = []; + + data = [data]; + data.push.apply(data, currentData); + + for (var d = 0; d < data.length; d++) { + var id = data[d].id; + + if ($.inArray(id, val) === -1) { + val.push(id); + } + } + + self.$element.val(val); + self.$element.trigger('change'); + }); + } else { + var val = data.id; + + this.$element.val(val); + this.$element.trigger('change'); + } + }; + + SelectAdapter.prototype.unselect = function (data) { + var self = this; + + if (!this.$element.prop('multiple')) { + return; + } + + data.selected = false; + + if ($(data.element).is('option')) { + data.element.selected = false; + + this.$element.trigger('change'); + + return; + } + + this.current(function (currentData) { + var val = []; + + for (var d = 0; d < currentData.length; d++) { + var id = currentData[d].id; + + if (id !== data.id && $.inArray(id, val) === -1) { + val.push(id); + } + } + + self.$element.val(val); + + self.$element.trigger('change'); + }); + }; + + SelectAdapter.prototype.bind = function (container, $container) { + var self = this; + + this.container = container; + + container.on('select', function (params) { + self.select(params.data); + }); + + container.on('unselect', function (params) { + self.unselect(params.data); + }); + }; + + SelectAdapter.prototype.destroy = function () { + // Remove anything added to child elements + this.$element.find('*').each(function () { + // Remove any custom data set by Select2 + $.removeData(this, 'data'); + }); + }; + + SelectAdapter.prototype.query = function (params, callback) { + var data = []; + var self = this; + + var $options = this.$element.children(); + + $options.each(function () { + var $option = $(this); + + if (!$option.is('option') && !$option.is('optgroup')) { + return; + } + + var option = self.item($option); + + var matches = self.matches(params, option); + + if (matches !== null) { + data.push(matches); + } + }); + + callback({ + results: data + }); + }; + + SelectAdapter.prototype.addOptions = function ($options) { + Utils.appendMany(this.$element, $options); + }; + + SelectAdapter.prototype.option = function (data) { + var option; + + if (data.children) { + option = document.createElement('optgroup'); + option.label = data.text; + } else { + option = document.createElement('option'); + + if (option.textContent !== undefined) { + option.textContent = data.text; + } else { + option.innerText = data.text; + } + } + + if (data.id) { + option.value = data.id; + } + + if (data.disabled) { + option.disabled = true; + } + + if (data.selected) { + option.selected = true; + } + + if (data.title) { + option.title = data.title; + } + + var $option = $(option); + + var normalizedData = this._normalizeItem(data); + normalizedData.element = option; + + // Override the option's data with the combined data + $.data(option, 'data', normalizedData); + + return $option; + }; + + SelectAdapter.prototype.item = function ($option) { + var data = {}; + + data = $.data($option[0], 'data'); + + if (data != null) { + return data; + } + + if ($option.is('option')) { + data = { + id: $option.val(), + text: $option.text(), + disabled: $option.prop('disabled'), + selected: $option.prop('selected'), + title: $option.prop('title') + }; + } else if ($option.is('optgroup')) { + data = { + text: $option.prop('label'), + children: [], + title: $option.prop('title') + }; + + var $children = $option.children('option'); + var children = []; + + for (var c = 0; c < $children.length; c++) { + var $child = $($children[c]); + + var child = this.item($child); + + children.push(child); + } + + data.children = children; + } + + data = this._normalizeItem(data); + data.element = $option[0]; + + $.data($option[0], 'data', data); + + return data; + }; + + SelectAdapter.prototype._normalizeItem = function (item) { + if (!$.isPlainObject(item)) { + item = { + id: item, + text: item + }; + } + + item = $.extend({}, { + text: '' + }, item); + + var defaults = { + selected: false, + disabled: false + }; + + if (item.id != null) { + item.id = item.id.toString(); + } + + if (item.text != null) { + item.text = item.text.toString(); + } + + if (item._resultId == null && item.id && this.container != null) { + item._resultId = this.generateResultId(this.container, item); + } + + return $.extend({}, defaults, item); + }; + + SelectAdapter.prototype.matches = function (params, data) { + var matcher = this.options.get('matcher'); + + return matcher(params, data); + }; + + return SelectAdapter; +}); + +S2.define('select2/data/array',[ + './select', + '../utils', + 'jquery' +], function (SelectAdapter, Utils, $) { + function ArrayAdapter ($element, options) { + var data = options.get('data') || []; + + ArrayAdapter.__super__.constructor.call(this, $element, options); + + this.addOptions(this.convertToOptions(data)); + } + + Utils.Extend(ArrayAdapter, SelectAdapter); + + ArrayAdapter.prototype.select = function (data) { + var $option = this.$element.find('option').filter(function (i, elm) { + return elm.value == data.id.toString(); + }); + + if ($option.length === 0) { + $option = this.option(data); + + this.addOptions($option); + } + + ArrayAdapter.__super__.select.call(this, data); + }; + + ArrayAdapter.prototype.convertToOptions = function (data) { + var self = this; + + var $existing = this.$element.find('option'); + var existingIds = $existing.map(function () { + return self.item($(this)).id; + }).get(); + + var $options = []; + + // Filter out all items except for the one passed in the argument + function onlyItem (item) { + return function () { + return $(this).val() == item.id; + }; + } + + for (var d = 0; d < data.length; d++) { + var item = this._normalizeItem(data[d]); + + // Skip items which were pre-loaded, only merge the data + if ($.inArray(item.id, existingIds) >= 0) { + var $existingOption = $existing.filter(onlyItem(item)); + + var existingData = this.item($existingOption); + var newData = $.extend(true, {}, item, existingData); + + var $newOption = this.option(newData); + + $existingOption.replaceWith($newOption); + + continue; + } + + var $option = this.option(item); + + if (item.children) { + var $children = this.convertToOptions(item.children); + + Utils.appendMany($option, $children); + } + + $options.push($option); + } + + return $options; + }; + + return ArrayAdapter; +}); + +S2.define('select2/data/ajax',[ + './array', + '../utils', + 'jquery' +], function (ArrayAdapter, Utils, $) { + function AjaxAdapter ($element, options) { + this.ajaxOptions = this._applyDefaults(options.get('ajax')); + + if (this.ajaxOptions.processResults != null) { + this.processResults = this.ajaxOptions.processResults; + } + + AjaxAdapter.__super__.constructor.call(this, $element, options); + } + + Utils.Extend(AjaxAdapter, ArrayAdapter); + + AjaxAdapter.prototype._applyDefaults = function (options) { + var defaults = { + data: function (params) { + return $.extend({}, params, { + q: params.term + }); + }, + transport: function (params, success, failure) { + var $request = $.ajax(params); + + $request.then(success); + $request.fail(failure); + + return $request; + } + }; + + return $.extend({}, defaults, options, true); + }; + + AjaxAdapter.prototype.processResults = function (results) { + return results; + }; + + AjaxAdapter.prototype.query = function (params, callback) { + var matches = []; + var self = this; + + if (this._request != null) { + // JSONP requests cannot always be aborted + if ($.isFunction(this._request.abort)) { + this._request.abort(); + } + + this._request = null; + } + + var options = $.extend({ + type: 'GET' + }, this.ajaxOptions); + + if (typeof options.url === 'function') { + options.url = options.url.call(this.$element, params); + } + + if (typeof options.data === 'function') { + options.data = options.data.call(this.$element, params); + } + + function request () { + var $request = options.transport(options, function (data) { + var results = self.processResults(data, params); + + if (self.options.get('debug') && window.console && console.error) { + // Check to make sure that the response included a `results` key. + if (!results || !results.results || !$.isArray(results.results)) { + console.error( + 'Select2: The AJAX results did not return an array in the ' + + '`results` key of the response.' + ); + } + } + + callback(results); + }, function () { + // Attempt to detect if a request was aborted + // Only works if the transport exposes a status property + if ($request.status && $request.status === '0') { + return; + } + + self.trigger('results:message', { + message: 'errorLoading' + }); + }); + + self._request = $request; + } + + if (this.ajaxOptions.delay && params.term != null) { + if (this._queryTimeout) { + window.clearTimeout(this._queryTimeout); + } + + this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay); + } else { + request(); + } + }; + + return AjaxAdapter; +}); + +S2.define('select2/data/tags',[ + 'jquery' +], function ($) { + function Tags (decorated, $element, options) { + var tags = options.get('tags'); + + var createTag = options.get('createTag'); + + if (createTag !== undefined) { + this.createTag = createTag; + } + + var insertTag = options.get('insertTag'); + + if (insertTag !== undefined) { + this.insertTag = insertTag; + } + + decorated.call(this, $element, options); + + if ($.isArray(tags)) { + for (var t = 0; t < tags.length; t++) { + var tag = tags[t]; + var item = this._normalizeItem(tag); + + var $option = this.option(item); + + this.$element.append($option); + } + } + } + + Tags.prototype.query = function (decorated, params, callback) { + var self = this; + + this._removeOldTags(); + + if (params.term == null || params.page != null) { + decorated.call(this, params, callback); + return; + } + + function wrapper (obj, child) { + var data = obj.results; + + for (var i = 0; i < data.length; i++) { + var option = data[i]; + + var checkChildren = ( + option.children != null && + !wrapper({ + results: option.children + }, true) + ); + + var checkText = option.text === params.term; + + if (checkText || checkChildren) { + if (child) { + return false; + } + + obj.data = data; + callback(obj); + + return; + } + } + + if (child) { + return true; + } + + var tag = self.createTag(params); + + if (tag != null) { + var $option = self.option(tag); + $option.attr('data-select2-tag', true); + + self.addOptions([$option]); + + self.insertTag(data, tag); + } + + obj.results = data; + + callback(obj); + } + + decorated.call(this, params, wrapper); + }; + + Tags.prototype.createTag = function (decorated, params) { + var term = $.trim(params.term); + + if (term === '') { + return null; + } + + return { + id: term, + text: term + }; + }; + + Tags.prototype.insertTag = function (_, data, tag) { + data.unshift(tag); + }; + + Tags.prototype._removeOldTags = function (_) { + var tag = this._lastTag; + + var $options = this.$element.find('option[data-select2-tag]'); + + $options.each(function () { + if (this.selected) { + return; + } + + $(this).remove(); + }); + }; + + return Tags; +}); + +S2.define('select2/data/tokenizer',[ + 'jquery' +], function ($) { + function Tokenizer (decorated, $element, options) { + var tokenizer = options.get('tokenizer'); + + if (tokenizer !== undefined) { + this.tokenizer = tokenizer; + } + + decorated.call(this, $element, options); + } + + Tokenizer.prototype.bind = function (decorated, container, $container) { + decorated.call(this, container, $container); + + this.$search = container.dropdown.$search || container.selection.$search || + $container.find('.select2-search__field'); + }; + + Tokenizer.prototype.query = function (decorated, params, callback) { + var self = this; + + function createAndSelect (data) { + // Normalize the data object so we can use it for checks + var item = self._normalizeItem(data); + + // Check if the data object already exists as a tag + // Select it if it doesn't + var $existingOptions = self.$element.find('option').filter(function () { + return $(this).val() === item.id; + }); + + // If an existing option wasn't found for it, create the option + if (!$existingOptions.length) { + var $option = self.option(item); + $option.attr('data-select2-tag', true); + + self._removeOldTags(); + self.addOptions([$option]); + } + + // Select the item, now that we know there is an option for it + select(item); + } + + function select (data) { + self.trigger('select', { + data: data + }); + } + + params.term = params.term || ''; + + var tokenData = this.tokenizer(params, this.options, createAndSelect); + + if (tokenData.term !== params.term) { + // Replace the search term if we have the search box + if (this.$search.length) { + this.$search.val(tokenData.term); + this.$search.focus(); + } + + params.term = tokenData.term; + } + + decorated.call(this, params, callback); + }; + + Tokenizer.prototype.tokenizer = function (_, params, options, callback) { + var separators = options.get('tokenSeparators') || []; + var term = params.term; + var i = 0; + + var createTag = this.createTag || function (params) { + return { + id: params.term, + text: params.term + }; + }; + + while (i < term.length) { + var termChar = term[i]; + + if ($.inArray(termChar, separators) === -1) { + i++; + + continue; + } + + var part = term.substr(0, i); + var partParams = $.extend({}, params, { + term: part + }); + + var data = createTag(partParams); + + if (data == null) { + i++; + continue; + } + + callback(data); + + // Reset the term to not include the tokenized portion + term = term.substr(i + 1) || ''; + i = 0; + } + + return { + term: term + }; + }; + + return Tokenizer; +}); + +S2.define('select2/data/minimumInputLength',[ + +], function () { + function MinimumInputLength (decorated, $e, options) { + this.minimumInputLength = options.get('minimumInputLength'); + + decorated.call(this, $e, options); + } + + MinimumInputLength.prototype.query = function (decorated, params, callback) { + params.term = params.term || ''; + + if (params.term.length < this.minimumInputLength) { + this.trigger('results:message', { + message: 'inputTooShort', + args: { + minimum: this.minimumInputLength, + input: params.term, + params: params + } + }); + + return; + } + + decorated.call(this, params, callback); + }; + + return MinimumInputLength; +}); + +S2.define('select2/data/maximumInputLength',[ + +], function () { + function MaximumInputLength (decorated, $e, options) { + this.maximumInputLength = options.get('maximumInputLength'); + + decorated.call(this, $e, options); + } + + MaximumInputLength.prototype.query = function (decorated, params, callback) { + params.term = params.term || ''; + + if (this.maximumInputLength > 0 && + params.term.length > this.maximumInputLength) { + this.trigger('results:message', { + message: 'inputTooLong', + args: { + maximum: this.maximumInputLength, + input: params.term, + params: params + } + }); + + return; + } + + decorated.call(this, params, callback); + }; + + return MaximumInputLength; +}); + +S2.define('select2/data/maximumSelectionLength',[ + +], function (){ + function MaximumSelectionLength (decorated, $e, options) { + this.maximumSelectionLength = options.get('maximumSelectionLength'); + + decorated.call(this, $e, options); + } + + MaximumSelectionLength.prototype.query = + function (decorated, params, callback) { + var self = this; + + this.current(function (currentData) { + var count = currentData != null ? currentData.length : 0; + if (self.maximumSelectionLength > 0 && + count >= self.maximumSelectionLength) { + self.trigger('results:message', { + message: 'maximumSelected', + args: { + maximum: self.maximumSelectionLength + } + }); + return; + } + decorated.call(self, params, callback); + }); + }; + + return MaximumSelectionLength; +}); + +S2.define('select2/dropdown',[ + 'jquery', + './utils' +], function ($, Utils) { + function Dropdown ($element, options) { + this.$element = $element; + this.options = options; + + Dropdown.__super__.constructor.call(this); + } + + Utils.Extend(Dropdown, Utils.Observable); + + Dropdown.prototype.render = function () { + var $dropdown = $( + '' + + '' + + '' + ); + + $dropdown.attr('dir', this.options.get('dir')); + + this.$dropdown = $dropdown; + + return $dropdown; + }; + + Dropdown.prototype.bind = function () { + // Should be implemented in subclasses + }; + + Dropdown.prototype.position = function ($dropdown, $container) { + // Should be implmented in subclasses + }; + + Dropdown.prototype.destroy = function () { + // Remove the dropdown from the DOM + this.$dropdown.remove(); + }; + + return Dropdown; +}); + +S2.define('select2/dropdown/search',[ + 'jquery', + '../utils' +], function ($, Utils) { + function Search () { } + + Search.prototype.render = function (decorated) { + var $rendered = decorated.call(this); + + var $search = $( + '' + + '' + + '' + ); + + this.$searchContainer = $search; + this.$search = $search.find('input'); + + $rendered.prepend($search); + + return $rendered; + }; + + Search.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + this.$search.on('keydown', function (evt) { + self.trigger('keypress', evt); + + self._keyUpPrevented = evt.isDefaultPrevented(); + }); + + // Workaround for browsers which do not support the `input` event + // This will prevent double-triggering of events for browsers which support + // both the `keyup` and `input` events. + this.$search.on('input', function (evt) { + // Unbind the duplicated `keyup` event + $(this).off('keyup'); + }); + + this.$search.on('keyup input', function (evt) { + self.handleSearch(evt); + }); + + container.on('open', function () { + self.$search.attr('tabindex', 0); + + self.$search.focus(); + + window.setTimeout(function () { + self.$search.focus(); + }, 0); + }); + + container.on('close', function () { + self.$search.attr('tabindex', -1); + + self.$search.val(''); + }); + + container.on('focus', function () { + if (container.isOpen()) { + self.$search.focus(); + } + }); + + container.on('results:all', function (params) { + if (params.query.term == null || params.query.term === '') { + var showSearch = self.showSearch(params); + + if (showSearch) { + self.$searchContainer.removeClass('select2-search--hide'); + } else { + self.$searchContainer.addClass('select2-search--hide'); + } + } + }); + }; + + Search.prototype.handleSearch = function (evt) { + if (!this._keyUpPrevented) { + var input = this.$search.val(); + + this.trigger('query', { + term: input + }); + } + + this._keyUpPrevented = false; + }; + + Search.prototype.showSearch = function (_, params) { + return true; + }; + + return Search; +}); + +S2.define('select2/dropdown/hidePlaceholder',[ + +], function () { + function HidePlaceholder (decorated, $element, options, dataAdapter) { + this.placeholder = this.normalizePlaceholder(options.get('placeholder')); + + decorated.call(this, $element, options, dataAdapter); + } + + HidePlaceholder.prototype.append = function (decorated, data) { + data.results = this.removePlaceholder(data.results); + + decorated.call(this, data); + }; + + HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) { + if (typeof placeholder === 'string') { + placeholder = { + id: '', + text: placeholder + }; + } + + return placeholder; + }; + + HidePlaceholder.prototype.removePlaceholder = function (_, data) { + var modifiedData = data.slice(0); + + for (var d = data.length - 1; d >= 0; d--) { + var item = data[d]; + + if (this.placeholder.id === item.id) { + modifiedData.splice(d, 1); + } + } + + return modifiedData; + }; + + return HidePlaceholder; +}); + +S2.define('select2/dropdown/infiniteScroll',[ + 'jquery' +], function ($) { + function InfiniteScroll (decorated, $element, options, dataAdapter) { + this.lastParams = {}; + + decorated.call(this, $element, options, dataAdapter); + + this.$loadingMore = this.createLoadingMore(); + this.loading = false; + } + + InfiniteScroll.prototype.append = function (decorated, data) { + this.$loadingMore.remove(); + this.loading = false; + + decorated.call(this, data); + + if (this.showLoadingMore(data)) { + this.$results.append(this.$loadingMore); + } + }; + + InfiniteScroll.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('query', function (params) { + self.lastParams = params; + self.loading = true; + }); + + container.on('query:append', function (params) { + self.lastParams = params; + self.loading = true; + }); + + this.$results.on('scroll', function () { + var isLoadMoreVisible = $.contains( + document.documentElement, + self.$loadingMore[0] + ); + + if (self.loading || !isLoadMoreVisible) { + return; + } + + var currentOffset = self.$results.offset().top + + self.$results.outerHeight(false); + var loadingMoreOffset = self.$loadingMore.offset().top + + self.$loadingMore.outerHeight(false); + + if (currentOffset + 50 >= loadingMoreOffset) { + self.loadMore(); + } + }); + }; + + InfiniteScroll.prototype.loadMore = function () { + this.loading = true; + + var params = $.extend({}, {page: 1}, this.lastParams); + + params.page++; + + this.trigger('query:append', params); + }; + + InfiniteScroll.prototype.showLoadingMore = function (_, data) { + return data.pagination && data.pagination.more; + }; + + InfiniteScroll.prototype.createLoadingMore = function () { + var $option = $( + '
        • ' + ); + + var message = this.options.get('translations').get('loadingMore'); + + $option.html(message(this.lastParams)); + + return $option; + }; + + return InfiniteScroll; +}); + +S2.define('select2/dropdown/attachBody',[ + 'jquery', + '../utils' +], function ($, Utils) { + function AttachBody (decorated, $element, options) { + this.$dropdownParent = options.get('dropdownParent') || $(document.body); + + decorated.call(this, $element, options); + } + + AttachBody.prototype.bind = function (decorated, container, $container) { + var self = this; + + var setupResultsEvents = false; + + decorated.call(this, container, $container); + + container.on('open', function () { + self._showDropdown(); + self._attachPositioningHandler(container); + + if (!setupResultsEvents) { + setupResultsEvents = true; + + container.on('results:all', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('results:append', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + } + }); + + container.on('close', function () { + self._hideDropdown(); + self._detachPositioningHandler(container); + }); + + this.$dropdownContainer.on('mousedown', function (evt) { + evt.stopPropagation(); + }); + }; + + AttachBody.prototype.destroy = function (decorated) { + decorated.call(this); + + this.$dropdownContainer.remove(); + }; + + AttachBody.prototype.position = function (decorated, $dropdown, $container) { + // Clone all of the container classes + $dropdown.attr('class', $container.attr('class')); + + $dropdown.removeClass('select2'); + $dropdown.addClass('select2-container--open'); + + $dropdown.css({ + position: 'absolute', + top: -999999 + }); + + this.$container = $container; + }; + + AttachBody.prototype.render = function (decorated) { + var $container = $(''); + + var $dropdown = decorated.call(this); + $container.append($dropdown); + + this.$dropdownContainer = $container; + + return $container; + }; + + AttachBody.prototype._hideDropdown = function (decorated) { + this.$dropdownContainer.detach(); + }; + + AttachBody.prototype._attachPositioningHandler = + function (decorated, container) { + var self = this; + + var scrollEvent = 'scroll.select2.' + container.id; + var resizeEvent = 'resize.select2.' + container.id; + var orientationEvent = 'orientationchange.select2.' + container.id; + + var $watchers = this.$container.parents().filter(Utils.hasScroll); + $watchers.each(function () { + $(this).data('select2-scroll-position', { + x: $(this).scrollLeft(), + y: $(this).scrollTop() + }); + }); + + $watchers.on(scrollEvent, function (ev) { + var position = $(this).data('select2-scroll-position'); + $(this).scrollTop(position.y); + }); + + $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent, + function (e) { + self._positionDropdown(); + self._resizeDropdown(); + }); + }; + + AttachBody.prototype._detachPositioningHandler = + function (decorated, container) { + var scrollEvent = 'scroll.select2.' + container.id; + var resizeEvent = 'resize.select2.' + container.id; + var orientationEvent = 'orientationchange.select2.' + container.id; + + var $watchers = this.$container.parents().filter(Utils.hasScroll); + $watchers.off(scrollEvent); + + $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent); + }; + + AttachBody.prototype._positionDropdown = function () { + var $window = $(window); + + var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above'); + var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below'); + + var newDirection = null; + + var offset = this.$container.offset(); + + offset.bottom = offset.top + this.$container.outerHeight(false); + + var container = { + height: this.$container.outerHeight(false) + }; + + container.top = offset.top; + container.bottom = offset.top + container.height; + + var dropdown = { + height: this.$dropdown.outerHeight(false) + }; + + var viewport = { + top: $window.scrollTop(), + bottom: $window.scrollTop() + $window.height() + }; + + var enoughRoomAbove = viewport.top < (offset.top - dropdown.height); + var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height); + + var css = { + left: offset.left, + top: container.bottom + }; + + // Determine what the parent element is to use for calciulating the offset + var $offsetParent = this.$dropdownParent; + + // For statically positoned elements, we need to get the element + // that is determining the offset + if ($offsetParent.css('position') === 'static') { + $offsetParent = $offsetParent.offsetParent(); + } + + var parentOffset = $offsetParent.offset(); + + css.top -= parentOffset.top; + css.left -= parentOffset.left; + + if (!isCurrentlyAbove && !isCurrentlyBelow) { + newDirection = 'below'; + } + + if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) { + newDirection = 'above'; + } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) { + newDirection = 'below'; + } + + if (newDirection == 'above' || + (isCurrentlyAbove && newDirection !== 'below')) { + css.top = container.top - parentOffset.top - dropdown.height; + } + + if (newDirection != null) { + this.$dropdown + .removeClass('select2-dropdown--below select2-dropdown--above') + .addClass('select2-dropdown--' + newDirection); + this.$container + .removeClass('select2-container--below select2-container--above') + .addClass('select2-container--' + newDirection); + } + + this.$dropdownContainer.css(css); + }; + + AttachBody.prototype._resizeDropdown = function () { + var css = { + width: this.$container.outerWidth(false) + 'px' + }; + + if (this.options.get('dropdownAutoWidth')) { + css.minWidth = css.width; + css.position = 'relative'; + css.width = 'auto'; + } + + this.$dropdown.css(css); + }; + + AttachBody.prototype._showDropdown = function (decorated) { + this.$dropdownContainer.appendTo(this.$dropdownParent); + + this._positionDropdown(); + this._resizeDropdown(); + }; + + return AttachBody; +}); + +S2.define('select2/dropdown/minimumResultsForSearch',[ + +], function () { + function countResults (data) { + var count = 0; + + for (var d = 0; d < data.length; d++) { + var item = data[d]; + + if (item.children) { + count += countResults(item.children); + } else { + count++; + } + } + + return count; + } + + function MinimumResultsForSearch (decorated, $element, options, dataAdapter) { + this.minimumResultsForSearch = options.get('minimumResultsForSearch'); + + if (this.minimumResultsForSearch < 0) { + this.minimumResultsForSearch = Infinity; + } + + decorated.call(this, $element, options, dataAdapter); + } + + MinimumResultsForSearch.prototype.showSearch = function (decorated, params) { + if (countResults(params.data.results) < this.minimumResultsForSearch) { + return false; + } + + return decorated.call(this, params); + }; + + return MinimumResultsForSearch; +}); + +S2.define('select2/dropdown/selectOnClose',[ + +], function () { + function SelectOnClose () { } + + SelectOnClose.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('close', function (params) { + self._handleSelectOnClose(params); + }); + }; + + SelectOnClose.prototype._handleSelectOnClose = function (_, params) { + if (params && params.originalSelect2Event != null) { + var event = params.originalSelect2Event; + + // Don't select an item if the close event was triggered from a select or + // unselect event + if (event._type === 'select' || event._type === 'unselect') { + return; + } + } + + var $highlightedResults = this.getHighlightedResults(); + + // Only select highlighted results + if ($highlightedResults.length < 1) { + return; + } + + var data = $highlightedResults.data('data'); + + // Don't re-select already selected resulte + if ( + (data.element != null && data.element.selected) || + (data.element == null && data.selected) + ) { + return; + } + + this.trigger('select', { + data: data + }); + }; + + return SelectOnClose; +}); + +S2.define('select2/dropdown/closeOnSelect',[ + +], function () { + function CloseOnSelect () { } + + CloseOnSelect.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('select', function (evt) { + self._selectTriggered(evt); + }); + + container.on('unselect', function (evt) { + self._selectTriggered(evt); + }); + }; + + CloseOnSelect.prototype._selectTriggered = function (_, evt) { + var originalEvent = evt.originalEvent; + + // Don't close if the control key is being held + if (originalEvent && originalEvent.ctrlKey) { + return; + } + + this.trigger('close', { + originalEvent: originalEvent, + originalSelect2Event: evt + }); + }; + + return CloseOnSelect; +}); + +S2.define('select2/i18n/en',[],function () { + // English + return { + errorLoading: function () { + return 'The results could not be loaded.'; + }, + inputTooLong: function (args) { + var overChars = args.input.length - args.maximum; + + var message = 'Please delete ' + overChars + ' character'; + + if (overChars != 1) { + message += 's'; + } + + return message; + }, + inputTooShort: function (args) { + var remainingChars = args.minimum - args.input.length; + + var message = 'Please enter ' + remainingChars + ' or more characters'; + + return message; + }, + loadingMore: function () { + return 'Loading more results…'; + }, + maximumSelected: function (args) { + var message = 'You can only select ' + args.maximum + ' item'; + + if (args.maximum != 1) { + message += 's'; + } + + return message; + }, + noResults: function () { + return 'No results found'; + }, + searching: function () { + return 'Searching…'; + } + }; +}); + +S2.define('select2/defaults',[ + 'jquery', + 'require', + + './results', + + './selection/single', + './selection/multiple', + './selection/placeholder', + './selection/allowClear', + './selection/search', + './selection/eventRelay', + + './utils', + './translation', + './diacritics', + + './data/select', + './data/array', + './data/ajax', + './data/tags', + './data/tokenizer', + './data/minimumInputLength', + './data/maximumInputLength', + './data/maximumSelectionLength', + + './dropdown', + './dropdown/search', + './dropdown/hidePlaceholder', + './dropdown/infiniteScroll', + './dropdown/attachBody', + './dropdown/minimumResultsForSearch', + './dropdown/selectOnClose', + './dropdown/closeOnSelect', + + './i18n/en' +], function ($, require, + + ResultsList, + + SingleSelection, MultipleSelection, Placeholder, AllowClear, + SelectionSearch, EventRelay, + + Utils, Translation, DIACRITICS, + + SelectData, ArrayData, AjaxData, Tags, Tokenizer, + MinimumInputLength, MaximumInputLength, MaximumSelectionLength, + + Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll, + AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect, + + EnglishTranslation) { + function Defaults () { + this.reset(); + } + + Defaults.prototype.apply = function (options) { + options = $.extend(true, {}, this.defaults, options); + + if (options.dataAdapter == null) { + if (options.ajax != null) { + options.dataAdapter = AjaxData; + } else if (options.data != null) { + options.dataAdapter = ArrayData; + } else { + options.dataAdapter = SelectData; + } + + if (options.minimumInputLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MinimumInputLength + ); + } + + if (options.maximumInputLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MaximumInputLength + ); + } + + if (options.maximumSelectionLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MaximumSelectionLength + ); + } + + if (options.tags) { + options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags); + } + + if (options.tokenSeparators != null || options.tokenizer != null) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + Tokenizer + ); + } + + if (options.query != null) { + var Query = require(options.amdBase + 'compat/query'); + + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + Query + ); + } + + if (options.initSelection != null) { + var InitSelection = require(options.amdBase + 'compat/initSelection'); + + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + InitSelection + ); + } + } + + if (options.resultsAdapter == null) { + options.resultsAdapter = ResultsList; + + if (options.ajax != null) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + InfiniteScroll + ); + } + + if (options.placeholder != null) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + HidePlaceholder + ); + } + + if (options.selectOnClose) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + SelectOnClose + ); + } + } + + if (options.dropdownAdapter == null) { + if (options.multiple) { + options.dropdownAdapter = Dropdown; + } else { + var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch); + + options.dropdownAdapter = SearchableDropdown; + } + + if (options.minimumResultsForSearch !== 0) { + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + MinimumResultsForSearch + ); + } + + if (options.closeOnSelect) { + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + CloseOnSelect + ); + } + + if ( + options.dropdownCssClass != null || + options.dropdownCss != null || + options.adaptDropdownCssClass != null + ) { + var DropdownCSS = require(options.amdBase + 'compat/dropdownCss'); + + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + DropdownCSS + ); + } + + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + AttachBody + ); + } + + if (options.selectionAdapter == null) { + if (options.multiple) { + options.selectionAdapter = MultipleSelection; + } else { + options.selectionAdapter = SingleSelection; + } + + // Add the placeholder mixin if a placeholder was specified + if (options.placeholder != null) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + Placeholder + ); + } + + if (options.allowClear) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + AllowClear + ); + } + + if (options.multiple) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + SelectionSearch + ); + } + + if ( + options.containerCssClass != null || + options.containerCss != null || + options.adaptContainerCssClass != null + ) { + var ContainerCSS = require(options.amdBase + 'compat/containerCss'); + + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + ContainerCSS + ); + } + + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + EventRelay + ); + } + + if (typeof options.language === 'string') { + // Check if the language is specified with a region + if (options.language.indexOf('-') > 0) { + // Extract the region information if it is included + var languageParts = options.language.split('-'); + var baseLanguage = languageParts[0]; + + options.language = [options.language, baseLanguage]; + } else { + options.language = [options.language]; + } + } + + if ($.isArray(options.language)) { + var languages = new Translation(); + options.language.push('en'); + + var languageNames = options.language; + + for (var l = 0; l < languageNames.length; l++) { + var name = languageNames[l]; + var language = {}; + + try { + // Try to load it with the original name + language = Translation.loadPath(name); + } catch (e) { + try { + // If we couldn't load it, check if it wasn't the full path + name = this.defaults.amdLanguageBase + name; + language = Translation.loadPath(name); + } catch (ex) { + // The translation could not be loaded at all. Sometimes this is + // because of a configuration problem, other times this can be + // because of how Select2 helps load all possible translation files. + if (options.debug && window.console && console.warn) { + console.warn( + 'Select2: The language file for "' + name + '" could not be ' + + 'automatically loaded. A fallback will be used instead.' + ); + } + + continue; + } + } + + languages.extend(language); + } + + options.translations = languages; + } else { + var baseTranslation = Translation.loadPath( + this.defaults.amdLanguageBase + 'en' + ); + var customTranslation = new Translation(options.language); + + customTranslation.extend(baseTranslation); + + options.translations = customTranslation; + } + + return options; + }; + + Defaults.prototype.reset = function () { + function stripDiacritics (text) { + // Used 'uni range + named function' from http://jsperf.com/diacritics/18 + function match(a) { + return DIACRITICS[a] || a; + } + + return text.replace(/[^\u0000-\u007E]/g, match); + } + + function matcher (params, data) { + // Always return the object if there is nothing to compare + if ($.trim(params.term) === '') { + return data; + } + + // Do a recursive check for options with children + if (data.children && data.children.length > 0) { + // Clone the data object if there are children + // This is required as we modify the object to remove any non-matches + var match = $.extend(true, {}, data); + + // Check each child of the option + for (var c = data.children.length - 1; c >= 0; c--) { + var child = data.children[c]; + + var matches = matcher(params, child); + + // If there wasn't a match, remove the object in the array + if (matches == null) { + match.children.splice(c, 1); + } + } + + // If any children matched, return the new object + if (match.children.length > 0) { + return match; + } + + // If there were no matching children, check just the plain object + return matcher(params, match); + } + + var original = stripDiacritics(data.text).toUpperCase(); + var term = stripDiacritics(params.term).toUpperCase(); + + // Check if the text contains the term + if (original.indexOf(term) > -1) { + return data; + } + + // If it doesn't contain the term, don't return anything + return null; + } + + this.defaults = { + amdBase: './', + amdLanguageBase: './i18n/', + closeOnSelect: true, + debug: false, + dropdownAutoWidth: false, + escapeMarkup: Utils.escapeMarkup, + language: EnglishTranslation, + matcher: matcher, + minimumInputLength: 0, + maximumInputLength: 0, + maximumSelectionLength: 0, + minimumResultsForSearch: 0, + selectOnClose: false, + sorter: function (data) { + return data; + }, + templateResult: function (result) { + return result.text; + }, + templateSelection: function (selection) { + return selection.text; + }, + theme: 'default', + width: 'resolve' + }; + }; + + Defaults.prototype.set = function (key, value) { + var camelKey = $.camelCase(key); + + var data = {}; + data[camelKey] = value; + + var convertedData = Utils._convertData(data); + + $.extend(this.defaults, convertedData); + }; + + var defaults = new Defaults(); + + return defaults; +}); + +S2.define('select2/options',[ + 'require', + 'jquery', + './defaults', + './utils' +], function (require, $, Defaults, Utils) { + function Options (options, $element) { + this.options = options; + + if ($element != null) { + this.fromElement($element); + } + + this.options = Defaults.apply(this.options); + + if ($element && $element.is('input')) { + var InputCompat = require(this.get('amdBase') + 'compat/inputData'); + + this.options.dataAdapter = Utils.Decorate( + this.options.dataAdapter, + InputCompat + ); + } + } + + Options.prototype.fromElement = function ($e) { + var excludedData = ['select2']; + + if (this.options.multiple == null) { + this.options.multiple = $e.prop('multiple'); + } + + if (this.options.disabled == null) { + this.options.disabled = $e.prop('disabled'); + } + + if (this.options.language == null) { + if ($e.prop('lang')) { + this.options.language = $e.prop('lang').toLowerCase(); + } else if ($e.closest('[lang]').prop('lang')) { + this.options.language = $e.closest('[lang]').prop('lang'); + } + } + + if (this.options.dir == null) { + if ($e.prop('dir')) { + this.options.dir = $e.prop('dir'); + } else if ($e.closest('[dir]').prop('dir')) { + this.options.dir = $e.closest('[dir]').prop('dir'); + } else { + this.options.dir = 'ltr'; + } + } + + $e.prop('disabled', this.options.disabled); + $e.prop('multiple', this.options.multiple); + + if ($e.data('select2Tags')) { + if (this.options.debug && window.console && console.warn) { + console.warn( + 'Select2: The `data-select2-tags` attribute has been changed to ' + + 'use the `data-data` and `data-tags="true"` attributes and will be ' + + 'removed in future versions of Select2.' + ); + } + + $e.data('data', $e.data('select2Tags')); + $e.data('tags', true); + } + + if ($e.data('ajaxUrl')) { + if (this.options.debug && window.console && console.warn) { + console.warn( + 'Select2: The `data-ajax-url` attribute has been changed to ' + + '`data-ajax--url` and support for the old attribute will be removed' + + ' in future versions of Select2.' + ); + } + + $e.attr('ajax--url', $e.data('ajaxUrl')); + $e.data('ajax--url', $e.data('ajaxUrl')); + } + + var dataset = {}; + + // Prefer the element's `dataset` attribute if it exists + // jQuery 1.x does not correctly handle data attributes with multiple dashes + if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { + dataset = $.extend(true, {}, $e[0].dataset, $e.data()); + } else { + dataset = $e.data(); + } + + var data = $.extend(true, {}, dataset); + + data = Utils._convertData(data); + + for (var key in data) { + if ($.inArray(key, excludedData) > -1) { + continue; + } + + if ($.isPlainObject(this.options[key])) { + $.extend(this.options[key], data[key]); + } else { + this.options[key] = data[key]; + } + } + + return this; + }; + + Options.prototype.get = function (key) { + return this.options[key]; + }; + + Options.prototype.set = function (key, val) { + this.options[key] = val; + }; + + return Options; +}); + +S2.define('select2/core',[ + 'jquery', + './options', + './utils', + './keys' +], function ($, Options, Utils, KEYS) { + var Select2 = function ($element, options) { + if ($element.data('select2') != null) { + $element.data('select2').destroy(); + } + + this.$element = $element; + + this.id = this._generateId($element); + + options = options || {}; + + this.options = new Options(options, $element); + + Select2.__super__.constructor.call(this); + + // Set up the tabindex + + var tabindex = $element.attr('tabindex') || 0; + $element.data('old-tabindex', tabindex); + $element.attr('tabindex', '-1'); + + // Set up containers and adapters + + var DataAdapter = this.options.get('dataAdapter'); + this.dataAdapter = new DataAdapter($element, this.options); + + var $container = this.render(); + + this._placeContainer($container); + + var SelectionAdapter = this.options.get('selectionAdapter'); + this.selection = new SelectionAdapter($element, this.options); + this.$selection = this.selection.render(); + + this.selection.position(this.$selection, $container); + + var DropdownAdapter = this.options.get('dropdownAdapter'); + this.dropdown = new DropdownAdapter($element, this.options); + this.$dropdown = this.dropdown.render(); + + this.dropdown.position(this.$dropdown, $container); + + var ResultsAdapter = this.options.get('resultsAdapter'); + this.results = new ResultsAdapter($element, this.options, this.dataAdapter); + this.$results = this.results.render(); + + this.results.position(this.$results, this.$dropdown); + + // Bind events + + var self = this; + + // Bind the container to all of the adapters + this._bindAdapters(); + + // Register any DOM event handlers + this._registerDomEvents(); + + // Register any internal event handlers + this._registerDataEvents(); + this._registerSelectionEvents(); + this._registerDropdownEvents(); + this._registerResultsEvents(); + this._registerEvents(); + + // Set the initial state + this.dataAdapter.current(function (initialData) { + self.trigger('selection:update', { + data: initialData + }); + }); + + // Hide the original select + $element.addClass('select2-hidden-accessible'); + $element.attr('aria-hidden', 'true'); + + // Synchronize any monitored attributes + this._syncAttributes(); + + $element.data('select2', this); + }; + + Utils.Extend(Select2, Utils.Observable); + + Select2.prototype._generateId = function ($element) { + var id = ''; + + if ($element.attr('id') != null) { + id = $element.attr('id'); + } else if ($element.attr('name') != null) { + id = $element.attr('name') + '-' + Utils.generateChars(2); + } else { + id = Utils.generateChars(4); + } + + id = id.replace(/(:|\.|\[|\]|,)/g, ''); + id = 'select2-' + id; + + return id; + }; + + Select2.prototype._placeContainer = function ($container) { + $container.insertAfter(this.$element); + + var width = this._resolveWidth(this.$element, this.options.get('width')); + + if (width != null) { + $container.css('width', width); + } + }; + + Select2.prototype._resolveWidth = function ($element, method) { + var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i; + + if (method == 'resolve') { + var styleWidth = this._resolveWidth($element, 'style'); + + if (styleWidth != null) { + return styleWidth; + } + + return this._resolveWidth($element, 'element'); + } + + if (method == 'element') { + var elementWidth = $element.outerWidth(false); + + if (elementWidth <= 0) { + return 'auto'; + } + + return elementWidth + 'px'; + } + + if (method == 'style') { + var style = $element.attr('style'); + + if (typeof(style) !== 'string') { + return null; + } + + var attrs = style.split(';'); + + for (var i = 0, l = attrs.length; i < l; i = i + 1) { + var attr = attrs[i].replace(/\s/g, ''); + var matches = attr.match(WIDTH); + + if (matches !== null && matches.length >= 1) { + return matches[1]; + } + } + + return null; + } + + return method; + }; + + Select2.prototype._bindAdapters = function () { + this.dataAdapter.bind(this, this.$container); + this.selection.bind(this, this.$container); + + this.dropdown.bind(this, this.$container); + this.results.bind(this, this.$container); + }; + + Select2.prototype._registerDomEvents = function () { + var self = this; + + this.$element.on('change.select2', function () { + self.dataAdapter.current(function (data) { + self.trigger('selection:update', { + data: data + }); + }); + }); + + this.$element.on('focus.select2', function (evt) { + self.trigger('focus', evt); + }); + + this._syncA = Utils.bind(this._syncAttributes, this); + this._syncS = Utils.bind(this._syncSubtree, this); + + if (this.$element[0].attachEvent) { + this.$element[0].attachEvent('onpropertychange', this._syncA); + } + + var observer = window.MutationObserver || + window.WebKitMutationObserver || + window.MozMutationObserver + ; + + if (observer != null) { + this._observer = new observer(function (mutations) { + $.each(mutations, self._syncA); + $.each(mutations, self._syncS); + }); + this._observer.observe(this.$element[0], { + attributes: true, + childList: true, + subtree: false + }); + } else if (this.$element[0].addEventListener) { + this.$element[0].addEventListener( + 'DOMAttrModified', + self._syncA, + false + ); + this.$element[0].addEventListener( + 'DOMNodeInserted', + self._syncS, + false + ); + this.$element[0].addEventListener( + 'DOMNodeRemoved', + self._syncS, + false + ); + } + }; + + Select2.prototype._registerDataEvents = function () { + var self = this; + + this.dataAdapter.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerSelectionEvents = function () { + var self = this; + var nonRelayEvents = ['toggle', 'focus']; + + this.selection.on('toggle', function () { + self.toggleDropdown(); + }); + + this.selection.on('focus', function (params) { + self.focus(params); + }); + + this.selection.on('*', function (name, params) { + if ($.inArray(name, nonRelayEvents) !== -1) { + return; + } + + self.trigger(name, params); + }); + }; + + Select2.prototype._registerDropdownEvents = function () { + var self = this; + + this.dropdown.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerResultsEvents = function () { + var self = this; + + this.results.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerEvents = function () { + var self = this; + + this.on('open', function () { + self.$container.addClass('select2-container--open'); + }); + + this.on('close', function () { + self.$container.removeClass('select2-container--open'); + }); + + this.on('enable', function () { + self.$container.removeClass('select2-container--disabled'); + }); + + this.on('disable', function () { + self.$container.addClass('select2-container--disabled'); + }); + + this.on('blur', function () { + self.$container.removeClass('select2-container--focus'); + }); + + this.on('query', function (params) { + if (!self.isOpen()) { + self.trigger('open', {}); + } + + this.dataAdapter.query(params, function (data) { + self.trigger('results:all', { + data: data, + query: params + }); + }); + }); + + this.on('query:append', function (params) { + this.dataAdapter.query(params, function (data) { + self.trigger('results:append', { + data: data, + query: params + }); + }); + }); + + this.on('keypress', function (evt) { + var key = evt.which; + + if (self.isOpen()) { + if (key === KEYS.ESC || key === KEYS.TAB || + (key === KEYS.UP && evt.altKey)) { + self.close(); + + evt.preventDefault(); + } else if (key === KEYS.ENTER) { + self.trigger('results:select', {}); + + evt.preventDefault(); + } else if ((key === KEYS.SPACE && evt.ctrlKey)) { + self.trigger('results:toggle', {}); + + evt.preventDefault(); + } else if (key === KEYS.UP) { + self.trigger('results:previous', {}); + + evt.preventDefault(); + } else if (key === KEYS.DOWN) { + self.trigger('results:next', {}); + + evt.preventDefault(); + } + } else { + if (key === KEYS.ENTER || key === KEYS.SPACE || + (key === KEYS.DOWN && evt.altKey)) { + self.open(); + + evt.preventDefault(); + } + } + }); + }; + + Select2.prototype._syncAttributes = function () { + this.options.set('disabled', this.$element.prop('disabled')); + + if (this.options.get('disabled')) { + if (this.isOpen()) { + this.close(); + } + + this.trigger('disable', {}); + } else { + this.trigger('enable', {}); + } + }; + + Select2.prototype._syncSubtree = function (evt, mutations) { + var changed = false; + var self = this; + + // Ignore any mutation events raised for elements that aren't options or + // optgroups. This handles the case when the select element is destroyed + if ( + evt && evt.target && ( + evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP' + ) + ) { + return; + } + + if (!mutations) { + // If mutation events aren't supported, then we can only assume that the + // change affected the selections + changed = true; + } else if (mutations.addedNodes && mutations.addedNodes.length > 0) { + for (var n = 0; n < mutations.addedNodes.length; n++) { + var node = mutations.addedNodes[n]; + + if (node.selected) { + changed = true; + } + } + } else if (mutations.removedNodes && mutations.removedNodes.length > 0) { + changed = true; + } + + // Only re-pull the data if we think there is a change + if (changed) { + this.dataAdapter.current(function (currentData) { + self.trigger('selection:update', { + data: currentData + }); + }); + } + }; + + /** + * Override the trigger method to automatically trigger pre-events when + * there are events that can be prevented. + */ + Select2.prototype.trigger = function (name, args) { + var actualTrigger = Select2.__super__.trigger; + var preTriggerMap = { + 'open': 'opening', + 'close': 'closing', + 'select': 'selecting', + 'unselect': 'unselecting' + }; + + if (args === undefined) { + args = {}; + } + + if (name in preTriggerMap) { + var preTriggerName = preTriggerMap[name]; + var preTriggerArgs = { + prevented: false, + name: name, + args: args + }; + + actualTrigger.call(this, preTriggerName, preTriggerArgs); + + if (preTriggerArgs.prevented) { + args.prevented = true; + + return; + } + } + + actualTrigger.call(this, name, args); + }; + + Select2.prototype.toggleDropdown = function () { + if (this.options.get('disabled')) { + return; + } + + if (this.isOpen()) { + this.close(); + } else { + this.open(); + } + }; + + Select2.prototype.open = function () { + if (this.isOpen()) { + return; + } + + this.trigger('query', {}); + }; + + Select2.prototype.close = function () { + if (!this.isOpen()) { + return; + } + + this.trigger('close', {}); + }; + + Select2.prototype.isOpen = function () { + return this.$container.hasClass('select2-container--open'); + }; + + Select2.prototype.hasFocus = function () { + return this.$container.hasClass('select2-container--focus'); + }; + + Select2.prototype.focus = function (data) { + // No need to re-trigger focus events if we are already focused + if (this.hasFocus()) { + return; + } + + this.$container.addClass('select2-container--focus'); + this.trigger('focus', {}); + }; + + Select2.prototype.enable = function (args) { + if (this.options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `select2("enable")` method has been deprecated and will' + + ' be removed in later Select2 versions. Use $element.prop("disabled")' + + ' instead.' + ); + } + + if (args == null || args.length === 0) { + args = [true]; + } + + var disabled = !args[0]; + + this.$element.prop('disabled', disabled); + }; + + Select2.prototype.data = function () { + if (this.options.get('debug') && + arguments.length > 0 && window.console && console.warn) { + console.warn( + 'Select2: Data can no longer be set using `select2("data")`. You ' + + 'should consider setting the value instead using `$element.val()`.' + ); + } + + var data = []; + + this.dataAdapter.current(function (currentData) { + data = currentData; + }); + + return data; + }; + + Select2.prototype.val = function (args) { + if (this.options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `select2("val")` method has been deprecated and will be' + + ' removed in later Select2 versions. Use $element.val() instead.' + ); + } + + if (args == null || args.length === 0) { + return this.$element.val(); + } + + var newVal = args[0]; + + if ($.isArray(newVal)) { + newVal = $.map(newVal, function (obj) { + return obj.toString(); + }); + } + + this.$element.val(newVal).trigger('change'); + }; + + Select2.prototype.destroy = function () { + this.$container.remove(); + + if (this.$element[0].detachEvent) { + this.$element[0].detachEvent('onpropertychange', this._syncA); + } + + if (this._observer != null) { + this._observer.disconnect(); + this._observer = null; + } else if (this.$element[0].removeEventListener) { + this.$element[0] + .removeEventListener('DOMAttrModified', this._syncA, false); + this.$element[0] + .removeEventListener('DOMNodeInserted', this._syncS, false); + this.$element[0] + .removeEventListener('DOMNodeRemoved', this._syncS, false); + } + + this._syncA = null; + this._syncS = null; + + this.$element.off('.select2'); + this.$element.attr('tabindex', this.$element.data('old-tabindex')); + + this.$element.removeClass('select2-hidden-accessible'); + this.$element.attr('aria-hidden', 'false'); + this.$element.removeData('select2'); + + this.dataAdapter.destroy(); + this.selection.destroy(); + this.dropdown.destroy(); + this.results.destroy(); + + this.dataAdapter = null; + this.selection = null; + this.dropdown = null; + this.results = null; + }; + + Select2.prototype.render = function () { + var $container = $( + '' + + '' + + '' + + '' + ); + + $container.attr('dir', this.options.get('dir')); + + this.$container = $container; + + this.$container.addClass('select2-container--' + this.options.get('theme')); + + $container.data('element', this.$element); + + return $container; + }; + + return Select2; +}); + +S2.define('select2/compat/utils',[ + 'jquery' +], function ($) { + function syncCssClasses ($dest, $src, adapter) { + var classes, replacements = [], adapted; + + classes = $.trim($dest.attr('class')); + + if (classes) { + classes = '' + classes; // for IE which returns object + + $(classes.split(/\s+/)).each(function () { + // Save all Select2 classes + if (this.indexOf('select2-') === 0) { + replacements.push(this); + } + }); + } + + classes = $.trim($src.attr('class')); + + if (classes) { + classes = '' + classes; // for IE which returns object + + $(classes.split(/\s+/)).each(function () { + // Only adapt non-Select2 classes + if (this.indexOf('select2-') !== 0) { + adapted = adapter(this); + + if (adapted != null) { + replacements.push(adapted); + } + } + }); + } + + $dest.attr('class', replacements.join(' ')); + } + + return { + syncCssClasses: syncCssClasses + }; +}); + +S2.define('select2/compat/containerCss',[ + 'jquery', + './utils' +], function ($, CompatUtils) { + // No-op CSS adapter that discards all classes by default + function _containerAdapter (clazz) { + return null; + } + + function ContainerCSS () { } + + ContainerCSS.prototype.render = function (decorated) { + var $container = decorated.call(this); + + var containerCssClass = this.options.get('containerCssClass') || ''; + + if ($.isFunction(containerCssClass)) { + containerCssClass = containerCssClass(this.$element); + } + + var containerCssAdapter = this.options.get('adaptContainerCssClass'); + containerCssAdapter = containerCssAdapter || _containerAdapter; + + if (containerCssClass.indexOf(':all:') !== -1) { + containerCssClass = containerCssClass.replace(':all:', ''); + + var _cssAdapter = containerCssAdapter; + + containerCssAdapter = function (clazz) { + var adapted = _cssAdapter(clazz); + + if (adapted != null) { + // Append the old one along with the adapted one + return adapted + ' ' + clazz; + } + + return clazz; + }; + } + + var containerCss = this.options.get('containerCss') || {}; + + if ($.isFunction(containerCss)) { + containerCss = containerCss(this.$element); + } + + CompatUtils.syncCssClasses($container, this.$element, containerCssAdapter); + + $container.css(containerCss); + $container.addClass(containerCssClass); + + return $container; + }; + + return ContainerCSS; +}); + +S2.define('select2/compat/dropdownCss',[ + 'jquery', + './utils' +], function ($, CompatUtils) { + // No-op CSS adapter that discards all classes by default + function _dropdownAdapter (clazz) { + return null; + } + + function DropdownCSS () { } + + DropdownCSS.prototype.render = function (decorated) { + var $dropdown = decorated.call(this); + + var dropdownCssClass = this.options.get('dropdownCssClass') || ''; + + if ($.isFunction(dropdownCssClass)) { + dropdownCssClass = dropdownCssClass(this.$element); + } + + var dropdownCssAdapter = this.options.get('adaptDropdownCssClass'); + dropdownCssAdapter = dropdownCssAdapter || _dropdownAdapter; + + if (dropdownCssClass.indexOf(':all:') !== -1) { + dropdownCssClass = dropdownCssClass.replace(':all:', ''); + + var _cssAdapter = dropdownCssAdapter; + + dropdownCssAdapter = function (clazz) { + var adapted = _cssAdapter(clazz); + + if (adapted != null) { + // Append the old one along with the adapted one + return adapted + ' ' + clazz; + } + + return clazz; + }; + } + + var dropdownCss = this.options.get('dropdownCss') || {}; + + if ($.isFunction(dropdownCss)) { + dropdownCss = dropdownCss(this.$element); + } + + CompatUtils.syncCssClasses($dropdown, this.$element, dropdownCssAdapter); + + $dropdown.css(dropdownCss); + $dropdown.addClass(dropdownCssClass); + + return $dropdown; + }; + + return DropdownCSS; +}); + +S2.define('select2/compat/initSelection',[ + 'jquery' +], function ($) { + function InitSelection (decorated, $element, options) { + if (options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `initSelection` option has been deprecated in favor' + + ' of a custom data adapter that overrides the `current` method. ' + + 'This method is now called multiple times instead of a single ' + + 'time when the instance is initialized. Support will be removed ' + + 'for the `initSelection` option in future versions of Select2' + ); + } + + this.initSelection = options.get('initSelection'); + this._isInitialized = false; + + decorated.call(this, $element, options); + } + + InitSelection.prototype.current = function (decorated, callback) { + var self = this; + + if (this._isInitialized) { + decorated.call(this, callback); + + return; + } + + this.initSelection.call(null, this.$element, function (data) { + self._isInitialized = true; + + if (!$.isArray(data)) { + data = [data]; + } + + callback(data); + }); + }; + + return InitSelection; +}); + +S2.define('select2/compat/inputData',[ + 'jquery' +], function ($) { + function InputData (decorated, $element, options) { + this._currentData = []; + this._valueSeparator = options.get('valueSeparator') || ','; + + if ($element.prop('type') === 'hidden') { + if (options.get('debug') && console && console.warn) { + console.warn( + 'Select2: Using a hidden input with Select2 is no longer ' + + 'supported and may stop working in the future. It is recommended ' + + 'to use a `');this.$searchContainer=c,this.$search=c.find("input");var d=b.call(this);return this._transferTabIndex(),d},d.prototype.bind=function(a,b,d){var e=this;a.call(this,b,d),b.on("open",function(){e.$search.trigger("focus")}),b.on("close",function(){e.$search.val(""),e.$search.removeAttr("aria-activedescendant"),e.$search.trigger("focus")}),b.on("enable",function(){e.$search.prop("disabled",!1),e._transferTabIndex()}),b.on("disable",function(){e.$search.prop("disabled",!0)}),b.on("focus",function(a){e.$search.trigger("focus")}),b.on("results:focus",function(a){e.$search.attr("aria-activedescendant",a.id)}),this.$selection.on("focusin",".select2-search--inline",function(a){e.trigger("focus",a)}),this.$selection.on("focusout",".select2-search--inline",function(a){e._handleBlur(a)}),this.$selection.on("keydown",".select2-search--inline",function(a){a.stopPropagation(),e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented();var b=a.which;if(b===c.BACKSPACE&&""===e.$search.val()){var d=e.$searchContainer.prev(".select2-selection__choice");if(d.length>0){var f=d.data("data");e.searchRemoveChoice(f),a.preventDefault()}}});var f=document.documentMode,g=f&&11>=f;this.$selection.on("input.searchcheck",".select2-search--inline",function(a){return g?void e.$selection.off("input.search input.searchcheck"):void e.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(a){if(g&&"input"===a.type)return void e.$selection.off("input.search input.searchcheck");var b=a.which;b!=c.SHIFT&&b!=c.CTRL&&b!=c.ALT&&b!=c.TAB&&e.handleSearch(a)})},d.prototype._transferTabIndex=function(a){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},d.prototype.createPlaceholder=function(a,b){this.$search.attr("placeholder",b.text)},d.prototype.update=function(a,b){var c=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),a.call(this,b),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),c&&this.$search.focus()},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger("unselect",{data:b}),this.$search.val(b.text),this.handleSearch()},d.prototype.resizeSearch=function(){this.$search.css("width","25px");var a="";if(""!==this.$search.attr("placeholder"))a=this.$selection.find(".select2-selection__rendered").innerWidth();else{var b=this.$search.val().length+1;a=.75*b+"em"}this.$search.css("width",a)},d}),b.define("select2/selection/eventRelay",["jquery"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=["open","opening","close","closing","select","selecting","unselect","unselecting"],g=["opening","closing","selecting","unselecting"];b.call(this,c,d),c.on("*",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event("select2:"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define("select2/translation",["jquery","require"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define("select2/diacritics",[],function(){var a={"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"};return a}),b.define("select2/data/base",["../utils"],function(a){function b(a,c){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(a){throw new Error("The `current` method must be defined in child classes.")},b.prototype.query=function(a,b){throw new Error("The `query` method must be defined in child classes.")},b.prototype.bind=function(a,b){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d=b.id+"-result-";return d+=a.generateChars(4),d+=null!=c.id?"-"+c.id.toString():"-"+a.generateChars(4)},b}),b.define("select2/data/select",["./base","../utils","jquery"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(":selected").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is("option"))return a.element.selected=!0,void this.$element.trigger("change"); +if(this.$element.prop("multiple"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f=0){var k=f.filter(d(j)),l=this.item(k),m=c.extend(!0,{},j,l),n=this.option(m);k.replaceWith(n)}else{var o=this.option(j);if(j.children){var p=this.convertToOptions(j.children);b.appendMany(o,p)}h.push(o)}}return h},d}),b.define("select2/data/ajax",["./array","../utils","jquery"],function(a,b,c){function d(a,b){this.ajaxOptions=this._applyDefaults(b.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),d.__super__.constructor.call(this,a,b)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return c.extend({},a,{q:a.term})},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get("debug")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),b(f)},function(){d.status&&"0"===d.status||e.trigger("results:message",{message:"errorLoading"})});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:"GET"},this.ajaxOptions);"function"==typeof f.url&&(f.url=f.url.call(this.$element,a)),"function"==typeof f.data&&(f.data=f.data.call(this.$element,a)),this.ajaxOptions.delay&&null!=a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define("select2/data/tags",["jquery"],function(a){function b(b,c,d){var e=d.get("tags"),f=d.get("createTag");void 0!==f&&(this.createTag=f);var g=d.get("insertTag");if(void 0!==g&&(this.insertTag=g),b.call(this,c,d),a.isArray(e))for(var h=0;h0&&b.term.length>this.maximumInputLength?void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumSelectionLength",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get("maximumSelectionLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;return d.maximumSelectionLength>0&&f>=d.maximumSelectionLength?void d.trigger("results:message",{message:"maximumSelected",args:{maximum:d.maximumSelectionLength}}):void a.call(d,b,c)})},a}),b.define("select2/dropdown",["jquery","./utils"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('');return b.attr("dir",this.options.get("dir")),this.$dropdown=b,b},c.prototype.bind=function(){},c.prototype.position=function(a,b){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define("select2/dropdown/search",["jquery","../utils"],function(a,b){function c(){}return c.prototype.render=function(b){var c=b.call(this),d=a('');return this.$searchContainer=d,this.$search=d.find("input"),c.prepend(d),c},c.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),this.$search.on("keydown",function(a){e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on("input",function(b){a(this).off("keyup")}),this.$search.on("keyup input",function(a){e.handleSearch(a)}),c.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val("")}),c.on("focus",function(){c.isOpen()&&e.$search.focus()}),c.on("results:all",function(a){if(null==a.query.term||""===a.query.term){var b=e.showSearch(a);b?e.$searchContainer.removeClass("select2-search--hide"):e.$searchContainer.addClass("select2-search--hide")}})},c.prototype.handleSearch=function(a){if(!this._keyUpPrevented){var b=this.$search.val();this.trigger("query",{term:b})}this._keyUpPrevented=!1},c.prototype.showSearch=function(a,b){return!0},c}),b.define("select2/dropdown/hidePlaceholder",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define("select2/dropdown/infiniteScroll",["jquery"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on("query",function(a){e.lastParams=a,e.loading=!0}),c.on("query:append",function(a){e.lastParams=a,e.loading=!0}),this.$results.on("scroll",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){var c=e.$results.offset().top+e.$results.outerHeight(!1),d=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1);c+50>=d&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger("query:append",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a('
        • '),c=this.options.get("translations").get("loadingMore");return b.html(c(this.lastParams)),b},b}),b.define("select2/dropdown/attachBody",["jquery","../utils"],function(a,b){function c(b,c,d){this.$dropdownParent=d.get("dropdownParent")||a(document.body),b.call(this,c,d)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on("open",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on("results:all",function(){d._positionDropdown(),d._resizeDropdown()}),b.on("results:append",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on("close",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on("mousedown",function(a){a.stopPropagation()})},c.prototype.destroy=function(a){a.call(this),this.$dropdownContainer.remove()},c.prototype.position=function(a,b,c){b.attr("class",c.attr("class")),b.removeClass("select2"),b.addClass("select2-container--open"),b.css({position:"absolute",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a(""),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(a){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c,d){var e=this,f="scroll.select2."+d.id,g="resize.select2."+d.id,h="orientationchange.select2."+d.id,i=this.$container.parents().filter(b.hasScroll);i.each(function(){a(this).data("select2-scroll-position",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),i.on(f,function(b){var c=a(this).data("select2-scroll-position");a(this).scrollTop(c.y)}),a(window).on(f+" "+g+" "+h,function(a){e._positionDropdown(),e._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c,d){var e="scroll.select2."+d.id,f="resize.select2."+d.id,g="orientationchange.select2."+d.id,h=this.$container.parents().filter(b.hasScroll);h.off(e),a(window).off(e+" "+f+" "+g)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass("select2-dropdown--above"),d=this.$dropdown.hasClass("select2-dropdown--below"),e=null,f=this.$container.offset();f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.topf.bottom+h.height,l={left:f.left,top:g.bottom},m=this.$dropdownParent;"static"===m.css("position")&&(m=m.offsetParent());var n=m.offset();l.top-=n.top,l.left-=n.left,c||d||(e="below"),k||!j||c?!j&&k&&c&&(e="below"):e="above",("above"==e||c&&"below"!==e)&&(l.top=g.top-n.top-h.height),null!=e&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+e),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){var a={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(a.minWidth=a.width,a.position="relative",a.width="auto"),this.$dropdown.css(a)},c.prototype._showDropdown=function(a){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define("select2/dropdown/minimumResultsForSearch",[],function(){function a(b){for(var c=0,d=0;d0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),(null!=l.tokenSeparators||null!=l.tokenizer)&&(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+"compat/query");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+"compat/initSelection");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+"compat/dropdownCss");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.multiple?l.selectionAdapter=e:l.selectionAdapter=d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+"compat/containerCss");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if("string"==typeof l.language)if(l.language.indexOf("-")>0){var H=l.language.split("-"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push("en");for(var K=l.language,L=0;L0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){var h=e.children[g],i=c(d,h);null==i&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var j=b(e.text).toUpperCase(),k=b(d.term).toUpperCase();return j.indexOf(k)>-1?e:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:"default",width:"resolve"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(this.defaults,f)};var E=new D;return E}),b.define("select2/options",["require","jquery","./defaults","./utils"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is("input")){var f=a(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){var c=["select2"];null==this.options.multiple&&(this.options.multiple=a.prop("multiple")),null==this.options.disabled&&(this.options.disabled=a.prop("disabled")),null==this.options.language&&(a.prop("lang")?this.options.language=a.prop("lang").toLowerCase():a.closest("[lang]").prop("lang")&&(this.options.language=a.closest("[lang]").prop("lang"))),null==this.options.dir&&(a.prop("dir")?this.options.dir=a.prop("dir"):a.closest("[dir]").prop("dir")?this.options.dir=a.closest("[dir]").prop("dir"):this.options.dir="ltr"),a.prop("disabled",this.options.disabled),a.prop("multiple",this.options.multiple),a.data("select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),a.data("data",a.data("select2Tags")),a.data("tags",!0)),a.data("ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),a.attr("ajax--url",a.data("ajaxUrl")),a.data("ajax--url",a.data("ajaxUrl")));var e={};e=b.fn.jquery&&"1."==b.fn.jquery.substr(0,2)&&a[0].dataset?b.extend(!0,{},a[0].dataset,a.data()):a.data();var f=b.extend(!0,{},e);f=d._convertData(f);for(var g in f)b.inArray(g,c)>-1||(b.isPlainObject(this.options[g])?b.extend(this.options[g],f[g]):this.options[g]=f[g]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define("select2/core",["jquery","./options","./utils","./keys"],function(a,b,c,d){var e=function(a,c){null!=a.data("select2")&&a.data("select2").destroy(),this.$element=a,this.id=this._generateId(a),c=c||{},this.options=new b(c,a),e.__super__.constructor.call(this);var d=a.attr("tabindex")||0;a.data("old-tabindex",d),a.attr("tabindex","-1");var f=this.options.get("dataAdapter");this.dataAdapter=new f(a,this.options);var g=this.render();this._placeContainer(g);var h=this.options.get("selectionAdapter");this.selection=new h(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,g);var i=this.options.get("dropdownAdapter");this.dropdown=new i(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,g);var j=this.options.get("resultsAdapter");this.results=new j(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var k=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){k.trigger("selection:update",{data:a})}),a.addClass("select2-hidden-accessible"),a.attr("aria-hidden","true"),this._syncAttributes(),a.data("select2",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b="";return b=null!=a.attr("id")?a.attr("id"):null!=a.attr("name")?a.attr("name")+"-"+c.generateChars(2):c.generateChars(4),b=b.replace(/(:|\.|\[|\]|,)/g,""),b="select2-"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get("width"));null!=b&&a.css("width",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==b){var d=this._resolveWidth(a,"style");return null!=d?d:this._resolveWidth(a,"element")}if("element"==b){var e=a.outerWidth(!1);return 0>=e?"auto":e+"px"}if("style"==b){var f=a.attr("style");if("string"!=typeof f)return null;for(var g=f.split(";"),h=0,i=g.length;i>h;h+=1){var j=g[h].replace(/\s/g,""),k=j.match(c);if(null!==k&&k.length>=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on("change.select2",function(){b.dataAdapter.current(function(a){b.trigger("selection:update",{data:a})})}),this.$element.on("focus.select2",function(a){b.trigger("focus",a)}),this._syncA=c.bind(this._syncAttributes,this),this._syncS=c.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._syncA);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._syncA),a.each(c,b._syncS)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener("DOMAttrModified",b._syncA,!1),this.$element[0].addEventListener("DOMNodeInserted",b._syncS,!1),this.$element[0].addEventListener("DOMNodeRemoved",b._syncS,!1))},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=["toggle","focus"];this.selection.on("toggle",function(){b.toggleDropdown()}),this.selection.on("focus",function(a){b.focus(a)}),this.selection.on("*",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var a=this;this.on("open",function(){a.$container.addClass("select2-container--open")}),this.on("close",function(){a.$container.removeClass("select2-container--open")}),this.on("enable",function(){a.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){a.$container.addClass("select2-container--disabled")}),this.on("blur",function(){a.$container.removeClass("select2-container--focus")}),this.on("query",function(b){a.isOpen()||a.trigger("open",{}),this.dataAdapter.query(b,function(c){a.trigger("results:all",{data:c,query:b})})}),this.on("query:append",function(b){this.dataAdapter.query(b,function(c){a.trigger("results:append",{data:c,query:b})})}),this.on("keypress",function(b){var c=b.which;a.isOpen()?c===d.ESC||c===d.TAB||c===d.UP&&b.altKey?(a.close(),b.preventDefault()):c===d.ENTER?(a.trigger("results:select",{}),b.preventDefault()):c===d.SPACE&&b.ctrlKey?(a.trigger("results:toggle",{}),b.preventDefault()):c===d.UP?(a.trigger("results:previous",{}),b.preventDefault()):c===d.DOWN&&(a.trigger("results:next",{}),b.preventDefault()):(c===d.ENTER||c===d.SPACE||c===d.DOWN&&b.altKey)&&(a.open(),b.preventDefault())})},e.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},e.prototype._syncSubtree=function(a,b){var c=!1,d=this;if(!a||!a.target||"OPTION"===a.target.nodeName||"OPTGROUP"===a.target.nodeName){if(b)if(b.addedNodes&&b.addedNodes.length>0)for(var e=0;e0&&(c=!0);else c=!0;c&&this.dataAdapter.current(function(a){d.trigger("selection:update",{data:a})})}},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:"opening",close:"closing",select:"selecting",unselect:"unselecting"};if(void 0===b&&(b={}),a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||this.trigger("query",{})},e.prototype.close=function(){this.isOpen()&&this.trigger("close",{})},e.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},e.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},e.prototype.focus=function(a){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},e.prototype.enable=function(a){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),(null==a||0===a.length)&&(a=[!0]);var b=!a[0];this.$element.prop("disabled",b)},e.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger("change")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener("DOMAttrModified",this._syncA,!1),this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,!1),this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",this.$element.data("old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null; +},e.prototype.render=function(){var b=a('');return b.attr("dir",this.options.get("dir")),this.$container=b,this.$container.addClass("select2-container--"+this.options.get("theme")),b.data("element",this.$element),b},e}),b.define("select2/compat/utils",["jquery"],function(a){function b(b,c,d){var e,f,g=[];e=a.trim(b.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each(function(){0===this.indexOf("select2-")&&g.push(this)})),e=a.trim(c.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each(function(){0!==this.indexOf("select2-")&&(f=d(this),null!=f&&g.push(f))})),b.attr("class",g.join(" "))}return{syncCssClasses:b}}),b.define("select2/compat/containerCss",["jquery","./utils"],function(a,b){function c(a){return null}function d(){}return d.prototype.render=function(d){var e=d.call(this),f=this.options.get("containerCssClass")||"";a.isFunction(f)&&(f=f(this.$element));var g=this.options.get("adaptContainerCssClass");if(g=g||c,-1!==f.indexOf(":all:")){f=f.replace(":all:","");var h=g;g=function(a){var b=h(a);return null!=b?b+" "+a:a}}var i=this.options.get("containerCss")||{};return a.isFunction(i)&&(i=i(this.$element)),b.syncCssClasses(e,this.$element,g),e.css(i),e.addClass(f),e},d}),b.define("select2/compat/dropdownCss",["jquery","./utils"],function(a,b){function c(a){return null}function d(){}return d.prototype.render=function(d){var e=d.call(this),f=this.options.get("dropdownCssClass")||"";a.isFunction(f)&&(f=f(this.$element));var g=this.options.get("adaptDropdownCssClass");if(g=g||c,-1!==f.indexOf(":all:")){f=f.replace(":all:","");var h=g;g=function(a){var b=h(a);return null!=b?b+" "+a:a}}var i=this.options.get("dropdownCss")||{};return a.isFunction(i)&&(i=i(this.$element)),b.syncCssClasses(e,this.$element,g),e.css(i),e.addClass(f),e},d}),b.define("select2/compat/initSelection",["jquery"],function(a){function b(a,b,c){c.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `initSelection` option has been deprecated in favor of a custom data adapter that overrides the `current` method. This method is now called multiple times instead of a single time when the instance is initialized. Support will be removed for the `initSelection` option in future versions of Select2"),this.initSelection=c.get("initSelection"),this._isInitialized=!1,a.call(this,b,c)}return b.prototype.current=function(b,c){var d=this;return this._isInitialized?void b.call(this,c):void this.initSelection.call(null,this.$element,function(b){d._isInitialized=!0,a.isArray(b)||(b=[b]),c(b)})},b}),b.define("select2/compat/inputData",["jquery"],function(a){function b(a,b,c){this._currentData=[],this._valueSeparator=c.get("valueSeparator")||",","hidden"===b.prop("type")&&c.get("debug")&&console&&console.warn&&console.warn("Select2: Using a hidden input with Select2 is no longer supported and may stop working in the future. It is recommended to use a `' + + '' + ); + + this.$searchContainer = $search; + this.$search = $search.find('input'); + + var $rendered = decorated.call(this); + + this._transferTabIndex(); + + return $rendered; + }; + + Search.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('open', function () { + self.$search.trigger('focus'); + }); + + container.on('close', function () { + self.$search.val(''); + self.$search.removeAttr('aria-activedescendant'); + self.$search.trigger('focus'); + }); + + container.on('enable', function () { + self.$search.prop('disabled', false); + + self._transferTabIndex(); + }); + + container.on('disable', function () { + self.$search.prop('disabled', true); + }); + + container.on('focus', function (evt) { + self.$search.trigger('focus'); + }); + + container.on('results:focus', function (params) { + self.$search.attr('aria-activedescendant', params.id); + }); + + this.$selection.on('focusin', '.select2-search--inline', function (evt) { + self.trigger('focus', evt); + }); + + this.$selection.on('focusout', '.select2-search--inline', function (evt) { + self._handleBlur(evt); + }); + + this.$selection.on('keydown', '.select2-search--inline', function (evt) { + evt.stopPropagation(); + + self.trigger('keypress', evt); + + self._keyUpPrevented = evt.isDefaultPrevented(); + + var key = evt.which; + + if (key === KEYS.BACKSPACE && self.$search.val() === '') { + var $previousChoice = self.$searchContainer + .prev('.select2-selection__choice'); + + if ($previousChoice.length > 0) { + var item = $previousChoice.data('data'); + + self.searchRemoveChoice(item); + + evt.preventDefault(); + } + } + }); + + // Try to detect the IE version should the `documentMode` property that + // is stored on the document. This is only implemented in IE and is + // slightly cleaner than doing a user agent check. + // This property is not available in Edge, but Edge also doesn't have + // this bug. + var msie = document.documentMode; + var disableInputEvents = msie && msie <= 11; + + // Workaround for browsers which do not support the `input` event + // This will prevent double-triggering of events for browsers which support + // both the `keyup` and `input` events. + this.$selection.on( + 'input.searchcheck', + '.select2-search--inline', + function (evt) { + // IE will trigger the `input` event when a placeholder is used on a + // search box. To get around this issue, we are forced to ignore all + // `input` events in IE and keep using `keyup`. + if (disableInputEvents) { + self.$selection.off('input.search input.searchcheck'); + return; + } + + // Unbind the duplicated `keyup` event + self.$selection.off('keyup.search'); + } + ); + + this.$selection.on( + 'keyup.search input.search', + '.select2-search--inline', + function (evt) { + // IE will trigger the `input` event when a placeholder is used on a + // search box. To get around this issue, we are forced to ignore all + // `input` events in IE and keep using `keyup`. + if (disableInputEvents && evt.type === 'input') { + self.$selection.off('input.search input.searchcheck'); + return; + } + + var key = evt.which; + + // We can freely ignore events from modifier keys + if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) { + return; + } + + // Tabbing will be handled during the `keydown` phase + if (key == KEYS.TAB) { + return; + } + + self.handleSearch(evt); + } + ); + }; + + /** + * This method will transfer the tabindex attribute from the rendered + * selection to the search box. This allows for the search box to be used as + * the primary focus instead of the selection container. + * + * @private + */ + Search.prototype._transferTabIndex = function (decorated) { + this.$search.attr('tabindex', this.$selection.attr('tabindex')); + this.$selection.attr('tabindex', '-1'); + }; + + Search.prototype.createPlaceholder = function (decorated, placeholder) { + this.$search.attr('placeholder', placeholder.text); + }; + + Search.prototype.update = function (decorated, data) { + var searchHadFocus = this.$search[0] == document.activeElement; + + this.$search.attr('placeholder', ''); + + decorated.call(this, data); + + this.$selection.find('.select2-selection__rendered') + .append(this.$searchContainer); + + this.resizeSearch(); + if (searchHadFocus) { + this.$search.focus(); + } + }; + + Search.prototype.handleSearch = function () { + this.resizeSearch(); + + if (!this._keyUpPrevented) { + var input = this.$search.val(); + + this.trigger('query', { + term: input + }); + } + + this._keyUpPrevented = false; + }; + + Search.prototype.searchRemoveChoice = function (decorated, item) { + this.trigger('unselect', { + data: item + }); + + this.$search.val(item.text); + this.handleSearch(); + }; + + Search.prototype.resizeSearch = function () { + this.$search.css('width', '25px'); + + var width = ''; + + if (this.$search.attr('placeholder') !== '') { + width = this.$selection.find('.select2-selection__rendered').innerWidth(); + } else { + var minimumWidth = this.$search.val().length + 1; + + width = (minimumWidth * 0.75) + 'em'; + } + + this.$search.css('width', width); + }; + + return Search; +}); + +S2.define('select2/selection/eventRelay',[ + 'jquery' +], function ($) { + function EventRelay () { } + + EventRelay.prototype.bind = function (decorated, container, $container) { + var self = this; + var relayEvents = [ + 'open', 'opening', + 'close', 'closing', + 'select', 'selecting', + 'unselect', 'unselecting' + ]; + + var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting']; + + decorated.call(this, container, $container); + + container.on('*', function (name, params) { + // Ignore events that should not be relayed + if ($.inArray(name, relayEvents) === -1) { + return; + } + + // The parameters should always be an object + params = params || {}; + + // Generate the jQuery event for the Select2 event + var evt = $.Event('select2:' + name, { + params: params + }); + + self.$element.trigger(evt); + + // Only handle preventable events if it was one + if ($.inArray(name, preventableEvents) === -1) { + return; + } + + params.prevented = evt.isDefaultPrevented(); + }); + }; + + return EventRelay; +}); + +S2.define('select2/translation',[ + 'jquery', + 'require' +], function ($, require) { + function Translation (dict) { + this.dict = dict || {}; + } + + Translation.prototype.all = function () { + return this.dict; + }; + + Translation.prototype.get = function (key) { + return this.dict[key]; + }; + + Translation.prototype.extend = function (translation) { + this.dict = $.extend({}, translation.all(), this.dict); + }; + + // Static functions + + Translation._cache = {}; + + Translation.loadPath = function (path) { + if (!(path in Translation._cache)) { + var translations = require(path); + + Translation._cache[path] = translations; + } + + return new Translation(Translation._cache[path]); + }; + + return Translation; +}); + +S2.define('select2/diacritics',[ + +], function () { + var diacritics = { + '\u24B6': 'A', + '\uFF21': 'A', + '\u00C0': 'A', + '\u00C1': 'A', + '\u00C2': 'A', + '\u1EA6': 'A', + '\u1EA4': 'A', + '\u1EAA': 'A', + '\u1EA8': 'A', + '\u00C3': 'A', + '\u0100': 'A', + '\u0102': 'A', + '\u1EB0': 'A', + '\u1EAE': 'A', + '\u1EB4': 'A', + '\u1EB2': 'A', + '\u0226': 'A', + '\u01E0': 'A', + '\u00C4': 'A', + '\u01DE': 'A', + '\u1EA2': 'A', + '\u00C5': 'A', + '\u01FA': 'A', + '\u01CD': 'A', + '\u0200': 'A', + '\u0202': 'A', + '\u1EA0': 'A', + '\u1EAC': 'A', + '\u1EB6': 'A', + '\u1E00': 'A', + '\u0104': 'A', + '\u023A': 'A', + '\u2C6F': 'A', + '\uA732': 'AA', + '\u00C6': 'AE', + '\u01FC': 'AE', + '\u01E2': 'AE', + '\uA734': 'AO', + '\uA736': 'AU', + '\uA738': 'AV', + '\uA73A': 'AV', + '\uA73C': 'AY', + '\u24B7': 'B', + '\uFF22': 'B', + '\u1E02': 'B', + '\u1E04': 'B', + '\u1E06': 'B', + '\u0243': 'B', + '\u0182': 'B', + '\u0181': 'B', + '\u24B8': 'C', + '\uFF23': 'C', + '\u0106': 'C', + '\u0108': 'C', + '\u010A': 'C', + '\u010C': 'C', + '\u00C7': 'C', + '\u1E08': 'C', + '\u0187': 'C', + '\u023B': 'C', + '\uA73E': 'C', + '\u24B9': 'D', + '\uFF24': 'D', + '\u1E0A': 'D', + '\u010E': 'D', + '\u1E0C': 'D', + '\u1E10': 'D', + '\u1E12': 'D', + '\u1E0E': 'D', + '\u0110': 'D', + '\u018B': 'D', + '\u018A': 'D', + '\u0189': 'D', + '\uA779': 'D', + '\u01F1': 'DZ', + '\u01C4': 'DZ', + '\u01F2': 'Dz', + '\u01C5': 'Dz', + '\u24BA': 'E', + '\uFF25': 'E', + '\u00C8': 'E', + '\u00C9': 'E', + '\u00CA': 'E', + '\u1EC0': 'E', + '\u1EBE': 'E', + '\u1EC4': 'E', + '\u1EC2': 'E', + '\u1EBC': 'E', + '\u0112': 'E', + '\u1E14': 'E', + '\u1E16': 'E', + '\u0114': 'E', + '\u0116': 'E', + '\u00CB': 'E', + '\u1EBA': 'E', + '\u011A': 'E', + '\u0204': 'E', + '\u0206': 'E', + '\u1EB8': 'E', + '\u1EC6': 'E', + '\u0228': 'E', + '\u1E1C': 'E', + '\u0118': 'E', + '\u1E18': 'E', + '\u1E1A': 'E', + '\u0190': 'E', + '\u018E': 'E', + '\u24BB': 'F', + '\uFF26': 'F', + '\u1E1E': 'F', + '\u0191': 'F', + '\uA77B': 'F', + '\u24BC': 'G', + '\uFF27': 'G', + '\u01F4': 'G', + '\u011C': 'G', + '\u1E20': 'G', + '\u011E': 'G', + '\u0120': 'G', + '\u01E6': 'G', + '\u0122': 'G', + '\u01E4': 'G', + '\u0193': 'G', + '\uA7A0': 'G', + '\uA77D': 'G', + '\uA77E': 'G', + '\u24BD': 'H', + '\uFF28': 'H', + '\u0124': 'H', + '\u1E22': 'H', + '\u1E26': 'H', + '\u021E': 'H', + '\u1E24': 'H', + '\u1E28': 'H', + '\u1E2A': 'H', + '\u0126': 'H', + '\u2C67': 'H', + '\u2C75': 'H', + '\uA78D': 'H', + '\u24BE': 'I', + '\uFF29': 'I', + '\u00CC': 'I', + '\u00CD': 'I', + '\u00CE': 'I', + '\u0128': 'I', + '\u012A': 'I', + '\u012C': 'I', + '\u0130': 'I', + '\u00CF': 'I', + '\u1E2E': 'I', + '\u1EC8': 'I', + '\u01CF': 'I', + '\u0208': 'I', + '\u020A': 'I', + '\u1ECA': 'I', + '\u012E': 'I', + '\u1E2C': 'I', + '\u0197': 'I', + '\u24BF': 'J', + '\uFF2A': 'J', + '\u0134': 'J', + '\u0248': 'J', + '\u24C0': 'K', + '\uFF2B': 'K', + '\u1E30': 'K', + '\u01E8': 'K', + '\u1E32': 'K', + '\u0136': 'K', + '\u1E34': 'K', + '\u0198': 'K', + '\u2C69': 'K', + '\uA740': 'K', + '\uA742': 'K', + '\uA744': 'K', + '\uA7A2': 'K', + '\u24C1': 'L', + '\uFF2C': 'L', + '\u013F': 'L', + '\u0139': 'L', + '\u013D': 'L', + '\u1E36': 'L', + '\u1E38': 'L', + '\u013B': 'L', + '\u1E3C': 'L', + '\u1E3A': 'L', + '\u0141': 'L', + '\u023D': 'L', + '\u2C62': 'L', + '\u2C60': 'L', + '\uA748': 'L', + '\uA746': 'L', + '\uA780': 'L', + '\u01C7': 'LJ', + '\u01C8': 'Lj', + '\u24C2': 'M', + '\uFF2D': 'M', + '\u1E3E': 'M', + '\u1E40': 'M', + '\u1E42': 'M', + '\u2C6E': 'M', + '\u019C': 'M', + '\u24C3': 'N', + '\uFF2E': 'N', + '\u01F8': 'N', + '\u0143': 'N', + '\u00D1': 'N', + '\u1E44': 'N', + '\u0147': 'N', + '\u1E46': 'N', + '\u0145': 'N', + '\u1E4A': 'N', + '\u1E48': 'N', + '\u0220': 'N', + '\u019D': 'N', + '\uA790': 'N', + '\uA7A4': 'N', + '\u01CA': 'NJ', + '\u01CB': 'Nj', + '\u24C4': 'O', + '\uFF2F': 'O', + '\u00D2': 'O', + '\u00D3': 'O', + '\u00D4': 'O', + '\u1ED2': 'O', + '\u1ED0': 'O', + '\u1ED6': 'O', + '\u1ED4': 'O', + '\u00D5': 'O', + '\u1E4C': 'O', + '\u022C': 'O', + '\u1E4E': 'O', + '\u014C': 'O', + '\u1E50': 'O', + '\u1E52': 'O', + '\u014E': 'O', + '\u022E': 'O', + '\u0230': 'O', + '\u00D6': 'O', + '\u022A': 'O', + '\u1ECE': 'O', + '\u0150': 'O', + '\u01D1': 'O', + '\u020C': 'O', + '\u020E': 'O', + '\u01A0': 'O', + '\u1EDC': 'O', + '\u1EDA': 'O', + '\u1EE0': 'O', + '\u1EDE': 'O', + '\u1EE2': 'O', + '\u1ECC': 'O', + '\u1ED8': 'O', + '\u01EA': 'O', + '\u01EC': 'O', + '\u00D8': 'O', + '\u01FE': 'O', + '\u0186': 'O', + '\u019F': 'O', + '\uA74A': 'O', + '\uA74C': 'O', + '\u01A2': 'OI', + '\uA74E': 'OO', + '\u0222': 'OU', + '\u24C5': 'P', + '\uFF30': 'P', + '\u1E54': 'P', + '\u1E56': 'P', + '\u01A4': 'P', + '\u2C63': 'P', + '\uA750': 'P', + '\uA752': 'P', + '\uA754': 'P', + '\u24C6': 'Q', + '\uFF31': 'Q', + '\uA756': 'Q', + '\uA758': 'Q', + '\u024A': 'Q', + '\u24C7': 'R', + '\uFF32': 'R', + '\u0154': 'R', + '\u1E58': 'R', + '\u0158': 'R', + '\u0210': 'R', + '\u0212': 'R', + '\u1E5A': 'R', + '\u1E5C': 'R', + '\u0156': 'R', + '\u1E5E': 'R', + '\u024C': 'R', + '\u2C64': 'R', + '\uA75A': 'R', + '\uA7A6': 'R', + '\uA782': 'R', + '\u24C8': 'S', + '\uFF33': 'S', + '\u1E9E': 'S', + '\u015A': 'S', + '\u1E64': 'S', + '\u015C': 'S', + '\u1E60': 'S', + '\u0160': 'S', + '\u1E66': 'S', + '\u1E62': 'S', + '\u1E68': 'S', + '\u0218': 'S', + '\u015E': 'S', + '\u2C7E': 'S', + '\uA7A8': 'S', + '\uA784': 'S', + '\u24C9': 'T', + '\uFF34': 'T', + '\u1E6A': 'T', + '\u0164': 'T', + '\u1E6C': 'T', + '\u021A': 'T', + '\u0162': 'T', + '\u1E70': 'T', + '\u1E6E': 'T', + '\u0166': 'T', + '\u01AC': 'T', + '\u01AE': 'T', + '\u023E': 'T', + '\uA786': 'T', + '\uA728': 'TZ', + '\u24CA': 'U', + '\uFF35': 'U', + '\u00D9': 'U', + '\u00DA': 'U', + '\u00DB': 'U', + '\u0168': 'U', + '\u1E78': 'U', + '\u016A': 'U', + '\u1E7A': 'U', + '\u016C': 'U', + '\u00DC': 'U', + '\u01DB': 'U', + '\u01D7': 'U', + '\u01D5': 'U', + '\u01D9': 'U', + '\u1EE6': 'U', + '\u016E': 'U', + '\u0170': 'U', + '\u01D3': 'U', + '\u0214': 'U', + '\u0216': 'U', + '\u01AF': 'U', + '\u1EEA': 'U', + '\u1EE8': 'U', + '\u1EEE': 'U', + '\u1EEC': 'U', + '\u1EF0': 'U', + '\u1EE4': 'U', + '\u1E72': 'U', + '\u0172': 'U', + '\u1E76': 'U', + '\u1E74': 'U', + '\u0244': 'U', + '\u24CB': 'V', + '\uFF36': 'V', + '\u1E7C': 'V', + '\u1E7E': 'V', + '\u01B2': 'V', + '\uA75E': 'V', + '\u0245': 'V', + '\uA760': 'VY', + '\u24CC': 'W', + '\uFF37': 'W', + '\u1E80': 'W', + '\u1E82': 'W', + '\u0174': 'W', + '\u1E86': 'W', + '\u1E84': 'W', + '\u1E88': 'W', + '\u2C72': 'W', + '\u24CD': 'X', + '\uFF38': 'X', + '\u1E8A': 'X', + '\u1E8C': 'X', + '\u24CE': 'Y', + '\uFF39': 'Y', + '\u1EF2': 'Y', + '\u00DD': 'Y', + '\u0176': 'Y', + '\u1EF8': 'Y', + '\u0232': 'Y', + '\u1E8E': 'Y', + '\u0178': 'Y', + '\u1EF6': 'Y', + '\u1EF4': 'Y', + '\u01B3': 'Y', + '\u024E': 'Y', + '\u1EFE': 'Y', + '\u24CF': 'Z', + '\uFF3A': 'Z', + '\u0179': 'Z', + '\u1E90': 'Z', + '\u017B': 'Z', + '\u017D': 'Z', + '\u1E92': 'Z', + '\u1E94': 'Z', + '\u01B5': 'Z', + '\u0224': 'Z', + '\u2C7F': 'Z', + '\u2C6B': 'Z', + '\uA762': 'Z', + '\u24D0': 'a', + '\uFF41': 'a', + '\u1E9A': 'a', + '\u00E0': 'a', + '\u00E1': 'a', + '\u00E2': 'a', + '\u1EA7': 'a', + '\u1EA5': 'a', + '\u1EAB': 'a', + '\u1EA9': 'a', + '\u00E3': 'a', + '\u0101': 'a', + '\u0103': 'a', + '\u1EB1': 'a', + '\u1EAF': 'a', + '\u1EB5': 'a', + '\u1EB3': 'a', + '\u0227': 'a', + '\u01E1': 'a', + '\u00E4': 'a', + '\u01DF': 'a', + '\u1EA3': 'a', + '\u00E5': 'a', + '\u01FB': 'a', + '\u01CE': 'a', + '\u0201': 'a', + '\u0203': 'a', + '\u1EA1': 'a', + '\u1EAD': 'a', + '\u1EB7': 'a', + '\u1E01': 'a', + '\u0105': 'a', + '\u2C65': 'a', + '\u0250': 'a', + '\uA733': 'aa', + '\u00E6': 'ae', + '\u01FD': 'ae', + '\u01E3': 'ae', + '\uA735': 'ao', + '\uA737': 'au', + '\uA739': 'av', + '\uA73B': 'av', + '\uA73D': 'ay', + '\u24D1': 'b', + '\uFF42': 'b', + '\u1E03': 'b', + '\u1E05': 'b', + '\u1E07': 'b', + '\u0180': 'b', + '\u0183': 'b', + '\u0253': 'b', + '\u24D2': 'c', + '\uFF43': 'c', + '\u0107': 'c', + '\u0109': 'c', + '\u010B': 'c', + '\u010D': 'c', + '\u00E7': 'c', + '\u1E09': 'c', + '\u0188': 'c', + '\u023C': 'c', + '\uA73F': 'c', + '\u2184': 'c', + '\u24D3': 'd', + '\uFF44': 'd', + '\u1E0B': 'd', + '\u010F': 'd', + '\u1E0D': 'd', + '\u1E11': 'd', + '\u1E13': 'd', + '\u1E0F': 'd', + '\u0111': 'd', + '\u018C': 'd', + '\u0256': 'd', + '\u0257': 'd', + '\uA77A': 'd', + '\u01F3': 'dz', + '\u01C6': 'dz', + '\u24D4': 'e', + '\uFF45': 'e', + '\u00E8': 'e', + '\u00E9': 'e', + '\u00EA': 'e', + '\u1EC1': 'e', + '\u1EBF': 'e', + '\u1EC5': 'e', + '\u1EC3': 'e', + '\u1EBD': 'e', + '\u0113': 'e', + '\u1E15': 'e', + '\u1E17': 'e', + '\u0115': 'e', + '\u0117': 'e', + '\u00EB': 'e', + '\u1EBB': 'e', + '\u011B': 'e', + '\u0205': 'e', + '\u0207': 'e', + '\u1EB9': 'e', + '\u1EC7': 'e', + '\u0229': 'e', + '\u1E1D': 'e', + '\u0119': 'e', + '\u1E19': 'e', + '\u1E1B': 'e', + '\u0247': 'e', + '\u025B': 'e', + '\u01DD': 'e', + '\u24D5': 'f', + '\uFF46': 'f', + '\u1E1F': 'f', + '\u0192': 'f', + '\uA77C': 'f', + '\u24D6': 'g', + '\uFF47': 'g', + '\u01F5': 'g', + '\u011D': 'g', + '\u1E21': 'g', + '\u011F': 'g', + '\u0121': 'g', + '\u01E7': 'g', + '\u0123': 'g', + '\u01E5': 'g', + '\u0260': 'g', + '\uA7A1': 'g', + '\u1D79': 'g', + '\uA77F': 'g', + '\u24D7': 'h', + '\uFF48': 'h', + '\u0125': 'h', + '\u1E23': 'h', + '\u1E27': 'h', + '\u021F': 'h', + '\u1E25': 'h', + '\u1E29': 'h', + '\u1E2B': 'h', + '\u1E96': 'h', + '\u0127': 'h', + '\u2C68': 'h', + '\u2C76': 'h', + '\u0265': 'h', + '\u0195': 'hv', + '\u24D8': 'i', + '\uFF49': 'i', + '\u00EC': 'i', + '\u00ED': 'i', + '\u00EE': 'i', + '\u0129': 'i', + '\u012B': 'i', + '\u012D': 'i', + '\u00EF': 'i', + '\u1E2F': 'i', + '\u1EC9': 'i', + '\u01D0': 'i', + '\u0209': 'i', + '\u020B': 'i', + '\u1ECB': 'i', + '\u012F': 'i', + '\u1E2D': 'i', + '\u0268': 'i', + '\u0131': 'i', + '\u24D9': 'j', + '\uFF4A': 'j', + '\u0135': 'j', + '\u01F0': 'j', + '\u0249': 'j', + '\u24DA': 'k', + '\uFF4B': 'k', + '\u1E31': 'k', + '\u01E9': 'k', + '\u1E33': 'k', + '\u0137': 'k', + '\u1E35': 'k', + '\u0199': 'k', + '\u2C6A': 'k', + '\uA741': 'k', + '\uA743': 'k', + '\uA745': 'k', + '\uA7A3': 'k', + '\u24DB': 'l', + '\uFF4C': 'l', + '\u0140': 'l', + '\u013A': 'l', + '\u013E': 'l', + '\u1E37': 'l', + '\u1E39': 'l', + '\u013C': 'l', + '\u1E3D': 'l', + '\u1E3B': 'l', + '\u017F': 'l', + '\u0142': 'l', + '\u019A': 'l', + '\u026B': 'l', + '\u2C61': 'l', + '\uA749': 'l', + '\uA781': 'l', + '\uA747': 'l', + '\u01C9': 'lj', + '\u24DC': 'm', + '\uFF4D': 'm', + '\u1E3F': 'm', + '\u1E41': 'm', + '\u1E43': 'm', + '\u0271': 'm', + '\u026F': 'm', + '\u24DD': 'n', + '\uFF4E': 'n', + '\u01F9': 'n', + '\u0144': 'n', + '\u00F1': 'n', + '\u1E45': 'n', + '\u0148': 'n', + '\u1E47': 'n', + '\u0146': 'n', + '\u1E4B': 'n', + '\u1E49': 'n', + '\u019E': 'n', + '\u0272': 'n', + '\u0149': 'n', + '\uA791': 'n', + '\uA7A5': 'n', + '\u01CC': 'nj', + '\u24DE': 'o', + '\uFF4F': 'o', + '\u00F2': 'o', + '\u00F3': 'o', + '\u00F4': 'o', + '\u1ED3': 'o', + '\u1ED1': 'o', + '\u1ED7': 'o', + '\u1ED5': 'o', + '\u00F5': 'o', + '\u1E4D': 'o', + '\u022D': 'o', + '\u1E4F': 'o', + '\u014D': 'o', + '\u1E51': 'o', + '\u1E53': 'o', + '\u014F': 'o', + '\u022F': 'o', + '\u0231': 'o', + '\u00F6': 'o', + '\u022B': 'o', + '\u1ECF': 'o', + '\u0151': 'o', + '\u01D2': 'o', + '\u020D': 'o', + '\u020F': 'o', + '\u01A1': 'o', + '\u1EDD': 'o', + '\u1EDB': 'o', + '\u1EE1': 'o', + '\u1EDF': 'o', + '\u1EE3': 'o', + '\u1ECD': 'o', + '\u1ED9': 'o', + '\u01EB': 'o', + '\u01ED': 'o', + '\u00F8': 'o', + '\u01FF': 'o', + '\u0254': 'o', + '\uA74B': 'o', + '\uA74D': 'o', + '\u0275': 'o', + '\u01A3': 'oi', + '\u0223': 'ou', + '\uA74F': 'oo', + '\u24DF': 'p', + '\uFF50': 'p', + '\u1E55': 'p', + '\u1E57': 'p', + '\u01A5': 'p', + '\u1D7D': 'p', + '\uA751': 'p', + '\uA753': 'p', + '\uA755': 'p', + '\u24E0': 'q', + '\uFF51': 'q', + '\u024B': 'q', + '\uA757': 'q', + '\uA759': 'q', + '\u24E1': 'r', + '\uFF52': 'r', + '\u0155': 'r', + '\u1E59': 'r', + '\u0159': 'r', + '\u0211': 'r', + '\u0213': 'r', + '\u1E5B': 'r', + '\u1E5D': 'r', + '\u0157': 'r', + '\u1E5F': 'r', + '\u024D': 'r', + '\u027D': 'r', + '\uA75B': 'r', + '\uA7A7': 'r', + '\uA783': 'r', + '\u24E2': 's', + '\uFF53': 's', + '\u00DF': 's', + '\u015B': 's', + '\u1E65': 's', + '\u015D': 's', + '\u1E61': 's', + '\u0161': 's', + '\u1E67': 's', + '\u1E63': 's', + '\u1E69': 's', + '\u0219': 's', + '\u015F': 's', + '\u023F': 's', + '\uA7A9': 's', + '\uA785': 's', + '\u1E9B': 's', + '\u24E3': 't', + '\uFF54': 't', + '\u1E6B': 't', + '\u1E97': 't', + '\u0165': 't', + '\u1E6D': 't', + '\u021B': 't', + '\u0163': 't', + '\u1E71': 't', + '\u1E6F': 't', + '\u0167': 't', + '\u01AD': 't', + '\u0288': 't', + '\u2C66': 't', + '\uA787': 't', + '\uA729': 'tz', + '\u24E4': 'u', + '\uFF55': 'u', + '\u00F9': 'u', + '\u00FA': 'u', + '\u00FB': 'u', + '\u0169': 'u', + '\u1E79': 'u', + '\u016B': 'u', + '\u1E7B': 'u', + '\u016D': 'u', + '\u00FC': 'u', + '\u01DC': 'u', + '\u01D8': 'u', + '\u01D6': 'u', + '\u01DA': 'u', + '\u1EE7': 'u', + '\u016F': 'u', + '\u0171': 'u', + '\u01D4': 'u', + '\u0215': 'u', + '\u0217': 'u', + '\u01B0': 'u', + '\u1EEB': 'u', + '\u1EE9': 'u', + '\u1EEF': 'u', + '\u1EED': 'u', + '\u1EF1': 'u', + '\u1EE5': 'u', + '\u1E73': 'u', + '\u0173': 'u', + '\u1E77': 'u', + '\u1E75': 'u', + '\u0289': 'u', + '\u24E5': 'v', + '\uFF56': 'v', + '\u1E7D': 'v', + '\u1E7F': 'v', + '\u028B': 'v', + '\uA75F': 'v', + '\u028C': 'v', + '\uA761': 'vy', + '\u24E6': 'w', + '\uFF57': 'w', + '\u1E81': 'w', + '\u1E83': 'w', + '\u0175': 'w', + '\u1E87': 'w', + '\u1E85': 'w', + '\u1E98': 'w', + '\u1E89': 'w', + '\u2C73': 'w', + '\u24E7': 'x', + '\uFF58': 'x', + '\u1E8B': 'x', + '\u1E8D': 'x', + '\u24E8': 'y', + '\uFF59': 'y', + '\u1EF3': 'y', + '\u00FD': 'y', + '\u0177': 'y', + '\u1EF9': 'y', + '\u0233': 'y', + '\u1E8F': 'y', + '\u00FF': 'y', + '\u1EF7': 'y', + '\u1E99': 'y', + '\u1EF5': 'y', + '\u01B4': 'y', + '\u024F': 'y', + '\u1EFF': 'y', + '\u24E9': 'z', + '\uFF5A': 'z', + '\u017A': 'z', + '\u1E91': 'z', + '\u017C': 'z', + '\u017E': 'z', + '\u1E93': 'z', + '\u1E95': 'z', + '\u01B6': 'z', + '\u0225': 'z', + '\u0240': 'z', + '\u2C6C': 'z', + '\uA763': 'z', + '\u0386': '\u0391', + '\u0388': '\u0395', + '\u0389': '\u0397', + '\u038A': '\u0399', + '\u03AA': '\u0399', + '\u038C': '\u039F', + '\u038E': '\u03A5', + '\u03AB': '\u03A5', + '\u038F': '\u03A9', + '\u03AC': '\u03B1', + '\u03AD': '\u03B5', + '\u03AE': '\u03B7', + '\u03AF': '\u03B9', + '\u03CA': '\u03B9', + '\u0390': '\u03B9', + '\u03CC': '\u03BF', + '\u03CD': '\u03C5', + '\u03CB': '\u03C5', + '\u03B0': '\u03C5', + '\u03C9': '\u03C9', + '\u03C2': '\u03C3' + }; + + return diacritics; +}); + +S2.define('select2/data/base',[ + '../utils' +], function (Utils) { + function BaseAdapter ($element, options) { + BaseAdapter.__super__.constructor.call(this); + } + + Utils.Extend(BaseAdapter, Utils.Observable); + + BaseAdapter.prototype.current = function (callback) { + throw new Error('The `current` method must be defined in child classes.'); + }; + + BaseAdapter.prototype.query = function (params, callback) { + throw new Error('The `query` method must be defined in child classes.'); + }; + + BaseAdapter.prototype.bind = function (container, $container) { + // Can be implemented in subclasses + }; + + BaseAdapter.prototype.destroy = function () { + // Can be implemented in subclasses + }; + + BaseAdapter.prototype.generateResultId = function (container, data) { + var id = container.id + '-result-'; + + id += Utils.generateChars(4); + + if (data.id != null) { + id += '-' + data.id.toString(); + } else { + id += '-' + Utils.generateChars(4); + } + return id; + }; + + return BaseAdapter; +}); + +S2.define('select2/data/select',[ + './base', + '../utils', + 'jquery' +], function (BaseAdapter, Utils, $) { + function SelectAdapter ($element, options) { + this.$element = $element; + this.options = options; + + SelectAdapter.__super__.constructor.call(this); + } + + Utils.Extend(SelectAdapter, BaseAdapter); + + SelectAdapter.prototype.current = function (callback) { + var data = []; + var self = this; + + this.$element.find(':selected').each(function () { + var $option = $(this); + + var option = self.item($option); + + data.push(option); + }); + + callback(data); + }; + + SelectAdapter.prototype.select = function (data) { + var self = this; + + data.selected = true; + + // If data.element is a DOM node, use it instead + if ($(data.element).is('option')) { + data.element.selected = true; + + this.$element.trigger('change'); + + return; + } + + if (this.$element.prop('multiple')) { + this.current(function (currentData) { + var val = []; + + data = [data]; + data.push.apply(data, currentData); + + for (var d = 0; d < data.length; d++) { + var id = data[d].id; + + if ($.inArray(id, val) === -1) { + val.push(id); + } + } + + self.$element.val(val); + self.$element.trigger('change'); + }); + } else { + var val = data.id; + + this.$element.val(val); + this.$element.trigger('change'); + } + }; + + SelectAdapter.prototype.unselect = function (data) { + var self = this; + + if (!this.$element.prop('multiple')) { + return; + } + + data.selected = false; + + if ($(data.element).is('option')) { + data.element.selected = false; + + this.$element.trigger('change'); + + return; + } + + this.current(function (currentData) { + var val = []; + + for (var d = 0; d < currentData.length; d++) { + var id = currentData[d].id; + + if (id !== data.id && $.inArray(id, val) === -1) { + val.push(id); + } + } + + self.$element.val(val); + + self.$element.trigger('change'); + }); + }; + + SelectAdapter.prototype.bind = function (container, $container) { + var self = this; + + this.container = container; + + container.on('select', function (params) { + self.select(params.data); + }); + + container.on('unselect', function (params) { + self.unselect(params.data); + }); + }; + + SelectAdapter.prototype.destroy = function () { + // Remove anything added to child elements + this.$element.find('*').each(function () { + // Remove any custom data set by Select2 + $.removeData(this, 'data'); + }); + }; + + SelectAdapter.prototype.query = function (params, callback) { + var data = []; + var self = this; + + var $options = this.$element.children(); + + $options.each(function () { + var $option = $(this); + + if (!$option.is('option') && !$option.is('optgroup')) { + return; + } + + var option = self.item($option); + + var matches = self.matches(params, option); + + if (matches !== null) { + data.push(matches); + } + }); + + callback({ + results: data + }); + }; + + SelectAdapter.prototype.addOptions = function ($options) { + Utils.appendMany(this.$element, $options); + }; + + SelectAdapter.prototype.option = function (data) { + var option; + + if (data.children) { + option = document.createElement('optgroup'); + option.label = data.text; + } else { + option = document.createElement('option'); + + if (option.textContent !== undefined) { + option.textContent = data.text; + } else { + option.innerText = data.text; + } + } + + if (data.id) { + option.value = data.id; + } + + if (data.disabled) { + option.disabled = true; + } + + if (data.selected) { + option.selected = true; + } + + if (data.title) { + option.title = data.title; + } + + var $option = $(option); + + var normalizedData = this._normalizeItem(data); + normalizedData.element = option; + + // Override the option's data with the combined data + $.data(option, 'data', normalizedData); + + return $option; + }; + + SelectAdapter.prototype.item = function ($option) { + var data = {}; + + data = $.data($option[0], 'data'); + + if (data != null) { + return data; + } + + if ($option.is('option')) { + data = { + id: $option.val(), + text: $option.text(), + disabled: $option.prop('disabled'), + selected: $option.prop('selected'), + title: $option.prop('title') + }; + } else if ($option.is('optgroup')) { + data = { + text: $option.prop('label'), + children: [], + title: $option.prop('title') + }; + + var $children = $option.children('option'); + var children = []; + + for (var c = 0; c < $children.length; c++) { + var $child = $($children[c]); + + var child = this.item($child); + + children.push(child); + } + + data.children = children; + } + + data = this._normalizeItem(data); + data.element = $option[0]; + + $.data($option[0], 'data', data); + + return data; + }; + + SelectAdapter.prototype._normalizeItem = function (item) { + if (!$.isPlainObject(item)) { + item = { + id: item, + text: item + }; + } + + item = $.extend({}, { + text: '' + }, item); + + var defaults = { + selected: false, + disabled: false + }; + + if (item.id != null) { + item.id = item.id.toString(); + } + + if (item.text != null) { + item.text = item.text.toString(); + } + + if (item._resultId == null && item.id && this.container != null) { + item._resultId = this.generateResultId(this.container, item); + } + + return $.extend({}, defaults, item); + }; + + SelectAdapter.prototype.matches = function (params, data) { + var matcher = this.options.get('matcher'); + + return matcher(params, data); + }; + + return SelectAdapter; +}); + +S2.define('select2/data/array',[ + './select', + '../utils', + 'jquery' +], function (SelectAdapter, Utils, $) { + function ArrayAdapter ($element, options) { + var data = options.get('data') || []; + + ArrayAdapter.__super__.constructor.call(this, $element, options); + + this.addOptions(this.convertToOptions(data)); + } + + Utils.Extend(ArrayAdapter, SelectAdapter); + + ArrayAdapter.prototype.select = function (data) { + var $option = this.$element.find('option').filter(function (i, elm) { + return elm.value == data.id.toString(); + }); + + if ($option.length === 0) { + $option = this.option(data); + + this.addOptions($option); + } + + ArrayAdapter.__super__.select.call(this, data); + }; + + ArrayAdapter.prototype.convertToOptions = function (data) { + var self = this; + + var $existing = this.$element.find('option'); + var existingIds = $existing.map(function () { + return self.item($(this)).id; + }).get(); + + var $options = []; + + // Filter out all items except for the one passed in the argument + function onlyItem (item) { + return function () { + return $(this).val() == item.id; + }; + } + + for (var d = 0; d < data.length; d++) { + var item = this._normalizeItem(data[d]); + + // Skip items which were pre-loaded, only merge the data + if ($.inArray(item.id, existingIds) >= 0) { + var $existingOption = $existing.filter(onlyItem(item)); + + var existingData = this.item($existingOption); + var newData = $.extend(true, {}, item, existingData); + + var $newOption = this.option(newData); + + $existingOption.replaceWith($newOption); + + continue; + } + + var $option = this.option(item); + + if (item.children) { + var $children = this.convertToOptions(item.children); + + Utils.appendMany($option, $children); + } + + $options.push($option); + } + + return $options; + }; + + return ArrayAdapter; +}); + +S2.define('select2/data/ajax',[ + './array', + '../utils', + 'jquery' +], function (ArrayAdapter, Utils, $) { + function AjaxAdapter ($element, options) { + this.ajaxOptions = this._applyDefaults(options.get('ajax')); + + if (this.ajaxOptions.processResults != null) { + this.processResults = this.ajaxOptions.processResults; + } + + AjaxAdapter.__super__.constructor.call(this, $element, options); + } + + Utils.Extend(AjaxAdapter, ArrayAdapter); + + AjaxAdapter.prototype._applyDefaults = function (options) { + var defaults = { + data: function (params) { + return $.extend({}, params, { + q: params.term + }); + }, + transport: function (params, success, failure) { + var $request = $.ajax(params); + + $request.then(success); + $request.fail(failure); + + return $request; + } + }; + + return $.extend({}, defaults, options, true); + }; + + AjaxAdapter.prototype.processResults = function (results) { + return results; + }; + + AjaxAdapter.prototype.query = function (params, callback) { + var matches = []; + var self = this; + + if (this._request != null) { + // JSONP requests cannot always be aborted + if ($.isFunction(this._request.abort)) { + this._request.abort(); + } + + this._request = null; + } + + var options = $.extend({ + type: 'GET' + }, this.ajaxOptions); + + if (typeof options.url === 'function') { + options.url = options.url.call(this.$element, params); + } + + if (typeof options.data === 'function') { + options.data = options.data.call(this.$element, params); + } + + function request () { + var $request = options.transport(options, function (data) { + var results = self.processResults(data, params); + + if (self.options.get('debug') && window.console && console.error) { + // Check to make sure that the response included a `results` key. + if (!results || !results.results || !$.isArray(results.results)) { + console.error( + 'Select2: The AJAX results did not return an array in the ' + + '`results` key of the response.' + ); + } + } + + callback(results); + }, function () { + // Attempt to detect if a request was aborted + // Only works if the transport exposes a status property + if ($request.status && $request.status === '0') { + return; + } + + self.trigger('results:message', { + message: 'errorLoading' + }); + }); + + self._request = $request; + } + + if (this.ajaxOptions.delay && params.term != null) { + if (this._queryTimeout) { + window.clearTimeout(this._queryTimeout); + } + + this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay); + } else { + request(); + } + }; + + return AjaxAdapter; +}); + +S2.define('select2/data/tags',[ + 'jquery' +], function ($) { + function Tags (decorated, $element, options) { + var tags = options.get('tags'); + + var createTag = options.get('createTag'); + + if (createTag !== undefined) { + this.createTag = createTag; + } + + var insertTag = options.get('insertTag'); + + if (insertTag !== undefined) { + this.insertTag = insertTag; + } + + decorated.call(this, $element, options); + + if ($.isArray(tags)) { + for (var t = 0; t < tags.length; t++) { + var tag = tags[t]; + var item = this._normalizeItem(tag); + + var $option = this.option(item); + + this.$element.append($option); + } + } + } + + Tags.prototype.query = function (decorated, params, callback) { + var self = this; + + this._removeOldTags(); + + if (params.term == null || params.page != null) { + decorated.call(this, params, callback); + return; + } + + function wrapper (obj, child) { + var data = obj.results; + + for (var i = 0; i < data.length; i++) { + var option = data[i]; + + var checkChildren = ( + option.children != null && + !wrapper({ + results: option.children + }, true) + ); + + var checkText = option.text === params.term; + + if (checkText || checkChildren) { + if (child) { + return false; + } + + obj.data = data; + callback(obj); + + return; + } + } + + if (child) { + return true; + } + + var tag = self.createTag(params); + + if (tag != null) { + var $option = self.option(tag); + $option.attr('data-select2-tag', true); + + self.addOptions([$option]); + + self.insertTag(data, tag); + } + + obj.results = data; + + callback(obj); + } + + decorated.call(this, params, wrapper); + }; + + Tags.prototype.createTag = function (decorated, params) { + var term = $.trim(params.term); + + if (term === '') { + return null; + } + + return { + id: term, + text: term + }; + }; + + Tags.prototype.insertTag = function (_, data, tag) { + data.unshift(tag); + }; + + Tags.prototype._removeOldTags = function (_) { + var tag = this._lastTag; + + var $options = this.$element.find('option[data-select2-tag]'); + + $options.each(function () { + if (this.selected) { + return; + } + + $(this).remove(); + }); + }; + + return Tags; +}); + +S2.define('select2/data/tokenizer',[ + 'jquery' +], function ($) { + function Tokenizer (decorated, $element, options) { + var tokenizer = options.get('tokenizer'); + + if (tokenizer !== undefined) { + this.tokenizer = tokenizer; + } + + decorated.call(this, $element, options); + } + + Tokenizer.prototype.bind = function (decorated, container, $container) { + decorated.call(this, container, $container); + + this.$search = container.dropdown.$search || container.selection.$search || + $container.find('.select2-search__field'); + }; + + Tokenizer.prototype.query = function (decorated, params, callback) { + var self = this; + + function createAndSelect (data) { + // Normalize the data object so we can use it for checks + var item = self._normalizeItem(data); + + // Check if the data object already exists as a tag + // Select it if it doesn't + var $existingOptions = self.$element.find('option').filter(function () { + return $(this).val() === item.id; + }); + + // If an existing option wasn't found for it, create the option + if (!$existingOptions.length) { + var $option = self.option(item); + $option.attr('data-select2-tag', true); + + self._removeOldTags(); + self.addOptions([$option]); + } + + // Select the item, now that we know there is an option for it + select(item); + } + + function select (data) { + self.trigger('select', { + data: data + }); + } + + params.term = params.term || ''; + + var tokenData = this.tokenizer(params, this.options, createAndSelect); + + if (tokenData.term !== params.term) { + // Replace the search term if we have the search box + if (this.$search.length) { + this.$search.val(tokenData.term); + this.$search.focus(); + } + + params.term = tokenData.term; + } + + decorated.call(this, params, callback); + }; + + Tokenizer.prototype.tokenizer = function (_, params, options, callback) { + var separators = options.get('tokenSeparators') || []; + var term = params.term; + var i = 0; + + var createTag = this.createTag || function (params) { + return { + id: params.term, + text: params.term + }; + }; + + while (i < term.length) { + var termChar = term[i]; + + if ($.inArray(termChar, separators) === -1) { + i++; + + continue; + } + + var part = term.substr(0, i); + var partParams = $.extend({}, params, { + term: part + }); + + var data = createTag(partParams); + + if (data == null) { + i++; + continue; + } + + callback(data); + + // Reset the term to not include the tokenized portion + term = term.substr(i + 1) || ''; + i = 0; + } + + return { + term: term + }; + }; + + return Tokenizer; +}); + +S2.define('select2/data/minimumInputLength',[ + +], function () { + function MinimumInputLength (decorated, $e, options) { + this.minimumInputLength = options.get('minimumInputLength'); + + decorated.call(this, $e, options); + } + + MinimumInputLength.prototype.query = function (decorated, params, callback) { + params.term = params.term || ''; + + if (params.term.length < this.minimumInputLength) { + this.trigger('results:message', { + message: 'inputTooShort', + args: { + minimum: this.minimumInputLength, + input: params.term, + params: params + } + }); + + return; + } + + decorated.call(this, params, callback); + }; + + return MinimumInputLength; +}); + +S2.define('select2/data/maximumInputLength',[ + +], function () { + function MaximumInputLength (decorated, $e, options) { + this.maximumInputLength = options.get('maximumInputLength'); + + decorated.call(this, $e, options); + } + + MaximumInputLength.prototype.query = function (decorated, params, callback) { + params.term = params.term || ''; + + if (this.maximumInputLength > 0 && + params.term.length > this.maximumInputLength) { + this.trigger('results:message', { + message: 'inputTooLong', + args: { + maximum: this.maximumInputLength, + input: params.term, + params: params + } + }); + + return; + } + + decorated.call(this, params, callback); + }; + + return MaximumInputLength; +}); + +S2.define('select2/data/maximumSelectionLength',[ + +], function (){ + function MaximumSelectionLength (decorated, $e, options) { + this.maximumSelectionLength = options.get('maximumSelectionLength'); + + decorated.call(this, $e, options); + } + + MaximumSelectionLength.prototype.query = + function (decorated, params, callback) { + var self = this; + + this.current(function (currentData) { + var count = currentData != null ? currentData.length : 0; + if (self.maximumSelectionLength > 0 && + count >= self.maximumSelectionLength) { + self.trigger('results:message', { + message: 'maximumSelected', + args: { + maximum: self.maximumSelectionLength + } + }); + return; + } + decorated.call(self, params, callback); + }); + }; + + return MaximumSelectionLength; +}); + +S2.define('select2/dropdown',[ + 'jquery', + './utils' +], function ($, Utils) { + function Dropdown ($element, options) { + this.$element = $element; + this.options = options; + + Dropdown.__super__.constructor.call(this); + } + + Utils.Extend(Dropdown, Utils.Observable); + + Dropdown.prototype.render = function () { + var $dropdown = $( + '' + + '' + + '' + ); + + $dropdown.attr('dir', this.options.get('dir')); + + this.$dropdown = $dropdown; + + return $dropdown; + }; + + Dropdown.prototype.bind = function () { + // Should be implemented in subclasses + }; + + Dropdown.prototype.position = function ($dropdown, $container) { + // Should be implmented in subclasses + }; + + Dropdown.prototype.destroy = function () { + // Remove the dropdown from the DOM + this.$dropdown.remove(); + }; + + return Dropdown; +}); + +S2.define('select2/dropdown/search',[ + 'jquery', + '../utils' +], function ($, Utils) { + function Search () { } + + Search.prototype.render = function (decorated) { + var $rendered = decorated.call(this); + + var $search = $( + '' + + '' + + '' + ); + + this.$searchContainer = $search; + this.$search = $search.find('input'); + + $rendered.prepend($search); + + return $rendered; + }; + + Search.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + this.$search.on('keydown', function (evt) { + self.trigger('keypress', evt); + + self._keyUpPrevented = evt.isDefaultPrevented(); + }); + + // Workaround for browsers which do not support the `input` event + // This will prevent double-triggering of events for browsers which support + // both the `keyup` and `input` events. + this.$search.on('input', function (evt) { + // Unbind the duplicated `keyup` event + $(this).off('keyup'); + }); + + this.$search.on('keyup input', function (evt) { + self.handleSearch(evt); + }); + + container.on('open', function () { + self.$search.attr('tabindex', 0); + + self.$search.focus(); + + window.setTimeout(function () { + self.$search.focus(); + }, 0); + }); + + container.on('close', function () { + self.$search.attr('tabindex', -1); + + self.$search.val(''); + }); + + container.on('focus', function () { + if (container.isOpen()) { + self.$search.focus(); + } + }); + + container.on('results:all', function (params) { + if (params.query.term == null || params.query.term === '') { + var showSearch = self.showSearch(params); + + if (showSearch) { + self.$searchContainer.removeClass('select2-search--hide'); + } else { + self.$searchContainer.addClass('select2-search--hide'); + } + } + }); + }; + + Search.prototype.handleSearch = function (evt) { + if (!this._keyUpPrevented) { + var input = this.$search.val(); + + this.trigger('query', { + term: input + }); + } + + this._keyUpPrevented = false; + }; + + Search.prototype.showSearch = function (_, params) { + return true; + }; + + return Search; +}); + +S2.define('select2/dropdown/hidePlaceholder',[ + +], function () { + function HidePlaceholder (decorated, $element, options, dataAdapter) { + this.placeholder = this.normalizePlaceholder(options.get('placeholder')); + + decorated.call(this, $element, options, dataAdapter); + } + + HidePlaceholder.prototype.append = function (decorated, data) { + data.results = this.removePlaceholder(data.results); + + decorated.call(this, data); + }; + + HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) { + if (typeof placeholder === 'string') { + placeholder = { + id: '', + text: placeholder + }; + } + + return placeholder; + }; + + HidePlaceholder.prototype.removePlaceholder = function (_, data) { + var modifiedData = data.slice(0); + + for (var d = data.length - 1; d >= 0; d--) { + var item = data[d]; + + if (this.placeholder.id === item.id) { + modifiedData.splice(d, 1); + } + } + + return modifiedData; + }; + + return HidePlaceholder; +}); + +S2.define('select2/dropdown/infiniteScroll',[ + 'jquery' +], function ($) { + function InfiniteScroll (decorated, $element, options, dataAdapter) { + this.lastParams = {}; + + decorated.call(this, $element, options, dataAdapter); + + this.$loadingMore = this.createLoadingMore(); + this.loading = false; + } + + InfiniteScroll.prototype.append = function (decorated, data) { + this.$loadingMore.remove(); + this.loading = false; + + decorated.call(this, data); + + if (this.showLoadingMore(data)) { + this.$results.append(this.$loadingMore); + } + }; + + InfiniteScroll.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('query', function (params) { + self.lastParams = params; + self.loading = true; + }); + + container.on('query:append', function (params) { + self.lastParams = params; + self.loading = true; + }); + + this.$results.on('scroll', function () { + var isLoadMoreVisible = $.contains( + document.documentElement, + self.$loadingMore[0] + ); + + if (self.loading || !isLoadMoreVisible) { + return; + } + + var currentOffset = self.$results.offset().top + + self.$results.outerHeight(false); + var loadingMoreOffset = self.$loadingMore.offset().top + + self.$loadingMore.outerHeight(false); + + if (currentOffset + 50 >= loadingMoreOffset) { + self.loadMore(); + } + }); + }; + + InfiniteScroll.prototype.loadMore = function () { + this.loading = true; + + var params = $.extend({}, {page: 1}, this.lastParams); + + params.page++; + + this.trigger('query:append', params); + }; + + InfiniteScroll.prototype.showLoadingMore = function (_, data) { + return data.pagination && data.pagination.more; + }; + + InfiniteScroll.prototype.createLoadingMore = function () { + var $option = $( + '
        • ' + ); + + var message = this.options.get('translations').get('loadingMore'); + + $option.html(message(this.lastParams)); + + return $option; + }; + + return InfiniteScroll; +}); + +S2.define('select2/dropdown/attachBody',[ + 'jquery', + '../utils' +], function ($, Utils) { + function AttachBody (decorated, $element, options) { + this.$dropdownParent = options.get('dropdownParent') || $(document.body); + + decorated.call(this, $element, options); + } + + AttachBody.prototype.bind = function (decorated, container, $container) { + var self = this; + + var setupResultsEvents = false; + + decorated.call(this, container, $container); + + container.on('open', function () { + self._showDropdown(); + self._attachPositioningHandler(container); + + if (!setupResultsEvents) { + setupResultsEvents = true; + + container.on('results:all', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('results:append', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + } + }); + + container.on('close', function () { + self._hideDropdown(); + self._detachPositioningHandler(container); + }); + + this.$dropdownContainer.on('mousedown', function (evt) { + evt.stopPropagation(); + }); + }; + + AttachBody.prototype.destroy = function (decorated) { + decorated.call(this); + + this.$dropdownContainer.remove(); + }; + + AttachBody.prototype.position = function (decorated, $dropdown, $container) { + // Clone all of the container classes + $dropdown.attr('class', $container.attr('class')); + + $dropdown.removeClass('select2'); + $dropdown.addClass('select2-container--open'); + + $dropdown.css({ + position: 'absolute', + top: -999999 + }); + + this.$container = $container; + }; + + AttachBody.prototype.render = function (decorated) { + var $container = $(''); + + var $dropdown = decorated.call(this); + $container.append($dropdown); + + this.$dropdownContainer = $container; + + return $container; + }; + + AttachBody.prototype._hideDropdown = function (decorated) { + this.$dropdownContainer.detach(); + }; + + AttachBody.prototype._attachPositioningHandler = + function (decorated, container) { + var self = this; + + var scrollEvent = 'scroll.select2.' + container.id; + var resizeEvent = 'resize.select2.' + container.id; + var orientationEvent = 'orientationchange.select2.' + container.id; + + var $watchers = this.$container.parents().filter(Utils.hasScroll); + $watchers.each(function () { + $(this).data('select2-scroll-position', { + x: $(this).scrollLeft(), + y: $(this).scrollTop() + }); + }); + + $watchers.on(scrollEvent, function (ev) { + var position = $(this).data('select2-scroll-position'); + $(this).scrollTop(position.y); + }); + + $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent, + function (e) { + self._positionDropdown(); + self._resizeDropdown(); + }); + }; + + AttachBody.prototype._detachPositioningHandler = + function (decorated, container) { + var scrollEvent = 'scroll.select2.' + container.id; + var resizeEvent = 'resize.select2.' + container.id; + var orientationEvent = 'orientationchange.select2.' + container.id; + + var $watchers = this.$container.parents().filter(Utils.hasScroll); + $watchers.off(scrollEvent); + + $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent); + }; + + AttachBody.prototype._positionDropdown = function () { + var $window = $(window); + + var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above'); + var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below'); + + var newDirection = null; + + var offset = this.$container.offset(); + + offset.bottom = offset.top + this.$container.outerHeight(false); + + var container = { + height: this.$container.outerHeight(false) + }; + + container.top = offset.top; + container.bottom = offset.top + container.height; + + var dropdown = { + height: this.$dropdown.outerHeight(false) + }; + + var viewport = { + top: $window.scrollTop(), + bottom: $window.scrollTop() + $window.height() + }; + + var enoughRoomAbove = viewport.top < (offset.top - dropdown.height); + var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height); + + var css = { + left: offset.left, + top: container.bottom + }; + + // Determine what the parent element is to use for calciulating the offset + var $offsetParent = this.$dropdownParent; + + // For statically positoned elements, we need to get the element + // that is determining the offset + if ($offsetParent.css('position') === 'static') { + $offsetParent = $offsetParent.offsetParent(); + } + + var parentOffset = $offsetParent.offset(); + + css.top -= parentOffset.top; + css.left -= parentOffset.left; + + if (!isCurrentlyAbove && !isCurrentlyBelow) { + newDirection = 'below'; + } + + if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) { + newDirection = 'above'; + } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) { + newDirection = 'below'; + } + + if (newDirection == 'above' || + (isCurrentlyAbove && newDirection !== 'below')) { + css.top = container.top - parentOffset.top - dropdown.height; + } + + if (newDirection != null) { + this.$dropdown + .removeClass('select2-dropdown--below select2-dropdown--above') + .addClass('select2-dropdown--' + newDirection); + this.$container + .removeClass('select2-container--below select2-container--above') + .addClass('select2-container--' + newDirection); + } + + this.$dropdownContainer.css(css); + }; + + AttachBody.prototype._resizeDropdown = function () { + var css = { + width: this.$container.outerWidth(false) + 'px' + }; + + if (this.options.get('dropdownAutoWidth')) { + css.minWidth = css.width; + css.position = 'relative'; + css.width = 'auto'; + } + + this.$dropdown.css(css); + }; + + AttachBody.prototype._showDropdown = function (decorated) { + this.$dropdownContainer.appendTo(this.$dropdownParent); + + this._positionDropdown(); + this._resizeDropdown(); + }; + + return AttachBody; +}); + +S2.define('select2/dropdown/minimumResultsForSearch',[ + +], function () { + function countResults (data) { + var count = 0; + + for (var d = 0; d < data.length; d++) { + var item = data[d]; + + if (item.children) { + count += countResults(item.children); + } else { + count++; + } + } + + return count; + } + + function MinimumResultsForSearch (decorated, $element, options, dataAdapter) { + this.minimumResultsForSearch = options.get('minimumResultsForSearch'); + + if (this.minimumResultsForSearch < 0) { + this.minimumResultsForSearch = Infinity; + } + + decorated.call(this, $element, options, dataAdapter); + } + + MinimumResultsForSearch.prototype.showSearch = function (decorated, params) { + if (countResults(params.data.results) < this.minimumResultsForSearch) { + return false; + } + + return decorated.call(this, params); + }; + + return MinimumResultsForSearch; +}); + +S2.define('select2/dropdown/selectOnClose',[ + +], function () { + function SelectOnClose () { } + + SelectOnClose.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('close', function (params) { + self._handleSelectOnClose(params); + }); + }; + + SelectOnClose.prototype._handleSelectOnClose = function (_, params) { + if (params && params.originalSelect2Event != null) { + var event = params.originalSelect2Event; + + // Don't select an item if the close event was triggered from a select or + // unselect event + if (event._type === 'select' || event._type === 'unselect') { + return; + } + } + + var $highlightedResults = this.getHighlightedResults(); + + // Only select highlighted results + if ($highlightedResults.length < 1) { + return; + } + + var data = $highlightedResults.data('data'); + + // Don't re-select already selected resulte + if ( + (data.element != null && data.element.selected) || + (data.element == null && data.selected) + ) { + return; + } + + this.trigger('select', { + data: data + }); + }; + + return SelectOnClose; +}); + +S2.define('select2/dropdown/closeOnSelect',[ + +], function () { + function CloseOnSelect () { } + + CloseOnSelect.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('select', function (evt) { + self._selectTriggered(evt); + }); + + container.on('unselect', function (evt) { + self._selectTriggered(evt); + }); + }; + + CloseOnSelect.prototype._selectTriggered = function (_, evt) { + var originalEvent = evt.originalEvent; + + // Don't close if the control key is being held + if (originalEvent && originalEvent.ctrlKey) { + return; + } + + this.trigger('close', { + originalEvent: originalEvent, + originalSelect2Event: evt + }); + }; + + return CloseOnSelect; +}); + +S2.define('select2/i18n/en',[],function () { + // English + return { + errorLoading: function () { + return 'The results could not be loaded.'; + }, + inputTooLong: function (args) { + var overChars = args.input.length - args.maximum; + + var message = 'Please delete ' + overChars + ' character'; + + if (overChars != 1) { + message += 's'; + } + + return message; + }, + inputTooShort: function (args) { + var remainingChars = args.minimum - args.input.length; + + var message = 'Please enter ' + remainingChars + ' or more characters'; + + return message; + }, + loadingMore: function () { + return 'Loading more results…'; + }, + maximumSelected: function (args) { + var message = 'You can only select ' + args.maximum + ' item'; + + if (args.maximum != 1) { + message += 's'; + } + + return message; + }, + noResults: function () { + return 'No results found'; + }, + searching: function () { + return 'Searching…'; + } + }; +}); + +S2.define('select2/defaults',[ + 'jquery', + 'require', + + './results', + + './selection/single', + './selection/multiple', + './selection/placeholder', + './selection/allowClear', + './selection/search', + './selection/eventRelay', + + './utils', + './translation', + './diacritics', + + './data/select', + './data/array', + './data/ajax', + './data/tags', + './data/tokenizer', + './data/minimumInputLength', + './data/maximumInputLength', + './data/maximumSelectionLength', + + './dropdown', + './dropdown/search', + './dropdown/hidePlaceholder', + './dropdown/infiniteScroll', + './dropdown/attachBody', + './dropdown/minimumResultsForSearch', + './dropdown/selectOnClose', + './dropdown/closeOnSelect', + + './i18n/en' +], function ($, require, + + ResultsList, + + SingleSelection, MultipleSelection, Placeholder, AllowClear, + SelectionSearch, EventRelay, + + Utils, Translation, DIACRITICS, + + SelectData, ArrayData, AjaxData, Tags, Tokenizer, + MinimumInputLength, MaximumInputLength, MaximumSelectionLength, + + Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll, + AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect, + + EnglishTranslation) { + function Defaults () { + this.reset(); + } + + Defaults.prototype.apply = function (options) { + options = $.extend(true, {}, this.defaults, options); + + if (options.dataAdapter == null) { + if (options.ajax != null) { + options.dataAdapter = AjaxData; + } else if (options.data != null) { + options.dataAdapter = ArrayData; + } else { + options.dataAdapter = SelectData; + } + + if (options.minimumInputLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MinimumInputLength + ); + } + + if (options.maximumInputLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MaximumInputLength + ); + } + + if (options.maximumSelectionLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MaximumSelectionLength + ); + } + + if (options.tags) { + options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags); + } + + if (options.tokenSeparators != null || options.tokenizer != null) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + Tokenizer + ); + } + + if (options.query != null) { + var Query = require(options.amdBase + 'compat/query'); + + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + Query + ); + } + + if (options.initSelection != null) { + var InitSelection = require(options.amdBase + 'compat/initSelection'); + + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + InitSelection + ); + } + } + + if (options.resultsAdapter == null) { + options.resultsAdapter = ResultsList; + + if (options.ajax != null) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + InfiniteScroll + ); + } + + if (options.placeholder != null) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + HidePlaceholder + ); + } + + if (options.selectOnClose) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + SelectOnClose + ); + } + } + + if (options.dropdownAdapter == null) { + if (options.multiple) { + options.dropdownAdapter = Dropdown; + } else { + var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch); + + options.dropdownAdapter = SearchableDropdown; + } + + if (options.minimumResultsForSearch !== 0) { + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + MinimumResultsForSearch + ); + } + + if (options.closeOnSelect) { + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + CloseOnSelect + ); + } + + if ( + options.dropdownCssClass != null || + options.dropdownCss != null || + options.adaptDropdownCssClass != null + ) { + var DropdownCSS = require(options.amdBase + 'compat/dropdownCss'); + + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + DropdownCSS + ); + } + + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + AttachBody + ); + } + + if (options.selectionAdapter == null) { + if (options.multiple) { + options.selectionAdapter = MultipleSelection; + } else { + options.selectionAdapter = SingleSelection; + } + + // Add the placeholder mixin if a placeholder was specified + if (options.placeholder != null) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + Placeholder + ); + } + + if (options.allowClear) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + AllowClear + ); + } + + if (options.multiple) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + SelectionSearch + ); + } + + if ( + options.containerCssClass != null || + options.containerCss != null || + options.adaptContainerCssClass != null + ) { + var ContainerCSS = require(options.amdBase + 'compat/containerCss'); + + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + ContainerCSS + ); + } + + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + EventRelay + ); + } + + if (typeof options.language === 'string') { + // Check if the language is specified with a region + if (options.language.indexOf('-') > 0) { + // Extract the region information if it is included + var languageParts = options.language.split('-'); + var baseLanguage = languageParts[0]; + + options.language = [options.language, baseLanguage]; + } else { + options.language = [options.language]; + } + } + + if ($.isArray(options.language)) { + var languages = new Translation(); + options.language.push('en'); + + var languageNames = options.language; + + for (var l = 0; l < languageNames.length; l++) { + var name = languageNames[l]; + var language = {}; + + try { + // Try to load it with the original name + language = Translation.loadPath(name); + } catch (e) { + try { + // If we couldn't load it, check if it wasn't the full path + name = this.defaults.amdLanguageBase + name; + language = Translation.loadPath(name); + } catch (ex) { + // The translation could not be loaded at all. Sometimes this is + // because of a configuration problem, other times this can be + // because of how Select2 helps load all possible translation files. + if (options.debug && window.console && console.warn) { + console.warn( + 'Select2: The language file for "' + name + '" could not be ' + + 'automatically loaded. A fallback will be used instead.' + ); + } + + continue; + } + } + + languages.extend(language); + } + + options.translations = languages; + } else { + var baseTranslation = Translation.loadPath( + this.defaults.amdLanguageBase + 'en' + ); + var customTranslation = new Translation(options.language); + + customTranslation.extend(baseTranslation); + + options.translations = customTranslation; + } + + return options; + }; + + Defaults.prototype.reset = function () { + function stripDiacritics (text) { + // Used 'uni range + named function' from http://jsperf.com/diacritics/18 + function match(a) { + return DIACRITICS[a] || a; + } + + return text.replace(/[^\u0000-\u007E]/g, match); + } + + function matcher (params, data) { + // Always return the object if there is nothing to compare + if ($.trim(params.term) === '') { + return data; + } + + // Do a recursive check for options with children + if (data.children && data.children.length > 0) { + // Clone the data object if there are children + // This is required as we modify the object to remove any non-matches + var match = $.extend(true, {}, data); + + // Check each child of the option + for (var c = data.children.length - 1; c >= 0; c--) { + var child = data.children[c]; + + var matches = matcher(params, child); + + // If there wasn't a match, remove the object in the array + if (matches == null) { + match.children.splice(c, 1); + } + } + + // If any children matched, return the new object + if (match.children.length > 0) { + return match; + } + + // If there were no matching children, check just the plain object + return matcher(params, match); + } + + var original = stripDiacritics(data.text).toUpperCase(); + var term = stripDiacritics(params.term).toUpperCase(); + + // Check if the text contains the term + if (original.indexOf(term) > -1) { + return data; + } + + // If it doesn't contain the term, don't return anything + return null; + } + + this.defaults = { + amdBase: './', + amdLanguageBase: './i18n/', + closeOnSelect: true, + debug: false, + dropdownAutoWidth: false, + escapeMarkup: Utils.escapeMarkup, + language: EnglishTranslation, + matcher: matcher, + minimumInputLength: 0, + maximumInputLength: 0, + maximumSelectionLength: 0, + minimumResultsForSearch: 0, + selectOnClose: false, + sorter: function (data) { + return data; + }, + templateResult: function (result) { + return result.text; + }, + templateSelection: function (selection) { + return selection.text; + }, + theme: 'default', + width: 'resolve' + }; + }; + + Defaults.prototype.set = function (key, value) { + var camelKey = $.camelCase(key); + + var data = {}; + data[camelKey] = value; + + var convertedData = Utils._convertData(data); + + $.extend(this.defaults, convertedData); + }; + + var defaults = new Defaults(); + + return defaults; +}); + +S2.define('select2/options',[ + 'require', + 'jquery', + './defaults', + './utils' +], function (require, $, Defaults, Utils) { + function Options (options, $element) { + this.options = options; + + if ($element != null) { + this.fromElement($element); + } + + this.options = Defaults.apply(this.options); + + if ($element && $element.is('input')) { + var InputCompat = require(this.get('amdBase') + 'compat/inputData'); + + this.options.dataAdapter = Utils.Decorate( + this.options.dataAdapter, + InputCompat + ); + } + } + + Options.prototype.fromElement = function ($e) { + var excludedData = ['select2']; + + if (this.options.multiple == null) { + this.options.multiple = $e.prop('multiple'); + } + + if (this.options.disabled == null) { + this.options.disabled = $e.prop('disabled'); + } + + if (this.options.language == null) { + if ($e.prop('lang')) { + this.options.language = $e.prop('lang').toLowerCase(); + } else if ($e.closest('[lang]').prop('lang')) { + this.options.language = $e.closest('[lang]').prop('lang'); + } + } + + if (this.options.dir == null) { + if ($e.prop('dir')) { + this.options.dir = $e.prop('dir'); + } else if ($e.closest('[dir]').prop('dir')) { + this.options.dir = $e.closest('[dir]').prop('dir'); + } else { + this.options.dir = 'ltr'; + } + } + + $e.prop('disabled', this.options.disabled); + $e.prop('multiple', this.options.multiple); + + if ($e.data('select2Tags')) { + if (this.options.debug && window.console && console.warn) { + console.warn( + 'Select2: The `data-select2-tags` attribute has been changed to ' + + 'use the `data-data` and `data-tags="true"` attributes and will be ' + + 'removed in future versions of Select2.' + ); + } + + $e.data('data', $e.data('select2Tags')); + $e.data('tags', true); + } + + if ($e.data('ajaxUrl')) { + if (this.options.debug && window.console && console.warn) { + console.warn( + 'Select2: The `data-ajax-url` attribute has been changed to ' + + '`data-ajax--url` and support for the old attribute will be removed' + + ' in future versions of Select2.' + ); + } + + $e.attr('ajax--url', $e.data('ajaxUrl')); + $e.data('ajax--url', $e.data('ajaxUrl')); + } + + var dataset = {}; + + // Prefer the element's `dataset` attribute if it exists + // jQuery 1.x does not correctly handle data attributes with multiple dashes + if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { + dataset = $.extend(true, {}, $e[0].dataset, $e.data()); + } else { + dataset = $e.data(); + } + + var data = $.extend(true, {}, dataset); + + data = Utils._convertData(data); + + for (var key in data) { + if ($.inArray(key, excludedData) > -1) { + continue; + } + + if ($.isPlainObject(this.options[key])) { + $.extend(this.options[key], data[key]); + } else { + this.options[key] = data[key]; + } + } + + return this; + }; + + Options.prototype.get = function (key) { + return this.options[key]; + }; + + Options.prototype.set = function (key, val) { + this.options[key] = val; + }; + + return Options; +}); + +S2.define('select2/core',[ + 'jquery', + './options', + './utils', + './keys' +], function ($, Options, Utils, KEYS) { + var Select2 = function ($element, options) { + if ($element.data('select2') != null) { + $element.data('select2').destroy(); + } + + this.$element = $element; + + this.id = this._generateId($element); + + options = options || {}; + + this.options = new Options(options, $element); + + Select2.__super__.constructor.call(this); + + // Set up the tabindex + + var tabindex = $element.attr('tabindex') || 0; + $element.data('old-tabindex', tabindex); + $element.attr('tabindex', '-1'); + + // Set up containers and adapters + + var DataAdapter = this.options.get('dataAdapter'); + this.dataAdapter = new DataAdapter($element, this.options); + + var $container = this.render(); + + this._placeContainer($container); + + var SelectionAdapter = this.options.get('selectionAdapter'); + this.selection = new SelectionAdapter($element, this.options); + this.$selection = this.selection.render(); + + this.selection.position(this.$selection, $container); + + var DropdownAdapter = this.options.get('dropdownAdapter'); + this.dropdown = new DropdownAdapter($element, this.options); + this.$dropdown = this.dropdown.render(); + + this.dropdown.position(this.$dropdown, $container); + + var ResultsAdapter = this.options.get('resultsAdapter'); + this.results = new ResultsAdapter($element, this.options, this.dataAdapter); + this.$results = this.results.render(); + + this.results.position(this.$results, this.$dropdown); + + // Bind events + + var self = this; + + // Bind the container to all of the adapters + this._bindAdapters(); + + // Register any DOM event handlers + this._registerDomEvents(); + + // Register any internal event handlers + this._registerDataEvents(); + this._registerSelectionEvents(); + this._registerDropdownEvents(); + this._registerResultsEvents(); + this._registerEvents(); + + // Set the initial state + this.dataAdapter.current(function (initialData) { + self.trigger('selection:update', { + data: initialData + }); + }); + + // Hide the original select + $element.addClass('select2-hidden-accessible'); + $element.attr('aria-hidden', 'true'); + + // Synchronize any monitored attributes + this._syncAttributes(); + + $element.data('select2', this); + }; + + Utils.Extend(Select2, Utils.Observable); + + Select2.prototype._generateId = function ($element) { + var id = ''; + + if ($element.attr('id') != null) { + id = $element.attr('id'); + } else if ($element.attr('name') != null) { + id = $element.attr('name') + '-' + Utils.generateChars(2); + } else { + id = Utils.generateChars(4); + } + + id = id.replace(/(:|\.|\[|\]|,)/g, ''); + id = 'select2-' + id; + + return id; + }; + + Select2.prototype._placeContainer = function ($container) { + $container.insertAfter(this.$element); + + var width = this._resolveWidth(this.$element, this.options.get('width')); + + if (width != null) { + $container.css('width', width); + } + }; + + Select2.prototype._resolveWidth = function ($element, method) { + var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i; + + if (method == 'resolve') { + var styleWidth = this._resolveWidth($element, 'style'); + + if (styleWidth != null) { + return styleWidth; + } + + return this._resolveWidth($element, 'element'); + } + + if (method == 'element') { + var elementWidth = $element.outerWidth(false); + + if (elementWidth <= 0) { + return 'auto'; + } + + return elementWidth + 'px'; + } + + if (method == 'style') { + var style = $element.attr('style'); + + if (typeof(style) !== 'string') { + return null; + } + + var attrs = style.split(';'); + + for (var i = 0, l = attrs.length; i < l; i = i + 1) { + var attr = attrs[i].replace(/\s/g, ''); + var matches = attr.match(WIDTH); + + if (matches !== null && matches.length >= 1) { + return matches[1]; + } + } + + return null; + } + + return method; + }; + + Select2.prototype._bindAdapters = function () { + this.dataAdapter.bind(this, this.$container); + this.selection.bind(this, this.$container); + + this.dropdown.bind(this, this.$container); + this.results.bind(this, this.$container); + }; + + Select2.prototype._registerDomEvents = function () { + var self = this; + + this.$element.on('change.select2', function () { + self.dataAdapter.current(function (data) { + self.trigger('selection:update', { + data: data + }); + }); + }); + + this.$element.on('focus.select2', function (evt) { + self.trigger('focus', evt); + }); + + this._syncA = Utils.bind(this._syncAttributes, this); + this._syncS = Utils.bind(this._syncSubtree, this); + + if (this.$element[0].attachEvent) { + this.$element[0].attachEvent('onpropertychange', this._syncA); + } + + var observer = window.MutationObserver || + window.WebKitMutationObserver || + window.MozMutationObserver + ; + + if (observer != null) { + this._observer = new observer(function (mutations) { + $.each(mutations, self._syncA); + $.each(mutations, self._syncS); + }); + this._observer.observe(this.$element[0], { + attributes: true, + childList: true, + subtree: false + }); + } else if (this.$element[0].addEventListener) { + this.$element[0].addEventListener( + 'DOMAttrModified', + self._syncA, + false + ); + this.$element[0].addEventListener( + 'DOMNodeInserted', + self._syncS, + false + ); + this.$element[0].addEventListener( + 'DOMNodeRemoved', + self._syncS, + false + ); + } + }; + + Select2.prototype._registerDataEvents = function () { + var self = this; + + this.dataAdapter.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerSelectionEvents = function () { + var self = this; + var nonRelayEvents = ['toggle', 'focus']; + + this.selection.on('toggle', function () { + self.toggleDropdown(); + }); + + this.selection.on('focus', function (params) { + self.focus(params); + }); + + this.selection.on('*', function (name, params) { + if ($.inArray(name, nonRelayEvents) !== -1) { + return; + } + + self.trigger(name, params); + }); + }; + + Select2.prototype._registerDropdownEvents = function () { + var self = this; + + this.dropdown.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerResultsEvents = function () { + var self = this; + + this.results.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerEvents = function () { + var self = this; + + this.on('open', function () { + self.$container.addClass('select2-container--open'); + }); + + this.on('close', function () { + self.$container.removeClass('select2-container--open'); + }); + + this.on('enable', function () { + self.$container.removeClass('select2-container--disabled'); + }); + + this.on('disable', function () { + self.$container.addClass('select2-container--disabled'); + }); + + this.on('blur', function () { + self.$container.removeClass('select2-container--focus'); + }); + + this.on('query', function (params) { + if (!self.isOpen()) { + self.trigger('open', {}); + } + + this.dataAdapter.query(params, function (data) { + self.trigger('results:all', { + data: data, + query: params + }); + }); + }); + + this.on('query:append', function (params) { + this.dataAdapter.query(params, function (data) { + self.trigger('results:append', { + data: data, + query: params + }); + }); + }); + + this.on('keypress', function (evt) { + var key = evt.which; + + if (self.isOpen()) { + if (key === KEYS.ESC || key === KEYS.TAB || + (key === KEYS.UP && evt.altKey)) { + self.close(); + + evt.preventDefault(); + } else if (key === KEYS.ENTER) { + self.trigger('results:select', {}); + + evt.preventDefault(); + } else if ((key === KEYS.SPACE && evt.ctrlKey)) { + self.trigger('results:toggle', {}); + + evt.preventDefault(); + } else if (key === KEYS.UP) { + self.trigger('results:previous', {}); + + evt.preventDefault(); + } else if (key === KEYS.DOWN) { + self.trigger('results:next', {}); + + evt.preventDefault(); + } + } else { + if (key === KEYS.ENTER || key === KEYS.SPACE || + (key === KEYS.DOWN && evt.altKey)) { + self.open(); + + evt.preventDefault(); + } + } + }); + }; + + Select2.prototype._syncAttributes = function () { + this.options.set('disabled', this.$element.prop('disabled')); + + if (this.options.get('disabled')) { + if (this.isOpen()) { + this.close(); + } + + this.trigger('disable', {}); + } else { + this.trigger('enable', {}); + } + }; + + Select2.prototype._syncSubtree = function (evt, mutations) { + var changed = false; + var self = this; + + // Ignore any mutation events raised for elements that aren't options or + // optgroups. This handles the case when the select element is destroyed + if ( + evt && evt.target && ( + evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP' + ) + ) { + return; + } + + if (!mutations) { + // If mutation events aren't supported, then we can only assume that the + // change affected the selections + changed = true; + } else if (mutations.addedNodes && mutations.addedNodes.length > 0) { + for (var n = 0; n < mutations.addedNodes.length; n++) { + var node = mutations.addedNodes[n]; + + if (node.selected) { + changed = true; + } + } + } else if (mutations.removedNodes && mutations.removedNodes.length > 0) { + changed = true; + } + + // Only re-pull the data if we think there is a change + if (changed) { + this.dataAdapter.current(function (currentData) { + self.trigger('selection:update', { + data: currentData + }); + }); + } + }; + + /** + * Override the trigger method to automatically trigger pre-events when + * there are events that can be prevented. + */ + Select2.prototype.trigger = function (name, args) { + var actualTrigger = Select2.__super__.trigger; + var preTriggerMap = { + 'open': 'opening', + 'close': 'closing', + 'select': 'selecting', + 'unselect': 'unselecting' + }; + + if (args === undefined) { + args = {}; + } + + if (name in preTriggerMap) { + var preTriggerName = preTriggerMap[name]; + var preTriggerArgs = { + prevented: false, + name: name, + args: args + }; + + actualTrigger.call(this, preTriggerName, preTriggerArgs); + + if (preTriggerArgs.prevented) { + args.prevented = true; + + return; + } + } + + actualTrigger.call(this, name, args); + }; + + Select2.prototype.toggleDropdown = function () { + if (this.options.get('disabled')) { + return; + } + + if (this.isOpen()) { + this.close(); + } else { + this.open(); + } + }; + + Select2.prototype.open = function () { + if (this.isOpen()) { + return; + } + + this.trigger('query', {}); + }; + + Select2.prototype.close = function () { + if (!this.isOpen()) { + return; + } + + this.trigger('close', {}); + }; + + Select2.prototype.isOpen = function () { + return this.$container.hasClass('select2-container--open'); + }; + + Select2.prototype.hasFocus = function () { + return this.$container.hasClass('select2-container--focus'); + }; + + Select2.prototype.focus = function (data) { + // No need to re-trigger focus events if we are already focused + if (this.hasFocus()) { + return; + } + + this.$container.addClass('select2-container--focus'); + this.trigger('focus', {}); + }; + + Select2.prototype.enable = function (args) { + if (this.options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `select2("enable")` method has been deprecated and will' + + ' be removed in later Select2 versions. Use $element.prop("disabled")' + + ' instead.' + ); + } + + if (args == null || args.length === 0) { + args = [true]; + } + + var disabled = !args[0]; + + this.$element.prop('disabled', disabled); + }; + + Select2.prototype.data = function () { + if (this.options.get('debug') && + arguments.length > 0 && window.console && console.warn) { + console.warn( + 'Select2: Data can no longer be set using `select2("data")`. You ' + + 'should consider setting the value instead using `$element.val()`.' + ); + } + + var data = []; + + this.dataAdapter.current(function (currentData) { + data = currentData; + }); + + return data; + }; + + Select2.prototype.val = function (args) { + if (this.options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `select2("val")` method has been deprecated and will be' + + ' removed in later Select2 versions. Use $element.val() instead.' + ); + } + + if (args == null || args.length === 0) { + return this.$element.val(); + } + + var newVal = args[0]; + + if ($.isArray(newVal)) { + newVal = $.map(newVal, function (obj) { + return obj.toString(); + }); + } + + this.$element.val(newVal).trigger('change'); + }; + + Select2.prototype.destroy = function () { + this.$container.remove(); + + if (this.$element[0].detachEvent) { + this.$element[0].detachEvent('onpropertychange', this._syncA); + } + + if (this._observer != null) { + this._observer.disconnect(); + this._observer = null; + } else if (this.$element[0].removeEventListener) { + this.$element[0] + .removeEventListener('DOMAttrModified', this._syncA, false); + this.$element[0] + .removeEventListener('DOMNodeInserted', this._syncS, false); + this.$element[0] + .removeEventListener('DOMNodeRemoved', this._syncS, false); + } + + this._syncA = null; + this._syncS = null; + + this.$element.off('.select2'); + this.$element.attr('tabindex', this.$element.data('old-tabindex')); + + this.$element.removeClass('select2-hidden-accessible'); + this.$element.attr('aria-hidden', 'false'); + this.$element.removeData('select2'); + + this.dataAdapter.destroy(); + this.selection.destroy(); + this.dropdown.destroy(); + this.results.destroy(); + + this.dataAdapter = null; + this.selection = null; + this.dropdown = null; + this.results = null; + }; + + Select2.prototype.render = function () { + var $container = $( + '' + + '' + + '' + + '' + ); + + $container.attr('dir', this.options.get('dir')); + + this.$container = $container; + + this.$container.addClass('select2-container--' + this.options.get('theme')); + + $container.data('element', this.$element); + + return $container; + }; + + return Select2; +}); + +S2.define('jquery-mousewheel',[ + 'jquery' +], function ($) { + // Used to shim jQuery.mousewheel for non-full builds. + return $; +}); + +S2.define('jquery.select2',[ + 'jquery', + 'jquery-mousewheel', + + './select2/core', + './select2/defaults' +], function ($, _, Select2, Defaults) { + if ($.fn.select2 == null) { + // All methods that should return the element + var thisMethods = ['open', 'close', 'destroy']; + + $.fn.select2 = function (options) { + options = options || {}; + + if (typeof options === 'object') { + this.each(function () { + var instanceOptions = $.extend(true, {}, options); + + var instance = new Select2($(this), instanceOptions); + }); + + return this; + } else if (typeof options === 'string') { + var ret; + var args = Array.prototype.slice.call(arguments, 1); + + this.each(function () { + var instance = $(this).data('select2'); + + if (instance == null && window.console && console.error) { + console.error( + 'The select2(\'' + options + '\') method was called on an ' + + 'element that is not using Select2.' + ); + } + + ret = instance[options].apply(instance, args); + }); + + // Check if we should be returning `this` + if ($.inArray(options, thisMethods) > -1) { + return this; + } + + return ret; + } else { + throw new Error('Invalid arguments for Select2: ' + options); + } + }; + } + + if ($.fn.select2.defaults == null) { + $.fn.select2.defaults = Defaults; + } + + return Select2; +}); + + // Return the AMD loader configuration so it can be used outside of this file + return { + define: S2.define, + require: S2.require + }; +}()); + + // Autoload the jQuery bindings + // We know that all of the modules exist above this, so we're safe + var select2 = S2.require('jquery.select2'); + + // Hold the AMD module references on the jQuery function that was just loaded + // This allows Select2 to use the internal loader outside of this file, such + // as in the language files. + jQuery.fn.select2.amd = S2; + + // Return the Select2 instance for anyone who is importing it. + return select2; +})); diff --git a/styles/bootstrap/select2/js/select2.min.js b/styles/bootstrap/select2/js/select2.min.js new file mode 100644 index 000000000..43f0a651e --- /dev/null +++ b/styles/bootstrap/select2/js/select2.min.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):jQuery)}(function(a){var b=function(){if(a&&a.fn&&a.fn.select2&&a.fn.select2.amd)var b=a.fn.select2.amd;var b;return function(){if(!b||!b.requirejs){b?c=b:b={};var a,c,d;!function(b){function e(a,b){return u.call(a,b)}function f(a,b){var c,d,e,f,g,h,i,j,k,l,m,n=b&&b.split("/"),o=s.map,p=o&&o["*"]||{};if(a&&"."===a.charAt(0))if(b){for(a=a.split("/"),g=a.length-1,s.nodeIdCompat&&w.test(a[g])&&(a[g]=a[g].replace(w,"")),a=n.slice(0,n.length-1).concat(a),k=0;k0&&(a.splice(k-1,2),k-=2)}a=a.join("/")}else 0===a.indexOf("./")&&(a=a.substring(2));if((n||p)&&o){for(c=a.split("/"),k=c.length;k>0;k-=1){if(d=c.slice(0,k).join("/"),n)for(l=n.length;l>0;l-=1)if(e=o[n.slice(0,l).join("/")],e&&(e=e[d])){f=e,h=k;break}if(f)break;!i&&p&&p[d]&&(i=p[d],j=k)}!f&&i&&(f=i,h=j),f&&(c.splice(0,h,f),a=c.join("/"))}return a}function g(a,c){return function(){var d=v.call(arguments,0);return"string"!=typeof d[0]&&1===d.length&&d.push(null),n.apply(b,d.concat([a,c]))}}function h(a){return function(b){return f(b,a)}}function i(a){return function(b){q[a]=b}}function j(a){if(e(r,a)){var c=r[a];delete r[a],t[a]=!0,m.apply(b,c)}if(!e(q,a)&&!e(t,a))throw new Error("No "+a);return q[a]}function k(a){var b,c=a?a.indexOf("!"):-1;return c>-1&&(b=a.substring(0,c),a=a.substring(c+1,a.length)),[b,a]}function l(a){return function(){return s&&s.config&&s.config[a]||{}}}var m,n,o,p,q={},r={},s={},t={},u=Object.prototype.hasOwnProperty,v=[].slice,w=/\.js$/;o=function(a,b){var c,d=k(a),e=d[0];return a=d[1],e&&(e=f(e,b),c=j(e)),e?a=c&&c.normalize?c.normalize(a,h(b)):f(a,b):(a=f(a,b),d=k(a),e=d[0],a=d[1],e&&(c=j(e))),{f:e?e+"!"+a:a,n:a,pr:e,p:c}},p={require:function(a){return g(a)},exports:function(a){var b=q[a];return"undefined"!=typeof b?b:q[a]={}},module:function(a){return{id:a,uri:"",exports:q[a],config:l(a)}}},m=function(a,c,d,f){var h,k,l,m,n,s,u=[],v=typeof d;if(f=f||a,"undefined"===v||"function"===v){for(c=!c.length&&d.length?["require","exports","module"]:c,n=0;n0&&(b.call(arguments,a.prototype.constructor),e=c.prototype.constructor),e.apply(this,arguments)}function e(){this.constructor=d}var f=b(c),g=b(a);c.displayName=a.displayName,d.prototype=new e;for(var h=0;hc;c++)a[c].apply(this,b)},c.Observable=d,c.generateChars=function(a){for(var b="",c=0;a>c;c++){var d=Math.floor(36*Math.random());b+=d.toString(36)}return b},c.bind=function(a,b){return function(){a.apply(b,arguments)}},c._convertData=function(a){for(var b in a){var c=b.split("-"),d=a;if(1!==c.length){for(var e=0;e":">",'"':""","'":"'","/":"/"};return"string"!=typeof a?a:String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})},c.appendMany=function(b,c){if("1.7"===a.fn.jquery.substr(0,3)){var d=a();a.map(c,function(a){d=d.add(a)}),c=d}b.append(c)},c}),b.define("select2/results",["jquery","./utils"],function(a,b){function c(a,b,d){this.$element=a,this.data=d,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('
            ');return this.options.get("multiple")&&b.attr("aria-multiselectable","true"),this.$results=b,b},c.prototype.clear=function(){this.$results.empty()},c.prototype.displayMessage=function(b){var c=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var d=a('
          • '),e=this.options.get("translations").get(b.message);d.append(c(e(b.args))),d[0].className+=" select2-results__message",this.$results.append(d)},c.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},c.prototype.append=function(a){this.hideLoading();var b=[];if(null==a.results||0===a.results.length)return void(0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"}));a.results=this.sort(a.results);for(var c=0;c0?b.first().trigger("mouseenter"):a.first().trigger("mouseenter"),this.ensureHighlightVisible()},c.prototype.setClasses=function(){var b=this;this.data.current(function(c){var d=a.map(c,function(a){return a.id.toString()}),e=b.$results.find(".select2-results__option[aria-selected]");e.each(function(){var b=a(this),c=a.data(this,"data"),e=""+c.id;null!=c.element&&c.element.selected||null==c.element&&a.inArray(e,d)>-1?b.attr("aria-selected","true"):b.attr("aria-selected","false")})})},c.prototype.showLoading=function(a){this.hideLoading();var b=this.options.get("translations").get("searching"),c={disabled:!0,loading:!0,text:b(a)},d=this.option(c);d.className+=" loading-results",this.$results.prepend(d)},c.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},c.prototype.option=function(b){var c=document.createElement("li");c.className="select2-results__option";var d={role:"treeitem","aria-selected":"false"};b.disabled&&(delete d["aria-selected"],d["aria-disabled"]="true"),null==b.id&&delete d["aria-selected"],null!=b._resultId&&(c.id=b._resultId),b.title&&(c.title=b.title),b.children&&(d.role="group",d["aria-label"]=b.text,delete d["aria-selected"]);for(var e in d){var f=d[e];c.setAttribute(e,f)}if(b.children){var g=a(c),h=document.createElement("strong");h.className="select2-results__group";a(h);this.template(b,h);for(var i=[],j=0;j",{"class":"select2-results__options select2-results__options--nested"});m.append(i),g.append(h),g.append(m)}else this.template(b,c);return a.data(c,"data",b),c},c.prototype.bind=function(b,c){var d=this,e=b.id+"-results";this.$results.attr("id",e),b.on("results:all",function(a){d.clear(),d.append(a.data),b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("results:append",function(a){d.append(a.data),b.isOpen()&&d.setClasses()}),b.on("query",function(a){d.hideMessages(),d.showLoading(a)}),b.on("select",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("unselect",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("open",function(){d.$results.attr("aria-expanded","true"),d.$results.attr("aria-hidden","false"),d.setClasses(),d.ensureHighlightVisible()}),b.on("close",function(){d.$results.attr("aria-expanded","false"),d.$results.attr("aria-hidden","true"),d.$results.removeAttr("aria-activedescendant")}),b.on("results:toggle",function(){var a=d.getHighlightedResults();0!==a.length&&a.trigger("mouseup")}),b.on("results:select",function(){var a=d.getHighlightedResults();if(0!==a.length){var b=a.data("data");"true"==a.attr("aria-selected")?d.trigger("close",{}):d.trigger("select",{data:b})}}),b.on("results:previous",function(){var a=d.getHighlightedResults(),b=d.$results.find("[aria-selected]"),c=b.index(a);if(0!==c){var e=c-1;0===a.length&&(e=0);var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top,h=f.offset().top,i=d.$results.scrollTop()+(h-g);0===e?d.$results.scrollTop(0):0>h-g&&d.$results.scrollTop(i)}}),b.on("results:next",function(){var a=d.getHighlightedResults(),b=d.$results.find("[aria-selected]"),c=b.index(a),e=c+1;if(!(e>=b.length)){var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top+d.$results.outerHeight(!1),h=f.offset().top+f.outerHeight(!1),i=d.$results.scrollTop()+h-g;0===e?d.$results.scrollTop(0):h>g&&d.$results.scrollTop(i)}}),b.on("results:focus",function(a){a.element.addClass("select2-results__option--highlighted")}),b.on("results:message",function(a){d.displayMessage(a)}),a.fn.mousewheel&&this.$results.on("mousewheel",function(a){var b=d.$results.scrollTop(),c=d.$results.get(0).scrollHeight-b+a.deltaY,e=a.deltaY>0&&b-a.deltaY<=0,f=a.deltaY<0&&c<=d.$results.height();e?(d.$results.scrollTop(0),a.preventDefault(),a.stopPropagation()):f&&(d.$results.scrollTop(d.$results.get(0).scrollHeight-d.$results.height()),a.preventDefault(),a.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(b){var c=a(this),e=c.data("data");return"true"===c.attr("aria-selected")?void(d.options.get("multiple")?d.trigger("unselect",{originalEvent:b,data:e}):d.trigger("close",{})):void d.trigger("select",{originalEvent:b,data:e})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(b){var c=a(this).data("data");d.getHighlightedResults().removeClass("select2-results__option--highlighted"),d.trigger("results:focus",{data:c,element:a(this)})})},c.prototype.getHighlightedResults=function(){var a=this.$results.find(".select2-results__option--highlighted");return a},c.prototype.destroy=function(){this.$results.remove()},c.prototype.ensureHighlightVisible=function(){var a=this.getHighlightedResults();if(0!==a.length){var b=this.$results.find("[aria-selected]"),c=b.index(a),d=this.$results.offset().top,e=a.offset().top,f=this.$results.scrollTop()+(e-d),g=e-d;f-=2*a.outerHeight(!1),2>=c?this.$results.scrollTop(0):(g>this.$results.outerHeight()||0>g)&&this.$results.scrollTop(f)}},c.prototype.template=function(b,c){var d=this.options.get("templateResult"),e=this.options.get("escapeMarkup"),f=d(b,c);null==f?c.style.display="none":"string"==typeof f?c.innerHTML=e(f):a(c).append(f)},c}),b.define("select2/keys",[],function(){var a={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46};return a}),b.define("select2/selection/base",["jquery","../utils","../keys"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,b.Observable),d.prototype.render=function(){var b=a('');return this._tabindex=0,null!=this.$element.data("old-tabindex")?this._tabindex=this.$element.data("old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),b.attr("title",this.$element.attr("title")),b.attr("tabindex",this._tabindex),this.$selection=b,b},d.prototype.bind=function(a,b){var d=this,e=(a.id+"-container",a.id+"-results");this.container=a,this.$selection.on("focus",function(a){d.trigger("focus",a)}),this.$selection.on("blur",function(a){d._handleBlur(a)}),this.$selection.on("keydown",function(a){d.trigger("keypress",a),a.which===c.SPACE&&a.preventDefault()}),a.on("results:focus",function(a){d.$selection.attr("aria-activedescendant",a.data._resultId)}),a.on("selection:update",function(a){d.update(a.data)}),a.on("open",function(){d.$selection.attr("aria-expanded","true"),d.$selection.attr("aria-owns",e),d._attachCloseHandler(a)}),a.on("close",function(){d.$selection.attr("aria-expanded","false"),d.$selection.removeAttr("aria-activedescendant"),d.$selection.removeAttr("aria-owns"),d.$selection.focus(),d._detachCloseHandler(a)}),a.on("enable",function(){d.$selection.attr("tabindex",d._tabindex)}),a.on("disable",function(){d.$selection.attr("tabindex","-1")})},d.prototype._handleBlur=function(b){var c=this;window.setTimeout(function(){document.activeElement==c.$selection[0]||a.contains(c.$selection[0],document.activeElement)||c.trigger("blur",b)},1)},d.prototype._attachCloseHandler=function(b){a(document.body).on("mousedown.select2."+b.id,function(b){var c=a(b.target),d=c.closest(".select2"),e=a(".select2.select2-container--open");e.each(function(){var b=a(this);if(this!=d[0]){var c=b.data("element");c.select2("close")}})})},d.prototype._detachCloseHandler=function(b){a(document.body).off("mousedown.select2."+b.id)},d.prototype.position=function(a,b){var c=b.find(".selection");c.append(a)},d.prototype.destroy=function(){this._detachCloseHandler(this.container)},d.prototype.update=function(a){throw new Error("The `update` method must be defined in child classes.")},d}),b.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(a,b,c,d){function e(){e.__super__.constructor.apply(this,arguments)}return c.Extend(e,b),e.prototype.render=function(){var a=e.__super__.render.call(this);return a.addClass("select2-selection--single"),a.html(''),a},e.prototype.bind=function(a,b){var c=this;e.__super__.bind.apply(this,arguments);var d=a.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",d),this.$selection.attr("aria-labelledby",d),this.$selection.on("mousedown",function(a){1===a.which&&c.trigger("toggle",{originalEvent:a})}),this.$selection.on("focus",function(a){}),this.$selection.on("blur",function(a){}),a.on("focus",function(b){a.isOpen()||c.$selection.focus()}),a.on("selection:update",function(a){c.update(a.data)})},e.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},e.prototype.display=function(a,b){var c=this.options.get("templateSelection"),d=this.options.get("escapeMarkup");return d(c(a,b))},e.prototype.selectionContainer=function(){return a("")},e.prototype.update=function(a){if(0===a.length)return void this.clear();var b=a[0],c=this.$selection.find(".select2-selection__rendered"),d=this.display(b,c);c.empty().append(d),c.prop("title",b.title||b.text)},e}),b.define("select2/selection/multiple",["jquery","./base","../utils"],function(a,b,c){function d(a,b){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--multiple"),a.html('
              '),a},d.prototype.bind=function(b,c){var e=this;d.__super__.bind.apply(this,arguments),this.$selection.on("click",function(a){e.trigger("toggle",{originalEvent:a})}),this.$selection.on("click",".select2-selection__choice__remove",function(b){if(!e.options.get("disabled")){var c=a(this),d=c.parent(),f=d.data("data");e.trigger("unselect",{originalEvent:b,data:f})}})},d.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},d.prototype.display=function(a,b){var c=this.options.get("templateSelection"),d=this.options.get("escapeMarkup");return d(c(a,b))},d.prototype.selectionContainer=function(){var b=a('
            • ×
            • ');return b},d.prototype.update=function(a){if(this.clear(),0!==a.length){for(var b=[],d=0;d1;if(d||c)return a.call(this,b);this.clear();var e=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(e)},b}),b.define("select2/selection/allowClear",["jquery","../keys"],function(a,b){function c(){}return c.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(a){d._handleClear(a)}),b.on("keypress",function(a){d._handleKeyboardClear(a,b)})},c.prototype._handleClear=function(a,b){if(!this.options.get("disabled")){var c=this.$selection.find(".select2-selection__clear");if(0!==c.length){b.stopPropagation();for(var d=c.data("data"),e=0;e0||0===c.length)){var d=a('×');d.data("data",c),this.$selection.find(".select2-selection__rendered").prepend(d)}},c}),b.define("select2/selection/search",["jquery","../utils","../keys"],function(a,b,c){function d(a,b,c){a.call(this,b,c)}return d.prototype.render=function(b){var c=a('');this.$searchContainer=c,this.$search=c.find("input");var d=b.call(this);return this._transferTabIndex(),d},d.prototype.bind=function(a,b,d){var e=this;a.call(this,b,d),b.on("open",function(){e.$search.trigger("focus")}),b.on("close",function(){e.$search.val(""),e.$search.removeAttr("aria-activedescendant"),e.$search.trigger("focus")}),b.on("enable",function(){e.$search.prop("disabled",!1),e._transferTabIndex()}),b.on("disable",function(){e.$search.prop("disabled",!0)}),b.on("focus",function(a){e.$search.trigger("focus")}),b.on("results:focus",function(a){e.$search.attr("aria-activedescendant",a.id)}),this.$selection.on("focusin",".select2-search--inline",function(a){e.trigger("focus",a)}),this.$selection.on("focusout",".select2-search--inline",function(a){e._handleBlur(a)}),this.$selection.on("keydown",".select2-search--inline",function(a){a.stopPropagation(),e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented();var b=a.which;if(b===c.BACKSPACE&&""===e.$search.val()){var d=e.$searchContainer.prev(".select2-selection__choice");if(d.length>0){var f=d.data("data");e.searchRemoveChoice(f),a.preventDefault()}}});var f=document.documentMode,g=f&&11>=f;this.$selection.on("input.searchcheck",".select2-search--inline",function(a){return g?void e.$selection.off("input.search input.searchcheck"):void e.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(a){if(g&&"input"===a.type)return void e.$selection.off("input.search input.searchcheck");var b=a.which;b!=c.SHIFT&&b!=c.CTRL&&b!=c.ALT&&b!=c.TAB&&e.handleSearch(a)})},d.prototype._transferTabIndex=function(a){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},d.prototype.createPlaceholder=function(a,b){this.$search.attr("placeholder",b.text)},d.prototype.update=function(a,b){var c=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),a.call(this,b),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),c&&this.$search.focus()},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger("unselect",{data:b}),this.$search.val(b.text),this.handleSearch()},d.prototype.resizeSearch=function(){this.$search.css("width","25px");var a="";if(""!==this.$search.attr("placeholder"))a=this.$selection.find(".select2-selection__rendered").innerWidth();else{var b=this.$search.val().length+1;a=.75*b+"em"}this.$search.css("width",a)},d}),b.define("select2/selection/eventRelay",["jquery"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=["open","opening","close","closing","select","selecting","unselect","unselecting"],g=["opening","closing","selecting","unselecting"];b.call(this,c,d),c.on("*",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event("select2:"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define("select2/translation",["jquery","require"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define("select2/diacritics",[],function(){var a={"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"};return a}),b.define("select2/data/base",["../utils"],function(a){function b(a,c){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(a){throw new Error("The `current` method must be defined in child classes.")},b.prototype.query=function(a,b){throw new Error("The `query` method must be defined in child classes.")},b.prototype.bind=function(a,b){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d=b.id+"-result-";return d+=a.generateChars(4),d+=null!=c.id?"-"+c.id.toString():"-"+a.generateChars(4)},b}),b.define("select2/data/select",["./base","../utils","jquery"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(":selected").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is("option"))return a.element.selected=!0,void this.$element.trigger("change"); +if(this.$element.prop("multiple"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f=0){var k=f.filter(d(j)),l=this.item(k),m=c.extend(!0,{},j,l),n=this.option(m);k.replaceWith(n)}else{var o=this.option(j);if(j.children){var p=this.convertToOptions(j.children);b.appendMany(o,p)}h.push(o)}}return h},d}),b.define("select2/data/ajax",["./array","../utils","jquery"],function(a,b,c){function d(a,b){this.ajaxOptions=this._applyDefaults(b.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),d.__super__.constructor.call(this,a,b)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return c.extend({},a,{q:a.term})},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get("debug")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),b(f)},function(){d.status&&"0"===d.status||e.trigger("results:message",{message:"errorLoading"})});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:"GET"},this.ajaxOptions);"function"==typeof f.url&&(f.url=f.url.call(this.$element,a)),"function"==typeof f.data&&(f.data=f.data.call(this.$element,a)),this.ajaxOptions.delay&&null!=a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define("select2/data/tags",["jquery"],function(a){function b(b,c,d){var e=d.get("tags"),f=d.get("createTag");void 0!==f&&(this.createTag=f);var g=d.get("insertTag");if(void 0!==g&&(this.insertTag=g),b.call(this,c,d),a.isArray(e))for(var h=0;h0&&b.term.length>this.maximumInputLength?void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumSelectionLength",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get("maximumSelectionLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;return d.maximumSelectionLength>0&&f>=d.maximumSelectionLength?void d.trigger("results:message",{message:"maximumSelected",args:{maximum:d.maximumSelectionLength}}):void a.call(d,b,c)})},a}),b.define("select2/dropdown",["jquery","./utils"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('');return b.attr("dir",this.options.get("dir")),this.$dropdown=b,b},c.prototype.bind=function(){},c.prototype.position=function(a,b){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define("select2/dropdown/search",["jquery","../utils"],function(a,b){function c(){}return c.prototype.render=function(b){var c=b.call(this),d=a('');return this.$searchContainer=d,this.$search=d.find("input"),c.prepend(d),c},c.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),this.$search.on("keydown",function(a){e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on("input",function(b){a(this).off("keyup")}),this.$search.on("keyup input",function(a){e.handleSearch(a)}),c.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val("")}),c.on("focus",function(){c.isOpen()&&e.$search.focus()}),c.on("results:all",function(a){if(null==a.query.term||""===a.query.term){var b=e.showSearch(a);b?e.$searchContainer.removeClass("select2-search--hide"):e.$searchContainer.addClass("select2-search--hide")}})},c.prototype.handleSearch=function(a){if(!this._keyUpPrevented){var b=this.$search.val();this.trigger("query",{term:b})}this._keyUpPrevented=!1},c.prototype.showSearch=function(a,b){return!0},c}),b.define("select2/dropdown/hidePlaceholder",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define("select2/dropdown/infiniteScroll",["jquery"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on("query",function(a){e.lastParams=a,e.loading=!0}),c.on("query:append",function(a){e.lastParams=a,e.loading=!0}),this.$results.on("scroll",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){var c=e.$results.offset().top+e.$results.outerHeight(!1),d=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1);c+50>=d&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger("query:append",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a('
            • '),c=this.options.get("translations").get("loadingMore");return b.html(c(this.lastParams)),b},b}),b.define("select2/dropdown/attachBody",["jquery","../utils"],function(a,b){function c(b,c,d){this.$dropdownParent=d.get("dropdownParent")||a(document.body),b.call(this,c,d)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on("open",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on("results:all",function(){d._positionDropdown(),d._resizeDropdown()}),b.on("results:append",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on("close",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on("mousedown",function(a){a.stopPropagation()})},c.prototype.destroy=function(a){a.call(this),this.$dropdownContainer.remove()},c.prototype.position=function(a,b,c){b.attr("class",c.attr("class")),b.removeClass("select2"),b.addClass("select2-container--open"),b.css({position:"absolute",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a(""),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(a){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c,d){var e=this,f="scroll.select2."+d.id,g="resize.select2."+d.id,h="orientationchange.select2."+d.id,i=this.$container.parents().filter(b.hasScroll);i.each(function(){a(this).data("select2-scroll-position",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),i.on(f,function(b){var c=a(this).data("select2-scroll-position");a(this).scrollTop(c.y)}),a(window).on(f+" "+g+" "+h,function(a){e._positionDropdown(),e._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c,d){var e="scroll.select2."+d.id,f="resize.select2."+d.id,g="orientationchange.select2."+d.id,h=this.$container.parents().filter(b.hasScroll);h.off(e),a(window).off(e+" "+f+" "+g)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass("select2-dropdown--above"),d=this.$dropdown.hasClass("select2-dropdown--below"),e=null,f=this.$container.offset();f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.topf.bottom+h.height,l={left:f.left,top:g.bottom},m=this.$dropdownParent;"static"===m.css("position")&&(m=m.offsetParent());var n=m.offset();l.top-=n.top,l.left-=n.left,c||d||(e="below"),k||!j||c?!j&&k&&c&&(e="below"):e="above",("above"==e||c&&"below"!==e)&&(l.top=g.top-n.top-h.height),null!=e&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+e),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){var a={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(a.minWidth=a.width,a.position="relative",a.width="auto"),this.$dropdown.css(a)},c.prototype._showDropdown=function(a){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define("select2/dropdown/minimumResultsForSearch",[],function(){function a(b){for(var c=0,d=0;d0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),(null!=l.tokenSeparators||null!=l.tokenizer)&&(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+"compat/query");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+"compat/initSelection");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+"compat/dropdownCss");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.multiple?l.selectionAdapter=e:l.selectionAdapter=d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+"compat/containerCss");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if("string"==typeof l.language)if(l.language.indexOf("-")>0){var H=l.language.split("-"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push("en");for(var K=l.language,L=0;L0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){var h=e.children[g],i=c(d,h);null==i&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var j=b(e.text).toUpperCase(),k=b(d.term).toUpperCase();return j.indexOf(k)>-1?e:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:"default",width:"resolve"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(this.defaults,f)};var E=new D;return E}),b.define("select2/options",["require","jquery","./defaults","./utils"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is("input")){var f=a(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){var c=["select2"];null==this.options.multiple&&(this.options.multiple=a.prop("multiple")),null==this.options.disabled&&(this.options.disabled=a.prop("disabled")),null==this.options.language&&(a.prop("lang")?this.options.language=a.prop("lang").toLowerCase():a.closest("[lang]").prop("lang")&&(this.options.language=a.closest("[lang]").prop("lang"))),null==this.options.dir&&(a.prop("dir")?this.options.dir=a.prop("dir"):a.closest("[dir]").prop("dir")?this.options.dir=a.closest("[dir]").prop("dir"):this.options.dir="ltr"),a.prop("disabled",this.options.disabled),a.prop("multiple",this.options.multiple),a.data("select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),a.data("data",a.data("select2Tags")),a.data("tags",!0)),a.data("ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),a.attr("ajax--url",a.data("ajaxUrl")),a.data("ajax--url",a.data("ajaxUrl")));var e={};e=b.fn.jquery&&"1."==b.fn.jquery.substr(0,2)&&a[0].dataset?b.extend(!0,{},a[0].dataset,a.data()):a.data();var f=b.extend(!0,{},e);f=d._convertData(f);for(var g in f)b.inArray(g,c)>-1||(b.isPlainObject(this.options[g])?b.extend(this.options[g],f[g]):this.options[g]=f[g]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define("select2/core",["jquery","./options","./utils","./keys"],function(a,b,c,d){var e=function(a,c){null!=a.data("select2")&&a.data("select2").destroy(),this.$element=a,this.id=this._generateId(a),c=c||{},this.options=new b(c,a),e.__super__.constructor.call(this);var d=a.attr("tabindex")||0;a.data("old-tabindex",d),a.attr("tabindex","-1");var f=this.options.get("dataAdapter");this.dataAdapter=new f(a,this.options);var g=this.render();this._placeContainer(g);var h=this.options.get("selectionAdapter");this.selection=new h(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,g);var i=this.options.get("dropdownAdapter");this.dropdown=new i(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,g);var j=this.options.get("resultsAdapter");this.results=new j(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var k=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){k.trigger("selection:update",{data:a})}),a.addClass("select2-hidden-accessible"),a.attr("aria-hidden","true"),this._syncAttributes(),a.data("select2",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b="";return b=null!=a.attr("id")?a.attr("id"):null!=a.attr("name")?a.attr("name")+"-"+c.generateChars(2):c.generateChars(4),b=b.replace(/(:|\.|\[|\]|,)/g,""),b="select2-"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get("width"));null!=b&&a.css("width",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==b){var d=this._resolveWidth(a,"style");return null!=d?d:this._resolveWidth(a,"element")}if("element"==b){var e=a.outerWidth(!1);return 0>=e?"auto":e+"px"}if("style"==b){var f=a.attr("style");if("string"!=typeof f)return null;for(var g=f.split(";"),h=0,i=g.length;i>h;h+=1){var j=g[h].replace(/\s/g,""),k=j.match(c);if(null!==k&&k.length>=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on("change.select2",function(){b.dataAdapter.current(function(a){b.trigger("selection:update",{data:a})})}),this.$element.on("focus.select2",function(a){b.trigger("focus",a)}),this._syncA=c.bind(this._syncAttributes,this),this._syncS=c.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._syncA);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._syncA),a.each(c,b._syncS)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener("DOMAttrModified",b._syncA,!1),this.$element[0].addEventListener("DOMNodeInserted",b._syncS,!1),this.$element[0].addEventListener("DOMNodeRemoved",b._syncS,!1))},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=["toggle","focus"];this.selection.on("toggle",function(){b.toggleDropdown()}),this.selection.on("focus",function(a){b.focus(a)}),this.selection.on("*",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var a=this;this.on("open",function(){a.$container.addClass("select2-container--open")}),this.on("close",function(){a.$container.removeClass("select2-container--open")}),this.on("enable",function(){a.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){a.$container.addClass("select2-container--disabled")}),this.on("blur",function(){a.$container.removeClass("select2-container--focus")}),this.on("query",function(b){a.isOpen()||a.trigger("open",{}),this.dataAdapter.query(b,function(c){a.trigger("results:all",{data:c,query:b})})}),this.on("query:append",function(b){this.dataAdapter.query(b,function(c){a.trigger("results:append",{data:c,query:b})})}),this.on("keypress",function(b){var c=b.which;a.isOpen()?c===d.ESC||c===d.TAB||c===d.UP&&b.altKey?(a.close(),b.preventDefault()):c===d.ENTER?(a.trigger("results:select",{}),b.preventDefault()):c===d.SPACE&&b.ctrlKey?(a.trigger("results:toggle",{}),b.preventDefault()):c===d.UP?(a.trigger("results:previous",{}),b.preventDefault()):c===d.DOWN&&(a.trigger("results:next",{}),b.preventDefault()):(c===d.ENTER||c===d.SPACE||c===d.DOWN&&b.altKey)&&(a.open(),b.preventDefault())})},e.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},e.prototype._syncSubtree=function(a,b){var c=!1,d=this;if(!a||!a.target||"OPTION"===a.target.nodeName||"OPTGROUP"===a.target.nodeName){if(b)if(b.addedNodes&&b.addedNodes.length>0)for(var e=0;e0&&(c=!0);else c=!0;c&&this.dataAdapter.current(function(a){d.trigger("selection:update",{data:a})})}},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:"opening",close:"closing",select:"selecting",unselect:"unselecting"};if(void 0===b&&(b={}),a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||this.trigger("query",{})},e.prototype.close=function(){this.isOpen()&&this.trigger("close",{})},e.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},e.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},e.prototype.focus=function(a){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},e.prototype.enable=function(a){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),(null==a||0===a.length)&&(a=[!0]);var b=!a[0];this.$element.prop("disabled",b)},e.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger("change")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener("DOMAttrModified",this._syncA,!1),this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,!1),this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",this.$element.data("old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null; +},e.prototype.render=function(){var b=a('');return b.attr("dir",this.options.get("dir")),this.$container=b,this.$container.addClass("select2-container--"+this.options.get("theme")),b.data("element",this.$element),b},e}),b.define("jquery-mousewheel",["jquery"],function(a){return a}),b.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults"],function(a,b,c,d){if(null==a.fn.select2){var e=["open","close","destroy"];a.fn.select2=function(b){if(b=b||{},"object"==typeof b)return this.each(function(){var d=a.extend(!0,{},b);new c(a(this),d)}),this;if("string"==typeof b){var d,f=Array.prototype.slice.call(arguments,1);return this.each(function(){var c=a(this).data("select2");null==c&&window.console&&console.error&&console.error("The select2('"+b+"') method was called on an element that is not using Select2."),d=c[b].apply(c,f)}),a.inArray(b,e)>-1?this:d}throw new Error("Invalid arguments for Select2: "+b)}}return null==a.fn.select2.defaults&&(a.fn.select2.defaults=d),c}),{define:b.define,require:b.require}}(),c=b.require("jquery.select2");return a.fn.select2.amd=b,c}); \ No newline at end of file From 893e84d442cbcbcc0d2482e3de62625d34172d33 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 2 Nov 2016 12:25:03 +0100 Subject: [PATCH 058/164] put objtype and type of attrdef into data-subtitle of option tag --- views/bootstrap/class.AttributeMgr.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/views/bootstrap/class.AttributeMgr.php b/views/bootstrap/class.AttributeMgr.php index 994c5716f..45b379a62 100644 --- a/views/bootstrap/class.AttributeMgr.php +++ b/views/bootstrap/class.AttributeMgr.php @@ -283,9 +283,9 @@ $(document).ready( function() {
              : - + + getID()."\" ".($selattrdef && $attrdef->getID()==$selattrdef->getID() ? 'selected' : '').">" . htmlspecialchars($attrdef->getName() ." (".$ot.", ".$t.")"); + print "
              From c485c272f573e57aa4c89720140ac8db3ea1ef23 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 4 Nov 2016 15:42:24 +0100 Subject: [PATCH 077/164] turn .chzn-select-deselect into select2 box --- styles/bootstrap/application.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/styles/bootstrap/application.js b/styles/bootstrap/application.js index 1daab4c09..34655a0e9 100644 --- a/styles/bootstrap/application.js +++ b/styles/bootstrap/application.js @@ -35,8 +35,18 @@ $(document).ready( function() { return $newstate; } }); - $(".chzn-select-deselect").select({ - allowClear:true + $(".chzn-select-deselect").select2({ + allowClear:true, + width: '100%', + templateResult: function (state) { + var subtitle = $(state.element).data('subtitle'); + var html = ''+state.text+''; + if(subtitle) + html += '
              '+subtitle+''; + html += '
              '; + var $newstate = $(html); + return $newstate; + } }); /* change the color and length of the bar graph showing the password From 5ee4253fe0f70328706c363f10e0757c6a3b460c Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sat, 5 Nov 2016 12:36:01 +0100 Subject: [PATCH 078/164] converters can be set by setConverters() --- SeedDMS_Preview/Preview/Previewer.php | 36 +++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/SeedDMS_Preview/Preview/Previewer.php b/SeedDMS_Preview/Preview/Previewer.php index 51f2bbdd1..28b6fc2a9 100644 --- a/SeedDMS_Preview/Preview/Previewer.php +++ b/SeedDMS_Preview/Preview/Previewer.php @@ -37,6 +37,13 @@ class SeedDMS_Preview_Previewer { */ protected $width; + /** + * @var array $converters list of mimetypes and commands for converting + * file into preview image + * @access protected + */ + protected $converters; + /** * @var integer $timeout maximum time for execution of external commands * @access protected @@ -54,6 +61,17 @@ class SeedDMS_Preview_Previewer { $this->previewDir = $previewDir; } $this->width = intval($width); + $this->converters = array( + 'image/png' => "convert -resize %wx '%f' '%o'", + 'image/gif' => "convert -resize %wx '%f' '%o'", + 'image/jpg' => "convert -resize %wx '%f' '%o'", + 'image/jpeg' => "convert -resize %wx '%f' '%o'", + 'image/svg+xml' => "convert -resize %wx '%f' '%o'", + 'text/plain' => "convert -resize %wx '%f' '%o'", + 'application/pdf' => "convert -density 100 -resize %wx '%f[0]' '%o'", + 'application/postscript' => "convert -density 100 -resize %wx '%f[0]' '%o'", + 'application/x-compressed-tar' => "tar tzvf '%f' | convert -density 100 -resize %wx text:-[0] '%o", + ); $this->timeout = intval($timeout); } @@ -65,7 +83,7 @@ class SeedDMS_Preview_Previewer { ); $pipes = array(); - $timeout += time(); + $timeout += time(); $process = proc_open($cmd, $descriptorspec, $pipes); if (!is_resource($process)) { throw new Exception("proc_open failed on: " . $cmd); @@ -93,6 +111,16 @@ class SeedDMS_Preview_Previewer { } } /* }}} */ + /** + * Set a list of converters + * + * @param array list of converters. The key of the array contains the mimetype + * and the value is the command to be called for creating the preview + */ + function setConverters($arr) { /* {{{ */ + $this->converters = array_merge($arr, $this->converters); + } /* }}} */ + /** * Return the physical filename of the preview image on disk * @@ -154,6 +182,10 @@ class SeedDMS_Preview_Previewer { $target = $this->previewDir.$dir.md5($infile).'-'.$width; if($target != '' && (!file_exists($target.'.png') || filectime($target.'.png') < filectime($infile))) { $cmd = ''; + if(isset($this->converters[$mimetype])) { + $cmd = str_replace(array('%w', '%f', '%o'), array($width, $infile, $target.'.png'), $this->converters[$mimetype]); + } + /* switch($mimetype) { case "image/png": case "image/gif": @@ -173,6 +205,7 @@ class SeedDMS_Preview_Previewer { $cmd = 'tar tzvf '.$infile.' | convert -density 100 -resize '.$width.'x text:-[0] '.$target.'.png'; break; } + */ if($cmd) { //exec($cmd); try { @@ -211,7 +244,6 @@ class SeedDMS_Preview_Previewer { $file = $document->_dms->contentDir.$object->getPath(); $target = $this->getFileName($object, $width); return $this->createRawPreview($file, $document->getDir(), $object->getMimeType(), $width, $target); - } /* }}} */ /** From 674de91419c41f28450d25f49b632b135b73d3a1 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Sat, 5 Nov 2016 12:39:57 +0100 Subject: [PATCH 079/164] add more documentation, add fold marks --- SeedDMS_Preview/Preview/Previewer.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/SeedDMS_Preview/Preview/Previewer.php b/SeedDMS_Preview/Preview/Previewer.php index 28b6fc2a9..bbc32a004 100644 --- a/SeedDMS_Preview/Preview/Previewer.php +++ b/SeedDMS_Preview/Preview/Previewer.php @@ -50,7 +50,7 @@ class SeedDMS_Preview_Previewer { */ protected $timeout; - function __construct($previewDir, $width=40, $timeout=5) { + function __construct($previewDir, $width=40, $timeout=5) { /* {{{ */ if(!is_dir($previewDir)) { if (!SeedDMS_Core_File::makeDir($previewDir)) { $this->previewDir = ''; @@ -73,7 +73,7 @@ class SeedDMS_Preview_Previewer { 'application/x-compressed-tar' => "tar tzvf '%f' | convert -density 100 -resize %wx text:-[0] '%o", ); $this->timeout = intval($timeout); - } + } /* }}} */ static function execWithTimeout($cmd, $timeout=5) { /* {{{ */ $descriptorspec = array( @@ -114,6 +114,9 @@ class SeedDMS_Preview_Previewer { /** * Set a list of converters * + * Merges the list of passed converters with the already existing ones. + * Existing converters will be overwritten. + * * @param array list of converters. The key of the array contains the mimetype * and the value is the command to be called for creating the preview */ From 531b645a2de0066c199c0e40726813b15b76e222 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 7 Nov 2016 08:52:46 +0100 Subject: [PATCH 080/164] new version 1.2.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit addѕ previewer which converts documents to pdf instead of png --- SeedDMS_Preview/Preview.php | 10 + SeedDMS_Preview/Preview/Base.php | 120 ++++++++++ SeedDMS_Preview/Preview/PdfPreviewer.php | 276 +++++++++++++++++++++++ SeedDMS_Preview/Preview/Previewer.php | 85 +------ SeedDMS_Preview/package.xml | 32 ++- 5 files changed, 433 insertions(+), 90 deletions(-) create mode 100644 SeedDMS_Preview/Preview/Base.php create mode 100644 SeedDMS_Preview/Preview/PdfPreviewer.php diff --git a/SeedDMS_Preview/Preview.php b/SeedDMS_Preview/Preview.php index fb59f3067..d19d82943 100644 --- a/SeedDMS_Preview/Preview.php +++ b/SeedDMS_Preview/Preview.php @@ -16,9 +16,19 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +/** + * @uses Preview/Base.php + */ +require_once('Preview/Base.php'); + /** * @uses Preview/Previewer.php */ require_once('Preview/Previewer.php'); +/** + * @uses Preview/PdfPreviewer.php + */ +require_once('Preview/PdfPreviewer.php'); + ?> diff --git a/SeedDMS_Preview/Preview/Base.php b/SeedDMS_Preview/Preview/Base.php new file mode 100644 index 000000000..2e46f593a --- /dev/null +++ b/SeedDMS_Preview/Preview/Base.php @@ -0,0 +1,120 @@ + + * @copyright Copyright (C) 2010, Uwe Steinmann + * @version Release: @package_version@ + */ + + +/** + * Class for managing creation of preview images for documents. + * + * @category DMS + * @package SeedDMS_Preview + * @version @version@ + * @author Uwe Steinmann + * @copyright Copyright (C) 2011, Uwe Steinmann + * @version Release: @package_version@ + */ +class SeedDMS_Preview_Base { + /** + * @var string $cacheDir location in the file system where all the + * cached data like thumbnails are located. This should be an + * absolute path. + * @access public + */ + public $previewDir; + + /** + * @var array $converters list of mimetypes and commands for converting + * file into preview image + * @access protected + */ + protected $converters; + + /** + * @var integer $timeout maximum time for execution of external commands + * @access protected + */ + protected $timeout; + + function __construct($previewDir, $timeout=5) { /* {{{ */ + if(!is_dir($previewDir)) { + if (!SeedDMS_Core_File::makeDir($previewDir)) { + $this->previewDir = ''; + } else { + $this->previewDir = $previewDir; + } + } else { + $this->previewDir = $previewDir; + } + $this->timeout = intval($timeout); + } /* }}} */ + + static function execWithTimeout($cmd, $timeout=5) { /* {{{ */ + $descriptorspec = array( + 0 => array("pipe", "r"), + 1 => array("pipe", "w"), + 2 => array("pipe", "w") + ); + $pipes = array(); + + $timeout += time(); + $process = proc_open($cmd, $descriptorspec, $pipes); + if (!is_resource($process)) { + throw new Exception("proc_open failed on: " . $cmd); + } + + $output = ''; + $timeleft = $timeout - time(); + $read = array($pipes[1]); + $write = NULL; + $exeptions = NULL; + do { + stream_select($read, $write, $exeptions, $timeleft, 200000); + + if (!empty($read)) { + $output .= fread($pipes[1], 8192); + } + $timeleft = $timeout - time(); + } while (!feof($pipes[1]) && $timeleft > 0); + + if ($timeleft <= 0) { + proc_terminate($process); + throw new Exception("command timeout on: " . $cmd); + } else { + return $output; + } + } /* }}} */ + + /** + * Set a list of converters + * + * Merges the list of passed converters with the already existing ones. + * Existing converters will be overwritten. + * + * @param array list of converters. The key of the array contains the mimetype + * and the value is the command to be called for creating the preview + */ + function setConverters($arr) { /* {{{ */ + $this->converters = array_merge($arr, $this->converters); + } /* }}} */ + + /** + * Check if converter for a given mimetype is set + * + * @param string $mimetype + * @return boolean true if converter exists, otherwise false + */ + function hasConverter($mimetype) { /* {{{ */ + return array_key_exists($mimetype, $this->converters); + } /* }}} */ + +} + diff --git a/SeedDMS_Preview/Preview/PdfPreviewer.php b/SeedDMS_Preview/Preview/PdfPreviewer.php new file mode 100644 index 000000000..10005afc7 --- /dev/null +++ b/SeedDMS_Preview/Preview/PdfPreviewer.php @@ -0,0 +1,276 @@ + + * @copyright Copyright (C) 2010, Uwe Steinmann + * @version Release: @package_version@ + */ + + +/** + * Class for managing creation of pdf preview for documents. + * + * @category DMS + * @package SeedDMS_Preview + * @version @version@ + * @author Uwe Steinmann + * @copyright Copyright (C) 2011, Uwe Steinmann + * @version Release: @package_version@ + */ +class SeedDMS_Preview_PdfPreviewer extends SeedDMS_Preview_Base { + + function __construct($previewDir, $timeout=5) { /* {{{ */ + parent::__construct($previewDir, $timeout); + $this->converters = array( + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => "unoconv -d document -f pdf --stdout -v '%f' > '%o'", + 'application/vnd.oasis.opendocument.text' => "unoconv -d document -f pdf --stdout -v '%f' > '%o'", + 'text/rtf' => "unoconv -d document -f pdf --stdout -v '%f' > '%o'", + 'application/msword' => "unoconv -d document -f pdf --stdout -v '%f' > '%o'", + ); + } /* }}} */ + + /** + * Return the physical filename of the preview image on disk + * + * @param object $object document content or document file + * @return string file name of preview image + */ + protected function getFileName($object) { /* {{{ */ + if(!$object) + return false; + + $document = $object->getDocument(); + $dir = $this->previewDir.'/'.$document->getDir(); + switch(get_class($object)) { + case "SeedDMS_Core_DocumentContent": + $target = $dir.'p'.$object->getVersion(); + break; + case "SeedDMS_Core_DocumentFile": + $target = $dir.'f'.$object->getID(); + break; + default: + return false; + } + return $target; + } /* }}} */ + + /** + * Create a pdf preview for a given file + * + * This method creates a preview in pdf format for a regular file + * in the file system and stores the result in the directory $dir relative + * to the configured preview directory. The filename of the resulting preview + * image is either $target.pdf (if set) or md5($infile).pdf. + * The $mimetype is used to select the propper conversion programm. + * An already existing pdf preview is replaced. + * + * @param string $infile name of input file including full path + * @param string $dir directory relative to $this->previewDir + * @param string $mimetype MimeType of input file + * @param string $target optional name of preview image (without extension) + * @return boolean true on success, false on failure + */ + public function createRawPreview($infile, $dir, $mimetype, $target='') { /* {{{ */ + if(!$this->previewDir) + return false; + if(!is_dir($this->previewDir.'/'.$dir)) { + if (!SeedDMS_Core_File::makeDir($this->previewDir.'/'.$dir)) { + return false; + } + } + if(!file_exists($infile)) + return false; + if(!$target) + $target = $this->previewDir.$dir.md5($infile); + if($target != '' && (!file_exists($target.'.pdf') || filectime($target.'.pdf') < filectime($infile))) { + $cmd = ''; + if(isset($this->converters[$mimetype])) { + $cmd = str_replace(array('%f', '%o'), array($infile, $target.'.pdf'), $this->converters[$mimetype]); + } + if($cmd) { + try { + self::execWithTimeout($cmd, $this->timeout); + } catch(Exception $e) { + } + } + return true; + } + return true; + + } /* }}} */ + + /** + * Create preview image + * + * This function creates a preview image for the given document + * content or document file. It internally uses + * {@link SeedDMS_Preview::createRawPreview()}. The filename of the + * preview image is created by {@link SeedDMS_Preview_Previewer::getFileName()} + * + * @param object $object instance of SeedDMS_Core_DocumentContent + * or SeedDMS_Core_DocumentFile + * @return boolean true on success, false on failure + */ + public function createPreview($object) { /* {{{ */ + if(!$object) + return false; + + $document = $object->getDocument(); + $file = $document->_dms->contentDir.$object->getPath(); + $target = $this->getFileName($object); + return $this->createRawPreview($file, $document->getDir(), $object->getMimeType(), $target); + } /* }}} */ + + /** + * Check if a preview image already exists. + * + * This function is a companion to {@link SeedDMS_Preview_Previewer::createRawPreview()}. + * + * @param string $infile name of input file including full path + * @param string $dir directory relative to $this->previewDir + * @return boolean true if preview exists, otherwise false + */ + public function hasRawPreview($infile, $dir) { /* {{{ */ + if(!$this->previewDir) + return false; + $target = $this->previewDir.$dir.md5($infile); + if($target !== false && file_exists($target.'.pdf') && filectime($target.'.pdf') >= filectime($infile)) { + return true; + } + return false; + } /* }}} */ + + /** + * Check if a preview image already exists. + * + * This function is a companion to {@link SeedDMS_Preview_Previewer::createPreview()}. + * + * @param object $object instance of SeedDMS_Core_DocumentContent + * or SeedDMS_Core_DocumentFile + * @return boolean true if preview exists, otherwise false + */ + public function hasPreview($object) { /* {{{ */ + if(!$object) + return false; + + if(!$this->previewDir) + return false; + $target = $this->getFileName($object); + if($target !== false && file_exists($target.'.pdf') && filectime($target.'.pdf') >= $object->getDate()) { + return true; + } + return false; + } /* }}} */ + + /** + * Return a preview image. + * + * This function returns the content of a preview image if it exists.. + * + * @param string $infile name of input file including full path + * @param string $dir directory relative to $this->previewDir + * @return boolean/string image content if preview exists, otherwise false + */ + public function getRawPreview($infile, $dir) { /* {{{ */ + if(!$this->previewDir) + return false; + + $target = $this->previewDir.$dir.md5($infile); + if($target && file_exists($target.'.pdf')) { + readfile($target.'.pdf'); + } + } /* }}} */ + + /** + * Return a preview image. + * + * This function returns the content of a preview image if it exists.. + * + * @param object $object instance of SeedDMS_Core_DocumentContent + * or SeedDMS_Core_DocumentFile + * @return boolean/string image content if preview exists, otherwise false + */ + public function getPreview($object) { /* {{{ */ + if(!$this->previewDir) + return false; + + $target = $this->getFileName($object); + if($target && file_exists($target.'.pdf')) { + readfile($target.'.pdf'); + } + } /* }}} */ + + /** + * Return file size preview image. + * + * @param object $object instance of SeedDMS_Core_DocumentContent + * or SeedDMS_Core_DocumentFile + * @return boolean/integer size of preview image or false if image + * does not exist + */ + public function getFilesize($object) { /* {{{ */ + $target = $this->getFileName($object); + if($target && file_exists($target.'.pdf')) { + return(filesize($target.'.pdf')); + } else { + return false; + } + + } /* }}} */ + + /** + * Delete preview image. + * + * @param object $object instance of SeedDMS_Core_DocumentContent + * or SeedDMS_Core_DocumentFile + * @return boolean true if deletion succeded or false if file does not exist + */ + public function deletePreview($object) { /* {{{ */ + if(!$this->previewDir) + return false; + + $target = $this->getFileName($object); + if($target && file_exists($target.'.pdf')) { + return(unlink($target.'.pdf')); + } else { + return false; + } + } /* }}} */ + + static function recurseRmdir($dir) { + $files = array_diff(scandir($dir), array('.','..')); + foreach ($files as $file) { + (is_dir("$dir/$file")) ? SeedDMS_Preview_Previewer::recurseRmdir("$dir/$file") : unlink("$dir/$file"); + } + return rmdir($dir); + } + + /** + * Delete all preview images belonging to a document + * + * This function removes the preview images of all versions and + * files of a document including the directory. It actually just + * removes the directory for the document in the cache. + * + * @param object $document instance of SeedDMS_Core_Document + * @return boolean true if deletion succeded or false if file does not exist + */ + public function deleteDocumentPreviews($document) { /* {{{ */ + if(!$this->previewDir) + return false; + + $dir = $this->previewDir.'/'.$document->getDir(); + if(file_exists($dir) && is_dir($dir)) { + return SeedDMS_Preview_Previewer::recurseRmdir($dir); + } else { + return false; + } + + } /* }}} */ +} +?> diff --git a/SeedDMS_Preview/Preview/Previewer.php b/SeedDMS_Preview/Preview/Previewer.php index bbc32a004..8c9b67713 100644 --- a/SeedDMS_Preview/Preview/Previewer.php +++ b/SeedDMS_Preview/Preview/Previewer.php @@ -22,45 +22,15 @@ * @copyright Copyright (C) 2011, Uwe Steinmann * @version Release: @package_version@ */ -class SeedDMS_Preview_Previewer { - /** - * @var string $cacheDir location in the file system where all the - * cached data like thumbnails are located. This should be an - * absolute path. - * @access public - */ - public $previewDir; - +class SeedDMS_Preview_Previewer extends SeedDMS_Preview_Base { /** * @var integer $width maximum width/height of resized image * @access protected */ protected $width; - /** - * @var array $converters list of mimetypes and commands for converting - * file into preview image - * @access protected - */ - protected $converters; - - /** - * @var integer $timeout maximum time for execution of external commands - * @access protected - */ - protected $timeout; - function __construct($previewDir, $width=40, $timeout=5) { /* {{{ */ - if(!is_dir($previewDir)) { - if (!SeedDMS_Core_File::makeDir($previewDir)) { - $this->previewDir = ''; - } else { - $this->previewDir = $previewDir; - } - } else { - $this->previewDir = $previewDir; - } - $this->width = intval($width); + parent::__construct($previewDir, $timeout); $this->converters = array( 'image/png' => "convert -resize %wx '%f' '%o'", 'image/gif' => "convert -resize %wx '%f' '%o'", @@ -72,56 +42,7 @@ class SeedDMS_Preview_Previewer { 'application/postscript' => "convert -density 100 -resize %wx '%f[0]' '%o'", 'application/x-compressed-tar' => "tar tzvf '%f' | convert -density 100 -resize %wx text:-[0] '%o", ); - $this->timeout = intval($timeout); - } /* }}} */ - - static function execWithTimeout($cmd, $timeout=5) { /* {{{ */ - $descriptorspec = array( - 0 => array("pipe", "r"), - 1 => array("pipe", "w"), - 2 => array("pipe", "w") - ); - $pipes = array(); - - $timeout += time(); - $process = proc_open($cmd, $descriptorspec, $pipes); - if (!is_resource($process)) { - throw new Exception("proc_open failed on: " . $cmd); - } - - $output = ''; - $timeleft = $timeout - time(); - $read = array($pipes[1]); - $write = NULL; - $exeptions = NULL; - do { - stream_select($read, $write, $exeptions, $timeleft, 200000); - - if (!empty($read)) { - $output .= fread($pipes[1], 8192); - } - $timeleft = $timeout - time(); - } while (!feof($pipes[1]) && $timeleft > 0); - - if ($timeleft <= 0) { - proc_terminate($process); - throw new Exception("command timeout on: " . $cmd); - } else { - return $output; - } - } /* }}} */ - - /** - * Set a list of converters - * - * Merges the list of passed converters with the already existing ones. - * Existing converters will be overwritten. - * - * @param array list of converters. The key of the array contains the mimetype - * and the value is the command to be called for creating the preview - */ - function setConverters($arr) { /* {{{ */ - $this->converters = array_merge($arr, $this->converters); + $this->width = intval($width); } /* }}} */ /** diff --git a/SeedDMS_Preview/package.xml b/SeedDMS_Preview/package.xml index 681e952bf..265990820 100644 --- a/SeedDMS_Preview/package.xml +++ b/SeedDMS_Preview/package.xml @@ -11,11 +11,11 @@ uwe@steinmann.cx yes - 2016-04-26 + 2016-11-07 - 1.1.9 - 1.1.9 + 1.2.0 + 1.2.0 stable @@ -23,11 +23,7 @@ GPL License -add more documentation -finish deletePreview() -add new method deleteDocumentPreviews() -fix calculation of timeout (Bug #269) -check if cache dir exists before deleting it in deleteDocumentPreviews() +add new previewer which converts document to pdf instead of png @@ -216,5 +212,25 @@ set last parameter of stream_select() to 200000 micro sec. in case the timeout i pass variables to stream_select (required by php7) + + 2016-04-26 + + + 1.1.9 + 1.1.9 + + + stable + stable + + GPL License + +add more documentation +finish deletePreview() +add new method deleteDocumentPreviews() +fix calculation of timeout (Bug #269) +check if cache dir exists before deleting it in deleteDocumentPreviews() + + From a5c6a0cd5bbf977adc3250f6355fa076242b5823 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 7 Nov 2016 08:53:49 +0100 Subject: [PATCH 081/164] remove file from drop folder if requested by documentation --- op/op.UpdateDocument.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/op/op.UpdateDocument.php b/op/op.UpdateDocument.php index ebf47c047..853cf6f49 100644 --- a/op/op.UpdateDocument.php +++ b/op/op.UpdateDocument.php @@ -376,6 +376,11 @@ if ($_FILES['userfile']['error'] == 0) { UI::exitError(getMLText("document_title", array("documentname" => $document->getName())),getMLText("error_occured")); } } + if($settings->_removeFromDropFolder) { + if(file_exists($userfiletmp)) { + unlink($userfiletmp); + } + } } add_log_line("?documentid=".$documentid); From 86d5e7aedeeb4561519e53c0615da8887d3092ff Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 7 Nov 2016 08:54:56 +0100 Subject: [PATCH 082/164] issue error msg if drop folder is not accessible --- views/bootstrap/class.DropFolderChooser.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/views/bootstrap/class.DropFolderChooser.php b/views/bootstrap/class.DropFolderChooser.php index 10541e5fc..bdb19ad2c 100644 --- a/views/bootstrap/class.DropFolderChooser.php +++ b/views/bootstrap/class.DropFolderChooser.php @@ -97,6 +97,8 @@ $('.folderselect').click(function(ev) { echo "\n"; echo "\n"; echo ''."\n"; + } else { + echo "
              ".getMLText('invalid_dropfolder_folder')."
              "; } } } /* }}} */ From f8f527a17471d449289af98dfef0a65327ab47e0 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 7 Nov 2016 09:06:24 +0100 Subject: [PATCH 083/164] new phrases --- languages/ar_EG/lang.inc | 5 +++++ languages/bg_BG/lang.inc | 5 +++++ languages/ca_ES/lang.inc | 5 +++++ languages/cs_CZ/lang.inc | 5 +++++ languages/de_DE/lang.inc | 7 ++++++- languages/el_GR/lang.inc | 5 +++++ languages/en_GB/lang.inc | 7 ++++++- languages/es_ES/lang.inc | 5 +++++ languages/fr_FR/lang.inc | 5 +++++ languages/hr_HR/lang.inc | 5 +++++ languages/hu_HU/lang.inc | 5 +++++ languages/it_IT/lang.inc | 5 +++++ languages/ko_KR/lang.inc | 5 +++++ languages/nl_NL/lang.inc | 5 +++++ languages/pl_PL/lang.inc | 5 +++++ languages/pt_BR/lang.inc | 5 +++++ languages/ro_RO/lang.inc | 5 +++++ languages/ru_RU/lang.inc | 5 +++++ languages/sk_SK/lang.inc | 5 +++++ languages/sv_SE/lang.inc | 5 +++++ languages/tr_TR/lang.inc | 5 +++++ languages/uk_UA/lang.inc | 5 +++++ languages/zh_CN/lang.inc | 5 +++++ languages/zh_TW/lang.inc | 5 +++++ 24 files changed, 122 insertions(+), 2 deletions(-) diff --git a/languages/ar_EG/lang.inc b/languages/ar_EG/lang.inc index 82d6bf12a..046b128ba 100644 --- a/languages/ar_EG/lang.inc +++ b/languages/ar_EG/lang.inc @@ -1003,6 +1003,8 @@ URL: [url]', 'settings_contentDir_desc' => '', 'settings_contentOffsetDir' => '', 'settings_contentOffsetDir_desc' => '', +'settings_convertToPdf' => '', +'settings_convertToPdf_desc' => '', 'settings_cookieLifetime' => '', 'settings_cookieLifetime_desc' => '', 'settings_coreDir' => '', @@ -1205,6 +1207,8 @@ URL: [url]', 'settings_rootFolderID_desc' => '', 'settings_SaveError' => '', 'settings_Server' => '', +'settings_showFullPreview' => '', +'settings_showFullPreview_desc' => '', 'settings_showMissingTranslations' => '', 'settings_showMissingTranslations_desc' => '', 'settings_showSingleSearchHit' => '', @@ -1358,6 +1362,7 @@ URL: [url]', 'sunday_abbr' => 'ح', 'sv_SE' => 'السويدية', 'switched_to' => 'تحويل الى', +'takeOverAttributeValue' => '', 'takeOverGrpApprover' => '', 'takeOverGrpReviewer' => '', 'takeOverIndApprover' => '', diff --git a/languages/bg_BG/lang.inc b/languages/bg_BG/lang.inc index c19986af1..254337479 100644 --- a/languages/bg_BG/lang.inc +++ b/languages/bg_BG/lang.inc @@ -868,6 +868,8 @@ $text = array( 'settings_contentDir_desc' => 'Къде да съхранява качените файлове (най-добре изберете папка, недостъпна за уеб-сървъра)', 'settings_contentOffsetDir' => 'Content Offset Directory', 'settings_contentOffsetDir_desc' => 'За избягване проблеми с файловата система беше въведена нова структура на папките в каталоге с данните. Необходима е базова папка, откъдето да почнем. Впрочем, оставете тука всичко както си е, 1048576, но може да бъде всякакво числом или стринг, не съществуващ вече в папката с данните', +'settings_convertToPdf' => '', +'settings_convertToPdf_desc' => '', 'settings_cookieLifetime' => 'Cookie Life time', 'settings_cookieLifetime_desc' => 'Животът на бисквитките в секунди. Ако е =0 бисквитката ще бъде изтрита при затваряне на браузъра.', 'settings_coreDir' => 'Папка Core letoDMS', @@ -1070,6 +1072,8 @@ $text = array( 'settings_rootFolderID_desc' => 'ID на всяка корнева папка (може да не се променя)', 'settings_SaveError' => 'Грешка при съхранение на конфигурацията', 'settings_Server' => 'Настройки на сървъра', +'settings_showFullPreview' => '', +'settings_showFullPreview_desc' => '', 'settings_showMissingTranslations' => '', 'settings_showMissingTranslations_desc' => '', 'settings_showSingleSearchHit' => '', @@ -1223,6 +1227,7 @@ $text = array( 'sunday_abbr' => '', 'sv_SE' => '', 'switched_to' => '', +'takeOverAttributeValue' => '', 'takeOverGrpApprover' => '', 'takeOverGrpReviewer' => '', 'takeOverIndApprover' => '', diff --git a/languages/ca_ES/lang.inc b/languages/ca_ES/lang.inc index cda86ae48..299b9e113 100644 --- a/languages/ca_ES/lang.inc +++ b/languages/ca_ES/lang.inc @@ -873,6 +873,8 @@ URL: [url]', 'settings_contentDir_desc' => '', 'settings_contentOffsetDir' => '', 'settings_contentOffsetDir_desc' => '', +'settings_convertToPdf' => '', +'settings_convertToPdf_desc' => '', 'settings_cookieLifetime' => '', 'settings_cookieLifetime_desc' => '', 'settings_coreDir' => 'Core letoDMS directory', @@ -1075,6 +1077,8 @@ URL: [url]', 'settings_rootFolderID_desc' => '', 'settings_SaveError' => '', 'settings_Server' => '', +'settings_showFullPreview' => '', +'settings_showFullPreview_desc' => '', 'settings_showMissingTranslations' => '', 'settings_showMissingTranslations_desc' => '', 'settings_showSingleSearchHit' => '', @@ -1228,6 +1232,7 @@ URL: [url]', 'sunday_abbr' => '', 'sv_SE' => 'Suec', 'switched_to' => '', +'takeOverAttributeValue' => '', 'takeOverGrpApprover' => '', 'takeOverGrpReviewer' => '', 'takeOverIndApprover' => '', diff --git a/languages/cs_CZ/lang.inc b/languages/cs_CZ/lang.inc index 5c93160dc..958c69a1e 100644 --- a/languages/cs_CZ/lang.inc +++ b/languages/cs_CZ/lang.inc @@ -1012,6 +1012,8 @@ URL: [url]', 'settings_contentDir_desc' => 'Místo, kde jsou nahrané soubory uloženy (nejlepší zvolit adresář, který není přístupný přes váš web-server)', 'settings_contentOffsetDir' => '', 'settings_contentOffsetDir_desc' => '', +'settings_convertToPdf' => '', +'settings_convertToPdf_desc' => '', 'settings_cookieLifetime' => 'Životnost "cookie"', 'settings_cookieLifetime_desc' => 'Životnost "cookie" v sekundách. Pokud je nula, bude "cookie" odstraněno po zavření prohlížeče.', 'settings_coreDir' => 'Core SeedDMS directory', @@ -1214,6 +1216,8 @@ URL: [url]', 'settings_rootFolderID_desc' => 'ID of root-folder (mostly no need to change)', 'settings_SaveError' => 'Configuration file save error', 'settings_Server' => '', +'settings_showFullPreview' => '', +'settings_showFullPreview_desc' => '', 'settings_showMissingTranslations' => 'Zobrazit chybějící překlady', 'settings_showMissingTranslations_desc' => 'Vypsat všechny chybějící překlady na stránce v dolní části. Přihlášený uživatel bude moci předložit návrh na chybějící překlad, který bude uložen v souboru CSV. Nezapínejte tuto funkci v produkčním prostředí!', 'settings_showSingleSearchHit' => '', @@ -1367,6 +1371,7 @@ URL: [url]', 'sunday_abbr' => 'Ne', 'sv_SE' => 'Švédština', 'switched_to' => 'Přepnuto na', +'takeOverAttributeValue' => '', 'takeOverGrpApprover' => '', 'takeOverGrpReviewer' => '', 'takeOverIndApprover' => '', diff --git a/languages/de_DE/lang.inc b/languages/de_DE/lang.inc index b20b298d4..85d90cfc5 100644 --- a/languages/de_DE/lang.inc +++ b/languages/de_DE/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (2326), dgrutsch (21) +// Translators: Admin (2331), dgrutsch (21) $text = array( '2_factor_auth' => '2-Faktor Authentifizierung', @@ -1055,6 +1055,8 @@ URL: [url]', 'settings_contentDir_desc' => 'Verzeichnis, in dem die Dokumente gespeichert werden. Sie sollten ein Verzeichnis wählen, das nicht durch den Web-Server erreichbar ist.', 'settings_contentOffsetDir' => 'Content Offset Directory', 'settings_contentOffsetDir_desc' => 'Die Dokumente werden nicht direkt im Content-Verzeichnis, sondern in einem Unterverzeichnis angelegt. Der Name dieses Verzeichnis ist beliebig, wird aber historisch bedingt oft auf \'1048576\' gesetzt.', +'settings_convertToPdf' => 'Konvertiere Dokument für die Vorschau nach PDF', +'settings_convertToPdf_desc' => 'Wenn das Dokumentenformat vom Browser nicht unterstützt wird, wird die PDF konvertierte Version angezeigt.', 'settings_cookieLifetime' => 'Lebensdauer des Cookies', 'settings_cookieLifetime_desc' => 'Die Lebensdauer des Cookies für die Sitzungsverwaltung. Wenn dieser Wert auf 0 gesetzt wird, dann wird der Cookie beim Schließen des Browsers gelöscht.', 'settings_coreDir' => 'Core SeedDMS Verzeichnis', @@ -1257,6 +1259,8 @@ URL: [url]', 'settings_rootFolderID_desc' => 'Id des Wurzelordners in SeedDMS (kann in der Regel unverändert bleiben)', 'settings_SaveError' => 'Fehler beim Speichern der Konfiguration', 'settings_Server' => 'Server-Einstellungen', +'settings_showFullPreview' => 'Zeige gesamtes Dokument', +'settings_showFullPreview_desc' => 'Anwählen, um auf der Dokumenten-Detail-Seite eine vollständige Vorschau des Dokuments anzuzeigen, sofern dies im Browser möglich ist.', 'settings_showMissingTranslations' => 'Zeige fehlende Übersetzungen', 'settings_showMissingTranslations_desc' => 'Listet die fehlenden Übersetzungen der Seite unterhalb der Fußzeile und erlaubt dem Benutzer Vorschläge einzureichen. Diese Vorschläge werden in einer CSV-Datei gespeichert. Diese Funktion sollte nicht in Produktionssystemen eingeschaltet sein.', 'settings_showSingleSearchHit' => 'Springe direkt zu einem einzelnen Suchtreffer', @@ -1410,6 +1414,7 @@ URL: [url]', 'sunday_abbr' => 'So', 'sv_SE' => 'Schwedisch', 'switched_to' => 'Gewechselt zu', +'takeOverAttributeValue' => 'Attributwert von vorheriger Version übernehmen', 'takeOverGrpApprover' => 'Übernehme Gruppe von Freigebenden von letzter Version.', 'takeOverGrpReviewer' => 'Übernehme Gruppe von Prüfern von letzter Version.', 'takeOverIndApprover' => 'Übernehme Einzelfreigebende von letzter Version.', diff --git a/languages/el_GR/lang.inc b/languages/el_GR/lang.inc index 47a72a1d2..ef3e290b6 100644 --- a/languages/el_GR/lang.inc +++ b/languages/el_GR/lang.inc @@ -879,6 +879,8 @@ URL: [url]', 'settings_contentDir_desc' => '', 'settings_contentOffsetDir' => '', 'settings_contentOffsetDir_desc' => '', +'settings_convertToPdf' => '', +'settings_convertToPdf_desc' => '', 'settings_cookieLifetime' => '', 'settings_cookieLifetime_desc' => '', 'settings_coreDir' => '', @@ -1081,6 +1083,8 @@ URL: [url]', 'settings_rootFolderID_desc' => '', 'settings_SaveError' => '', 'settings_Server' => '', +'settings_showFullPreview' => '', +'settings_showFullPreview_desc' => '', 'settings_showMissingTranslations' => '', 'settings_showMissingTranslations_desc' => '', 'settings_showSingleSearchHit' => '', @@ -1234,6 +1238,7 @@ URL: [url]', 'sunday_abbr' => 'Κυ', 'sv_SE' => '', 'switched_to' => '', +'takeOverAttributeValue' => '', 'takeOverGrpApprover' => '', 'takeOverGrpReviewer' => '', 'takeOverIndApprover' => '', diff --git a/languages/en_GB/lang.inc b/languages/en_GB/lang.inc index c2772ab50..a02d58cb2 100644 --- a/languages/en_GB/lang.inc +++ b/languages/en_GB/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (1460), dgrutsch (7), netixw (14) +// Translators: Admin (1465), dgrutsch (7), netixw (14) $text = array( '2_factor_auth' => '2-factor authentication', @@ -1050,6 +1050,8 @@ URL: [url]', 'settings_contentDir_desc' => 'Where the uploaded files are stored (best to choose a directory that is not accessible through your web-server)', 'settings_contentOffsetDir' => 'Content Offset Directory', 'settings_contentOffsetDir_desc' => 'To work around limitations in the underlying file system, a new directory structure has been devised that exists within the content directory (Content Directory). This requires a base directory from which to begin. Usually leave this to the default setting, 1048576, but can be any number or string that does not already exist within (Content Directory)', +'settings_convertToPdf' => 'Convert document to PDF for preview', +'settings_convertToPdf_desc' => 'If a document cannot be natively displayed by the browser, a converted version to pdf will be shown.', 'settings_cookieLifetime' => 'Cookie Life time', 'settings_cookieLifetime_desc' => 'The life time of a cookie in seconds. If set to 0 the cookie will be removed when the browser is closed.', 'settings_coreDir' => 'Core SeedDMS directory', @@ -1252,6 +1254,8 @@ URL: [url]', 'settings_rootFolderID_desc' => 'ID of root-folder (mostly no need to change)', 'settings_SaveError' => 'Configuration file save error', 'settings_Server' => 'Server settings', +'settings_showFullPreview' => 'Show complete document', +'settings_showFullPreview_desc' => 'Enable/disable a full preview of the document on the details page, if the browser is capable to do so.', 'settings_showMissingTranslations' => 'Show missing translations', 'settings_showMissingTranslations_desc' => 'List all missing translations on the page at the bottom of the page. The logged in user will be able to submit a proposal for a missing translation which will be saved in a csv file. Do not turn this function on if in a production environment!', 'settings_showSingleSearchHit' => 'Jump right to a single search hit', @@ -1405,6 +1409,7 @@ URL: [url]', 'sunday_abbr' => 'Su', 'sv_SE' => 'Swedish', 'switched_to' => 'Switched to', +'takeOverAttributeValue' => 'Take over attribute value from last version', 'takeOverGrpApprover' => 'Take over group of approvers from last version.', 'takeOverGrpReviewer' => 'Take over group of reviewers from last version.', 'takeOverIndApprover' => 'Take over individual approver from last version.', diff --git a/languages/es_ES/lang.inc b/languages/es_ES/lang.inc index 159faaafc..545c4aa01 100644 --- a/languages/es_ES/lang.inc +++ b/languages/es_ES/lang.inc @@ -1018,6 +1018,8 @@ URL: [url]', 'settings_contentDir_desc' => 'Donde se almacenan los archivos subidos (es preferible seleccionar una carpeta que no sea accesible a través del servidor web)', 'settings_contentOffsetDir' => 'Carpeta de contenidos de desplazamiento', 'settings_contentOffsetDir_desc' => 'Para tratar las limitaciones del sistema de ficheros subyacentes, se ha ideado una estructura de carpetas dentro de la carpeta de contenido. Esto requiere una carpeta base desde la que comenzar. Normalmente puede dejar este valor por defecto, 1048576, pero puede ser cualquier número o cadena que no exista ya dentro de ella (carpeta de contenido).', +'settings_convertToPdf' => '', +'settings_convertToPdf_desc' => '', 'settings_cookieLifetime' => 'Tiempo de vida de las cookies', 'settings_cookieLifetime_desc' => 'Tiempo de vida de las cookies en segundos. Si asigna 0 la cookie será eliminada cuando el navegador se cierre.', 'settings_coreDir' => 'Carpeta de SeedDMS Core', @@ -1220,6 +1222,8 @@ URL: [url]', 'settings_rootFolderID_desc' => 'ID de la carpeta raíz (normalmente no es necesario cambiar)', 'settings_SaveError' => 'Error guardando archivo de configuración', 'settings_Server' => 'Configuración del servidor', +'settings_showFullPreview' => '', +'settings_showFullPreview_desc' => '', 'settings_showMissingTranslations' => 'Mostrar traducciones faltantes', 'settings_showMissingTranslations_desc' => 'Listar todos los términos pendientes de traducción de esta página al final de la misma. En entorno productivo no activar esta función', 'settings_showSingleSearchHit' => '', @@ -1373,6 +1377,7 @@ URL: [url]', 'sunday_abbr' => 'D', 'sv_SE' => 'Sueco', 'switched_to' => 'Cambiar a', +'takeOverAttributeValue' => '', 'takeOverGrpApprover' => '', 'takeOverGrpReviewer' => '', 'takeOverIndApprover' => '', diff --git a/languages/fr_FR/lang.inc b/languages/fr_FR/lang.inc index 9929b3225..6734977e5 100644 --- a/languages/fr_FR/lang.inc +++ b/languages/fr_FR/lang.inc @@ -1000,6 +1000,8 @@ URL: [url]', 'settings_contentDir_desc' => 'Endroit ou les fichiers téléchargés sont stockés (il est préférable de choisir un répertoire qui n\'est pas accessible par votre serveur web)', 'settings_contentOffsetDir' => 'Content Offset Directory', 'settings_contentOffsetDir_desc' => 'To work around limitations in the underlying file system, a new directory structure has been devised that exists within the content directory (Content Directory). This requires a base directory from which to begin. Usually leave this to the default setting, 1048576, but can be any number or string that does not already exist within (Content Directory)', +'settings_convertToPdf' => '', +'settings_convertToPdf_desc' => '', 'settings_cookieLifetime' => 'Durée de vie des Cookies', 'settings_cookieLifetime_desc' => 'La durée de vie d\'un cooke en secondes. Si réglée à 0, le cookie sera supprimé à la fermeture du navigateur.', 'settings_coreDir' => 'Répertoire Core SeedDMS', @@ -1202,6 +1204,8 @@ URL: [url]', 'settings_rootFolderID_desc' => 'ID du répertoire racine (la plupart du temps pas besoin de changer)', 'settings_SaveError' => 'Erreur de sauvegarde du fichier de configuration', 'settings_Server' => 'Paramètres serveur', +'settings_showFullPreview' => '', +'settings_showFullPreview_desc' => '', 'settings_showMissingTranslations' => 'Afficher les traductions manquantes', 'settings_showMissingTranslations_desc' => 'Lister toutes les traductions manquantes de la page dans le bas de la page. L\'utilisateur connecté pourra proposer une traduction manquante qui sera sauvegardée dans un fichier CSV. Ne pas activer cette fonction en production.', 'settings_showSingleSearchHit' => '', @@ -1355,6 +1359,7 @@ URL: [url]', 'sunday_abbr' => 'Dim.', 'sv_SE' => 'Suédois', 'switched_to' => 'Connexion provisoire sous', +'takeOverAttributeValue' => '', 'takeOverGrpApprover' => 'Récupérer le groupe d\'approbateurs de la dernière version.', 'takeOverGrpReviewer' => 'Récupérer le groupe d\'examinateurs de la dernière version.', 'takeOverIndApprover' => 'Récupérer les approbateurs de la dernière version.', diff --git a/languages/hr_HR/lang.inc b/languages/hr_HR/lang.inc index 655f23f45..e801bc2c0 100644 --- a/languages/hr_HR/lang.inc +++ b/languages/hr_HR/lang.inc @@ -1039,6 +1039,8 @@ Internet poveznica: [url]', 'settings_contentDir_desc' => 'Gdje se spremaju učitane datoteke (najbolje da odaberete mapu koja nije dostupna kroz vaš web-server)', 'settings_contentOffsetDir' => 'Offset mapa sadržaja', 'settings_contentOffsetDir_desc' => 'Za zaobilaželje ograničenja unutar datotečnog sustava, nova struktura mapa je a new directory structure je zasnovana i nalazi se unutar mape sadržaja. Ovo zahtjeva baznu mapu od koje se kreće. Uobičajeno da se ostavlja zadana postavka, 1048576, ali može biti bilo koji niz koji se već ne nalazi unutar mape sadržaja', +'settings_convertToPdf' => '', +'settings_convertToPdf_desc' => '', 'settings_cookieLifetime' => 'Životni vijek kolačića', 'settings_cookieLifetime_desc' => 'Životni vijek kolačića u sekundama. Ako je postavljeno na 0, kolačić će biti uklonjen kada se zatvori pretraživač.', 'settings_coreDir' => 'Mapa jezgre Core ProsperaDMS-a', @@ -1241,6 +1243,8 @@ Internet poveznica: [url]', 'settings_rootFolderID_desc' => 'ID root mape (većinom ne treba mijenjati)', 'settings_SaveError' => 'Greška pri spremanju datoteke konfiguracije', 'settings_Server' => 'Postavke servera', +'settings_showFullPreview' => '', +'settings_showFullPreview_desc' => '', 'settings_showMissingTranslations' => 'Prikaži prijevode koji nedostaju', 'settings_showMissingTranslations_desc' => 'Navedi sve prijevode koji nedostaju na stranici na dnu stranice. Prijavljeni korisnik će moći podnijeti prijedlog za prijevode koji nedostaju koji će biti pohranjen u csv datoteku. Ne uključujte ovu funkciju ako ste u proizvodnoj okolini!', 'settings_showSingleSearchHit' => '', @@ -1394,6 +1398,7 @@ Internet poveznica: [url]', 'sunday_abbr' => 'Ne', 'sv_SE' => 'Švedski', 'switched_to' => 'Promjenjeno u', +'takeOverAttributeValue' => '', 'takeOverGrpApprover' => 'Preuzimanje grupe odobravatelja iz zadnje verzije.', 'takeOverGrpReviewer' => 'Preuzimanje grupe revizora iz zadnje verzije.', 'takeOverIndApprover' => 'Preuzimanje pojedinačnog odobravatelja iz zadnje verzije.', diff --git a/languages/hu_HU/lang.inc b/languages/hu_HU/lang.inc index 4af120bd5..f4125e90a 100644 --- a/languages/hu_HU/lang.inc +++ b/languages/hu_HU/lang.inc @@ -1017,6 +1017,8 @@ URL: [url]', 'settings_contentDir_desc' => 'Feltöltött állományok tárolási helye (olyan könyvtárat érdemes választani, amelyhez nem lehet a webszerveren keresztül hozzáférni)', 'settings_contentOffsetDir' => 'Tartalom eltérési könyvtár', 'settings_contentOffsetDir_desc' => 'Az alapul szolgáló fájlrendszer korlátozásainak kikerülésére új könyvtár struktúra került kialakításra amely úgy lett tervezve, hogy létezzen a tároló könyvtárban (Content Directory). Ehhez szükséges egy alap könyvtár ahonnan indul. Általában meg lehet hagyni az alapértelmezett értéket ami 1048576, de megadható bármilyen szám vagy karaktersorozat amely nem létezik a tartalom könyvtárban (Content Directory)', +'settings_convertToPdf' => '', +'settings_convertToPdf_desc' => '', 'settings_cookieLifetime' => 'Süti élettartam', 'settings_cookieLifetime_desc' => 'A süti élettartama másodpercben. Ha az értéke 0 akkor a süti a böngésző bezárásakor lesz törölve.', 'settings_coreDir' => 'Alap SeedDMS könyvtár', @@ -1219,6 +1221,8 @@ URL: [url]', 'settings_rootFolderID_desc' => 'Gyökér mappa azonosítója (általában nem kell módosítani)', 'settings_SaveError' => 'Konfigurációs állomány mentési hiba', 'settings_Server' => 'Kiszolgáló beállítások', +'settings_showFullPreview' => '', +'settings_showFullPreview_desc' => '', 'settings_showMissingTranslations' => 'Jelenítse meg a hiányzó fordításokat', 'settings_showMissingTranslations_desc' => 'Felsorolja az összes hiányzó fordítást a lap alján. A bejelentkezett felhasználó képes lesz arra, hogy javaslatot nyújtson be a hiányzó fordításokra, amelyek egy csv állományba kerülnek mentésre. Ne kapcsolja be ezt a funkciót élse környezetben!', 'settings_showSingleSearchHit' => '', @@ -1372,6 +1376,7 @@ URL: [url]', 'sunday_abbr' => 'Va', 'sv_SE' => 'Svéd', 'switched_to' => 'Felhasználó váltás', +'takeOverAttributeValue' => '', 'takeOverGrpApprover' => '', 'takeOverGrpReviewer' => '', 'takeOverIndApprover' => '', diff --git a/languages/it_IT/lang.inc b/languages/it_IT/lang.inc index 1e5690bb7..bbe6c77df 100644 --- a/languages/it_IT/lang.inc +++ b/languages/it_IT/lang.inc @@ -1051,6 +1051,8 @@ URL: [url]', 'settings_contentDir_desc' => 'Cartella in cui vengono conservati i files caricati, si consiglia di scegliere una cartella sul web-server che non sia direttamente accessibile.', 'settings_contentOffsetDir' => 'Cartella Offset', 'settings_contentOffsetDir_desc' => 'Per supplire a limitazioni all\'utilizzo del filesystem è stata concepita una nuova struttura di cartelle all\'interno della cartella contenitore (Content Directory). Questa necessita di una cartella di partenza: di solito è sufficiente lasciare il nome di default, 1048576, ma può essere usato un qualsiasi numero o stringa che non esistano già all\'interno della cartella contenitore (Content Directory)', +'settings_convertToPdf' => '', +'settings_convertToPdf_desc' => '', 'settings_cookieLifetime' => 'Tempo di vita del cookie', 'settings_cookieLifetime_desc' => 'Tempo di vita del cookie in secondi: se impostato su 0 il cookie verrà rimosso alla chiusura del browser', 'settings_coreDir' => 'Cartella principale dell\'applicazione', @@ -1253,6 +1255,8 @@ URL: [url]', 'settings_rootFolderID_desc' => 'ID della cartella principale (non dovrebbe essere necessario modificarlo)', 'settings_SaveError' => 'Errore di salvataggio del file di configurazione', 'settings_Server' => 'Impostazioni Server', +'settings_showFullPreview' => '', +'settings_showFullPreview_desc' => '', 'settings_showMissingTranslations' => 'Mostra traduzioni mancanti', 'settings_showMissingTranslations_desc' => 'Elenca tutte le traduzioni mancanti alla fine della pagina. L\'utente collegato potrà sottoporre una proposta per le traduzioni mancanti che verrà salvata in un file .csv. Da non usarsi in un ambiente di produzione.', 'settings_showSingleSearchHit' => '', @@ -1406,6 +1410,7 @@ URL: [url]', 'sunday_abbr' => 'Dom', 'sv_SE' => 'Svedese', 'switched_to' => 'Passato a', +'takeOverAttributeValue' => '', 'takeOverGrpApprover' => 'Riprendi il gruppo degli approvatori dall\'ultima versione.', 'takeOverGrpReviewer' => 'Riprendi il gruppo dei revisori dall\'ultima versione.', 'takeOverIndApprover' => 'Riprendi l\'approvatore dall\'ultima versione.', diff --git a/languages/ko_KR/lang.inc b/languages/ko_KR/lang.inc index 72d5f226a..eeea19477 100644 --- a/languages/ko_KR/lang.inc +++ b/languages/ko_KR/lang.inc @@ -1032,6 +1032,8 @@ URL : [url]', 'settings_contentDir_desc' => '업로드 된 파일의 저장 위치(웹 서버를 통해 액세스 할 수없는 디렉토리를 선택하는 것이 가장 좋습니다)', 'settings_contentOffsetDir' => '내용 오프셋 디렉토리', 'settings_contentOffsetDir_desc' => '기본 파일 시스템의 한계를 극복하기 위해, 새로운 디렉토리를 콘텐츠 디렉터리 내에 존재하도록 설계 되었습니다. (콘텐츠 디렉토리). 시작할시 기본 디렉토리가 필요하며 일반적으로 기본 설정을 1048576 이지만 이미 (콘텐츠 디렉토리) 내에 존재하지 않는 숫자 또는 문자열이 될 수도 있습니다 .', +'settings_convertToPdf' => '', +'settings_convertToPdf_desc' => '', 'settings_cookieLifetime' => '쿠키 활성 시간', 'settings_cookieLifetime_desc' => '활성 시간을 0으로 설정하면 브라우저가 닫힐 때 마다 쿠키가 제거됩니다.', 'settings_coreDir' => '코어 SeedDMS 디렉토리', @@ -1234,6 +1236,8 @@ URL : [url]', 'settings_rootFolderID_desc' => '루트 폴더 ID (대부분 변경은 필요 없음)', 'settings_SaveError' => '구성 파일 오류를 저장', 'settings_Server' => '서버 설정', +'settings_showFullPreview' => '', +'settings_showFullPreview_desc' => '', 'settings_showMissingTranslations' => '누락된 번역보기', 'settings_showMissingTranslations_desc' => '페이지 하단에 현재 페이지의 부족한 번역을 나열 합니다. 로그인 한 사용자는 부족한 번역을 제안 및 제출 할 수 있게 되며 CSV 파일로 저장됩니다. 프로덕션 환경의 경우이 기능을 이기능을 선택하지 마십시오!', 'settings_showSingleSearchHit' => '', @@ -1387,6 +1391,7 @@ URL : [url]', 'sunday_abbr' => '일', 'sv_SE' => '스웨덴어', 'switched_to' => '전환', +'takeOverAttributeValue' => '', 'takeOverGrpApprover' => '마지막 버전의 승인자의 그룹를 인수 합니다.', 'takeOverGrpReviewer' => '최종 버전의 리뷰 그룹을 상속합니다.', 'takeOverIndApprover' => '마지막 버전의 개별 승인자를 인수 합니다.', diff --git a/languages/nl_NL/lang.inc b/languages/nl_NL/lang.inc index a66e89e80..e1bc981b8 100644 --- a/languages/nl_NL/lang.inc +++ b/languages/nl_NL/lang.inc @@ -1045,6 +1045,8 @@ URL: [url]', 'settings_contentDir_desc' => 'Waar de verzonden bestande opgeslagen worden (Kan het beste een map zijn die niet benaderbaar is voor de webserver.)', 'settings_contentOffsetDir' => 'Inhouds Basis Map', 'settings_contentOffsetDir_desc' => 'Om de beperkingen van het onderliggende bestandssysteem te omzeilen, is een nieuwe mappenstructuur bedacht dat binnen de inhoudsmap (Inhoudsmap) bestaat. Hiervoor is een map nodig als basis. Gebruikelijk is om dit de standaardwaarde te laten, 1048576, maar kan elke waarde of tekst bevatten dat nog niet bestaat binnen de (Inhoudsmap)', +'settings_convertToPdf' => '', +'settings_convertToPdf_desc' => '', 'settings_cookieLifetime' => 'Cookie Life time', 'settings_cookieLifetime_desc' => 'Hoe lang een cookie moet worden behouden. Indien ingesteld op 0 worden de cookies verwijderd bij het afsluiten van de browser.', 'settings_coreDir' => 'Core letoDMS map', @@ -1247,6 +1249,8 @@ URL: [url]', 'settings_rootFolderID_desc' => 'ID van basismap (meestal geen verandering nodig)', 'settings_SaveError' => 'Opslagfout Configuratiebestand', 'settings_Server' => 'Server instellingen', +'settings_showFullPreview' => '', +'settings_showFullPreview_desc' => '', 'settings_showMissingTranslations' => 'Ontbrekende vertalingen weergeven', 'settings_showMissingTranslations_desc' => 'Geef alle ontbrekende vertalingen onder aan de pagina weer. De gebruiker kan een verzoek tot vertaling indienen dat wordt opgeslagen als csv bestand. Let op! Zet deze functie niet aan in productieomgevingen!', 'settings_showSingleSearchHit' => '', @@ -1400,6 +1404,7 @@ URL: [url]', 'sunday_abbr' => 'zo', 'sv_SE' => 'Zweeds', 'switched_to' => 'Overgeschakeld naar', +'takeOverAttributeValue' => '', 'takeOverGrpApprover' => 'Onthoud de laatste groep goedkeurders', 'takeOverGrpReviewer' => 'Onthoud de laatste groep herzieners', 'takeOverIndApprover' => 'Onthoud de laatste groep individuele goedkeurders', diff --git a/languages/pl_PL/lang.inc b/languages/pl_PL/lang.inc index 3c828b739..dc167dc6d 100644 --- a/languages/pl_PL/lang.inc +++ b/languages/pl_PL/lang.inc @@ -997,6 +997,8 @@ URL: [url]', 'settings_contentDir_desc' => 'Miejsce, gdzie będą przechowywane wczytane pliki (najlepien wybrać katalog, który nie jest dostępny dla serwera http)', 'settings_contentOffsetDir' => 'Offset katalogu treści', 'settings_contentOffsetDir_desc' => 'Aby obejść ograniczenia w bazowym systemie plików, zostanie w nim utworzona nowa struktura katalogów. To wymaga określenia katalogu początkowego. Zazwyczaj można zostawić domyślną wartość, 1048576, ale może też być dowolnym numerem lub słowem, które aktualnie nie istnieje w katalogu treści (Katalog treści)', +'settings_convertToPdf' => '', +'settings_convertToPdf_desc' => '', 'settings_cookieLifetime' => 'Czas życia ciasteczka', 'settings_cookieLifetime_desc' => 'Czas życia pliku cookie w sekundach. Jeśli wartość zostanie ustawione na 0, plik cookie zostanie usunięte po zamknięciu przeglądarki.', 'settings_coreDir' => 'Katalog Core letoDMS', @@ -1199,6 +1201,8 @@ URL: [url]', 'settings_rootFolderID_desc' => 'ID katalogu głównego (zazwyczaj nie trzeba tego zmieniać)', 'settings_SaveError' => 'Błąd zapisu pliku konfiguracyjnego', 'settings_Server' => 'Ustawienia serwera', +'settings_showFullPreview' => '', +'settings_showFullPreview_desc' => '', 'settings_showMissingTranslations' => '', 'settings_showMissingTranslations_desc' => '', 'settings_showSingleSearchHit' => '', @@ -1352,6 +1356,7 @@ URL: [url]', 'sunday_abbr' => 'Ni', 'sv_SE' => 'szwedzki', 'switched_to' => 'Przełączone na', +'takeOverAttributeValue' => '', 'takeOverGrpApprover' => '', 'takeOverGrpReviewer' => '', 'takeOverIndApprover' => '', diff --git a/languages/pt_BR/lang.inc b/languages/pt_BR/lang.inc index 12852c468..e2b01eb19 100644 --- a/languages/pt_BR/lang.inc +++ b/languages/pt_BR/lang.inc @@ -1015,6 +1015,8 @@ URL: [url]', 'settings_contentDir_desc' => 'Onde arquivos enviados são armazenados (melhor escolher um diretório que não é acessível através de seu web-server)', 'settings_contentOffsetDir' => 'Pasta de Compensação de Conteúdo', 'settings_contentOffsetDir_desc' => 'Para contornar as limitações do sistema de arquivos subjacente, uma nova estrutura de diretórios foi concebida que existe dentro do diretório de conteúdo (Content Directory). Isso requer um diretório base para começar. Normalmente, deixe Isso para a configuração padrão, 1048576, mas pode ser qualquer número ou cadeia de caracteres que ainda não existe dentro (Diretório de conteúdo)', +'settings_convertToPdf' => '', +'settings_convertToPdf_desc' => '', 'settings_cookieLifetime' => 'Tempo de Vida dos Cookies', 'settings_cookieLifetime_desc' => 'O tempo de vida de um cookie em segundos. Se definido como 0, o cookie será removido quando o navegador é fechado.', 'settings_coreDir' => 'Diretório Núcleo do SeedDMS', @@ -1217,6 +1219,8 @@ URL: [url]', 'settings_rootFolderID_desc' => 'ID da pasta-raiz (na maioria das vezes não precisa ser mudado)', 'settings_SaveError' => 'Erro no arquivo de configuração salvo', 'settings_Server' => 'Configuraçoes do servidor', +'settings_showFullPreview' => '', +'settings_showFullPreview_desc' => '', 'settings_showMissingTranslations' => 'Mostrar traduções em falta', 'settings_showMissingTranslations_desc' => 'Listar todas as traduções faltando na página na parte inferior da página. O usuário conectado será capaz de apresentar uma proposta para uma tradução em falta que serão salvos em um arquivo CSV. Não ativar eáa função, se em um ambiente de produção!', 'settings_showSingleSearchHit' => '', @@ -1370,6 +1374,7 @@ URL: [url]', 'sunday_abbr' => 'Su', 'sv_SE' => 'Sueco', 'switched_to' => 'Comutado para', +'takeOverAttributeValue' => '', 'takeOverGrpApprover' => '', 'takeOverGrpReviewer' => '', 'takeOverIndApprover' => '', diff --git a/languages/ro_RO/lang.inc b/languages/ro_RO/lang.inc index d24daccf6..b5f620de9 100644 --- a/languages/ro_RO/lang.inc +++ b/languages/ro_RO/lang.inc @@ -1040,6 +1040,8 @@ URL: [url]', 'settings_contentDir_desc' => 'Unde sunt stocate fișierele încărcate (este recomandat sa alegeti un director care nu este accesibil prin intermediul web-server-ului dumneavoastră)', 'settings_contentOffsetDir' => 'Conținut Director Offset', 'settings_contentOffsetDir_desc' => 'Pentru a lucra în jurul valorii de limităre în sistemul de fișiere de bază, o nouă structură director a fost concepută care există in directorul conținut (Content Director). Acest lucru necesită un director de bază din care să se înceapă. De obicei, lăsați asta la setarea implicită, 1048576, dar se poate trece orice număr sau șir care nu este deja inclus (Content Director)', +'settings_convertToPdf' => '', +'settings_convertToPdf_desc' => '', 'settings_cookieLifetime' => 'Timp de viață Cookie', 'settings_cookieLifetime_desc' => 'Durata de viață a unui cookie în secunde. Dacă este setat la 0 cookie-ul va fi eliminat atunci când browser-ul este închis.', 'settings_coreDir' => 'Director SeedDMS Core', @@ -1242,6 +1244,8 @@ URL: [url]', 'settings_rootFolderID_desc' => 'ID-ul folder-ului rădăcină (de regulă nu este nevoie să se schimbe)', 'settings_SaveError' => 'Eroare la salvarea fișierului de configurare', 'settings_Server' => 'Setări server', +'settings_showFullPreview' => '', +'settings_showFullPreview_desc' => '', 'settings_showMissingTranslations' => 'Arată traducerile lipsă', 'settings_showMissingTranslations_desc' => 'Listează toate traducerile lipsă în partea de jos a paginii. Utilizatorul autentificat va putea să propună o traducere lipsă care va fi apoi salvată într-un fișier csv. Nu porniți această funcționalitate într-un mediu de producție!', 'settings_showSingleSearchHit' => '', @@ -1395,6 +1399,7 @@ URL: [url]', 'sunday_abbr' => 'Du', 'sv_SE' => 'Suedeză', 'switched_to' => 'Comutat pe', +'takeOverAttributeValue' => '', 'takeOverGrpApprover' => 'Preia grupul de aprobatori din ultima versiune.', 'takeOverGrpReviewer' => 'Preia grupul de revizuitori din ultima versiune.', 'takeOverIndApprover' => 'Preia aprobatorul individual din ultima versiune.', diff --git a/languages/ru_RU/lang.inc b/languages/ru_RU/lang.inc index 77fe8b3a5..c95e645db 100644 --- a/languages/ru_RU/lang.inc +++ b/languages/ru_RU/lang.inc @@ -1047,6 +1047,8 @@ URL: [url]', 'settings_contentDir_desc' => 'Куда сохраняются загруженные файлы (лучше выбрать каталог недоступный веб-серверу).', 'settings_contentOffsetDir' => 'Базовый начальный каталог', 'settings_contentOffsetDir_desc' => 'Во избежание проблем с файловой системой была введена новая структура каталогов в каталоге содержимого. Необходим базовый начальный каталог. Впрочем, оставьте тут все как есть, 1048576, но может быть любым числом или строкой, не существующей уже в каталоге содержимого.', +'settings_convertToPdf' => '', +'settings_convertToPdf_desc' => '', 'settings_cookieLifetime' => 'Время жизни куки', 'settings_cookieLifetime_desc' => 'Время жизни куки в секундах. Если установлено 0, то куки будут удалены при закрытии браузера.', 'settings_coreDir' => 'Каталог Core SeedDMS', @@ -1249,6 +1251,8 @@ URL: [url]', 'settings_rootFolderID_desc' => 'ID каждого корневого каталога (можно не менять).', 'settings_SaveError' => 'Ошибка при сохранении конфигурации', 'settings_Server' => 'Настройки сервера', +'settings_showFullPreview' => '', +'settings_showFullPreview_desc' => '', 'settings_showMissingTranslations' => 'Фразы которые нужно перевести', 'settings_showMissingTranslations_desc' => 'Отображать внизу страницы фразы, которые нуждаются в переводе', 'settings_showSingleSearchHit' => '', @@ -1402,6 +1406,7 @@ URL: [url]', 'sunday_abbr' => 'Вс', 'sv_SE' => 'Swedish', 'switched_to' => 'Переключён как', +'takeOverAttributeValue' => '', 'takeOverGrpApprover' => 'Использовать группу утверждающих из прошлой версии', 'takeOverGrpReviewer' => 'Использовать группу рецензентов из прошлой версии', 'takeOverIndApprover' => 'Использовать утверждающих из прошлой версии', diff --git a/languages/sk_SK/lang.inc b/languages/sk_SK/lang.inc index f3bd812b1..86b2c3492 100644 --- a/languages/sk_SK/lang.inc +++ b/languages/sk_SK/lang.inc @@ -872,6 +872,8 @@ URL: [url]', 'settings_contentDir_desc' => '', 'settings_contentOffsetDir' => '', 'settings_contentOffsetDir_desc' => '', +'settings_convertToPdf' => '', +'settings_convertToPdf_desc' => '', 'settings_cookieLifetime' => '', 'settings_cookieLifetime_desc' => '', 'settings_coreDir' => '', @@ -1074,6 +1076,8 @@ URL: [url]', 'settings_rootFolderID_desc' => '', 'settings_SaveError' => '', 'settings_Server' => '', +'settings_showFullPreview' => '', +'settings_showFullPreview_desc' => '', 'settings_showMissingTranslations' => '', 'settings_showMissingTranslations_desc' => '', 'settings_showSingleSearchHit' => '', @@ -1227,6 +1231,7 @@ URL: [url]', 'sunday_abbr' => '', 'sv_SE' => 'Švédština', 'switched_to' => '', +'takeOverAttributeValue' => '', 'takeOverGrpApprover' => '', 'takeOverGrpReviewer' => '', 'takeOverIndApprover' => '', diff --git a/languages/sv_SE/lang.inc b/languages/sv_SE/lang.inc index 246773bb2..0107d3e73 100644 --- a/languages/sv_SE/lang.inc +++ b/languages/sv_SE/lang.inc @@ -1003,6 +1003,8 @@ URL: [url]', 'settings_contentDir_desc' => 'Mappen där alla uppladdade filer kommer att sparas. (Det bästa är att välja en mapp som inte är tillgänglig från webbservern)', 'settings_contentOffsetDir' => 'Innehåll offset-mapp', 'settings_contentOffsetDir_desc' => 'För att undvika begränsningar i det underliggande filsystemet har en ny mappstruktur skapats inom innehållsmappen (Content Directory). Detta behöver en bas-mapp att utgå ifrån. Vanligtvis är default-inställningen 1048576 men det kan vara vilket nummer eller vilken sträng som helst som inte redan finns i mappen (Content Directory)', +'settings_convertToPdf' => '', +'settings_convertToPdf_desc' => '', 'settings_cookieLifetime' => 'Livslängd för cookies', 'settings_cookieLifetime_desc' => 'Livslängd för en cookie i sekunder. Om värdet sätts till 0, kommer cookien att tas bort efter att webbläsaren har stängts ner.', 'settings_coreDir' => 'LetoDMS_Core-mapp', @@ -1205,6 +1207,8 @@ URL: [url]', 'settings_rootFolderID_desc' => 'ID för root-mappen (oftast behövs ingen ändring här)', 'settings_SaveError' => 'Fel när konfigurationsfilen sparades', 'settings_Server' => 'Server-inställningar', +'settings_showFullPreview' => '', +'settings_showFullPreview_desc' => '', 'settings_showMissingTranslations' => 'Visa saknade översättningar', 'settings_showMissingTranslations_desc' => 'Lista alla saknade översättningar längst ner på sidan. Den inloggade användaren får möjligheten att skicka in ett förslag för saknade översättningar som kommer sparas i en CSV fil. Sätt denna option inte på, på ett DMS som används i verksamheten.', 'settings_showSingleSearchHit' => '', @@ -1358,6 +1362,7 @@ URL: [url]', 'sunday_abbr' => 'sö', 'sv_SE' => 'svenska', 'switched_to' => 'Bytt till', +'takeOverAttributeValue' => '', 'takeOverGrpApprover' => '', 'takeOverGrpReviewer' => '', 'takeOverIndApprover' => '', diff --git a/languages/tr_TR/lang.inc b/languages/tr_TR/lang.inc index 10b4d1ba8..0b8ecf013 100644 --- a/languages/tr_TR/lang.inc +++ b/languages/tr_TR/lang.inc @@ -1019,6 +1019,8 @@ URL: [url]', 'settings_contentDir_desc' => 'Yüklenecek dosyaların depolanacağı yer (web üzerinden erişilemeyen bir yer tercih etmeniz önerilir.)', 'settings_contentOffsetDir' => 'İçerik Ofset Klasörü', 'settings_contentOffsetDir_desc' => 'Dosya sistemindeki kısıtlamaları aşabilmek için mevcut içerik dizini içerisinde yeni bir dizin yapısı geliştirildi. Bu, başlangıç için temel bir dizin gerektirir. Genellikle bunu varsayılan değer olan 1048576 olarak bırakmanız önerilir fakat İçerik Dizininde mevcut olmayan herhangi bir sayı veya string olabilir.', +'settings_convertToPdf' => '', +'settings_convertToPdf_desc' => '', 'settings_cookieLifetime' => 'Çerez geçerlilik süresi', 'settings_cookieLifetime_desc' => 'Çerezlerin saniye olarak geçerlilik süresi. 0 olarak ayarlanırsa tarayıcı kapatıldığında çerezler silinir.', 'settings_coreDir' => 'Çekirdek (core) SeedDMS klasörü', @@ -1221,6 +1223,8 @@ URL: [url]', 'settings_rootFolderID_desc' => 'Kök dizinin ID numarası(genelde değiştirilmesine gerek yok)', 'settings_SaveError' => 'Konfigürasyon dosyası kaydedilemedi', 'settings_Server' => 'Sunucu ayarları', +'settings_showFullPreview' => '', +'settings_showFullPreview_desc' => '', 'settings_showMissingTranslations' => 'Eksik çevirileri göster', 'settings_showMissingTranslations_desc' => 'Eksik çevirilerin tamamı sayfanın en altında listelenir. Giriş yapan kullanıclıar yapacakları çevirileri csv formatında gönderebilirler. Gerçekte kullanılan sistemlerde bunu açmamanız önerilir!', 'settings_showSingleSearchHit' => '', @@ -1374,6 +1378,7 @@ URL: [url]', 'sunday_abbr' => 'Pa', 'sv_SE' => 'İsveççe', 'switched_to' => 'Yerine geçilen', +'takeOverAttributeValue' => '', 'takeOverGrpApprover' => 'Bir önceki versiyon onayını yapan grubu al.', 'takeOverGrpReviewer' => 'Bir önceki versiyon kontrolünü yapan grubu al.', 'takeOverIndApprover' => 'Bir önceki versiyonu onaylayanı al.', diff --git a/languages/uk_UA/lang.inc b/languages/uk_UA/lang.inc index b99d51f1a..7bdfa216d 100644 --- a/languages/uk_UA/lang.inc +++ b/languages/uk_UA/lang.inc @@ -1040,6 +1040,8 @@ URL: [url]', 'settings_contentDir_desc' => 'Куди зберігаються завантажені файли (краще вибрати каталог, недоступний веб-серверові).', 'settings_contentOffsetDir' => 'Базовий початковий каталог', 'settings_contentOffsetDir_desc' => 'Для уникнення проблем з файловою системою було введено структуру каталогів у каталозі вмісту. Необхідний базовий початковий каталог. Втім, залиште тут все, як є, 1048576, але може бути будь-яким числом чи рядком, якого ще немає в каталозі вмісту.', +'settings_convertToPdf' => '', +'settings_convertToPdf_desc' => '', 'settings_cookieLifetime' => 'Час життя куки', 'settings_cookieLifetime_desc' => 'Час життя куки в секундах. Якщо встановлено 0, то куки будуть видалені при закритті браузера.', 'settings_coreDir' => 'Каталог Core SeedDMS', @@ -1242,6 +1244,8 @@ URL: [url]', 'settings_rootFolderID_desc' => 'ID кожного кореневого каталогу (можна не змінювати).', 'settings_SaveError' => 'Помилка при збереженні конфігурації', 'settings_Server' => 'Налаштування сервера', +'settings_showFullPreview' => '', +'settings_showFullPreview_desc' => '', 'settings_showMissingTranslations' => 'Фрази, як потребують перекладу', 'settings_showMissingTranslations_desc' => 'Відображати внизу сторінки фрази, які потребують перекладу', 'settings_showSingleSearchHit' => '', @@ -1395,6 +1399,7 @@ URL: [url]', 'sunday_abbr' => 'Нд', 'sv_SE' => 'Swedish', 'switched_to' => 'Переключено на', +'takeOverAttributeValue' => '', 'takeOverGrpApprover' => 'Використати групу затверджувачів з попередньої версії', 'takeOverGrpReviewer' => 'Використати групу рецензентів з попередньої версії', 'takeOverIndApprover' => 'Використати затверджувачів з попередньої версії', diff --git a/languages/zh_CN/lang.inc b/languages/zh_CN/lang.inc index ab534bf94..fed54191a 100644 --- a/languages/zh_CN/lang.inc +++ b/languages/zh_CN/lang.inc @@ -874,6 +874,8 @@ URL: [url]', 'settings_contentDir_desc' => '', 'settings_contentOffsetDir' => '内容偏移目录', 'settings_contentOffsetDir_desc' => '要解决在底层文件系统的限制,一个新的目录结构已制定了内容目录(内容目录)中存在的。这需要从它开始一个基本目录。通常离开这个为默认设置,1048576,也可以是内(内容目录)不存在任何数字或字符串', +'settings_convertToPdf' => '', +'settings_convertToPdf_desc' => '', 'settings_cookieLifetime' => '', 'settings_cookieLifetime_desc' => '', 'settings_coreDir' => 'SeedDMS核心目录', @@ -1076,6 +1078,8 @@ URL: [url]', 'settings_rootFolderID_desc' => '', 'settings_SaveError' => '', 'settings_Server' => '', +'settings_showFullPreview' => '', +'settings_showFullPreview_desc' => '', 'settings_showMissingTranslations' => '显示丢失的翻译', 'settings_showMissingTranslations_desc' => '', 'settings_showSingleSearchHit' => '', @@ -1229,6 +1233,7 @@ URL: [url]', 'sunday_abbr' => '', 'sv_SE' => '瑞典语', 'switched_to' => '登录为', +'takeOverAttributeValue' => '', 'takeOverGrpApprover' => '', 'takeOverGrpReviewer' => '', 'takeOverIndApprover' => '', diff --git a/languages/zh_TW/lang.inc b/languages/zh_TW/lang.inc index 24d6258a4..e102eb1fc 100644 --- a/languages/zh_TW/lang.inc +++ b/languages/zh_TW/lang.inc @@ -872,6 +872,8 @@ URL: [url]', 'settings_contentDir_desc' => '', 'settings_contentOffsetDir' => '內容偏移目錄', 'settings_contentOffsetDir_desc' => '要解決在底層檔案系統的限制,一個新的目錄結構已制定了內容目錄(內容目錄)中存在的。這需要從它開始一個基本目錄。通常離開這個為默認設置,1048576,也可以是內(內容目錄)不存在任何數位或字串', +'settings_convertToPdf' => '', +'settings_convertToPdf_desc' => '', 'settings_cookieLifetime' => '', 'settings_cookieLifetime_desc' => '', 'settings_coreDir' => 'KME文檔系統核心目錄', @@ -1074,6 +1076,8 @@ URL: [url]', 'settings_rootFolderID_desc' => '', 'settings_SaveError' => '', 'settings_Server' => '', +'settings_showFullPreview' => '', +'settings_showFullPreview_desc' => '', 'settings_showMissingTranslations' => '', 'settings_showMissingTranslations_desc' => '', 'settings_showSingleSearchHit' => '', @@ -1227,6 +1231,7 @@ URL: [url]', 'sunday_abbr' => '', 'sv_SE' => '瑞典語', 'switched_to' => '', +'takeOverAttributeValue' => '', 'takeOverGrpApprover' => '', 'takeOverGrpReviewer' => '', 'takeOverIndApprover' => '', From f960f69fc96c9c396bacda884b350d12d4d53379 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 7 Nov 2016 09:25:06 +0100 Subject: [PATCH 084/164] add new configuration for preview of pdf documents --- inc/inc.ClassSettings.php | 8 ++++++++ op/op.Settings.php | 2 ++ views/bootstrap/class.Settings.php | 8 ++++++++ 3 files changed, 18 insertions(+) diff --git a/inc/inc.ClassSettings.php b/inc/inc.ClassSettings.php index 312b6fe84..432040f4c 100644 --- a/inc/inc.ClassSettings.php +++ b/inc/inc.ClassSettings.php @@ -201,6 +201,10 @@ class Settings { /* {{{ */ var $_previewWidthList = 40; // Preview image width on document details page var $_previewWidthDetail = 100; + // show full preview on document details page + var $_showFullPreview = false; + // convert to pdf for preview on document details page + var $_convertToPdf = false; // Show form to submit missing translations at end of page var $_showMissingTranslations = false; // Extra Path to additional software, will be added to include path @@ -377,6 +381,8 @@ class Settings { /* {{{ */ $this->_previewWidthList = intval($tab["previewWidthList"]); if(isset($tab["previewWidthDetail"])) $this->_previewWidthDetail = intval($tab["previewWidthDetail"]); + $this->_showFullPreview = Settings::boolVal($tab["showFullPreview"]); + $this->_convertToPdf = Settings::boolVal($tab["convertToPdf"]); // XML Path: /configuration/site/edition $node = $xml->xpath('/configuration/site/edition'); @@ -660,6 +666,8 @@ class Settings { /* {{{ */ $this->setXMLAttributValue($node, "theme", $this->_theme); $this->setXMLAttributValue($node, "previewWidthList", $this->_previewWidthList); $this->setXMLAttributValue($node, "previewWidthDetail", $this->_previewWidthDetail); + $this->setXMLAttributValue($node, "showFullPreview", $this->_showFullPreview); + $this->setXMLAttributValue($node, "convertToPdf", $this->_convertToPdf); // XML Path: /configuration/site/edition $node = $this->getXMLNode($xml, '/configuration/site', 'edition'); diff --git a/op/op.Settings.php b/op/op.Settings.php index a4f346ec5..08847f20b 100644 --- a/op/op.Settings.php +++ b/op/op.Settings.php @@ -60,6 +60,8 @@ if ($action == "saveSettings") $settings->_theme = $_POST["theme"]; $settings->_previewWidthList = $_POST["previewWidthList"]; $settings->_previewWidthDetail = $_POST["previewWidthDetail"]; + $settings->_showFullPreview = getBoolValue("showFullPreview"); + $settings->_convertToPdf = getBoolValue("convertToPdf"); // SETTINGS - SITE - EDITION $settings->_strictFormCheck = getBoolValue("strictFormCheck"); diff --git a/views/bootstrap/class.Settings.php b/views/bootstrap/class.Settings.php index d680b5ed3..17690e07e 100644 --- a/views/bootstrap/class.Settings.php +++ b/views/bootstrap/class.Settings.php @@ -153,6 +153,14 @@ if(!is_writeable($settings->_configFilePath)) { : showTextField("previewWidthDetail", $settings->_previewWidthDetail); ?> + "> + : + _showFullPreview) echo "checked" ?> /> + + "> + : + _convertToPdf) echo "checked" ?> /> + From c973a8c65bf13cc29001d8ca772a2fabd5c815fc Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 8 Nov 2016 11:09:42 +0100 Subject: [PATCH 093/164] fix error in onAddClipboard() used wrong variable name for event --- styles/bootstrap/application.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/styles/bootstrap/application.js b/styles/bootstrap/application.js index 34655a0e9..18032e324 100644 --- a/styles/bootstrap/application.js +++ b/styles/bootstrap/application.js @@ -461,7 +461,7 @@ $(document).ready( function() { function onAddClipboard(ev) { /* {{{ */ ev.preventDefault(); - var source_info = JSON.parse(e.originalEvent.dataTransfer.getData("text")); + var source_info = JSON.parse(ev.originalEvent.dataTransfer.getData("text")); source_type = source_info.type; source_id = source_info.id; formtoken = source_info.formtoken; @@ -698,6 +698,7 @@ $(document).ready(function() { attr_rel = $(e.currentTarget).attr('rel'); target_type = attr_rel.split("_")[0]; target_id = attr_rel.split("_")[1]; + console.log(e.originalEvent.dataTransfer.getData("text")); var source_info = JSON.parse(e.originalEvent.dataTransfer.getData("text")); source_type = source_info.type; source_id = source_info.id; From 943d8d262ca87fd13d5c1bfd8f518f198c86f668 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 8 Nov 2016 11:10:09 +0100 Subject: [PATCH 094/164] make entries in search result dragable and dropable --- views/bootstrap/class.Search.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/views/bootstrap/class.Search.php b/views/bootstrap/class.Search.php index 182624985..870d9775b 100644 --- a/views/bootstrap/class.Search.php +++ b/views/bootstrap/class.Search.php @@ -53,7 +53,9 @@ class SeedDMS_View_Search extends SeedDMS_Bootstrap_Style { } /* }}} */ function js() { /* {{{ */ - header('Content-Type: application/javascript'); + header('Content-Type: application/javascript; charset=UTF-8'); + + parent::jsTranslations(array('cancel', 'splash_move_document', 'confirm_move_document', 'move_document', 'splash_move_folder', 'confirm_move_folder', 'move_folder')); $this->printFolderChooserJs("form1"); $this->printDeleteFolderButtonJs(); @@ -473,7 +475,7 @@ class SeedDMS_View_Search extends SeedDMS_Bootstrap_Style { else $comment = htmlspecialchars($document->getComment()); if (strlen($comment) > 150) $comment = substr($comment, 0, 147) . "..."; - print "getID()."\">"; + print "getID()."\" class=\"table-row-document\" rel=\"document_".$document->getID()."\" formtoken=\"".createFormKey('movedocument')."\" draggable=\"true\">"; //print ""; if (in_array(2, $searchin)) { $docName = $this->markQuery(htmlspecialchars($document->getName()), "i"); @@ -559,7 +561,7 @@ class SeedDMS_View_Search extends SeedDMS_Bootstrap_Style { } else { $folderName = htmlspecialchars($folder->getName()); } - print "getID()."\" rel=\"folder_".$folder->getID()."\" class=\"folder\" ondragover=\"allowDrop(event)\" ondrop=\"onDrop(event)\">"; + print "getID()."\" draggable=\"true\" rel=\"folder_".$folder->getID()."\" class=\"folder table-row-folder\" formtoken=\"".createFormKey('movefolder')."\">"; print "getID()."\">imgpath."folder.png\" width=\"24\" height=\"24\" border=0>"; print "getID()."\">"; $path = $folder->getPath(); From b3571c360b531c00f10352d6f5c494c8f8f3a5b2 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 8 Nov 2016 11:27:28 +0100 Subject: [PATCH 095/164] new version 4.3.31 --- Makefile | 2 +- SeedDMS_Core/Core/inc.ClassDMS.php | 2 +- inc/inc.Version.php | 2 +- install/install.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 89a6b3750..50e756db2 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -VERSION=4.3.30 +VERSION=4.3.31 SRC=CHANGELOG inc conf utils index.php languages views op out doc drop-tables-innodb.sql styles js TODO LICENSE Makefile webdav install restapi pdfviewer # webapp diff --git a/SeedDMS_Core/Core/inc.ClassDMS.php b/SeedDMS_Core/Core/inc.ClassDMS.php index d28f62893..596e2e9c3 100644 --- a/SeedDMS_Core/Core/inc.ClassDMS.php +++ b/SeedDMS_Core/Core/inc.ClassDMS.php @@ -291,7 +291,7 @@ class SeedDMS_Core_DMS { $this->callbacks = array(); $this->version = '@package_version@'; if($this->version[0] == '@') - $this->version = '4.3.30'; + $this->version = '4.3.31'; } /* }}} */ /** diff --git a/inc/inc.Version.php b/inc/inc.Version.php index 238f82aa3..f9a2c123d 100644 --- a/inc/inc.Version.php +++ b/inc/inc.Version.php @@ -20,7 +20,7 @@ class SeedDMS_Version { - public $_number = "4.3.30"; + public $_number = "4.3.31"; private $_string = "SeedDMS"; function __construct() { diff --git a/install/install.php b/install/install.php index 8229f9cc2..ef1d20def 100644 --- a/install/install.php +++ b/install/install.php @@ -118,7 +118,7 @@ function fileExistsInIncludePath($file) { /* {{{ */ * Load default settings + set */ define("SEEDDMS_INSTALL", "on"); -define("SEEDDMS_VERSION", "4.3.30"); +define("SEEDDMS_VERSION", "4.3.31"); require_once('../inc/inc.ClassSettings.php'); From dae20dcd11c4388baceadd866ff8601e17d194ba Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 11 Nov 2016 09:09:51 +0100 Subject: [PATCH 096/164] backport code for reading converters now supports converters for preview and fulltext --- inc/inc.ClassSettings.php | 76 ++++++++++++++++++++++++++------------- 1 file changed, 51 insertions(+), 25 deletions(-) diff --git a/inc/inc.ClassSettings.php b/inc/inc.ClassSettings.php index 432040f4c..708208619 100644 --- a/inc/inc.ClassSettings.php +++ b/inc/inc.ClassSettings.php @@ -580,9 +580,22 @@ class Settings { /* {{{ */ $this->_maxExecutionTime = ini_get("max_execution_time"); // XML Path: /configuration/system/advanced/converters - $converters = $xml->xpath('/configuration/advanced/converters[@target="fulltext"]/converter'); - if(!$converters) - $converters = $xml->xpath('/configuration/advanced/converters/converter'); + $convertergroups = $xml->xpath('/configuration/advanced/converters'); + $this->_converters = array(); + foreach($convertergroups as $convertergroup) { + $tabgroup = $convertergroup->attributes(); + if(strval($tabgroup['target'])) + $target = strval($tabgroup['target']); + else + $target = 'fulltext'; + foreach($convertergroup as $converter) { + $tab = $converter->attributes(); + $this->_converters[$target][trim(strval($tab['mimeType']))] = trim(strval($converter)); + } + } + + /* + $converters = $xml->xpath('/configuration/advanced/converters/converter'); $this->_converters = array(); foreach($converters as $converter) { $tab = $converter->attributes(); @@ -591,6 +604,8 @@ class Settings { /* {{{ */ else $this->_converters[trim(strval($tab['target']))][trim(strval($tab['mimeType']))] = trim(strval($converter)); } + */ + return true; } /* }}} */ @@ -843,30 +858,41 @@ class Settings { /* {{{ */ $this->setXMLAttributValue($node, "maxExecutionTime", $this->_maxExecutionTime); $this->setXMLAttributValue($node, "cmdTimeout", $this->_cmdTimeout); - // XML Path: /configuration/advanced/converters - foreach($this->_converters['fulltext'] as $mimeType => $cmd) - { - // search XML node - $node = $xml->xpath('/configuration/advanced/converters/converter[@mimeType="'. $mimeType .'"]'); + /* Check if there is still a converters list with a target attribute */ + $node = $xml->xpath('/configuration/advanced/converters[count(@*)=0]'); + if (count($node)>0) { + $this->setXMLAttributValue($node[0], 'target', 'fulltext'); + } - if (isset($node)) - { - if (count($node)>0) - { - $node = $node[0]; - } - else - { - $nodeParent = $xml->xpath('/configuration/advanced/converters'); - $node = $nodeParent[0]->addChild("converter"); - } + // XML Path: /configuration/advanced/converters + foreach($this->_converters as $type=>$converters) { + foreach($this->_converters[$type] as $mimeType => $cmd) { + // search XML node + $node = $xml->xpath('/configuration/advanced/converters[@target="'.$type.'"]/converter[@mimeType="'. $mimeType .'"]'); - $node[0] = $cmd; - $this->setXMLAttributValue($node, 'mimeType', $mimeType); - - } // isset($node) - - } // foreach + if (count($node)>0) { + if(trim($cmd)) { + $node = $node[0]; + $node[0] = $cmd; + $this->setXMLAttributValue($node, 'mimeType', $mimeType); + } else { + $node = $node[0]; + unset($node[0]); + } + } else { + if(trim($cmd)) { + $nodeParent = $xml->xpath('/configuration/advanced/converters[@target="'.$type.'"]'); + if(count($nodeParent) == 0) { + $nodeParent = array($advnode->addChild("converters")); + $this->setXMLAttributValue($nodeParent[0], 'target', $type); + } + $node = $nodeParent[0]->addChild("converter"); + $node[0] = $cmd; + $this->setXMLAttributValue($node, 'mimeType', $mimeType); + } + } + } // foreach + } // foreach // Save From 16ae36c6e036b8fe9520edc7da4e11bcb8f6f87e Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 11 Nov 2016 12:27:55 +0100 Subject: [PATCH 097/164] encode subject of mail as utf-8 --- inc/inc.ClassEmailNotify.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/inc/inc.ClassEmailNotify.php b/inc/inc.ClassEmailNotify.php index b458292f4..fff88fa7d 100644 --- a/inc/inc.ClassEmailNotify.php +++ b/inc/inc.ClassEmailNotify.php @@ -91,7 +91,9 @@ class SeedDMS_EmailNotify extends SeedDMS_Notify { $headers = array (); $headers['From'] = $from; $headers['To'] = $recipient->getEmail(); - $headers['Subject'] = getMLText($subject, $params, "", $lang); + $preferences = array("input-charset" => "UTF-8", "output-charset" => "UTF-8"); + $encoded_subject = iconv_mime_encode("Subject", getMLText($subject, $params, "", $lang), $preferences); + $headers['Subject'] = substr($encoded_subject, strlen('Subject: ')); $headers['MIME-Version'] = "1.0"; $headers['Content-type'] = "text/plain; charset=utf-8"; From 444ee2f8ebcbd139b87db7cfe1fe275f5d1e6533 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 11 Nov 2016 16:25:30 +0100 Subject: [PATCH 098/164] add new phrases --- languages/ar_EG/lang.inc | 2 ++ languages/bg_BG/lang.inc | 2 ++ languages/ca_ES/lang.inc | 2 ++ languages/cs_CZ/lang.inc | 2 ++ languages/de_DE/lang.inc | 6 ++++-- languages/el_GR/lang.inc | 2 ++ languages/en_GB/lang.inc | 4 +++- languages/es_ES/lang.inc | 2 ++ languages/fr_FR/lang.inc | 42 +++++++++++++++++++++------------------- languages/hr_HR/lang.inc | 2 ++ languages/hu_HU/lang.inc | 2 ++ languages/it_IT/lang.inc | 2 ++ languages/ko_KR/lang.inc | 2 ++ languages/nl_NL/lang.inc | 2 ++ languages/pl_PL/lang.inc | 2 ++ languages/pt_BR/lang.inc | 2 ++ languages/ro_RO/lang.inc | 2 ++ languages/ru_RU/lang.inc | 2 ++ languages/sk_SK/lang.inc | 2 ++ languages/sv_SE/lang.inc | 2 ++ languages/tr_TR/lang.inc | 2 ++ languages/uk_UA/lang.inc | 2 ++ languages/zh_CN/lang.inc | 2 ++ languages/zh_TW/lang.inc | 2 ++ 24 files changed, 71 insertions(+), 23 deletions(-) diff --git a/languages/ar_EG/lang.inc b/languages/ar_EG/lang.inc index 046b128ba..55a5c490e 100644 --- a/languages/ar_EG/lang.inc +++ b/languages/ar_EG/lang.inc @@ -158,6 +158,7 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - تم تغيير سمة', 'attribute_count' => 'ﻉﺩﺩ ﻡﺭﺎﺗ ﺍﻸﺴﺘﺧﺩﺎﻣ', 'attribute_value' => 'ﻖﻴﻣﺓ ﺎﻠﺴﻣﺓ', +'attribute_value_not_in_valueset' => '', 'attr_malformed_boolean' => '', 'attr_malformed_date' => '', 'attr_malformed_email' => '', @@ -606,6 +607,7 @@ URL: [url]', 'linked_documents' => 'مستندات متعلقة', 'linked_files' => 'ملحقات', 'link_alt_updatedocument' => 'اذا كنت تود تحميل ملفات اكبر من حجم الملفات المتاحة حاليا, من فضلك استخدم البديل صفحة التحميل.', +'list_contains_no_access_docs' => '', 'list_hooks' => '', 'local_file' => 'ملف محلي', 'locked_by' => 'محمي بواسطة', diff --git a/languages/bg_BG/lang.inc b/languages/bg_BG/lang.inc index 254337479..3f227a574 100644 --- a/languages/bg_BG/lang.inc +++ b/languages/bg_BG/lang.inc @@ -143,6 +143,7 @@ $text = array( 'attribute_changed_email_subject' => '', 'attribute_count' => '', 'attribute_value' => '', +'attribute_value_not_in_valueset' => '', 'attr_malformed_boolean' => '', 'attr_malformed_date' => '', 'attr_malformed_email' => '', @@ -537,6 +538,7 @@ $text = array( 'linked_documents' => 'Свързани документи', 'linked_files' => 'Приложения', 'link_alt_updatedocument' => 'Ако искате да качите файлове над текущия лимит, използвайте друг начин.', +'list_contains_no_access_docs' => '', 'list_hooks' => '', 'local_file' => 'Локален файл', 'locked_by' => 'Блокиран', diff --git a/languages/ca_ES/lang.inc b/languages/ca_ES/lang.inc index 299b9e113..2c971ddb8 100644 --- a/languages/ca_ES/lang.inc +++ b/languages/ca_ES/lang.inc @@ -148,6 +148,7 @@ URL: [url]', 'attribute_changed_email_subject' => '', 'attribute_count' => '', 'attribute_value' => '', +'attribute_value_not_in_valueset' => '', 'attr_malformed_boolean' => '', 'attr_malformed_date' => '', 'attr_malformed_email' => '', @@ -542,6 +543,7 @@ URL: [url]', 'linked_documents' => 'Documents relacionats', 'linked_files' => 'Adjunts', 'link_alt_updatedocument' => '', +'list_contains_no_access_docs' => '', 'list_hooks' => '', 'local_file' => 'Arxiu local', 'locked_by' => 'Locked by', diff --git a/languages/cs_CZ/lang.inc b/languages/cs_CZ/lang.inc index 958c69a1e..0c1e3d2cf 100644 --- a/languages/cs_CZ/lang.inc +++ b/languages/cs_CZ/lang.inc @@ -165,6 +165,7 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Atributy změněny', 'attribute_count' => 'Počet použití', 'attribute_value' => 'Hodnota atributu', +'attribute_value_not_in_valueset' => '', 'attr_malformed_boolean' => '', 'attr_malformed_date' => '', 'attr_malformed_email' => '', @@ -613,6 +614,7 @@ URL: [url]', 'linked_documents' => 'Související dokumenty', 'linked_files' => 'Přílohy', 'link_alt_updatedocument' => 'Hodláte-li nahrát soubory větší než je maximální velikost pro nahrávání, použijte prosím alternativní stránku.', +'list_contains_no_access_docs' => '', 'list_hooks' => '', 'local_file' => 'Lokální soubor', 'locked_by' => 'Zamčeno kým', diff --git a/languages/de_DE/lang.inc b/languages/de_DE/lang.inc index 85d90cfc5..e67e37297 100644 --- a/languages/de_DE/lang.inc +++ b/languages/de_DE/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (2331), dgrutsch (21) +// Translators: Admin (2335), dgrutsch (21) $text = array( '2_factor_auth' => '2-Faktor Authentifizierung', @@ -170,6 +170,7 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Attribut geändert', 'attribute_count' => 'Anzahl Verwendungen', 'attribute_value' => 'Attributwert', +'attribute_value_not_in_valueset' => 'Wert nicht im Wertebereich', 'attr_malformed_boolean' => 'Der Attributwert \'[value]\' des Attributs \'[attrname]\' ist kein gültiger Ja/Nein-Wert.', 'attr_malformed_date' => 'Der Attributwert \'[value]\' des Attributs \'[attrname]\' ist kein gültiges Datum.', 'attr_malformed_email' => 'Der Attributwert \'[value]\' des Attributs \'[attrname]\' ist keine gültige E-Mail.', @@ -243,7 +244,7 @@ URL: [url]', 'choose_target_category' => 'Kategorie wählen', 'choose_target_document' => 'Dokument wählen', 'choose_target_file' => 'Datei wählen', -'choose_target_folder' => 'Zielordner wählen', +'choose_target_folder' => 'Ordner wählen', 'choose_user' => 'Benutzer wählen', 'choose_workflow' => 'Workflow wählen', 'choose_workflow_action' => 'Workflow-Aktion wählen', @@ -618,6 +619,7 @@ URL: [url]', 'linked_documents' => 'verknüpfte Dokumente', 'linked_files' => 'Anhänge', 'link_alt_updatedocument' => 'Wenn Sie ein Dokument hochladen möchten, das größer als die maximale Dateigröße ist, dann benutzen Sie bitte die alternative Upload-Seite.', +'list_contains_no_access_docs' => 'Die Liste enthält weitere Dokumente auf die Sie keinen Zugriff haben und deshalb nicht angezeigt werden.', 'list_hooks' => 'Liste interne Aufrufe', 'local_file' => 'Lokale Datei', 'locked_by' => 'Gesperrt von', diff --git a/languages/el_GR/lang.inc b/languages/el_GR/lang.inc index ef3e290b6..74549fa68 100644 --- a/languages/el_GR/lang.inc +++ b/languages/el_GR/lang.inc @@ -143,6 +143,7 @@ $text = array( 'attribute_changed_email_subject' => '', 'attribute_count' => '', 'attribute_value' => '', +'attribute_value_not_in_valueset' => '', 'attr_malformed_boolean' => '', 'attr_malformed_date' => '', 'attr_malformed_email' => '', @@ -537,6 +538,7 @@ $text = array( 'linked_documents' => '', 'linked_files' => '', 'link_alt_updatedocument' => '', +'list_contains_no_access_docs' => '', 'list_hooks' => '', 'local_file' => '', 'locked_by' => '', diff --git a/languages/en_GB/lang.inc b/languages/en_GB/lang.inc index a02d58cb2..3037e590f 100644 --- a/languages/en_GB/lang.inc +++ b/languages/en_GB/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (1465), dgrutsch (7), netixw (14) +// Translators: Admin (1468), dgrutsch (7), netixw (14) $text = array( '2_factor_auth' => '2-factor authentication', @@ -170,6 +170,7 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Attribute changed', 'attribute_count' => 'Number of uses', 'attribute_value' => 'Value of attribute', +'attribute_value_not_in_valueset' => 'Value not in value set', 'attr_malformed_boolean' => 'The attribute value \'[value]\' of attribute \'[attrname]\' is not a valid boolean.', 'attr_malformed_date' => 'The attribute value \'[value]\' of attribute \'[attrname]\' is not a valid date.', 'attr_malformed_email' => 'The attribute value \'[value]\' of attribute \'[attrname]\' is not a valid URL.', @@ -618,6 +619,7 @@ URL: [url]', 'linked_documents' => 'Related Documents', 'linked_files' => 'Attachments', 'link_alt_updatedocument' => 'If you would like to upload files bigger than the current maximum upload size, please use the alternative upload page.', +'list_contains_no_access_docs' => 'The list contains more documents you have no access to and are not displayed.', 'list_hooks' => 'List hooks', 'local_file' => 'Local file', 'locked_by' => 'Locked by', diff --git a/languages/es_ES/lang.inc b/languages/es_ES/lang.inc index 545c4aa01..2180bad68 100644 --- a/languages/es_ES/lang.inc +++ b/languages/es_ES/lang.inc @@ -165,6 +165,7 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Atributo modificado', 'attribute_count' => 'Cantidad de usos', 'attribute_value' => 'Valor del atributo', +'attribute_value_not_in_valueset' => '', 'attr_malformed_boolean' => '', 'attr_malformed_date' => '', 'attr_malformed_email' => '', @@ -613,6 +614,7 @@ URL: [url]', 'linked_documents' => 'Documentos relacionados', 'linked_files' => 'Adjuntos', 'link_alt_updatedocument' => 'Si desea subir archivos mayores que el tamaño máximo actualmente permitido, por favor, utilice la página de subida alternativa.', +'list_contains_no_access_docs' => '', 'list_hooks' => '', 'local_file' => 'Fichero local', 'locked_by' => 'Bloqueado por', diff --git a/languages/fr_FR/lang.inc b/languages/fr_FR/lang.inc index 6734977e5..ad778e6d3 100644 --- a/languages/fr_FR/lang.inc +++ b/languages/fr_FR/lang.inc @@ -19,7 +19,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Translators: Admin (1053), jeromerobert (50), lonnnew (9), Oudiceval (110) +// Translators: Admin (1055), jeromerobert (50), lonnnew (9), Oudiceval (130) $text = array( '2_factor_auth' => 'Authentification forte', @@ -170,6 +170,7 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Attribut changé', 'attribute_count' => 'Nombre d\'utilisations', 'attribute_value' => 'Valeur de l\'attribut', +'attribute_value_not_in_valueset' => '', 'attr_malformed_boolean' => 'La valeur « [value] » de l’attribut « [attrname] » n’est pas un booléen valide.', 'attr_malformed_date' => 'La valeur « [value] » de l’attribut « [attrname] » n’est pas une date valide.', 'attr_malformed_email' => 'La valeur « [value] » de l’attribut « [attrname] » n’est pas une adresse e-mail valide.', @@ -242,7 +243,7 @@ URL: [url]', 'choose_role' => '', 'choose_target_category' => 'Choisir une catégorie', 'choose_target_document' => 'Choisir un document', -'choose_target_file' => 'Choose un fichier', +'choose_target_file' => 'Choisir un fichier', 'choose_target_folder' => 'Choisir un dossier cible', 'choose_user' => 'Choisir un utilisateur', 'choose_workflow' => 'Choisir un workflow', @@ -251,7 +252,7 @@ URL: [url]', 'class_name' => '', 'clear_cache' => 'Effacer le cache', 'clear_clipboard' => 'Vider le presse-papier', -'clear_password' => '', +'clear_password' => 'Sans mot de passe', 'clipboard' => 'Presse-papier', 'close' => 'Fermer', 'comment' => 'Commentaire', @@ -336,7 +337,7 @@ URL: [url]', Document : [name] Dossier parent : [folder_path] Utilisateur : [username]', -'document_deleted_email_subject' => '[sitename]: [name] - ocument supprimé', +'document_deleted_email_subject' => '[sitename] : [name] - Document supprimé', 'document_duplicate_name' => 'Un document porte déjà ce nom !', 'document_has_no_workflow' => 'Le document n\'a pas de workflow', 'document_infos' => 'Informations sur le document', @@ -391,8 +392,8 @@ URL: [url]', 'draft_pending_review' => 'Ebauche - En cours de correction', 'drag_icon_here' => 'Glisser/déposer le fichier ou document ici!', 'dropfolderdir_missing' => 'Votre dossier de dépôt personnel n\'existe pas sur le serveur ! Veuillez faire une demande à l\'administrateur.', -'dropfolder_file' => 'Fichier du dossier déposé', -'dropfolder_folder' => '', +'dropfolder_file' => 'Fichier du dossier de dépôt', +'dropfolder_folder' => 'Répertoire du dossier de dépôt', 'dropupload' => 'Téléchargement rapide', 'drop_files_here' => 'Glissez les fichiers ici !', 'dump_creation' => 'Sauvegarder la base de données', @@ -424,7 +425,7 @@ URL: [url]', 'el_GR' => 'Grec', 'email' => 'E-mail', 'email_error_title' => 'Aucun e-mail indiqué', -'email_footer' => 'Vous pouvez modifier les paramètres de messagerie via \'Mon compte\'.', +'email_footer' => 'Vous pouvez modifier vos notifications via « Mon compte ».', 'email_header' => 'Ceci est un message automatique généré par le serveur DMS.', 'email_not_given' => 'Veuillez entrer une adresse e-mail valide.', 'empty_attribute_group_list' => '', @@ -435,7 +436,7 @@ URL: [url]', 'error' => 'Erreur', 'error_add_aro' => '', 'error_add_permission' => 'Erreur lors de l’ajout de permission', -'error_clearcache' => '', +'error_clearcache' => 'Erreur lors du vidage du cache', 'error_importfs' => '', 'error_no_document_selected' => 'Aucun document sélectionné', 'error_no_folder_selected' => 'Aucun dossier sélectionné', @@ -541,7 +542,7 @@ URL: [url]', 'import' => 'Importer', 'importfs' => 'Importer depuis le système de fichiers', 'import_fs' => 'Importer depuis le système de fichiers', -'import_fs_warning' => '', +'import_fs_warning' => 'L’importation peut se faire à partir du dossier de dépôt personnel uniquement. Tous les sous-dossiers et fichiers seront importés. Les fichiers seront immédiatement publiés.', 'include_content' => '', 'include_documents' => 'Inclure les documents', 'include_subdirectories' => 'Inclure les sous-dossiers', @@ -561,7 +562,7 @@ URL: [url]', 'invalid_create_date_end' => 'Date de fin invalide pour la plage de dates de création.', 'invalid_create_date_start' => 'Date de début invalide pour la plage de dates de création.', 'invalid_doc_id' => 'Identifiant de document invalide', -'invalid_dropfolder_folder' => '', +'invalid_dropfolder_folder' => 'Répertoire du dossier de dépôt invalide', 'invalid_expiration_date_end' => '', 'invalid_expiration_date_start' => '', 'invalid_file_id' => 'Identifiant de fichier invalide', @@ -618,6 +619,7 @@ URL: [url]', 'linked_documents' => 'Documents liés', 'linked_files' => 'Fichiers attachés', 'link_alt_updatedocument' => 'Pour déposer des fichiers de taille supérieure, utilisez la page d\'ajout multiple.', +'list_contains_no_access_docs' => '', 'list_hooks' => '', 'local_file' => 'Fichier local', 'locked_by' => 'Verrouillé par', @@ -1000,7 +1002,7 @@ URL: [url]', 'settings_contentDir_desc' => 'Endroit ou les fichiers téléchargés sont stockés (il est préférable de choisir un répertoire qui n\'est pas accessible par votre serveur web)', 'settings_contentOffsetDir' => 'Content Offset Directory', 'settings_contentOffsetDir_desc' => 'To work around limitations in the underlying file system, a new directory structure has been devised that exists within the content directory (Content Directory). This requires a base directory from which to begin. Usually leave this to the default setting, 1048576, but can be any number or string that does not already exist within (Content Directory)', -'settings_convertToPdf' => '', +'settings_convertToPdf' => 'Convertir en PDF le document pour prévisualisation', 'settings_convertToPdf_desc' => '', 'settings_cookieLifetime' => 'Durée de vie des Cookies', 'settings_cookieLifetime_desc' => 'La durée de vie d\'un cooke en secondes. Si réglée à 0, le cookie sera supprimé à la fermeture du navigateur.', @@ -1127,7 +1129,7 @@ URL: [url]', 'settings_initialDocumentStatus' => '', 'settings_initialDocumentStatus_desc' => '', 'settings_initialDocumentStatus_draft' => 'Brouillon', -'settings_initialDocumentStatus_released' => '', +'settings_initialDocumentStatus_released' => 'publié', 'settings_installADOdb' => 'Installer ADOdb', 'settings_install_disabled' => 'Le fichier ENABLE_INSTALL_TOOL a été supprimé. ous pouvez maintenant vous connecter à SeedDMS et poursuivre la configuration.', 'settings_install_pear_package_log' => 'Installer le paquet Pear \'Log\'', @@ -1204,12 +1206,12 @@ URL: [url]', 'settings_rootFolderID_desc' => 'ID du répertoire racine (la plupart du temps pas besoin de changer)', 'settings_SaveError' => 'Erreur de sauvegarde du fichier de configuration', 'settings_Server' => 'Paramètres serveur', -'settings_showFullPreview' => '', +'settings_showFullPreview' => 'Visualisation complète du document', 'settings_showFullPreview_desc' => '', 'settings_showMissingTranslations' => 'Afficher les traductions manquantes', 'settings_showMissingTranslations_desc' => 'Lister toutes les traductions manquantes de la page dans le bas de la page. L\'utilisateur connecté pourra proposer une traduction manquante qui sera sauvegardée dans un fichier CSV. Ne pas activer cette fonction en production.', -'settings_showSingleSearchHit' => '', -'settings_showSingleSearchHit_desc' => '', +'settings_showSingleSearchHit' => 'Aller au document en cas de résultat unique', +'settings_showSingleSearchHit_desc' => 'Quand une recherche retourne un seul résultat, afficher celui-ci directement à la place de la page des résultats.', 'settings_Site' => 'Site', 'settings_siteDefaultPage' => 'Page par défaut du site', 'settings_siteDefaultPage_desc' => 'Page par défaut lors de la connexion. Si vide, valeur par défaut à out/out.ViewFolder.php', @@ -1258,7 +1260,7 @@ URL: [url]', 'settings_versioningFileName_desc' => 'The name of the versioning info file created by the backup tool', 'settings_versiontolow' => '', 'settings_viewOnlineFileTypes' => 'Aperçu en ligne des fichiers', -'settings_viewOnlineFileTypes_desc' => 'Files with one of the following endings can be viewed online (USE ONLY LOWER CASE CHARACTERS)', +'settings_viewOnlineFileTypes_desc' => 'Extensions des fichiers pouvant être visionnés en ligne (en lettres minuscules uniquement).', 'settings_workflowMode' => 'Mode workflow', 'settings_workflowMode_desc' => 'Le workflow avancé permet de définir son propre workflow de parution pour les versions de documents.', 'settings_workflowMode_valadvanced' => 'avancé', @@ -1284,7 +1286,7 @@ URL: [url]', 'splash_add_to_transmittal' => '', 'splash_add_transmittal' => '', 'splash_add_user' => 'Nouvel utilisateur ajouté', -'splash_clearcache' => '', +'splash_clearcache' => 'Cache vidé', 'splash_cleared_clipboard' => 'Presse-papier vidé', 'splash_document_added' => 'Document ajouté', 'splash_document_checkedout' => '', @@ -1371,9 +1373,9 @@ URL: [url]', 'thursday' => 'Jeudi', 'thursday_abbr' => 'Jeu.', 'timeline' => 'Chronologie', -'timeline_add_file' => 'Nouvelle Pièce Jointe', +'timeline_add_file' => 'Nouveau fichier attaché', 'timeline_add_version' => 'Nouvelle version ([version])', -'timeline_full_add_file' => '', +'timeline_full_add_file' => '[document]
              Nouveau fichier attaché', 'timeline_full_add_version' => '[document]
              Nouvelle version ([version])', 'timeline_full_status_change' => '[document]
              Version [version] : [status]', 'timeline_selected_item' => 'Document sélectionné', @@ -1382,7 +1384,7 @@ URL: [url]', 'timeline_skip_status_change_-3' => 'expirés', 'timeline_skip_status_change_0' => 'en attente de revue', 'timeline_skip_status_change_1' => 'en attente d\'approbation', -'timeline_skip_status_change_2' => 'en mode release', +'timeline_skip_status_change_2' => 'publié', 'timeline_skip_status_change_3' => 'encore dans un workflow', 'timeline_status_change' => 'Version [version] : [status]', 'to' => 'Au', diff --git a/languages/hr_HR/lang.inc b/languages/hr_HR/lang.inc index e801bc2c0..57a068c81 100644 --- a/languages/hr_HR/lang.inc +++ b/languages/hr_HR/lang.inc @@ -170,6 +170,7 @@ Internet poveznica: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Promijenjen atribut', 'attribute_count' => 'Broj uporaba', 'attribute_value' => 'Vrijednost atributa', +'attribute_value_not_in_valueset' => '', 'attr_malformed_boolean' => '', 'attr_malformed_date' => '', 'attr_malformed_email' => 'Vrijednost atributa \'[value]\' za atribut \'[attrname]\' nije važeći URL.', @@ -618,6 +619,7 @@ Internet poveznica: [url]', 'linked_documents' => 'Vezani dokumenti', 'linked_files' => 'Prilozi', 'link_alt_updatedocument' => 'Ako želite prenijeti datoteke veće od trenutne maksimalne veličine prijenosa, molimo koristite alternativu upload page.', +'list_contains_no_access_docs' => '', 'list_hooks' => '', 'local_file' => 'Lokalna datoteka', 'locked_by' => 'Zaključao', diff --git a/languages/hu_HU/lang.inc b/languages/hu_HU/lang.inc index f4125e90a..3ae93cf55 100644 --- a/languages/hu_HU/lang.inc +++ b/languages/hu_HU/lang.inc @@ -165,6 +165,7 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Jellemző módosult', 'attribute_count' => 'Felhasználók száma', 'attribute_value' => 'Tulajdonság értéke', +'attribute_value_not_in_valueset' => '', 'attr_malformed_boolean' => '', 'attr_malformed_date' => '', 'attr_malformed_email' => '', @@ -613,6 +614,7 @@ URL: [url]', 'linked_documents' => 'Kapcsolódó dokumentumok', 'linked_files' => 'Mellékletek', 'link_alt_updatedocument' => 'Ha a jelenlegi maximális feltöltési méretnél nagyobb állományokat szeretne feltölteni, akkor használja az alternatív feltöltő oldalt.', +'list_contains_no_access_docs' => '', 'list_hooks' => '', 'local_file' => 'Helyi állomány', 'locked_by' => 'Zárolta', diff --git a/languages/it_IT/lang.inc b/languages/it_IT/lang.inc index bbe6c77df..26af861d1 100644 --- a/languages/it_IT/lang.inc +++ b/languages/it_IT/lang.inc @@ -170,6 +170,7 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Attributo modificato', 'attribute_count' => 'Numero di utilizzi', 'attribute_value' => 'Valore dell\'Attributo', +'attribute_value_not_in_valueset' => '', 'attr_malformed_boolean' => '', 'attr_malformed_date' => '', 'attr_malformed_email' => 'Il valore di \'[value]\' dell, @@ -619,6 +620,7 @@ URL: [url]', 'linked_documents' => 'Documenti collegati', 'linked_files' => 'Allegati', 'link_alt_updatedocument' => 'Se vuoi caricare file più grandi del limite massimo attuale, usa la pagina alternativa di upload.', +'list_contains_no_access_docs' => '', 'list_hooks' => 'Lista ganci', 'local_file' => 'File locale', 'locked_by' => 'Bloccato da', diff --git a/languages/ko_KR/lang.inc b/languages/ko_KR/lang.inc index eeea19477..60dd6b662 100644 --- a/languages/ko_KR/lang.inc +++ b/languages/ko_KR/lang.inc @@ -170,6 +170,7 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename] : [name] - 속성이 변경', 'attribute_count' => '사용자수', 'attribute_value' => '속성', +'attribute_value_not_in_valueset' => '', 'attr_malformed_boolean' => '', 'attr_malformed_date' => '', 'attr_malformed_email' => '속성값 \'[value]\' \'[attrname]\'은(는) 유효한 URL이 아닙니다.', @@ -618,6 +619,7 @@ URL: [url]', 'linked_documents' => '관련 문서', 'linked_files' => '첨부 파일', 'link_alt_updatedocument' => '최대 업로드 크기보다 큰 파일을 업로드하려는 경우, 대체 업로드 페이지를 upload page 사용하십시오.', +'list_contains_no_access_docs' => '', 'list_hooks' => '', 'local_file' => '로컬 파일', 'locked_by' => '잠금', diff --git a/languages/nl_NL/lang.inc b/languages/nl_NL/lang.inc index e1bc981b8..dca47a3ee 100644 --- a/languages/nl_NL/lang.inc +++ b/languages/nl_NL/lang.inc @@ -163,6 +163,7 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Attribuut gewijzigd', 'attribute_count' => 'Aantal maal gebruikt', 'attribute_value' => 'Waarde van het attribuut', +'attribute_value_not_in_valueset' => '', 'attr_malformed_boolean' => '', 'attr_malformed_date' => '', 'attr_malformed_email' => 'Foute vormgeving email', @@ -611,6 +612,7 @@ URL: [url]', 'linked_documents' => 'Gerelateerde Documenten', 'linked_files' => 'Bijlagen', 'link_alt_updatedocument' => 'Als u bestanden wilt uploaden groter dan het huidige maximum, gebruik aub de alternatieve upload pagina.', +'list_contains_no_access_docs' => '', 'list_hooks' => '', 'local_file' => 'Lokaal bestand', 'locked_by' => 'In gebruik door', diff --git a/languages/pl_PL/lang.inc b/languages/pl_PL/lang.inc index dc167dc6d..27aadd38c 100644 --- a/languages/pl_PL/lang.inc +++ b/languages/pl_PL/lang.inc @@ -158,6 +158,7 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Zmiana atrybutu', 'attribute_count' => 'liczba użyć', 'attribute_value' => 'wartość atrybutu', +'attribute_value_not_in_valueset' => '', 'attr_malformed_boolean' => '', 'attr_malformed_date' => '', 'attr_malformed_email' => '', @@ -606,6 +607,7 @@ URL: [url]', 'linked_documents' => 'Powiązane dokumenty', 'linked_files' => 'Załączniki', 'link_alt_updatedocument' => 'Jeśli chcesz wczytać pliki większe niż bieżące maksimum, użyj alternatywnej strony wczytywania.', +'list_contains_no_access_docs' => '', 'list_hooks' => '', 'local_file' => 'Lokalny plik', 'locked_by' => 'Zablokowane przez', diff --git a/languages/pt_BR/lang.inc b/languages/pt_BR/lang.inc index e2b01eb19..2781a1484 100644 --- a/languages/pt_BR/lang.inc +++ b/languages/pt_BR/lang.inc @@ -165,6 +165,7 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Atributo modificado', 'attribute_count' => 'Número de utilizações', 'attribute_value' => 'Valor do atributo', +'attribute_value_not_in_valueset' => '', 'attr_malformed_boolean' => '', 'attr_malformed_date' => '', 'attr_malformed_email' => '', @@ -612,6 +613,7 @@ URL: [url]', 'linked_documents' => 'Documentos relacionados', 'linked_files' => 'Arquivos anexados', 'link_alt_updatedocument' => 'Se você gostaria de fazer envio de arquivos maiores que o tamanho permitido, por favor use a página alternativa de envio.', +'list_contains_no_access_docs' => '', 'list_hooks' => '', 'local_file' => 'Arquivo local', 'locked_by' => 'Bloqueado por', diff --git a/languages/ro_RO/lang.inc b/languages/ro_RO/lang.inc index b5f620de9..9475f383b 100644 --- a/languages/ro_RO/lang.inc +++ b/languages/ro_RO/lang.inc @@ -170,6 +170,7 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Atribut schimbat', 'attribute_count' => 'Numărul de utilizări', 'attribute_value' => 'Valoare atribut', +'attribute_value_not_in_valueset' => '', 'attr_malformed_boolean' => '', 'attr_malformed_date' => '', 'attr_malformed_email' => 'Valoarea \'[value]\' a atributului \'[attrname]\' nu este o adresa URL valida.', @@ -618,6 +619,7 @@ URL: [url]', 'linked_documents' => 'Documente relationate', 'linked_files' => 'Atașamente', 'link_alt_updatedocument' => 'Dacă doriți să încărcați fișiere mai mari decât dimensiunea maximă curentă de încărcare, vă rugăm să folosiți alternativa pagină de încărcare.', +'list_contains_no_access_docs' => '', 'list_hooks' => '', 'local_file' => 'Fișier local', 'locked_by' => 'Blocat de', diff --git a/languages/ru_RU/lang.inc b/languages/ru_RU/lang.inc index c95e645db..53da7569d 100644 --- a/languages/ru_RU/lang.inc +++ b/languages/ru_RU/lang.inc @@ -170,6 +170,7 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: изменён атрибут «[name]»', 'attribute_count' => 'Использован раз', 'attribute_value' => 'Значение атрибута', +'attribute_value_not_in_valueset' => '', 'attr_malformed_boolean' => '', 'attr_malformed_date' => '', 'attr_malformed_email' => 'Значение атрибута \'[value]\' атрибута \'[attrname]\' не является допустимым URL.', @@ -618,6 +619,7 @@ URL: [url]', 'linked_documents' => 'Связанные документы', 'linked_files' => 'Приложения', 'link_alt_updatedocument' => 'Для загрузки файлов, превышающих ограничение размера, используйте другой способ.', +'list_contains_no_access_docs' => '', 'list_hooks' => '', 'local_file' => 'Локальный файл', 'locked_by' => 'Заблокирован', diff --git a/languages/sk_SK/lang.inc b/languages/sk_SK/lang.inc index 86b2c3492..41f4c98c3 100644 --- a/languages/sk_SK/lang.inc +++ b/languages/sk_SK/lang.inc @@ -147,6 +147,7 @@ URL: [url]', 'attribute_changed_email_subject' => '', 'attribute_count' => '', 'attribute_value' => '', +'attribute_value_not_in_valueset' => '', 'attr_malformed_boolean' => '', 'attr_malformed_date' => '', 'attr_malformed_email' => '', @@ -541,6 +542,7 @@ URL: [url]', 'linked_documents' => 'Súvisiace dokumenty', 'linked_files' => 'Prílohy', 'link_alt_updatedocument' => '', +'list_contains_no_access_docs' => '', 'list_hooks' => '', 'local_file' => 'Lokálny súbor', 'locked_by' => 'Uzamkol', diff --git a/languages/sv_SE/lang.inc b/languages/sv_SE/lang.inc index 0107d3e73..f0ead70f2 100644 --- a/languages/sv_SE/lang.inc +++ b/languages/sv_SE/lang.inc @@ -158,6 +158,7 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Ändrad attribut', 'attribute_count' => 'Antal användningar', 'attribute_value' => 'Attributvärde', +'attribute_value_not_in_valueset' => '', 'attr_malformed_boolean' => '', 'attr_malformed_date' => '', 'attr_malformed_email' => '', @@ -606,6 +607,7 @@ URL: [url]', 'linked_documents' => 'Relaterade dokument', 'linked_files' => 'Bilagor', 'link_alt_updatedocument' => 'Om du vill ladda upp filer som är större än den aktuella största tillåtna storleken, använd dig av den alternativa metoden att ladda upp filer Alternativ uppladdning.', +'list_contains_no_access_docs' => '', 'list_hooks' => '', 'local_file' => 'Lokal fil', 'locked_by' => 'Låst av', diff --git a/languages/tr_TR/lang.inc b/languages/tr_TR/lang.inc index 0b8ecf013..a1e23672f 100644 --- a/languages/tr_TR/lang.inc +++ b/languages/tr_TR/lang.inc @@ -164,6 +164,7 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: [name] - Nitelik değişti', 'attribute_count' => 'Kullanım sayısı', 'attribute_value' => 'Niteliğin değeri', +'attribute_value_not_in_valueset' => '', 'attr_malformed_boolean' => '', 'attr_malformed_date' => '', 'attr_malformed_email' => '', @@ -612,6 +613,7 @@ URL: [url]', 'linked_documents' => 'İlgili Dokümanlar', 'linked_files' => 'Ekler', 'link_alt_updatedocument' => 'Mevcut maksimum yükleme boyutundan daha büyük dosya yüklemek istiyorsanız alternatif yükleme sayfası için tıklayın.', +'list_contains_no_access_docs' => '', 'list_hooks' => '', 'local_file' => 'Yerel dosya', 'locked_by' => 'Kilitleyen', diff --git a/languages/uk_UA/lang.inc b/languages/uk_UA/lang.inc index 7bdfa216d..d3e3381e5 100644 --- a/languages/uk_UA/lang.inc +++ b/languages/uk_UA/lang.inc @@ -170,6 +170,7 @@ URL: [url]', 'attribute_changed_email_subject' => '[sitename]: змінено атрибут «[name]»', 'attribute_count' => 'Використано разів', 'attribute_value' => 'Значення атрибута', +'attribute_value_not_in_valueset' => '', 'attr_malformed_boolean' => '', 'attr_malformed_date' => '', 'attr_malformed_email' => 'Значення \'[value]\' атрибуту \'[attrname]\' не є правильною адресою email.', @@ -618,6 +619,7 @@ URL: [url]', 'linked_documents' => 'Пов\'язані документи', 'linked_files' => 'Пов\'язані файли', 'link_alt_updatedocument' => 'Для завантаження файлів, які перевищують обмеження розміру, використовуйте інший метод.', +'list_contains_no_access_docs' => '', 'list_hooks' => '', 'local_file' => 'Локальний файл', 'locked_by' => 'Заблоковано', diff --git a/languages/zh_CN/lang.inc b/languages/zh_CN/lang.inc index fed54191a..f839648cb 100644 --- a/languages/zh_CN/lang.inc +++ b/languages/zh_CN/lang.inc @@ -147,6 +147,7 @@ URL: [url]', 'attribute_changed_email_subject' => '', 'attribute_count' => '使用次数', 'attribute_value' => '属性值', +'attribute_value_not_in_valueset' => '', 'attr_malformed_boolean' => '', 'attr_malformed_date' => '', 'attr_malformed_email' => '', @@ -543,6 +544,7 @@ URL: [url]', 'linked_documents' => '相关文档', 'linked_files' => '附件', 'link_alt_updatedocument' => '超过20M大文件,请选择上传大文件.', +'list_contains_no_access_docs' => '', 'list_hooks' => '', 'local_file' => '本地文件', 'locked_by' => '锁定人', diff --git a/languages/zh_TW/lang.inc b/languages/zh_TW/lang.inc index e102eb1fc..210c0371d 100644 --- a/languages/zh_TW/lang.inc +++ b/languages/zh_TW/lang.inc @@ -147,6 +147,7 @@ URL: [url]', 'attribute_changed_email_subject' => '', 'attribute_count' => '使用次數', 'attribute_value' => '屬性值', +'attribute_value_not_in_valueset' => '', 'attr_malformed_boolean' => '', 'attr_malformed_date' => '', 'attr_malformed_email' => '', @@ -541,6 +542,7 @@ URL: [url]', 'linked_documents' => '相關文檔', 'linked_files' => '附件', 'link_alt_updatedocument' => '超過20M大檔,請選擇上傳大檔.', +'list_contains_no_access_docs' => '', 'list_hooks' => '', 'local_file' => '本地檔', 'locked_by' => '鎖定人', From 530d75fdf0fa44de9deca93c7bae4fa31c912611 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 14 Nov 2016 11:04:57 +0100 Subject: [PATCH 099/164] getValueAsArray() checks if value starts with separator new funtion parseValue() --- SeedDMS_Core/Core/inc.ClassAttribute.php | 41 +++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/SeedDMS_Core/Core/inc.ClassAttribute.php b/SeedDMS_Core/Core/inc.ClassAttribute.php index b1bc22a2c..ed4828de0 100644 --- a/SeedDMS_Core/Core/inc.ClassAttribute.php +++ b/SeedDMS_Core/Core/inc.ClassAttribute.php @@ -117,7 +117,17 @@ class SeedDMS_Core_Attribute { /* {{{ */ */ function getValueAsArray() { /* {{{ */ if($this->_attrdef->getMultipleValues()) { - return explode($this->_value[0], substr($this->_value, 1)); + /* If the value doesn't start with the separator used in the value set, + * then assume that the value was not saved with a leading separator. + * This can happen, if the value was previously a single value from + * the value set and later turned into a multi value attribute. + */ + $sep = substr($this->_value, 0, 1); + $vsep = $this->_attrdef->getValueSetSeparator(); + if($sep == $vsep) + return(explode($sep, substr($this->_value, 1))); + else + return(array($this->_value)); } else { return array($this->_value); } @@ -684,6 +694,35 @@ class SeedDMS_Core_AttributeDefinition { /* {{{ */ return true; } /* }}} */ + /** + * Parse a given value according to attribute definition + * + * The return value is always an array, even if the attribute is single + * value attribute. + * + * @return array list of single values + */ + function parseValue($value) { /* {{{ */ + $db = $this->_dms->getDB(); + + if($this->getMultipleValues()) { + /* If the value doesn't start with the separator used in the value set, + * then assume that the value was not saved with a leading separator. + * This can happen, if the value was previously a single value from + * the value set and later turned into a multi value attribute. + */ + $sep = substr($value, 0, 1); + $vsep = $this->getValueSetSeparator(); + if($sep == $vsep) + return(explode($sep, substr($value, 1))); + else + return(array($value)); + } else { + return array($value); + } + return true; + } /* }}} */ + /** * Return a list of documents, folders, document contents where this * attribute definition is used From a1f6bd9a7d98f42957681b963a67cbab02b3d76b Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 14 Nov 2016 11:05:57 +0100 Subject: [PATCH 100/164] getAttributeValue() checks if value starts with seperator --- SeedDMS_Core/Core/inc.ClassObject.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/SeedDMS_Core/Core/inc.ClassObject.php b/SeedDMS_Core/Core/inc.ClassObject.php index 10fa89755..61455e791 100644 --- a/SeedDMS_Core/Core/inc.ClassObject.php +++ b/SeedDMS_Core/Core/inc.ClassObject.php @@ -117,7 +117,16 @@ class SeedDMS_Core_Object { /* {{{ */ $value = $this->_attributes[$attrdef->getId()]->getValue(); if($attrdef->getMultipleValues()) { $sep = substr($value, 0, 1); - return(explode($sep, substr($value, 1))); + $vsep = $attrdef->getValueSetSeparator(); + /* If the value doesn't start with the separator used in the value set, + * then assume that the value was not saved with a leading separator. + * This can happen, if the value was previously a single value from + * the value set and later turned into a multi value attribute. + */ + if($sep == $vsep) + return(explode($sep, substr($value, 1))); + else + return(array($value)); } else { return $value; } From 6a059c9a1bba8642a9dbe977c886777f751c656f Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 14 Nov 2016 11:06:38 +0100 Subject: [PATCH 101/164] propperly check for multiple values --- views/bootstrap/class.AttributeMgr.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/views/bootstrap/class.AttributeMgr.php b/views/bootstrap/class.AttributeMgr.php index 583f39066..bfb80af3a 100644 --- a/views/bootstrap/class.AttributeMgr.php +++ b/views/bootstrap/class.AttributeMgr.php @@ -92,14 +92,17 @@ $(document).ready( function() { print "\n"; print "\n\n"; foreach($res['frequencies'][$type] as $entry) { + $value = $selattrdef->parseValue($entry['value']); echo ""; - echo "".$entry['value']."".$entry['c'].""; + echo "".implode(';', $value)."".$entry['c'].""; /* various checks, if the value is valid */ echo ""; /* Check if value is in value set */ if($selattrdef->getValueSet()) { - if(in_array($entry['value'], $selattrdef->getValueSetAsArray())) - printMLText("attribute_value_not_in_valueset"); + foreach($values as $v) { + if(!in_array($value, $selattrdef->getValueSetAsArray())) + printMLText("attribute_value_not_in_valueset"); + } } echo ""; echo ""; From 38cdbe04d2c74d0889b1e4a93fc70a1c0f1be296 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 14 Nov 2016 11:07:03 +0100 Subject: [PATCH 102/164] add notes --- SeedDMS_Core/package.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/SeedDMS_Core/package.xml b/SeedDMS_Core/package.xml index f1e70b47a..a116e5880 100644 --- a/SeedDMS_Core/package.xml +++ b/SeedDMS_Core/package.xml @@ -26,6 +26,7 @@ - new method SeedDMЅ_Core_WorkflowAction::getTransitions() - new method SeedDMЅ_Core_WorkflowState::getTransitions() +- new method SeedDMЅ_Core_AttributeDefinition::parseValue() From 046f33f2e1783d79c386aba202a6304dcdb6dc37 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Mon, 14 Nov 2016 11:26:26 +0100 Subject: [PATCH 103/164] validate() is less strict on multi value attributes if the attribute has just one value the leading separator can be omitted --- SeedDMS_Core/Core/inc.ClassAttribute.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/SeedDMS_Core/Core/inc.ClassAttribute.php b/SeedDMS_Core/Core/inc.ClassAttribute.php index 0966133c3..9a8bad29d 100644 --- a/SeedDMS_Core/Core/inc.ClassAttribute.php +++ b/SeedDMS_Core/Core/inc.ClassAttribute.php @@ -917,9 +917,14 @@ class SeedDMS_Core_AttributeDefinition { /* {{{ */ */ function validate($attrvalue) { /* {{{ */ if($this->getMultipleValues()) { - if(is_string($attrvalue)) - $values = explode($attrvalue[0], substr($attrvalue, 1)); - else + if(is_string($attrvalue)) { + $sep = $attrvalue[0]; + $vsep = $this->getValueSetSeparator(); + if($sep == $vsep) + $values = explode($attrvalue[0], substr($attrvalue, 1)); + else + $values = array($attrvalue); + } else $values = $attrvalue; } else { $values = array($attrvalue); From 408592ee90cad4fd15cae6beb818e8779b9ad0ae Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 15 Nov 2016 18:10:22 +0100 Subject: [PATCH 104/164] replace some php short tags (Closes: #294) --- views/bootstrap/class.Bootstrap.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/views/bootstrap/class.Bootstrap.php b/views/bootstrap/class.Bootstrap.php index f15793d59..38d95aed4 100644 --- a/views/bootstrap/class.Bootstrap.php +++ b/views/bootstrap/class.Bootstrap.php @@ -1405,14 +1405,14 @@ $(function() { $('#jqtree').tree({ saveState: true, data: data, - saveState: 'jqtree', + saveState: 'jqtree', openedIcon: '', closedIcon: '', _onCanSelectNode: function(node) { if(node.is_folder) { - folderSelected(node.id, node.name); + folderSelected(node.id, node.name); } else - documentSelected(node.id, node.name); + documentSelected(node.id, node.name); }, autoOpen: true, drapAndDrop: true, @@ -1426,16 +1426,16 @@ $(function() { }); // Unfold tree if folder is opened $('#jqtree').tree('openNode', $('#jqtree').tree('getNodeById', ), false); - $('#jqtree').bind( + $('#jqtree').bind( 'tree.click', function(event) { var node = event.node; - $('#jqtree').tree('openNode', node); + $('#jqtree').tree('openNode', node); // event.preventDefault(); if(node.is_folder) { - folderSelected(node.id, node.name); + folderSelected(node.id, node.name); } else - documentSelected(node.id, node.name); + documentSelected(node.id, node.name); } ); }); From b4be06793458da905edbc4ff8a5133bae3549093 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 15 Nov 2016 18:11:13 +0100 Subject: [PATCH 105/164] add note about closing #294 --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index ff01e84c0..f4c01c783 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,6 +3,7 @@ -------------------------------------------------------------------------------- - merged changes from 4.3.31 - fix saving online editing file +- replace some php short tags by Date: Tue, 15 Nov 2016 20:39:35 +0100 Subject: [PATCH 106/164] add some default converters --- conf/settings.xml.template | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/conf/settings.xml.template b/conf/settings.xml.template index e8dc40c6a..ff047728d 100644 --- a/conf/settings.xml.template +++ b/conf/settings.xml.template @@ -293,7 +293,20 @@ enableNotificationAppRev = "true" enableOwnerNotification = "false" enableNotificationWorkflow = "false" - /> + /> + + pdftotext -nopgbrk %s - | sed -e 's/ [a-zA-Z0-9.]\{1\} / /g' -e 's/[0-9.]//g' + catdoc %s + ssconvert -T Gnumeric_stf:stf_csv -S %s fd://1 + id3 -l -R %s | egrep '(Title|Artist|Album)' | sed 's/^[^:]*: //g' + id3 -l -R %s | egrep '(Title|Artist|Album)' | sed 's/^[^:]*: //g' + cat %s + html2text %s + docx2txt %s - + + + unoconv -d document -e PageRange=1 -f pdf --stdout -v '%f'|gs -dBATCH -dNOPAUSE -sDEVICE=pngalpha -dPDFFitPage -r72x72 -sOutputFile=- -dFirstPage=1 -dLastPage=1 -q - | convert -resize %wx png:- '%o' + From 125697a287eb70f9669d61fc8a2c2e701b33b40a Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 15 Nov 2016 21:08:03 +0100 Subject: [PATCH 107/164] setConverters() overrides existing converters --- SeedDMS_Preview/Preview/Base.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SeedDMS_Preview/Preview/Base.php b/SeedDMS_Preview/Preview/Base.php index 2e46f593a..b68186c69 100644 --- a/SeedDMS_Preview/Preview/Base.php +++ b/SeedDMS_Preview/Preview/Base.php @@ -103,7 +103,7 @@ class SeedDMS_Preview_Base { * and the value is the command to be called for creating the preview */ function setConverters($arr) { /* {{{ */ - $this->converters = array_merge($arr, $this->converters); + $this->converters = array_merge($this->converters, $arr); } /* }}} */ /** From a7cff8e309c4bfee29975fdfed664e828107d883 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 15 Nov 2016 21:08:26 +0100 Subject: [PATCH 108/164] new version 1.2.1 --- SeedDMS_Preview/package.xml | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/SeedDMS_Preview/package.xml b/SeedDMS_Preview/package.xml index e91edf1de..6422fe77c 100644 --- a/SeedDMS_Preview/package.xml +++ b/SeedDMS_Preview/package.xml @@ -11,10 +11,10 @@ uwe@steinmann.cx yes - 2016-11-07 - + 2016-11-15 + - 1.2.0 + 1.2.1 1.2.0 @@ -23,7 +23,7 @@ GPL License -add new previewer which converts document to pdf instead of png +setConverters() overrides exiting converters @@ -238,5 +238,21 @@ fix calculation of timeout (Bug #269) check if cache dir exists before deleting it in deleteDocumentPreviews() + + 2016-11-07 + + + 1.2.0 + 1.2.0 + + + stable + stable + + GPL License + +add new previewer which converts document to pdf instead of png + + From 45e99fa372351cf530e8c77381c03a17362993c0 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 15 Nov 2016 21:13:04 +0100 Subject: [PATCH 109/164] add more converters for preview --- conf/settings.xml.template | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/conf/settings.xml.template b/conf/settings.xml.template index ff047728d..ad8f8481d 100644 --- a/conf/settings.xml.template +++ b/conf/settings.xml.template @@ -293,8 +293,8 @@ enableNotificationAppRev = "true" enableOwnerNotification = "false" enableNotificationWorkflow = "false" - /> - + /> + pdftotext -nopgbrk %s - | sed -e 's/ [a-zA-Z0-9.]\{1\} / /g' -e 's/[0-9.]//g' catdoc %s ssconvert -T Gnumeric_stf:stf_csv -S %s fd://1 @@ -304,8 +304,12 @@ html2text %s docx2txt %s - - + unoconv -d document -e PageRange=1 -f pdf --stdout -v '%f'|gs -dBATCH -dNOPAUSE -sDEVICE=pngalpha -dPDFFitPage -r72x72 -sOutputFile=- -dFirstPage=1 -dLastPage=1 -q - | convert -resize %wx png:- '%o' + convert -resize %wx '%f' '%o' + convert -resize %wx '%f' '%o' + convert -resize %wx '%f' '%o' + a2ps -1 -a1 -R -B -o - '%f' | gs -dBATCH -dNOPAUSE -sDEVICE=pngalpha -dFirstPage=1 -dLastPage=1 -dPDFFitPage -r72x72 -sOutputFile=- -q - | convert -resize %wx png:- '%o' From 4e93bf4ca2ccbe5a336b6ee80fe02c78418de64b Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 16 Nov 2016 17:03:27 +0100 Subject: [PATCH 110/164] fix php tag --- views/bootstrap/class.Bootstrap.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/bootstrap/class.Bootstrap.php b/views/bootstrap/class.Bootstrap.php index 38d95aed4..b4a5977ff 100644 --- a/views/bootstrap/class.Bootstrap.php +++ b/views/bootstrap/class.Bootstrap.php @@ -1425,7 +1425,7 @@ $(function() { } }); // Unfold tree if folder is opened - $('#jqtree').tree('openNode', $('#jqtree').tree('getNodeById', ), false); + $('#jqtree').tree('openNode', $('#jqtree').tree('getNodeById', ), false); $('#jqtree').bind( 'tree.click', function(event) { From 80166278ba4965ed287a20e0c2d5cd6531202c0e Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 16 Nov 2016 21:56:48 +0100 Subject: [PATCH 111/164] remove some left over php short tags --- views/bootstrap/class.EditOnline.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/views/bootstrap/class.EditOnline.php b/views/bootstrap/class.EditOnline.php index 8c1c9e711..10995b10e 100644 --- a/views/bootstrap/class.EditOnline.php +++ b/views/bootstrap/class.EditOnline.php @@ -54,7 +54,7 @@ $(document).ready(function() { theme: 'defaultTheme', timeout: 1500, }); - $('div.ajax').trigger('update', {documentid: getId() ?>}); + $('div.ajax').trigger('update', {documentid: getId(); ?>}); }, "json"); return false; }); @@ -118,7 +118,7 @@ echo "
              \n"; $this->contentHeading(getMLText("content")); ?>
              - +