From 63a47112ae3280e9f921f1e7ad1395cb0f7266f5 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Fri, 16 Jul 2021 11:14:30 +0200 Subject: [PATCH 001/738] new: #18162 --- htdocs/core/modules/modProjet.class.php | 6 ++++++ htdocs/langs/en_US/admin.lang | 5 +++-- htdocs/langs/fr_FR/admin.lang | 3 ++- htdocs/projet/tasks/time.php | 12 ++++++------ 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/htdocs/core/modules/modProjet.class.php b/htdocs/core/modules/modProjet.class.php index 25448f239e6..7502fbffa81 100644 --- a/htdocs/core/modules/modProjet.class.php +++ b/htdocs/core/modules/modProjet.class.php @@ -202,6 +202,12 @@ class modProjet extends DolibarrModules $this->rights[$r][4] = 'all'; $this->rights[$r][5] = 'supprimer'; + $r++; + $this->rights[$r][0] = 145; // id de la permission + $this->rights[$r][1] = "Can enter time consumed on assigned tasks (timesheet)"; // libelle de la permission + $this->rights[$r][2] = 'w'; // type de la permission (deprecie a ce jour) + $this->rights[$r][3] = 0; // La permission est-elle une permission par defaut + $this->rights[$r][4] = 'time'; // Menus //------- diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index a05c9e7ea97..13dbef8bff3 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -707,7 +707,8 @@ Permission34=Delete products Permission36=See/manage hidden products Permission38=Export products Permission39=Ignore minimum price -Permission41=Read projects and tasks (shared project and projects I'm contact for). Can also enter time consumed, for me or my hierarchy, on assigned tasks (Timesheet) +Permission41=Read projects and tasks (shared project and projects I'm contact for). +Permission145=Can enter time consumed, for me or my hierarchy, on assigned tasks (Timesheet) Permission42=Create/modify projects (shared project and projects I'm contact for). Can also create tasks and assign users to project and tasks Permission44=Delete projects (shared project and projects I'm contact for) Permission45=Export projects @@ -2145,4 +2146,4 @@ RandomlySelectedIfSeveral=Randomly selected if several pictures are available DatabasePasswordObfuscated=Database password is obfuscated in conf file DatabasePasswordNotObfuscated=Database password is NOT obfuscated in conf file APIsAreNotEnabled=APIs modules are not enabled -YouShouldSetThisToOff=You should set this to 0 or off \ No newline at end of file +YouShouldSetThisToOff=You should set this to 0 or off diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang index 57a50388a4f..0d0dadf3327 100644 --- a/htdocs/langs/fr_FR/admin.lang +++ b/htdocs/langs/fr_FR/admin.lang @@ -707,7 +707,8 @@ Permission34=Supprimer les produits Permission36=Voir/gérer les produits cachés Permission38=Exporter les produits Permission39=Ignorer le prix minimum -Permission41=Lire les projets et tâches (partagés ou dont vous n'êtes pas contact). Permet la saisie de temps passé, pour vous-même et votre hiérarchie (vos subordonnés), sur les tâches assignées (Feuilles de temps). +Permission41=Lire les projets et tâches (partagés ou dont vous n'êtes pas contact). +Permission145=Permet la saisie de temps passé, pour vous-même et votre hiérarchie (vos subordonnés), sur les tâches assignées (Feuilles de temps). Permission42=Créer/modifier les projets (projets partagés et projets pour lesquels je suis contact). Permet aussi de créer des tâches et d'assigner des utilisateurs aux projets et tâches. Permission44=Supprimer les projets et tâches (partagés ou dont je suis contact) Permission45=Exporter les projets diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php index a9316bcedcd..4cac12ad801 100644 --- a/htdocs/projet/tasks/time.php +++ b/htdocs/projet/tasks/time.php @@ -149,7 +149,7 @@ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x' $action = ''; } -if ($action == 'addtimespent' && $user->rights->projet->lire) { +if ($action == 'addtimespent' && $user->rights->projet->time) { $error = 0; $timespent_durationhour = GETPOST('timespent_durationhour', 'int'); @@ -281,7 +281,7 @@ if (($action == 'updateline' || $action == 'updatesplitline') && !$cancel && $us } } -if ($action == 'confirm_delete' && $confirm == "yes" && $user->rights->projet->lire) { +if ($action == 'confirm_delete' && $confirm == "yes" && $user->rights->projet->supprimer) { $object->fetchTimeSpent(GETPOST('lineid', 'int')); // TODO Check that ($task_time->fk_user == $user->id || in_array($task_time->fk_user, $childids)) $result = $object->delTimeSpent($user); @@ -722,7 +722,7 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0) { $linktocreatetimeBtnStatus = 0; $linktocreatetimeUrl = ''; $linktocreatetimeHelpText = ''; - if ($user->rights->projet->all->lire || $user->rights->projet->lire) { // To enter time, read permission is enough + if ($user->rights->projet->all->lire || $user->rights->projet->time) { if ($projectstatic->public || $userRead > 0) { $linktocreatetimeBtnStatus = 1; @@ -940,7 +940,7 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0) { print ''; } elseif ($action == 'splitline') { print ''; - } elseif ($action == 'createtime' && $user->rights->projet->lire) { + } elseif ($action == 'createtime' && $user->rights->projet->time) { print ''; } elseif ($massaction == 'generateinvoice' && $user->rights->facture->lire) { print ''; @@ -1122,7 +1122,7 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0) { /* * Form to add a new line of time spent */ - if ($action == 'createtime' && $user->rights->projet->lire) { + if ($action == 'createtime' && $user->rights->projet->time) { print ''."\n"; if (!empty($id)) { print ''; @@ -1537,7 +1537,7 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0) { print ''; print '
'; print ''; - } elseif ($user->rights->projet->lire || $user->rights->projet->all->creer) { // Read project and enter time consumed on assigned tasks + } elseif ($user->rights->projet->time || $user->rights->projet->all->creer) { // Read project and enter time consumed on assigned tasks if ($task_time->fk_user == $user->id || in_array($task_time->fk_user, $childids) || $user->rights->projet->all->creer) { if ($conf->MAIN_FEATURES_LEVEL >= 2) { print ' '; From ab48351d15ce4fa150618fd2f189039fd8a84379 Mon Sep 17 00:00:00 2001 From: Marc de Lima Lucio <68746600+marc-dll@users.noreply.github.com> Date: Wed, 29 Sep 2021 11:10:58 +0200 Subject: [PATCH 002/738] NEW: deposit payment terms: database fields --- htdocs/install/mysql/migration/14.0.0-15.0.0.sql | 5 +++++ htdocs/install/mysql/tables/llx_c_payment_term.sql | 1 + htdocs/install/mysql/tables/llx_commande.sql | 1 + htdocs/install/mysql/tables/llx_propal.sql | 1 + htdocs/install/mysql/tables/llx_societe.sql | 1 + 5 files changed, 9 insertions(+) diff --git a/htdocs/install/mysql/migration/14.0.0-15.0.0.sql b/htdocs/install/mysql/migration/14.0.0-15.0.0.sql index 03bb7631dda..3e5d86b5dd6 100644 --- a/htdocs/install/mysql/migration/14.0.0-15.0.0.sql +++ b/htdocs/install/mysql/migration/14.0.0-15.0.0.sql @@ -149,3 +149,8 @@ INSERT INTO llx_c_forme_juridique (fk_pays, code, libelle) VALUES (20, '2010', ' INSERT INTO llx_c_forme_juridique (fk_pays, code, libelle) VALUES (20, '2011', 'Ideell förening'); INSERT INTO llx_c_forme_juridique (fk_pays, code, libelle) VALUES (20, '2012', 'Stiftelse'); +-- Deposit generation helper with specific payment terms +ALTER TABLE llx_c_payment_term ADD COLUMN deposit_percent real DEFAULT NULL AFTER decalage; +ALTER TABLE llx_societe ADD COLUMN deposit_percent real DEFAULT NULL AFTER cond_reglement; +ALTER TABLE llx_propal ADD COLUMN deposit_percent real DEFAULT NULL AFTER fk_cond_reglement; +ALTER TABLE llx_commande ADD COLUMN deposit_percent real DEFAULT NULL AFTER fk_cond_reglement; diff --git a/htdocs/install/mysql/tables/llx_c_payment_term.sql b/htdocs/install/mysql/tables/llx_c_payment_term.sql index 087ab63c184..6ed1c580e4f 100644 --- a/htdocs/install/mysql/tables/llx_c_payment_term.sql +++ b/htdocs/install/mysql/tables/llx_c_payment_term.sql @@ -30,6 +30,7 @@ create table llx_c_payment_term type_cdr tinyint, -- Type of change date reckoning. 1=Payment at end of current month, 2=the Nth of next month nbjour smallint, decalage smallint, + deposit_percent real DEFAULT NULL, module varchar(32) NULL, position integer NOT NULL DEFAULT 0 )ENGINE=innodb; diff --git a/htdocs/install/mysql/tables/llx_commande.sql b/htdocs/install/mysql/tables/llx_commande.sql index e3a075933c2..096bd8305a2 100644 --- a/htdocs/install/mysql/tables/llx_commande.sql +++ b/htdocs/install/mysql/tables/llx_commande.sql @@ -63,6 +63,7 @@ create table llx_commande fk_account integer, -- bank account fk_currency varchar(3), -- currency code fk_cond_reglement integer, -- condition de reglement + deposit_percent real DEFAULT NULL, -- default deposit % if payment term needs it fk_mode_reglement integer, -- mode de reglement date_livraison datetime default NULL, diff --git a/htdocs/install/mysql/tables/llx_propal.sql b/htdocs/install/mysql/tables/llx_propal.sql index 7c94086b3b9..e795d63ff8b 100644 --- a/htdocs/install/mysql/tables/llx_propal.sql +++ b/htdocs/install/mysql/tables/llx_propal.sql @@ -58,6 +58,7 @@ create table llx_propal fk_account integer, -- bank account fk_currency varchar(3), -- currency code fk_cond_reglement integer, -- condition de reglement (30 jours, fin de mois ...) + deposit_percent real DEFAULT NULL, -- default deposit % if payment term needs it fk_mode_reglement integer, -- mode de reglement (Virement, Prelevement) note_private text, diff --git a/htdocs/install/mysql/tables/llx_societe.sql b/htdocs/install/mysql/tables/llx_societe.sql index 7112b6e93ea..eb2ac1cd136 100644 --- a/htdocs/install/mysql/tables/llx_societe.sql +++ b/htdocs/install/mysql/tables/llx_societe.sql @@ -92,6 +92,7 @@ create table llx_societe remise_supplier real DEFAULT 0, -- discount by default granted by this supplier mode_reglement tinyint, -- payment mode customer cond_reglement tinyint, -- payment term customer + deposit_percent real DEFAULT NULL, -- default deposit % if payment term needs it transport_mode tinyint, -- transport mode customer (Intracomm report) mode_reglement_supplier tinyint, -- payment mode supplier cond_reglement_supplier tinyint, -- payment term supplier From ef624ec5bc5cbb1daab90d2fe6fdf5e8026bfcfb Mon Sep 17 00:00:00 2001 From: Marc de Lima Lucio <68746600+marc-dll@users.noreply.github.com> Date: Wed, 29 Sep 2021 11:34:30 +0200 Subject: [PATCH 003/738] NEW: deposit payment terms: add field into dictionary admin page --- htdocs/admin/dict.php | 23 +++++++++++++++++------ htdocs/langs/en_US/bills.lang | 1 + 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/htdocs/admin/dict.php b/htdocs/admin/dict.php index 9073c9e238c..02a3cb07ffa 100644 --- a/htdocs/admin/dict.php +++ b/htdocs/admin/dict.php @@ -207,7 +207,7 @@ $tabsql[8] = "SELECT t.id as rowid, t.code as code, t.libelle, t.fk_country as $tabsql[9] = "SELECT c.code_iso as code, c.label, c.unicode, c.active FROM ".MAIN_DB_PREFIX."c_currencies AS c"; $tabsql[10] = "SELECT t.rowid, t.code, t.taux, t.localtax1_type, t.localtax1, t.localtax2_type, t.localtax2, c.label as country, c.code as country_code, t.fk_pays as country_id, t.recuperableonly, t.note, t.active, t.accountancy_code_sell, t.accountancy_code_buy FROM ".MAIN_DB_PREFIX."c_tva as t, ".MAIN_DB_PREFIX."c_country as c WHERE t.fk_pays=c.rowid"; $tabsql[11] = "SELECT t.rowid as rowid, t.element, t.source, t.code, t.libelle, t.position, t.active FROM ".MAIN_DB_PREFIX."c_type_contact AS t"; -$tabsql[12] = "SELECT c.rowid as rowid, c.code, c.libelle, c.libelle_facture, c.nbjour, c.type_cdr, c.decalage, c.active, c.sortorder, c.entity FROM ".MAIN_DB_PREFIX."c_payment_term AS c WHERE c.entity = ".getEntity($tabname[12]); +$tabsql[12] = "SELECT c.rowid as rowid, c.code, c.libelle, c.libelle_facture, c.deposit_percent, c.nbjour, c.type_cdr, c.decalage, c.active, c.sortorder, c.entity FROM ".MAIN_DB_PREFIX."c_payment_term AS c WHERE c.entity = ".getEntity($tabname[12]); $tabsql[13] = "SELECT c.id as rowid, c.code, c.libelle, c.type, c.active, c.entity FROM ".MAIN_DB_PREFIX."c_paiement AS c WHERE c.entity = ".getEntity($tabname[13]); $tabsql[14] = "SELECT e.rowid as rowid, e.code as code, e.label, e.price, e.organization, e.fk_pays as country_id, c.code as country_code, c.label as country, e.active FROM ".MAIN_DB_PREFIX."c_ecotaxe AS e, ".MAIN_DB_PREFIX."c_country as c WHERE e.fk_pays=c.rowid and c.active=1"; $tabsql[15] = "SELECT rowid as rowid, code, label as libelle, width, height, unit, active FROM ".MAIN_DB_PREFIX."c_paper_format"; @@ -299,7 +299,7 @@ $tabfield[8] = "code,libelle,country_id,country".(!empty($conf->global->SOCIETE_ $tabfield[9] = "code,label,unicode"; $tabfield[10] = "country_id,country,code,taux,localtax1_type,localtax1,localtax2_type,localtax2,recuperableonly,accountancy_code_sell,accountancy_code_buy,note"; $tabfield[11] = "element,source,code,libelle,position"; -$tabfield[12] = "code,libelle,libelle_facture,nbjour,type_cdr,decalage,sortorder,entity"; +$tabfield[12] = "code,libelle,libelle_facture,deposit_percent,nbjour,type_cdr,decalage,sortorder,entity"; $tabfield[13] = "code,libelle,type,entity"; $tabfield[14] = "code,label,price,organization,country"; $tabfield[15] = "code,libelle,width,height,unit"; @@ -345,7 +345,7 @@ $tabfieldvalue[8] = "code,libelle,country".(!empty($conf->global->SOCIETE_SORT_O $tabfieldvalue[9] = "code,label,unicode"; $tabfieldvalue[10] = "country,code,taux,localtax1_type,localtax1,localtax2_type,localtax2,recuperableonly,accountancy_code_sell,accountancy_code_buy,note"; $tabfieldvalue[11] = "element,source,code,libelle,position"; -$tabfieldvalue[12] = "code,libelle,libelle_facture,nbjour,type_cdr,decalage,sortorder"; +$tabfieldvalue[12] = "code,libelle,libelle_facture,deposit_percent,nbjour,type_cdr,decalage,sortorder"; $tabfieldvalue[13] = "code,libelle,type"; $tabfieldvalue[14] = "code,label,price,organization,country"; $tabfieldvalue[15] = "code,libelle,width,height,unit"; @@ -391,7 +391,7 @@ $tabfieldinsert[8] = "code,libelle,fk_country".(!empty($conf->global->SOCIETE_SO $tabfieldinsert[9] = "code_iso,label,unicode"; $tabfieldinsert[10] = "fk_pays,code,taux,localtax1_type,localtax1,localtax2_type,localtax2,recuperableonly,accountancy_code_sell,accountancy_code_buy,note"; $tabfieldinsert[11] = "element,source,code,libelle,position"; -$tabfieldinsert[12] = "code,libelle,libelle_facture,nbjour,type_cdr,decalage,sortorder,entity"; +$tabfieldinsert[12] = "code,libelle,libelle_facture,deposit_percent,nbjour,type_cdr,decalage,sortorder,entity"; $tabfieldinsert[13] = "code,libelle,type,entity"; $tabfieldinsert[14] = "code,label,price,organization,fk_pays"; $tabfieldinsert[15] = "code,label,width,height,unit"; @@ -738,6 +738,9 @@ if (GETPOST('actionadd') || GETPOST('actionmodify')) { if ($fieldnamekey == 'libelle_facture') { $fieldnamekey = 'LabelOnDocuments'; } + if ($fieldnamekey == 'deposit_percent') { + $fieldnamekey = 'DepositPercent'; + } if ($fieldnamekey == 'nbjour') { $fieldnamekey = 'NbOfDays'; } @@ -1284,6 +1287,10 @@ if ($id) { if ($value == 'libelle_facture') { $valuetoshow = $form->textwithtooltip($langs->trans("LabelOnDocuments"), $langs->trans("LabelUsedByDefault"), 2, 1, img_help(1, '')); } + if ($value == 'deposit_percent') { + $valuetoshow = $langs->trans('DepositPercent'); + $class = 'right'; + } if ($value == 'country') { if (in_array('region_id', $fieldlist)) { print ' '; continue; @@ -1635,6 +1642,10 @@ if ($id) { if ($value == 'libelle_facture') { $valuetoshow = $langs->trans("LabelOnDocuments"); } + if ($value == 'deposit_percent') { + $valuetoshow = $langs->trans('DepositPercent'); + $cssprefix = 'right '; + } if ($value == 'country') { $valuetoshow = $langs->trans("Country"); } @@ -1995,7 +2006,7 @@ if ($id) { if ($value == 'tracking') { $class .= ' tdoverflowauto'; } - if (in_array($value, array('pos', 'position'))) { + if (in_array($value, array('pos', 'position', 'deposit_percent'))) { $class .= ' right'; } if (in_array($value, array('localtax1_type', 'localtax2_type'))) { @@ -2380,7 +2391,7 @@ function fieldList($fieldlist, $obj = '', $tabname = '', $context = '') if ($fieldlist[$field] == 'code') { $class = 'maxwidth100'; } - if (in_array($fieldlist[$field], array('pos', 'position'))) { + if (in_array($fieldlist[$field], array('pos', 'position', 'deposit_percent'))) { $classtd = 'right'; $class = 'maxwidth50 right'; } if (in_array($fieldlist[$field], array('dayrule', 'day', 'month', 'year', 'use_default', 'affect', 'delay', 'public', 'sortorder', 'sens', 'category_type', 'fk_parent'))) { diff --git a/htdocs/langs/en_US/bills.lang b/htdocs/langs/en_US/bills.lang index e475a815ac9..86344105168 100644 --- a/htdocs/langs/en_US/bills.lang +++ b/htdocs/langs/en_US/bills.lang @@ -424,6 +424,7 @@ FixAmount=Fixed amount - 1 line with label '%s' VarAmount=Variable amount (%% tot.) VarAmountOneLine=Variable amount (%% tot.) - 1 line with label '%s' VarAmountAllLines=Variable amount (%% tot.) - all lines from origin +DepositPercent=Deposit %% # PaymentType PaymentTypeVIR=Bank transfer PaymentTypeShortVIR=Bank transfer From 004b52f590ebed7ee7acfccf99bac8184dbcc947 Mon Sep 17 00:00:00 2001 From: Marc de Lima Lucio <68746600+marc-dll@users.noreply.github.com> Date: Wed, 29 Sep 2021 12:05:38 +0200 Subject: [PATCH 004/738] NEW: deposit payment terms: add field into CRUD methods --- htdocs/comm/propal/class/propal.class.php | 9 ++++++++- htdocs/commande/class/commande.class.php | 15 +++++++++++++-- htdocs/societe/class/societe.class.php | 8 +++++++- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index a7b5c465226..f2132799007 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -203,6 +203,7 @@ class Propal extends CommonObject public $total; public $cond_reglement_code; + public $deposit_percent; public $mode_reglement_code; public $remise = 0; public $remise_percent = 0; @@ -309,6 +310,7 @@ class Propal extends CommonObject 'fk_account' =>array('type'=>'integer', 'label'=>'BankAccount', 'enabled'=>1, 'visible'=>-1, 'position'=>150), 'fk_currency' =>array('type'=>'varchar(3)', 'label'=>'Currency', 'enabled'=>1, 'visible'=>-1, 'position'=>155), 'fk_cond_reglement' =>array('type'=>'integer', 'label'=>'PaymentTerm', 'enabled'=>1, 'visible'=>-1, 'position'=>160), + 'deposit_percent' =>array('type'=>'double', 'label'=>'DepositPercent', 'enabled'=>1, 'visible'=>-1, 'position'=>161), 'fk_mode_reglement' =>array('type'=>'integer', 'label'=>'PaymentMode', 'enabled'=>1, 'visible'=>-1, 'position'=>165), 'note_private' =>array('type'=>'text', 'label'=>'NotePublic', 'enabled'=>1, 'visible'=>0, 'position'=>170), 'note_public' =>array('type'=>'text', 'label'=>'NotePrivate', 'enabled'=>1, 'visible'=>0, 'position'=>175), @@ -1080,6 +1082,7 @@ class Propal extends CommonObject $sql .= ", model_pdf"; $sql .= ", fin_validite"; $sql .= ", fk_cond_reglement"; + $sql .= ", deposit_percent"; $sql .= ", fk_mode_reglement"; $sql .= ", fk_account"; $sql .= ", ref_client"; @@ -1113,6 +1116,7 @@ class Propal extends CommonObject $sql .= ", '".$this->db->escape($this->model_pdf)."'"; $sql .= ", ".($this->fin_validite != '' ? "'".$this->db->idate($this->fin_validite)."'" : "NULL"); $sql .= ", ".($this->cond_reglement_id > 0 ? ((int) $this->cond_reglement_id) : 'NULL'); + $sql .= ", ".(! empty($this->deposit_percent) ? floatval($this->deposit_percent) : 'NULL'); $sql .= ", ".($this->mode_reglement_id > 0 ? ((int) $this->mode_reglement_id) : 'NULL'); $sql .= ", ".($this->fk_account > 0 ? ((int) $this->fk_account) : 'NULL'); $sql .= ", '".$this->db->escape($this->ref_client)."'"; @@ -1336,6 +1340,7 @@ class Propal extends CommonObject if ($objsoc->fetch($socid) > 0) { $object->socid = $objsoc->id; $object->cond_reglement_id = (!empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0); + $object->deposit_percent = (!empty($objsoc->deposit_percent) ? $objsoc->deposit_percent : null); $object->mode_reglement_id = (!empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0); $object->fk_delivery_address = ''; @@ -1463,7 +1468,7 @@ class Propal extends CommonObject $sql .= ", c.label as statut_label"; $sql .= ", ca.code as availability_code, ca.label as availability"; $sql .= ", dr.code as demand_reason_code, dr.label as demand_reason"; - $sql .= ", cr.code as cond_reglement_code, cr.libelle as cond_reglement, cr.libelle_facture as cond_reglement_libelle_doc"; + $sql .= ", cr.code as cond_reglement_code, cr.libelle as cond_reglement, cr.libelle_facture as cond_reglement_libelle_doc, p.deposit_percent"; $sql .= ", cp.code as mode_reglement_code, cp.libelle as mode_reglement"; $sql .= " FROM ".MAIN_DB_PREFIX."propal as p"; $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_propalst as c ON p.fk_statut = c.id'; @@ -1546,6 +1551,7 @@ class Propal extends CommonObject $this->cond_reglement_code = $obj->cond_reglement_code; $this->cond_reglement = $obj->cond_reglement; $this->cond_reglement_doc = $obj->cond_reglement_libelle_doc; + $this->deposit_percent = $obj->deposit_percent; $this->extraparams = (array) json_decode($obj->extraparams, true); @@ -1655,6 +1661,7 @@ class Propal extends CommonObject $sql .= " fk_user_valid=".(isset($this->user_valid) ? $this->user_valid : "null").","; $sql .= " fk_projet=".(isset($this->fk_project) ? $this->fk_project : "null").","; $sql .= " fk_cond_reglement=".(isset($this->cond_reglement_id) ? $this->cond_reglement_id : "null").","; + $sql .= " deposit_percent=".(! empty($this->deposit_percent) ? floatval($this->deposit_percent) : "null"); $sql .= " fk_mode_reglement=".(isset($this->mode_reglement_id) ? $this->mode_reglement_id : "null").","; $sql .= " fk_input_reason=".(isset($this->demand_reason_id) ? $this->demand_reason_id : "null").","; $sql .= " note_private=".(isset($this->note_private) ? "'".$this->db->escape($this->note_private)."'" : "null").","; diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index e3675129198..90566bd2051 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -133,6 +133,11 @@ class Commande extends CommonOrder */ public $cond_reglement_code; + /** + * @var double Deposit % for payment terms + */ + public $deposit_percent; + /** * @var int bank account ID */ @@ -321,6 +326,7 @@ class Commande extends CommonOrder 'fk_account' =>array('type'=>'integer', 'label'=>'BankAccount', 'enabled'=>1, 'visible'=>-1, 'position'=>170), 'fk_currency' =>array('type'=>'varchar(3)', 'label'=>'MulticurrencyID', 'enabled'=>1, 'visible'=>-1, 'position'=>175), 'fk_cond_reglement' =>array('type'=>'integer', 'label'=>'PaymentTerm', 'enabled'=>1, 'visible'=>-1, 'position'=>180), + 'deposit_percent' =>array('type'=>'double', 'label'=>'DepositPercent', 'enabled'=>1, 'visible'=>-1, 'position'=>181), 'fk_mode_reglement' =>array('type'=>'integer', 'label'=>'PaymentMode', 'enabled'=>1, 'visible'=>-1, 'position'=>185), 'date_livraison' =>array('type'=>'date', 'label'=>'DateDeliveryPlanned', 'enabled'=>1, 'visible'=>-1, 'position'=>190), 'fk_shipping_method' =>array('type'=>'integer', 'label'=>'ShippingMethod', 'enabled'=>1, 'visible'=>-1, 'position'=>195), @@ -924,7 +930,7 @@ class Commande extends CommonOrder $sql = "INSERT INTO ".MAIN_DB_PREFIX."commande ("; $sql .= " ref, fk_soc, date_creation, fk_user_author, fk_projet, date_commande, source, note_private, note_public, ref_ext, ref_client, ref_int"; - $sql .= ", model_pdf, fk_cond_reglement, fk_mode_reglement, fk_account, fk_availability, fk_input_reason, date_livraison, fk_delivery_address"; + $sql .= ", model_pdf, fk_cond_reglement, deposit_percent, fk_mode_reglement, fk_account, fk_availability, fk_input_reason, date_livraison, fk_delivery_address"; $sql .= ", fk_shipping_method"; $sql .= ", fk_warehouse"; $sql .= ", remise_absolue, remise_percent"; @@ -945,6 +951,7 @@ class Commande extends CommonOrder $sql .= ", ".($this->ref_int ? "'".$this->db->escape($this->ref_int)."'" : "null"); $sql .= ", '".$this->db->escape($this->model_pdf)."'"; $sql .= ", ".($this->cond_reglement_id > 0 ? ((int) $this->cond_reglement_id) : "null"); + $sql .= ", ".(! empty($this->deposit_percent) ? floatval($this->deposit_percent) : "null"); $sql .= ", ".($this->mode_reglement_id > 0 ? ((int) $this->mode_reglement_id) : "null"); $sql .= ", ".($this->fk_account > 0 ? ((int) $this->fk_account) : 'NULL'); $sql .= ", ".($this->availability_id > 0 ? ((int) $this->availability_id) : "null"); @@ -1193,6 +1200,7 @@ class Commande extends CommonOrder if ($objsoc->fetch($socid) > 0) { $this->socid = $objsoc->id; $this->cond_reglement_id = (!empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0); + $this->deposit_percent = (!empty($objsoc->deposit_percent) ? $objsoc->deposit_percent : null); $this->mode_reglement_id = (!empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0); $this->fk_project = 0; $this->fk_delivery_address = 0; @@ -1335,6 +1343,7 @@ class Commande extends CommonOrder $this->socid = $object->socid; $this->fk_project = $object->fk_project; $this->cond_reglement_id = $object->cond_reglement_id; + $this->deposit_percent = $object->deposit_percent; $this->mode_reglement_id = $object->mode_reglement_id; $this->fk_account = $object->fk_account; $this->availability_id = $object->availability_id; @@ -1783,7 +1792,7 @@ class Commande extends CommonOrder } $sql = 'SELECT c.rowid, c.entity, c.date_creation, c.ref, c.fk_soc, c.fk_user_author, c.fk_user_valid, c.fk_statut'; - $sql .= ', c.amount_ht, c.total_ht, c.total_ttc, c.total_tva, c.localtax1 as total_localtax1, c.localtax2 as total_localtax2, c.fk_cond_reglement, c.fk_mode_reglement, c.fk_availability, c.fk_input_reason'; + $sql .= ', c.amount_ht, c.total_ht, c.total_ttc, c.total_tva, c.localtax1 as total_localtax1, c.localtax2 as total_localtax2, c.fk_cond_reglement, c.deposit_percent, c.fk_mode_reglement, c.fk_availability, c.fk_input_reason'; $sql .= ', c.fk_account'; $sql .= ', c.date_commande, c.date_valid, c.tms'; $sql .= ', c.date_livraison as delivery_date'; @@ -1875,6 +1884,7 @@ class Commande extends CommonOrder $this->cond_reglement_code = $obj->cond_reglement_code; $this->cond_reglement = $obj->cond_reglement_libelle; $this->cond_reglement_doc = $obj->cond_reglement_libelle_doc; + $this->deposit_percent = $obj->deposit_percent; $this->fk_account = $obj->fk_account; $this->availability_id = $obj->fk_availability; $this->availability_code = $obj->availability_code; @@ -3309,6 +3319,7 @@ class Commande extends CommonOrder $sql .= " fk_user_valid=".(isset($this->user_valid) ? $this->user_valid : "null").","; $sql .= " fk_projet=".(isset($this->fk_project) ? $this->fk_project : "null").","; $sql .= " fk_cond_reglement=".(isset($this->cond_reglement_id) ? $this->cond_reglement_id : "null").","; + $sql .= " deposit_percent=".(! empty($this->deposit_percent) ? floatval($this->deposit_percent) : "null"); $sql .= " fk_mode_reglement=".(isset($this->mode_reglement_id) ? $this->mode_reglement_id : "null").","; $sql .= " date_livraison=".(strval($this->delivery_date) != '' ? "'".$this->db->idate($this->delivery_date)."'" : 'null').","; $sql .= " fk_shipping_method=".(isset($this->shipping_method_id) ? $this->shipping_method_id : "null").","; diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 8f0e2c84805..16bcfdfb52f 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -208,6 +208,7 @@ class Societe extends CommonObject //'remise_supplier' =>array('type'=>'double', 'label'=>'SupplierDiscount', 'enabled'=>1, 'visible'=>-1, 'position'=>290, 'isameasure'=>1), 'mode_reglement' =>array('type'=>'tinyint(4)', 'label'=>'Mode reglement', 'enabled'=>1, 'visible'=>-1, 'position'=>295), 'cond_reglement' =>array('type'=>'tinyint(4)', 'label'=>'Cond reglement', 'enabled'=>1, 'visible'=>-1, 'position'=>300), + 'deposit_percent' =>array('type'=>'double', 'label'=>'DepositPercent', 'enabled'=>1, 'visible'=>-1, 'position'=>301), 'mode_reglement_supplier' =>array('type'=>'integer', 'label'=>'Mode reglement supplier', 'enabled'=>1, 'visible'=>-1, 'position'=>305), 'outstanding_limit' =>array('type'=>'double(24,8)', 'label'=>'OutstandingBill', 'enabled'=>1, 'visible'=>-1, 'position'=>310, 'isameasure'=>1), 'order_min_amount' =>array('type'=>'double(24,8)', 'label'=>'Order min amount', 'enabled'=>'!empty($conf->commande->enabled) && !empty($conf->global->ORDER_MANAGE_MIN_AMOUNT)', 'visible'=>-1, 'position'=>315, 'isameasure'=>1), @@ -481,6 +482,9 @@ class Societe extends CommonObject public $remise_percent; public $remise_supplier_percent; + public $mode_reglement_id; + public $cond_reglement_id; + public $deposit_percent; public $mode_reglement_supplier_id; public $cond_reglement_supplier_id; public $transport_mode_supplier_id; @@ -1432,6 +1436,7 @@ class Societe extends CommonObject $sql .= ",mode_reglement = ".(!empty($this->mode_reglement_id) ? "'".$this->db->escape($this->mode_reglement_id)."'" : "null"); $sql .= ",cond_reglement = ".(!empty($this->cond_reglement_id) ? "'".$this->db->escape($this->cond_reglement_id)."'" : "null"); + $sql .= ",deposit_percent = ".(!empty($this->deposit_percent) ? floatval($this->deposit_percent) : "null"); $sql .= ",transport_mode = ".(!empty($this->transport_mode_id) ? "'".$this->db->escape($this->transport_mode_id)."'" : "null"); $sql .= ",mode_reglement_supplier = ".(!empty($this->mode_reglement_supplier_id) ? "'".$this->db->escape($this->mode_reglement_supplier_id)."'" : "null"); $sql .= ",cond_reglement_supplier = ".(!empty($this->cond_reglement_supplier_id) ? "'".$this->db->escape($this->cond_reglement_supplier_id)."'" : "null"); @@ -1651,7 +1656,7 @@ class Societe extends CommonObject $sql .= ', spe.accountancy_code_buy, spe.accountancy_code_sell'; } $sql .= ', s.code_client, s.code_fournisseur, s.code_compta, s.code_compta_fournisseur, s.parent, s.barcode'; - $sql .= ', s.fk_departement as state_id, s.fk_pays as country_id, s.fk_stcomm, s.mode_reglement, s.cond_reglement, s.transport_mode'; + $sql .= ', s.fk_departement as state_id, s.fk_pays as country_id, s.fk_stcomm, s.mode_reglement, s.cond_reglement, s.deposit_percent, s.transport_mode'; $sql .= ', s.fk_account, s.tva_assuj'; $sql .= ', s.mode_reglement_supplier, s.cond_reglement_supplier, s.transport_mode_supplier'; $sql .= ', s.localtax1_assuj, s.localtax1_value, s.localtax2_assuj, s.localtax2_value, s.fk_prospectlevel, s.default_lang, s.logo, s.logo_squarred'; @@ -1828,6 +1833,7 @@ class Societe extends CommonObject $this->mode_reglement_id = $obj->mode_reglement; $this->cond_reglement_id = $obj->cond_reglement; + $this->deposit_percent = $obj->deposit_percent; $this->transport_mode_id = $obj->transport_mode; $this->mode_reglement_supplier_id = $obj->mode_reglement_supplier; $this->cond_reglement_supplier_id = $obj->cond_reglement_supplier; From 4b3fc4d7f33f3b2489a2e763c0e9e551202b0343 Mon Sep 17 00:00:00 2001 From: Marc de Lima Lucio <68746600+marc-dll@users.noreply.github.com> Date: Wed, 29 Sep 2021 13:02:32 +0200 Subject: [PATCH 005/738] NEW: deposit payment terms: add input in payment conditions form --- htdocs/core/class/html.form.class.php | 67 +++++++++++++++++++++------ 1 file changed, 54 insertions(+), 13 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 8deda2ecd09..61b00812efd 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -3609,7 +3609,7 @@ class Form dol_syslog(__METHOD__, LOG_DEBUG); - $sql = "SELECT rowid, code, libelle as label"; + $sql = "SELECT rowid, code, libelle as label, deposit_percent"; $sql .= " FROM ".MAIN_DB_PREFIX.'c_payment_term'; $sql .= " WHERE entity IN (".getEntity('c_payment_term').")"; $sql .= " AND active > 0"; @@ -3621,11 +3621,11 @@ class Form $i = 0; while ($i < $num) { $obj = $this->db->fetch_object($resql); - // Si traduction existe, on l'utilise, sinon on prend le libelle par defaut $label = ($langs->trans("PaymentConditionShort".$obj->code) != ("PaymentConditionShort".$obj->code) ? $langs->trans("PaymentConditionShort".$obj->code) : ($obj->label != '-' ? $obj->label : '')); $this->cache_conditions_paiements[$obj->rowid]['code'] = $obj->code; $this->cache_conditions_paiements[$obj->rowid]['label'] = $label; + $this->cache_conditions_paiements[$obj->rowid]['deposit_percent'] = $obj->deposit_percent; $i++; } @@ -3881,9 +3881,10 @@ class Form * @param int $addempty Add an empty entry * @param int $noinfoadmin 0=Add admin info, 1=Disable admin info * @param string $morecss Add more CSS on select tag + * @param float $deposit_percent % of deposit if needed by payment conditions * @return void */ - public function select_conditions_paiements($selected = 0, $htmlname = 'condid', $filtertype = -1, $addempty = 0, $noinfoadmin = 0, $morecss = '') + public function select_conditions_paiements($selected = 0, $htmlname = 'condid', $filtertype = -1, $addempty = 0, $noinfoadmin = 0, $morecss = '', $deposit_percent = null) { // phpcs:enable global $langs, $user, $conf; @@ -3901,13 +3902,24 @@ class Form if ($addempty) { print ''; } + + $selectedDepositPercent = null; foreach ($this->cache_conditions_paiements as $id => $arrayconditions) { if ($selected == $id) { - print ''; } print ''; @@ -3915,6 +3927,28 @@ class Form print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1); } print ajax_combobox($htmlname); + print ' '; + print ' + '; } @@ -5099,13 +5133,14 @@ class Form /** * Show a form to select payment conditions * - * @param int $page Page - * @param string $selected Id condition pre-selectionne - * @param string $htmlname Name of select html field - * @param int $addempty Add empty entry + * @param int $page Page + * @param string $selected Id condition pre-selectionne + * @param string $htmlname Name of select html field + * @param int $addempty Add empty entry + * @param float $deposit_percent % of deposit if needed by payment conditions * @return void */ - public function form_conditions_reglement($page, $selected = '', $htmlname = 'cond_reglement_id', $addempty = 0) + public function form_conditions_reglement($page, $selected = '', $htmlname = 'cond_reglement_id', $addempty = 0, $deposit_percent = null) { // phpcs:enable global $langs; @@ -5113,14 +5148,20 @@ class Form print '
'; print ''; print ''; - $this->select_conditions_paiements($selected, $htmlname, -1, $addempty); + $this->select_conditions_paiements($selected, $htmlname, -1, $addempty, 0, '', $deposit_percent); print ''; print '
'; } else { if ($selected) { $this->load_cache_conditions_paiements(); if (isset($this->cache_conditions_paiements[$selected])) { - print $this->cache_conditions_paiements[$selected]['label']; + $label = $this->cache_conditions_paiements[$selected]['label']; + + if (! empty($this->cache_conditions_paiements[$selected]['deposit_percent'])) { + $label = sprintf($label, ! empty($deposit_percent) ? $deposit_percent : $this->cache_conditions_paiements[$selected]['deposit_percent']); + } + + print $label; } else { $langs->load('errors'); print $langs->trans('ErrorNotInDictionaryPaymentConditions'); From 4d6c1d892b120c314283be4c66a210964d6b4590 Mon Sep 17 00:00:00 2001 From: Marc de Lima Lucio <68746600+marc-dll@users.noreply.github.com> Date: Wed, 29 Sep 2021 14:03:35 +0200 Subject: [PATCH 006/738] NEW: deposit payment terms: set deposit percentage in company card --- htdocs/comm/card.php | 6 +++--- htdocs/core/class/commonobject.class.php | 17 ++++++++++++++--- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/htdocs/comm/card.php b/htdocs/comm/card.php index c9f422d78c8..b511d932f52 100644 --- a/htdocs/comm/card.php +++ b/htdocs/comm/card.php @@ -169,7 +169,7 @@ if (empty($reshook)) { // terms of the settlement if ($action == 'setconditions' && $user->rights->societe->creer) { $object->fetch($id); - $result = $object->setPaymentTerms(GETPOST('cond_reglement_id', 'int')); + $result = $object->setPaymentTerms(GETPOST('cond_reglement_id', 'int'), GETPOST('cond_reglement_id_deposit_percent', 'int')); if ($result < 0) { setEventMessages($object->error, $object->errors, 'errors'); } @@ -411,9 +411,9 @@ if ($object->id > 0) { print ''; print ''; if ($action == 'editconditions') { - $form->form_conditions_reglement($_SERVER['PHP_SELF'].'?socid='.$object->id, $object->cond_reglement_id, 'cond_reglement_id', 1); + $form->form_conditions_reglement($_SERVER['PHP_SELF'].'?socid='.$object->id, $object->cond_reglement_id, 'cond_reglement_id', 1, $object->deposit_percent); } else { - $form->form_conditions_reglement($_SERVER['PHP_SELF'].'?socid='.$object->id, $object->cond_reglement_id, 'none'); + $form->form_conditions_reglement($_SERVER['PHP_SELF'].'?socid='.$object->id, $object->cond_reglement_id, 'none', 0, $object->deposit_percent); } print ""; print ''; diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 7adf7a89079..01f42a73417 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -2548,10 +2548,11 @@ abstract class CommonObject /** * Change the payments terms * - * @param int $id Id of new payment terms - * @return int >0 if OK, <0 if KO + * @param int $id Id of new payment terms + * @param float $deposit_percent % of deposit if needed by payment terms + * @return int >0 if OK, <0 if KO */ - public function setPaymentTerms($id) + public function setPaymentTerms($id, $deposit_percent = null) { dol_syslog(get_class($this).'::setPaymentTerms('.$id.')'); if ($this->statut >= 0 || $this->element == 'societe') { @@ -2564,8 +2565,17 @@ abstract class CommonObject $fieldname = 'cond_reglement_supplier'; } + if (empty($deposit_percent) || $deposit_percent < 0) { + $deposit_percent = null; + } + + if ($deposit_percent > 100) { + $deposit_percent = 100; + } + $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element; $sql .= " SET ".$fieldname." = ".(($id > 0 || $id == '0') ? ((int) $id) : 'NULL'); + $sql .= " , deposit_percent = " . (! empty($deposit_percent) ? floatval($deposit_percent) : 'NULL'); $sql .= ' WHERE rowid='.((int) $this->id); if ($this->db->query($sql)) { @@ -2575,6 +2585,7 @@ abstract class CommonObject $this->cond_reglement_supplier_id = $id; } $this->cond_reglement = $id; // for compatibility + $this->deposit_percent = $deposit_percent; return 1; } else { dol_syslog(get_class($this).'::setPaymentTerms Error '.$sql.' - '.$this->db->error()); From b0aa502ed425aac4b091c8248b8c24d8a1efdd46 Mon Sep 17 00:00:00 2001 From: Marc de Lima Lucio <68746600+marc-dll@users.noreply.github.com> Date: Wed, 29 Sep 2021 14:51:30 +0200 Subject: [PATCH 007/738] NEW: deposit payment terms: set deposit percentage in proposals/orders + get from origin document or company --- htdocs/comm/propal/card.php | 10 ++++++---- htdocs/commande/card.php | 20 +++++++++++++++----- htdocs/core/class/commonobject.class.php | 2 +- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/htdocs/comm/propal/card.php b/htdocs/comm/propal/card.php index cff5c5d0e35..12b7138ce51 100644 --- a/htdocs/comm/propal/card.php +++ b/htdocs/comm/propal/card.php @@ -397,6 +397,7 @@ if (empty($reshook)) { $object->warehouse_id = GETPOST('warehouse_id', 'int'); $object->duree_validite = $duration; $object->cond_reglement_id = GETPOST('cond_reglement_id'); + $object->deposit_percent = GETPOST('cond_reglement_id_deposit_percent', 'int'); $object->mode_reglement_id = GETPOST('mode_reglement_id'); $object->fk_account = GETPOST('fk_account', 'int'); $object->remise_percent = price2num(GETPOST('remise_percent'), '', 2); @@ -429,6 +430,7 @@ if (empty($reshook)) { $object->warehouse_id = GETPOST('warehouse_id', 'int'); $object->duree_validite = price2num(GETPOST('duree_validite', 'alpha')); $object->cond_reglement_id = GETPOST('cond_reglement_id', 'int'); + $object->deposit_percent = GETPOST('cond_reglement_id_deposit_percent', 'int'); $object->mode_reglement_id = GETPOST('mode_reglement_id', 'int'); $object->fk_account = GETPOST('fk_account', 'int'); $object->contact_id = GETPOST('contactid', 'int'); @@ -1358,7 +1360,7 @@ if (empty($reshook)) { $result = $object->set_demand_reason($user, GETPOST('demand_reason_id', 'int')); } elseif ($action == 'setconditions' && $usercancreate) { // Terms of payment - $result = $object->setPaymentTerms(GETPOST('cond_reglement_id', 'int')); + $result = $object->setPaymentTerms(GETPOST('cond_reglement_id', 'int'), GETPOST('cond_reglement_id_deposit_percent', 'int')); } elseif ($action == 'setremisepercent' && $usercancreate) { $result = $object->set_remise_percent($user, price2num(GETPOST('remise_percent'), '', 2)); } elseif ($action == 'setremiseabsolue' && $usercancreate) { @@ -1647,7 +1649,7 @@ if ($action == 'create') { // Terms of payment print ''.$langs->trans('PaymentConditionsShort').''; print img_picto('', 'paiment'); - $form->select_conditions_paiements((GETPOSTISSET('cond_reglement_id') ? GETPOST('cond_reglement_id', 'int') : $soc->cond_reglement_id), 'cond_reglement_id', -1, 1); + $form->select_conditions_paiements((GETPOSTISSET('cond_reglement_id') ? GETPOST('cond_reglement_id', 'int') : $soc->cond_reglement_id), 'cond_reglement_id', -1, 1, 0, '', (GETPOSTISSET('cond_reglement_id_deposit_percent') ? GETPOST('cond_reglement_id_deposit_percent', 'int') : $soc->deposit_percent)); print ''; // Mode of payment @@ -2155,9 +2157,9 @@ if ($action == 'create') { print ''; print ''; if ($object->statut == Propal::STATUS_DRAFT && $action == 'editconditions' && $usercancreate) { - $form->form_conditions_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->cond_reglement_id, 'cond_reglement_id'); + $form->form_conditions_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->cond_reglement_id, 'cond_reglement_id', 0, $object->deposit_percent); } else { - $form->form_conditions_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->cond_reglement_id, 'none'); + $form->form_conditions_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->cond_reglement_id, 'none', 0, $object->deposit_percent); } print ''; print ''; diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index decabedc2e8..e933231822a 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -268,6 +268,7 @@ if (empty($reshook)) { $object->ref_client = GETPOST('ref_client', 'alpha'); $object->model_pdf = GETPOST('model'); $object->cond_reglement_id = GETPOST('cond_reglement_id'); + $object->deposit_percent = GETPOST('cond_reglement_id_deposit_percent', 'int'); $object->mode_reglement_id = GETPOST('mode_reglement_id'); $object->fk_account = GETPOST('fk_account', 'int'); $object->availability_id = GETPOST('availability_id'); @@ -548,7 +549,7 @@ if (empty($reshook)) { setEventMessages($object->error, $object->errors, 'errors'); } } elseif ($action == 'setmode' && $usercancreate) { - $result = $object->setPaymentMethods(GETPOST('mode_reglement_id', 'int')); + $result = $object->setPaymentMethods(GETPOST('mode_reglement_id', 'int'), GETPOST('mode_reglement_id_deposit_percent', 'int')); if ($result < 0) { setEventMessages($object->error, $object->errors, 'errors'); } @@ -569,7 +570,7 @@ if (empty($reshook)) { setEventMessages($object->error, $object->errors, 'errors'); } } elseif ($action == 'setconditions' && $usercancreate) { - $result = $object->setPaymentTerms(GETPOST('cond_reglement_id', 'int')); + $result = $object->setPaymentTerms(GETPOST('cond_reglement_id', 'int'), GETPOST('cond_reglement_id_deposit_percent', 'int')); if ($result < 0) { dol_print_error($db, $object->error); } else { @@ -1437,6 +1438,10 @@ if ($action == 'create' && $usercancreate) { $currency_code = $conf->currency; + $cond_reglement_id = GETPOST('cond_reglement_id', 'int'); + $deposit_percent = GETPOST('cond_reglement_id_deposit_percent', 'int'); + $mode_reglement_id = GETPOST('mode_reglement_id', 'int'); + if (!empty($origin) && !empty($originid)) { // Parse element/subelement (ex: project_task) $element = $subelement = $origin; @@ -1452,6 +1457,9 @@ if ($action == 'create' && $usercancreate) { if (!$cond_reglement_id) { $cond_reglement_id = $soc->cond_reglement_id; } + if (!$deposit_percent) { + $deposit_percent = $soc->deposit_percent; + } if (!$mode_reglement_id) { $mode_reglement_id = $soc->mode_reglement_id; } @@ -1492,6 +1500,7 @@ if ($action == 'create' && $usercancreate) { $soc = $objectsrc->thirdparty; $cond_reglement_id = (!empty($objectsrc->cond_reglement_id) ? $objectsrc->cond_reglement_id : (!empty($soc->cond_reglement_id) ? $soc->cond_reglement_id : 0)); // TODO maybe add default value option + $deposit_percent = (!empty($objectsrc->deposit_percent) ? $objectsrc->deposit_percent : (!empty($soc->deposit_percent) ? $soc->deposit_percent : null)); $mode_reglement_id = (!empty($objectsrc->mode_reglement_id) ? $objectsrc->mode_reglement_id : (!empty($soc->mode_reglement_id) ? $soc->mode_reglement_id : 0)); $fk_account = (!empty($objectsrc->fk_account) ? $objectsrc->fk_account : (!empty($soc->fk_account) ? $soc->fk_account : 0)); $availability_id = (!empty($objectsrc->availability_id) ? $objectsrc->availability_id : (!empty($soc->availability_id) ? $soc->availability_id : 0)); @@ -1524,6 +1533,7 @@ if ($action == 'create' && $usercancreate) { } } else { $cond_reglement_id = $soc->cond_reglement_id; + $deposit_percent = $soc->deposit_percent; $mode_reglement_id = $soc->mode_reglement_id; $fk_account = $soc->fk_account; $availability_id = $soc->availability_id; @@ -1649,7 +1659,7 @@ if ($action == 'create' && $usercancreate) { // Terms of the settlement print ''.$langs->trans('PaymentConditionsShort').''; print img_picto('', 'paiment'); - $form->select_conditions_paiements($cond_reglement_id, 'cond_reglement_id', - 1, 1); + $form->select_conditions_paiements($cond_reglement_id, 'cond_reglement_id', - 1, 1, 0, '', $deposit_percent); print ''; // Mode de reglement @@ -2215,9 +2225,9 @@ if ($action == 'create' && $usercancreate) { print $form->editfieldkey("PaymentConditionsShort", 'conditions', '', $object, $editenable); print ''; if ($action == 'editconditions') { - $form->form_conditions_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->cond_reglement_id, 'cond_reglement_id', 1); + $form->form_conditions_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->cond_reglement_id, 'cond_reglement_id', 1, $object->deposit_percent); } else { - $form->form_conditions_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->cond_reglement_id, 'none', 1); + $form->form_conditions_reglement($_SERVER['PHP_SELF'].'?id='.$object->id, $object->cond_reglement_id, 'none', 1, $object->deposit_percent); } print ''; diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 01f42a73417..2a7c0c87353 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -2554,7 +2554,7 @@ abstract class CommonObject */ public function setPaymentTerms($id, $deposit_percent = null) { - dol_syslog(get_class($this).'::setPaymentTerms('.$id.')'); + dol_syslog(get_class($this).'::setPaymentTerms('.$id.', '.var_export($deposit_percent, true).')'); if ($this->statut >= 0 || $this->element == 'societe') { // TODO uniformize field name $fieldname = 'fk_cond_reglement'; From 8cb6cdf1bc1c8a8074fdd5183db913297cdcc0df Mon Sep 17 00:00:00 2001 From: Marc de Lima Lucio <68746600+marc-dll@users.noreply.github.com> Date: Thu, 30 Sep 2021 11:48:32 +0200 Subject: [PATCH 008/738] NEW: deposit payment terms: prefill deposit parameters if coming from an origin with the corresponding payment conditions --- htdocs/compta/facture/card.php | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index 764af7a232a..b2cb45e5b1a 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -3256,10 +3256,21 @@ if ($action == 'create') { 'variable' => $langs->transnoentitiesnoconv('VarAmountOneLine', $langs->transnoentitiesnoconv('Deposit')), 'variablealllines' => $langs->transnoentitiesnoconv('VarAmountAllLines') ); - print $form->selectarray('typedeposit', $arraylist, GETPOST('typedeposit', 'aZ09'), 0, 0, 0, '', 1); + $typedeposit = GETPOST('typedeposit', 'aZ09'); + $valuedeposit = GETPOST('valuedeposit', 'int'); + if (empty($typedeposit) && ! empty($objectsrc->deposit_percent)) { + $origin_payment_conditions_deposit_percent = getDictvalue(MAIN_DB_PREFIX . 'c_payment_term', 'deposit_percent', $objectsrc->cond_reglement_id); + if (! empty($origin_payment_conditions_deposit_percent)) { + $typedeposit = 'variable'; + } + } + if (empty($valuedeposit) && $typedeposit == 'variable' && ! empty($objectsrc->deposit_percent)) { + $valuedeposit = $objectsrc->deposit_percent; + } + print $form->selectarray('typedeposit', $arraylist, $typedeposit, 0, 0, 0, '', 1); print ''; print ''; - print ''.$langs->trans("AmountOrPercent").''; + print ''.$langs->trans("AmountOrPercent").''; print ''; } print ''; From 81ddc6c0f6367c15305bd2223347ca9974ad60ed Mon Sep 17 00:00:00 2001 From: Marc de Lima Lucio <68746600+marc-dll@users.noreply.github.com> Date: Thu, 30 Sep 2021 12:41:07 +0200 Subject: [PATCH 009/738] NEW: deposit payment terms: generate deposit from proposal --- htdocs/comm/propal/card.php | 100 +++++++ htdocs/compta/facture/class/facture.class.php | 260 ++++++++++++++++++ htdocs/langs/en_US/bills.lang | 6 + 3 files changed, 366 insertions(+) diff --git a/htdocs/comm/propal/card.php b/htdocs/comm/propal/card.php index 12b7138ce51..fc16dcdbe16 100644 --- a/htdocs/comm/propal/card.php +++ b/htdocs/comm/propal/card.php @@ -684,11 +684,46 @@ if (empty($reshook)) { $error++; } + $deposit = null; + $locationTarget = $_SERVER['PHP_SELF'] . '?id=' . $object->id; + + if (!$error && GETPOST('statut', 'int') == $object::STATUS_SIGNED && GETPOST('generate_deposit', 'int') > 0) { + $deposit = Facture::createDepositFromOrigin($object, $user, 0, GETPOST('validate_generated_deposit', 'int') > 0); + + if ($deposit) { + setEventMessage('DepositGenerated'); + $locationTarget = DOL_URL_ROOT . '/compta/facture/card.php?id=' . $deposit->id; + } else { + $error++; + setEventMessages($object->error, $object->errors, 'errors'); + } + } + if (!$error) { $db->commit(); + + if ($deposit && empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) { + $ret = $deposit->fetch($deposit->id); // Reload to get new records + $outputlangs = $langs; + + if ($conf->global->MAIN_MULTILANGS && empty($newlang)) { + $outputlangs = new Translate('', $conf); + $outputlangs->setDefaultLang($deposit->thirdparty->default_lang); + $outputlangs->load('products'); + } + + $result = $deposit->generateDocument($deposit->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + + if ($result < 0) { + setEventMessages($deposit->error, $deposit->errors, 'errors'); + } + } } else { $db->rollback(); } + + header('Location: ' . $locationTarget); + exit; } } } elseif ($action == 'confirm_reopen' && $usercanclose && !GETPOST('cancel', 'alpha')) { @@ -1934,6 +1969,71 @@ if ($action == 'create') { array('type' => 'text', 'name' => 'note_private', 'label' => $langs->trans("Note"), 'value' => '') // Field to complete private note (not replace) ); + $deposit_percent_from_payment_terms = getDictvalue(MAIN_DB_PREFIX . 'c_payment_term', 'deposit_percent', $object->cond_reglement_id); + + if (! empty($deposit_percent_from_payment_terms)) { + $object->fetchObjectLinked(); + + $eligibleForDepositGeneration = true; + + if (array_key_exists('facture', $object->linkedObjects)) { + foreach ($object->linkedObjectsIds['facture'] as $invoice) { + if ($invoice->type == Facture::TYPE_DEPOSIT) { + $eligibleForDepositGeneration = false; + break; + } + } + } + + if ($eligibleForDepositGeneration && array_key_exists('commande', $object->linkedObjects)) { + foreach ($object->linkedObjects['commande'] as $order) { + $order->fetchObjectLinked(); + + if (array_key_exists('facture', $order->linkedObjects)) { + foreach ($order->linkedObjects['facture'] as $invoice) { + if ($invoice->type == Facture::TYPE_DEPOSIT) { + $eligibleForDepositGeneration = false; + break 2; + } + } + } + } + } + + if ($eligibleForDepositGeneration) { + $formquestion[] = array( + 'type' => 'onecolumn', + 'name' => 'generate_deposit,validate_generated_deposit', + 'value' => ' + + + ' + ); + } + } + if (!empty($conf->notification->enabled)) { require_once DOL_DOCUMENT_ROOT.'/core/class/notify.class.php'; $notify = new Notify($db); diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 22cd946275c..d8265aeef01 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -1406,6 +1406,266 @@ class Facture extends CommonInvoice } } + /** + * @param Propal|Commande $origin + * @param User $user + * @param type $notrigger + * @param bool $autoValidate + * @return Facture + */ + static public function createDepositFromOrigin(CommonObject $origin, User $user, $notrigger = 0, $autoValidateDeposit = false, $forceInvoiceDate = null) + { + global $conf, $langs, $hookmanager, $action; + + if (! in_array($origin->element, array('propal', 'commande'))) { + $origin->error = 'ErrorCanOnlyAutomaticallyGenerateADepositFromProposalOrOrder'; // TRAD + return null; + } + + require_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php'; + + $invoiceDate = ! empty($forceInvoiceDate) ? $forceInvoiceDate : dol_now(); + + if ($invoiceDate > (dol_get_last_hour(dol_now('tzuserrel')) + (empty($conf->global->INVOICE_MAX_FUTURE_DELAY) ? 0 : $conf->global->INVOICE_MAX_FUTURE_DELAY))) { + $origin->error = 'ErrorDateIsInFuture'; + return null; + } + + if ($origin->cond_reglement_id <= 0) { + $origin->error = $langs->trans('ErrorFieldRequired', $langs->transnoentities('PaymentConditionsShort')); + return null; + } + + $payment_conditions_deposit_percent = getDictvalue(MAIN_DB_PREFIX . 'c_payment_term', 'deposit_percent', $origin->cond_reglement_id); + + if (empty($payment_conditions_deposit_percent)) { + $origin->error = 'ErrorPaymentConditionsNotEligibleToDepositCreation'; + return null; + } + + if (empty($origin->deposit_percent)) { + $origin->error = $langs->trans('ErrorFieldRequired', $langs->transnoentities('DepositPercent')); + return null; + } + + $deposit = new self($origin->db); + $deposit->socid = $origin->socid; + $deposit->type = self::TYPE_DEPOSIT; + $deposit->fk_project = $origin->fk_project; + $deposit->ref_client = $origin->ref_client; + $deposit->date = $invoiceDate; + $deposit->mode_reglement_id = $origin->mode_reglement_id; // CHECK + // TODO Deposit is always due upon reception ? + $deposit->availability_id = $origin->availability_id; + $deposit->demand_reason_id = $origin->demand_reason_id; + $deposit->fk_account = $origin->fk_account; + $deposit->fk_incoterms = $origin->fk_incoterms; + $deposit->location_incoterms = $origin->location_incoterms; + $deposit->fk_multicurrency = $origin->fk_multicurrency; + $deposit->multicurrency_code = $origin->multicurrency_code; + $deposit->multicurrency_tx = $origin->multicurrency_tx; + $deposit->module_source = $origin->module_source; + $deposit->pos_source = $origin->pos_source; + $deposit->model_pdf = 'crabe'; + + $modelByTypeConfName = 'FACTURE_ADDON_PDF_' . $deposit->type; + + if (!empty($conf->global->$modelByTypeConfName)) { + $deposit->model_pdf = $conf->global->$modelByTypeConfName; + } elseif (!empty($conf->global->FACTURE_ADDON_PDF)) { + $deposit->model_pdf = $conf->global->FACTURE_ADDON_PDF; + } + + if (empty($conf->global->MAIN_DISABLE_PROPAGATE_NOTES_FROM_ORIGIN)) { + $deposit->note_private = $origin->note_private; + $deposit->note_public = $origin->note_public; + } + + $deposit->origin = $origin->element; + $deposit->origin_id = $origin->id; + + $origin->fetch_optionals(); + + foreach ($origin->array_options as $extrakey => $value) { + $deposit->array_options[$extrakey] = $value; + } + + $deposit->linked_objects[$deposit->origin] = $deposit->origin_id; + + $deposit->context['createdepositfromorigin'] = 'createdepositfromorigin'; + + $origin->db->begin(); + + // Facture::create() also imports contact from origin + $createReturn = $deposit->create($user, $notrigger); + + if ($createReturn <= 0) { + $origin->db->rollback(); + $origin->error = $deposit->error; + $origin->errors = $deposit->errors; + return null; + } + + $amount_ttc_diff = 0; + $amountdeposit = array(); + + if (! empty($conf->global->MAIN_DEPOSIT_MULTI_TVA)) { + $amount = $origin->total_ttc * ($origin->deposit_percent / 100); + + $TTotalByTva = array(); + foreach ($origin->lines as &$line) { + if (!empty($line->special_code)) { + continue; + } + $TTotalByTva[$line->tva_tx] += $line->total_ttc; + } + + foreach ($TTotalByTva as $tva => &$total) { + $coef = $total / $origin->total_ttc; // Calc coef + $am = $amount * $coef; + $amount_ttc_diff += $am; + $amountdeposit[$tva] += $am / (1 + $tva / 100); // Convert into HT for the addline + } + } else { + $totalamount = 0; + $lines = $origin->lines; + $numlines = count($lines); + for ($i = 0; $i < $numlines; $i++) { + if (empty($lines[$i]->qty)) { + continue; // We discard qty=0, it is an option + } + if (!empty($lines[$i]->special_code)) { + continue; // We discard special_code (frais port, ecotaxe, option, ...) + } + + $totalamount += $lines[$i]->total_ht; // Fixme : is it not for the customer ? Shouldn't we take total_ttc ? + $tva_tx = $lines[$i]->tva_tx; + $amountdeposit[$tva_tx] += ($lines[$i]->total_ht * $origin->deposit_percent) / 100; + } + + if ($totalamount == 0) { + $amountdeposit[0] = 0; + } + + $amount_ttc_diff = $amountdeposit[0]; + } + + foreach ($amountdeposit as $tva => $amount) { + if (empty($amount)) { + continue; + } + + $descline = '(DEPOSIT) ('. $origin->deposit_percent .'%) - '.$origin->ref; + + $addlineResult = $deposit->addline( + $descline, + $amount, // subprice + 1, // quantity + $tva, // vat rate + 0, // localtax1_tx + 0, // localtax2_tx + (empty($conf->global->INVOICE_PRODUCTID_DEPOSIT) ? 0 : $conf->global->INVOICE_PRODUCTID_DEPOSIT), // fk_product + 0, // remise_percent + 0, // date_start + 0, // date_end + 0, + $lines[$i]->info_bits, // info_bits + 0, + 'HT', + 0, + 0, // product_type + 1, + $lines[$i]->special_code, + $deposit->origin, + 0, + 0, + 0, + 0 + //,$langs->trans('Deposit') //Deprecated + ); + + if ($addlineResult < 0) { + $origin->db->rollback(); + $origin->error = $deposit->error; + $origin->errors = $deposit->errors; + return null; + } + } + + $diff = $deposit->total_ttc - $amount_ttc_diff; + + if (!empty($conf->global->MAIN_DEPOSIT_MULTI_TVA) && $diff != 0) { + $deposit->fetch_lines(); + $subprice_diff = $deposit->lines[0]->subprice - $diff / (1 + $deposit->lines[0]->tva_tx / 100); + + $updatelineResult = $deposit->updateline( + $deposit->lines[0]->id, + $deposit->lines[0]->desc, + $subprice_diff, + $deposit->lines[0]->qty, + $deposit->lines[0]->remise_percent, + $deposit->lines[0]->date_start, + $deposit->lines[0]->date_end, + $deposit->lines[0]->tva_tx, + 0, + 0, + 'HT', + $deposit->lines[0]->info_bits, + $deposit->lines[0]->product_type, + 0, + 0, + 0, + $deposit->lines[0]->pa_ht, + $deposit->lines[0]->label, + 0, + array(), + 100 + ); + + if ($updatelineResult < 0) { + $origin->db->rollback(); + $origin->error = $deposit->error; + $origin->errors = $deposit->errors; + return null; + } + } + + + if (! is_object($hookmanager)) { + require_once DOL_DOCUMENT_ROOT . '/core/class/hookmanager.class.php'; + $hookmanager = new HookManager($origin->db); + } + + $hookmanager->initHooks(array('invoicedao')); + + $parameters = array('objFrom' => $origin); + $reshook = $hookmanager->executeHooks('createFrom', $parameters, $deposit, $action); // Note that $action and $object may have been + // modified by hook + if ($reshook < 0) { + $origin->db->rollback(); + $origin->error = $hookmanager->error; + $origin->errors = $hookmanager->errors; + return null; + } + + if (! empty($autoValidateDeposit)) { + $validateReturn = $deposit->validate($user, '', 0, $notrigger); + + if ($validateReturn < 0) { + $origin->db->rollback(); + $origin->error = $deposit->error; + $origin->errors = $deposit->errors; + return null; + } + } + + unset($object->context['createdepositfromorigin']); + + $origin->db->commit(); + + return $deposit; + } + /** * Return clicable link of object (with eventually picto) * diff --git a/htdocs/langs/en_US/bills.lang b/htdocs/langs/en_US/bills.lang index 86344105168..88f653473d5 100644 --- a/htdocs/langs/en_US/bills.lang +++ b/htdocs/langs/en_US/bills.lang @@ -425,6 +425,12 @@ VarAmount=Variable amount (%% tot.) VarAmountOneLine=Variable amount (%% tot.) - 1 line with label '%s' VarAmountAllLines=Variable amount (%% tot.) - all lines from origin DepositPercent=Deposit %% +PaymentConditionPermitsDepositGenerationSelected=You can generate a deposit invoice with the payment conditions you selected +GenerateDeposit=Generate a %s%% deposit invoice +ValidateGeneratedDeposit=Validate the generated deposit +DepositGenerated=Deposit generated +ErrorCanOnlyAutomaticallyGenerateADepositFromProposalOrOrder=You can only automatically generate a deposit from a proposal or an order +ErrorPaymentConditionsNotEligibleToDepositCreation=The chose payment conditions are not eligible for automatic deposit generation # PaymentType PaymentTypeVIR=Bank transfer PaymentTypeShortVIR=Bank transfer From e1c5d01361c92dc818ec0cdddce4cc9630929555 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Thu, 30 Sep 2021 10:43:40 +0000 Subject: [PATCH 010/738] Fixing style errors. --- htdocs/comm/propal/card.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/comm/propal/card.php b/htdocs/comm/propal/card.php index fc16dcdbe16..6cdcb94e169 100644 --- a/htdocs/comm/propal/card.php +++ b/htdocs/comm/propal/card.php @@ -1969,9 +1969,9 @@ if ($action == 'create') { array('type' => 'text', 'name' => 'note_private', 'label' => $langs->trans("Note"), 'value' => '') // Field to complete private note (not replace) ); - $deposit_percent_from_payment_terms = getDictvalue(MAIN_DB_PREFIX . 'c_payment_term', 'deposit_percent', $object->cond_reglement_id); + $deposit_percent_from_payment_terms = getDictvalue(MAIN_DB_PREFIX . 'c_payment_term', 'deposit_percent', $object->cond_reglement_id); - if (! empty($deposit_percent_from_payment_terms)) { + if (! empty($deposit_percent_from_payment_terms)) { $object->fetchObjectLinked(); $eligibleForDepositGeneration = true; @@ -2032,7 +2032,7 @@ if ($action == 'create') { ' ); } - } + } if (!empty($conf->notification->enabled)) { require_once DOL_DOCUMENT_ROOT.'/core/class/notify.class.php'; From d74776622d87b8361923bb4e166c2621a77259b8 Mon Sep 17 00:00:00 2001 From: Marc de Lima Lucio <68746600+marc-dll@users.noreply.github.com> Date: Thu, 30 Sep 2021 12:57:00 +0200 Subject: [PATCH 011/738] NEW: deposit payment terms: check invoice module activation + rights --- htdocs/comm/propal/card.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/htdocs/comm/propal/card.php b/htdocs/comm/propal/card.php index 6cdcb94e169..039b8fc25ec 100644 --- a/htdocs/comm/propal/card.php +++ b/htdocs/comm/propal/card.php @@ -687,7 +687,12 @@ if (empty($reshook)) { $deposit = null; $locationTarget = $_SERVER['PHP_SELF'] . '?id=' . $object->id; - if (!$error && GETPOST('statut', 'int') == $object::STATUS_SIGNED && GETPOST('generate_deposit', 'int') > 0) { + $deposit_percent_from_payment_terms = getDictvalue(MAIN_DB_PREFIX . 'c_payment_term', 'deposit_percent', $object->cond_reglement_id); + + if ( + !$error && GETPOST('statut', 'int') == $object::STATUS_SIGNED && GETPOST('generate_deposit', 'int') > 0 + && ! empty($deposit_percent_from_payment_terms) && ! empty($conf->facture->enabled) && ! empty($user->rights->facture->creer) + ) { $deposit = Facture::createDepositFromOrigin($object, $user, 0, GETPOST('validate_generated_deposit', 'int') > 0); if ($deposit) { @@ -1971,7 +1976,7 @@ if ($action == 'create') { $deposit_percent_from_payment_terms = getDictvalue(MAIN_DB_PREFIX . 'c_payment_term', 'deposit_percent', $object->cond_reglement_id); - if (! empty($deposit_percent_from_payment_terms)) { + if (! empty($deposit_percent_from_payment_terms) && ! empty($conf->facture->enabled) && ! empty($user->rights->facture->creer)) { $object->fetchObjectLinked(); $eligibleForDepositGeneration = true; @@ -2032,7 +2037,7 @@ if ($action == 'create') { ' ); } - } + } if (!empty($conf->notification->enabled)) { require_once DOL_DOCUMENT_ROOT.'/core/class/notify.class.php'; From f6b9336a82649d0eb4ad44a6ea8657faf026e633 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Thu, 30 Sep 2021 10:59:29 +0000 Subject: [PATCH 012/738] Fixing style errors. --- htdocs/comm/propal/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/comm/propal/card.php b/htdocs/comm/propal/card.php index 039b8fc25ec..8002c199efc 100644 --- a/htdocs/comm/propal/card.php +++ b/htdocs/comm/propal/card.php @@ -2037,7 +2037,7 @@ if ($action == 'create') { ' ); } - } + } if (!empty($conf->notification->enabled)) { require_once DOL_DOCUMENT_ROOT.'/core/class/notify.class.php'; From 087157890e77c650244b6c913aef329dd481ab01 Mon Sep 17 00:00:00 2001 From: Marc de Lima Lucio <68746600+marc-dll@users.noreply.github.com> Date: Mon, 4 Oct 2021 15:06:52 +0200 Subject: [PATCH 013/738] FIX: deposit payment terms: unused variable --- htdocs/comm/propal/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/comm/propal/card.php b/htdocs/comm/propal/card.php index 8002c199efc..83e905461c6 100644 --- a/htdocs/comm/propal/card.php +++ b/htdocs/comm/propal/card.php @@ -711,7 +711,7 @@ if (empty($reshook)) { $ret = $deposit->fetch($deposit->id); // Reload to get new records $outputlangs = $langs; - if ($conf->global->MAIN_MULTILANGS && empty($newlang)) { + if ($conf->global->MAIN_MULTILANGS) { $outputlangs = new Translate('', $conf); $outputlangs->setDefaultLang($deposit->thirdparty->default_lang); $outputlangs->load('products'); From 6580c2e30837e04a3bee75d6e16c3c37c68759db Mon Sep 17 00:00:00 2001 From: Marc de Lima Lucio <68746600+marc-dll@users.noreply.github.com> Date: Mon, 4 Oct 2021 15:07:27 +0200 Subject: [PATCH 014/738] FIX: deposit payment terms: correctly untag deposit as created from an origin --- htdocs/compta/facture/class/facture.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index d8265aeef01..e209994c9ae 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -1659,7 +1659,7 @@ class Facture extends CommonInvoice } } - unset($object->context['createdepositfromorigin']); + unset($deposit->context['createdepositfromorigin']); $origin->db->commit(); From 1b2494855d60dd0a4e1be8b66de5b4d867202736 Mon Sep 17 00:00:00 2001 From: Marc de Lima Lucio <68746600+marc-dll@users.noreply.github.com> Date: Mon, 4 Oct 2021 18:09:24 +0200 Subject: [PATCH 015/738] NEW: deposit payment terms: set required invoice fields + filter payment terms with deposits in select + UI --- htdocs/comm/propal/card.php | 95 +++++++++++++++---- htdocs/compta/facture/class/facture.class.php | 24 +++-- htdocs/core/class/html.form.class.php | 7 +- 3 files changed, 100 insertions(+), 26 deletions(-) diff --git a/htdocs/comm/propal/card.php b/htdocs/comm/propal/card.php index 83e905461c6..8dffa7ee5c3 100644 --- a/htdocs/comm/propal/card.php +++ b/htdocs/comm/propal/card.php @@ -690,10 +690,17 @@ if (empty($reshook)) { $deposit_percent_from_payment_terms = getDictvalue(MAIN_DB_PREFIX . 'c_payment_term', 'deposit_percent', $object->cond_reglement_id); if ( - !$error && GETPOST('statut', 'int') == $object::STATUS_SIGNED && GETPOST('generate_deposit', 'int') > 0 + !$error && GETPOST('statut', 'int') == $object::STATUS_SIGNED && GETPOST('generate_deposit', 'alpha') == 'on' && ! empty($deposit_percent_from_payment_terms) && ! empty($conf->facture->enabled) && ! empty($user->rights->facture->creer) ) { - $deposit = Facture::createDepositFromOrigin($object, $user, 0, GETPOST('validate_generated_deposit', 'int') > 0); + $date = dol_mktime(0, 0, 0, GETPOST('datefmonth', 'int'), GETPOST('datefday', 'int'), GETPOST('datefyear', 'int')); + $forceFields = array(); + + if (GETPOSTISSET('date_pointoftax')) { + $forceFields['date_pointoftax'] = dol_mktime(0, 0, 0, GETPOST('date_pointoftaxmonth', 'int'), GETPOST('date_pointoftaxday', 'int'), GETPOST('date_pointoftaxyear', 'int')); + } + + $deposit = Facture::createDepositFromOrigin($object, $date, GETPOST('cond_reglement_id', 'int'), $user, 0, GETPOST('validate_generated_deposit', 'alpha') == 'on', $forceFields); if ($deposit) { setEventMessage('DepositGenerated'); @@ -2005,33 +2012,89 @@ if ($action == 'create') { } } + if ($eligibleForDepositGeneration) { + $formquestion[] = array( + 'type' => 'checkbox', + 'tdclass' => 'showonlyifsigned', + 'name' => 'generate_deposit', + 'label' => $form->textwithpicto($langs->trans('GenerateDeposit', $object->deposit_percent), $langs->trans('PaymentConditionPermitsDepositGenerationSelected')) + ); + + $formquestion[] = array( + 'type' => 'date', + 'tdclass' => 'fieldrequired showonlyifgeneratedeposit', + 'name' => 'datef', + 'label' => $langs->trans('DateInvoice'), + 'value' => dol_now(), + 'datenow' => true + ); + + if (! empty($conf->global->INVOICE_POINTOFTAX_DATE)) { + $formquestion[] = array( + 'type' => 'date', + 'tdclass' => 'fieldrequired showonlyifgeneratedeposit', + 'name' => 'date_pointoftax', + 'label' => $langs->trans('DatePointOfTax'), + 'value' => dol_now(), + 'datenow' => true + ); + } + + ob_start(); + $form->select_conditions_paiements(0, 'cond_reglement_id', 1, 0, 0, 'minwidth200'); // TODO param 3 + $paymentTermsSelect = ob_get_clean(); + + $formquestion[] = array( + 'type' => 'other', + 'tdclass' => 'fieldrequired showonlyifgeneratedeposit', + 'name' => 'cond_reglement_id', + 'label' => $langs->trans('PaymentTerm'), + 'value' => $paymentTermsSelect + ); + + $formquestion[] = array( + 'type' => 'checkbox', + 'tdclass' => 'showonlyifgeneratedeposit', + 'name' => 'validate_generated_deposit', + 'label' => $langs->trans('ValidateGeneratedDeposit') + ); + $formquestion[] = array( 'type' => 'onecolumn', - 'name' => 'generate_deposit,validate_generated_deposit', 'value' => ' - ' diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index e209994c9ae..bf4271ef7d0 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -1411,9 +1411,10 @@ class Facture extends CommonInvoice * @param User $user * @param type $notrigger * @param bool $autoValidate + * @param array $overrideFields * @return Facture */ - static public function createDepositFromOrigin(CommonObject $origin, User $user, $notrigger = 0, $autoValidateDeposit = false, $forceInvoiceDate = null) + static public function createDepositFromOrigin(CommonObject $origin, $date, $cond_reglement_id, User $user, $notrigger = 0, $autoValidateDeposit = false, $overrideFields = array()) { global $conf, $langs, $hookmanager, $action; @@ -1422,16 +1423,19 @@ class Facture extends CommonInvoice return null; } + if (empty($date)) { + $origin->error = $langs->trans('ErrorFieldRequired', $langs->transnoentities('DateInvoice')); + return null; + } + require_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php'; - $invoiceDate = ! empty($forceInvoiceDate) ? $forceInvoiceDate : dol_now(); - - if ($invoiceDate > (dol_get_last_hour(dol_now('tzuserrel')) + (empty($conf->global->INVOICE_MAX_FUTURE_DELAY) ? 0 : $conf->global->INVOICE_MAX_FUTURE_DELAY))) { + if ($date > (dol_get_last_hour(dol_now('tzuserrel')) + (empty($conf->global->INVOICE_MAX_FUTURE_DELAY) ? 0 : $conf->global->INVOICE_MAX_FUTURE_DELAY))) { $origin->error = 'ErrorDateIsInFuture'; return null; } - if ($origin->cond_reglement_id <= 0) { + if ($cond_reglement_id <= 0) { $origin->error = $langs->trans('ErrorFieldRequired', $langs->transnoentities('PaymentConditionsShort')); return null; } @@ -1453,9 +1457,9 @@ class Facture extends CommonInvoice $deposit->type = self::TYPE_DEPOSIT; $deposit->fk_project = $origin->fk_project; $deposit->ref_client = $origin->ref_client; - $deposit->date = $invoiceDate; - $deposit->mode_reglement_id = $origin->mode_reglement_id; // CHECK - // TODO Deposit is always due upon reception ? + $deposit->date = $date; + $deposit->mode_reglement_id = $origin->mode_reglement_id; + $deposit->cond_reglement_id = $cond_reglement_id; $deposit->availability_id = $origin->availability_id; $deposit->demand_reason_id = $origin->demand_reason_id; $deposit->fk_account = $origin->fk_account; @@ -1492,6 +1496,10 @@ class Facture extends CommonInvoice $deposit->linked_objects[$deposit->origin] = $deposit->origin_id; + foreach ($overrideFields as $key => $value) { + $deposit->$key = $value; + } + $deposit->context['createdepositfromorigin'] = 'createdepositfromorigin'; $origin->db->begin(); diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 61b00812efd..98ea68e5542 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -3877,7 +3877,7 @@ class Form * * @param int $selected Id of payment term to preselect by default * @param string $htmlname Nom de la zone select - * @param int $filtertype Not used + * @param int $filtertype If > 0, don't include payment terms with deposit percentage (for invoices) * @param int $addempty Add an empty entry * @param int $noinfoadmin 0=Add admin info, 1=Disable admin info * @param string $morecss Add more CSS on select tag @@ -3905,6 +3905,10 @@ class Form $selectedDepositPercent = null; foreach ($this->cache_conditions_paiements as $id => $arrayconditions) { + if ($filtertype > 0 && ! empty($arrayconditions['deposit_percent'])) { + continue; + } + if ($selected == $id) { $selectedDepositPercent = ! empty($deposit_percent) ? $deposit_percent : $arrayconditions['deposit_percent']; print ''; } $out.= ''; if ($user->admin && empty($noinfoadmin)) { $out.= info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1); } $out.= ajax_combobox($htmlname); + if ($deposit_percent >= 0) { - print ' '; - print ' + $out .= ' '; + $out .= ' '; } + return $out; } diff --git a/htdocs/install/mysql/migration/14.0.0-15.0.0.sql b/htdocs/install/mysql/migration/14.0.0-15.0.0.sql index 2fc7107e07e..f744abffde4 100644 --- a/htdocs/install/mysql/migration/14.0.0-15.0.0.sql +++ b/htdocs/install/mysql/migration/14.0.0-15.0.0.sql @@ -188,13 +188,6 @@ INSERT INTO llx_c_forme_juridique (fk_pays, code, libelle) VALUES (20, '2012', ' ALTER TABLE llx_c_holiday_types ADD COLUMN block_if_negative integer NOT NULL DEFAULT 0 AFTER fk_country; --- Deposit generation helper with specific payment terms -ALTER TABLE llx_c_payment_term ADD COLUMN deposit_percent VARCHAR(63) DEFAULT NULL AFTER decalage; -ALTER TABLE llx_societe ADD COLUMN deposit_percent VARCHAR(63) DEFAULT NULL AFTER cond_reglement; -ALTER TABLE llx_propal ADD COLUMN deposit_percent VARCHAR(63) DEFAULT NULL AFTER fk_cond_reglement; -ALTER TABLE llx_commande ADD COLUMN deposit_percent VARCHAR(63) DEFAULT NULL AFTER fk_cond_reglement; -INSERT INTO llx_c_payment_term(code, sortorder, active, libelle, libelle_facture, type_cdr, nbjour, deposit_percent) values ('DEP30PCTDEL', 13, 0, '__DEPOSIT_PERCENT__% deposit', '__DEPOSIT_PERCENT__% deposit, remainder on delivery', 0, 1, '30'); - -- START GRH/HRM MODULE diff --git a/htdocs/install/mysql/migration/15.0.0-16.0.0.sql b/htdocs/install/mysql/migration/15.0.0-16.0.0.sql index 5d838fc8bb1..db1617e8bdd 100644 --- a/htdocs/install/mysql/migration/15.0.0-16.0.0.sql +++ b/htdocs/install/mysql/migration/15.0.0-16.0.0.sql @@ -272,4 +272,12 @@ ALTER TABLE llx_reception MODIFY COLUMN ref_supplier varchar(128); ALTER TABLE llx_bank_account ADD COLUMN pti_in_ctti smallint DEFAULT 0 AFTER domiciliation; -- Set default ticket type to OTHER if no default exists -UPDATE llx_c_ticket_type SET use_default=1 WHERE code='OTHER' AND NOT EXISTS(SELECT * FROM (SELECT * FROM llx_c_ticket_type) AS t WHERE use_default=1); \ No newline at end of file +UPDATE llx_c_ticket_type SET use_default=1 WHERE code='OTHER' AND NOT EXISTS(SELECT * FROM (SELECT * FROM llx_c_ticket_type) AS t WHERE use_default=1); + + +-- Deposit generation helper with specific payment terms +ALTER TABLE llx_c_payment_term ADD COLUMN deposit_percent VARCHAR(63) DEFAULT NULL AFTER decalage; +ALTER TABLE llx_societe ADD COLUMN deposit_percent VARCHAR(63) DEFAULT NULL AFTER cond_reglement; +ALTER TABLE llx_propal ADD COLUMN deposit_percent VARCHAR(63) DEFAULT NULL AFTER fk_cond_reglement; +ALTER TABLE llx_commande ADD COLUMN deposit_percent VARCHAR(63) DEFAULT NULL AFTER fk_cond_reglement; +INSERT INTO llx_c_payment_term(code, sortorder, active, libelle, libelle_facture, type_cdr, nbjour, deposit_percent) values ('DEP30PCTDEL', 13, 0, '__DEPOSIT_PERCENT__% deposit', '__DEPOSIT_PERCENT__% deposit, remainder on delivery', 0, 1, '30'); From b45aeda14d1d3d37b3f9560f6bcbab74bff6cea4 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Tue, 15 Mar 2022 09:41:51 +0000 Subject: [PATCH 078/738] Fixing style errors. --- htdocs/modulebuilder/index.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php index 240c739e5c0..eddf9b3c7de 100644 --- a/htdocs/modulebuilder/index.php +++ b/htdocs/modulebuilder/index.php @@ -1332,8 +1332,8 @@ if ($dirins && $action == 'addproperty' && empty($cancel) && !empty($module) && setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Type")), null, 'errors'); } - if (!$error && !GETPOST('regenerateclasssql')&& !GETPOST('regeneratemissing')) { - $addfieldentry = array( + if (!$error && !GETPOST('regenerateclasssql')&& !GETPOST('regeneratemissing')) { + $addfieldentry = array( 'name'=>GETPOST('propname', 'aZ09'), 'label'=>GETPOST('proplabel', 'alpha'), 'type'=>GETPOST('proptype', 'alpha'), @@ -1353,7 +1353,7 @@ if ($dirins && $action == 'addproperty' && empty($cancel) && !empty($module) && 'default'=>GETPOST('propdefault', 'restricthtml'), 'noteditable'=>intval(GETPOST('propnoteditable', 'int')), 'validate' => GETPOST('propvalidate', 'int') - ); + ); if (!empty($addfieldentry['arrayofkeyval']) && !is_array($addfieldentry['arrayofkeyval'])) { From 6462fd83067f07f9a7a667fcd3f7b55668be0c4a Mon Sep 17 00:00:00 2001 From: Quentin VIAL-GOUTEYRON Date: Mon, 28 Mar 2022 16:02:18 +0200 Subject: [PATCH 079/738] update pmp real even if it's not edit --- htdocs/product/inventory/inventory.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/htdocs/product/inventory/inventory.php b/htdocs/product/inventory/inventory.php index 536aaf7d354..895ff8105cd 100644 --- a/htdocs/product/inventory/inventory.php +++ b/htdocs/product/inventory/inventory.php @@ -268,6 +268,8 @@ if (empty($reshook)) { $result = $inventoryline->fetch($lineid); if ($result > 0) { $inventoryline->qty_view = null; // The new value we want + $inventoryline->pmp_real = price2num(GETPOST('realpmp_'.$lineid, 'alpha'), 'MS'); + $inventoryline->pmp_expected = price2num(GETPOST('expectedpmp_'.$lineid, 'alpha'), 'MS'); $resultupdate = $inventoryline->update($user); } } From ca7ecfbb579e6115b78698ef16ddde56d5bc5076 Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Tue, 29 Mar 2022 11:06:18 +0200 Subject: [PATCH 080/738] FIX avoid warning for missing cookie samesite params (and more secure) --- htdocs/main.inc.php | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index fe0986e8d13..c13f7cbe2c9 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -265,10 +265,22 @@ if (!empty($_POST["DOL_AUTOSET_COOKIE"])) { $cookiearrayvalue[$tmpkey] = $_POST[$postkey]; } } - $cookiename = $tmpautoset[0]; + $cookiename = (empty($dolibarr_main_force_https) ? $tmpautoset[0] : '__Secure-'.$tmpautoset[0]); // __Secure- || __Host- $cookievalue = json_encode($cookiearrayvalue); //var_dump('setcookie cookiename='.$cookiename.' cookievalue='.$cookievalue); - setcookie($cookiename, empty($cookievalue) ? '' : $cookievalue, empty($cookievalue) ? 0 : (time() + (86400 * 354)), '/', null, (empty($dolibarr_main_force_https) ? false : true), true); // keep cookie 1 year and add tag httponly + if (PHP_VERSION_ID < 70300) { + setcookie($cookiename, empty($cookievalue) ? '' : $cookievalue, empty($cookievalue) ? 0 : (time() + (86400 * 354)), '/', null, (empty($dolibarr_main_force_https) ? false : true), true); // keep cookie 1 year and add tag httponly + } else { + $cookieparams = array( + 'expires' => empty($cookievalue) ? 0 : (time() + (86400 * 354)), + 'path' => '/', + //'domain' => '.mywebsite.com', // the dot at the beginning allows compatibility with subdomains + 'secure' => (empty($dolibarr_main_force_https) ? false : true), + 'httponly' => true, + 'samesite' => 'Lax' // None || Lax || Strict + ); + setcookie($cookiename, empty($cookievalue) ? '' : $cookievalue, $cookieparams); + } if (empty($cookievalue)) { unset($_COOKIE[$cookiename]); } @@ -284,7 +296,7 @@ if (!empty($php_session_save_handler) && $php_session_save_handler == 'db') { // Must be done after the include of filefunc.inc.php so global variables of conf file are defined (like $dolibarr_main_instance_unique_id or $dolibarr_main_force_https). // Note: the function dol_getprefix() is defined into functions.lib.php but may have been defined to return a different key to manage another area to protect. $prefix = dol_getprefix(''); -$sessionname = 'DOLSESSID_'.$prefix; +$sessionname = (empty($dolibarr_main_force_https) ? 'DOLSESSID_'.$prefix : '__Secure-DOLSESSID_'.$prefix); // __Secure- || __Host- $sessiontimeout = 'DOLSESSTIMEOUT_'.$prefix; if (!empty($_COOKIE[$sessiontimeout])) { ini_set('session.gc_maxlifetime', $_COOKIE[$sessiontimeout]); @@ -293,7 +305,19 @@ if (!empty($_COOKIE[$sessiontimeout])) { // This create lock, released by session_write_close() or end of page. // We need this lock as long as we read/write $_SESSION ['vars']. We can remove lock when finished. if (!defined('NOSESSION')) { - session_set_cookie_params(0, '/', null, (empty($dolibarr_main_force_https) ? false : true), true); // Add tag secure and httponly on session cookie (same as setting session.cookie_httponly into php.ini). Must be called before the session_start. + if (PHP_VERSION_ID < 70300) { + session_set_cookie_params(0, '/', null, (empty($dolibarr_main_force_https) ? false : true), true); // Add tag secure and httponly on session cookie (same as setting session.cookie_httponly into php.ini). Must be called before the session_start. + } else { + $sessioncookieparams = array( + 'lifetime' => 0, + 'path' => '/', + //'domain' => '.mywebsite.com', // the dot at the beginning allows compatibility with subdomains + 'secure' => (empty($dolibarr_main_force_https) ? false : true), + 'httponly' => true, + 'samesite' => 'Lax' // None || Lax || Strict + ); + session_set_cookie_params($sessioncookieparams); + } session_name($sessionname); session_start(); // This call the open and read of session handler //exit; // this exist generates a call to write and close From b7d6436e339a9e2653344620abd3e5567afc341a Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Tue, 29 Mar 2022 11:10:41 +0200 Subject: [PATCH 081/738] FIX add doc --- htdocs/main.inc.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index c13f7cbe2c9..eba557ffe17 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -271,6 +271,7 @@ if (!empty($_POST["DOL_AUTOSET_COOKIE"])) { if (PHP_VERSION_ID < 70300) { setcookie($cookiename, empty($cookievalue) ? '' : $cookievalue, empty($cookievalue) ? 0 : (time() + (86400 * 354)), '/', null, (empty($dolibarr_main_force_https) ? false : true), true); // keep cookie 1 year and add tag httponly } else { + // Only available for php >= 7.3 $cookieparams = array( 'expires' => empty($cookievalue) ? 0 : (time() + (86400 * 354)), 'path' => '/', @@ -308,6 +309,7 @@ if (!defined('NOSESSION')) { if (PHP_VERSION_ID < 70300) { session_set_cookie_params(0, '/', null, (empty($dolibarr_main_force_https) ? false : true), true); // Add tag secure and httponly on session cookie (same as setting session.cookie_httponly into php.ini). Must be called before the session_start. } else { + // Only available for php >= 7.3 $sessioncookieparams = array( 'lifetime' => 0, 'path' => '/', From 29a4e7c725612b08c898eb3830f23d2010ff83e3 Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Tue, 29 Mar 2022 12:03:18 +0200 Subject: [PATCH 082/738] FIX check if https or not --- htdocs/main.inc.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index eba557ffe17..e66c9e9d313 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -265,18 +265,18 @@ if (!empty($_POST["DOL_AUTOSET_COOKIE"])) { $cookiearrayvalue[$tmpkey] = $_POST[$postkey]; } } - $cookiename = (empty($dolibarr_main_force_https) ? $tmpautoset[0] : '__Secure-'.$tmpautoset[0]); // __Secure- || __Host- + $cookiename = ((empty($dolibarr_main_force_https) && isHTTPS() === false) ? $tmpautoset[0] : '__Secure-'.$tmpautoset[0]); // __Secure- || __Host- $cookievalue = json_encode($cookiearrayvalue); //var_dump('setcookie cookiename='.$cookiename.' cookievalue='.$cookievalue); if (PHP_VERSION_ID < 70300) { - setcookie($cookiename, empty($cookievalue) ? '' : $cookievalue, empty($cookievalue) ? 0 : (time() + (86400 * 354)), '/', null, (empty($dolibarr_main_force_https) ? false : true), true); // keep cookie 1 year and add tag httponly + setcookie($cookiename, empty($cookievalue) ? '' : $cookievalue, empty($cookievalue) ? 0 : (time() + (86400 * 354)), '/', null, ((empty($dolibarr_main_force_https) && isHTTPS() === false) ? false : true), true); // keep cookie 1 year and add tag httponly } else { // Only available for php >= 7.3 $cookieparams = array( 'expires' => empty($cookievalue) ? 0 : (time() + (86400 * 354)), 'path' => '/', //'domain' => '.mywebsite.com', // the dot at the beginning allows compatibility with subdomains - 'secure' => (empty($dolibarr_main_force_https) ? false : true), + 'secure' => ((empty($dolibarr_main_force_https) && isHTTPS() === false) ? false : true), 'httponly' => true, 'samesite' => 'Lax' // None || Lax || Strict ); @@ -297,7 +297,7 @@ if (!empty($php_session_save_handler) && $php_session_save_handler == 'db') { // Must be done after the include of filefunc.inc.php so global variables of conf file are defined (like $dolibarr_main_instance_unique_id or $dolibarr_main_force_https). // Note: the function dol_getprefix() is defined into functions.lib.php but may have been defined to return a different key to manage another area to protect. $prefix = dol_getprefix(''); -$sessionname = (empty($dolibarr_main_force_https) ? 'DOLSESSID_'.$prefix : '__Secure-DOLSESSID_'.$prefix); // __Secure- || __Host- +$sessionname = ((empty($dolibarr_main_force_https) && isHTTPS() === false) ? 'DOLSESSID_'.$prefix : '__Secure-DOLSESSID_'.$prefix); // __Secure- || __Host- $sessiontimeout = 'DOLSESSTIMEOUT_'.$prefix; if (!empty($_COOKIE[$sessiontimeout])) { ini_set('session.gc_maxlifetime', $_COOKIE[$sessiontimeout]); @@ -307,14 +307,14 @@ if (!empty($_COOKIE[$sessiontimeout])) { // We need this lock as long as we read/write $_SESSION ['vars']. We can remove lock when finished. if (!defined('NOSESSION')) { if (PHP_VERSION_ID < 70300) { - session_set_cookie_params(0, '/', null, (empty($dolibarr_main_force_https) ? false : true), true); // Add tag secure and httponly on session cookie (same as setting session.cookie_httponly into php.ini). Must be called before the session_start. + session_set_cookie_params(0, '/', null, ((empty($dolibarr_main_force_https) && isHTTPS() === false) ? false : true), true); // Add tag secure and httponly on session cookie (same as setting session.cookie_httponly into php.ini). Must be called before the session_start. } else { // Only available for php >= 7.3 $sessioncookieparams = array( 'lifetime' => 0, 'path' => '/', //'domain' => '.mywebsite.com', // the dot at the beginning allows compatibility with subdomains - 'secure' => (empty($dolibarr_main_force_https) ? false : true), + 'secure' => ((empty($dolibarr_main_force_https) && isHTTPS() === false) ? false : true), 'httponly' => true, 'samesite' => 'Lax' // None || Lax || Strict ); From 89eb19bafb4acdcc0b71eb3dafec044682646a1c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 5 Apr 2022 17:51:42 +0200 Subject: [PATCH 083/738] Update modulebuilder.lib.php --- htdocs/core/lib/modulebuilder.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/modulebuilder.lib.php b/htdocs/core/lib/modulebuilder.lib.php index 1e4c43b1f90..27c96c2e972 100644 --- a/htdocs/core/lib/modulebuilder.lib.php +++ b/htdocs/core/lib/modulebuilder.lib.php @@ -128,7 +128,7 @@ function rebuildObjectClass($destdir, $module, $objectname, $newmask, $readdir = if (!empty($val['noteditable'])) { $texttoinsert .= " 'noteditable'=>'".$val['noteditable']."',"; } - if (!empty($val['default']) || (!empty($val['default']) && $val['default'] === '0')) { + if (!empty($val['default']) || (isset($val['default']) && $val['default'] === '0')) { $texttoinsert .= " 'default'=>'".$val['default']."',"; } if (!empty($val['index'])) { From 51837690fe20a92c7a3cde93ac366abc53e76ef0 Mon Sep 17 00:00:00 2001 From: wdammak <26695620+wdammak@users.noreply.github.com> Date: Thu, 7 Apr 2022 01:10:29 +0100 Subject: [PATCH 084/738] Avoid duplicate 3rd partires --- htdocs/societe/card.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/htdocs/societe/card.php b/htdocs/societe/card.php index 45bbefabdab..b72f41e436a 100644 --- a/htdocs/societe/card.php +++ b/htdocs/societe/card.php @@ -1291,8 +1291,10 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { print ''.$form->editfieldkey('ThirdPartyName', 'name', '', $object, 0).''; } print 'global->SOCIETE_USEPREFIX) ? ' colspan="3"' : '').'>'; - print ''; - print $form->widgetForTranslation("name", $object, $permissiontoadd, 'string', 'alpahnohtml', 'minwidth300'); + //print ''; + //print $form->widgetForTranslation("name", $object, $permissiontoadd, 'string', 'alpahnohtml', 'minwidth300'); + print $form->select_company(0, 'name', '(s.client = 1 OR s.client = 3) AND status=1', ' '); + print ""; print ''; if (!empty($conf->global->SOCIETE_USEPREFIX)) { // Old not used prefix field print ''.$langs->trans('Prefix').''; From 67e7c91c3ed34b1c8a0f94c0e5032e4ee7ce8edb Mon Sep 17 00:00:00 2001 From: Quentin VIAL-GOUTEYRON Date: Mon, 11 Apr 2022 15:47:38 +0200 Subject: [PATCH 085/738] pmp inventory conf MAIN_PRODUCT_PERENTITY_SHARED --- htdocs/product/inventory/inventory.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/htdocs/product/inventory/inventory.php b/htdocs/product/inventory/inventory.php index 2b21de99079..77cdc965164 100644 --- a/htdocs/product/inventory/inventory.php +++ b/htdocs/product/inventory/inventory.php @@ -194,6 +194,15 @@ if (empty($reshook)) { setEventMessages($db->lasterror(), null, 'errors'); break; } + if(!empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED)) { + $sqlpmp = 'UPDATE '.MAIN_DB_PREFIX.'product_perentity SET pmp = '.((float) $line->pmp_real).' WHERE fk_product = '.((int) $line->fk_product).' AND entity='.$conf->entity; + $resqlpmp = $db->query($sqlpmp); + if (! $resqlpmp) { + $error++; + setEventMessages($db->lasterror(), null, 'errors'); + break; + } + } } // Update line with id of stock movement (and the start quantity if it has changed this last recording) From ddb50264aeb5c132ec89aa39c09c074f0b65e234 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Mon, 11 Apr 2022 13:58:59 +0000 Subject: [PATCH 086/738] Fixing style errors. --- htdocs/product/inventory/inventory.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/htdocs/product/inventory/inventory.php b/htdocs/product/inventory/inventory.php index 77cdc965164..9cef5671041 100644 --- a/htdocs/product/inventory/inventory.php +++ b/htdocs/product/inventory/inventory.php @@ -194,15 +194,15 @@ if (empty($reshook)) { setEventMessages($db->lasterror(), null, 'errors'); break; } - if(!empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED)) { - $sqlpmp = 'UPDATE '.MAIN_DB_PREFIX.'product_perentity SET pmp = '.((float) $line->pmp_real).' WHERE fk_product = '.((int) $line->fk_product).' AND entity='.$conf->entity; - $resqlpmp = $db->query($sqlpmp); - if (! $resqlpmp) { - $error++; - setEventMessages($db->lasterror(), null, 'errors'); - break; - } - } + if (!empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED)) { + $sqlpmp = 'UPDATE '.MAIN_DB_PREFIX.'product_perentity SET pmp = '.((float) $line->pmp_real).' WHERE fk_product = '.((int) $line->fk_product).' AND entity='.$conf->entity; + $resqlpmp = $db->query($sqlpmp); + if (! $resqlpmp) { + $error++; + setEventMessages($db->lasterror(), null, 'errors'); + break; + } + } } // Update line with id of stock movement (and the start quantity if it has changed this last recording) From 89b7c8298b4f7f27b4d3b08079014826437677a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alo=C3=AFs=20Micard?= Date: Mon, 11 Apr 2022 17:25:45 +0200 Subject: [PATCH 087/738] Module builder: Translate permissions label --- htdocs/modulebuilder/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php index f3922aa6342..f8abd703bf0 100644 --- a/htdocs/modulebuilder/index.php +++ b/htdocs/modulebuilder/index.php @@ -3008,7 +3008,7 @@ if ($module == 'initmodule') print ''; print ''; - print $perm[1]; + print $langs->trans($perm[1]); print ''; print ''; From 9547b9e7febb4312bd491d6d3e089d0eb7c521e3 Mon Sep 17 00:00:00 2001 From: Ferran Marcet Date: Mon, 11 Apr 2022 18:01:25 +0200 Subject: [PATCH 088/738] Fix: Online signature of proposals does not work well with multicompany --- htdocs/core/ajax/onlineSign.php | 4 ++++ htdocs/public/onlinesign/newonlinesign.php | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/htdocs/core/ajax/onlineSign.php b/htdocs/core/ajax/onlineSign.php index 5110918541f..ce9ae57864d 100644 --- a/htdocs/core/ajax/onlineSign.php +++ b/htdocs/core/ajax/onlineSign.php @@ -48,6 +48,10 @@ if (!defined('NOIPCHECK')) { if (!defined('NOBROWSERNOTIF')) { define('NOBROWSERNOTIF', '1'); } +$entity = (!empty($_GET['entity']) ? (int) $_GET['entity'] : (!empty($_POST['entity']) ? (int) $_POST['entity'] : 1)); +if (is_numeric($entity)) { + define("DOLENTITY", $entity); +} include '../../main.inc.php'; $action = GETPOST('action', 'aZ09'); diff --git a/htdocs/public/onlinesign/newonlinesign.php b/htdocs/public/onlinesign/newonlinesign.php index 8bd95d23c8d..2a9ed568fe8 100644 --- a/htdocs/public/onlinesign/newonlinesign.php +++ b/htdocs/public/onlinesign/newonlinesign.php @@ -431,11 +431,12 @@ if ($action == "dosign" && empty($cancel)) { "ref" : \''.dol_escape_js($REF).'\', "securekey" : \''.dol_escape_js($SECUREKEY).'\', "mode" : \''.dol_escape_htmltag($source).'\', + "entity" : \''.dol_escape_htmltag($entity).'\', }, success: function(response) { if(response == "success"){ console.log("Success on saving signature"); - window.location.replace("'.$_SERVER["PHP_SELF"].'?ref='.urlencode($ref).'&message=signed&securekey='.urlencode($SECUREKEY).'"); + window.location.replace("'.$_SERVER["PHP_SELF"].'?ref='.urlencode($ref).'&message=signed&securekey='.urlencode($SECUREKEY).($conf->multicompany->enabled?'&entity='.$entity:'').'"); }else{ console.error(response); } From 62b74962535ed38c424e569d9dbd79b25653ab16 Mon Sep 17 00:00:00 2001 From: Ferran Marcet Date: Mon, 11 Apr 2022 18:26:49 +0200 Subject: [PATCH 089/738] Fix: Direct download don't work with multicompany --- htdocs/document.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/htdocs/document.php b/htdocs/document.php index 060722e8d5b..fc894091615 100644 --- a/htdocs/document.php +++ b/htdocs/document.php @@ -5,6 +5,7 @@ * Copyright (C) 2005-2012 Regis Houssin * Copyright (C) 2010 Pierre Morin * Copyright (C) 2010 Juanjo Menent + * Copyright (C) 2022 Ferran Marcet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -140,6 +141,11 @@ if (!empty($hashp)) $modulepart = $moduleparttocheck; $original_file = (($tmp[1] ? $tmp[1].'/' : '').$ecmfile->filename); // this is relative to module dir } + $entity = $ecmfile->entity; + if ($entity != $conf->entity) { + $conf->entity = $entity; + $conf->setValues($db); + } } else { $langs->load("errors"); accessforbidden($langs->trans("ErrorFileNotFoundWithSharedLink"), 0, 0, 1); From b8bccd62efa45ce1617eaa3d4a0278c3d3305adc Mon Sep 17 00:00:00 2001 From: Ferran Marcet Date: Mon, 11 Apr 2022 18:41:36 +0200 Subject: [PATCH 090/738] Update newonlinesign.php --- htdocs/public/onlinesign/newonlinesign.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/public/onlinesign/newonlinesign.php b/htdocs/public/onlinesign/newonlinesign.php index 2a9ed568fe8..d1020dc2c1d 100644 --- a/htdocs/public/onlinesign/newonlinesign.php +++ b/htdocs/public/onlinesign/newonlinesign.php @@ -193,7 +193,7 @@ $replacemainarea = (empty($conf->dol_hide_leftmenu) ? '
' : '').'
'; llxHeader($head, $langs->trans("OnlineSignature"), '', '', 0, 0, '', '', '', 'onlinepaymentbody', $replacemainarea, 1); if ($action == 'refusepropal') { - print $form->formconfirm($_SERVER["PHP_SELF"].'?ref='.urlencode($ref).'&securekey='.urlencode($SECUREKEY), $langs->trans('RefusePropal'), $langs->trans('ConfirmRefusePropal', $object->ref), 'confirm_refusepropal', '', '', 1); + print $form->formconfirm($_SERVER["PHP_SELF"].'?ref='.urlencode($ref).'&securekey='.urlencode($SECUREKEY).($conf->multicompany->enabled?'&entity='.$entity:''), $langs->trans('RefusePropal'), $langs->trans('ConfirmRefusePropal', $object->ref), 'confirm_refusepropal', '', '', 1); } // Check link validity for param 'source' to avoid use of the examples as value From f679392d26ad3f902c9f42d0e38f6a5c897e29d1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 12 Apr 2022 02:26:37 +0200 Subject: [PATCH 091/738] FIX missing picto in combo of mass actions of thirdparties. --- htdocs/societe/list.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php index da056ec33da..bdc0fae08e0 100644 --- a/htdocs/societe/list.php +++ b/htdocs/societe/list.php @@ -870,10 +870,10 @@ if ($user->rights->societe->creer) { $arrayofmassactions['preaffecttag'] = img_picto('', 'category', 'class="pictofixedwidth"').$langs->trans("AffectTag"); } if ($user->rights->societe->creer) { - $arrayofmassactions['preenable'] = img_picto('', '', 'class="pictofixedwidth"').$langs->trans("SetToEnabled"); + $arrayofmassactions['preenable'] = img_picto('', 'stop-circle', 'class="pictofixedwidth"').$langs->trans("SetToEnabled"); } if ($user->rights->societe->creer) { - $arrayofmassactions['predisable'] = img_picto('', '', 'class="pictofixedwidth"').$langs->trans("SetToDisabled"); + $arrayofmassactions['predisable'] = img_picto('', 'stop-circle', 'class="pictofixedwidth"').$langs->trans("SetToDisabled"); } if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend', 'predelete', 'preaffecttag', 'preenable', 'preclose'))) { $arrayofmassactions = array(); From cfe554b04cbec7987f1f4b8951ba75a9d87a3831 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 12 Apr 2022 03:08:31 +0200 Subject: [PATCH 092/738] Fix var not defined --- htdocs/modulebuilder/index.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php index 872a88b28aa..39f70d30d2d 100644 --- a/htdocs/modulebuilder/index.php +++ b/htdocs/modulebuilder/index.php @@ -46,6 +46,9 @@ $action = GETPOST('action', 'aZ09'); $confirm = GETPOST('confirm', 'alpha'); $cancel = GETPOST('cancel', 'alpha'); +$sortfield = ''; +$sortorder = ''; + $module = GETPOST('module', 'alpha'); $tab = GETPOST('tab', 'aZ09'); $tabobj = GETPOST('tabobj', 'alpha'); From c4747735b99509d948361dd3ba28a0187811d125 Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Tue, 12 Apr 2022 07:55:09 +0200 Subject: [PATCH 093/738] FIX missing signature library when ODT model is used --- .../modules/propale/doc/doc_generic_proposal_odt.modules.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php b/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php index 636bf4c4f7f..bd86d27b0a3 100644 --- a/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php +++ b/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php @@ -31,6 +31,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/doc.lib.php'; +include_once DOL_DOCUMENT_ROOT.'/core/lib/signature.lib.php'; /** From 2d56aed912d37f220b446ecaaea9a2623aa9c6de Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Tue, 12 Apr 2022 08:31:51 +0200 Subject: [PATCH 094/738] FIX uniformize code --- .../modules/propale/doc/doc_generic_proposal_odt.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php b/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php index bd86d27b0a3..66e2f3c8312 100644 --- a/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php +++ b/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php @@ -31,7 +31,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/doc.lib.php'; -include_once DOL_DOCUMENT_ROOT.'/core/lib/signature.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/signature.lib.php'; /** From f4023b4e44160e0861eb09a0d0d407e5420575e3 Mon Sep 17 00:00:00 2001 From: kevin Date: Tue, 12 Apr 2022 11:08:50 +0200 Subject: [PATCH 095/738] Add missing entity on salary's payment --- htdocs/salaries/class/paymentsalary.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/salaries/class/paymentsalary.class.php b/htdocs/salaries/class/paymentsalary.class.php index 76236bb88aa..506e9b73ea5 100644 --- a/htdocs/salaries/class/paymentsalary.class.php +++ b/htdocs/salaries/class/paymentsalary.class.php @@ -164,9 +164,9 @@ class PaymentSalary extends CommonObject $this->db->begin(); if ($totalamount != 0) { - $sql = "INSERT INTO ".MAIN_DB_PREFIX."payment_salary (fk_salary, datec, datep, amount,"; + $sql = "INSERT INTO ".MAIN_DB_PREFIX."payment_salary (entity, fk_salary, datec, datep, amount,"; $sql .= " fk_typepayment, num_payment, note, fk_user_author, fk_bank)"; - $sql .= " VALUES ($this->chid, '".$this->db->idate($now)."',"; + $sql .= " VALUES (".$conf->entity.", ".$this->chid.", '".$this->db->idate($now)."',"; $sql .= " '".$this->db->idate($this->datepaye)."',"; $sql .= " ".price2num($totalamount).","; $sql .= " ".((int) $this->paiementtype).", '".$this->db->escape($this->num_payment)."', '".$this->db->escape($this->note)."', ".((int) $user->id).","; From a6407257dd2752b6f2931f43b0c4bcdf9b1ffe05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alo=C3=AFs=20Micard?= Date: Tue, 12 Apr 2022 11:11:26 +0200 Subject: [PATCH 096/738] Allow to view tabs in module builder --- htdocs/langs/en_US/modulebuilder.lang | 5 +- htdocs/modulebuilder/index.php | 127 ++++++++++++++++++++++++++ 2 files changed, 131 insertions(+), 1 deletion(-) diff --git a/htdocs/langs/en_US/modulebuilder.lang b/htdocs/langs/en_US/modulebuilder.lang index 7ba539d3bd4..6376024ea0b 100644 --- a/htdocs/langs/en_US/modulebuilder.lang +++ b/htdocs/langs/en_US/modulebuilder.lang @@ -143,4 +143,7 @@ AsciiToHtmlConverter=Ascii to HTML converter AsciiToPdfConverter=Ascii to PDF converter TableNotEmptyDropCanceled=Table not empty. Drop has been canceled. ModuleBuilderNotAllowed=The module builder is available but not allowed to your user. -ImportExportProfiles=Import and export profiles \ No newline at end of file +ImportExportProfiles=Import and export profiles +ListOfTabsEntries=List of tab entries +TabsDefDesc= Define here the tabs provided by your module +TabsDefDescTooltip=The tabs provided by your module/application are defined into the array $this->tabs into the module descriptor file. You can edit manually this file or use the embedded editor. diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php index 82567e05fac..16671ddf137 100644 --- a/htdocs/modulebuilder/index.php +++ b/htdocs/modulebuilder/index.php @@ -1931,6 +1931,11 @@ if ($module == 'initmodule') { $head2[$h][2] = 'permissions'; $h++; + $head2[$h][0] = $_SERVER["PHP_SELF"].'?tab=tabs&module='.$module.($forceddirread ? '@'.$dirread : ''); + $head2[$h][1] = $langs->trans("Tabs"); + $head2[$h][2] = 'tabs'; + $h++; + $head2[$h][0] = $_SERVER["PHP_SELF"].'?tab=menus&module='.$module.($forceddirread ? '@'.$dirread : ''); $head2[$h][1] = $langs->trans("Menus"); $head2[$h][2] = 'menus'; @@ -3902,6 +3907,128 @@ if ($module == 'initmodule') { print ''; } + if ($tab == 'tabs') { + $pathtofile = $listofmodules[strtolower($module)]['moduledescriptorrelpath']; + + $tabs = $moduleobj->tabs; + + if ($action != 'editfile' || empty($file)) { + print ''; + $htmlhelp = $langs->trans("TabsDefDescTooltip", '{s1}'); + $htmlhelp = str_replace('{s1}', ''.$langs->trans('Setup').' - '.$langs->trans('Tabs').'', $htmlhelp); + print $form->textwithpicto($langs->trans("TabsDefDesc"), $htmlhelp, 1, 'help', '', 0, 2, 'helpondesc').'
'; + print '
'; + print '
'; + + print ' '.$langs->trans("DescriptorFile").' : '.$pathtofile.''; + print ' '.img_picto($langs->trans("Edit"), 'edit').''; + print '
'; + + print '
'; + print load_fiche_titre($langs->trans("ListOfTabsEntries"), '', ''); + + print '
'; + print ''; + print ''; + print ''; + print ''; + print ''; + + print '
'; + print ''; + + print ''; + print_liste_field_titre("ObjectType", $_SERVER["PHP_SELF"], '', "", $param, '', $sortfield, $sortorder); + print_liste_field_titre("Tab", $_SERVER["PHP_SELF"], '', "", $param, '', $sortfield, $sortorder); + print_liste_field_titre("Title", $_SERVER["PHP_SELF"], '', "", $param, '', $sortfield, $sortorder); + print_liste_field_titre("LangFile", $_SERVER["PHP_SELF"], '', "", $param, '', $sortfield, $sortorder); + print_liste_field_titre("Condition", $_SERVER["PHP_SELF"], '', "", $param, '', $sortfield, $sortorder); + print_liste_field_titre("Path", $_SERVER["PHP_SELF"], '', "", $param, '', $sortfield, $sortorder); + print "\n"; + + if (count($tabs)) { + foreach ($tabs as $tab) { + $parts = explode(':', $tab['data']); + + $objectType = $parts[0]; + $tabName = $parts[1]; + $tabTitle = isset($parts[2]) ? $parts[2] : ''; + $langFile = isset($parts[3]) ? $parts[3] : ''; + $condition = isset($parts[4]) ? $parts[4] : ''; + $path = isset($parts[5]) ? $parts[5] : ''; + + // If we want to remove the tab, then the format is 'tabname:optionalcondition' + // See: https://wiki.dolibarr.org/index.php?title=Tabs_system#To_remove_an_existing_tab + if ($tabName[0] === '-') { + $tabTitle = ''; + $condition = isset($parts[2]) ? $parts[2] : ''; + } + + print ''; + + print ''; + + print ''; + + print ''; + + print ''; + + print ''; + + print ''; + + print ''; + } + } else { + print ''; + } + + print '
'; + print dol_escape_htmltag($parts[0]); + print ''; + if ($tabName[0] === "+") + print '' . dol_escape_htmltag($tabName) . ''; + else + print '' . dol_escape_htmltag($tabName) . ''; + print ''; + print dol_escape_htmltag($tabTitle); + print ''; + print dol_escape_htmltag($langFile); + print ''; + print dol_escape_htmltag($condition); + print ''; + print dol_escape_htmltag($path); + print '
'.$langs->trans("None").'
'; + print '
'; + + print '
'; + } else { + $fullpathoffile = dol_buildpath($file, 0); + + $content = file_get_contents($fullpathoffile); + + // New module + print '
'; + print ''; + print ''; + print ''; + print ''; + print ''; + + $doleditor = new DolEditor('editfilecontent', $content, '', '300', 'Full', 'In', true, false, 'ace', 0, '99%'); + print $doleditor->Create(1, '', false, $langs->trans("File").' : '.$file, (GETPOST('format', 'aZ09') ?GETPOST('format', 'aZ09') : 'html')); + print '
'; + print '
'; + print ''; + print '   '; + print ''; + print '
'; + + print '
'; + } + } + if ($tab != 'description') { print dol_get_fiche_end(); } From 25a851ac70f70df00e5408e344b26b3b5a979c49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alo=C3=AFs=20Micard?= Date: Tue, 12 Apr 2022 11:12:43 +0200 Subject: [PATCH 097/738] Fix translation --- htdocs/langs/en_US/modulebuilder.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/langs/en_US/modulebuilder.lang b/htdocs/langs/en_US/modulebuilder.lang index 6376024ea0b..5544c2b932a 100644 --- a/htdocs/langs/en_US/modulebuilder.lang +++ b/htdocs/langs/en_US/modulebuilder.lang @@ -145,5 +145,5 @@ TableNotEmptyDropCanceled=Table not empty. Drop has been canceled. ModuleBuilderNotAllowed=The module builder is available but not allowed to your user. ImportExportProfiles=Import and export profiles ListOfTabsEntries=List of tab entries -TabsDefDesc= Define here the tabs provided by your module +TabsDefDesc=Define here the tabs provided by your module TabsDefDescTooltip=The tabs provided by your module/application are defined into the array $this->tabs into the module descriptor file. You can edit manually this file or use the embedded editor. From a747f574b3dc5144e9e695f1ec42d19935ca1ebf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alo=C3=AFs=20Micard?= Date: Tue, 12 Apr 2022 11:15:40 +0200 Subject: [PATCH 098/738] Improve comment --- htdocs/modulebuilder/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php index 16671ddf137..14385864b6b 100644 --- a/htdocs/modulebuilder/index.php +++ b/htdocs/modulebuilder/index.php @@ -3957,7 +3957,7 @@ if ($module == 'initmodule') { $condition = isset($parts[4]) ? $parts[4] : ''; $path = isset($parts[5]) ? $parts[5] : ''; - // If we want to remove the tab, then the format is 'tabname:optionalcondition' + // If we want to remove the tab, then the format is 'objecttype:tabname:optionalcondition' // See: https://wiki.dolibarr.org/index.php?title=Tabs_system#To_remove_an_existing_tab if ($tabName[0] === '-') { $tabTitle = ''; From 752cc6f4a7adbc4fd791ef6229ce28feb5c8569d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alo=C3=AFs=20Micard?= Date: Tue, 12 Apr 2022 11:17:24 +0200 Subject: [PATCH 099/738] Lint source code --- htdocs/modulebuilder/index.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php index 14385864b6b..937ef6d83fb 100644 --- a/htdocs/modulebuilder/index.php +++ b/htdocs/modulebuilder/index.php @@ -3971,10 +3971,11 @@ if ($module == 'initmodule') { print ''; print ''; - if ($tabName[0] === "+") + if ($tabName[0] === "+") { print '' . dol_escape_htmltag($tabName) . ''; - else + } else { print '' . dol_escape_htmltag($tabName) . ''; + } print ''; print ''; From a006eaecdeac66bf6f1c67112a9dde9e77e8029e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 12 Apr 2022 13:02:33 +0200 Subject: [PATCH 100/738] Fix trans --- htdocs/adherents/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/adherents/list.php b/htdocs/adherents/list.php index 996f2d16c8d..441ce85ec86 100644 --- a/htdocs/adherents/list.php +++ b/htdocs/adherents/list.php @@ -482,7 +482,7 @@ if (GETPOSTISSET("search_status")) { $titre = $langs->trans("MembersListToValid"); } if ($search_status == Adherent::STATUS_VALIDATED && $filter == '') { - $titre = $langs->trans("MembersValidated"); + $titre = $langs->trans("MenuMembersValidated"); } if ($search_status == Adherent::STATUS_VALIDATED && $filter == 'withoutsubscription') { $titre = $langs->trans("MembersWithSubscriptionToReceive"); From d41676cf8bd71789a90eeb08ed66f72cdf0f1de9 Mon Sep 17 00:00:00 2001 From: lmarcouiller Date: Tue, 12 Apr 2022 13:57:00 +0200 Subject: [PATCH 101/738] Close #20609 : new massaction asign sale representative --- htdocs/core/actions_massactions.inc.php | 38 +++++++++++++++++++++++++ htdocs/core/tpl/massactions_pre.tpl.php | 10 ++++++- htdocs/langs/en_US/main.lang | 4 +++ htdocs/societe/list.php | 3 ++ 4 files changed, 54 insertions(+), 1 deletion(-) diff --git a/htdocs/core/actions_massactions.inc.php b/htdocs/core/actions_massactions.inc.php index c5ff1d8f82a..5ec011f5017 100644 --- a/htdocs/core/actions_massactions.inc.php +++ b/htdocs/core/actions_massactions.inc.php @@ -1602,6 +1602,44 @@ if (!$error && ($massaction == 'disable' || ($action == 'disable' && $confirm == } } +if (!$error && ($massaction == 'affectcommercial' || ($action == 'affectcommercial' && $confirm == 'yes')) && $permissiontoadd) { + $db->begin(); + + $objecttmp = new $objectclass($db); + $nbok = 0; + + foreach ($toselect as $toselectid) { + $result = $objecttmp->fetch($toselectid); + if ($result>0) { + if (in_array($objecttmp->element, array('societe'))) { + $result = $objecttmp->setSalesRep(GETPOST("commercial", "alpha")); + } + if ($result <= 0) { + setEventMessages($objecttmp->error, $objecttmp->errors, 'errors'); + $error++; + break; + } else { + $nbok++; + } + } else { + setEventMessages($objecttmp->error, $objecttmp->errors, 'errors'); + $error++; + break; + } + } + + if (!$error) { + if ($nbok > 1) { + setEventMessages($langs->trans("CommercialsAffected", $nbok), null, 'mesgs'); + } else { + setEventMessages($langs->trans("CommercialAffected"), null, 'mesgs'); + } + $db->commit(); + } else { + $db->rollback(); + } +} + // Approve for leave only if (!$error && ($massaction == 'approveleave' || ($action == 'approveleave' && $confirm == 'yes')) && $permissiontoapprove) { $db->begin(); diff --git a/htdocs/core/tpl/massactions_pre.tpl.php b/htdocs/core/tpl/massactions_pre.tpl.php index de034f652d3..4e138b0f1dc 100644 --- a/htdocs/core/tpl/massactions_pre.tpl.php +++ b/htdocs/core/tpl/massactions_pre.tpl.php @@ -217,7 +217,15 @@ if ($massaction == 'preenable') { if ($massaction == 'predisable') { print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassDisabling"), $langs->trans("ConfirmMassDisablingQuestion", count($toselect)), "disable", null, '', 0, 200, 500, 1); } - +if ($massaction == 'presetcommercial') { + $formquestion = array(); + $userlist = $form->select_dolusers('', '', 0, null, 0, '', '', 0, 0, 0, 'AND u.statut = 1', 0, '', '', 0, 1); + $formquestion[] = array('type' => 'other', + 'name' => 'affectedcommercial', + 'label' => $form->editfieldkey('AllocateCommercial', 'commercial_id', '', $object, 0), + 'value' => $form->multiselectarray('commercial', $userlist, null, 0, 0, 'quatrevingtpercent widthcentpercentminusx', 0, 0, '', '', '', 1)); + print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmAllocateCommercial"), $langs->trans("ConfirmAllocateCommercialQuestion", count($toselect)), "affectcommercial", $formquestion, 1, 0, 200, 500, 1); +} if ($massaction == 'preapproveleave') { print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassLeaveApproval"), $langs->trans("ConfirmMassLeaveApprovalQuestion", count($toselect)), "approveleave", null, 'yes', 0, 200, 500, 1); } diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index c66895e58a4..b39124c7c53 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -1169,3 +1169,7 @@ CanceledShown=Canceled shown Terminate=Terminate Terminated=Terminated AddLineOnPosition=Add line on position (at the end if empty) +ConfirmAllocateCommercial=Assign sales representative confirmation +ConfirmAllocateCommercialQuestion=Are you sure you want to assign the %s selected record(s)? +CommercialsAffected=Sales representatives affected +CommercialAffected=Sales representative affected \ No newline at end of file diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php index 3544611ac45..26e955e7ab4 100644 --- a/htdocs/societe/list.php +++ b/htdocs/societe/list.php @@ -875,6 +875,9 @@ if ($user->rights->societe->creer) { if ($user->rights->societe->creer) { $arrayofmassactions['predisable'] = img_picto('', '', 'class="pictofixedwidth"').$langs->trans("SetToDisabled"); } +if ($user->rights->societe->creer) { + $arrayofmassactions['presetcommercial'] = img_picto('', '', 'class="pictofixedwidth"').$langs->trans("AllocateCommercial"); +} if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend', 'predelete', 'preaffecttag', 'preenable', 'preclose'))) { $arrayofmassactions = array(); } From c51aff99af711f0a7a04fcd2de99ab243ad2175c Mon Sep 17 00:00:00 2001 From: kevin Date: Tue, 12 Apr 2022 14:38:17 +0200 Subject: [PATCH 102/738] Add missing entity on adding new VAT --- htdocs/compta/tva/class/tva.class.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/htdocs/compta/tva/class/tva.class.php b/htdocs/compta/tva/class/tva.class.php index 45d3d2e74b4..ce5ff657eca 100644 --- a/htdocs/compta/tva/class/tva.class.php +++ b/htdocs/compta/tva/class/tva.class.php @@ -125,6 +125,7 @@ class Tva extends CommonObject // Insert request $sql = "INSERT INTO ".MAIN_DB_PREFIX."tva("; + $sql .= "entity,"; $sql .= "datec,"; $sql .= "datep,"; $sql .= "datev,"; @@ -136,6 +137,7 @@ class Tva extends CommonObject $sql .= "fk_user_creat,"; $sql .= "fk_user_modif"; $sql .= ") VALUES ("; + $sql .= " '".$conf->entity."',"; $sql .= " '".$this->db->idate($now)."',"; $sql .= " '".$this->db->idate($this->datep)."',"; $sql .= " '".$this->db->idate($this->datev)."',"; From adda436dab9acc806ff33c5ea25e9f21df41f90d Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Tue, 12 Apr 2022 12:45:05 +0000 Subject: [PATCH 103/738] Fixing style errors. --- htdocs/compta/tva/class/tva.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/tva/class/tva.class.php b/htdocs/compta/tva/class/tva.class.php index ce5ff657eca..c9fcf18d587 100644 --- a/htdocs/compta/tva/class/tva.class.php +++ b/htdocs/compta/tva/class/tva.class.php @@ -125,7 +125,7 @@ class Tva extends CommonObject // Insert request $sql = "INSERT INTO ".MAIN_DB_PREFIX."tva("; - $sql .= "entity,"; + $sql .= "entity,"; $sql .= "datec,"; $sql .= "datep,"; $sql .= "datev,"; @@ -137,7 +137,7 @@ class Tva extends CommonObject $sql .= "fk_user_creat,"; $sql .= "fk_user_modif"; $sql .= ") VALUES ("; - $sql .= " '".$conf->entity."',"; + $sql .= " '".$conf->entity."',"; $sql .= " '".$this->db->idate($now)."',"; $sql .= " '".$this->db->idate($this->datep)."',"; $sql .= " '".$this->db->idate($this->datev)."',"; From 599c90ae6be05967f29e349b38a19ea6290c53fe Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 12 Apr 2022 14:57:12 +0200 Subject: [PATCH 104/738] FIX dol_string_onlythesehtmltags can keep html comments --- htdocs/core/lib/functions.lib.php | 9 +++++++-- htdocs/modulebuilder/index.php | 5 ++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 50d0e8ee9e3..24557d1e90e 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -6521,7 +6521,8 @@ function dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles = 1, { $allowed_tags = array( "html", "head", "meta", "body", "article", "a", "abbr", "b", "blockquote", "br", "cite", "div", "dl", "dd", "dt", "em", "font", "img", "ins", "hr", "i", "li", "link", - "ol", "p", "q", "s", "section", "span", "strike", "strong", "title", "table", "tr", "th", "td", "u", "ul", "sup", "sub", "blockquote", "pre", "h1", "h2", "h3", "h4", "h5", "h6" + "ol", "p", "q", "s", "section", "span", "strike", "strong", "title", "table", "tr", "th", "td", "u", "ul", "sup", "sub", "blockquote", "pre", "h1", "h2", "h3", "h4", "h5", "h6", + "comment" // this tags is added to manage comment that are replaced into ... ); if ($allowiframe) { $allowed_tags[] = "iframe"; @@ -6534,7 +6535,8 @@ function dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles = 1, $stringtoclean = dol_string_nounprintableascii($stringtoclean, 0); - $stringtoclean = preg_replace('//', '', $stringtoclean); + //$stringtoclean = preg_replace('//', '', $stringtoclean); + $stringtoclean = preg_replace('//', '\1', $stringtoclean); $stringtoclean = preg_replace('/:/i', ':', $stringtoclean); $stringtoclean = preg_replace('/:|�+58|:/i', '', $stringtoclean); // refused string ':' encoded (no reason to have a : encoded like this) to disable 'javascript:...' @@ -6557,6 +6559,9 @@ function dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles = 1, $temp = str_replace('__!DOCTYPE_HTML__', '', $temp); // Restore the DOCTYPE + $temp = preg_replace('/([^>]*)<\/comment>/', '', $temp); // Restore html comments + + return $temp; } diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php index 1a5987f3e80..95e83c3ed39 100644 --- a/htdocs/modulebuilder/index.php +++ b/htdocs/modulebuilder/index.php @@ -1641,6 +1641,7 @@ if ($action == 'savefile' && empty($cancel)) { $content = GETPOST('editfilecontent', $check); + // Save file on disk if ($content) { dol_delete_file($pathoffile); @@ -2128,7 +2129,9 @@ if ($module == 'initmodule') { print ''; print $langs->trans("EditorUrl"); print ''; - print $moduleobj->editor_url; + if (!empty($moduleobj->editor_url)) { + print ''.$moduleobj->editor_url.' '.img_picto('', 'globe').''; + } print ''; print ''; From 386b8bee5e0be25d49e78b4df609bbe2332a71bb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 12 Apr 2022 15:26:21 +0200 Subject: [PATCH 105/738] Fix deletion/creation of extrafields. --- htdocs/modulebuilder/index.php | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php index 95e83c3ed39..01c05dadac8 100644 --- a/htdocs/modulebuilder/index.php +++ b/htdocs/modulebuilder/index.php @@ -466,7 +466,12 @@ if ($dirins && $action == 'initsqlextrafields' && !empty($module)) { dolReplaceInFile($destfile2, $arrayreplacement); } else { $langs->load("errors"); - setEventMessages($langs->trans('ErrorFailToCreateFile', ''), null, 'errors'); + if ($result1 <= 0) { + setEventMessages($langs->trans('ErrorFailToCreateFile', $destfile1), null, 'errors'); + } + if ($result2 <= 0) { + setEventMessages($langs->trans('ErrorFailToCreateFile', $destfile2), null, 'errors'); + } } // TODO Enable in class the property $isextrafieldmanaged = 1 } @@ -780,6 +785,19 @@ if ($dirins && $action == 'confirm_removefile' && !empty($module)) { if (!$result) { setEventMessages($langs->trans("ErrorFailToDeleteFile", basename($filetodelete)), null, 'errors'); } else { + // If we delete a sql file + if (preg_match('/\.sql$/', $relativefilename)) { + if (preg_match('/\.key\.sql$/', $relativefilename)) { + $relativefilename = preg_replace('/\.key\.sql$/', '.sql', $relativefilename); + $filetodelete = $dirins.'/'.$relativefilename; + $result = dol_delete_file($filetodelete); + } elseif (preg_match('/\.sql$/', $relativefilename)) { + $relativefilename = preg_replace('/\.sql$/', '.key.sql', $relativefilename); + $filetodelete = $dirins.'/'.$relativefilename; + $result = dol_delete_file($filetodelete); + } + } + if (dol_is_dir_empty($dirtodelete)) { dol_delete_dir($dirtodelete); } @@ -1641,7 +1659,6 @@ if ($action == 'savefile' && empty($cancel)) { $content = GETPOST('editfilecontent', $check); - // Save file on disk if ($content) { dol_delete_file($pathoffile); @@ -2573,8 +2590,9 @@ if ($module == 'initmodule') { print '
'; print ' '.$langs->trans("ClassFile").' : '.($realpathtoclass ? '' : '').preg_replace('/^'.strtolower($module).'\//', '', $pathtoclass).($realpathtoclass ? '' : '').''; print ' '.img_picto($langs->trans("Edit"), 'edit').''; + // API file print '
'; - print ' '.$langs->trans("ApiClassFile").' : '.($realpathtoapi ? '' : '').preg_replace('/^'.strtolower($module).'\//', '', $pathtoapi).($realpathtoapi ? '' : '').''; + print ' '.$langs->trans("ApiClassFile").' : '.($realpathtoapi ? '' : '').(dol_is_file($realpathtoapi)?'':'').preg_replace('/^'.strtolower($module).'\//', '', $pathtoapi).(dol_is_file($realpathtoapi)?'':'').($realpathtoapi ? '' : '').''; if (dol_is_file($realpathtoapi)) { print ' '.img_picto($langs->trans("Edit"), 'edit').''; print ' '; @@ -2591,7 +2609,7 @@ if ($module == 'initmodule') { } // PHPUnit print '
'; - print ' '.$langs->trans("TestClassFile").' : '.($realpathtophpunit ? '' : '').preg_replace('/^'.strtolower($module).'\//', '', $pathtophpunit).($realpathtophpunit ? '' : '').''; + print ' '.$langs->trans("TestClassFile").' : '.($realpathtophpunit ? '' : '').(dol_is_file($realpathtophpunit)?'':'').preg_replace('/^'.strtolower($module).'\//', '', $pathtophpunit).(dol_is_file($realpathtophpunit)?'':'').($realpathtophpunit ? '' : '').''; if (dol_is_file($realpathtophpunit)) { print ' '.img_picto($langs->trans("Edit"), 'edit').''; print ' '; @@ -2624,7 +2642,7 @@ if ($module == 'initmodule') { print ' '.img_picto($langs->trans("Edit"), 'edit').''; //print '   '.$langs->trans("RunSql").''; print '
'; - print ' '.$langs->trans("SqlFileExtraFields").' : '.($realpathtosqlextra ? '' : '').preg_replace('/^'.strtolower($module).'\//', '', $pathtosqlextra).($realpathtosqlextra ? '' : '').''; + print ' '.$langs->trans("SqlFileExtraFields").' : '.($realpathtosqlextra ? '' : '').(dol_is_file($realpathtosqlextra) && dol_is_file($realpathtosqlextrakey) ? '' : '').preg_replace('/^'.strtolower($module).'\//', '', $pathtosqlextra).(dol_is_file($realpathtosqlextra) && dol_is_file($realpathtosqlextrakey) ? '' : '').($realpathtosqlextra ? '' : '').''; if (dol_is_file($realpathtosqlextra) && dol_is_file($realpathtosqlextrakey)) { print ' '.img_picto($langs->trans("Edit"), 'edit').''; print ' '; @@ -2636,7 +2654,7 @@ if ($module == 'initmodule') { } //print '   '.$langs->trans("RunSql").''; print '
'; - print ' '.$langs->trans("SqlFileKeyExtraFields").' : '.($realpathtosqlextrakey ? '' : '').preg_replace('/^'.strtolower($module).'\//', '', $pathtosqlextrakey).($realpathtosqlextrakey ? '' : '').''; + print ' '.$langs->trans("SqlFileKeyExtraFields").' : '.($realpathtosqlextrakey ? '' : '').(dol_is_file($realpathtosqlextra) && dol_is_file($realpathtosqlextrakey) ? '' : '').preg_replace('/^'.strtolower($module).'\//', '', $pathtosqlextrakey).(dol_is_file($realpathtosqlextra) && dol_is_file($realpathtosqlextrakey) ? '' : '').($realpathtosqlextrakey ? '' : '').''; if (dol_is_file($realpathtosqlextra) && dol_is_file($realpathtosqlextrakey)) { print ' '.img_picto($langs->trans("Edit"), 'edit').''; print ' '; From 04ad919a2cdb8c31d7a080388a2ab29ed2766ca5 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 12 Apr 2022 15:51:46 +0200 Subject: [PATCH 106/738] Debug modulebuilder for v16. --- htdocs/modulebuilder/index.php | 53 ++++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php index 01c05dadac8..7389e2ea7a5 100644 --- a/htdocs/modulebuilder/index.php +++ b/htdocs/modulebuilder/index.php @@ -473,7 +473,11 @@ if ($dirins && $action == 'initsqlextrafields' && !empty($module)) { setEventMessages($langs->trans('ErrorFailToCreateFile', $destfile2), null, 'errors'); } } - // TODO Enable in class the property $isextrafieldmanaged = 1 + + // Now we update the object file to set $isextrafieldmanaged to 0 + $srcfile = $dirins.'/'.strtolower($module).'/class/'.strtolower($objectname).'.class.php'; + $arrayreplacement = array('/\$isextrafieldmanaged = 0;/' => '$isextrafieldmanaged = 1;'); + dolReplaceInFile($srcfile, $arrayreplacement, '', 0, 0, 1); } @@ -775,6 +779,8 @@ if ($dirins && $action == 'addlanguage' && !empty($module)) { // remove/delete File if ($dirins && $action == 'confirm_removefile' && !empty($module)) { + $objectname = $tabobj; + $relativefilename = dol_sanitizePathName(GETPOST('file', 'restricthtml')); if ($relativefilename) { $dirnametodelete = dirname($relativefilename); @@ -808,6 +814,11 @@ if ($dirins && $action == 'confirm_removefile' && !empty($module)) { $arrayreplacement = array('/^\s*\''.preg_quote('/'.$relativefilename, '/').'\',*/m'=>' // \'/'.$relativefilename.'\','); dolReplaceInFile($srcfile, $arrayreplacement, '', 0, 0, 1); } + + // Now we update the object file to set $isextrafieldmanaged to 0 + $srcfile = $dirins.'/'.strtolower($module).'/class/'.strtolower($objectname).'.class.php'; + $arrayreplacement = array('/\$isextrafieldmanaged = 1;/' => '$isextrafieldmanaged = 0;'); + dolReplaceInFile($srcfile, $arrayreplacement, '', 0, 0, 1); } } } @@ -2064,6 +2075,7 @@ if ($module == 'initmodule') { // Note module is inside $dirread if ($tab == 'description') { + print ''."\n"; $pathtofile = $listofmodules[strtolower($module)]['moduledescriptorrelpath']; $pathtofilereadme = $modulelowercase.'/README.md'; $pathtochangelog = $modulelowercase.'/ChangeLog.md'; @@ -2224,6 +2236,7 @@ if ($module == 'initmodule') { } if ($tab == 'languages') { + print ''."\n"; if ($action != 'editfile' || empty($file)) { print ''.$langs->trans("LanguageDefDesc").'
'; print '
'; @@ -2263,7 +2276,7 @@ if ($module == 'initmodule') { $pathtofile = 'langs/'.$langfile['relativename']; } print ' '.$langs->trans("LanguageFile").' '.basename(dirname($pathtofile)).' : '.$pathtofile.''; - print ''.img_picto($langs->trans("Edit"), 'edit').''; + print ''.img_picto($langs->trans("Edit"), 'edit').''; print ''.img_picto($langs->trans("Delete"), 'delete').''; print ''; } @@ -2299,6 +2312,7 @@ if ($module == 'initmodule') { } if ($tab == 'dictionaries') { + print ''."\n"; $pathtofile = $listofmodules[strtolower($module)]['moduledescriptorrelpath']; $dicts = $moduleobj->dictionaries; @@ -2333,7 +2347,7 @@ if ($module == 'initmodule') { print ''; print ''; - print_liste_field_titre("#", $_SERVER["PHP_SELF"], '', "", $param, '', $sortfield, $sortorder, ' aaa '); + print_liste_field_titre("#", $_SERVER["PHP_SELF"], '', "", $param, '', $sortfield, $sortorder, 'thsticky thstickygrey '); print_liste_field_titre("Table", $_SERVER["PHP_SELF"], '', "", $param, '', $sortfield, $sortorder); print_liste_field_titre("Label", $_SERVER["PHP_SELF"], '', "", $param, '', $sortfield, $sortorder); print_liste_field_titre("SQL", $_SERVER["PHP_SELF"], '', "", $param, '', $sortfield, $sortorder); @@ -2351,7 +2365,7 @@ if ($module == 'initmodule') { while ($i < $maxi) { print ''; - print ''; @@ -2395,7 +2409,7 @@ if ($module == 'initmodule') { $i++; } } else { - print ''; + print ''; } print '
'; + print ''; print ($i + 1); print '
'.$langs->trans("None").'
'.$langs->trans("None").'
'; @@ -2429,6 +2443,7 @@ if ($module == 'initmodule') { } if ($tab == 'objects') { + print ''."\n"; $head3 = array(); $h = 0; @@ -3096,6 +3111,7 @@ if ($module == 'initmodule') { } if ($tab == 'menus') { + print ''."\n"; $pathtofile = $listofmodules[strtolower($module)]['moduledescriptorrelpath']; $menus = $moduleobj->menu; @@ -3126,6 +3142,7 @@ if ($module == 'initmodule') { print ''; print ''; + print_liste_field_titre("#", $_SERVER["PHP_SELF"], '', "", $param, '', $sortfield, $sortorder, 'thsticky '); print_liste_field_titre("Type", $_SERVER["PHP_SELF"], '', "", $param, '', $sortfield, $sortorder); print_liste_field_titre("LinkToParentMenu", $_SERVER["PHP_SELF"], '', "", $param, '', $sortfield, $sortorder); print_liste_field_titre("Title", $_SERVER["PHP_SELF"], '', "", $param, '', $sortfield, $sortorder); @@ -3141,9 +3158,16 @@ if ($module == 'initmodule') { print "\n"; if (count($menus)) { + $i = 0; foreach ($menus as $menu) { + $i++; + print ''; + print ''; + print ''; @@ -3229,6 +3253,7 @@ if ($module == 'initmodule') { } if ($tab == 'permissions') { + print ''."\n"; $pathtofile = $listofmodules[strtolower($module)]['moduledescriptorrelpath']; $perms = $moduleobj->rights; @@ -3322,6 +3347,7 @@ if ($module == 'initmodule') { } if ($tab == 'hooks') { + print ''."\n"; if ($action != 'editfile' || empty($file)) { print ''.$langs->trans("HooksDefDesc").'
'; print '
'; @@ -3342,7 +3368,7 @@ if ($module == 'initmodule') { print ''.$pathtohook.''; print ''; print ''; + print ''.img_picto($langs->trans("Delete"), 'delete').''; } else { print ''.$langs->trans("FileNotYetGenerated").''; print ''.img_picto('Generate', 'generate', 'class="paddingleft"').''; @@ -3376,6 +3402,7 @@ if ($module == 'initmodule') { } if ($tab == 'triggers') { + print ''."\n"; require_once DOL_DOCUMENT_ROOT.'/core/class/interfaces.class.php'; $interfaces = new Interfaces($db); @@ -3401,7 +3428,7 @@ if ($module == 'initmodule') { print ''; - print ''; + print ''; print ''; } } else { @@ -3441,6 +3468,7 @@ if ($module == 'initmodule') { } if ($tab == 'css') { + print ''."\n"; if ($action != 'editfile' || empty($file)) { print ''.$langs->trans("CSSDesc").'
'; print '
'; @@ -3452,8 +3480,8 @@ if ($module == 'initmodule') { print ' '.$langs->trans("CSSFile").' : '; if (dol_is_file($dirins.'/'.$pathtohook)) { print ''.$pathtohook.''; - print '
'; - print ''; + print ''; + print ''; } else { print ''.$langs->trans("FileNotYetGenerated").''; print ''; @@ -3486,6 +3514,7 @@ if ($module == 'initmodule') { } if ($tab == 'js') { + print ''."\n"; if ($action != 'editfile' || empty($file)) { print ''.$langs->trans("JSDesc").'
'; print '
'; @@ -3531,6 +3560,7 @@ if ($module == 'initmodule') { } if ($tab == 'widgets') { + print ''."\n"; require_once DOL_DOCUMENT_ROOT.'/core/boxes/modules_boxes.php'; $widgets = ModeleBoxes::getWidgetsList(array('/'.strtolower($module).'/core/boxes')); @@ -3582,6 +3612,7 @@ if ($module == 'initmodule') { } if ($tab == 'exportimport') { + print ''."\n"; $pathtofile = $listofmodules[strtolower($module)]['moduledescriptorrelpath']; $exportlist = $moduleobj->export_label; @@ -3621,6 +3652,7 @@ if ($module == 'initmodule') { } if ($tab == 'cli') { + print ''."\n"; $clifiles = array(); $i = 0; @@ -3699,6 +3731,7 @@ if ($module == 'initmodule') { } if ($tab == 'cron') { + print ''."\n"; $pathtofile = $listofmodules[strtolower($module)]['moduledescriptorrelpath']; $cronjobs = $moduleobj->cronjobs; @@ -3820,6 +3853,7 @@ if ($module == 'initmodule') { } if ($tab == 'specifications') { + print ''."\n"; $specs = dol_dir_list(dol_buildpath($modulelowercase.'/doc', 0), 'files', 1, '(\.md|\.asciidoc)$', array('\/temp\/')); if ($action != 'editfile' || empty($file)) { @@ -3933,6 +3967,7 @@ if ($module == 'initmodule') { } if ($tab == 'buildpackage') { + print ''."\n"; print ''.$langs->trans("BuildPackageDesc").''; print '
'; From 1bfd9c695fda90db19047a04305877bf809580e3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 12 Apr 2022 16:29:25 +0200 Subject: [PATCH 107/738] Update tva.class.php --- htdocs/compta/tva/class/tva.class.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/compta/tva/class/tva.class.php b/htdocs/compta/tva/class/tva.class.php index c9fcf18d587..a6828587763 100644 --- a/htdocs/compta/tva/class/tva.class.php +++ b/htdocs/compta/tva/class/tva.class.php @@ -137,7 +137,7 @@ class Tva extends CommonObject $sql .= "fk_user_creat,"; $sql .= "fk_user_modif"; $sql .= ") VALUES ("; - $sql .= " '".$conf->entity."',"; + $sql .= " ".((int) $conf->entity.", "; $sql .= " '".$this->db->idate($now)."',"; $sql .= " '".$this->db->idate($this->datep)."',"; $sql .= " '".$this->db->idate($this->datev)."',"; @@ -146,8 +146,8 @@ class Tva extends CommonObject $sql .= " '".$this->db->escape($this->note)."',"; $sql .= " '".$this->db->escape($this->fk_account)."',"; $sql .= " '".$this->db->escape($this->type_payment)."',"; - $sql .= " '".($this->fk_user_creat > 0 ? (int) $this->fk_user_creat : (int) $user->id)."',"; - $sql .= " '".$this->db->escape($this->fk_user_modif)."'"; + $sql .= " ".($this->fk_user_creat > 0 ? (int) $this->fk_user_creat : (int) $user->id).","; + $sql .= " ".($this->fk_user_modif > 0 ? (int) $this->fk_user_modif : (int) $user->id); $sql .= ")"; dol_syslog(get_class($this)."::create", LOG_DEBUG); From 6cbcc54bd964eab272fd3e7f6ea63efc65dec6b5 Mon Sep 17 00:00:00 2001 From: Ferran Marcet Date: Tue, 12 Apr 2022 19:19:41 +0200 Subject: [PATCH 108/738] Fix: The resource dropdown does not show the values --- htdocs/resource/class/html.formresource.class.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/htdocs/resource/class/html.formresource.class.php b/htdocs/resource/class/html.formresource.class.php index 99916b8ed70..fa775bf5d58 100644 --- a/htdocs/resource/class/html.formresource.class.php +++ b/htdocs/resource/class/html.formresource.class.php @@ -1,6 +1,7 @@ * Copyright (C) 2019 Frédéric France + * Copyright (C) 2022 Ferran Marcet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -224,9 +225,10 @@ class FormResource $value = ($maxlength ?dol_trunc($arraytypes['label'], $maxlength) : $arraytypes['label']); } elseif ($format == 3) { $value = $arraytypes['code']; - } elseif (empty($value)) { - print ' '; + } else { + $value = ' '; } + print $value; print ''; } } From ed172421f0bf1b425fb86227686dbcc633558d54 Mon Sep 17 00:00:00 2001 From: Ferran Marcet Date: Tue, 12 Apr 2022 19:20:45 +0200 Subject: [PATCH 109/738] Fix: The resource dropdown does not show the values --- htdocs/resource/class/html.formresource.class.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/resource/class/html.formresource.class.php b/htdocs/resource/class/html.formresource.class.php index fa775bf5d58..a541dfab700 100644 --- a/htdocs/resource/class/html.formresource.class.php +++ b/htdocs/resource/class/html.formresource.class.php @@ -225,7 +225,8 @@ class FormResource $value = ($maxlength ?dol_trunc($arraytypes['label'], $maxlength) : $arraytypes['label']); } elseif ($format == 3) { $value = $arraytypes['code']; - } else { + } + if (empty($value)) { $value = ' '; } print $value; From 5e76c1a45d627ab077413ceab556694549558c0f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 12 Apr 2022 21:59:34 +0200 Subject: [PATCH 110/738] Fix doc --- htdocs/install/mysql/migration/14.0.0-15.0.0.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/install/mysql/migration/14.0.0-15.0.0.sql b/htdocs/install/mysql/migration/14.0.0-15.0.0.sql index 30636a8bb98..6f35a9f1c44 100644 --- a/htdocs/install/mysql/migration/14.0.0-15.0.0.sql +++ b/htdocs/install/mysql/migration/14.0.0-15.0.0.sql @@ -512,5 +512,5 @@ INSERT INTO llx_c_action_trigger (code,label,description,elementtype,rang) value -- Add column to help to fix a very critical bug when transferring into accounting bank record of a bank account into another currency. -- Idea is to update this column manually in v15 with value in currency of company for bank that are not into the main currency and the transfer --- into accounting will use it in priority if value is not null. +-- into accounting will use it in priority if value is not null. The script repair.sql contains the sequence to fix datas in llx_bank. ALTER TABLE llx_bank ADD COLUMN amount_main_currency double(24,8) NULL; From 6a7212a48df1a03baeed55960379992303141ad6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 12 Apr 2022 22:02:46 +0200 Subject: [PATCH 111/738] Fix sql error --- htdocs/compta/tva/class/tva.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/tva/class/tva.class.php b/htdocs/compta/tva/class/tva.class.php index a6828587763..1b71cb261e1 100644 --- a/htdocs/compta/tva/class/tva.class.php +++ b/htdocs/compta/tva/class/tva.class.php @@ -137,7 +137,7 @@ class Tva extends CommonObject $sql .= "fk_user_creat,"; $sql .= "fk_user_modif"; $sql .= ") VALUES ("; - $sql .= " ".((int) $conf->entity.", "; + $sql .= " ".((int) $conf->entity).", "; $sql .= " '".$this->db->idate($now)."',"; $sql .= " '".$this->db->idate($this->datep)."',"; $sql .= " '".$this->db->idate($this->datev)."',"; From 914b037a9aa0a458cc253f5d4d3f7888d3ec9dae Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 12 Apr 2022 22:35:12 +0200 Subject: [PATCH 112/738] Fix regression: bad cache management of linked object loading. --- htdocs/core/class/commonobject.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index d53080437a7..a3c9c2e8122 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -3847,7 +3847,7 @@ abstract class CommonObject } else { $sql .= "(fk_source = ".((int) $sourceid)." AND sourcetype = '".$this->db->escape($sourcetype)."')"; $sql .= " ".$clause." (fk_target = ".((int) $targetid)." AND targettype = '".$this->db->escape($targettype)."')"; - if ($this->id > 0 && $sourceid == $this->id && $sourcetype == $this->element && $targetid == $this->id && $targettype == $this->element && $clause == 'OR') { + if ($loadalsoobjects && $this->id > 0 && $sourceid == $this->id && $sourcetype == $this->element && $targetid == $this->id && $targettype == $this->element && $clause == 'OR') { $this->linkedObjectsFullLoaded[$this->id] = true; } } From 5d9cfaa823e220ec9087f59b64daa90c534b183a Mon Sep 17 00:00:00 2001 From: wdammak <26695620+wdammak@users.noreply.github.com> Date: Wed, 13 Apr 2022 01:09:44 +0100 Subject: [PATCH 113/738] Update card.php --- htdocs/societe/card.php | 86 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 84 insertions(+), 2 deletions(-) diff --git a/htdocs/societe/card.php b/htdocs/societe/card.php index b72f41e436a..e25d515ff7b 100644 --- a/htdocs/societe/card.php +++ b/htdocs/societe/card.php @@ -1293,8 +1293,90 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { print 'global->SOCIETE_USEPREFIX) ? ' colspan="3"' : '').'>'; //print ''; //print $form->widgetForTranslation("name", $object, $permissiontoadd, 'string', 'alpahnohtml', 'minwidth300'); - print $form->select_company(0, 'name', '(s.client = 1 OR s.client = 3) AND status=1', ' '); - print ""; + //print $form->select_company(0, 'name', '(s.client = 1 OR s.client = 3) AND status=1', ' '); + //print ""; + print ''; +?> + +'; if (!empty($conf->global->SOCIETE_USEPREFIX)) { // Old not used prefix field print '
'; From 150a21820f5c0342c7082e604aeb8913921f4258 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Wed, 13 Apr 2022 00:14:23 +0000 Subject: [PATCH 114/738] Fixing style errors. --- htdocs/societe/card.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/societe/card.php b/htdocs/societe/card.php index e25d515ff7b..83c6975e3c7 100644 --- a/htdocs/societe/card.php +++ b/htdocs/societe/card.php @@ -1296,7 +1296,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { //print $form->select_company(0, 'name', '(s.client = 1 OR s.client = 3) AND status=1', ' '); //print ""; print ''; -?> + ?> -'; if (!empty($conf->global->SOCIETE_USEPREFIX)) { // Old not used prefix field print ''; From 9c8d21c63aecd42b87801b8e3c3b2856d4884a9a Mon Sep 17 00:00:00 2001 From: wdammak <26695620+wdammak@users.noreply.github.com> Date: Wed, 13 Apr 2022 01:14:36 +0100 Subject: [PATCH 115/738] Create ajaxcompanies.php --- htdocs/core/ajax/ajaxcompanies.php | 126 +++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 htdocs/core/ajax/ajaxcompanies.php diff --git a/htdocs/core/ajax/ajaxcompanies.php b/htdocs/core/ajax/ajaxcompanies.php new file mode 100644 index 00000000000..aeda242e53e --- /dev/null +++ b/htdocs/core/ajax/ajaxcompanies.php @@ -0,0 +1,126 @@ + + * Copyright (C) 2005-2009 Regis Houssin + * Copyright (C) 2007-2010 Laurent Destailleur + * Copyright (C) 2010 Cyrille de Lambert + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/core/ajax/ajaxcompanies.php + * \brief File to return Ajax response on third parties request + */ + +if (!defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', 1); // Disables token renewal +if (!defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); +if (!defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); +if (!defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); +if (!defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1'); +if (!defined('NOCSRFCHECK')) define('NOCSRFCHECK', '1'); + +require '../../main.inc.php'; + + +/* + * View + */ + +// Ajout directives pour resoudre bug IE +//header('Cache-Control: Public, must-revalidate'); +//header('Pragma: public'); + +//top_htmlhead("", "", 1); // Replaced with top_httphead. An ajax page does not need html header. +top_httphead(); + +//print ''."\n"; + +dol_syslog(join(',', $_GET)); + + +// Generation liste des societes +if (GETPOST('newcompany') || GETPOST('socid', 'int') || GETPOST('id_fourn')) +{ + $return_arr = array(); + + // Define filter on text typed + $socid = $_GET['newcompany'] ? $_GET['newcompany'] : ''; + if (!$socid) $socid = $_GET['socid'] ? $_GET['socid'] : ''; + if (!$socid) $socid = $_GET['id_fourn'] ? $_GET['id_fourn'] : ''; + + $sql = "SELECT s.rowid, s.nom, s.name_alias, s.code_client, s.code_fournisseur, s.address, s.zip, s.town, s.email, s.siren, s.siret, s.ape, s.idprof4, s.client, s.fournisseur, s.datec"; + $sql .= " , c.label as country, d.nom as departement"; + $sql .= " FROM ".MAIN_DB_PREFIX."societe as s"; + $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as c ON c.rowid = s.fk_pays"; + $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as d ON d.rowid = s.fk_departement"; + $sql .= " WHERE s.entity IN (".getEntity('societe').")"; + if ($socid) + { + $sql .= " AND ("; + // Add criteria on name/code + if (!empty($conf->global->COMPANY_DONOTSEARCH_ANYWHERE)) // Can use index + { + $sql .= "s.nom LIKE '".$db->escape($socid)."%'"; + $sql .= " OR s.code_client LIKE '".$db->escape($socid)."%'"; + $sql .= " OR s.code_fournisseur LIKE '".$db->escape($socid)."%'"; + } else { + $sql .= "s.nom LIKE '%".$db->escape($socid)."%'"; + $sql .= " OR s.code_client LIKE '%".$db->escape($socid)."%'"; + $sql .= " OR s.code_fournisseur LIKE '%".$db->escape($socid)."%'"; + } + if (!empty($conf->global->SOCIETE_ALLOW_SEARCH_ON_ROWID)) $sql .= " OR s.rowid = '".$db->escape($socid)."'"; + $sql .= ")"; + } + //if (GETPOST("filter")) $sql.= " AND (".GETPOST("filter", "alpha").")"; // Add other filters + $sql .= " ORDER BY s.nom ASC"; + + //dol_syslog("ajaxcompanies", LOG_DEBUG); + $resql = $db->query($sql); + + if ($resql) + { + while ($row = $db->fetch_array($resql)) + { + $label = $row['nom']; + if ($socid) $label = $label; + $row_array['label'] = $label; + $row_array['value'] = $row['nom']; + $row_array['key'] = $row['rowid']; + $row_array['name_alias'] = $row['name_alias']; + $row_array['code_client'] = $row['code_client']; + $row_array['code_fournisseur'] = $row['code_fournisseur']; + $row_array['address'] = $row['address']; + $row_array['zip'] = $row['zip']; + $row_array['town'] = $row['town']; + $row_array['email'] = $row['email']; + $row_array['siren'] = $row['siren']; + $row_array['siret'] = $row['siret']; + $row_array['ape'] = $row['ape']; + $row_array['idprof4'] = $row['idprof4']; + $row_array['client'] = $row['client']; + $row_array['fournisseur'] = $row['fournisseur']; + $row_array['datec'] = $row['datec']; + $row_array['country'] = $row['country']; + $row_array['departement'] = $row['departement']; + + array_push($return_arr, $row_array); + } + + echo json_encode($return_arr); + } else { + echo json_encode(array('nom'=>'Error', 'label'=>'Error', 'key'=>'Error', 'value'=>'Error')); + } +} else { + echo json_encode(array('nom'=>'ErrorBadParameter', 'label'=>'ErrorBadParameter', 'key'=>'ErrorBadParameter', 'value'=>'ErrorBadParameter')); +} From 02435a616b1250e018f5e4cce217443271faf68e Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Wed, 13 Apr 2022 00:19:15 +0000 Subject: [PATCH 116/738] Fixing style errors. --- htdocs/core/ajax/ajaxcompanies.php | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/htdocs/core/ajax/ajaxcompanies.php b/htdocs/core/ajax/ajaxcompanies.php index aeda242e53e..173d176c031 100644 --- a/htdocs/core/ajax/ajaxcompanies.php +++ b/htdocs/core/ajax/ajaxcompanies.php @@ -50,8 +50,7 @@ dol_syslog(join(',', $_GET)); // Generation liste des societes -if (GETPOST('newcompany') || GETPOST('socid', 'int') || GETPOST('id_fourn')) -{ +if (GETPOST('newcompany') || GETPOST('socid', 'int') || GETPOST('id_fourn')) { $return_arr = array(); // Define filter on text typed @@ -65,12 +64,10 @@ if (GETPOST('newcompany') || GETPOST('socid', 'int') || GETPOST('id_fourn')) $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as c ON c.rowid = s.fk_pays"; $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as d ON d.rowid = s.fk_departement"; $sql .= " WHERE s.entity IN (".getEntity('societe').")"; - if ($socid) - { + if ($socid) { $sql .= " AND ("; // Add criteria on name/code - if (!empty($conf->global->COMPANY_DONOTSEARCH_ANYWHERE)) // Can use index - { + if (!empty($conf->global->COMPANY_DONOTSEARCH_ANYWHERE)) { // Can use index $sql .= "s.nom LIKE '".$db->escape($socid)."%'"; $sql .= " OR s.code_client LIKE '".$db->escape($socid)."%'"; $sql .= " OR s.code_fournisseur LIKE '".$db->escape($socid)."%'"; @@ -87,11 +84,9 @@ if (GETPOST('newcompany') || GETPOST('socid', 'int') || GETPOST('id_fourn')) //dol_syslog("ajaxcompanies", LOG_DEBUG); $resql = $db->query($sql); - - if ($resql) - { - while ($row = $db->fetch_array($resql)) - { + + if ($resql) { + while ($row = $db->fetch_array($resql)) { $label = $row['nom']; if ($socid) $label = $label; $row_array['label'] = $label; From e9e10e84b2adb333e276f8dd5fce713b34ed87bb Mon Sep 17 00:00:00 2001 From: Norbert Penel Date: Wed, 13 Apr 2022 10:47:33 +0200 Subject: [PATCH 117/738] ensure priority in this usage ensure priority in this usage --- htdocs/product/class/product.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index bd3cf69c86a..6fd09ed9723 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -1690,7 +1690,7 @@ class Product extends CommonObject $testExit = array('multiprices','multiprices_ttc','multiprices_base_type','multiprices_min','multiprices_min_ttc','multiprices_tva_tx','multiprices_recuperableonly'); foreach ($testExit as $field) { - if (!isset($this->$field[$level])) { + if (!isset($this->{$field}[$level])) { return array(); } } From 29242a23c36be39dfe7f76a21ae02aecce75165b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 13 Apr 2022 12:11:35 +0200 Subject: [PATCH 118/738] Update product.class.php --- htdocs/product/class/product.class.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 6fd09ed9723..8ff89d8d086 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -1690,7 +1690,11 @@ class Product extends CommonObject $testExit = array('multiprices','multiprices_ttc','multiprices_base_type','multiprices_min','multiprices_min_ttc','multiprices_tva_tx','multiprices_recuperableonly'); foreach ($testExit as $field) { - if (!isset($this->{$field}[$level])) { + if (!isset($this->$field)) { + return array(); + } + $tmparray = $this->$field; + if (!isset($tmparray[$level])) { return array(); } } From d154696c32b3ccdeb02b161fd3e04d27db2a3c02 Mon Sep 17 00:00:00 2001 From: BB2A Anthony Berton Date: Wed, 13 Apr 2022 16:15:07 +0200 Subject: [PATCH 119/738] morecss select_compagny --- htdocs/comm/propal/card.php | 2 +- htdocs/commande/card.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/comm/propal/card.php b/htdocs/comm/propal/card.php index 0153f554169..f6989d90d59 100644 --- a/htdocs/comm/propal/card.php +++ b/htdocs/comm/propal/card.php @@ -1921,7 +1921,7 @@ if ($action == 'create') { $formquestion = array( // 'text' => $langs->trans("ConfirmClone"), // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1), - array('type' => 'other', 'name' => 'socid', 'label' => $langs->trans("SelectThirdParty"), 'value' => $form->select_company(GETPOST('socid', 'int'), 'socid', '(s.client=1 OR s.client=2 OR s.client=3)')), + array('type' => 'other', 'name' => 'socid', 'label' => $langs->trans("SelectThirdParty"), 'value' => $form->select_company(GETPOST('socid', 'int'), 'socid', '(s.client=1 OR s.client=2 OR s.client=3)', '', 0, 0, null, 0, 'maxwidth300')), array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans('PuttingPricesUpToDate'), 'value' => (!empty($conf->global->PROPOSAL_CLONE_UPDATE_PRICES) ? 1 : 0)), ); if (!empty($conf->global->PROPAL_CLONE_DATE_DELIVERY) && !empty($object->delivery_date)) { diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index 3a903e233de..53b6d40d6b0 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -2043,7 +2043,7 @@ if ($action == 'create' && $usercancreate) { if ($action == 'clone') { // Create an array for form $formquestion = array( - array('type' => 'other', 'name' => 'socid', 'label' => $langs->trans("SelectThirdParty"), 'value' => $form->select_company(GETPOST('socid', 'int'), 'socid', '(s.client=1 OR s.client = 2 OR s.client=3)')) + array('type' => 'other', 'name' => 'socid', 'label' => $langs->trans("SelectThirdParty"), 'value' => $form->select_company(GETPOST('socid', 'int'), 'socid', '(s.client=1 OR s.client = 2 OR s.client=3)', '', 0, 0, null, 0, 'maxwidth300')) ); $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneOrder', $object->ref), 'confirm_clone', $formquestion, 'yes', 1); } From 90366b1b81799d1244275e1559f1b9d8589204d8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 13 Apr 2022 16:21:25 +0200 Subject: [PATCH 120/738] Revert "NEW : Import with select boxes" --- htdocs/imports/import.php | 188 +++++++++----------------------- htdocs/langs/en_US/exports.lang | 4 +- htdocs/langs/fr_FR/exports.lang | 4 +- 3 files changed, 54 insertions(+), 142 deletions(-) diff --git a/htdocs/imports/import.php b/htdocs/imports/import.php index 9ec98f8a495..01f152f1ea5 100644 --- a/htdocs/imports/import.php +++ b/htdocs/imports/import.php @@ -136,14 +136,13 @@ $step = (GETPOST('step') ? GETPOST('step') : 1); $import_name = GETPOST('import_name'); $hexa = GETPOST('hexa'); $importmodelid = GETPOST('importmodelid'); -$excludefirstline = (GETPOST('excludefirstline') ? GETPOST('excludefirstline') : 2); +$excludefirstline = (GETPOST('excludefirstline') ? GETPOST('excludefirstline') : 1); $endatlinenb = (GETPOST('endatlinenb') ? GETPOST('endatlinenb') : ''); $updatekeys = (GETPOST('updatekeys', 'array') ? GETPOST('updatekeys', 'array') : array()); $separator = (GETPOST('separator', 'nohtml') ? GETPOST('separator', 'nohtml') : (!empty($conf->global->IMPORT_CSV_SEPARATOR_TO_USE) ? $conf->global->IMPORT_CSV_SEPARATOR_TO_USE : ',')); $enclosure = (GETPOST('enclosure', 'nohtml') ? GETPOST('enclosure', 'nohtml') : '"'); $separator_used = str_replace('\t', "\t", $separator); - $objimport = new Import($db); $objimport->load_arrays($user, ($step == 1 ? '' : $datatoimport)); @@ -161,7 +160,7 @@ foreach ($fieldsarray as $elem) { $tabelem = explode('=', $elem, 2); $key = $tabelem[0]; $val = (isset($tabelem[1]) ? $tabelem[1] : ''); - if ($key && $val && ($key > 0 && $step != 4)) { + if ($key && $val) { $array_match_file_to_database[$key] = $val; } } @@ -326,16 +325,13 @@ if ($action == 'saveorder') { $pos = 0; foreach ($fieldsarray as $fieldnb) { // For each elem in list. fieldnb start from 1 to ... // Get name of database fields at position $pos and put it into $namefield - $posbis = 0; - - $namefield = ''; + $posbis = 0; $namefield = ''; foreach ($fieldstarget as $key => $val) { // key: val: //dol_syslog('AjaxImport key='.$key.' val='.$val); if ($posbis < $pos) { $posbis++; continue; } - // We found the key of targets that is at position pos $namefield = $key; //dol_syslog('AjaxImport Field name found for file field nb '.$fieldnb.'='.$namefield); @@ -1008,7 +1004,7 @@ if ($step == 4 && $datatoimport) { $lefti = 1; foreach ($array_match_file_to_database as $key => $val) { $var = !$var; - show_elem($fieldssource, $key, $val, $var, 1, '', $listofkeys); // key is field number in source file + show_elem($fieldssource, $key, $val, $var); // key is field number in source file //print '> '.$lefti.'-'.$key.'-'.$val; $listofkeys[$key] = 1; $fieldsplaced[$key] = 1; @@ -1027,7 +1023,7 @@ if ($step == 4 && $datatoimport) { while ($lefti <= $num) { $var = !$var; $newkey = getnewkey($fieldssource, $listofkeys); - show_elem($fieldssource, $newkey, '', $var, 1, '', $listofkeys); // key start after field number in source file + show_elem($fieldssource, $newkey, '', $var); // key start after field number in source file //print '> '.$lefti.'-'.$newkey; $listofkeys[$key] = 1; $lefti++; @@ -1041,14 +1037,11 @@ if ($step == 4 && $datatoimport) { print ''; @@ -1188,51 +1180,35 @@ if ($step == 4 && $datatoimport) { if ($conf->use_javascript_ajax) { print ''."\n"; @@ -1495,20 +1471,6 @@ if ($step == 5 && $datatoimport) { if ($action == 'launchsimu') { print '   '.$langs->trans("Modify").''; } - if ($excludefirstline == 2) { - print $form->textwithpicto("", $langs->trans("WarningFirstImportedLine", $excludefirstline), 1, 'warning', "warningexcludefirstline"); - print ''; - } print ''; // Keys for data UPDATE (not INSERT of new data) @@ -2131,21 +2093,18 @@ $db->close(); /** * Function to put the movable box of a source field * - * @param array $fieldssource List of source fields - * @param int $pos Pos - * @param string $key Key - * @param boolean $var Line style (odd or not) - * @param boolean $isimportedfield Verify if it's an imported field - * @param int $nostyle Hide style - * @param array $listofkeys List of keys for select boxes + * @param array $fieldssource List of source fields + * @param int $pos Pos + * @param string $key Key + * @param boolean $var Line style (odd or not) + * @param int $nostyle Hide style * @return void */ -function show_elem($fieldssource, $pos, $key, $var, $isimportedfield, $nostyle = '', &$listofkeys = array()) +function show_elem($fieldssource, $pos, $key, $var, $nostyle = '') { global $langs, $bc; - // $height = '24px'; - $height = '30px'; + $height = '24px'; if ($key == 'none') { //stop multiple duplicate ids with no number @@ -2162,7 +2121,7 @@ function show_elem($fieldssource, $pos, $key, $var, $isimportedfield, $nostyle = if ($pos && $pos > count($fieldssource)) { // No fields print ''; print ''; print ''; print ''; - } elseif (empty($isimportedfield)) { - $example = !empty($fieldssource[$pos]['example1'])?$fieldssource[$pos]['example1']:""; - if ($example) { - if (!utf8_check($example)) { - $example = utf8_encode($example); - } - print ''; - print ''; - print ''; - print ''; - } } else { // Print field of source file print ''; print ''; - print ''; print ''; print ''; } diff --git a/htdocs/langs/en_US/exports.lang b/htdocs/langs/en_US/exports.lang index 8bbc6f1ad98..f2f2d2cf587 100644 --- a/htdocs/langs/en_US/exports.lang +++ b/htdocs/langs/en_US/exports.lang @@ -8,7 +8,7 @@ ImportableDatas=Importable dataset SelectExportDataSet=Choose dataset you want to export... SelectImportDataSet=Choose dataset you want to import... SelectExportFields=Choose the fields you want to export, or select a predefined export profile -SelectImportFields=Choose the source file fields you want to import and their target field in database by choosing the fields with the select box, or select a predefined import profile: +SelectImportFields=Choose the source file fields you want to import and their target field in database by moving them up and down with anchor %s, or select a predefined import profile: NotImportedFields=Fields of source file not imported SaveExportModel=Save your selections as an export profile/template (for reuse). SaveImportModel=Save this import profile (for reuse) ... @@ -135,5 +135,3 @@ NbInsert=Number of inserted lines: %s NbUpdate=Number of updated lines: %s MultipleRecordFoundWithTheseFilters=Multiple records have been found with these filters: %s StocksWithBatch=Stocks and location (warehouse) of products with batch/serial number -WarningFirstImportedLine=The first line(s) will not be imported with the current selection -EmptyField=Empty field \ No newline at end of file diff --git a/htdocs/langs/fr_FR/exports.lang b/htdocs/langs/fr_FR/exports.lang index 4f4490ef4a5..5c87e8f186f 100644 --- a/htdocs/langs/fr_FR/exports.lang +++ b/htdocs/langs/fr_FR/exports.lang @@ -8,7 +8,7 @@ ImportableDatas=Lot de données importables SelectExportDataSet=Choisissez un lot prédéfini de données que vous désirez exporter… SelectImportDataSet=Choisissez un lot prédéfini de données que vous désirez importer… SelectExportFields=Choisissez les champs à exporter, ou choisissez un profil d'export prédéfini -SelectImportFields=Choisissez les champs du fichier source à importer et leur destination dans la base en utilisant les boîtes de sélection, ou choisissez un profil d'import prédéfini: +SelectImportFields=Choisissez les champs du fichier source à importer et leur destination dans la base en les déplaçant vers le haut ou vers le bas via l'ancre %s, ou choisissez un profil d'import prédéfini: NotImportedFields=Champs du fichier source non importés SaveExportModel=Enregistrer ce profil d'export (si vous désirez le réutiliser ultérieurement) … SaveImportModel=Enregistrer ce profil d'import (si vous désirez le réutiliser ultérieurement) … @@ -135,5 +135,3 @@ NbInsert=Nombre de lignes insérées: %s NbUpdate=Nombre de lignes mises à jour: %s MultipleRecordFoundWithTheseFilters=Plusieurs enregistrements ont été trouvés avec ces filtres: %s StocksWithBatch=Stocks et entrepôts des produits avec numéro de lot/série -WarningFirstImportedLine=Les première(s) ligne(s) ne seront pas importée(s) avec cette selection -EmptyField=Champ vide From b07096ad453a4066b4041a9610e53d78086b0eb7 Mon Sep 17 00:00:00 2001 From: wdammak <26695620+wdammak@users.noreply.github.com> Date: Wed, 13 Apr 2022 17:07:23 +0100 Subject: [PATCH 121/738] Update ajaxcompanies.php Add logo --- htdocs/core/ajax/ajaxcompanies.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/core/ajax/ajaxcompanies.php b/htdocs/core/ajax/ajaxcompanies.php index 173d176c031..350f03398aa 100644 --- a/htdocs/core/ajax/ajaxcompanies.php +++ b/htdocs/core/ajax/ajaxcompanies.php @@ -58,7 +58,7 @@ if (GETPOST('newcompany') || GETPOST('socid', 'int') || GETPOST('id_fourn')) { if (!$socid) $socid = $_GET['socid'] ? $_GET['socid'] : ''; if (!$socid) $socid = $_GET['id_fourn'] ? $_GET['id_fourn'] : ''; - $sql = "SELECT s.rowid, s.nom, s.name_alias, s.code_client, s.code_fournisseur, s.address, s.zip, s.town, s.email, s.siren, s.siret, s.ape, s.idprof4, s.client, s.fournisseur, s.datec"; + $sql = "SELECT s.rowid, s.nom, s.name_alias, s.code_client, s.code_fournisseur, s.address, s.zip, s.town, s.email, s.siren, s.siret, s.ape, s.idprof4, s.client, s.fournisseur, s.datec, s.logo"; $sql .= " , c.label as country, d.nom as departement"; $sql .= " FROM ".MAIN_DB_PREFIX."societe as s"; $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as c ON c.rowid = s.fk_pays"; @@ -106,6 +106,7 @@ if (GETPOST('newcompany') || GETPOST('socid', 'int') || GETPOST('id_fourn')) { $row_array['client'] = $row['client']; $row_array['fournisseur'] = $row['fournisseur']; $row_array['datec'] = $row['datec']; + $row_array['logo'] = $row['logo']; $row_array['country'] = $row['country']; $row_array['departement'] = $row['departement']; From 88a6b6535349314e7f5bbee259cab2a694f0b2e5 Mon Sep 17 00:00:00 2001 From: wdammak <26695620+wdammak@users.noreply.github.com> Date: Wed, 13 Apr 2022 17:11:51 +0100 Subject: [PATCH 122/738] Update card.php Add logo --- htdocs/societe/card.php | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/htdocs/societe/card.php b/htdocs/societe/card.php index 83c6975e3c7..363d8e8d69d 100644 --- a/htdocs/societe/card.php +++ b/htdocs/societe/card.php @@ -1301,7 +1301,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { $(document).ready(function () { $('#name').select2({ ajax: { - url: '/htdocs/core/ajax/ajaxcompanies.php', + url: '/core/ajax/ajaxcompanies.php', dataType: 'json', delay: 250, data: function (params) { @@ -1330,13 +1330,22 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { function formatCustomer (Customer) { - if (Customer.loading) { + if(Customer.label === undefined) { return Customer.text; } + var logo = ''; + if(Customer.logo !== undefined) { + logo = "" + - "
" + - "
" + + "
" + logo + + "
" + "
" + "
" + "
" + From db96173189b72fb1c9a55ae260dfea2cb61ff196 Mon Sep 17 00:00:00 2001 From: wdammak <26695620+wdammak@users.noreply.github.com> Date: Wed, 13 Apr 2022 18:00:24 +0100 Subject: [PATCH 123/738] Update card.php --- htdocs/societe/card.php | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/htdocs/societe/card.php b/htdocs/societe/card.php index 363d8e8d69d..03a8bf30fa1 100644 --- a/htdocs/societe/card.php +++ b/htdocs/societe/card.php @@ -1340,7 +1340,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { logo += "/viewimage.php?modulepart=societe&entity=1&file=" + Customer.key + "%2Flogos%2Fthumbs%2F" + Customer.logo.replace('.', '_mini.') + "&cache=0"; logo += "' />
"; } else { - logo = '
'; + logo = '
'; } var $container = $("
" + @@ -1365,17 +1365,17 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { ); $container.find('.select2-result-repository__title').text(Customer.label); - $container.find('.select2-result-repository__name_alias').text(Customer.name_alias); - $container.find('.select2-result-repository__code_client').text(Customer.code_client); - $container.find('.select2-result-repository__code_fournisseur').text(Customer.code_fournisseur); - $container.find('.select2-result-repository__email').append('Mail: ' + Customer.email); - $container.find('.select2-result-repository__address').append('Address: ' + Customer.address); - $container.find('.select2-result-repository__country').append('Country: ' + Customer.country); - $container.find('.select2-result-repository__departement').append('Departement: ' + Customer.departement); - $container.find('.select2-result-repository__zip').append('Zip: ' + Customer.zip); - $container.find('.select2-result-repository__town').append('Town: ' + Customer.town); - $container.find('.select2-result-repository__siren').append('Siren: ' + Customer.siren); - $container.find('.select2-result-repository__datec').append('Created: ' + Customer.datec); + $container.find('.select2-result-repository__name_alias').text(Customer.name_alias ? Customer.name_alias : ''); + $container.find('.select2-result-repository__code_client').text(Customer.code_client ? Customer.code_client : ''); + $container.find('.select2-result-repository__code_fournisseur').text((Customer.code_fournisseur!==null) ? Customer.code_fournisseur : ''); + $container.find('.select2-result-repository__email').append('Mail: ' + (Customer.email !== null ? Customer.email : '')); + $container.find('.select2-result-repository__address').append('Address: ' + (Customer.address !== null ? Customer.address : '')); + $container.find('.select2-result-repository__country').append('Country: ' + (Customer.country !== null ? Customer.country : '')); + $container.find('.select2-result-repository__departement').append('Departement: ' + (Customer.departement !== null ? Customer.departement : '')); + $container.find('.select2-result-repository__zip').append('Zip: ' + (Customer.zip !== null ? Customer.zip : '')); + $container.find('.select2-result-repository__town').append('Town: ' + (Customer.town !== null ? Customer.town : '')); + $container.find('.select2-result-repository__siren').append('Siren: ' + (Customer.siren !== null ? Customer.siren : '')); + $container.find('.select2-result-repository__datec').append('Created: ' + (Customer.datec !== null ? Customer.datec : '')); return $container; } From 5f7f9a751508dc5840151b0f674a671a2a88281a Mon Sep 17 00:00:00 2001 From: lvessiller Date: Thu, 14 Apr 2022 09:48:06 +0200 Subject: [PATCH 124/738] FIX include tpl path in product stock --- htdocs/product/stock/tpl/stockcorrection.tpl.php | 2 +- htdocs/product/stock/tpl/stocktransfer.tpl.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/product/stock/tpl/stockcorrection.tpl.php b/htdocs/product/stock/tpl/stockcorrection.tpl.php index eb84df7d14e..6afea0abe54 100644 --- a/htdocs/product/stock/tpl/stockcorrection.tpl.php +++ b/htdocs/product/stock/tpl/stockcorrection.tpl.php @@ -180,7 +180,7 @@ print ''; print ''; // Extrafield template -include 'extrafields_add.tpl.php'; +include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php'; print '
'; + print $i; + print ''; print dol_escape_htmltag($menu['type']); print ''.img_picto($langs->trans("Edit"), 'edit').' '; - print ''.img_picto($langs->trans("Delete"), 'delete').'
'; print ' '.$langs->trans("TriggersFile").' : '.$pathtofile.''; print ''.img_picto($langs->trans("Edit"), 'edit').''.img_picto($langs->trans("Delete"), 'delete').''.img_picto($langs->trans("Delete"), 'delete').'
'.img_picto($langs->trans("Edit"), 'edit').''.img_picto($langs->trans("Delete"), 'delete').''.img_picto($langs->trans("Edit"), 'edit').''.img_picto($langs->trans("Delete"), 'delete').''.img_picto('Generate', 'generate', 'class="paddingleft"').''.$langs->trans('Prefix').''.$langs->trans('Prefix').''; // List of target fields - // $height = '24px'; //needs px for css height attribute below - $height = '30px'; + $height = '24px'; //needs px for css height attribute below $i = 0; $mandatoryfieldshavesource = true; - $fieldselect = 1; - print ''; - $pos = 1; + print '
'; foreach ($fieldstarget as $code => $label) { print ''; @@ -1058,7 +1051,7 @@ if ($step == 4 && $datatoimport) { $tablealias = preg_replace('/(\..*)$/i', '', $code); $tablename = $objimport->array_import_tables[0][$tablealias]; - $entityicon = !empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity; // $entityicon must string name of picto of the field like 'project', 'company', 'contact', 'modulename', ... + $entityicon = $entitytoicon[$entity] ? $entitytoicon[$entity] : $entity; // $entityicon must string name of picto of the field like 'project', 'company', 'contact', 'modulename', ... $entitylang = $entitytolang[$entity] ? $entitytolang[$entity] : $objimport->array_import_label[0]; // $entitylang must be a translation key to describe object the field is related to, like 'Company', 'Contact', 'MyModyle', ... print ''; @@ -1078,7 +1071,7 @@ if ($step == 4 && $datatoimport) { print ''; // Info field print ''; print ''; - $fieldselect++; } print '
=>'.img_object('', $entityicon).' '.$langs->trans($entitylang).''; - $filecolumn = !empty($array_match_database_to_file[$code])?$array_match_database_to_file[$code]:0; + $filecolumn = $array_match_database_to_file[$code]; // Source field info $htmltext = ''.$langs->trans("FieldSource").'
'; if ($filecolumn > count($fieldssource)) { @@ -1098,7 +1091,7 @@ if ($step == 4 && $datatoimport) { } // Source required $htmltext .= $langs->trans("SourceRequired").': '.yn(preg_match('/\*$/', $label)).'
'; - $example = !empty($objimport->array_import_examplevalues[0][$code])?$objimport->array_import_examplevalues[0][$code]:""; + $example = $objimport->array_import_examplevalues[0][$code]; // Example if (empty($objimport->array_import_convertvalue[0][$code])) { // If source file does not need convertion if ($example) { @@ -1136,7 +1129,6 @@ if ($step == 4 && $datatoimport) { print '
'; @@ -1155,7 +1147,7 @@ if ($step == 4 && $datatoimport) { if (empty($fieldsplaced[$key])) { // $nbofnotimportedfields++; - show_elem($fieldssource, $key, '', $var, 0, 'nostyle', $listofkeys); + show_elem($fieldssource, $key, '', $var, 'nostyle'); //print '> '.$lefti.'-'.$key; $listofkeys[$key] = 1; $lefti++; @@ -1164,7 +1156,7 @@ if ($step == 4 && $datatoimport) { // Print one more empty field $newkey = getnewkey($fieldssource, $listofkeys); - show_elem($fieldssource, $newkey, '', $var, 1, 'nostyle', $listofkeys); + show_elem($fieldssource, $newkey, '', $var, 'nostyle'); //print '> '.$lefti.'-'.$newkey; $listofkeys[$newkey] = 1; $nbofnotimportedfields++; @@ -1177,7 +1169,7 @@ if ($step == 4 && $datatoimport) { $i = 0; while ($i < $nbofnotimportedfields) { // Print empty cells - show_elem('', '', 'none', $var, 0, 'nostyle', $listofkeys); + show_elem('', '', 'none', $var, 'nostyle'); $i++; } print '
'; - //print img_picto(($pos > 0 ? $langs->trans("MoveField", $pos) : ''), 'grip_title', 'class="boxhandle" style="cursor:move;"'); + print img_picto(($pos > 0 ? $langs->trans("MoveField", $pos) : ''), 'grip_title', 'class="boxhandle" style="cursor:move;"'); print ''; print $langs->trans("NoFields"); @@ -2177,65 +2136,22 @@ function show_elem($fieldssource, $pos, $key, $var, $isimportedfield, $nostyle = print ' '; print '
'; - print ' '; - print ''; - print $langs->trans("EmptyField").': '; - print ' ('.$example.')'; - print '
'; // The image must have the class 'boxhandle' beause it's value used in DOM draggable objects to define the area used to catch the full object - //print img_picto($langs->trans("MoveField", $pos), 'grip_title', 'class="boxhandle" style="cursor:move;"'); + print img_picto($langs->trans("MoveField", $pos), 'grip_title', 'class="boxhandle" style="cursor:move;"'); print ''; - $example = !empty($fieldssource[$pos]['example1'])?$fieldssource[$pos]['example1']:""; - if ($example != "") { - print $langs->trans("Field").' '.$pos.': '; - } else { - print $langs->trans("EmptyField").': '; - } + print ''; + print $langs->trans("Field").' '.$pos; + $example = $fieldssource[$pos]['example1']; if ($example) { if (!utf8_check($example)) { $example = utf8_encode($example); } - } - $nameselect = ($pos > 0) ? $pos : (-$pos); - print ''; - print '
'; diff --git a/htdocs/product/stock/tpl/stocktransfer.tpl.php b/htdocs/product/stock/tpl/stocktransfer.tpl.php index ccedf993221..f1c08b7673e 100644 --- a/htdocs/product/stock/tpl/stocktransfer.tpl.php +++ b/htdocs/product/stock/tpl/stocktransfer.tpl.php @@ -137,7 +137,7 @@ print ''; print ''; // Extrafield template -include 'extrafields_add.tpl.php'; +include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php'; print ''; From c90d758b0ff06021b5eafd72b69c0276fa88e4eb Mon Sep 17 00:00:00 2001 From: lmarcouiller Date: Thu, 14 Apr 2022 11:06:54 +0200 Subject: [PATCH 125/738] New : add of unique(entity,label) --- htdocs/install/mysql/migration/15.0.0-16.0.0.sql | 2 ++ .../tables/llx_takepos_floor_tables.key.sql | 16 ++++++++++++++++ htdocs/takepos/floors.php | 2 +- 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 htdocs/install/mysql/tables/llx_takepos_floor_tables.key.sql diff --git a/htdocs/install/mysql/migration/15.0.0-16.0.0.sql b/htdocs/install/mysql/migration/15.0.0-16.0.0.sql index 5f8b1d886c3..745955c7bcd 100644 --- a/htdocs/install/mysql/migration/15.0.0-16.0.0.sql +++ b/htdocs/install/mysql/migration/15.0.0-16.0.0.sql @@ -324,3 +324,5 @@ ALTER TABLE llx_actioncomm MODIFY COLUMN note mediumtext; DELETE FROM llx_boxes WHERE box_id IN (select rowid FROM llx_boxes_def WHERE file IN ('box_bom.php@bom', 'box_bom.php')); DELETE FROM llx_boxes_def WHERE file IN ('box_bom.php@bom', 'box_bom.php'); + +ALTER TABLE llx_takepos_floor_tables ADD UNIQUE(entity,label); \ No newline at end of file diff --git a/htdocs/install/mysql/tables/llx_takepos_floor_tables.key.sql b/htdocs/install/mysql/tables/llx_takepos_floor_tables.key.sql new file mode 100644 index 00000000000..e90cd67e889 --- /dev/null +++ b/htdocs/install/mysql/tables/llx_takepos_floor_tables.key.sql @@ -0,0 +1,16 @@ +-- Copyright (C) 2018 SuperAdmin +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see https://www.gnu.org/licenses/. + +ALTER TABLE llx_takepos_floor_tables ADD UNIQUE(entity,label); \ No newline at end of file diff --git a/htdocs/takepos/floors.php b/htdocs/takepos/floors.php index 64040a24466..73e84109116 100644 --- a/htdocs/takepos/floors.php +++ b/htdocs/takepos/floors.php @@ -104,7 +104,7 @@ if ($action == "updatename") { if (strlen($newname) > 3) { $newname = substr($newname, 0, 3); // Only 3 chars } - $db->query("UPDATE ".MAIN_DB_PREFIX."takepos_floor_tables set label='".$db->escape($newname)."' WHERE rowid = ".((int) $place)); + $resql = $db->query("UPDATE ".MAIN_DB_PREFIX."takepos_floor_tables set label='".$db->escape($newname)."' WHERE rowid = ".((int) $place)); } if ($action == "add") { From 0fcfb7c5fd3988fb362ee550dd7edc6beb185c97 Mon Sep 17 00:00:00 2001 From: atm-arnaud Date: Thu, 14 Apr 2022 12:08:06 +0200 Subject: [PATCH 126/738] FIX intervention entity missing --- htdocs/fichinter/class/fichinter.class.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/fichinter/class/fichinter.class.php b/htdocs/fichinter/class/fichinter.class.php index 371853dc70c..92b628b9aab 100644 --- a/htdocs/fichinter/class/fichinter.class.php +++ b/htdocs/fichinter/class/fichinter.class.php @@ -426,7 +426,7 @@ class Fichinter extends CommonObject $sql .= " f.datec, f.dateo, f.datee, f.datet, f.fk_user_author,"; $sql .= " f.date_valid as datev,"; $sql .= " f.tms as datem,"; - $sql .= " f.duree, f.fk_projet as fk_project, f.note_public, f.note_private, f.model_pdf, f.extraparams, fk_contrat"; + $sql .= " f.duree, f.fk_projet as fk_project, f.note_public, f.note_private, f.model_pdf, f.extraparams, fk_contrat, f.entity as entity"; $sql .= " FROM ".MAIN_DB_PREFIX."fichinter as f"; if ($ref) { $sql .= " WHERE f.entity IN (".getEntity('intervention').")"; @@ -459,6 +459,7 @@ class Fichinter extends CommonObject $this->model_pdf = $obj->model_pdf; $this->modelpdf = $obj->model_pdf; // deprecated $this->fk_contrat = $obj->fk_contrat; + $this->entity = $obj->entity; $this->user_creation = $obj->fk_user_author; From f15438dd039dc3f6ecb7c4c3642d83f8e57e7927 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Thu, 14 Apr 2022 12:28:51 +0200 Subject: [PATCH 127/738] NEW: data sign on propal list --- htdocs/comm/propal/list.php | 71 ++++++++++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/htdocs/comm/propal/list.php b/htdocs/comm/propal/list.php index 73b4c479b2e..561682ba02f 100644 --- a/htdocs/comm/propal/list.php +++ b/htdocs/comm/propal/list.php @@ -123,6 +123,15 @@ $search_fk_input_reason = GETPOST("search_fk_input_reason", 'int'); $search_fk_mode_reglement = GETPOST("search_fk_mode_reglement", 'int'); $search_btn = GETPOST('button_search', 'alpha'); $search_remove_btn = GETPOST('button_removefilter', 'alpha'); +$search_date_signature_startday = GETPOST('search_date_signature_startday', 'int'); +$search_date_signature_startmonth = GETPOST('search_date_signature_startmonth', 'int'); +$search_date_signature_startyear = GETPOST('search_date_signature_startyear', 'int'); +$search_date_signature_endday = GETPOST('search_date_signature_endday', 'int'); +$search_date_signature_endmonth = GETPOST('search_date_signature_endmonth', 'int'); +$search_date_signature_endyear = GETPOST('search_date_signature_endyear', 'int'); +$search_date_signature_start = dol_mktime(0, 0, 0, $search_date_signature_startmonth, $search_date_signature_startday, $search_date_signature_startyear); +$search_date_signature_end = dol_mktime(23, 59, 59, $search_date_signature_endmonth, $search_date_signature_endday, $search_date_signature_endyear); + $search_status = GETPOST('search_status', 'alpha'); $optioncss = GETPOST('optioncss', 'alpha'); @@ -207,6 +216,7 @@ $arrayfields = array( 'p.date'=>array('label'=>"DatePropal", 'checked'=>1), 'p.fin_validite'=>array('label'=>"DateEnd", 'checked'=>1), 'p.date_livraison'=>array('label'=>"DeliveryDate", 'checked'=>0), + 'p.date_signature'=>array('label'=>"DateSigning", 'checked'=>0), 'ava.rowid'=>array('label'=>"AvailabilityPeriod", 'checked'=>0), 'p.fk_shipping_method'=>array('label'=>"SendingMethod", 'checked'=>0, 'enabled'=>!empty($conf->expedition->enabled)), 'p.fk_input_reason'=>array('label'=>"Origin", 'checked'=>0, 'enabled'=>1), @@ -337,6 +347,14 @@ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x' $search_fk_shipping_method = ''; $search_fk_input_reason = ''; $search_fk_mode_reglement = ''; + $search_date_signature_startday = ''; + $search_date_signature_startmonth = ''; + $search_date_signature_startyear = ''; + $search_date_signature_endday = ''; + $search_date_signature_endmonth = ''; + $search_date_signature_endyear = ''; + $search_date_signature_start = ''; + $search_date_signature_end = ''; } if ($object_statut != '') { $search_status = $object_statut; @@ -517,6 +535,7 @@ $sql .= " state.code_departement as state_code, state.nom as state_name,"; $sql .= ' p.rowid, p.entity as propal_entity, p.note_private, p.total_ht, p.total_tva, p.total_ttc, p.localtax1, p.localtax2, p.ref, p.ref_client, p.fk_statut as status, p.fk_user_author, p.datep as dp, p.fin_validite as dfv,p.date_livraison as ddelivery,'; $sql .= ' p.fk_multicurrency, p.multicurrency_code, p.multicurrency_tx, p.multicurrency_total_ht, p.multicurrency_total_tva, p.multicurrency_total_ttc,'; $sql .= ' p.datec as date_creation, p.tms as date_update, p.date_cloture as date_cloture,'; +$sql .= ' p.date_signature as dsignature,'; $sql .= ' p.note_public, p.note_private,'; $sql .= ' p.fk_cond_reglement,p.fk_mode_reglement,p.fk_shipping_method,p.fk_input_reason,'; $sql .= " pr.rowid as project_id, pr.ref as project_ref, pr.title as project_label,"; @@ -701,6 +720,12 @@ if ($search_sale > 0) { if ($search_user > 0) { $sql .= " AND c.fk_c_type_contact = tc.rowid AND tc.element='propal' AND tc.source='internal' AND c.element_id = p.rowid AND c.fk_socpeople = ".((int) $search_user); } +if ($search_date_signature_start) { + $sql .= " AND p.date_signature >= '".$db->idate($search_date_signature_start)."'"; +} +if ($search_date_signature_end) { + $sql .= " AND p.date_signature <= '".$db->idate($search_date_signature_end)."'"; +} // Add where from extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php'; @@ -917,6 +942,24 @@ if ($resql) { if ($search_country) { $param .= '&search_country='.urlencode($search_country); } + if ($search_date_signature_startday) { + $param .= '&search_date_signature_startday='.urlencode($search_date_signature_startday); + } + if ($search_date_signature_startmonth) { + $param .= '&search_date_signature_startmonth='.urlencode($search_date_signature_startmonth); + } + if ($search_date_signature_startyear) { + $param .= '&search_date_signature_startyear='.urlencode($search_date_signature_startyear); + } + if ($search_date_signature_endday) { + $param .= '&search_date_signature_endday='.urlencode($search_date_signature_endday); + } + if ($search_date_signature_endmonth) { + $param .= '&search_date_signature_endmonth='.urlencode($search_date_signature_endmonth); + } + if ($search_date_signature_endyear) { + $param .= '&search_date_signature_endyear='.urlencode($search_date_signature_endyear); + } // Add $param from extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php'; @@ -1148,6 +1191,17 @@ if ($resql) { print '
'; print ''; } + // Date Signature + if (!empty($arrayfields['p.date_signature']['checked'])) { + print ''; + print '
'; + print $form->selectDate($search_date_signature_start ? $search_date_signature_start : -1, 'search_date_signature_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From')); + print '
'; + print '
'; + print $form->selectDate($search_date_signature_end ? $search_date_signature_end : -1, 'search_date_signature_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From')); + print '
'; + print ''; + } // Availability if (!empty($arrayfields['ava.rowid']['checked'])) { print ''; @@ -1361,7 +1415,10 @@ if ($resql) { print_liste_field_titre($arrayfields['p.fin_validite']['label'], $_SERVER["PHP_SELF"], 'dfv', '', $param, 'align="center"', $sortfield, $sortorder); } if (!empty($arrayfields['p.date_livraison']['checked'])) { - print_liste_field_titre($arrayfields['p.date_livraison']['label'], $_SERVER["PHP_SELF"], 'ddelivery', '', $param, 'align="center"', $sortfield, $sortorder); + print_liste_field_titre($arrayfields['p.date_livraison']['label'], $_SERVER["PHP_SELF"], 'p.date_livraison', '', $param, 'align="center"', $sortfield, $sortorder); + } + if (!empty($arrayfields['p.date_signature']['checked'])) { + print_liste_field_titre($arrayfields['p.date_signature']['label'], $_SERVER["PHP_SELF"], 'p.date_signature', '', $param, 'align="center"', $sortfield, $sortorder); } if (!empty($arrayfields['ava.rowid']['checked'])) { print_liste_field_titre($arrayfields['ava.rowid']['label'], $_SERVER["PHP_SELF"], 'availability', '', $param, '', $sortfield, $sortorder); @@ -1720,6 +1777,18 @@ if ($resql) { $totalarray['nbfield']++; } } + // Date Signature + if (!empty($arrayfields['p.date_signature']['checked'])) { + if ($obj->dsignature) { + print ''.dol_print_date($db->jdate($obj->dsignature), 'day'); + print ''; + } else { + print ' '; + } + if (!$i) { + $totalarray['nbfield']++; + } + } // Availability if (!empty($arrayfields['ava.rowid']['checked'])) { print ''; From 3d21023110a27ab96d6ff0fafb8ae6eb3117709a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 14 Apr 2022 14:11:40 +0200 Subject: [PATCH 128/738] Label of option --- htdocs/admin/pdf.php | 6 +++--- htdocs/langs/en_US/companies.lang | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/htdocs/admin/pdf.php b/htdocs/admin/pdf.php index fd8377b0a27..1e015d69f9c 100644 --- a/htdocs/admin/pdf.php +++ b/htdocs/admin/pdf.php @@ -309,7 +309,7 @@ print ''.$langs->trans("Par // Show sender name -/* Set option as hidden because no need of this for 99.99% of users. +/* Set option as hidden because no need of this for 99.99% of users. Having it as hidden feature is enough. print ''.$langs->trans("MAIN_PDF_HIDE_SENDER_NAME").''; if ($conf->use_javascript_ajax) { print ajax_constantonoff('MAIN_PDF_HIDE_SENDER_NAME'); @@ -321,7 +321,7 @@ print ''; // Hide VAT Intra on address -print ''.$langs->trans("ShowVATIntaInAddress").''; +print ''.$langs->trans("ShowVATIntaInAddress").' - '.$langs->trans("ThirdPartyAddress").''; if ($conf->use_javascript_ajax) { print ajax_constantonoff('MAIN_TVAINTRA_NOT_IN_ADDRESS'); } else { @@ -340,7 +340,7 @@ for ($i = 1; $i <= 6; $i++) { $pid = img_warning().' '.$langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("CompanyCountry")).''; } if ($pid) { - print ''.$langs->trans("ShowProfIdInAddress").' - '.$pid.''; + print ''.$langs->trans("ShowProfIdInAddress").' - '.$pid.' - '.$langs->trans("ThirdPartyAddress").''; $keyforconstant = 'MAIN_PROFID'.$i.'_IN_ADDRESS'; if ($conf->use_javascript_ajax) { print ajax_constantonoff($keyforconstant); diff --git a/htdocs/langs/en_US/companies.lang b/htdocs/langs/en_US/companies.lang index 093fb47189d..b1438691cd9 100644 --- a/htdocs/langs/en_US/companies.lang +++ b/htdocs/langs/en_US/companies.lang @@ -19,6 +19,7 @@ ProspectionArea=Prospection area IdThirdParty=Id third party IdCompany=Company Id IdContact=Contact Id +ThirdPartyAddress=Third-party address ThirdPartyContacts=Third-party contacts ThirdPartyContact=Third-party contact/address Company=Company From 8a9be6705d4c674013dfa2ab74184b2370d73df4 Mon Sep 17 00:00:00 2001 From: kamel Date: Thu, 14 Apr 2022 14:14:07 +0200 Subject: [PATCH 129/738] FIX: Call of printOriginObjectLine hook --- htdocs/core/class/commonobject.class.php | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 02421ea9157..7828e61b166 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -4824,11 +4824,9 @@ abstract class CommonObject if (!empty($this->lines)) { foreach ($this->lines as $line) { if (is_object($hookmanager) && (($line->product_type == 9 && !empty($line->special_code)) || !empty($line->fk_parent_line))) { - if (empty($line->fk_parent_line)) { - $parameters = array('line'=>$line, 'i'=>$i); - $action = ''; - $hookmanager->executeHooks('printOriginObjectLine', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks - } + $parameters = array('line' => $line, 'i' => $i); + $action = ''; + $hookmanager->executeHooks('printOriginObjectLine', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks } else { $this->printOriginLine($line, '', $restrictlist, '/core/tpl', $selectedLines); } From e0d208214731df7f404c33b1488f543e4ad0d109 Mon Sep 17 00:00:00 2001 From: UT from dolibit <45215329+dolibit-ut@users.noreply.github.com> Date: Thu, 14 Apr 2022 16:49:08 +0200 Subject: [PATCH 130/738] Update barcode_EAN13.txt start formatting & english translation --- dev/resources/iso-normes/barcode_EAN13.txt | 64 +++++++++++----------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/dev/resources/iso-normes/barcode_EAN13.txt b/dev/resources/iso-normes/barcode_EAN13.txt index f4496327ee4..f6b3c5f5ebb 100644 --- a/dev/resources/iso-normes/barcode_EAN13.txt +++ b/dev/resources/iso-normes/barcode_EAN13.txt @@ -16,57 +16,57 @@ Voici la liste des codes pays ou systeme : EN == -Meaning of the numbers. +Meaning of the numbers: -- 2 digits for the country code or system code +- first 2-3 digits for the country code or system code - 5 digits for the company identifier - 5 digits for item identifier - 1 digit for checksum This rule has been twisted many times to improve the use of the available numbers. -Here is the list of country codes or system: +Here is the list of country codes or system: List ==== -00 � 13 UCC (Etats-Unis et Canada) -20 � 29 Codification interne en magasin -30 � 37 GENCOD-EAN France -380 BCCI (Bulgarie) -383 SANA (Slovenie) -385 CRO-EAN (Croatie) -387 EAN-BIH (Bosnie-Herzegovine) -400 � 440 CCG (Allemagne) -45 + 49 Distribution Code Center � DCC (Japon) -460 � 469 UNISCAN - EAN Russie (Federation de Russie) -471 CAN (Taiwan) -474 EAN Estonie -475 EAN Lettonie -476 EAN Azerba� djan -477 EAN Lituanie -478 EAN Ouzbekistan -479 EAN Sri Lanka -480 PANC (Philippines) -481 EAN Bielorussie -482 EAN Ukraine -484 EAN Moldavie -485 EAN Armenie -486 EAN Georgie -487 EAN Kazakhstan -489 HKANA (Hong Kong) -50 E Centre UK +00 - 13 UCC (U.S.A / États-Unis & Canada) +20 - 29 Flag for internal numbering / Codification interne en magasin +30 - 37 GENCOD-EAN France +380 BCCI (Bulgaria) +383 SANA (Slovenia) +385 CRO-EAN (Croatia) +387 EAN-BIH (Bosnia-Herzegovina) +400-440 CCG (Allemagne/Germany) +45 + 49 Distribution Code Center - DCC (Japan) +460-469 UNISCAN - EAN Russia (Federation de Russie) +471 CAN Taiwan +474 EAN Estonia +475 EAN Latvia +476 EAN Azerbaijan +477 EAN Lithuania +478 EAN Uzbekistan +479 EAN Sri Lanka +480 PANC Philippines +481 EAN Belarus +482 EAN Ukraine +484 EAN Moldova +485 EAN Armenia +486 EAN Georgia +487 EAN Kazakhstan +489 HKANA Hong Kong +50 E Centre UK - United Kingdom 520 HELLCAN-EAN HELLAS (Grece) 528 EAN Liban 529 EAN Chypre -531 EAN-MAC (FYR Mac�donie) +531 EAN-MAC (FYR Macedonie) 535 EAN Malte 539 EAN Irlande -54 ICODIF/EAN Belgique. Luxembourg +54 ICODIF/EAN Belgique. Luxembourg 560 CODIPOR (Portugal) 569 EAN Islande -57 EAN Danemark +57 EAN Danemark 590 EAN Pologne 594 EAN Roumanie 599 H.A.P.M.H. (Hongrie) From fb2243dacde39ae8ebac2fa3f573d1f4de9b7c82 Mon Sep 17 00:00:00 2001 From: wdammak <26695620+wdammak@users.noreply.github.com> Date: Thu, 14 Apr 2022 16:19:55 +0100 Subject: [PATCH 131/738] Update card.php --- htdocs/societe/card.php | 179 +++++++++++++++++++--------------------- 1 file changed, 87 insertions(+), 92 deletions(-) diff --git a/htdocs/societe/card.php b/htdocs/societe/card.php index 03a8bf30fa1..6ff756b6021 100644 --- a/htdocs/societe/card.php +++ b/htdocs/societe/card.php @@ -1293,99 +1293,94 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { print 'global->SOCIETE_USEPREFIX) ? ' colspan="3"' : '').'>'; //print ''; //print $form->widgetForTranslation("name", $object, $permissiontoadd, 'string', 'alpahnohtml', 'minwidth300'); - //print $form->select_company(0, 'name', '(s.client = 1 OR s.client = 3) AND status=1', ' '); - //print ""; - print ''; - ?> - - + '; print ''; if (!empty($conf->global->SOCIETE_USEPREFIX)) { // Old not used prefix field print ''.$langs->trans('Prefix').''; From 02a3cfbb5f16672f2fff6c65f0fe6a0a3386d56b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 14 Apr 2022 21:43:55 +0200 Subject: [PATCH 132/738] Update paymentsalary.class.php --- htdocs/salaries/class/paymentsalary.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/salaries/class/paymentsalary.class.php b/htdocs/salaries/class/paymentsalary.class.php index 506e9b73ea5..08e850c259a 100644 --- a/htdocs/salaries/class/paymentsalary.class.php +++ b/htdocs/salaries/class/paymentsalary.class.php @@ -166,7 +166,7 @@ class PaymentSalary extends CommonObject if ($totalamount != 0) { $sql = "INSERT INTO ".MAIN_DB_PREFIX."payment_salary (entity, fk_salary, datec, datep, amount,"; $sql .= " fk_typepayment, num_payment, note, fk_user_author, fk_bank)"; - $sql .= " VALUES (".$conf->entity.", ".$this->chid.", '".$this->db->idate($now)."',"; + $sql .= " VALUES (".((int) $conf->entity).", ".((int) $this->chid).", '".$this->db->idate($now)."',"; $sql .= " '".$this->db->idate($this->datepaye)."',"; $sql .= " ".price2num($totalamount).","; $sql .= " ".((int) $this->paiementtype).", '".$this->db->escape($this->num_payment)."', '".$this->db->escape($this->note)."', ".((int) $user->id).","; From d62d24a337778890f042a58aaa17d3ab459160aa Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Thu, 14 Apr 2022 21:47:35 +0200 Subject: [PATCH 133/738] add code to get documents list by knowledgemanagement with api --- htdocs/api/class/api_documents.class.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/htdocs/api/class/api_documents.class.php b/htdocs/api/class/api_documents.class.php index da49e4cbba7..d4e35e848ac 100644 --- a/htdocs/api/class/api_documents.class.php +++ b/htdocs/api/class/api_documents.class.php @@ -458,6 +458,20 @@ class Documents extends DolibarrApi } $upload_dir = $conf->expensereport->dir_output.'/'.dol_sanitizeFileName($object->ref); + } elseif ($modulepart == 'knowledgemanagement') { + require_once DOL_DOCUMENT_ROOT.'/knowledgemanagement/class/knowledgerecord.class.php'; + + if (!DolibarrApiAccess::$user->rights->knowledgemanagement->knowledgerecord->read && !DolibarrApiAccess::$user->rights->knowledgemanagement->knowledgerecord->read) { + throw new RestException(401); + } + + $object = new KnowledgeRecord($this->db); + $result = $object->fetch($id, $ref); + if (!$result) { + throw new RestException(404, 'Expense report not found'); + } + + $upload_dir = $conf->knowledgemanagement->dir_output.'/knowledgerecord/'.dol_sanitizeFileName($object->ref); } elseif ($modulepart == 'categorie' || $modulepart == 'category') { require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; From 0023850c9a6f37c31db33d95a018ea3ee8d55fb5 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 14 Apr 2022 22:16:17 +0200 Subject: [PATCH 134/738] Update api_documents.class.php --- htdocs/api/class/api_documents.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/api/class/api_documents.class.php b/htdocs/api/class/api_documents.class.php index d4e35e848ac..9bf7dd7c117 100644 --- a/htdocs/api/class/api_documents.class.php +++ b/htdocs/api/class/api_documents.class.php @@ -468,7 +468,7 @@ class Documents extends DolibarrApi $object = new KnowledgeRecord($this->db); $result = $object->fetch($id, $ref); if (!$result) { - throw new RestException(404, 'Expense report not found'); + throw new RestException(404, 'KM article not found'); } $upload_dir = $conf->knowledgemanagement->dir_output.'/knowledgerecord/'.dol_sanitizeFileName($object->ref); From 06f112d3ce5454cd428d7862bea2fdd7402d426e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 14 Apr 2022 22:43:43 +0200 Subject: [PATCH 135/738] Update main.inc.php --- htdocs/main.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index e66c9e9d313..dd8010dfa92 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -265,7 +265,7 @@ if (!empty($_POST["DOL_AUTOSET_COOKIE"])) { $cookiearrayvalue[$tmpkey] = $_POST[$postkey]; } } - $cookiename = ((empty($dolibarr_main_force_https) && isHTTPS() === false) ? $tmpautoset[0] : '__Secure-'.$tmpautoset[0]); // __Secure- || __Host- + $cookiename = $tmpautoset[0]; $cookievalue = json_encode($cookiearrayvalue); //var_dump('setcookie cookiename='.$cookiename.' cookievalue='.$cookievalue); if (PHP_VERSION_ID < 70300) { From 75d3b3527c148aa2e444f0ac70da2b2aaac7eb4c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 14 Apr 2022 22:45:56 +0200 Subject: [PATCH 136/738] Update main.inc.php --- htdocs/main.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index dd8010dfa92..3b5793a2cf1 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -297,7 +297,7 @@ if (!empty($php_session_save_handler) && $php_session_save_handler == 'db') { // Must be done after the include of filefunc.inc.php so global variables of conf file are defined (like $dolibarr_main_instance_unique_id or $dolibarr_main_force_https). // Note: the function dol_getprefix() is defined into functions.lib.php but may have been defined to return a different key to manage another area to protect. $prefix = dol_getprefix(''); -$sessionname = ((empty($dolibarr_main_force_https) && isHTTPS() === false) ? 'DOLSESSID_'.$prefix : '__Secure-DOLSESSID_'.$prefix); // __Secure- || __Host- +$sessionname = 'DOLSESSID_'.$prefix; $sessiontimeout = 'DOLSESSTIMEOUT_'.$prefix; if (!empty($_COOKIE[$sessiontimeout])) { ini_set('session.gc_maxlifetime', $_COOKIE[$sessiontimeout]); From b4fb6cf527e9499e5763075572d420014734cc8a Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Fri, 15 Apr 2022 09:13:41 +0200 Subject: [PATCH 137/738] fix: HTML on PRODUCT_LOT_ENABLE_QUALITY_CONTROL --- htdocs/product/card.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/htdocs/product/card.php b/htdocs/product/card.php index 420203eedae..98f264bb09e 100644 --- a/htdocs/product/card.php +++ b/htdocs/product/card.php @@ -1396,8 +1396,8 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { // Quality control if (!empty($conf->global->PRODUCT_LOT_ENABLE_QUALITY_CONTROL)) { - print ''.$langs->trans("LifeTime").''; - print ''.$langs->trans("QCFrequency").''; + print ''.$langs->trans("LifeTime").''; + print ''.$langs->trans("QCFrequency").''; } // Other attributes @@ -2443,19 +2443,19 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { // Custom code if (!$object->isService() && empty($conf->global->PRODUCT_DISABLE_CUSTOM_INFO)) { - print ''.$langs->trans("CustomCode").''.$object->customcode.''; + print ''.$langs->trans("CustomCode").''.$object->customcode.''; // Origin country code print ''.$langs->trans("Origin").''.getCountry($object->country_id, 0, $db); if (!empty($object->state_id)) { print ' - '.getState($object->state_id, 0, $db); } - print ''; + print ''; } // Quality Control if (!empty($conf->global->PRODUCT_LOT_ENABLE_QUALITY_CONTROL)) { - print ''.$langs->trans("LifeTime").''.$object->lifetime.''; + print ''.$langs->trans("LifeTime").''.$object->lifetime.''; print ''.$langs->trans("QCFrequency").''.$object->qc_frequency.''; } From 24bb6c6f8345b80fc49ef097d3a7f1dbd0103a3f Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Fri, 15 Apr 2022 10:20:52 +0200 Subject: [PATCH 138/738] fix: clean mess up around element_tag table --- htdocs/install/mysql/migration/14.0.0-15.0.0.sql | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/htdocs/install/mysql/migration/14.0.0-15.0.0.sql b/htdocs/install/mysql/migration/14.0.0-15.0.0.sql index ab037313dfb..c0d7a328e59 100644 --- a/htdocs/install/mysql/migration/14.0.0-15.0.0.sql +++ b/htdocs/install/mysql/migration/14.0.0-15.0.0.sql @@ -509,3 +509,16 @@ INSERT INTO llx_c_action_trigger (code,label,description,elementtype,rang) value -- VMYSQL4.3 ALTER TABLE llx_user MODIFY COLUMN fk_soc integer NULL; -- VPGSQL8.2 ALTER TABLE llx_user ALTER COLUMN fk_soc DROP NOT NULL; + +DROP TABLE IF EXISTS llx_element_tag; -- in migration 3.2.0 to 3.3.0 there is a element_tag table creation that is notin create table +CREATE TABLE llx_element_tag +( + rowid integer AUTO_INCREMENT PRIMARY KEY, + fk_categorie integer NOT NULL, + fk_element integer NOT NULL, + import_key varchar(14) +)ENGINE=innodb; + +ALTER TABLE llx_element_tag ADD UNIQUE INDEX idx_element_tag_uk (fk_categorie, fk_element); + +ALTER TABLE llx_element_tag ADD CONSTRAINT fk_element_tag_categorie_rowid FOREIGN KEY (fk_categorie) REFERENCES llx_categorie (rowid); From b8f602008892678d52094345fec22b43daf6995b Mon Sep 17 00:00:00 2001 From: BB2A Anthony Berton Date: Fri, 15 Apr 2022 10:35:36 +0200 Subject: [PATCH 139/738] Move checkbox column as first column on Thirdparty list --- htdocs/core/class/html.form.class.php | 17 ++++++++---- htdocs/societe/list.php | 38 ++++++++++++++------------- htdocs/theme/eldy/global.inc.php | 3 +++ 3 files changed, 35 insertions(+), 23 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index b9812d8eec3..679d3b388c6 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -8213,10 +8213,11 @@ class Form * @param string $htmlname Name of HTML field * @param array $array Array with array of fields we could show. This array may be modified according to setup of user. * @param string $varpage Id of context for page. Can be set by caller with $varpage=(empty($contextpage)?$_SERVER["PHP_SELF"]:$contextpage); + * @param string $pos position colon on liste value left or right * @return string HTML multiselect string * @see selectarray() */ - public static function multiSelectArrayWithCheckbox($htmlname, &$array, $varpage) + public static function multiSelectArrayWithCheckbox($htmlname, &$array, $varpage, $pos = '') { global $conf, $langs, $user, $extrafields; @@ -8283,7 +8284,7 @@ class Form
'."\n"; +$formcategory = new FormCategory($db); + +print load_fiche_titre($langs->trans("Other"), '', ''); +print ''; + +print ''; +print ''; +print ''; +print ''; +print "\n"; + +// Hide e-mail headers from collected messages +print ''; +print ''; +print ''; +print ''; + +print '
'.$langs->trans("Parameter").'
'.$langs->trans("EmailCollectorHideMailHeaders").''; +if ($conf->use_javascript_ajax) { + print ajax_constantonoff('MAIN_EMAILCOLLECTOR_MAIL_WITHOUT_HEADER'); +} else { + $arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes")); + print $formcategory->selectarray("MAIN_EMAILCOLLECTOR_MAIL_WITHOUT_HEADER", $arrval, $conf->global->TICKET_AUTO_READ_WHEN_CREATED_FROM_BACKEND); +} +print ''; +print $formcategory->textwithpicto('', $langs->trans("EmailCollectorHideMailHeadersHelp"), 1, 'help'); +print '

'; print ''."\n"; if (in_array('builddoc', $arrayofmassactions) && ($nbtotalofrecords === '' || $nbtotalofrecords)) { diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index a3473139638..fe555e7b699 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -2070,6 +2070,8 @@ ConfirmCloneEmailCollector=Are you sure you want to clone the Email collector %s DateLastCollectResult=Date of latest collect try DateLastcollectResultOk=Date of latest collect success LastResult=Latest result +EmailCollectorHideMailHeaders=Hide headers of collected e-mails +EmailCollectorHideMailHeadersHelp=When enabled, e-mail headers are ignored during the collection EmailCollectorConfirmCollectTitle=Email collect confirmation EmailCollectorConfirmCollect=Do you want to run this collector now? EmailCollectorExampleToCollectTicketRequestsDesc=Collect emails that match some rules and create automatically a ticket (Module Ticket must be enabled) with the email informations. You can use this collector if you provide some support by email, so your ticket request will be automatically generated. Activate also Collect_Responses to collect answers of your client directly on the ticket view (you must reply from Dolibarr). From aa36e396a3338451090dee16338699dcc91f6fc5 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Mon, 18 Apr 2022 22:23:44 +0000 Subject: [PATCH 172/738] Fixing style errors. --- htdocs/admin/ticket.php | 2 +- htdocs/core/modules/modTicket.class.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/admin/ticket.php b/htdocs/admin/ticket.php index 43f19047bf8..f257b040636 100644 --- a/htdocs/admin/ticket.php +++ b/htdocs/admin/ticket.php @@ -106,7 +106,7 @@ if ($action == 'updateMask') { $notification_email_description = "Sender of ticket replies sent from Dolibarr"; if (!empty($notification_email)) { $res = dolibarr_set_const($db, 'TICKET_NOTIFICATION_EMAIL_FROM', $notification_email, 'chaine', 0, $notification_email_description, $conf->entity); - } else { // If an empty e-mail address is providen, use the global "FROM" since an empty field will cause other issues + } else { // If an empty e-mail address is providen, use the global "FROM" since an empty field will cause other issues $res = dolibarr_set_const($db, 'TICKET_NOTIFICATION_EMAIL_FROM', $conf->global->MAIN_MAIL_EMAIL_FROM, 'chaine', 0, $notification_email_description, $conf->entity); } if (!($res > 0)) { diff --git a/htdocs/core/modules/modTicket.class.php b/htdocs/core/modules/modTicket.class.php index 483c5ff27cc..8fa132d4843 100644 --- a/htdocs/core/modules/modTicket.class.php +++ b/htdocs/core/modules/modTicket.class.php @@ -104,7 +104,7 @@ class modTicket extends DolibarrModules // List of particular constants to add when module is enabled // (key, 'chaine', value, desc, visible, 'current' or 'allentities', deleteonunactive) // Example: - $default_signature = $langs->trans('TicketMessageMailSignatureText', $conf->global->MAIN_INFO_SOCIETE_NOM); + $default_signature = $langs->trans('TicketMessageMailSignatureText', $conf->global->MAIN_INFO_SOCIETE_NOM); $this->const = array( 1 => array('TICKET_ENABLE_PUBLIC_INTERFACE', 'chaine', '0', 'Enable ticket public interface', 0), 2 => array('TICKET_ADDON', 'chaine', 'mod_ticket_simple', 'Ticket ref module', 0), From 68cfe61fb8fa8a72c8b5c10a4fb54fab2d8af1fd Mon Sep 17 00:00:00 2001 From: lvessiller Date: Tue, 19 Apr 2022 17:59:59 +0200 Subject: [PATCH 173/738] FIX get TAKEPOS_BARCODE_RULE_TO_INSERT_PRODUCE const in TakePos --- htdocs/takepos/admin/setup.php | 2 +- htdocs/takepos/ajax/ajax.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/takepos/admin/setup.php b/htdocs/takepos/admin/setup.php index e631776490a..849c5c56481 100644 --- a/htdocs/takepos/admin/setup.php +++ b/htdocs/takepos/admin/setup.php @@ -392,7 +392,7 @@ if (!empty($conf->barcode->enabled)) { print ''; print $form->textwithpicto($langs->trans("TakeposBarcodeRuleToInsertProduct"), $langs->trans("TakeposBarcodeRuleToInsertProductDesc")); print ''; - print ''; + print ''; print "\n"; } diff --git a/htdocs/takepos/ajax/ajax.php b/htdocs/takepos/ajax/ajax.php index a3bcc04b5c8..491a9754748 100644 --- a/htdocs/takepos/ajax/ajax.php +++ b/htdocs/takepos/ajax/ajax.php @@ -111,8 +111,8 @@ if ($action == 'getProducts') { } } - if (!empty($conf->barcode->enabled) && !empty($conf->global->TAKEPOS_BARCODE_RULE_TO_INSERT_PRODUCT)) { - $barcode_rules = $conf->global->TAKEPOS_BARCODE_RULE_TO_INSERT_PRODUCT; + $barcode_rules = getDolGlobalString('TAKEPOS_BARCODE_RULE_TO_INSERT_PRODUCT'); + if (!empty($conf->barcode->enabled) && !empty($barcode_rules)) { $barcode_rules_list = array(); // get barcode rules From aa86b2c71fc7b82f80d5173e7b6b31f2b12dd39e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 19 Apr 2022 22:26:27 +0200 Subject: [PATCH 174/738] Fix root passfield not editable on install Fix user photo when gravatar not reachable --- htdocs/admin/system/dolibarr.php | 3 ++- htdocs/core/class/html.form.class.php | 6 +++--- htdocs/install/fileconf.php | 3 ++- htdocs/langs/en_US/admin.lang | 3 ++- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/htdocs/admin/system/dolibarr.php b/htdocs/admin/system/dolibarr.php index d10e789f39c..e58cf45dd7e 100644 --- a/htdocs/admin/system/dolibarr.php +++ b/htdocs/admin/system/dolibarr.php @@ -435,7 +435,8 @@ foreach ($configfileparameters as $key => $value) { if (empty($valuetoshow)) { print img_warning("EditConfigFileToAddEntry", 'dolibarr_main_instance_unique_id'); } - print '   ('.$langs->trans("HashForPing").'='.md5('dolibarr'.$valuetoshow).')'; + print ''; + print '  => '.$langs->trans("HashForPing").''.md5('dolibarr'.$valuetoshow).''."\n"; } elseif ($newkey == 'dolibarr_main_prod') { print ${$newkey}; diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index d3e14b09c85..d656fbde897 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -9101,12 +9101,12 @@ class Form if (!empty($conf->gravatar->enabled) && $email && empty($noexternsourceoverwrite)) { // see https://gravatar.com/site/implement/images/php/ $ret .= ''; - $ret .= 'Gravatar avatar'; // gravatar need md5 hash + $ret .= ''; // gravatar need md5 hash } else { if ($nophoto == 'company') { - $ret .= '
'.img_picto('', 'company').'
'; + $ret .= '
'.img_picto('', 'company').'
'; } else { - $ret .= 'No photo'; + $ret .= ''; } } } diff --git a/htdocs/install/fileconf.php b/htdocs/install/fileconf.php index 42ea5e423af..03c5984d780 100644 --- a/htdocs/install/fileconf.php +++ b/htdocs/install/fileconf.php @@ -613,12 +613,13 @@ jQuery(document).ready(function() { function init_needroot() { + console.log("init_needroot force_install_noedit="); /*alert(jQuery("#db_create_database").prop("checked")); */ if (jQuery("#db_create_database").is(":checked") || jQuery("#db_create_user").is(":checked")) { jQuery(".hideroot").show(); + if (empty($force_install_noedit)) { ?> jQuery(".needroot").removeAttr('disabled'); } diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 5af3fe19592..84df64fe655 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -2219,4 +2219,5 @@ EachTerminalHasItsOwnCounter=Each terminal use its own counter. FillAndSaveAccountIdAndSecret=Fill and save account ID and secret first PreviousHash=Previous hash LateWarningAfter="Late" warning after -TemplateforBusinessCards=Template for a business card in different size \ No newline at end of file +TemplateforBusinessCards=Template for a business card in different size +HashForPing=Hash used for ping From 1e96cd636f81935b452cc5e40a7814e93bdc5d40 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Tue, 19 Apr 2022 22:38:42 +0200 Subject: [PATCH 175/738] FIX Accountancy - Missing language key --- htdocs/langs/en_US/accountancy.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/langs/en_US/accountancy.lang b/htdocs/langs/en_US/accountancy.lang index fd5ff8461fe..c66e0295bfa 100644 --- a/htdocs/langs/en_US/accountancy.lang +++ b/htdocs/langs/en_US/accountancy.lang @@ -302,6 +302,7 @@ NotYetAccounted=Not yet transferred to accounting ShowTutorial=Show Tutorial NotReconciled=Not reconciled WarningRecordWithoutSubledgerAreExcluded=Warning, all lines without subledger account defined are filtered and excluded from this view +AccountRemovedFromCurrentChartOfAccount=Accounting account that does not exist in the current chart of accounts ## Admin BindingOptions=Binding options From 307476786cc33f94447e78db3c58882f47523185 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 19 Apr 2022 23:24:08 +0200 Subject: [PATCH 176/738] Fix label of remain to pay on vendor invoices FIX tool to fix bank account not in main currency for vendor invoice --- htdocs/compta/bank/card.php | 8 +++--- htdocs/fourn/facture/card.php | 30 ++++++++++------------- htdocs/install/mysql/migration/repair.sql | 3 +++ htdocs/langs/en_US/withdrawals.lang | 4 ++- 4 files changed, 23 insertions(+), 22 deletions(-) diff --git a/htdocs/compta/bank/card.php b/htdocs/compta/bank/card.php index 283258a08a0..9211fa71b9e 100644 --- a/htdocs/compta/bank/card.php +++ b/htdocs/compta/bank/card.php @@ -769,13 +769,13 @@ if ($action == 'create') { print ''; if ($conf->prelevement->enabled) { - print ''.$langs->trans("ICS").' ('.$langs->trans("StandingOrder").')'; + print ''.$form->textwithpicto($langs->trans("ICS"), $langs->trans("ICS").' ('.$langs->trans("UsedFor", $langs->transnoentitiesnoconv("StandingOrder")).')').''; print ''.$object->ics.''; print ''; } if ($conf->paymentbybanktransfer->enabled) { - print ''.$langs->trans("ICS").' ('.$langs->trans("BankTransfer").')'; + print ''.$form->textwithpicto($langs->trans("IDS"), $langs->trans("IDS").' ('.$langs->trans("UsedFor", $langs->transnoentitiesnoconv("BankTransfer")).')').''; print ''.$object->ics_transfer.''; print ''; } @@ -1068,12 +1068,12 @@ if ($action == 'create') { print ''; if ($conf->prelevement->enabled) { - print ''.$langs->trans("ICS").' ('.$langs->trans("StandingOrder").')'; + print ''.$form->textwithpicto($langs->trans("ICS"), $langs->trans("ICS").' ('.$langs->trans("UsedFor", $langs->transnoentitiesnoconv("StandingOrder")).')').''; print ''; } if ($conf->paymentbybanktransfer->enabled) { - print ''.$langs->trans("ICS").' ('.$langs->trans("BankTransfer").')'; + print ''.$form->textwithpicto($langs->trans("IDS"), $langs->trans("IDS").' ('.$langs->trans("UsedFor", $langs->transnoentitiesnoconv("BankTransfer")).')').''; print ''; } diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php index 5a9b1054773..71c7a4beaf5 100644 --- a/htdocs/fourn/facture/card.php +++ b/htdocs/fourn/facture/card.php @@ -1846,7 +1846,7 @@ if ($action == 'create') { $currency_code = $conf->currency; $societe = ''; - if (GETPOST('socid') > 0) { + if (GETPOST('socid', 'int') > 0) { $societe = new Societe($db); $societe->fetch(GETPOST('socid', 'int')); if (!empty($conf->multicurrency->enabled) && !empty($societe->multicurrency_code)) { @@ -3285,10 +3285,9 @@ if ($action == 'create') { // Remainder to pay print ''; print ''; - if ($resteapayeraffiche >= 0) { - print $langs->trans('RemainderToPay'); - } else { - print $langs->trans('ExcessPaid'); + print $langs->trans('RemainderToPay'); + if ($resteapayeraffiche < 0) { + print ' ('.$langs->trans('NegativeIfExcessPaid').')'; } print ''; print ''; @@ -3298,10 +3297,9 @@ if ($action == 'create') { if ($object->multicurrency_code != $conf->currency || $object->multicurrency_tx != 1) { print ''; print ''; - if ($resteapayeraffiche <= 0) { - print $langs->trans('RemainderToPayBackMulticurrency'); - } else { - print $langs->trans('ExcessPaidMulticurrency'); + print $langs->trans('RemainderToPayMulticurrency'); + if ($resteapayeraffiche < 0) { + print ' ('.$langs->trans('NegativeIfExcessPaid').')'; } print ''; print ''; @@ -3322,10 +3320,9 @@ if ($action == 'create') { // Remainder to pay back print ''; print ''; - if ($resteapayeraffiche <= 0) { - print $langs->trans('RemainderToPayBack'); - } else { - print $langs->trans('ExcessPaid'); + print $langs->trans('RemainderToPayBack'); + if ($resteapayeraffiche > 0) { + print ' ('.$langs->trans('NegativeIfExcessRefunded').')'; } print ''; print ''; @@ -3335,10 +3332,9 @@ if ($action == 'create') { if ($object->multicurrency_code != $conf->currency || $object->multicurrency_tx != 1) { print ''; print ''; - if ($resteapayeraffiche <= 0) { - print $langs->trans('RemainderToPayBackMulticurrency'); - } else { - print $langs->trans('ExcessPaidMulticurrency'); + print $langs->trans('RemainderToPayBackMulticurrency'); + if ($resteapayeraffiche> 0) { + print ' ('.$langs->trans('NegativeIfExcessRefunded').')'; } print ''; print ''; diff --git a/htdocs/install/mysql/migration/repair.sql b/htdocs/install/mysql/migration/repair.sql index 070f3a2c5da..2e7f42a2727 100644 --- a/htdocs/install/mysql/migration/repair.sql +++ b/htdocs/install/mysql/migration/repair.sql @@ -562,3 +562,6 @@ DELETE FROM llx_rights_def WHERE module = 'hrm' AND perms = 'employee'; -- DROP TABLE tmp_bank; -- CREATE TABLE tmp_bank SELECT b.rowid, b.amount, p.rowid as pid, p.amount as pamount, p.multicurrency_amount as pmulticurrencyamount FROM llx_bank as b INNER JOIN llx_bank_url as bu ON bu.fk_bank=b.rowid AND bu.type = 'payment' INNER JOIN llx_paiement as p ON bu.url_id = p.rowid WHERE p.multicurrency_amount <> 0 AND p.multicurrency_amount <> p.amount; -- UPDATE llx_bank as b SET b.amount_main_currency = (SELECT tb.pamount FROM tmp_bank as tb WHERE tb.rowid = b.rowid) WHERE b.amount_main_currency IS NULL; +-- DROP TABLE tmp_bank2; +-- CREATE TABLE tmp_bank2 SELECT b.rowid, b.amount, p.rowid as pid, p.amount as pamount, p.multicurrency_amount as pmulticurrencyamount FROM llx_bank as b INNER JOIN llx_bank_url as bu ON bu.fk_bank=b.rowid AND bu.type = 'payment_supplier' INNER JOIN llx_paiementfourn as p ON bu.url_id = p.rowid WHERE p.multicurrency_amount <> 0 AND p.multicurrency_amount <> p.amount; +-- UPDATE llx_bank as b SET b.amount_main_currency = (SELECT tb.pamount FROM tmp_bank2 as tb WHERE tb.rowid = b.rowid) WHERE b.amount_main_currency IS NULL; diff --git a/htdocs/langs/en_US/withdrawals.lang b/htdocs/langs/en_US/withdrawals.lang index 9d145ef354d..75cee952bcd 100644 --- a/htdocs/langs/en_US/withdrawals.lang +++ b/htdocs/langs/en_US/withdrawals.lang @@ -137,6 +137,7 @@ SEPAFRST=SEPA FRST ExecutionDate=Execution date CreateForSepa=Create direct debit file ICS=Creditor Identifier - ICS +IDS=Debitor Identifier END_TO_END="EndToEndId" SEPA XML tag - Unique id assigned per transaction USTRD="Unstructured" SEPA XML tag ADDDAYS=Add days to Execution Date @@ -154,4 +155,5 @@ ErrorCompanyHasDuplicateDefaultBAN=Company with id %s has more than one default ErrorICSmissing=Missing ICS in Bank account %s TotalAmountOfdirectDebitOrderDiffersFromSumOfLines=Total amount of direct debit order differs from sum of lines WarningSomeDirectDebitOrdersAlreadyExists=Warning: There is already some pending Direct Debit orders (%s) requested for an amount of %s -WarningSomeCreditTransferAlreadyExists=Warning: There is already some pending Credit Transfer (%s) requested for an amount of %s \ No newline at end of file +WarningSomeCreditTransferAlreadyExists=Warning: There is already some pending Credit Transfer (%s) requested for an amount of %s +UsedFor=Used for %s \ No newline at end of file From ad7fcd264b15b467c75719add855bbd51934fc32 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 19 Apr 2022 23:39:09 +0200 Subject: [PATCH 177/738] FIX Tabulation must be allowed for HTML content --- htdocs/main.inc.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 9d96eb63a27..1d09b9f9887 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -108,10 +108,11 @@ function testSqlAndScriptInject($val, $type) // We check string because some hacks try to obfuscate evil strings by inserting non printable chars. Example: 'java(ascci09)scr(ascii00)ipt' is processed like 'javascript' (whatever is place of evil ascii char) // We should use dol_string_nounprintableascii but function is not yet loaded/available // Example of valid UTF8 chars: - // utf8=utf8mb3: '\x0A', '\x0D', '\x7E' + // utf8=utf8mb3: '\x09', '\x0A', '\x0D', '\x7E' // utf8=utf8mb3: '\xE0\xA0\x80' // utf8mb4: '\xF0\x9D\x84\x9E' (but this may be refused by the database insert if pagecode is utf8=utf8mb3) - $newval = preg_replace('/[\x00-\x09\x0B-\x0C\x0E-\x1F\x7F]/u', '', $val); // /u operator makes UTF8 valid characters being ignored so are not included into the replace + $newval = preg_replace('/[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F]/u', '', $val); // /u operator makes UTF8 valid characters being ignored so are not included into the replace + // Note that $newval may also be completely empty '' when non valid UTF8 are found. if ($newval != $val) { // If $val has changed after removing non valid UTF8 chars, it means we have an evil string. From 0faec59f56c5c72e54146fe3c773610be16717fe Mon Sep 17 00:00:00 2001 From: melina Date: Wed, 20 Apr 2022 08:13:01 +0200 Subject: [PATCH 178/738] FIX conflict and integrate Lionel fix --- htdocs/takepos/ajax/ajax.php | 133 ++++++++++++++++++++++++++++++++--- 1 file changed, 125 insertions(+), 8 deletions(-) diff --git a/htdocs/takepos/ajax/ajax.php b/htdocs/takepos/ajax/ajax.php index ab4c9af2904..3ec334bd703 100644 --- a/htdocs/takepos/ajax/ajax.php +++ b/htdocs/takepos/ajax/ajax.php @@ -53,6 +53,8 @@ if (empty($user->rights->takepos->run)) { accessforbidden(); } +// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array of hooks +$hookmanager->initHooks(array('takeposproductsearch')); /* * View @@ -70,9 +72,10 @@ if ($action == 'getProducts') { $res = array(); if (is_array($prods) && count($prods) > 0) { foreach ($prods as $prod) { - if ($conf->global->TAKEPOS_PRODUCT_IN_STOCK == 1) { + if (getDolGlobalInt('TAKEPOS_PRODUCT_IN_STOCK') == 1) { + // remove products without stock $prod->load_stock('nobatch,novirtual'); - if ($prod->stock_warehouse[$conf->global->{'CASHDESK_ID_WAREHOUSE'.$_SESSION['takeposterminal']}]->real <= 0) { + if ($prod->stock_warehouse[getDolGlobalString('CASHDESK_ID_WAREHOUSE'.$_SESSION['takeposterminal'])]->real <= 0) { continue; } } @@ -117,25 +120,138 @@ if ($action == 'getProducts') { } } - $sql = 'SELECT p.rowid, p.ref, p.label, p.tosell, p.tobuy, p.barcode, p.price '; - if ($conf->global->TAKEPOS_PRODUCT_IN_STOCK == 1) { + $barcode_rules = getDolGlobalString('TAKEPOS_BARCODE_RULE_TO_INSERT_PRODUCT'); + if (!empty($conf->barcode->enabled) && !empty($barcode_rules)) { + $barcode_rules_list = array(); + + // get barcode rules + $barcode_char_nb = 0; + $barcode_rules_arr = explode('+', $barcode_rules); + foreach ($barcode_rules_arr as $barcode_rules_values) { + $barcode_rules_values_arr = explode(':', $barcode_rules_values); + if (count($barcode_rules_values_arr) == 2) { + $char_nb = intval($barcode_rules_values_arr[1]); + $barcode_rules_list[] = array('code' => $barcode_rules_values_arr[0], 'char_nb' => $char_nb); + $barcode_char_nb += $char_nb; + } + } + + $barcode_value_list = array(); + $barcode_offset = 0; + $barcode_length = dol_strlen($term); + if ($barcode_length == $barcode_char_nb) { + $rows = array(); + + // split term with barcode rules + foreach ($barcode_rules_list as $barcode_rule_arr) { + $code = $barcode_rule_arr['code']; + $char_nb = $barcode_rule_arr['char_nb']; + $barcode_value_list[$code] = substr($term, $barcode_offset, $char_nb); + $barcode_offset += $char_nb; + } + + if (isset($barcode_value_list['ref'])) { + // search product from reference + $sql = "SELECT rowid, ref, label, tosell, tobuy, barcode, price"; + $sql .= " FROM " . $db->prefix() . "product as p"; + $sql .= " WHERE entity IN (" . getEntity('product') . ")"; + $sql .= " AND ref = '" . $db->escape($barcode_value_list['ref']) . "'"; + if ($filteroncategids) { + $sql .= " AND EXISTS (SELECT cp.fk_product FROM " . $db->prefix() . "categorie_product as cp WHERE cp.fk_product = p.rowid AND cp.fk_categorie IN (".$db->sanitize($filteroncategids)."))"; + } + $sql .= " AND tosell = 1"; + $sql .= " AND (barcode IS NULL OR barcode != '" . $db->escape($term) . "')"; + + $resql = $db->query($sql); + if ($resql && $db->num_rows($resql) == 1) { + if ($obj = $db->fetch_object($resql)) { + $qty = 1; + if (isset($barcode_value_list['qu'])) { + $qty_str = $barcode_value_list['qu']; + if (isset($barcode_value_list['qd'])) { + $qty_str .= '.' . $barcode_value_list['qd']; + } + $qty = floatval($qty_str); + } + + $ig = '../public/theme/common/nophoto.png'; + if (empty($conf->global->TAKEPOS_HIDE_PRODUCT_IMAGES)) { + $objProd = new Product($db); + $objProd->fetch($obj->rowid); + $image = $objProd->show_photos('product', $conf->product->multidir_output[$objProd->entity], 'small', 1); + + $match = array(); + preg_match('@src="([^"]+)"@', $image, $match); + $file = array_pop($match); + + if ($file != '') { + if (!defined('INCLUDE_PHONEPAGE_FROM_PUBLIC_PAGE')) { + $ig = $file.'&cache=1'; + } else { + $ig = $file.'&cache=1&publictakepos=1&modulepart=product'; + } + } + } + + $rows[] = array( + 'rowid' => $obj->rowid, + 'ref' => $obj->ref, + 'label' => $obj->label, + 'tosell' => $obj->tosell, + 'tobuy' => $obj->tobuy, + 'barcode' => $obj->barcode, + 'price' => $obj->price, + 'object' => 'product', + 'img' => $ig, + 'qty' => $qty, + ); + } + $db->free($resql); + } + } + + if (count($rows) == 1) { + echo json_encode($rows); + exit(); + } + } + } + + $sql = 'SELECT rowid, ref, label, tosell, tobuy, barcode, price' ; + if (getDolGlobalInt('TAKEPOS_PRODUCT_IN_STOCK') == 1) { $sql .= ', ps.reel'; } + // Add fields from hooks + $parameters=array(); + $reshook=$hookmanager->executeHooks('printFieldListSelect', $parameters); // Note that $action and $object may have been modified by hook + $sql .= $hookmanager->resPrint; + $sql .= ' FROM '.MAIN_DB_PREFIX.'product as p'; - if ($conf->global->TAKEPOS_PRODUCT_IN_STOCK == 1) { + if (getDolGlobalInt('TAKEPOS_PRODUCT_IN_STOCK') == 1) { $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'product_stock as ps'; $sql .= ' ON (p.rowid = ps.fk_product'; $sql .= " AND ps.fk_entrepot = ".((int) getDolGlobalInt("CASHDESK_ID_WAREHOUSE".$_SESSION['takeposterminal'])); } + + // Add tables from hooks + $parameters=array(); + $reshook=$hookmanager->executeHooks('printFieldListTables', $parameters); // Note that $action and $object may have been modified by hook + $sql .= $hookmanager->resPrint; + $sql .= ' WHERE entity IN ('.getEntity('product').')'; if ($filteroncategids) { $sql .= ' AND EXISTS (SELECT cp.fk_product FROM '.MAIN_DB_PREFIX.'categorie_product as cp WHERE cp.fk_product = p.rowid AND cp.fk_categorie IN ('.$db->sanitize($filteroncategids).'))'; } - $sql .= ' AND p.tosell = 1'; - if ($conf->global->TAKEPOS_PRODUCT_IN_STOCK == 1) { + $sql .= ' AND tosell = 1'; + if (getDolGlobalInt('TAKEPOS_PRODUCT_IN_STOCK') == 1) { $sql .= ' AND ps.reel > 0'; } - $sql .= natural_search(array('p.ref', 'p.label', 'p.barcode'), $term); + $sql .= natural_search(array('ref', 'label', 'barcode'), $term); + // Add where from hooks + $parameters=array(); + $reshook=$hookmanager->executeHooks('printFieldListWhere', $parameters); // Note that $action and $object may have been modified by hook + $sql .= $hookmanager->resPrint; + $resql = $db->query($sql); if ($resql) { $rows = array(); @@ -168,6 +284,7 @@ if ($action == 'getProducts') { 'price' => $obj->price, 'object' => 'product', 'img' => $ig, + 'qty' => 1, //'price_formated' => price(price2num($obj->price, 'MU'), 1, $langs, 1, -1, -1, $conf->currency) ); } From 6788cd179c82725397922347c40f9347e0a1e931 Mon Sep 17 00:00:00 2001 From: melina Date: Wed, 20 Apr 2022 12:01:17 +0200 Subject: [PATCH 179/738] Add hooks completeAjaxReturnArray --- htdocs/takepos/ajax/ajax.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/htdocs/takepos/ajax/ajax.php b/htdocs/takepos/ajax/ajax.php index a3bcc04b5c8..5f30b8599b3 100644 --- a/htdocs/takepos/ajax/ajax.php +++ b/htdocs/takepos/ajax/ajax.php @@ -267,6 +267,11 @@ if ($action == 'getProducts') { 'qty' => 1, //'price_formated' => price(price2num($obj->price, 'MU'), 1, $langs, 1, -1, -1, $conf->currency) ); + // Add entries to row from hooks + $parameters=array(); + $parameters['row'] = end($rows); + $parameters['obj'] = $obj; + $reshook=$hookmanager->executeHooks('completeAjaxReturnArray', $parameters); } echo json_encode($rows); } else { From c23ed7c47b016d386f8df3c456371d4baebaa2a7 Mon Sep 17 00:00:00 2001 From: melina Date: Wed, 20 Apr 2022 14:47:36 +0200 Subject: [PATCH 180/738] Add hooks completeJSProductDisplay --- htdocs/takepos/index.php | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/htdocs/takepos/index.php b/htdocs/takepos/index.php index b23907b64f1..d64c497d05f 100644 --- a/htdocs/takepos/index.php +++ b/htdocs/takepos/index.php @@ -360,7 +360,13 @@ function LoadProducts(position, issubcat) { $("#prodiv"+ishow).data("iscat", 0); $("#prodiv"+ishow).attr("class","wrapper2"); $("#prowatermark"+ishow).hide(); - ishow++; //Next product to show after print data product + executeHooks('completeJSProductDisplay', $parameters); + print $hookmanager->resPrint; + ?> } //console.log("Hide the prowatermark for ishow="+ishow); idata++; //Next data everytime @@ -615,6 +621,13 @@ function Search2(keyCodeForEnter) { } $("#prodiv" + i).data("rowid", data[i]['rowid']); $("#prodiv" + i).data("iscat", 0); + executeHooks('completeJSProductDisplay', $parameters); + print $hookmanager->resPrint; + ?> } }).always(function (data) { // If there is only 1 answer From db3edba5784180e1472557d27930e798e4f80412 Mon Sep 17 00:00:00 2001 From: melina Date: Wed, 20 Apr 2022 14:51:55 +0200 Subject: [PATCH 181/738] Delete comments --- htdocs/takepos/ajax/ajax.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/takepos/ajax/ajax.php b/htdocs/takepos/ajax/ajax.php index 5f30b8599b3..9afde9ba341 100644 --- a/htdocs/takepos/ajax/ajax.php +++ b/htdocs/takepos/ajax/ajax.php @@ -211,14 +211,14 @@ if ($action == 'getProducts') { $sql = 'SELECT rowid, ref, label, tosell, tobuy, barcode, price' ; // Add fields from hooks $parameters=array(); - $reshook=$hookmanager->executeHooks('printFieldListSelect', $parameters); // Note that $action and $object may have been modified by hook + $reshook=$hookmanager->executeHooks('printFieldListSelect', $parameters); $sql .= $hookmanager->resPrint; $sql .= ' FROM '.MAIN_DB_PREFIX.'product as p'; // Add tables from hooks $parameters=array(); - $reshook=$hookmanager->executeHooks('printFieldListTables', $parameters); // Note that $action and $object may have been modified by hook + $reshook=$hookmanager->executeHooks('printFieldListTables', $parameters); $sql .= $hookmanager->resPrint; $sql .= ' WHERE entity IN ('.getEntity('product').')'; @@ -229,7 +229,7 @@ if ($action == 'getProducts') { $sql .= natural_search(array('ref', 'label', 'barcode'), $term); // Add where from hooks $parameters=array(); - $reshook=$hookmanager->executeHooks('printFieldListWhere', $parameters); // Note that $action and $object may have been modified by hook + $reshook=$hookmanager->executeHooks('printFieldListWhere', $parameters); $sql .= $hookmanager->resPrint; $resql = $db->query($sql); From 6e8ba543ded0790237a09a85ca5fcdf16c2c0156 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Wed, 20 Apr 2022 13:33:22 +0000 Subject: [PATCH 182/738] Fixing style errors. --- htdocs/takepos/ajax/ajax.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/takepos/ajax/ajax.php b/htdocs/takepos/ajax/ajax.php index 9afde9ba341..f794ac0584a 100644 --- a/htdocs/takepos/ajax/ajax.php +++ b/htdocs/takepos/ajax/ajax.php @@ -218,7 +218,7 @@ if ($action == 'getProducts') { // Add tables from hooks $parameters=array(); - $reshook=$hookmanager->executeHooks('printFieldListTables', $parameters); + $reshook=$hookmanager->executeHooks('printFieldListTables', $parameters); $sql .= $hookmanager->resPrint; $sql .= ' WHERE entity IN ('.getEntity('product').')'; @@ -229,7 +229,7 @@ if ($action == 'getProducts') { $sql .= natural_search(array('ref', 'label', 'barcode'), $term); // Add where from hooks $parameters=array(); - $reshook=$hookmanager->executeHooks('printFieldListWhere', $parameters); + $reshook=$hookmanager->executeHooks('printFieldListWhere', $parameters); $sql .= $hookmanager->resPrint; $resql = $db->query($sql); From 5cb114df610024dc3de0b95452535e51bc6537cb Mon Sep 17 00:00:00 2001 From: melina Date: Wed, 20 Apr 2022 17:46:16 +0200 Subject: [PATCH 183/738] fix empty search --- htdocs/takepos/index.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/htdocs/takepos/index.php b/htdocs/takepos/index.php index b23907b64f1..0bfdbc84b29 100644 --- a/htdocs/takepos/index.php +++ b/htdocs/takepos/index.php @@ -557,6 +557,18 @@ function New() { * return {void} */ function Search2(keyCodeForEnter) { + if ($('#search').val() == '') { + $("[id^=prowatermark]").html(""); + $("[id^=prodesc]").text(""); + $("[id^=probutton]").text(""); + $("[id^=probutton]").hide(); + $("[id^=proprice]").attr("class", "hidden"); + $("[id^=proprice]").html(""); + $("[id^=proimg]").attr("src", "genimg/empty.png"); + $("[id^=prodiv]").data("rowid", ""); + return; + } + console.log("Search2 Call ajax search to replace products keyCodeForEnter="+keyCodeForEnter); var search = false; @@ -579,6 +591,7 @@ function Search2(keyCodeForEnter) { $.getJSON('/takepos/ajax/ajax.php?action=search&term=' + $('#search').val(), function (data) { for (i = 0; i < ; i++) { if (typeof (data[i]) == "undefined") { + $("#prowatermark" + i).html(""); $("#prodesc" + i).text(""); $("#probutton" + i).text(""); $("#probutton" + i).hide(); From d9521d40e4b3dd26dcb866f8fc76dc4d679cf5ff Mon Sep 17 00:00:00 2001 From: fred1201 Date: Thu, 21 Apr 2022 07:39:51 +0200 Subject: [PATCH 184/738] Update index.php MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace call function text( ) by html() to fix display in take post when spécial caracter are store in database: éèà become éàè --- htdocs/takepos/index.php | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/htdocs/takepos/index.php b/htdocs/takepos/index.php index b23907b64f1..c0045fc67d8 100644 --- a/htdocs/takepos/index.php +++ b/htdocs/takepos/index.php @@ -232,7 +232,7 @@ function PrintCategories(first) { continue; } $("#catdivdesc"+i).show(); - $("#catdesc"+i).text(categories[parseInt(i)+parseInt(first)]['label']); + $("#catdesc"+i).html(categories[parseInt(i)+parseInt(first)]['label']); $("#catimg"+i).attr("src","genimg/index.php?query=cat&id="+categories[parseInt(i)+parseInt(first)]['rowid']); $("#catdiv"+i).data("rowid",categories[parseInt(i)+parseInt(first)]['rowid']); $("#catdiv"+i).attr('class', 'wrapper'); @@ -266,7 +266,7 @@ function MoreCategories(moreorless) { continue; } $("#catdivdesc"+i).show(); - $("#catdesc"+i).text(categories[i+( * pagecategories)]['label']); + $("#catdesc"+i).html(categories[i+( * pagecategories)]['label']); $("#catimg"+i).attr("src","genimg/index.php?query=cat&id="+categories[i+( * pagecategories)]['rowid']); $("#catdiv"+i).data("rowid",categories[i+( * pagecategories)]['rowid']); $("#catwatermark"+i).show(); @@ -295,8 +295,8 @@ function LoadProducts(position, issubcat) { jQuery.each(subcategories, function(i, val) { if (currentcat==val.fk_parent) { $("#prodivdesc"+ishow).show(); - $("#prodesc"+ishow).text(val.label); - $("#probutton"+ishow).text(val.label); + $("#prodesc"+ishow).html(val.label); + $("#probutton"+ishow).html(val.label); $("#probutton"+ishow).show(); $("#proprice"+ishow).attr("class", "hidden"); $("#proprice"+ishow).html(""); @@ -343,13 +343,13 @@ function LoadProducts(position, issubcat) { if (getDolGlobalInt('TAKEPOS_SHOW_PRODUCT_REFERENCE') == 1) { echo '$("#prodesc"+ishow).html(data[parseInt(idata)][\'ref\'].bold() + \' - \' + data[parseInt(idata)][\'label\']);'; } else { - echo '$("#prodesc"+ishow).text(data[parseInt(idata)][\'label\']);'; + echo '$("#prodesc"+ishow).html(data[parseInt(idata)][\'label\']);'; } echo '$("#proimg"+ishow).attr("title", titlestring);'; echo '$("#proimg"+ishow).attr("src", "genimg/index.php?query=pro&id="+data[idata][\'id\']);'; } else { echo '$("#probutton"+ishow).show();'; - echo '$("#probutton"+ishow).text(data[parseInt(idata)][\'label\']);'; + echo '$("#probutton"+ishow).html(data[parseInt(idata)][\'label\']);'; } ?> if (data[parseInt(idata)]['price_formated']) { @@ -414,9 +414,9 @@ function MoreProducts(moreorless) { if (getDolGlobalInt('TAKEPOS_SHOW_PRODUCT_REFERENCE') == 1) { ?> $("#prodesc"+ishow).html(data[parseInt(idata)]['ref'].bold() + ' - ' + data[parseInt(idata)]['label']); - $("#prodesc"+ishow).text(data[parseInt(idata)]['label']); + $("#prodesc"+ishow).html(data[parseInt(idata)]['label']); - $("#probutton"+ishow).text(data[parseInt(idata)]['label']); + $("#probutton"+ishow).html(data[parseInt(idata)]['label']); $("#probutton"+ishow).show(); if (data[parseInt(idata)]['price_formated']) { $("#proprice"+ishow).attr("class", "productprice"); @@ -597,10 +597,10 @@ function Search2(keyCodeForEnter) { if (getDolGlobalInt('TAKEPOS_SHOW_PRODUCT_REFERENCE') == 1) { ?> $("#prodesc" + i).html(data[i]['ref'].bold() + ' - ' + data[i]['label']); - $("#prodesc" + i).text(data[i]['label']); + $("#prodesc" + i).html(data[i]['label']); $("#prodivdesc" + i).show(); - $("#probutton" + i).text(data[i]['label']); + $("#probutton" + i).html(data[i]['label']); $("#probutton" + i).show(); if (data[i]['price_formated']) { $("#proprice" + i).attr("class", "productprice"); From 731d85130c702fc9414490a1784e65d9eda3ba7e Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Thu, 21 Apr 2022 09:49:00 +0200 Subject: [PATCH 185/738] FIX missing hook parameter --- htdocs/core/class/html.form.class.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index d656fbde897..6a7bd9a688f 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -8404,7 +8404,7 @@ class Form public function showLinkToObjectBlock($object, $restrictlinksto = array(), $excludelinksto = array()) { global $conf, $langs, $hookmanager; - global $bc, $action; + global $action; $linktoelem = ''; $linktoelemlist = ''; @@ -8450,11 +8450,10 @@ class Form ); } - // Can complete the possiblelink array - $hookmanager->initHooks(array('commonobject')); - $parameters = array('listofidcompanytoscan' => $listofidcompanytoscan); - if (!empty($listofidcompanytoscan)) { // If empty, we don't have criteria to scan the object we can link to + // Can complete the possiblelink array + $hookmanager->initHooks(array('commonobject')); + $parameters = array('listofidcompanytoscan' => $listofidcompanytoscan, 'possiblelinks' => $possiblelinks); $reshook = $hookmanager->executeHooks('showLinkToObjectBlock', $parameters, $object, $action); // Note that $action and $object may have been modified by hook } From 8878eb6d76445653bac28817006877d5d163f237 Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Thu, 21 Apr 2022 14:52:06 +0200 Subject: [PATCH 186/738] FIX compatibility with multicompany sharings --- htdocs/core/modules/project/mod_project_simple.php | 6 +++--- htdocs/core/modules/project/mod_project_universal.php | 7 +++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/htdocs/core/modules/project/mod_project_simple.php b/htdocs/core/modules/project/mod_project_simple.php index b1dbe4bae48..921b68f492b 100644 --- a/htdocs/core/modules/project/mod_project_simple.php +++ b/htdocs/core/modules/project/mod_project_simple.php @@ -125,14 +125,14 @@ class mod_project_simple extends ModeleNumRefProjects */ public function getNextValue($objsoc, $project) { - global $db, $conf; + global $db; // First, we get the max value $posindice = strlen($this->prefix) + 6; $sql = "SELECT MAX(CAST(SUBSTRING(ref FROM ".$posindice.") AS SIGNED)) as max"; $sql .= " FROM ".MAIN_DB_PREFIX."projet"; $sql .= " WHERE ref LIKE '".$db->escape($this->prefix)."____-%'"; - $sql .= " AND entity = ".$conf->entity; + $sql .= " AND entity IN (".getEntity('projectnumber', 1, $project).")"; $resql = $db->query($sql); if ($resql) { @@ -147,7 +147,7 @@ class mod_project_simple extends ModeleNumRefProjects return -1; } - $date = empty($project->date_c) ?dol_now() : $project->date_c; + $date = (empty($project->date_c) ? dol_now() : $project->date_c); //$yymm = strftime("%y%m",time()); $yymm = strftime("%y%m", $date); diff --git a/htdocs/core/modules/project/mod_project_universal.php b/htdocs/core/modules/project/mod_project_universal.php index 550d72c4f68..47fd83842ed 100644 --- a/htdocs/core/modules/project/mod_project_universal.php +++ b/htdocs/core/modules/project/mod_project_universal.php @@ -136,8 +136,11 @@ class mod_project_universal extends ModeleNumRefProjects return 0; } - $date = empty($project->date_c) ?dol_now() : $project->date_c; - $numFinal = get_next_value($db, $mask, 'projet', 'ref', '', (is_object($objsoc) ? $objsoc->code_client : ''), $date); + // Get entities + $entity = getEntity('projectnumber', 1, $project); + + $date = (empty($project->date_c) ? dol_now() : $project->date_c); + $numFinal = get_next_value($db, $mask, 'projet', 'ref', '', (is_object($objsoc) ? $objsoc : ''), $date, 'next', false, null, $entity); return $numFinal; } From 2a5c54d4e4deb51439531e8561e5b151e84789e0 Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Thu, 21 Apr 2022 16:02:41 +0200 Subject: [PATCH 187/738] FIX compatibility for ticket number sharing --- htdocs/core/modules/ticket/mod_ticket_simple.php | 2 +- htdocs/core/modules/ticket/mod_ticket_universal.php | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/ticket/mod_ticket_simple.php b/htdocs/core/modules/ticket/mod_ticket_simple.php index 523da47191d..76d8e4f8d79 100644 --- a/htdocs/core/modules/ticket/mod_ticket_simple.php +++ b/htdocs/core/modules/ticket/mod_ticket_simple.php @@ -129,7 +129,7 @@ class mod_ticket_simple extends ModeleNumRefTicket $sql .= " FROM ".MAIN_DB_PREFIX."ticket"; $search = $this->prefix."____-%"; $sql .= " WHERE ref LIKE '".$db->escape($search)."'"; - $sql .= " AND entity = ".$conf->entity; + $sql .= " AND entity IN (".getEntity('ticketnumber', 1, $ticket).")"; $resql = $db->query($sql); if ($resql) { diff --git a/htdocs/core/modules/ticket/mod_ticket_universal.php b/htdocs/core/modules/ticket/mod_ticket_universal.php index 176af782dc7..2c46376eea1 100644 --- a/htdocs/core/modules/ticket/mod_ticket_universal.php +++ b/htdocs/core/modules/ticket/mod_ticket_universal.php @@ -134,8 +134,11 @@ class mod_ticket_universal extends ModeleNumRefTicket return 0; } + // Get entities + $entity = getEntity('ticketnumber', 1, $ticket); + $date = empty($ticket->datec) ? dol_now() : $ticket->datec; - $numFinal = get_next_value($db, $mask, 'ticket', 'ref', '', $objsoc->code_client, $date); + $numFinal = get_next_value($db, $mask, 'ticket', 'ref', '', $objsoc->code_client, $date, 'next', false, null, $entity); return $numFinal; } From 2992b3e84580c400b9afb401a1c9bb3f4f9253de Mon Sep 17 00:00:00 2001 From: lvessiller Date: Fri, 22 Apr 2022 09:24:23 +0200 Subject: [PATCH 188/738] NEW send last document in mass mailing action --- htdocs/core/actions_massactions.inc.php | 46 ++++++++++++++++++------- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/htdocs/core/actions_massactions.inc.php b/htdocs/core/actions_massactions.inc.php index 5ec011f5017..171383d7008 100644 --- a/htdocs/core/actions_massactions.inc.php +++ b/htdocs/core/actions_massactions.inc.php @@ -306,29 +306,51 @@ if (!$error && $massaction == 'confirm_presend') { // TODO Set subdir to be compatible with multi levels dir trees // $subdir = get_exdir($objectobj->id, 2, 0, 0, $objectobj, $objectobj->element) $filedir = $uploaddir.'/'.$subdir.dol_sanitizeFileName($objectobj->ref); - $file = $filedir.'/'.$filename; + $filepath = $filedir.'/'.$filename; // For supplier invoices, we use the file provided by supplier, not the one we generate if ($objectobj->element == 'invoice_supplier') { $fileparams = dol_most_recent_file($uploaddir.'/'.get_exdir($objectobj->id, 2, 0, 0, $objectobj, $objectobj->element).$objectobj->ref, preg_quote($objectobj->ref, '/').'([^\-])+'); - $file = $fileparams['fullname']; + $filepath = $fileparams['fullname']; } - $mime = dol_mimetype($file); + // try to find other files generated for this object (last_main_doc) + $filename_found = ''; + $filepath_found = ''; + $file_check_list = array(); + $file_check_list[] = array( + 'name' => $filename, + 'path' => $filepath, + ); + if (!empty($objectobj->last_main_doc)) { + $file_check_list[] = array( + 'name' => basename($objectobj->last_main_doc), + 'path' => DOL_DATA_ROOT . '/' . $objectobj->last_main_doc, + ); + } + foreach ($file_check_list as $file_check_arr) { + if (dol_is_file($file_check_arr['path'])) { + $filename_found = $file_check_arr['name']; + $filepath_found = $file_check_arr['path']; + break; + } + } - if (dol_is_file($file)) { + if ($filepath_found) { // Create form object $attachedfilesThirdpartyObj[$thirdpartyid][$objectid] = array( - 'paths'=>array($file), - 'names'=>array($filename), - 'mimes'=>array($mime) + 'paths'=>array($filepath_found), + 'names'=>array($filename_found), + 'mimes'=>array(dol_mimetype($filepath_found)) ); } else { - $nbignored++; - $langs->load("errors"); - $resaction .= '
'.$langs->trans('ErrorCantReadFile', $file).'

'; - dol_syslog('Failed to read file: '.$file, LOG_WARNING); - continue; + $nbignored++; + $langs->load("errors"); + foreach ($file_check_list as $file_check_arr) { + $resaction .= '
'.$langs->trans('ErrorCantReadFile', $file_check_arr['path']).'

'; + dol_syslog('Failed to read file: '.$file_check_arr['path'], LOG_WARNING); + } + continue; } } From ca0f98d09f65f7aa107ca30bab815388d2ebb410 Mon Sep 17 00:00:00 2001 From: Gauthier PC portable 024 Date: Fri, 22 Apr 2022 13:50:39 +0200 Subject: [PATCH 189/738] FIX : label tax cat trad --- htdocs/expensereport/card.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/expensereport/card.php b/htdocs/expensereport/card.php index 50ee78b4097..31cf21c34ae 100644 --- a/htdocs/expensereport/card.php +++ b/htdocs/expensereport/card.php @@ -2068,7 +2068,8 @@ if ($action == 'create') { // IK if (!empty($conf->global->MAIN_USE_EXPENSE_IK)) { print ''; - print dol_getIdFromCode($db, $line->fk_c_exp_tax_cat, 'c_exp_tax_cat', 'rowid', 'label'); + $exp_tax_cat_label = dol_getIdFromCode($db, $line->fk_c_exp_tax_cat, 'c_exp_tax_cat', 'rowid', 'label'); + print $langs->trans($exp_tax_cat_label); print ''; } From 609ef9bfa79c47cc91b322b1276c956eccaa8400 Mon Sep 17 00:00:00 2001 From: Gauthier PC portable 024 Date: Fri, 22 Apr 2022 14:26:16 +0200 Subject: [PATCH 190/738] FIX : var name --- htdocs/expensereport/payment/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/expensereport/payment/list.php b/htdocs/expensereport/payment/list.php index 8308ea3fc4c..fa8ba9bcdcf 100644 --- a/htdocs/expensereport/payment/list.php +++ b/htdocs/expensereport/payment/list.php @@ -523,7 +523,7 @@ while ($i < min($num, $limit)) { // Cheque number (fund transfer) if (!empty($arrayfields['pndf.num_payment']['checked'])) { - print ''.$objp->num_paiement.''; + print ''.$objp->num_payment.''; if (!$i) { $totalarray['nbfield']++; } From 6f9f78af33db723907284b7d3f814518a971165d Mon Sep 17 00:00:00 2001 From: Gauthier PC portable 024 Date: Fri, 22 Apr 2022 14:28:43 +0200 Subject: [PATCH 191/738] FIX : var name --- htdocs/expensereport/payment/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/expensereport/payment/list.php b/htdocs/expensereport/payment/list.php index fa8ba9bcdcf..f5196181cf2 100644 --- a/htdocs/expensereport/payment/list.php +++ b/htdocs/expensereport/payment/list.php @@ -515,7 +515,7 @@ while ($i < min($num, $limit)) { // Pyament type if (!empty($arrayfields['c.libelle']['checked'])) { $payment_type = $langs->trans("PaymentType".$objp->paiement_type) != ("PaymentType".$objp->paiement_type) ? $langs->trans("PaymentType".$objp->paiement_type) : $objp->paiement_libelle; - print ''.$payment_type.' '.dol_trunc($objp->num_paiement, 32).''; + print ''.$payment_type.' '.dol_trunc($objp->num_payment, 32).''; if (!$i) { $totalarray['nbfield']++; } From d2ec1efb42acd6454628a1ef9ddc8d9f8cc28d2e Mon Sep 17 00:00:00 2001 From: Eric Seigne Date: Fri, 22 Apr 2022 14:49:22 +0200 Subject: [PATCH 192/738] fix #20690: add lang filter for people --- htdocs/core/modules/mailings/contacts1.modules.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/htdocs/core/modules/mailings/contacts1.modules.php b/htdocs/core/modules/mailings/contacts1.modules.php index bd4300ea71d..1450fe75b8c 100644 --- a/htdocs/core/modules/mailings/contacts1.modules.php +++ b/htdocs/core/modules/mailings/contacts1.modules.php @@ -311,6 +311,13 @@ class mailing_contacts1 extends MailingTargets else dol_print_error($this->db); $s .= ''; + + //Choose language + require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php'; + $formadmin = new FormAdmin($this->db); + $s .= $langs->trans("DefaultLang").': '; + $s .= $formadmin->select_language($langs->getDefaultLang(1), 'filter_lang', 0, 0, 1, 0, 0, '', 0, 0, 0, null, 1); + return $s; } @@ -344,6 +351,7 @@ class mailing_contacts1 extends MailingTargets $filter_category = GETPOST('filter_category', 'alpha'); $filter_category_customer = GETPOST('filter_category_customer', 'alpha'); $filter_category_supplier = GETPOST('filter_category_supplier', 'alpha'); + $filter_lang = GETPOST('filter_lang', 'alpha'); $cibles = array(); @@ -391,6 +399,7 @@ class mailing_contacts1 extends MailingTargets if ($filter_category_customer <> 'all') $sql .= " AND c2.label = '".$this->db->escape($filter_category_customer)."'"; if ($filter_category_supplier <> 'all') $sql .= " AND c3s.fk_categorie = c3.rowid AND c3s.fk_soc = sp.fk_soc"; if ($filter_category_supplier <> 'all') $sql .= " AND c3.label = '".$this->db->escape($filter_category_supplier)."'"; + if ($filter_lang <> '') $sql .= " AND sp.default_lang = '".$this->db->escape($filter_lang)."'"; // Filter on nature $key = $filter; { @@ -404,7 +413,7 @@ class mailing_contacts1 extends MailingTargets $key = $filter_jobposition; if (!empty($key) && $key != 'all') $sql .= " AND sp.poste ='".$this->db->escape($key)."'"; $sql .= " ORDER BY sp.email"; - //print "wwwwwwx".$sql; + // print "wwwwwwx".$sql; // Stocke destinataires dans cibles $result = $this->db->query($sql); From 72ac1fdfd2e4eb69a7b53c5a8a2060e687e9f871 Mon Sep 17 00:00:00 2001 From: Eric Seigne Date: Fri, 22 Apr 2022 15:05:38 +0200 Subject: [PATCH 193/738] fix #20690: add lang filter for companies --- .../modules/mailings/thirdparties.modules.php | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/htdocs/core/modules/mailings/thirdparties.modules.php b/htdocs/core/modules/mailings/thirdparties.modules.php index 05e9f4f12c4..9dc9e716cf3 100644 --- a/htdocs/core/modules/mailings/thirdparties.modules.php +++ b/htdocs/core/modules/mailings/thirdparties.modules.php @@ -79,6 +79,11 @@ class mailing_thirdparties extends MailingTargets $sql .= " WHERE s.email <> ''"; $sql .= " AND s.entity IN (".getEntity('societe').")"; $sql .= " AND s.email NOT IN (SELECT email FROM ".MAIN_DB_PREFIX."mailing_cibles WHERE fk_mailing=".$mailing_id.")"; + + if (GETPOST('default_lang','alpha')) + { + $sql .= " AND s.default_lang LIKE '".GETPOST('default_lang','alpha')."%'"; + } } else { @@ -126,6 +131,13 @@ class mailing_thirdparties extends MailingTargets $addDescription .= $langs->trans("Disabled"); } } + if (GETPOST('default_lang','alpha')) + { + $addFilter .= " AND s.default_lang LIKE '".GETPOST('default_lang','alpha')."%'"; + $addDescription = $langs->trans('DefaultLang')."="; + } + + $sql = "SELECT s.rowid as id, s.email as email, s.nom as name, null as fk_contact, null as firstname, c.label as label"; $sql .= " FROM ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."categorie_societe as cs, ".MAIN_DB_PREFIX."categorie as c"; $sql .= " WHERE s.email <> ''"; @@ -147,7 +159,6 @@ class mailing_thirdparties extends MailingTargets $sql .= $addFilter; } $sql .= " ORDER BY email"; - // Stock recipients emails into targets table $result = $this->db->query($sql); if ($result) @@ -314,6 +325,14 @@ class mailing_thirdparties extends MailingTargets $s .= ''; $s .= ''; $s .= ''; + + + //Choose language + require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php'; + $formadmin = new FormAdmin($this->db); + $s .= $langs->trans("DefaultLang").': '; + $s .= $formadmin->select_language($langs->getDefaultLang(1), 'filter_lang', 0, 0, 1, 0, 0, '', 0, 0, 0, null, 1); + return $s; } From 9fd3a4b2c9c99c56f46b8e9559372f142c33ad09 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Fri, 22 Apr 2022 13:30:43 +0000 Subject: [PATCH 194/738] Fixing style errors. --- htdocs/core/modules/mailings/thirdparties.modules.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/core/modules/mailings/thirdparties.modules.php b/htdocs/core/modules/mailings/thirdparties.modules.php index 9dc9e716cf3..07b08e60d60 100644 --- a/htdocs/core/modules/mailings/thirdparties.modules.php +++ b/htdocs/core/modules/mailings/thirdparties.modules.php @@ -80,9 +80,9 @@ class mailing_thirdparties extends MailingTargets $sql .= " AND s.entity IN (".getEntity('societe').")"; $sql .= " AND s.email NOT IN (SELECT email FROM ".MAIN_DB_PREFIX."mailing_cibles WHERE fk_mailing=".$mailing_id.")"; - if (GETPOST('default_lang','alpha')) + if (GETPOST('default_lang', 'alpha')) { - $sql .= " AND s.default_lang LIKE '".GETPOST('default_lang','alpha')."%'"; + $sql .= " AND s.default_lang LIKE '".GETPOST('default_lang', 'alpha')."%'"; } } else @@ -131,9 +131,9 @@ class mailing_thirdparties extends MailingTargets $addDescription .= $langs->trans("Disabled"); } } - if (GETPOST('default_lang','alpha')) + if (GETPOST('default_lang', 'alpha')) { - $addFilter .= " AND s.default_lang LIKE '".GETPOST('default_lang','alpha')."%'"; + $addFilter .= " AND s.default_lang LIKE '".GETPOST('default_lang', 'alpha')."%'"; $addDescription = $langs->trans('DefaultLang')."="; } From 5eb74772d619d895250f690506ce77dc7cece1d6 Mon Sep 17 00:00:00 2001 From: Nicolas SILOBRE <45969285+ns-info90@users.noreply.github.com> Date: Sat, 23 Apr 2022 03:41:17 +0200 Subject: [PATCH 195/738] Update pdf_rouget.modules.php Correction of units in the total weight --- htdocs/core/modules/expedition/doc/pdf_rouget.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/expedition/doc/pdf_rouget.modules.php b/htdocs/core/modules/expedition/doc/pdf_rouget.modules.php index 211231b9812..94e048382dc 100644 --- a/htdocs/core/modules/expedition/doc/pdf_rouget.modules.php +++ b/htdocs/core/modules/expedition/doc/pdf_rouget.modules.php @@ -212,7 +212,7 @@ class pdf_rouget extends ModelePdfExpedition } // Load traductions files required by page - $outputlangs->loadLangs(array("main", "bills", "products", "dict", "companies", "propal", "deliveries", "sendings", "productbatch")); + $outputlangs->loadLangs(array("main", "bills", "products", "dict", "companies", "propal", "deliveries", "sendings", "productbatch", "other")); $nblines = count($object->lines); From 16c607f4d8c0d826c4a7436599f028428e890393 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 24 Apr 2022 18:39:26 +0200 Subject: [PATCH 196/738] Fix responsive --- htdocs/compta/localtax/card.php | 22 ++++++++++++++-------- htdocs/compta/localtax/list.php | 5 ++++- htdocs/compta/paiement_vat.php | 19 +++++++++++-------- htdocs/compta/tva/card.php | 11 ++++++----- 4 files changed, 35 insertions(+), 22 deletions(-) diff --git a/htdocs/compta/localtax/card.php b/htdocs/compta/localtax/card.php index 35c6aa399fe..45cb1f03bb8 100644 --- a/htdocs/compta/localtax/card.php +++ b/htdocs/compta/localtax/card.php @@ -32,8 +32,8 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/vat.lib.php'; $langs->loadLangs(array('compta', 'banks', 'bills')); $id = GETPOST("id", 'int'); -$action = GETPOST("action", "alpha"); -$cancel = GETPOST('cancel'); +$action = GETPOST("action", "aZ09"); +$cancel = GETPOST('cancel', 'aZ09'); $refund = GETPOST("refund", "int"); if (empty($refund)) { @@ -143,7 +143,7 @@ $form = new Form($db); $title = $langs->trans("LT".$object->ltt)." - ".$langs->trans("Card"); $help_url = ''; -llxHeader("", $title, $helpurl); +llxHeader('', $title, $helpurl); if ($action == 'create') { print load_fiche_titre($langs->transcountry($lttype == 2 ? "newLT2Payment" : "newLT1Payment", $mysoc->country_code)); @@ -157,11 +157,13 @@ if ($action == 'create') { print ''; + // Date of payment print ""; print ''; + // End date of period print ''; @@ -173,20 +175,24 @@ if ($action == 'create') { print ''; if (!empty($conf->banque->enabled)) { - print ''; - + // Type payment print '\n"; print ""; + + // Bank account + print ''; // Number print ''."\n"; } + // Other attributes $parameters = array(); $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook diff --git a/htdocs/compta/localtax/list.php b/htdocs/compta/localtax/list.php index 6590e250832..6f6fc303262 100644 --- a/htdocs/compta/localtax/list.php +++ b/htdocs/compta/localtax/list.php @@ -63,6 +63,7 @@ if ($result) { $i = 0; $total = 0; + print '
'; // You can use div-table-responsive-no-min if you dont need reserved height for your table print '
'.$langs->trans("DatePayment").''; print $form->selectDate($datep, "datep", '', '', '', 'add', 1, 1); print '
'.$form->textwithpicto($langs->trans("PeriodEndDate"), $langs->trans("LastDayTaxIsRelatedTo")).''; print $form->selectDate($datev, "datev", '', '', '', 'add', 1, 1); print '
'.$langs->trans("Amount").'
'.$langs->trans("Account").''; - $form->select_comptes(GETPOST("accountid", "int"), "accountid", 0, "courant=1", 2); // Affiche liste des comptes courant - print '
'.$langs->trans("PaymentMode").''; - $form->select_types_paiements(GETPOST("paiementtype"), "paiementtype"); + $form->select_types_paiements(GETPOST("paiementtype"), "paiementtype", '', 0, 1, 0, 0, 1,'maxwidth500 widthcentpercentminusx'); print "
'.$langs->trans("Account").''; + print img_picto('', 'bank_account', 'pictofixedwidth'); + $form->select_comptes(GETPOST("accountid", "int"), "accountid", 0, "courant=1", 2, '', 0, 'maxwidth500 widthcentpercentminusx'); // Affiche liste des comptes courant + print '
'.$langs->trans('Numero'); print ' ('.$langs->trans("ChequeOrTransferNumber").')'; print '
'; print ''; print ''; @@ -85,7 +86,7 @@ if ($result) { print '\n"; $total = $total + $obj->amount; - print ""; + print ''; print "\n"; $i++; @@ -94,6 +95,8 @@ if ($result) { print ''; print "
'.$langs->trans("Ref").''.dol_print_date($db->jdate($obj->datep), 'day')."".price($obj->amount)."'.price($obj->amount).'
'.price($total).'
"; + print '
'; + $db->free($result); } else { dol_print_error($db); diff --git a/htdocs/compta/paiement_vat.php b/htdocs/compta/paiement_vat.php index ce224735927..2f7b775096d 100644 --- a/htdocs/compta/paiement_vat.php +++ b/htdocs/compta/paiement_vat.php @@ -207,14 +207,15 @@ if ($action == 'create') { print ''; print ''.$langs->trans("PaymentMode").''; - $form->select_types_paiements(GETPOSTISSET("paiementtype") ? GETPOST("paiementtype", "int") : $tva->paiementtype, "paiementtype"); + $form->select_types_paiements(GETPOSTISSET("paiementtype") ? GETPOST("paiementtype", "int") : $tva->paiementtype, "paiementtype", '', 0, 1, 0, 0, 1,'maxwidth500 widthcentpercentminusx'); print "\n"; print ''; print ''; print ''.$langs->trans('AccountToDebit').''; print ''; - $form->select_comptes(GETPOST("accountid") ? GETPOST("accountid", "int") : $tva->accountid, "accountid", 0, '', 1); // Show opend bank account list + print img_picto('', 'bank_account', 'pictofixedwidth'); + $form->select_comptes(GETPOST("accountid", "int") ? GETPOST("accountid", "int") : $tva->accountid, "accountid", 0, '', 1, '', 0, 'maxwidth500 widthcentpercentminusx'); // Show opend bank account list print ''; // Number @@ -225,7 +226,7 @@ if ($action == 'create') { print ''; print ''.$langs->trans("Comments").''; - print ''; + print ''; print ''; print ''; @@ -238,6 +239,7 @@ if ($action == 'create') { $num = 1; $i = 0; + print '
'; // You can use div-table-responsive-no-min if you dont need reserved height for your table print ''; print ''; //print ''; @@ -259,14 +261,14 @@ if ($action == 'create') { if ($objp->datev > 0) { print ''."\n"; } else { - print "\n"; + print ''."\n"; } - print '"; + print '"; - print '"; + print '"; - print '"; + print '"; print '
'.$langs->trans("SocialContribution").''.dol_print_date($objp->datev, 'day').'!!!!!!'.price($objp->amount)."'.price($objp->amount)."'.price($sumpaid)."'.price($sumpaid)."'.price($objp->amount - $sumpaid)."'.price($objp->amount - $sumpaid)."'; @@ -279,7 +281,7 @@ if ($action == 'create') { } */ $remaintopay = $objp->amount - $sumpaid; print ''; - print ''; + print ''; } else { print '-'; } @@ -303,6 +305,7 @@ if ($action == 'create') { } print "
"; + print '
'; // Bouton Save payment print '
'.$langs->trans("ClosePaidVATAutomatically"); diff --git a/htdocs/compta/tva/card.php b/htdocs/compta/tva/card.php index 317838009c7..3ffb405f8ad 100644 --- a/htdocs/compta/tva/card.php +++ b/htdocs/compta/tva/card.php @@ -460,7 +460,7 @@ if ($action == 'create') { print '
'; print ''; - //print "
\n"; + print "\n"; // Label if ($refund == 1) { @@ -468,7 +468,7 @@ if ($action == 'create') { } else { $label = $langs->trans("VATPayment"); } - print ''.$langs->trans("Label").''; + print ''.$langs->trans("Label").''; print ''.$form->textwithpicto($langs->trans("PeriodEndDate"), $langs->trans("LastDayTaxIsRelatedTo")).''; print $form->selectDate((GETPOST("datevmonth", 'int') ? $datev : -1), "datev", '', '', '', 'add', 1, 1); @@ -490,14 +490,15 @@ if ($action == 'create') { // Type payment print ''.$langs->trans("PaymentMode").''; - $form->select_types_paiements(GETPOST("type_payment"), "type_payment"); + $form->select_types_paiements(GETPOST("type_payment", 'int'), "type_payment", '', 0, 1, 0, 0, 1,'maxwidth500 widthcentpercentminusx'); print "\n"; print ""; if (!empty($conf->banque->enabled)) { + // Bank account print ''.$langs->trans("BankAccount").''; print img_picto('', 'bank_account', 'pictofixedwidth'); - $form->select_comptes(GETPOST("accountid", 'int'), "accountid", 0, "courant=1", 1); // List of bank account available + $form->select_comptes(GETPOST("accountid", 'int'), "accountid", 0, "courant=1", 1, '', 0, 'maxwidth500 widthcentpercentminusx'); // List of bank account available print ''; } @@ -509,7 +510,7 @@ if ($action == 'create') { // Comments print ''; print ''.$langs->trans("Comments").''; - print ''; + print ''; print ''; // Other attributes From 97328f732e1ee3841b28c9d02a8745926f6393e3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 24 Apr 2022 23:02:53 +0200 Subject: [PATCH 197/738] Fix error managemnt when getting RSS. --- htdocs/core/class/rssparser.class.php | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/htdocs/core/class/rssparser.class.php b/htdocs/core/class/rssparser.class.php index c3c434d1aed..2048a80bae6 100644 --- a/htdocs/core/class/rssparser.class.php +++ b/htdocs/core/class/rssparser.class.php @@ -227,11 +227,16 @@ class RssParser } else { try { $result = getURLContent($this->_urlRSS, 'GET', '', 1, array(), array('http', 'https'), 0); + if (!empty($result['content'])) { $str = $result['content']; + } elseif (!empty($result['curl_error_msg'])){ + $this->error = 'Error retrieving URL '.$this->_urlRSS.' - '.$result['curl_error_msg']; + return -1; } } catch (Exception $e) { - print 'Error retrieving URL '.$this->_urlRSS.' - '.$e->getMessage(); + $this->error = 'Error retrieving URL '.$this->_urlRSS.' - '.$e->getMessage(); + return -2; } } @@ -248,7 +253,8 @@ class RssParser } $xmlparser = xml_parser_create(''); - if (!is_resource($xmlparser)) { + + if (!is_resource($xmlparser) && !is_object($xmlparser)) { $this->error = "ErrorFailedToCreateParser"; return -1; } @@ -256,10 +262,11 @@ class RssParser xml_set_object($xmlparser, $this); xml_set_element_handler($xmlparser, 'feed_start_element', 'feed_end_element'); xml_set_character_data_handler($xmlparser, 'feed_cdata'); + $status = xml_parse($xmlparser, $str); xml_parser_free($xmlparser); $rss = $this; - //var_dump($rss->_format);exit; + //var_dump($status.' '.$rss->_format);exit; } } From 8bb9cc83ebbdddc10ab9e898be9462bb3a748f8a Mon Sep 17 00:00:00 2001 From: Francis Appels Date: Mon, 25 Apr 2022 09:30:05 +0200 Subject: [PATCH 198/738] Fix migration warning. --- htdocs/core/extrafieldsinimport.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/extrafieldsinimport.inc.php b/htdocs/core/extrafieldsinimport.inc.php index 4845d9a6d44..395b67520d1 100644 --- a/htdocs/core/extrafieldsinimport.inc.php +++ b/htdocs/core/extrafieldsinimport.inc.php @@ -11,7 +11,7 @@ if (empty($keyforselect) || empty($keyforelement) || empty($keyforaliasextra)) { } // Add extra fields -$sql = "SELECT name, label, type, param, fieldcomputed, fielddefault FROM ".MAIN_DB_PREFIX."extrafields"; +$sql = "SELECT name, label, type, param, fieldcomputed, fielddefault, fieldrequired FROM ".MAIN_DB_PREFIX."extrafields"; $sql .= " WHERE elementtype = '".$this->db->escape($keyforselect)."' AND type <> 'separate' AND entity IN (0, ".((int) $conf->entity).') ORDER BY pos ASC'; //print $sql; $resql = $this->db->query($sql); From 8a2cc52b5c5ca3cd7d5aed43fe77eed4182ef27c Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Mon, 25 Apr 2022 10:14:30 +0200 Subject: [PATCH 199/738] FIX wrong website data root with multicompany --- htdocs/admin/website.php | 6 +++--- htdocs/core/class/html.formwebsite.class.php | 2 +- htdocs/core/filemanagerdol/connectors/php/config.php | 2 +- htdocs/core/lib/website.lib.php | 4 ++-- htdocs/public/website/index.php | 4 ++-- htdocs/public/website/styles.css.php | 2 +- htdocs/website/class/website.class.php | 8 +++++--- htdocs/website/class/websitepage.class.php | 2 +- htdocs/website/index.php | 10 +++++----- 9 files changed, 21 insertions(+), 19 deletions(-) diff --git a/htdocs/admin/website.php b/htdocs/admin/website.php index d1a24ff072c..17858b9991c 100644 --- a/htdocs/admin/website.php +++ b/htdocs/admin/website.php @@ -113,7 +113,7 @@ $tabcond[1] = (!empty($conf->website->enabled)); // List of help for fields $tabhelp = array(); -$tabhelp[1] = array('ref'=>$langs->trans("EnterAnyCode"), 'virtualhost'=>$langs->trans("SetHereVirtualHost", DOL_DATA_ROOT.'/website/websiteref')); +$tabhelp[1] = array('ref'=>$langs->trans("EnterAnyCode"), 'virtualhost'=>$langs->trans("SetHereVirtualHost", DOL_DATA_ROOT.($conf->entity > 1 ? '/'.$conf->entity : '').'/website/websiteref')); // List of check for fields (NOT USED YET) $tabfieldcheck = array(); @@ -271,8 +271,8 @@ if (GETPOST('actionadd', 'alpha') || GETPOST('actionmodify', 'alpha')) { if ($resql) { $newname = dol_sanitizeFileName(GETPOST('ref', 'aZ09')); if ($newname != $website->ref) { - $srcfile = DOL_DATA_ROOT.'/website/'.$website->ref; - $destfile = DOL_DATA_ROOT.'/website/'.$newname; + $srcfile = DOL_DATA_ROOT.($conf->entity > 1 ? '/'.$conf->entity : '').'/website/'.$website->ref; + $destfile = DOL_DATA_ROOT.($conf->entity > 1 ? '/'.$conf->entity : '').'/website/'.$newname; if (dol_is_dir($destfile)) { $error++; diff --git a/htdocs/core/class/html.formwebsite.class.php b/htdocs/core/class/html.formwebsite.class.php index a4db07f95c0..5d553887777 100644 --- a/htdocs/core/class/html.formwebsite.class.php +++ b/htdocs/core/class/html.formwebsite.class.php @@ -173,7 +173,7 @@ class FormWebsite $langs->load("admin"); - $listofsamples = dol_dir_list(DOL_DOCUMENT_ROOT.'/website/samples', 'files', 0, '^page-sample-.*\.html$'); + $listofsamples = dol_dir_list(DOL_DOCUMENT_ROOT.($conf->entity > 1 ? '/'.$conf->entity : '').'/website/samples', 'files', 0, '^page-sample-.*\.html$'); $arrayofsamples = array(); $arrayofsamples['empty'] = 'EmptyPage'; // Always this one first diff --git a/htdocs/core/filemanagerdol/connectors/php/config.php b/htdocs/core/filemanagerdol/connectors/php/config.php index 73c222841cc..c2d7478e36e 100644 --- a/htdocs/core/filemanagerdol/connectors/php/config.php +++ b/htdocs/core/filemanagerdol/connectors/php/config.php @@ -50,7 +50,7 @@ $Config['Enabled'] = true; $extEntity = (empty($entity) ? 1 : $entity); // For multicompany with external access $Config['UserFilesPath'] = DOL_URL_ROOT.'/viewimage.php?modulepart=medias'.(empty($website) ? '' : '_'.$website).'&entity='.$extEntity.'&file='; -$Config['UserFilesAbsolutePathRelative'] = (empty($website) ? ((!empty($entity) ? '/'.$entity : '').'/medias/') : ('/website/'.$website)); +$Config['UserFilesAbsolutePathRelative'] = (!empty($entity) ? '/'.$entity : '').(empty($website) ? '/medias/' : ('/website/'.$website)); // Fill the following value it you prefer to specify the absolute path for the diff --git a/htdocs/core/lib/website.lib.php b/htdocs/core/lib/website.lib.php index ca907ae6f1c..eeb68458252 100644 --- a/htdocs/core/lib/website.lib.php +++ b/htdocs/core/lib/website.lib.php @@ -495,7 +495,7 @@ function includeContainer($containerref) $containerref .= '.php'; } - $fullpathfile = DOL_DATA_ROOT.'/website/'.$websitekey.'/'.$containerref; + $fullpathfile = DOL_DATA_ROOT.($conf->entity > 1 ? '/'.$conf->entity.'/' : '').'/website/'.$websitekey.'/'.$containerref; if (empty($includehtmlcontentopened)) { $includehtmlcontentopened = 0; @@ -984,7 +984,7 @@ function getPagesFromSearchCriterias($type, $algo, $searchstring, $max = 25, $so if (!$error && (empty($max) || ($found < $max)) && (preg_match('/sitefiles/', $algo))) { global $dolibarr_main_data_root; - $pathofwebsite = $dolibarr_main_data_root.'/website/'.$website->ref; + $pathofwebsite = $dolibarr_main_data_root.($conf->entity > 1 ? '/'.$conf->entity.'/' : '').'/website/'.$website->ref; $filehtmlheader = $pathofwebsite.'/htmlheader.html'; $filecss = $pathofwebsite.'/styles.css.php'; $filejs = $pathofwebsite.'/javascript.js.php'; diff --git a/htdocs/public/website/index.php b/htdocs/public/website/index.php index d72fedefa7e..4b0342693d8 100644 --- a/htdocs/public/website/index.php +++ b/htdocs/public/website/index.php @@ -169,9 +169,9 @@ if ($pageid == 'css') { // No more used ? //if (empty($dolibarr_nocache)) header('Cache-Control: max-age=3600, public, must-revalidate'); //else header('Cache-Control: no-cache'); - $original_file = $dolibarr_main_data_root.'/website/'.$websitekey.'/styles.css.php'; + $original_file = $dolibarr_main_data_root.($conf->entity > 1 ? '/'.$conf->entity : '').'/website/'.$websitekey.'/styles.css.php'; } else { - $original_file = $dolibarr_main_data_root.'/website/'.$websitekey.'/page'.$pageid.'.tpl.php'; + $original_file = $dolibarr_main_data_root.($conf->entity > 1 ? '/'.$conf->entity : '').'/website/'.$websitekey.'/page'.$pageid.'.tpl.php'; } // Find the subdirectory name as the reference diff --git a/htdocs/public/website/styles.css.php b/htdocs/public/website/styles.css.php index a0002b5380b..73cbed73dbd 100644 --- a/htdocs/public/website/styles.css.php +++ b/htdocs/public/website/styles.css.php @@ -122,7 +122,7 @@ if (empty($pageid)) // Security: Delete string ../ into $original_file global $dolibarr_main_data_root; -$original_file = $dolibarr_main_data_root.'/website/'.$website.'/styles.css.php'; +$original_file = $dolibarr_main_data_root.($conf->entity > 1 ? '/'.$conf->entity : '').'/website/'.$website.'/styles.css.php'; // Find the subdirectory name as the reference $refname = basename(dirname($original_file)."/"); diff --git a/htdocs/website/class/website.class.php b/htdocs/website/class/website.class.php index 80a48048151..8dfaf284ea5 100644 --- a/htdocs/website/class/website.class.php +++ b/htdocs/website/class/website.class.php @@ -587,6 +587,8 @@ class Website extends CommonObject */ public function delete(User $user, $notrigger = false) { + global $conf; + dol_syslog(__METHOD__, LOG_DEBUG); $error = 0; @@ -618,7 +620,7 @@ class Website extends CommonObject } if (!$error && !empty($this->ref)) { - $pathofwebsite = DOL_DATA_ROOT.'/website/'.$this->ref; + $pathofwebsite = DOL_DATA_ROOT.($conf->entity > 1 ? '/'.$conf->entity : '').'/website/'.$this->ref; dol_delete_dir_recursive($pathofwebsite); } @@ -678,8 +680,8 @@ class Website extends CommonObject $oldidforhome = $object->fk_default_home; $oldref = $object->ref; - $pathofwebsiteold = $dolibarr_main_data_root.'/website/'.dol_sanitizeFileName($oldref); - $pathofwebsitenew = $dolibarr_main_data_root.'/website/'.dol_sanitizeFileName($newref); + $pathofwebsiteold = $dolibarr_main_data_root.($conf->entity > 1 ? '/'.$conf->entity : '').'/website/'.dol_sanitizeFileName($oldref); + $pathofwebsitenew = $dolibarr_main_data_root.($conf->entity > 1 ? '/'.$conf->entity : '').'/website/'.dol_sanitizeFileName($newref); dol_delete_dir_recursive($pathofwebsitenew); $fileindex = $pathofwebsitenew.'/index.php'; diff --git a/htdocs/website/class/websitepage.class.php b/htdocs/website/class/websitepage.class.php index 0126f8a4dc4..6b65df983ca 100644 --- a/htdocs/website/class/websitepage.class.php +++ b/htdocs/website/class/websitepage.class.php @@ -642,7 +642,7 @@ class WebsitePage extends CommonObject if ($result > 0) { global $dolibarr_main_data_root; - $pathofwebsite = $dolibarr_main_data_root.'/website/'.$websiteobj->ref; + $pathofwebsite = $dolibarr_main_data_root.($conf->entity > 1 ? '/'.$conf->entity : '').'/website/'.$websiteobj->ref; $filealias = $pathofwebsite.'/'.$this->pageurl.'.php'; $filetpl = $pathofwebsite.'/page'.$this->id.'.tpl.php'; diff --git a/htdocs/website/index.php b/htdocs/website/index.php index 8ac4d612264..346a6715647 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -226,7 +226,7 @@ if (empty($pageid) && empty($pageref) && $object->id > 0 && $action != 'createco global $dolibarr_main_data_root; -$pathofwebsite = $dolibarr_main_data_root.'/website/'.$websitekey; +$pathofwebsite = $dolibarr_main_data_root.($conf->entity > 1 ? '/'.$conf->entity : '').'/website/'.$websitekey; $filehtmlheader = $pathofwebsite.'/htmlheader.html'; $filecss = $pathofwebsite.'/styles.css.php'; $filejs = $pathofwebsite.'/javascript.js.php'; @@ -1924,7 +1924,7 @@ if ($usercanedit && (($action == 'updatesource' || $action == 'updatecontent' || $tmpwebsite = new Website($db); if ($newwebsiteid > 0 && $newwebsiteid != $object->id) { $tmpwebsite->fetch($newwebsiteid); - $pathofwebsitenew = $dolibarr_main_data_root.'/website/'.$tmpwebsite->ref; + $pathofwebsitenew = $dolibarr_main_data_root.($conf->entity > 1 ? '/'.$conf->entity : '').'/website/'.$tmpwebsite->ref; } else { $tmpwebsite = $object; } @@ -2573,7 +2573,7 @@ if (!GETPOST('hide_websitemenu')) { if ($websitekey) { $virtualurl = ''; - $dataroot = DOL_DATA_ROOT.'/website/'.$websitekey; + $dataroot = DOL_DATA_ROOT.($conf->entity > 1 ? '/'.$conf->entity : '').'/website/'.$websitekey; if (!empty($object->virtualhost)) { $virtualurl = $object->virtualhost; } @@ -3342,7 +3342,7 @@ if ($action == 'editcss') { // VirtualHost print ''; - $htmltext = $langs->trans("SetHereVirtualHost", DOL_DATA_ROOT.'/website/{s1}'.$websitekey.'{s2}'); + $htmltext = $langs->trans("SetHereVirtualHost", DOL_DATA_ROOT.($conf->entity > 1 ? '/'.$conf->entity : '').'/website/{s1}'.$websitekey.'{s2}'); $htmltext = str_replace(array('{s1}', '{s2}'), array('', ''), $htmltext); $htmltext .= '
'; $htmltext .= '
'.$langs->trans("CheckVirtualHostPerms", $langs->transnoentitiesnoconv("ReadPerm"), DOL_DOCUMENT_ROOT); @@ -3528,7 +3528,7 @@ if ($action == 'createsite') { print ''; $htmltext = $langs->trans("SetHereVirtualHost", '{s1}'); - $htmltext = str_replace('{s1}', DOL_DATA_ROOT.'/website/websiteref', $htmltext); + $htmltext = str_replace('{s1}', DOL_DATA_ROOT.($conf->entity > 1 ? '/'.$conf->entity : '').'/website/websiteref', $htmltext); $htmltext .= '
'; $htmltext .= '
'.$langs->trans("CheckVirtualHostPerms", $langs->transnoentitiesnoconv("ReadPerm"), DOL_DOCUMENT_ROOT); $htmltext .= '
'.$langs->trans("CheckVirtualHostPerms", $langs->transnoentitiesnoconv("WritePerm"), '{s1}'); From 7e7ae863c7c9afa4512bcb4c760bee7351b4a021 Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Mon, 25 Apr 2022 10:19:52 +0200 Subject: [PATCH 200/738] FIX syntax error --- htdocs/core/class/html.formwebsite.class.php | 2 +- htdocs/core/lib/website.lib.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/core/class/html.formwebsite.class.php b/htdocs/core/class/html.formwebsite.class.php index 5d553887777..a4db07f95c0 100644 --- a/htdocs/core/class/html.formwebsite.class.php +++ b/htdocs/core/class/html.formwebsite.class.php @@ -173,7 +173,7 @@ class FormWebsite $langs->load("admin"); - $listofsamples = dol_dir_list(DOL_DOCUMENT_ROOT.($conf->entity > 1 ? '/'.$conf->entity : '').'/website/samples', 'files', 0, '^page-sample-.*\.html$'); + $listofsamples = dol_dir_list(DOL_DOCUMENT_ROOT.'/website/samples', 'files', 0, '^page-sample-.*\.html$'); $arrayofsamples = array(); $arrayofsamples['empty'] = 'EmptyPage'; // Always this one first diff --git a/htdocs/core/lib/website.lib.php b/htdocs/core/lib/website.lib.php index eeb68458252..87608d81118 100644 --- a/htdocs/core/lib/website.lib.php +++ b/htdocs/core/lib/website.lib.php @@ -495,7 +495,7 @@ function includeContainer($containerref) $containerref .= '.php'; } - $fullpathfile = DOL_DATA_ROOT.($conf->entity > 1 ? '/'.$conf->entity.'/' : '').'/website/'.$websitekey.'/'.$containerref; + $fullpathfile = DOL_DATA_ROOT.($conf->entity > 1 ? '/'.$conf->entity : '').'/website/'.$websitekey.'/'.$containerref; if (empty($includehtmlcontentopened)) { $includehtmlcontentopened = 0; @@ -984,7 +984,7 @@ function getPagesFromSearchCriterias($type, $algo, $searchstring, $max = 25, $so if (!$error && (empty($max) || ($found < $max)) && (preg_match('/sitefiles/', $algo))) { global $dolibarr_main_data_root; - $pathofwebsite = $dolibarr_main_data_root.($conf->entity > 1 ? '/'.$conf->entity.'/' : '').'/website/'.$website->ref; + $pathofwebsite = $dolibarr_main_data_root.($conf->entity > 1 ? '/'.$conf->entity : '').'/website/'.$website->ref; $filehtmlheader = $pathofwebsite.'/htmlheader.html'; $filecss = $pathofwebsite.'/styles.css.php'; $filejs = $pathofwebsite.'/javascript.js.php'; From e6ce81bf8be6adbde09c4c8e67e8ecea453cd117 Mon Sep 17 00:00:00 2001 From: Francis Appels Date: Mon, 25 Apr 2022 11:20:00 +0200 Subject: [PATCH 201/738] Move confirm_createbills mass action to order list --- htdocs/commande/list.php | 342 +++++++++++++++++++++++ htdocs/core/actions_massactions.inc.php | 343 ------------------------ 2 files changed, 342 insertions(+), 343 deletions(-) diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index 52071b672fe..4859412f692 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -302,6 +302,348 @@ if (empty($reshook)) { $uploaddir = $conf->commande->multidir_output[$conf->entity]; $triggersendname = 'ORDER_SENTBYMAIL'; include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php'; + + if ($massaction == 'confirm_createbills') { // Create bills from orders. + $orders = GETPOST('toselect', 'array'); + $createbills_onebythird = GETPOST('createbills_onebythird', 'int'); + $validate_invoices = GETPOST('validate_invoices', 'int'); + + $errors = array(); + + $TFact = array(); + $TFactThird = array(); + $TFactThirdNbLines = array(); + + $nb_bills_created = 0; + $lastid= 0; + $lastref = ''; + + $db->begin(); + + foreach ($orders as $id_order) { + $cmd = new Commande($db); + if ($cmd->fetch($id_order) <= 0) { + continue; + } + $cmd->fetch_thirdparty(); + + $objecttmp = new Facture($db); + if (!empty($createbills_onebythird) && !empty($TFactThird[$cmd->socid])) { + // If option "one bill per third" is set, and an invoice for this thirdparty was already created, we re-use it. + $objecttmp = $TFactThird[$cmd->socid]; + } else { + // If we want one invoice per order or if there is no first invoice yet for this thirdparty. + $objecttmp->socid = $cmd->socid; + $objecttmp->thirdparty = $cmd->thirdparty; + + $objecttmp->type = $objecttmp::TYPE_STANDARD; + $objecttmp->cond_reglement_id = !empty($cmd->cond_reglement_id) ? $cmd->cond_reglement_id : $cmd->thirdparty->cond_reglement_id; + $objecttmp->mode_reglement_id = !empty($cmd->mode_reglement_id) ? $cmd->mode_reglement_id : $cmd->thirdparty->mode_reglement_id; + + $objecttmp->fk_project = $cmd->fk_project; + $objecttmp->multicurrency_code = $cmd->multicurrency_code; + if (empty($createbills_onebythird)) { + $objecttmp->ref_client = $cmd->ref_client; + } + + $datefacture = dol_mktime(12, 0, 0, GETPOST('remonth', 'int'), GETPOST('reday', 'int'), GETPOST('reyear', 'int')); + if (empty($datefacture)) { + $datefacture = dol_now(); + } + + $objecttmp->date = $datefacture; + $objecttmp->origin = 'commande'; + $objecttmp->origin_id = $id_order; + + $objecttmp->array_options = $cmd->array_options; // Copy extrafields + + $res = $objecttmp->create($user); + + if ($res > 0) { + $nb_bills_created++; + $lastref = $objecttmp->ref; + $lastid = $objecttmp->id; + + $TFactThird[$cmd->socid] = $objecttmp; + $TFactThirdNbLines[$cmd->socid] = 0; //init nblines to have lines ordered by expedition and rang + } else { + $langs->load("errors"); + $errors[] = $cmd->ref.' : '.$langs->trans($objecttmp->error); + $error++; + } + } + + if ($objecttmp->id > 0) { + $res = $objecttmp->add_object_linked($objecttmp->origin, $id_order); + + if ($res == 0) { + $errors[] = $objecttmp->error; + $error++; + } + + if (!$error) { + $lines = $cmd->lines; + if (empty($lines) && method_exists($cmd, 'fetch_lines')) { + $cmd->fetch_lines(); + $lines = $cmd->lines; + } + + $fk_parent_line = 0; + $num = count($lines); + + for ($i = 0; $i < $num; $i++) { + $desc = ($lines[$i]->desc ? $lines[$i]->desc : ''); + // If we build one invoice for several orders, we must put the ref of order on the invoice line + if (!empty($createbills_onebythird)) { + $desc = dol_concatdesc($desc, $langs->trans("Order").' '.$cmd->ref.' - '.dol_print_date($cmd->date, 'day')); + } + + if ($lines[$i]->subprice < 0) { + // Negative line, we create a discount line + $discount = new DiscountAbsolute($db); + $discount->fk_soc = $objecttmp->socid; + $discount->amount_ht = abs($lines[$i]->total_ht); + $discount->amount_tva = abs($lines[$i]->total_tva); + $discount->amount_ttc = abs($lines[$i]->total_ttc); + $discount->tva_tx = $lines[$i]->tva_tx; + $discount->fk_user = $user->id; + $discount->description = $desc; + $discountid = $discount->create($user); + if ($discountid > 0) { + $result = $objecttmp->insert_discount($discountid); + //$result=$discount->link_to_invoice($lineid,$id); + } else { + setEventMessages($discount->error, $discount->errors, 'errors'); + $error++; + break; + } + } else { + // Positive line + $product_type = ($lines[$i]->product_type ? $lines[$i]->product_type : 0); + // Date start + $date_start = false; + if ($lines[$i]->date_debut_prevue) { + $date_start = $lines[$i]->date_debut_prevue; + } + if ($lines[$i]->date_debut_reel) { + $date_start = $lines[$i]->date_debut_reel; + } + if ($lines[$i]->date_start) { + $date_start = $lines[$i]->date_start; + } + //Date end + $date_end = false; + if ($lines[$i]->date_fin_prevue) { + $date_end = $lines[$i]->date_fin_prevue; + } + if ($lines[$i]->date_fin_reel) { + $date_end = $lines[$i]->date_fin_reel; + } + if ($lines[$i]->date_end) { + $date_end = $lines[$i]->date_end; + } + // Reset fk_parent_line for no child products and special product + if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) { + $fk_parent_line = 0; + } + + // Extrafields + if (method_exists($lines[$i], 'fetch_optionals')) { + $lines[$i]->fetch_optionals(); + $array_options = $lines[$i]->array_options; + } + + $objecttmp->context['createfromclone']; + + $rang = $lines[$i]->rang; + //there may already be rows from previous orders + if (!empty($createbills_onebythird)) + $rang = $TFactThirdNbLines[$cmd->socid]; + + $result = $objecttmp->addline( + $desc, + $lines[$i]->subprice, + $lines[$i]->qty, + $lines[$i]->tva_tx, + $lines[$i]->localtax1_tx, + $lines[$i]->localtax2_tx, + $lines[$i]->fk_product, + $lines[$i]->remise_percent, + $date_start, + $date_end, + 0, + $lines[$i]->info_bits, + $lines[$i]->fk_remise_except, + 'HT', + 0, + $product_type, + $rang, + $lines[$i]->special_code, + $objecttmp->origin, + $lines[$i]->rowid, + $fk_parent_line, + $lines[$i]->fk_fournprice, + $lines[$i]->pa_ht, + $lines[$i]->label, + $array_options, + 100, + 0, + $lines[$i]->fk_unit + ); + if ($result > 0) { + $lineid = $result; + if (!empty($createbills_onebythird)) //increment rang to keep order + $TFactThirdNbLines[$rcp->socid]++; + } else { + $lineid = 0; + $error++; + break; + } + // Defined the new fk_parent_line + if ($result > 0 && $lines[$i]->product_type == 9) { + $fk_parent_line = $result; + } + } + } + } + } + + //$cmd->classifyBilled($user); // Disabled. This behavior must be set or not using the workflow module. + + if (!empty($createbills_onebythird) && empty($TFactThird[$cmd->socid])) { + $TFactThird[$cmd->socid] = $objecttmp; + } else { + $TFact[$objecttmp->id] = $objecttmp; + } + } + + // Build doc with all invoices + $TAllFact = empty($createbills_onebythird) ? $TFact : $TFactThird; + $toselect = array(); + + if (!$error && $validate_invoices) { + $massaction = $action = 'builddoc'; + + foreach ($TAllFact as &$objecttmp) { + $result = $objecttmp->validate($user); + if ($result <= 0) { + $error++; + setEventMessages($objecttmp->error, $objecttmp->errors, 'errors'); + break; + } + + $id = $objecttmp->id; // For builddoc action + + // Builddoc + $donotredirect = 1; + $upload_dir = $conf->facture->dir_output; + $permissiontoadd = $user->rights->facture->creer; + + // Call action to build doc + $savobject = $object; + $object = $objecttmp; + include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php'; + $object = $savobject; + } + + $massaction = $action = 'confirm_createbills'; + } + + if (!$error) { + $db->commit(); + + if ($nb_bills_created == 1) { + $texttoshow = $langs->trans('BillXCreated', '{s1}'); + $texttoshow = str_replace('{s1}', ''.$lastref.'', $texttoshow); + setEventMessages($texttoshow, null, 'mesgs'); + } else { + setEventMessages($langs->trans('BillCreated', $nb_bills_created), null, 'mesgs'); + } + + // Make a redirect to avoid to bill twice if we make a refresh or back + $param = ''; + if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { + $param .= '&contextpage='.urlencode($contextpage); + } + if ($limit > 0 && $limit != $conf->liste_limit) { + $param .= '&limit='.urlencode($limit); + } + if ($sall) { + $param .= '&sall='.urlencode($sall); + } + if ($socid > 0) { + $param .= '&socid='.urlencode($socid); + } + if ($search_status != '') { + $param .= '&search_status='.urlencode($search_status); + } + if ($search_orderday) { + $param .= '&search_orderday='.urlencode($search_orderday); + } + if ($search_ordermonth) { + $param .= '&search_ordermonth='.urlencode($search_ordermonth); + } + if ($search_orderyear) { + $param .= '&search_orderyear='.urlencode($search_orderyear); + } + if ($search_deliveryday) { + $param .= '&search_deliveryday='.urlencode($search_deliveryday); + } + if ($search_deliverymonth) { + $param .= '&search_deliverymonth='.urlencode($search_deliverymonth); + } + if ($search_deliveryyear) { + $param .= '&search_deliveryyear='.urlencode($search_deliveryyear); + } + if ($search_ref) { + $param .= '&search_ref='.urlencode($search_ref); + } + if ($search_company) { + $param .= '&search_company='.urlencode($search_company); + } + if ($search_ref_customer) { + $param .= '&search_ref_customer='.urlencode($search_ref_customer); + } + if ($search_user > 0) { + $param .= '&search_user='.urlencode($search_user); + } + if ($search_sale > 0) { + $param .= '&search_sale='.urlencode($search_sale); + } + if ($search_total_ht != '') { + $param .= '&search_total_ht='.urlencode($search_total_ht); + } + if ($search_total_vat != '') { + $param .= '&search_total_vat='.urlencode($search_total_vat); + } + if ($search_total_ttc != '') { + $param .= '&search_total_ttc='.urlencode($search_total_ttc); + } + if ($search_project_ref >= 0) { + $param .= "&search_project_ref=".urlencode($search_project_ref); + } + if ($show_files) { + $param .= '&show_files='.urlencode($show_files); + } + if ($optioncss != '') { + $param .= '&optioncss='.urlencode($optioncss); + } + if ($billed != '') { + $param .= '&billed='.urlencode($billed); + } + + header("Location: ".$_SERVER['PHP_SELF'].'?'.$param); + exit; + } else { + $db->rollback(); + + $action = 'create'; + $_GET["origin"] = $_POST["origin"]; + $_GET["originid"] = $_POST["originid"]; + setEventMessages("Error", null, 'errors'); + $error++; + } + } } if ($action == 'validate' && $permissiontoadd) { if (GETPOST('confirm') == 'yes') { diff --git a/htdocs/core/actions_massactions.inc.php b/htdocs/core/actions_massactions.inc.php index 5ec011f5017..c0a35947b9d 100644 --- a/htdocs/core/actions_massactions.inc.php +++ b/htdocs/core/actions_massactions.inc.php @@ -625,349 +625,6 @@ if (!$error && $massaction == 'confirm_presend') { } } -// TODO Move this action into commande/list.php if called only by this page. -if ($massaction == 'confirm_createbills') { // Create bills from orders. - $orders = GETPOST('toselect', 'array'); - $createbills_onebythird = GETPOST('createbills_onebythird', 'int'); - $validate_invoices = GETPOST('validate_invoices', 'int'); - - $errors = array(); - - $TFact = array(); - $TFactThird = array(); - $TFactThirdNbLines = array(); - - $nb_bills_created = 0; - $lastid= 0; - $lastref = ''; - - $db->begin(); - - foreach ($orders as $id_order) { - $cmd = new Commande($db); - if ($cmd->fetch($id_order) <= 0) { - continue; - } - $cmd->fetch_thirdparty(); - - $objecttmp = new Facture($db); - if (!empty($createbills_onebythird) && !empty($TFactThird[$cmd->socid])) { - // If option "one bill per third" is set, and an invoice for this thirdparty was already created, we re-use it. - $objecttmp = $TFactThird[$cmd->socid]; - } else { - // If we want one invoice per order or if there is no first invoice yet for this thirdparty. - $objecttmp->socid = $cmd->socid; - $objecttmp->thirdparty = $cmd->thirdparty; - - $objecttmp->type = $objecttmp::TYPE_STANDARD; - $objecttmp->cond_reglement_id = !empty($cmd->cond_reglement_id) ? $cmd->cond_reglement_id : $cmd->thirdparty->cond_reglement_id; - $objecttmp->mode_reglement_id = !empty($cmd->mode_reglement_id) ? $cmd->mode_reglement_id : $cmd->thirdparty->mode_reglement_id; - - $objecttmp->fk_project = $cmd->fk_project; - $objecttmp->multicurrency_code = $cmd->multicurrency_code; - if (empty($createbills_onebythird)) { - $objecttmp->ref_client = $cmd->ref_client; - } - - $datefacture = dol_mktime(12, 0, 0, GETPOST('remonth', 'int'), GETPOST('reday', 'int'), GETPOST('reyear', 'int')); - if (empty($datefacture)) { - $datefacture = dol_now(); - } - - $objecttmp->date = $datefacture; - $objecttmp->origin = 'commande'; - $objecttmp->origin_id = $id_order; - - $objecttmp->array_options = $cmd->array_options; // Copy extrafields - - $res = $objecttmp->create($user); - - if ($res > 0) { - $nb_bills_created++; - $lastref = $objecttmp->ref; - $lastid = $objecttmp->id; - - $TFactThird[$cmd->socid] = $objecttmp; - $TFactThirdNbLines[$cmd->socid] = 0; //init nblines to have lines ordered by expedition and rang - } else { - $langs->load("errors"); - $errors[] = $cmd->ref.' : '.$langs->trans($objecttmp->error); - $error++; - } - } - - if ($objecttmp->id > 0) { - $res = $objecttmp->add_object_linked($objecttmp->origin, $id_order); - - if ($res == 0) { - $errors[] = $objecttmp->error; - $error++; - } - - if (!$error) { - $lines = $cmd->lines; - if (empty($lines) && method_exists($cmd, 'fetch_lines')) { - $cmd->fetch_lines(); - $lines = $cmd->lines; - } - - $fk_parent_line = 0; - $num = count($lines); - - for ($i = 0; $i < $num; $i++) { - $desc = ($lines[$i]->desc ? $lines[$i]->desc : ''); - // If we build one invoice for several orders, we must put the ref of order on the invoice line - if (!empty($createbills_onebythird)) { - $desc = dol_concatdesc($desc, $langs->trans("Order").' '.$cmd->ref.' - '.dol_print_date($cmd->date, 'day')); - } - - if ($lines[$i]->subprice < 0) { - // Negative line, we create a discount line - $discount = new DiscountAbsolute($db); - $discount->fk_soc = $objecttmp->socid; - $discount->amount_ht = abs($lines[$i]->total_ht); - $discount->amount_tva = abs($lines[$i]->total_tva); - $discount->amount_ttc = abs($lines[$i]->total_ttc); - $discount->tva_tx = $lines[$i]->tva_tx; - $discount->fk_user = $user->id; - $discount->description = $desc; - $discountid = $discount->create($user); - if ($discountid > 0) { - $result = $objecttmp->insert_discount($discountid); - //$result=$discount->link_to_invoice($lineid,$id); - } else { - setEventMessages($discount->error, $discount->errors, 'errors'); - $error++; - break; - } - } else { - // Positive line - $product_type = ($lines[$i]->product_type ? $lines[$i]->product_type : 0); - // Date start - $date_start = false; - if ($lines[$i]->date_debut_prevue) { - $date_start = $lines[$i]->date_debut_prevue; - } - if ($lines[$i]->date_debut_reel) { - $date_start = $lines[$i]->date_debut_reel; - } - if ($lines[$i]->date_start) { - $date_start = $lines[$i]->date_start; - } - //Date end - $date_end = false; - if ($lines[$i]->date_fin_prevue) { - $date_end = $lines[$i]->date_fin_prevue; - } - if ($lines[$i]->date_fin_reel) { - $date_end = $lines[$i]->date_fin_reel; - } - if ($lines[$i]->date_end) { - $date_end = $lines[$i]->date_end; - } - // Reset fk_parent_line for no child products and special product - if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) { - $fk_parent_line = 0; - } - - // Extrafields - if (method_exists($lines[$i], 'fetch_optionals')) { - $lines[$i]->fetch_optionals(); - $array_options = $lines[$i]->array_options; - } - - $objecttmp->context['createfromclone']; - - $rang = $lines[$i]->rang; - //there may already be rows from previous orders - if (!empty($createbills_onebythird)) - $rang = $TFactThirdNbLines[$cmd->socid]; - - $result = $objecttmp->addline( - $desc, - $lines[$i]->subprice, - $lines[$i]->qty, - $lines[$i]->tva_tx, - $lines[$i]->localtax1_tx, - $lines[$i]->localtax2_tx, - $lines[$i]->fk_product, - $lines[$i]->remise_percent, - $date_start, - $date_end, - 0, - $lines[$i]->info_bits, - $lines[$i]->fk_remise_except, - 'HT', - 0, - $product_type, - $rang, - $lines[$i]->special_code, - $objecttmp->origin, - $lines[$i]->rowid, - $fk_parent_line, - $lines[$i]->fk_fournprice, - $lines[$i]->pa_ht, - $lines[$i]->label, - $array_options, - 100, - 0, - $lines[$i]->fk_unit - ); - if ($result > 0) { - $lineid = $result; - if (!empty($createbills_onebythird)) //increment rang to keep order - $TFactThirdNbLines[$rcp->socid]++; - } else { - $lineid = 0; - $error++; - break; - } - // Defined the new fk_parent_line - if ($result > 0 && $lines[$i]->product_type == 9) { - $fk_parent_line = $result; - } - } - } - } - } - - //$cmd->classifyBilled($user); // Disabled. This behavior must be set or not using the workflow module. - - if (!empty($createbills_onebythird) && empty($TFactThird[$cmd->socid])) { - $TFactThird[$cmd->socid] = $objecttmp; - } else { - $TFact[$objecttmp->id] = $objecttmp; - } - } - - // Build doc with all invoices - $TAllFact = empty($createbills_onebythird) ? $TFact : $TFactThird; - $toselect = array(); - - if (!$error && $validate_invoices) { - $massaction = $action = 'builddoc'; - - foreach ($TAllFact as &$objecttmp) { - $result = $objecttmp->validate($user); - if ($result <= 0) { - $error++; - setEventMessages($objecttmp->error, $objecttmp->errors, 'errors'); - break; - } - - $id = $objecttmp->id; // For builddoc action - - // Builddoc - $donotredirect = 1; - $upload_dir = $conf->facture->dir_output; - $permissiontoadd = $user->rights->facture->creer; - - // Call action to build doc - $savobject = $object; - $object = $objecttmp; - include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php'; - $object = $savobject; - } - - $massaction = $action = 'confirm_createbills'; - } - - if (!$error) { - $db->commit(); - - if ($nb_bills_created == 1) { - $texttoshow = $langs->trans('BillXCreated', '{s1}'); - $texttoshow = str_replace('{s1}', ''.$lastref.'', $texttoshow); - setEventMessages($texttoshow, null, 'mesgs'); - } else { - setEventMessages($langs->trans('BillCreated', $nb_bills_created), null, 'mesgs'); - } - - // Make a redirect to avoid to bill twice if we make a refresh or back - $param = ''; - if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { - $param .= '&contextpage='.urlencode($contextpage); - } - if ($limit > 0 && $limit != $conf->liste_limit) { - $param .= '&limit='.urlencode($limit); - } - if ($sall) { - $param .= '&sall='.urlencode($sall); - } - if ($socid > 0) { - $param .= '&socid='.urlencode($socid); - } - if ($search_status != '') { - $param .= '&search_status='.urlencode($search_status); - } - if ($search_orderday) { - $param .= '&search_orderday='.urlencode($search_orderday); - } - if ($search_ordermonth) { - $param .= '&search_ordermonth='.urlencode($search_ordermonth); - } - if ($search_orderyear) { - $param .= '&search_orderyear='.urlencode($search_orderyear); - } - if ($search_deliveryday) { - $param .= '&search_deliveryday='.urlencode($search_deliveryday); - } - if ($search_deliverymonth) { - $param .= '&search_deliverymonth='.urlencode($search_deliverymonth); - } - if ($search_deliveryyear) { - $param .= '&search_deliveryyear='.urlencode($search_deliveryyear); - } - if ($search_ref) { - $param .= '&search_ref='.urlencode($search_ref); - } - if ($search_company) { - $param .= '&search_company='.urlencode($search_company); - } - if ($search_ref_customer) { - $param .= '&search_ref_customer='.urlencode($search_ref_customer); - } - if ($search_user > 0) { - $param .= '&search_user='.urlencode($search_user); - } - if ($search_sale > 0) { - $param .= '&search_sale='.urlencode($search_sale); - } - if ($search_total_ht != '') { - $param .= '&search_total_ht='.urlencode($search_total_ht); - } - if ($search_total_vat != '') { - $param .= '&search_total_vat='.urlencode($search_total_vat); - } - if ($search_total_ttc != '') { - $param .= '&search_total_ttc='.urlencode($search_total_ttc); - } - if ($search_project_ref >= 0) { - $param .= "&search_project_ref=".urlencode($search_project_ref); - } - if ($show_files) { - $param .= '&show_files='.urlencode($show_files); - } - if ($optioncss != '') { - $param .= '&optioncss='.urlencode($optioncss); - } - if ($billed != '') { - $param .= '&billed='.urlencode($billed); - } - - header("Location: ".$_SERVER['PHP_SELF'].'?'.$param); - exit; - } else { - $db->rollback(); - - $action = 'create'; - $_GET["origin"] = $_POST["origin"]; - $_GET["originid"] = $_POST["originid"]; - setEventMessages("Error", null, 'errors'); - $error++; - } -} - if (!$error && $massaction == 'cancelorders') { $db->begin(); From e9cfb9b69c17678e9eca50ddb19da5d10cce0fcb Mon Sep 17 00:00:00 2001 From: Francis Appels Date: Mon, 25 Apr 2022 11:24:09 +0200 Subject: [PATCH 202/738] Improve error handling confirm_billcreate --- htdocs/commande/list.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index 4859412f692..38d79aa9698 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -368,7 +368,7 @@ if (empty($reshook)) { $TFactThirdNbLines[$cmd->socid] = 0; //init nblines to have lines ordered by expedition and rang } else { $langs->load("errors"); - $errors[] = $cmd->ref.' : '.$langs->trans($objecttmp->error); + $errors[] = $cmd->ref.' : '.$langs->trans($objecttmp->errors[0]); $error++; } } @@ -377,7 +377,7 @@ if (empty($reshook)) { $res = $objecttmp->add_object_linked($objecttmp->origin, $id_order); if ($res == 0) { - $errors[] = $objecttmp->error; + $errors[] = $cmd->ref.' : '.$langs->trans($objecttmp->errors[0]); $error++; } @@ -640,7 +640,11 @@ if (empty($reshook)) { $action = 'create'; $_GET["origin"] = $_POST["origin"]; $_GET["originid"] = $_POST["originid"]; - setEventMessages("Error", null, 'errors'); + if (!empty($errors)) { + setEventMessages(null, $errors, 'errors'); + } else { + setEventMessages("Error", null, 'errors'); + } $error++; } } From 40da13922506d9a108d731e51c8eb42dd0fe51ec Mon Sep 17 00:00:00 2001 From: Francis Appels Date: Mon, 25 Apr 2022 13:58:33 +0200 Subject: [PATCH 203/738] Add hook massaction to reception list. --- htdocs/reception/list.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/htdocs/reception/list.php b/htdocs/reception/list.php index 8575c84c026..b3b039c2f68 100644 --- a/htdocs/reception/list.php +++ b/htdocs/reception/list.php @@ -166,6 +166,15 @@ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x' } if (empty($reshook)) { + // Mass actions + $objectclass = 'Reception'; + $objectlabel = 'Receptions'; + $permissiontoread = $user->rights->reception->lire; + $permissiontoadd = $user->rights->reception->creer; + $permissiontodelete = $user->rights->reception->supprimer; + $uploaddir = $conf->reception->multidir_output[$conf->entity]; + include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php'; + if ($massaction == 'confirm_createbills') { $receptions = GETPOST('toselect', 'array'); $createbills_onebythird = GETPOST('createbills_onebythird', 'int'); From 752aaeb275a7cf028cb0cf1b2624bb09271745dc Mon Sep 17 00:00:00 2001 From: BENKE Charlene <1179011+defrance@users.noreply.github.com> Date: Mon, 25 Apr 2022 14:07:48 +0200 Subject: [PATCH 204/738] fix : allow cut&paste as real numeric value to excel --- htdocs/compta/resultat/index.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/resultat/index.php b/htdocs/compta/resultat/index.php index ff770acf554..68068dec866 100644 --- a/htdocs/compta/resultat/index.php +++ b/htdocs/compta/resultat/index.php @@ -1042,7 +1042,7 @@ for ($mois = 1 + $nb_mois_decalage; $mois <= 12 + $nb_mois_decalage; $mois++) { } $case = strftime("%Y-%m", dol_mktime(12, 0, 0, $mois_modulo, 1, $annee_decalage)); - print ' '; + print ''; if ($modecompta == 'CREANCES-DETTES' || $modecompta == 'BOOKKEEPING') { if (isset($decaiss[$case]) && $decaiss[$case] != 0) { print ''.price(price2num($decaiss[$case], 'MT')).''; @@ -1062,7 +1062,7 @@ for ($mois = 1 + $nb_mois_decalage; $mois <= 12 + $nb_mois_decalage; $mois++) { } print ""; - print ' '; + print ''; if ($modecompta == 'CREANCES-DETTES' || $modecompta == 'BOOKKEEPING') { if (isset($encaiss[$case])) { print ''.price(price2num($encaiss[$case], 'MT')).''; From 7e44227df24cc4df1441d2a231ca43c8b72aaaa9 Mon Sep 17 00:00:00 2001 From: Francis Appels Date: Mon, 25 Apr 2022 14:28:57 +0200 Subject: [PATCH 205/738] Cleanup 'confirm_createbills' --- htdocs/adherents/list.php | 2 +- htdocs/adherents/subscription/list.php | 2 +- htdocs/contrat/services_list.php | 2 +- htdocs/fichinter/list.php | 2 +- htdocs/fourn/facture/list.php | 45 ++------------------------ htdocs/projet/list.php | 2 +- htdocs/projet/tasks/list.php | 2 +- htdocs/projet/tasks/time.php | 2 -- htdocs/user/group/list.php | 2 +- htdocs/user/list.php | 2 +- 10 files changed, 11 insertions(+), 52 deletions(-) diff --git a/htdocs/adherents/list.php b/htdocs/adherents/list.php index 1936d855a7e..8dacc74722e 100644 --- a/htdocs/adherents/list.php +++ b/htdocs/adherents/list.php @@ -172,7 +172,7 @@ $result = restrictedArea($user, 'adherent'); if (GETPOST('cancel', 'alpha')) { $action = 'list'; $massaction = ''; } -if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend' && $massaction != 'confirm_createbills') { +if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') { $massaction = ''; } diff --git a/htdocs/adherents/subscription/list.php b/htdocs/adherents/subscription/list.php index 0b83881e502..aed531d86b4 100644 --- a/htdocs/adherents/subscription/list.php +++ b/htdocs/adherents/subscription/list.php @@ -111,7 +111,7 @@ $result = restrictedArea($user, 'adherent', '', '', 'cotisation'); if (GETPOST('cancel', 'alpha')) { $action = 'list'; $massaction = ''; } -if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend' && $massaction != 'confirm_createbills') { +if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') { $massaction = ''; } diff --git a/htdocs/contrat/services_list.php b/htdocs/contrat/services_list.php index adf7a4b6ed7..f12d48df44a 100644 --- a/htdocs/contrat/services_list.php +++ b/htdocs/contrat/services_list.php @@ -163,7 +163,7 @@ $arrayfields = dol_sort_array($arrayfields, 'position'); if (GETPOST('cancel', 'alpha')) { $action = 'list'; $massaction = ''; } -if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend' && $massaction != 'confirm_createbills') { +if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') { $massaction = ''; } diff --git a/htdocs/fichinter/list.php b/htdocs/fichinter/list.php index 46a9f2eee3f..04d98031e36 100644 --- a/htdocs/fichinter/list.php +++ b/htdocs/fichinter/list.php @@ -149,7 +149,7 @@ $arrayfields = dol_sort_array($arrayfields, 'position'); if (GETPOST('cancel', 'alpha')) { $action = 'list'; $massaction = ''; } -if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend' && $massaction != 'confirm_createbills') { +if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') { $massaction = ''; } diff --git a/htdocs/fourn/facture/list.php b/htdocs/fourn/facture/list.php index 0e682351992..f110ab78e82 100644 --- a/htdocs/fourn/facture/list.php +++ b/htdocs/fourn/facture/list.php @@ -228,7 +228,7 @@ if ((empty($user->rights->fournisseur->facture->lire) && empty($conf->global->MA if (GETPOST('cancel', 'alpha')) { $action = 'list'; $massaction = ''; } -if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend' && $massaction != 'confirm_createbills') { +if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') { $massaction = ''; } @@ -829,7 +829,7 @@ if ($resql) { //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"), //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"), ); - //if($user->rights->fournisseur->facture->creer) $arrayofmassactions['createbills']=$langs->trans("CreateInvoiceForThisCustomer"); + if (!empty($conf->paymentbybanktransfer->enabled) && !empty($user->rights->paymentbybanktransfer->create)) { $langs->load('withdrawals'); $arrayofmassactions['banktransfertrequest'] = img_picto('', 'payment', 'class="pictofixedwidth"').$langs->trans("MakeBankTransferOrder"); @@ -837,7 +837,7 @@ if ($resql) { if ($user->rights->fournisseur->facture->supprimer) { $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete"); } - if (in_array($massaction, array('presend', 'predelete', 'createbills'))) { + if (in_array($massaction, array('presend', 'predelete'))) { $arrayofmassactions = array(); } $massactionbutton = $form->selectMassAction('', $arrayofmassactions); @@ -868,45 +868,6 @@ if ($resql) { $trackid = 'sinv'.$object->id; include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php'; - if ($massaction == 'createbills') { - //var_dump($_REQUEST); - print ''; - - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print '
'; - print $langs->trans('DateInvoice'); - print ''; - print $form->selectDate('', '', '', '', '', '', 1, 1); - print '
'; - print $langs->trans('CreateOneBillByThird'); - print ''; - print $form->selectyesno('createbills_onebythird', '', 1); - print '
'; - print $langs->trans('ValidateInvoices'); - print ''; - print $form->selectyesno('validate_invoices', 1, 1); - print '
'; - - print '
'; - print '
'; - print ' '; - print ''; - print '
'; - print '
'; - } - if ($search_all) { foreach ($fieldstosearchall as $key => $val) { $fieldstosearchall[$key] = $langs->trans($val); diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php index b254ac2b26f..93c92231bfd 100644 --- a/htdocs/projet/list.php +++ b/htdocs/projet/list.php @@ -226,7 +226,7 @@ $arrayfields = dol_sort_array($arrayfields, 'position'); if (GETPOST('cancel', 'alpha')) { $action = 'list'; $massaction = ''; } -if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend' && $massaction != 'confirm_createbills') { +if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') { $massaction = ''; } diff --git a/htdocs/projet/tasks/list.php b/htdocs/projet/tasks/list.php index d71cd9bca56..6d9e44c3799 100644 --- a/htdocs/projet/tasks/list.php +++ b/htdocs/projet/tasks/list.php @@ -185,7 +185,7 @@ if (GETPOST('cancel', 'alpha')) { $action = 'list'; $massaction = ''; } -if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend' && $massaction != 'confirm_createbills') { +if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') { $massaction = ''; } diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php index 1b8e116092f..4374ffb2d37 100644 --- a/htdocs/projet/tasks/time.php +++ b/htdocs/projet/tasks/time.php @@ -1149,8 +1149,6 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser // Form to convert time spent into invoice if ($massaction == 'generateinvoice') { - print ''; - if ($projectstatic->thirdparty->id > 0) { print ''; print ''; diff --git a/htdocs/user/group/list.php b/htdocs/user/group/list.php index 04fa0035418..bf8bd407093 100644 --- a/htdocs/user/group/list.php +++ b/htdocs/user/group/list.php @@ -92,7 +92,7 @@ if (!$user->rights->user->user->lire && !$user->admin) { if (GETPOST('cancel', 'alpha')) { $action = 'list'; $massaction = ''; } -if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend' && $massaction != 'confirm_createbills') { +if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') { $massaction = ''; } diff --git a/htdocs/user/list.php b/htdocs/user/list.php index cd87e286225..4ae920e6dc7 100644 --- a/htdocs/user/list.php +++ b/htdocs/user/list.php @@ -203,7 +203,7 @@ $childids = $user->getAllChildIds(1); if (GETPOST('cancel', 'alpha')) { $action = 'list'; $massaction = ''; } -if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend' && $massaction != 'confirm_createbills') { +if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') { $massaction = ''; } From 22b56bde9eab474052e3b4c54ffd8d877c677819 Mon Sep 17 00:00:00 2001 From: Francis Appels Date: Mon, 25 Apr 2022 14:30:55 +0200 Subject: [PATCH 206/738] Update changelog --- ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 31bfa1c1cff..428829038f2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -34,7 +34,7 @@ Following changes may create regressions for some external modules, but were nec * The deprecated method thirdparty_doc_create() has been removed. You can use the generateDocument() instead. * All triggers with a name XXX_UPDATE have been rename with name XXX_MODIFY for code consistency purpose. * Rename build_path_from_id_categ() into buildPathFromId() and set method to private - +* Move massaction 'confirm_createbills' from actions_massactions.inc.php to commande/list.php ***** ChangeLog for 15.0.1 compared to 15.0.0 ***** FIX: #19777 #20281 From 7f1d5fa86731b66d68b95d13a6750a365e471486 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Mon, 25 Apr 2022 12:43:58 +0000 Subject: [PATCH 207/738] Fixing style errors. --- htdocs/fourn/facture/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/fourn/facture/list.php b/htdocs/fourn/facture/list.php index f110ab78e82..b8ad5e68415 100644 --- a/htdocs/fourn/facture/list.php +++ b/htdocs/fourn/facture/list.php @@ -829,7 +829,7 @@ if ($resql) { //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"), //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"), ); - + if (!empty($conf->paymentbybanktransfer->enabled) && !empty($user->rights->paymentbybanktransfer->create)) { $langs->load('withdrawals'); $arrayofmassactions['banktransfertrequest'] = img_picto('', 'payment', 'class="pictofixedwidth"').$langs->trans("MakeBankTransferOrder"); From 694bcda3bbdbac9b79a74cf6b51df477be5660a7 Mon Sep 17 00:00:00 2001 From: daraelmin Date: Mon, 25 Apr 2022 22:26:25 +0200 Subject: [PATCH 208/738] Fix #20712 - No more empty wrong line added in bookkeeping confirme_create mode --- htdocs/accountancy/bookkeeping/card.php | 63 ++++++++++++++----------- 1 file changed, 35 insertions(+), 28 deletions(-) diff --git a/htdocs/accountancy/bookkeeping/card.php b/htdocs/accountancy/bookkeeping/card.php index c156a388735..0aa57dde3c6 100644 --- a/htdocs/accountancy/bookkeeping/card.php +++ b/htdocs/accountancy/bookkeeping/card.php @@ -260,7 +260,7 @@ if ($action == "confirm_update") { if ($mode != '_tmp') { setEventMessages($langs->trans('RecordSaved'), null, 'mesgs'); } - $action = 'update'; + $action = ''; $id = $object->id; $piece_num = $object->piece_num; } @@ -642,6 +642,12 @@ if ($action == 'create') { } print "\n"; + + // Empty line is the first line of $object->linesmvt + // So we must get the first line (the empty one) and pu it at the end of the array + // in order to display it correctly to the user + $empty_line = array_shift($object->linesmvt); + $object->linesmvt[]= $empty_line; foreach ($object->linesmvt as $line) { print ''; @@ -673,7 +679,33 @@ if ($action == 'create') { print ''."\n"; print ''; print ''; + } elseif (empty($line->numero_compte) || (empty($line->debit) &&empty($line->creit))) { + if ($action == "" || $action == 'add') { + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + } } else { + print ''; $accountingaccount->fetch(null, $line->numero_compte, true); print ''; print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - } - print '
'; + print $formaccounting->select_account('', 'accountingaccount_number', 1, array(), 1, 1, ''); + print ''; + // TODO For the moment we keep a free input text instead of a combo. The select_auxaccount has problem because: + // It does not use the setup of "key pressed" to select a thirdparty and this hang browser on large databases. + // Also, it is not possible to use a value that is not in the list. + // Also, the label is not automatically filled when a value is selected. + if (!empty($conf->global->ACCOUNTANCY_COMBO_FOR_AUX)) { + print $formaccounting->select_auxaccount('', 'subledger_account', 1, 'maxwidth250', '', 'subledger_label'); + } else { + print ''; + } + print '
'; + print '
'; + print ''; + print ''.$accountingaccount->getNomUrl(0, 1, 1, '', 0).''.length_accounta($line->subledger_account); @@ -715,33 +747,8 @@ if ($action == 'create') { setEventMessages(null, array($langs->trans('MvtNotCorrectlyBalanced', $total_debit, $total_credit)), 'warnings'); } - if (empty($object->date_export) && empty($object->date_validation)) { - if ($action == "" || $action == 'add') { - print '
'; - print $formaccounting->select_account('', 'accountingaccount_number', 1, array(), 1, 1, ''); - print ''; - // TODO For the moment we keep a free input text instead of a combo. The select_auxaccount has problem because: - // It does not use the setup of "key pressed" to select a thirdparty and this hang browser on large databases. - // Also, it is not possible to use a value that is not in the list. - // Also, the label is not automatically filled when a value is selected. - if (!empty($conf->global->ACCOUNTANCY_COMBO_FOR_AUX)) { - print $formaccounting->select_auxaccount('', 'subledger_account', 1); - } else { - print ''; - } - print '
'; - print '
'; - } + print ''; + print ''; if ($mode == '_tmp' && $action == '') { print '
'; From 6a1d4c2255a0ac9fa77a97960f7315511dd893ce Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Mon, 25 Apr 2022 20:36:34 +0000 Subject: [PATCH 209/738] Fixing style errors. --- htdocs/accountancy/bookkeeping/card.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/accountancy/bookkeeping/card.php b/htdocs/accountancy/bookkeeping/card.php index 0aa57dde3c6..0eff932fd19 100644 --- a/htdocs/accountancy/bookkeeping/card.php +++ b/htdocs/accountancy/bookkeeping/card.php @@ -642,7 +642,7 @@ if ($action == 'create') { } print "\n"; - + // Empty line is the first line of $object->linesmvt // So we must get the first line (the empty one) and pu it at the end of the array // in order to display it correctly to the user @@ -703,7 +703,7 @@ if ($action == 'create') { print ''; print ''; print ''; - } + } } else { print ''; $accountingaccount->fetch(null, $line->numero_compte, true); From fb1c770568e139c4e4cf19a1db51e820f768d110 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 25 Apr 2022 23:37:34 +0200 Subject: [PATCH 210/738] Doc --- htdocs/install/mysql/migration/repair.sql | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/htdocs/install/mysql/migration/repair.sql b/htdocs/install/mysql/migration/repair.sql index 2e7f42a2727..4add688b880 100644 --- a/htdocs/install/mysql/migration/repair.sql +++ b/htdocs/install/mysql/migration/repair.sql @@ -559,6 +559,10 @@ DELETE FROM llx_rights_def WHERE module = 'hrm' AND perms = 'employee'; -- Sequence to fix the content of llx_bank.amount_main_currency +-- Note: amount is amount in currency of bank account +-- Note: pamount is always amount into the main currency +-- Note: pmulticurrencyamount is in currency of invoice +-- Note: amount_main_currency must be amount in main currency -- DROP TABLE tmp_bank; -- CREATE TABLE tmp_bank SELECT b.rowid, b.amount, p.rowid as pid, p.amount as pamount, p.multicurrency_amount as pmulticurrencyamount FROM llx_bank as b INNER JOIN llx_bank_url as bu ON bu.fk_bank=b.rowid AND bu.type = 'payment' INNER JOIN llx_paiement as p ON bu.url_id = p.rowid WHERE p.multicurrency_amount <> 0 AND p.multicurrency_amount <> p.amount; -- UPDATE llx_bank as b SET b.amount_main_currency = (SELECT tb.pamount FROM tmp_bank as tb WHERE tb.rowid = b.rowid) WHERE b.amount_main_currency IS NULL; From 8de9d63f7df725cdc5d4e59c37b0961e6f59c570 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 26 Apr 2022 00:35:20 +0200 Subject: [PATCH 211/738] FIX Numbering of sepa files --- htdocs/compta/prelevement/class/bonprelevement.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/prelevement/class/bonprelevement.class.php b/htdocs/compta/prelevement/class/bonprelevement.class.php index 27c96bd47db..afd6b5e075c 100644 --- a/htdocs/compta/prelevement/class/bonprelevement.class.php +++ b/htdocs/compta/prelevement/class/bonprelevement.class.php @@ -920,7 +920,7 @@ class BonPrelevement extends CommonObject $sql = "SELECT substring(ref from char_length(ref) - 1)"; // To extract "YYMMXX" from "TYYMMXX" $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_bons"; - $sql .= " WHERE ref LIKE '%".$this->db->escape($ref)."%'"; + $sql .= " WHERE ref LIKE '_".$this->db->escape($ref)."%'"; $sql .= " AND entity = ".((int) $conf->entity); $sql .= " ORDER BY ref DESC LIMIT 1"; @@ -931,7 +931,7 @@ class BonPrelevement extends CommonObject $row = $this->db->fetch_row($resql); // Build the new ref - $ref = "T".$ref.str_pad(dol_substr("00".(intval($row[0]) + 1), 0, 2), 2, "0", STR_PAD_LEFT); + $ref = "T".$ref.sprintf("%02d", (intval($row[0]) + 1)); // $conf->abc->dir_output may be: // /home/ldestailleur/git/dolibarr_15.0/documents/abc/ From 134113db646f49d3a97314282e0dea679fdc5843 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 26 Apr 2022 01:00:10 +0200 Subject: [PATCH 212/738] Fix upload of doc for purchase orders --- htdocs/api/class/api_documents.class.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/htdocs/api/class/api_documents.class.php b/htdocs/api/class/api_documents.class.php index da49e4cbba7..44c3b1fcb52 100644 --- a/htdocs/api/class/api_documents.class.php +++ b/htdocs/api/class/api_documents.class.php @@ -597,6 +597,16 @@ class Documents extends DolibarrApi require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php'; $object = new FactureFournisseur($this->db); + } elseif ($modulepart == 'commande' || $modulepart == 'order') { + $modulepart = 'commande'; + + require_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php'; + $object = new Commande($this->db); + } elseif ($modulepart == 'commande_fournisseur' || $modulepart == 'supplier_order') { + $modulepart = 'supplier_order'; + + require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php'; + $object = new CommandeFournisseur($this->db); } elseif ($modulepart == 'project') { require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'; $object = new Project($this->db); @@ -655,7 +665,7 @@ class Documents extends DolibarrApi } // Special cases that need to use get_exdir to get real dir of object - // If future, all object should use this to define path of documents. + // In future, all object should use this to define path of documents. if ($modulepart == 'supplier_invoice') { $tmpreldir = get_exdir($object->id, 2, 0, 0, $object, 'invoice_supplier'); } From 8980b2e6c09a3d55808ae10b23ecc36a8715d952 Mon Sep 17 00:00:00 2001 From: matll42 Date: Tue, 26 Apr 2022 01:44:53 +0200 Subject: [PATCH 213/738] FIX #20476 migration postgresql 14.0.x to 15.0.x packaging type --- htdocs/install/mysql/migration/14.0.0-15.0.0.sql | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/install/mysql/migration/14.0.0-15.0.0.sql b/htdocs/install/mysql/migration/14.0.0-15.0.0.sql index 4b34d3a72ac..58f29acfe60 100644 --- a/htdocs/install/mysql/migration/14.0.0-15.0.0.sql +++ b/htdocs/install/mysql/migration/14.0.0-15.0.0.sql @@ -36,7 +36,8 @@ -- VPGSQL8.2 ALTER TABLE llx_partnership ALTER COLUMN date_partnership_end DROP NOT NULL; ALTER TABLE llx_product_fournisseur_price ADD COLUMN packaging real DEFAULT NULL; -ALTER TABLE llx_product_fournisseur_price MODIFY COLUMN packaging real DEFAULT NULL; +-- VMYSQL4.3 ALTER TABLE llx_product_fournisseur_price MODIFY COLUMN packaging real DEFAULT NULL; +-- VPGSQL8.2 ALTER TABLE llx_product_fournisseur_price MODIFY COLUMN packaging real DEFAULT NULL USING packaging::real; ALTER TABLE llx_accounting_bookkeeping ADD COLUMN date_export datetime DEFAULT NULL; From 8d3c2e34f42b8d237c75c022090052da46839cf0 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Tue, 26 Apr 2022 11:46:00 +0200 Subject: [PATCH 214/738] FIX Check field accountancy code customer is mandatory in mass action --- htdocs/compta/facture/class/facture.class.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 7ad0a8ed4bc..2134570ee2e 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -2724,7 +2724,7 @@ class Facture extends CommonInvoice // Check for mandatory fields in thirdparty (defined into setup) if (!empty($this->thirdparty) && is_object($this->thirdparty)) { - $array_to_check = array('IDPROF1', 'IDPROF2', 'IDPROF3', 'IDPROF4', 'IDPROF5', 'IDPROF6', 'EMAIL'); + $array_to_check = array('IDPROF1', 'IDPROF2', 'IDPROF3', 'IDPROF4', 'IDPROF5', 'IDPROF6', 'EMAIL', 'ACCOUNTANCY_CODE_CUSTOMER'); foreach ($array_to_check as $key) { $keymin = strtolower($key); if (!property_exists($this->thirdparty, $keymin)) { @@ -2756,6 +2756,15 @@ class Facture extends CommonInvoice return -1; } } + if ($key == 'ACCOUNTANCY_CODE_CUSTOMER') { + // Check for mandatory + if (!empty($conf->global->SOCIETE_ACCOUNTANCY_CODE_CUSTOMER_INVOICE_MANDATORY) && empty($this->thirdparty->code_compta)) { + $langs->load("errors"); + $this->error = $langs->trans("ErrorAccountancyCodeCustomerIsMandatory", $this->thirdparty->name).' ('.$langs->trans("ForbiddenBySetupRules").')'; + dol_syslog(__METHOD__.' '.$this->error, LOG_ERR); + return -1; + } + } } } } From c00a56bee3ce475fa268ea3cb707465702f6b4eb Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Tue, 26 Apr 2022 16:39:06 +0200 Subject: [PATCH 215/738] fix: truncate too long Ref Customer in PDF Header --- htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php | 2 +- htdocs/core/modules/facture/doc/pdf_sponge.modules.php | 2 +- htdocs/core/modules/propale/doc/pdf_cyan.modules.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php b/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php index 6486306d9ed..96966606e1c 100644 --- a/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php +++ b/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php @@ -1504,7 +1504,7 @@ class pdf_eratosthene extends ModelePDFCommandes $posy += 4; $pdf->SetXY($posx, $posy); $pdf->SetTextColor(0, 0, 60); - $pdf->MultiCell($w, 3, $outputlangs->transnoentities("RefCustomer")." : ".$outputlangs->convToOutputCharset($object->ref_client), '', 'R'); + $pdf->MultiCell($w, 3, $outputlangs->transnoentities("RefCustomer")." : ".dol_trunc($outputlangs->convToOutputCharset($object->ref_client), 65), '', 'R'); } if (!empty($conf->global->PDF_SHOW_PROJECT_TITLE)) { diff --git a/htdocs/core/modules/facture/doc/pdf_sponge.modules.php b/htdocs/core/modules/facture/doc/pdf_sponge.modules.php index 3134bbc63f5..1bbbb2c9f3f 100644 --- a/htdocs/core/modules/facture/doc/pdf_sponge.modules.php +++ b/htdocs/core/modules/facture/doc/pdf_sponge.modules.php @@ -1961,7 +1961,7 @@ class pdf_sponge extends ModelePDFFactures $posy += 4; $pdf->SetXY($posx, $posy); $pdf->SetTextColor(0, 0, 60); - $pdf->MultiCell($w, 3, $outputlangs->transnoentities("RefCustomer")." : ".$outputlangs->convToOutputCharset($object->ref_client), '', 'R'); + $pdf->MultiCell($w, 3, $outputlangs->transnoentities("RefCustomer")." : ".dol_trunc($outputlangs->convToOutputCharset($object->ref_client), 65), '', 'R'); } if (!empty($conf->global->PDF_SHOW_PROJECT_TITLE)) { diff --git a/htdocs/core/modules/propale/doc/pdf_cyan.modules.php b/htdocs/core/modules/propale/doc/pdf_cyan.modules.php index 5fb9949acd3..cb2df1a5ed9 100644 --- a/htdocs/core/modules/propale/doc/pdf_cyan.modules.php +++ b/htdocs/core/modules/propale/doc/pdf_cyan.modules.php @@ -1595,7 +1595,7 @@ class pdf_cyan extends ModelePDFPropales $posy += 4; $pdf->SetXY($posx, $posy); $pdf->SetTextColor(0, 0, 60); - $pdf->MultiCell($w, 3, $outputlangs->transnoentities("RefCustomer")." : ".$outputlangs->convToOutputCharset($object->ref_client), '', 'R'); + $pdf->MultiCell($w, 3, $outputlangs->transnoentities("RefCustomer")." : ".dol_trunc($outputlangs->convToOutputCharset($object->ref_client), 65), '', 'R'); } if (!empty($conf->global->PDF_SHOW_PROJECT_TITLE)) { From 399addfb033e07924ec988a65b87329d925b8a7e Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Tue, 26 Apr 2022 16:40:27 +0200 Subject: [PATCH 216/738] mor docs --- .../core/modules/supplier_proposal/doc/pdf_aurore.modules.php | 2 +- .../doc/pdf_standard_recruitmentjobposition.modules.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php b/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php index 7e1b1105452..f2d2a473145 100644 --- a/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php +++ b/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php @@ -1336,7 +1336,7 @@ class pdf_aurore extends ModelePDFSupplierProposal $posy += 4; $pdf->SetXY($posx, $posy); $pdf->SetTextColor(0, 0, 60); - $pdf->MultiCell(100, 3, $outputlangs->transnoentities("RefCustomer")." : ".$outputlangs->convToOutputCharset($object->ref_client), '', 'R'); + $pdf->MultiCell($w, 3, $outputlangs->transnoentities("RefCustomer")." : ".dol_trunc($outputlangs->convToOutputCharset($object->ref_client), 65), '', 'R'); } /* PHFAVRE $posy+=4; diff --git a/htdocs/recruitment/core/modules/recruitment/doc/pdf_standard_recruitmentjobposition.modules.php b/htdocs/recruitment/core/modules/recruitment/doc/pdf_standard_recruitmentjobposition.modules.php index 50e978aceab..cc215a855ff 100644 --- a/htdocs/recruitment/core/modules/recruitment/doc/pdf_standard_recruitmentjobposition.modules.php +++ b/htdocs/recruitment/core/modules/recruitment/doc/pdf_standard_recruitmentjobposition.modules.php @@ -919,7 +919,7 @@ class pdf_standard_recruitmentjobposition extends ModelePDFRecruitmentJobPositio $posy += 4; $pdf->SetXY($posx, $posy); $pdf->SetTextColor(0, 0, 60); - $pdf->MultiCell($w, 3, $outputlangs->transnoentities("RefCustomer")." : ".$outputlangs->convToOutputCharset($object->ref_client), '', 'R'); + $pdf->MultiCell($w, 3, $outputlangs->transnoentities("RefCustomer")." : ".dol_trunc($outputlangs->convToOutputCharset($object->ref_client), 65), '', 'R'); } if (!empty($conf->global->PDF_SHOW_PROJECT_TITLE)) { From 3d4bd1e1553a76c87bcf172d3f8640f86de09cf2 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Tue, 26 Apr 2022 16:53:40 +0200 Subject: [PATCH 217/738] FIX: truncate Customer Reference too long on PDF header (PR #20718) --- .../core/modules/supplier_proposal/doc/pdf_aurore.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php b/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php index f2d2a473145..aba01f51742 100644 --- a/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php +++ b/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php @@ -1336,7 +1336,7 @@ class pdf_aurore extends ModelePDFSupplierProposal $posy += 4; $pdf->SetXY($posx, $posy); $pdf->SetTextColor(0, 0, 60); - $pdf->MultiCell($w, 3, $outputlangs->transnoentities("RefCustomer")." : ".dol_trunc($outputlangs->convToOutputCharset($object->ref_client), 65), '', 'R'); + $pdf->MultiCell(100, 3, $outputlangs->transnoentities("RefCustomer")." : ".dol_trunc($outputlangs->convToOutputCharset($object->ref_client), 65), '', 'R'); } /* PHFAVRE $posy+=4; From 5387a8e9530b19d4bdc32127196478c8673cba47 Mon Sep 17 00:00:00 2001 From: daraelmin Date: Tue, 26 Apr 2022 19:07:31 +0200 Subject: [PATCH 218/738] FiX miss spelling --- htdocs/accountancy/bookkeeping/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/accountancy/bookkeeping/card.php b/htdocs/accountancy/bookkeeping/card.php index 0eff932fd19..f9ec739e63d 100644 --- a/htdocs/accountancy/bookkeeping/card.php +++ b/htdocs/accountancy/bookkeeping/card.php @@ -679,7 +679,7 @@ if ($action == 'create') { print ''."\n"; print ''; print ''; - } elseif (empty($line->numero_compte) || (empty($line->debit) &&empty($line->creit))) { + } elseif (empty($line->numero_compte) || (empty($line->debit) && empty($line->credit))) { if ($action == "" || $action == 'add') { print ''; print ''; From 3f832c1c5d405866b704e9cd9a1beb5aa4d7e423 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Wed, 27 Apr 2022 04:46:09 +0200 Subject: [PATCH 219/738] FIX Accountancy - Export format FEC - Prevent tab in label with the formats for which it is the separator --- htdocs/accountancy/class/accountancyexport.class.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/htdocs/accountancy/class/accountancyexport.class.php b/htdocs/accountancy/class/accountancyexport.class.php index 3c30200c130..128b14fa800 100644 --- a/htdocs/accountancy/class/accountancyexport.class.php +++ b/htdocs/accountancy/class/accountancyexport.class.php @@ -980,6 +980,8 @@ class AccountancyExport print dol_string_unaccent($date_creation) . $separator; // FEC:EcritureLib + // Clean label operation to prevent problem on export with tab separator & other character + $line->label_operation = str_replace(array("\t", "\n", "\r"), " ", $line->label_operation); print dol_string_unaccent($line->label_operation) . $separator; // FEC:Debit @@ -1007,6 +1009,8 @@ class AccountancyExport print $date_limit_payment . $separator; // FEC_suppl:NumFacture + // Clean ref invoice to prevent problem on export with tab separator & other character + $refInvoice = str_replace(array("\t", "\n", "\r"), " ", $refInvoice); print dol_trunc(self::toAnsi($refInvoice), 17, 'right', 'UTF-8', 1); print $end_line; @@ -1107,6 +1111,8 @@ class AccountancyExport print $date_document . $separator; // FEC:EcritureLib + // Clean label operation to prevent problem on export with tab separator & other character + $line->label_operation = str_replace(array("\t", "\n", "\r"), " ", $line->label_operation); print dol_string_unaccent($line->label_operation) . $separator; // FEC:Debit @@ -1134,6 +1140,8 @@ class AccountancyExport print $date_limit_payment . $separator; // FEC_suppl:NumFacture + // Clean ref invoice to prevent problem on export with tab separator & other character + $refInvoice = str_replace(array("\t", "\n", "\r"), " ", $refInvoice); print dol_trunc(self::toAnsi($refInvoice), 17, 'right', 'UTF-8', 1); @@ -1712,6 +1720,8 @@ class AccountancyExport print self::trunc($line->label_compte, 60).$separator; //Account label print self::trunc($line->doc_ref, 20).$separator; //Piece + // Clean label operation to prevent problem on export with tab separator & other character + $line->label_operation = str_replace(array("\t", "\n", "\r"), " ", $line->label_operation); print self::trunc($line->label_operation, 60).$separator; //Operation label print price(abs($line->debit - $line->credit)).$separator; //Amount print $line->sens.$separator; //Direction From dd85c22927a8e17afa59058615ffe32ecfd24dd6 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Wed, 27 Apr 2022 08:50:58 +0200 Subject: [PATCH 220/738] remove combox search box --- htdocs/compta/facture/list.php | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index 1c4ce0cdecf..c026b3a5db1 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -136,7 +136,7 @@ $search_datelimit_endyear = GETPOST('search_datelimit_endyear', 'int'); $search_datelimit_start = dol_mktime(0, 0, 0, $search_datelimit_startmonth, $search_datelimit_startday, $search_datelimit_startyear); $search_datelimit_end = dol_mktime(23, 59, 59, $search_datelimit_endmonth, $search_datelimit_endday, $search_datelimit_endyear); $search_categ_cus = GETPOST("search_categ_cus", 'int'); -$search_fac_rec_source = GETPOST("search_fac_rec_source", 'int'); +$search_fac_rec_source_title = GETPOST("search_fac_rec_source_title", 'alpha'); $search_btn = GETPOST('button_search', 'alpha'); $search_remove_btn = GETPOST('button_removefilter', 'alpha'); $optioncss = GETPOST('optioncss', 'alpha'); @@ -363,7 +363,7 @@ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter', $search_datelimit_endyear = ''; $search_datelimit_start = ''; $search_datelimit_end = ''; - $search_fac_rec_source = ''; + $search_fac_rec_source_title = ''; $option = ''; $filter = ''; $toselect = ''; @@ -622,6 +622,10 @@ if ($sall || $search_product_category > 0) { if ($search_product_category > 0) { $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie_product as cp ON cp.fk_product=pd.fk_product'; } + +if (!empty($search_fac_rec_source_title)) { + $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'facture_rec as facrec ON f.fk_fac_rec_source=facrec.rowid'; +} $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."projet as p ON p.rowid = f.fk_projet"; $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'user AS u ON f.fk_user_author = u.rowid'; // We'll need this table joined to the select in order to filter by sale @@ -806,9 +810,8 @@ if ($search_sale > 0) { if ($search_user > 0) { $sql .= " AND ec.fk_c_type_contact = tc.rowid AND tc.element='facture' AND tc.source='internal' AND ec.element_id = f.rowid AND ec.fk_socpeople = ".((int) $search_user); } - -if ($search_fac_rec_source > 0) { - $sql .= " AND f.fk_fac_rec_source = ".((int) $search_fac_rec_source); +if (!empty($search_fac_rec_source_title)) { + $sql .= natural_search('facrec.titre', $search_fac_rec_source_title); } // Add where from extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php'; @@ -1088,8 +1091,8 @@ if ($resql) { if ($search_categ_cus > 0) { $param .= '&search_categ_cus='.urlencode($search_categ_cus); } - if ($search_fac_rec_source > 0) { - $param .= '&search_fac_rec_source='.urlencode($search_fac_rec_source); + if (!empty($search_fac_rec_source_title)) { + $param .= '&$search_fac_rec_source_title='.urlencode($search_fac_rec_source_title); } // Add $param from extra fields @@ -1515,7 +1518,7 @@ if ($resql) { if (!empty($arrayfields['f.fk_fac_rec_source']['checked'])) { // Template Invoice print ''; - $form->selectInvoiceRec($search_fac_rec_source, 'search_fac_rec_source'); + print ''; print ''; } // Status @@ -1678,7 +1681,7 @@ if ($resql) { print_liste_field_titre($arrayfields['f.note_private']['label'], $_SERVER["PHP_SELF"], "f.note_private", "", $param, '', $sortfield, $sortorder, 'center nowrap '); } if (!empty($arrayfields['f.fk_fac_rec_source']['checked'])) { - print_liste_field_titre($arrayfields['f.fk_fac_rec_source']['label'], $_SERVER["PHP_SELF"], "f.fk_fac_rec_source", "", $param, '', $sortfield, $sortorder); + print_liste_field_titre($arrayfields['f.fk_fac_rec_source']['label'], $_SERVER["PHP_SELF"], "facrec.titre", "", $param, '', $sortfield, $sortorder); } if (!empty($arrayfields['f.fk_statut']['checked'])) { print_liste_field_titre($arrayfields['f.fk_statut']['label'], $_SERVER["PHP_SELF"], "f.fk_statut,f.paye,f.type", "", $param, 'class="right"', $sortfield, $sortorder); From 543e6f186cdf03113f07b2d7b3ffbebadbda3afa Mon Sep 17 00:00:00 2001 From: Christophe Battarel Date: Wed, 27 Apr 2022 09:03:51 +0200 Subject: [PATCH 221/738] add hook to getSellPrice function --- htdocs/product/class/product.class.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 84cc2454c21..cf9a0c3fa87 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -1804,6 +1804,16 @@ class Product extends CommonObject { global $conf, $db; + // call hook if any + $hookmanager->initHooks(array('productdao')); + $parameters = array('thirdparty_seller'=>$thirdparty_seller, 'thirdparty_buyer' => $thirdparty_buyer, 'pqp' => $pqp); + // Note that $action and $object may have been modified by some hooks + global $action; + $reshook = $hookmanager->executeHooks('getSellPrice', $parameters, $this, $action); + if ( ! empty($reshook)) { + return $hookmanager->resArray; + } + // Update if prices fields are defined $tva_tx = get_default_tva($thirdparty_seller, $thirdparty_buyer, $this->id); $tva_npr = get_default_npr($thirdparty_seller, $thirdparty_buyer, $this->id); From 4939da560f7becf2bf51f5a776ec6c4b1c90ad74 Mon Sep 17 00:00:00 2001 From: dolibarr95 <24292300+dolibarr95@users.noreply.github.com> Date: Wed, 27 Apr 2022 09:25:38 +0200 Subject: [PATCH 222/738] New: Add option to foce delivery receipt to yes Add a constant to force delivery receipt for supplier order. --- htdocs/core/class/html.formmail.class.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/htdocs/core/class/html.formmail.class.php b/htdocs/core/class/html.formmail.class.php index 0c9a1b2531a..818c3b19c7b 100644 --- a/htdocs/core/class/html.formmail.class.php +++ b/htdocs/core/class/html.formmail.class.php @@ -1202,6 +1202,9 @@ class FormMail extends Form if (!empty($conf->global->MAIL_FORCE_DELIVERY_RECEIPT_INVOICE) && !empty($this->param['models']) && $this->param['models'] == 'facture_send') { $defaultvaluefordeliveryreceipt = 1; } + if (!empty($conf->global->MAIL_FORCE_DELIVERY_RECEIPT_SUPPLIER_ORDER) && !empty($this->param['models']) && $this->param['models'] == 'order_supplier_send') { + $defaultvaluefordeliveryreceipt = 1; + } $out .= $form->selectyesno('deliveryreceipt', (GETPOSTISSET("deliveryreceipt") ? GETPOST("deliveryreceipt") : $defaultvaluefordeliveryreceipt), 1); } $out .= "\n"; From 25078b292d6996065fd265c678780584d86d8065 Mon Sep 17 00:00:00 2001 From: Christophe Battarel Date: Wed, 27 Apr 2022 09:40:09 +0200 Subject: [PATCH 223/738] fix hookmanager --- htdocs/product/class/product.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index cf9a0c3fa87..bb411d530c7 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -1802,7 +1802,7 @@ class Product extends CommonObject */ public function getSellPrice($thirdparty_seller, $thirdparty_buyer, $pqp = 0) { - global $conf, $db; + global $conf, $db, $hookmanager; // call hook if any $hookmanager->initHooks(array('productdao')); From c969cef731c9f772f8c86af73d5ce7d71ef1fd84 Mon Sep 17 00:00:00 2001 From: dolibarr95 <24292300+dolibarr95@users.noreply.github.com> Date: Wed, 27 Apr 2022 10:09:22 +0200 Subject: [PATCH 224/738] NEW : Send email to the supplier order contact Select the recipient defined in object contact (Vendor contact following-up order / Contact fournisseur suivi commande) in order to send email to the specific contact and not to generic company email (as for invoice/bill) --- htdocs/core/actions_massactions.inc.php | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/htdocs/core/actions_massactions.inc.php b/htdocs/core/actions_massactions.inc.php index 5ec011f5017..3b45cffd772 100644 --- a/htdocs/core/actions_massactions.inc.php +++ b/htdocs/core/actions_massactions.inc.php @@ -128,6 +128,14 @@ if (!$error && $massaction == 'confirm_presend') { $listofobjectcontacts[$toselectid][$data_email['id']] = $data_email['email']; } } + } elseif ($objectclass == 'CommandeFournisseur') { + $tmparraycontact = array(); + $tmparraycontact = $objecttmp->liste_contact(-1, 'external', 0, 'CUSTOMER'); + if (is_array($tmparraycontact) && count($tmparraycontact) > 0) { + foreach ($tmparraycontact as $data_email) { + $listofobjectcontacts[$toselectid][$data_email['id']] = $data_email['email']; + } + } } $listofobjectthirdparties[$thirdpartyid] = $thirdpartyid; @@ -277,6 +285,19 @@ if (!$error && $massaction == 'confirm_presend') { if (count($emails_to_sends) > 0) { $sendto = implode(',', $emails_to_sends); } + } elseif ($objectobj->element == 'order_supplier' && !empty($listofobjectcontacts[$objectid])) { + $emails_to_sends = array(); + $objectobj->fetch_thirdparty(); + $contactidtosend = array(); + foreach ($listofobjectcontacts[$objectid] as $contactemailid => $contactemailemail) { + $emails_to_sends[] = $objectobj->thirdparty->contact_get_property($contactemailid, 'email'); + if (!in_array($contactemailid, $contactidtosend)) { + $contactidtosend[] = $contactemailid; + } + } + if (count($emails_to_sends) > 0) { + $sendto = implode(',', $emails_to_sends); + } } else { $objectobj->fetch_thirdparty(); $sendto = $objectobj->thirdparty->email; From fb7f0545e4a08dd5c835e2d1fe816c3003f839d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alo=C3=AFs=20Micard?= Date: Wed, 27 Apr 2022 17:56:31 +0200 Subject: [PATCH 225/738] Fix error reporting in getLinesArray() --- htdocs/modulebuilder/template/class/myobject.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/modulebuilder/template/class/myobject.class.php b/htdocs/modulebuilder/template/class/myobject.class.php index e7da913f39c..51992ada8ee 100644 --- a/htdocs/modulebuilder/template/class/myobject.class.php +++ b/htdocs/modulebuilder/template/class/myobject.class.php @@ -937,8 +937,8 @@ class MyObject extends CommonObject if (is_numeric($result)) { - $this->error = $this->error; - $this->errors = $this->errors; + $this->error = $objectline->error; + $this->errors = $objectline->errors; return $result; } else { $this->lines = $result; From 5dce613118c367d1957eee36c5ab2a1cfe848a11 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Thu, 28 Apr 2022 05:34:02 +0200 Subject: [PATCH 226/738] NEW Accountancy - Product admin - Add product categories --- htdocs/accountancy/admin/productaccount.php | 108 ++++++++++++++++++-- 1 file changed, 100 insertions(+), 8 deletions(-) diff --git a/htdocs/accountancy/admin/productaccount.php b/htdocs/accountancy/admin/productaccount.php index 847891c949b..8a8ca0ecf46 100644 --- a/htdocs/accountancy/admin/productaccount.php +++ b/htdocs/accountancy/admin/productaccount.php @@ -1,10 +1,10 @@ - * Copyright (C) 2013-2021 Alexandre Spangaro - * Copyright (C) 2014 Florian Henry - * Copyright (C) 2014 Juanjo Menent - * Copyright (C) 2015 Ari Elbaz (elarifr) - * Copyright (C) 2021 Gauthier VERDOL + * Copyright (C) 2013-2022 Alexandre Spangaro + * Copyright (C) 2014 Florian Henry + * Copyright (C) 2014 Juanjo Menent + * Copyright (C) 2015 Ari Elbaz (elarifr) + * Copyright (C) 2021 Gauthier VERDOL * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -34,6 +34,9 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaccounting.class.php'; require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingaccount.class.php'; require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; +if (!empty($conf->categorie->enabled)) { + require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; +} // Load translation files required by the page $langs->loadLangs(array("companies", "compta", "accountancy", "products")); @@ -59,6 +62,8 @@ $account_number_sell = GETPOST('account_number_sell'); $changeaccount = GETPOST('changeaccount', 'array'); $changeaccount_buy = GETPOST('changeaccount_buy', 'array'); $changeaccount_sell = GETPOST('changeaccount_sell', 'array'); +$searchCategoryProductOperator = (GETPOST('search_category_product_operator', 'int') ? GETPOST('search_category_product_operator', 'int') : 0); +$searchCategoryProductList = GETPOST('search_category_product_list', 'array'); $search_ref = GETPOST('search_ref', 'alpha'); $search_label = GETPOST('search_label', 'alpha'); $search_desc = GETPOST('search_desc', 'alpha'); @@ -144,6 +149,8 @@ if ($reshook < 0) { // Purge search criteria if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All test are required to be compatible with all browsers + $searchCategoryProductOperator = 0; + $searchCategoryProductList = array(); $search_ref = ''; $search_label = ''; $search_desc = ''; @@ -283,7 +290,16 @@ $aacompta_prodsell = getDolGlobalString('ACCOUNTING_PRODUCT_SOLD_ACCOUN $aacompta_prodsell_intra = getDolGlobalString('ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT', $langs->trans("CodeNotDef")); $aacompta_prodsell_export = getDolGlobalString('ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT', $langs->trans("CodeNotDef")); -llxHeader('', $langs->trans("ProductsBinding")); + +$title = $langs->trans("ProductsBinding"); +$helpurl = ''; + +$paramsCat = ''; +foreach ($searchCategoryProductList as $searchCategoryProduct) { + $paramsCat .= "&search_category_product_list[]=".urlencode($searchCategoryProduct); +} + +llxHeader('', $title, $helpurl, '', 0, 0, array(), array(), $paramsCat, ''); $pcgverid = getDolGlobalString('CHARTOFACCOUNTS'); $pcgvercode = dol_getIdFromCode($db, $pcgverid, 'accounting_system', 'rowid', 'pcg_version'); @@ -308,6 +324,9 @@ if (!empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED)) { } else { $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "accounting_account as aa ON aa.account_number = p." . $accountancy_field_name . " AND aa.fk_pcg_version = '" . $db->escape($pcgvercode) . "'"; } +if (!empty($searchCategoryProductList)) { + $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX."categorie_product as cp ON p.rowid = cp.fk_product"; // We'll need this table joined to the select in order to filter by categ +} $sql .= ' WHERE p.entity IN ('.getEntity('product').')'; if (strlen(trim($search_current_account))) { $sql .= natural_search((empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED) ? "p." : "ppe.") . $accountancy_field_name, $search_current_account); @@ -318,6 +337,30 @@ if ($search_current_account_valid == 'withoutvalidaccount') { if ($search_current_account_valid == 'withvalidaccount') { $sql .= " AND aa.account_number IS NOT NULL"; } +$searchCategoryProductSqlList = array(); +if ($searchCategoryProductOperator == 1) { + foreach ($searchCategoryProductList as $searchCategoryProduct) { + if (intval($searchCategoryProduct) == -2) { + $searchCategoryProductSqlList[] = "cp.fk_categorie IS NULL"; + } elseif (intval($searchCategoryProduct) > 0) { + $searchCategoryProductSqlList[] = "cp.fk_categorie = ".$db->escape($searchCategoryProduct); + } + } + if (!empty($searchCategoryProductSqlList)) { + $sql .= " AND (".implode(' OR ', $searchCategoryProductSqlList).")"; + } +} else { + foreach ($searchCategoryProductList as $searchCategoryProduct) { + if (intval($searchCategoryProduct) == -2) { + $searchCategoryProductSqlList[] = "cp.fk_categorie IS NULL"; + } elseif (intval($searchCategoryProduct) > 0) { + $searchCategoryProductSqlList[] = "p.rowid IN (SELECT fk_product FROM ".MAIN_DB_PREFIX."categorie_product WHERE fk_categorie = ".((int) $searchCategoryProduct).")"; + } + } + if (!empty($searchCategoryProductSqlList)) { + $sql .= " AND (".implode(' AND ', $searchCategoryProductSqlList).")"; + } +} // Add search filter like if (strlen(trim($search_ref))) { $sql .= natural_search("p.ref", $search_ref); @@ -338,6 +381,15 @@ if ($search_onpurchase != '' && $search_onpurchase != '-1') { $sql .= natural_search('p.tobuy', $search_onpurchase, 1); } +$sql .= " GROUP BY p.rowid, p.ref, p.label, p.description, p.tosell, p.tobuy, p.tva_tx,"; +$sql .= " p.fk_product_type,"; +$sql .= ' p.tms,'; +if (empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED)) { + $sql .= " p.accountancy_code_sell, p.accountancy_code_sell_intra, p.accountancy_code_sell_export, p.accountancy_code_buy, p.accountancy_code_buy_intra, p.accountancy_code_buy_export"; +} else { + $sql .= " ppe.accountancy_code_sell, ppe.accountancy_code_sell_intra, ppe.accountancy_code_sell_export, ppe.accountancy_code_buy, ppe.accountancy_code_buy_intra, ppe.accountancy_code_buy_export"; +} + $sql .= $db->order($sortfield, $sortorder); $nbtotalofrecords = ''; @@ -365,11 +417,17 @@ if ($result) { if ($limit > 0 && $limit != $conf->liste_limit) { $param .= '&limit='.urlencode($limit); } + if ($searchCategoryProductOperator == 1) { + $param .= "&search_category_product_operator=".urlencode($searchCategoryProductOperator); + } + foreach ($searchCategoryProductList as $searchCategoryProduct) { + $param .= "&search_category_product_list[]=".urlencode($searchCategoryProduct); + } if ($search_ref > 0) { - $param .= "&search_desc=".urlencode($search_ref); + $param .= "&search_ref=".urlencode($search_ref); } if ($search_label > 0) { - $param .= "&search_desc=".urlencode($search_label); + $param .= "&search_label=".urlencode($search_label); } if ($search_desc > 0) { $param .= "&search_desc=".urlencode($search_desc); @@ -461,6 +519,40 @@ if ($result) { print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmPreselectAccount"), $langs->trans("ConfirmPreselectAccountQuestion", count($chk_prod)), "confirm_set_default_account", $formquestion, 1, 0, 200, 500, 1); } + // Filter on categories + $moreforfilter = ''; + if (!empty($conf->categorie->enabled) && $user->rights->categorie->lire) { + $moreforfilter .= '
'; + $moreforfilter .= img_picto($langs->trans('Categories'), 'category', 'class="pictofixedwidth"'); + $categoriesProductArr = $form->select_all_categories(Categorie::TYPE_PRODUCT, '', '', 64, 0, 1); + $categoriesProductArr[-2] = '- '.$langs->trans('NotCategorized').' -'; + $moreforfilter .= Form::multiselectarray('search_category_product_list', $categoriesProductArr, $searchCategoryProductList, 0, 0, 'minwidth300'); + $moreforfilter .= ' '.$langs->trans('UseOrOperatorForCategories').''; + $moreforfilter .= '
'; + } + + //Show/hide child products. Hidden by default + if (!empty($conf->variants->enabled) && !empty($conf->global->PRODUIT_ATTRIBUTES_HIDECHILD)) { + $moreforfilter .= '
'; + $moreforfilter .= ''; + $moreforfilter .= ' '; + $moreforfilter .= '
'; + } + + $parameters = array(); + $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters); // Note that $action and $object may have been modified by hook + if (empty($reshook)) { + $moreforfilter .= $hookmanager->resPrint; + } else { + $moreforfilter = $hookmanager->resPrint; + } + + if ($moreforfilter) { + print '
'; + print $moreforfilter; + print '
'; + } + print '
'; print ''; From 1efa44a0220efb7168ba9aa1decd5befc7f8673f Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Thu, 28 Apr 2022 06:50:37 +0200 Subject: [PATCH 227/738] NEW Accountancy - Add reconcile functionality --- htdocs/accountancy/bookkeeping/list.php | 369 ++++--- .../accountancy/bookkeeping/listbyaccount.php | 449 +++++--- .../bookkeeping/listbysubaccount.php | 979 ------------------ .../accountancy/class/bookkeeping.class.php | 4 +- htdocs/accountancy/class/lettering.class.php | 456 +++++++- htdocs/accountancy/journal/bankjournal.php | 10 + .../accountancy/journal/purchasesjournal.php | 6 + htdocs/accountancy/journal/sellsjournal.php | 6 + htdocs/langs/en_US/accountancy.lang | 18 + 9 files changed, 1052 insertions(+), 1245 deletions(-) delete mode 100644 htdocs/accountancy/bookkeeping/listbysubaccount.php diff --git a/htdocs/accountancy/bookkeeping/list.php b/htdocs/accountancy/bookkeeping/list.php index a760a550bef..bc7ea7c7072 100644 --- a/htdocs/accountancy/bookkeeping/list.php +++ b/htdocs/accountancy/bookkeeping/list.php @@ -28,6 +28,7 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountancyexport.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/accountancy/class/lettering.class.php'; require_once DOL_DOCUMENT_ROOT.'/accountancy/class/bookkeeping.class.php'; require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingjournal.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; @@ -42,6 +43,10 @@ $langs->loadLangs(array("accountancy", "compta")); $socid = GETPOST('socid', 'int'); $action = GETPOST('action', 'aZ09'); +$massaction = GETPOST('massaction', 'alpha'); +$confirm = GETPOST('confirm', 'alpha'); +$toselect = GETPOST('toselect', 'array'); +$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'bookkeepinglist'; $search_mvt_num = GETPOST('search_mvt_num', 'int'); $search_doc_type = GETPOST("search_doc_type", 'alpha'); $search_doc_ref = GETPOST("search_doc_ref", 'alpha'); @@ -86,6 +91,7 @@ $search_date_validation_endmonth = GETPOST('search_date_validation_endmonth', ' $search_date_validation_endday = GETPOST('search_date_validation_endday', 'int'); $search_date_validation_start = dol_mktime(0, 0, 0, $search_date_validation_startmonth, $search_date_validation_startday, $search_date_validation_startyear); $search_date_validation_end = dol_mktime(23, 59, 59, $search_date_validation_endmonth, $search_date_validation_endday, $search_date_validation_endyear); +$search_import_key = GETPOST("search_import_key", 'alpha'); //var_dump($search_date_start);exit; if (GETPOST("button_delmvt_x") || GETPOST("button_delmvt.x") || GETPOST("button_delmvt")) { @@ -191,6 +197,7 @@ $arrayfields = array( 't.tms'=>array('label'=>$langs->trans("DateModification"), 'checked'=>0), 't.date_export'=>array('label'=>$langs->trans("DateExport"), 'checked'=>1), 't.date_validated'=>array('label'=>$langs->trans("DateValidationAndLock"), 'checked'=>1), + 't.import_key'=>array('label'=>$langs->trans("ImportId"), 'checked'=>0, 'position'=>1100), ); if (empty($conf->global->ACCOUNTING_ENABLE_LETTERING)) { @@ -220,10 +227,12 @@ if (empty($user->rights->accounting->mouvements->lire)) { * Actions */ +$param = ''; + if (GETPOST('cancel', 'alpha')) { $action = 'list'; $massaction = ''; } -if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') { +if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'preunlettering' && $massaction != 'predeletebookkeepingwriting') { $massaction = ''; } @@ -294,10 +303,11 @@ if (empty($reshook)) { $search_credit = ''; $search_lettering_code = ''; $search_not_reconciled = ''; + $search_import_key = ''; + $toselect = ''; } // Must be after the remove filter action, before the export. - $param = ''; $filter = array(); if (!empty($search_date_start)) { $filter['t.doc_date>='] = $search_date_start; @@ -416,77 +426,143 @@ if (empty($reshook)) { $filter['t.reconciled_option'] = $search_not_reconciled; $param .= '&search_not_reconciled='.urlencode($search_not_reconciled); } -} + if (!empty($search_import_key)) { + $filter['t.import_key'] = $search_import_key; + $param .= '&search_import_key='.urlencode($search_import_key); + } -if ($action == 'delbookkeeping' && $user->rights->accounting->mouvements->supprimer) { - $import_key = GETPOST('importkey', 'alpha'); - - if (!empty($import_key)) { - $result = $object->deleteByImportkey($import_key); - if ($result < 0) { - setEventMessages($object->error, $object->errors, 'errors'); + //if ($action == 'delbookkeepingyearconfirm' && $user->rights->accounting->mouvements->supprimer_tous) { + // $delmonth = GETPOST('delmonth', 'int'); + // $delyear = GETPOST('delyear', 'int'); + // if ($delyear == -1) { + // $delyear = 0; + // } + // $deljournal = GETPOST('deljournal', 'alpha'); + // if ($deljournal == -1) { + // $deljournal = 0; + // } + // + // if (!empty($delmonth) || !empty($delyear) || !empty($deljournal)) { + // $result = $object->deleteByYearAndJournal($delyear, $deljournal, '', ($delmonth > 0 ? $delmonth : 0)); + // if ($result < 0) { + // setEventMessages($object->error, $object->errors, 'errors'); + // } else { + // setEventMessages("RecordDeleted", null, 'mesgs'); + // } + // + // // Make a redirect to avoid to launch the delete later after a back button + // header("Location: list.php".($param ? '?'.$param : '')); + // exit; + // } else { + // setEventMessages("NoRecordDeleted", null, 'warnings'); + // } + //} + if ($action == 'setreexport') { + $setreexport = GETPOST('value', 'int'); + if (!dolibarr_set_const($db, "ACCOUNTING_REEXPORT", $setreexport, 'yesno', 0, '', $conf->entity)) { + $error++; } - // Make a redirect to avoid to launch the delete later after a back button - header("Location: list.php".($param ? '?'.$param : '')); - exit; - } -} -if ($action == 'delbookkeepingyearconfirm' && $user->rights->accounting->mouvements->supprimer_tous) { - $delmonth = GETPOST('delmonth', 'int'); - $delyear = GETPOST('delyear', 'int'); - if ($delyear == -1) { - $delyear = 0; - } - $deljournal = GETPOST('deljournal', 'alpha'); - if ($deljournal == -1) { - $deljournal = 0; - } - - if (!empty($delmonth) || !empty($delyear) || !empty($deljournal)) { - $result = $object->deleteByYearAndJournal($delyear, $deljournal, '', ($delmonth > 0 ? $delmonth : 0)); - if ($result < 0) { - setEventMessages($object->error, $object->errors, 'errors'); + if (!$error) { + if ($conf->global->ACCOUNTING_REEXPORT == 1) { + setEventMessages($langs->trans("ExportOfPiecesAlreadyExportedIsEnable"), null, 'mesgs'); + } else { + setEventMessages($langs->trans("ExportOfPiecesAlreadyExportedIsDisable"), null, 'mesgs'); + } } else { - setEventMessages("RecordDeleted", null, 'mesgs'); + setEventMessages($langs->trans("Error"), null, 'errors'); } - - // Make a redirect to avoid to launch the delete later after a back button - header("Location: list.php".($param ? '?'.$param : '')); - exit; - } else { - setEventMessages("NoRecordDeleted", null, 'warnings'); - } -} -if ($action == 'delmouvconfirm' && $user->rights->accounting->mouvements->supprimer) { - $mvt_num = GETPOST('mvt_num', 'int'); - - if (!empty($mvt_num)) { - $result = $object->deleteMvtNum($mvt_num); - if ($result < 0) { - setEventMessages($object->error, $object->errors, 'errors'); - } else { - setEventMessages($langs->trans("RecordDeleted"), null, 'mesgs'); - } - - header("Location: list.php?noreset=1".($param ? '&'.$param : '')); - exit; - } -} -if ($action == 'setreexport') { - $setreexport = GETPOST('value', 'int'); - if (!dolibarr_set_const($db, "ACCOUNTING_REEXPORT", $setreexport, 'yesno', 0, '', $conf->entity)) { - $error++; } - if (!$error) { - if ($conf->global->ACCOUNTING_REEXPORT == 1) { - setEventMessages($langs->trans("ExportOfPiecesAlreadyExportedIsEnable"), null, 'mesgs'); - } else { - setEventMessages($langs->trans("ExportOfPiecesAlreadyExportedIsDisable"), null, 'mesgs'); + // Mass actions + $objectclass = 'Bookkeeping'; + $objectlabel = 'Bookkeeping'; + $permissiontoread = $user->rights->societe->lire; + $permissiontodelete = $user->rights->societe->supprimer; + $permissiontoadd = $user->rights->societe->creer; + $uploaddir = $conf->societe->dir_output; + include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php'; + + if (!$error && $action == 'deletebookkeepingwriting' && $confirm == "yes" && $user->rights->accounting->mouvements->supprimer) { + $nbok = 0; + foreach ($toselect as $toselectid) { + $result = $object->fetch($toselectid); + if ($result > 0 && (!isset($object->date_validation) || $object->date_validation === '')) { + $result = $object->deleteMvtNum($object->piece_num); + if ($result > 0) { + $nbok++; + } else { + setEventMessages($object->error, $object->errors, 'errors'); + $error++; + break; + } + } elseif ($result < 0) { + setEventMessages($object->error, $object->errors, 'errors'); + $error++; + break; + } + } + + // Message for elements well deleted + if ($nbok > 1) { + setEventMessages($langs->trans("RecordsDeleted", $nbok), null, 'mesgs'); + } elseif ($nbok > 0) { + setEventMessages($langs->trans("RecordDeleted", $nbok), null, 'mesgs'); + } elseif (!$error) { + setEventMessages($langs->trans("NoRecordDeleted"), null, 'mesgs'); + } + + if (!$error) { + header("Location: ".$_SERVER["PHP_SELF"]."?noreset=1".($param ? '&'.$param : '')); + exit; + } + } + + // others mass actions + if (!$error && getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING') && $user->rights->accounting->mouvements->creer) { + if ($massaction == 'lettering') { + $lettering = new Lettering($db); + $nb_lettering = $lettering->bookkeepingLetteringAll($toselect); + if ($nb_lettering < 0) { + setEventMessages('', $lettering->errors, 'errors'); + $error++; + $nb_lettering = max(0, abs($nb_lettering) - 2); + } elseif ($nb_lettering == 0) { + $nb_lettering = 0; + setEventMessages($langs->trans('AccountancyNoLetteringModified'), array(), 'mesgs'); + } + if ($nb_lettering == 1) { + setEventMessages($langs->trans('AccountancyOneLetteringModifiedSuccessfully'), array(), 'mesgs'); + } elseif ($nb_lettering > 1) { + setEventMessages($langs->trans('AccountancyLetteringModifiedSuccessfully', $nb_lettering), array(), 'mesgs'); + } + + if (!$error) { + header('Location: ' . $_SERVER['PHP_SELF'] . '?noreset=1' . $param); + exit(); + } + } elseif ($action == 'unlettering' && $confirm == "yes") { + $lettering = new Lettering($db); + $nb_lettering = $lettering->bookkeepingLetteringAll($toselect, true); + if ($nb_lettering < 0) { + setEventMessages('', $lettering->errors, 'errors'); + $error++; + $nb_lettering = max(0, abs($nb_lettering) - 2); + } elseif ($nb_lettering == 0) { + $nb_lettering = 0; + setEventMessages($langs->trans('AccountancyNoUnletteringModified'), array(), 'mesgs'); + } + if ($nb_lettering == 1) { + setEventMessages($langs->trans('AccountancyOneUnletteringModifiedSuccessfully'), array(), 'mesgs'); + } elseif ($nb_lettering > 1) { + setEventMessages($langs->trans('AccountancyUnletteringModifiedSuccessfully', $nb_lettering), array(), 'mesgs'); + } + + if (!$error) { + header('Location: ' . $_SERVER['PHP_SELF'] . '?noreset=1' . $param); + exit(); + } } - } else { - setEventMessages($langs->trans("Error"), null, 'errors'); } } @@ -520,7 +596,8 @@ $sql .= " t.piece_num,"; $sql .= " t.date_creation,"; $sql .= " t.tms as date_modification,"; $sql .= " t.date_export,"; -$sql .= " t.date_validated as date_validation"; +$sql .= " t.date_validated as date_validation,"; +$sql .= " t.import_key"; $sql .= ' FROM '.MAIN_DB_PREFIX.$object->table_element.' as t'; // Manage filter $sqlwhere = array(); @@ -667,6 +744,7 @@ if (is_numeric($nbtotalofrecords) && $limit > $nbtotalofrecords) { $num = $db->num_rows($resql); } +$arrayofselected = is_array($toselect) ? $toselect : array(); // Output page // -------------------------------------------------------------------- @@ -684,7 +762,7 @@ if ($action == 'export_file') { 'name' => 'notifiedexportdate', 'type' => 'checkbox', 'label' => $langs->trans('NotifiedExportDate'), - 'value' => $checked, + 'value' => (!empty($conf->global->ACCOUNTING_DEFAULT_NOT_NOTIFIED_EXPORT_DATE) ? 'false' : 'true'), ); $form_question['separator'] = array('name'=>'separator', 'type'=>'separator'); @@ -703,50 +781,46 @@ if ($action == 'export_file') { $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?'.$param, $langs->trans("ExportFilteredList").' ('.$listofformat[$formatexportset].')', $langs->trans('ConfirmExportFile'), 'export_fileconfirm', $form_question, '', 1, 300, 600); } -if ($action == 'delmouv') { - $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?mvt_num='.urlencode(GETPOST('mvt_num')).$param, $langs->trans('DeleteMvt'), $langs->trans('ConfirmDeleteMvtPartial'), 'delmouvconfirm', '', 0, 1); -} - -if ($action == 'delbookkeepingyear') { - $form_question = array(); - $delyear = GETPOST('delyear', 'int'); - $deljournal = GETPOST('deljournal', 'alpha'); - - if (empty($delyear)) { - $delyear = dol_print_date(dol_now(), '%Y'); - } - $month_array = array(); - for ($i = 1; $i <= 12; $i++) { - $month_array[$i] = $langs->trans("Month".sprintf("%02d", $i)); - } - $year_array = $formaccounting->selectyear_accountancy_bookkepping($delyear, 'delyear', 0, 'array'); - $journal_array = $formaccounting->select_journal($deljournal, 'deljournal', '', 1, 1, 1, '', 0, 1); - - $form_question['delmonth'] = array( - 'name' => 'delmonth', - 'type' => 'select', - 'label' => $langs->trans('DelMonth'), - 'values' => $month_array, - 'morecss' => 'minwidth150', - 'default' => '' - ); - $form_question['delyear'] = array( - 'name' => 'delyear', - 'type' => 'select', - 'label' => $langs->trans('DelYear'), - 'values' => $year_array, - 'default' => $delyear - ); - $form_question['deljournal'] = array( - 'name' => 'deljournal', - 'type' => 'other', // We don't use select here, the journal_array is already a select html component - 'label' => $langs->trans('DelJournal'), - 'value' => $journal_array, - 'default' => $deljournal - ); - - $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?'.$param, $langs->trans('DeleteMvt'), $langs->trans('ConfirmDeleteMvt', $langs->transnoentitiesnoconv("RegistrationInAccounting")), 'delbookkeepingyearconfirm', $form_question, '', 1, 320); -} +//if ($action == 'delbookkeepingyear') { +// $form_question = array(); +// $delyear = GETPOST('delyear', 'int'); +// $deljournal = GETPOST('deljournal', 'alpha'); +// +// if (empty($delyear)) { +// $delyear = dol_print_date(dol_now(), '%Y'); +// } +// $month_array = array(); +// for ($i = 1; $i <= 12; $i++) { +// $month_array[$i] = $langs->trans("Month".sprintf("%02d", $i)); +// } +// $year_array = $formaccounting->selectyear_accountancy_bookkepping($delyear, 'delyear', 0, 'array'); +// $journal_array = $formaccounting->select_journal($deljournal, 'deljournal', '', 1, 1, 1, '', 0, 1); +// +// $form_question['delmonth'] = array( +// 'name' => 'delmonth', +// 'type' => 'select', +// 'label' => $langs->trans('DelMonth'), +// 'values' => $month_array, +// 'morecss' => 'minwidth150', +// 'default' => '' +// ); +// $form_question['delyear'] = array( +// 'name' => 'delyear', +// 'type' => 'select', +// 'label' => $langs->trans('DelYear'), +// 'values' => $year_array, +// 'default' => $delyear +// ); +// $form_question['deljournal'] = array( +// 'name' => 'deljournal', +// 'type' => 'other', // We don't use select here, the journal_array is already a select html component +// 'label' => $langs->trans('DelJournal'), +// 'value' => $journal_array, +// 'default' => $deljournal +// ); +// +// $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?'.$param, $langs->trans('DeleteMvt'), $langs->trans('ConfirmDeleteMvt', $langs->transnoentitiesnoconv("RegistrationInAccounting")), 'delbookkeepingyearconfirm', $form_question, '', 1, 320); +//} // Print form confirm print $formconfirm; @@ -759,6 +833,22 @@ if ($limit > 0 && $limit != $conf->liste_limit) { $param .= '&limit='.urlencode($limit); } +// List of mass actions available +$arrayofmassactions = array(); +/* +if (getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING') && $user->rights->accounting->mouvements->creer) { + $arrayofmassactions['lettering'] = img_picto('', 'check', 'class="pictofixedwidth"') . $langs->trans('Lettering'); + $arrayofmassactions['preunlettering'] = img_picto('', 'uncheck', 'class="pictofixedwidth"') . $langs->trans('Unlettering'); +} +*/ +if ($user->rights->accounting->mouvements->supprimer) { + $arrayofmassactions['predeletebookkeepingwriting'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete"); +} +if (GETPOST('nomassaction', 'int') || in_array($massaction, array('preunlettering', 'predeletebookkeepingwriting'))) { + $arrayofmassactions = array(); +} +$massactionbutton = $form->selectMassAction($massaction, $arrayofmassactions); + print '
'; print ''; print ''; @@ -768,8 +858,7 @@ if ($optioncss != '') { print ''; print ''; print ''; - -$massactionbutton = ''; +print ''; if (count($filter)) { $buttonLabel = $langs->trans("ExportFilteredList"); @@ -794,7 +883,7 @@ if (empty($reshook)) { $newcardbutton .= dolGetButtonTitle($langs->trans('ViewFlatList'), '', 'fa fa-list paddingleft imgforviewmode', DOL_URL_ROOT.'/accountancy/bookkeeping/list.php?'.$param, '', 1, array('morecss' => 'marginleftonly btnTitleSelected')); $newcardbutton .= dolGetButtonTitle($langs->trans('GroupByAccountAccounting'), '', 'fa fa-stream paddingleft imgforviewmode', DOL_URL_ROOT.'/accountancy/bookkeeping/listbyaccount.php?'.$param, '', 1, array('morecss' => 'marginleftonly')); - $newcardbutton .= dolGetButtonTitle($langs->trans('GroupBySubAccountAccounting'), '', 'fa fa-align-left vmirror paddingleft imgforviewmode', DOL_URL_ROOT.'/accountancy/bookkeeping/listbysubaccount.php?'.$param, '', 1, array('morecss' => 'marginleftonly')); + $newcardbutton .= dolGetButtonTitle($langs->trans('GroupBySubAccountAccounting'), '', 'fa fa-align-left vmirror paddingleft imgforviewmode', DOL_URL_ROOT.'/accountancy/bookkeeping/listbyaccount.php?type=sub'.$param, '', 1, array('morecss' => 'marginleftonly')); $url = './card.php?action=create'; if (!empty($socid)) { @@ -805,9 +894,21 @@ if (empty($reshook)) { print_barre_liste($title_page, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_accountancy', 0, $newcardbutton, '', $limit, 0, 0, 1); +if ($massaction == 'preunlettering') { + print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassUnlettering"), $langs->trans("ConfirmMassUnletteringQuestion", count($toselect)), "unlettering", null, '', 0, 200, 500, 1); +} elseif ($massaction == 'predeletebookkeepingwriting') { + print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassDeleteBookkeepingWriting"), $langs->trans("ConfirmMassDeleteBookkeepingWritingQuestion", count($toselect)), "deletebookkeepingwriting", null, '', 0, 200, 500, 1); +} + +//$topicmail = "Information"; +//$modelmail = "accountingbookkeeping"; +//$objecttmp = new BookKeeping($db); +//$trackid = 'bk'.$object->id; +include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php'; + $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage; $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields -if ($massactionbutton) { +if ($massactionbutton && $contextpage != 'poslist') { $selectedfields .= $form->showCheckAddButtons('checkforselect', 1); } @@ -954,6 +1055,11 @@ if (!empty($arrayfields['t.date_validated']['checked'])) { print ''; print ''; } +if (!empty($arrayfields['t.import_key']['checked'])) { + print '
'; +} // Action column print '\n"; @@ -1252,17 +1361,21 @@ while ($i < min($num, $limit)) { } } - // Action column - print '\n"; + if (!$i) { + $totalarray['nbfield']++; } } - if (empty($line->date_validation)) { - if ($user->rights->accounting->mouvements->supprimer) { - print ''.img_delete().''; + + // Action column + print ''; @@ -1283,11 +1396,11 @@ print "
'; + print ''; + print ''; $searchpicto = $form->showFilterButtons(); @@ -1008,6 +1114,9 @@ if (!empty($arrayfields['t.date_export']['checked'])) { if (!empty($arrayfields['t.date_validated']['checked'])) { print_liste_field_titre($arrayfields['t.date_validated']['label'], $_SERVER['PHP_SELF'], "t.date_validated", "", $param, '', $sortfield, $sortorder, 'center '); } +if (!empty($arrayfields['t.import_key']['checked'])) { + print_liste_field_titre($arrayfields['t.import_key']['label'], $_SERVER["PHP_SELF"], "t.import_key", "", $param, '', $sortfield, $sortorder, 'center '); +} print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch '); print "
'; - if (empty($line->date_export) && empty($line->date_validation)) { - if ($user->rights->accounting->mouvements->creer) { - print '' . img_edit() . ''; + if (!empty($arrayfields['t.import_key']['checked'])) { + print ''.$obj->import_key."'; + if (($massactionbutton || $massaction) && $contextpage != 'poslist') { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($line->id, $arrayofselected)) { + $selected = 1; } + print ''; } print '
"; print '
'; // TODO Replace this with mass delete action -if ($user->rights->accounting->mouvements->supprimer_tous) { - print '
'."\n"; - print ''.$langs->trans("DeleteMvt").''; - print '
'; -} +//if ($user->rights->accounting->mouvements->supprimer_tous) { +// print '
'."\n"; +// print ''.$langs->trans("DeleteMvt").''; +// print '
'; +//} print ''; diff --git a/htdocs/accountancy/bookkeeping/listbyaccount.php b/htdocs/accountancy/bookkeeping/listbyaccount.php index 837a372a32d..5650cce8767 100644 --- a/htdocs/accountancy/bookkeeping/listbyaccount.php +++ b/htdocs/accountancy/bookkeeping/listbyaccount.php @@ -28,6 +28,7 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/accountancy/class/lettering.class.php'; require_once DOL_DOCUMENT_ROOT.'/accountancy/class/bookkeeping.class.php'; require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingjournal.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaccounting.class.php'; @@ -39,6 +40,16 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; $langs->loadLangs(array("accountancy", "compta")); $action = GETPOST('action', 'aZ09'); +$massaction = GETPOST('massaction', 'alpha'); +$confirm = GETPOST('confirm', 'alpha'); +$toselect = GETPOST('toselect', 'array'); +$type = GETPOST('type', 'alpha'); +if ($type == 'sub') { + $context_default = 'bookkeepingbysubaccountlist'; +} else { + $context_default = 'bookkeepingbyaccountlist'; +} +$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : $context_default; $search_date_startyear = GETPOST('search_date_startyear', 'int'); $search_date_startmonth = GETPOST('search_date_startmonth', 'int'); $search_date_startday = GETPOST('search_date_startday', 'int'); @@ -64,6 +75,7 @@ $search_date_validation_endmonth = GETPOST('search_date_validation_endmonth', ' $search_date_validation_endday = GETPOST('search_date_validation_endday', 'int'); $search_date_validation_start = dol_mktime(0, 0, 0, $search_date_validation_startmonth, $search_date_validation_startday, $search_date_validation_startyear); $search_date_validation_end = dol_mktime(23, 59, 59, $search_date_validation_endmonth, $search_date_validation_endday, $search_date_validation_endyear); +$search_import_key = GETPOST("search_import_key", 'alpha'); $search_accountancy_code = GETPOST("search_accountancy_code"); $search_accountancy_code_start = GETPOST('search_accountancy_code_start', 'alpha'); @@ -109,7 +121,7 @@ if ($sortfield == "") { // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context $object = new BookKeeping($db); $formfile = new FormFile($db); -$hookmanager->initHooks(array('bookkeepingbyaccountlist')); +$hookmanager->initHooks(array($context_default)); $formaccounting = new FormAccounting($db); $form = new Form($db); @@ -153,6 +165,7 @@ $arrayfields = array( 't.lettering_code'=>array('label'=>$langs->trans("LetteringCode"), 'checked'=>1), 't.date_export'=>array('label'=>$langs->trans("DateExport"), 'checked'=>1), 't.date_validated'=>array('label'=>$langs->trans("DateValidation"), 'checked'=>1), + 't.import_key'=>array('label'=>$langs->trans("ImportId"), 'checked'=>0, 'position'=>1100), ); if (empty($conf->global->ACCOUNTING_ENABLE_LETTERING)) { @@ -187,10 +200,13 @@ if (empty($user->rights->accounting->mouvements->lire)) { * Action */ +$param = ''; + if (GETPOST('cancel', 'alpha')) { - $action = 'list'; $massaction = ''; + $action = 'list'; + $massaction = ''; } -if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') { +if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'preunlettering' && $massaction != 'predeletebookkeepingwriting') { $massaction = ''; } @@ -242,10 +258,11 @@ if (empty($reshook)) { $search_credit = ''; $search_lettering_code = ''; $search_not_reconciled = ''; + $search_import_key = ''; + $toselect = ''; } // Must be after the remove filter action, before the export. - $param = ''; $filter = array(); if (!empty($search_date_start)) { @@ -261,12 +278,20 @@ if (empty($reshook)) { $param .= '&doc_datemonth='.GETPOST('doc_datemonth', 'int').'&doc_dateday='.GETPOST('doc_dateday', 'int').'&doc_dateyear='.GETPOST('doc_dateyear', 'int'); } if (!empty($search_accountancy_code_start)) { - $filter['t.numero_compte>='] = $search_accountancy_code_start; - $param .= '&search_accountancy_code_start='.urlencode($search_accountancy_code_start); + if ($type == 'sub') { + $filter['t.subledger_account>='] = $search_accountancy_code_start; + } else { + $filter['t.numero_compte>='] = $search_accountancy_code_start; + } + $param .= '&search_accountancy_code_start=' . urlencode($search_accountancy_code_start); } if (!empty($search_accountancy_code_end)) { - $filter['t.numero_compte<='] = $search_accountancy_code_end; - $param .= '&search_accountancy_code_end='.urlencode($search_accountancy_code_end); + if ($type == 'sub') { + $filter['t.subledger_account<='] = $search_accountancy_code_end; + } else { + $filter['t.numero_compte<='] = $search_accountancy_code_end; + } + $param .= '&search_accountancy_code_end=' . urlencode($search_accountancy_code_end); } if (!empty($search_label_account)) { $filter['t.label_compte'] = $search_label_account; @@ -326,61 +351,133 @@ if (empty($reshook)) { $filter['t.date_validated<='] = $search_date_validation_end; $param .= '&search_date_validation_endmonth='.$search_date_validation_endmonth.'&search_date_validation_endday='.$search_date_validation_endday.'&search_date_validation_endyear='.$search_date_validation_endyear; } -} + if (!empty($search_import_key)) { + $filter['t.import_key'] = $search_import_key; + $param .= '&search_import_key='.urlencode($search_import_key); + } -if ($action == 'delbookkeeping' && $user->rights->accounting->mouvements->supprimer) { - $import_key = GETPOST('importkey', 'alpha'); + // param with type of list + $url_param = substr($param, 1); // remove first "&" + if (!empty($type)) { + $param = '&type='.$type.$param; + } - if (!empty($import_key)) { - $result = $object->deleteByImportkey($import_key); - if ($result < 0) { - setEventMessages($object->error, $object->errors, 'errors'); + //if ($action == 'delbookkeepingyearconfirm' && $user->rights->accounting->mouvements->supprimer_tous) { + // $delmonth = GETPOST('delmonth', 'int'); + // $delyear = GETPOST('delyear', 'int'); + // if ($delyear == -1) { + // $delyear = 0; + // } + // $deljournal = GETPOST('deljournal', 'alpha'); + // if ($deljournal == -1) { + // $deljournal = 0; + // } + // + // if (!empty($delmonth) || !empty($delyear) || !empty($deljournal)) { + // $result = $object->deleteByYearAndJournal($delyear, $deljournal, '', ($delmonth > 0 ? $delmonth : 0)); + // if ($result < 0) { + // setEventMessages($object->error, $object->errors, 'errors'); + // } else { + // setEventMessages("RecordDeleted", null, 'mesgs'); + // } + // + // // Make a redirect to avoid to launch the delete later after a back button + // header("Location: ".$_SERVER["PHP_SELF"].($param ? '?'.$param : '')); + // exit; + // } else { + // setEventMessages("NoRecordDeleted", null, 'warnings'); + // } + //} + + // Mass actions + $objectclass = 'Bookkeeping'; + $objectlabel = 'Bookkeeping'; + $permissiontoread = $user->rights->societe->lire; + $permissiontodelete = $user->rights->societe->supprimer; + $permissiontoadd = $user->rights->societe->creer; + $uploaddir = $conf->societe->dir_output; + include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php'; + + if (!$error && $action == 'deletebookkeepingwriting' && $confirm == "yes" && $user->rights->accounting->mouvements->supprimer) { + $nbok = 0; + foreach ($toselect as $toselectid) { + $result = $object->fetch($toselectid); + if ($result > 0 && (!isset($object->date_validation) || $object->date_validation === '')) { + $result = $object->deleteMvtNum($object->piece_num); + if ($result > 0) { + $nbok++; + } else { + setEventMessages($object->error, $object->errors, 'errors'); + $error++; + break; + } + } elseif ($result < 0) { + setEventMessages($object->error, $object->errors, 'errors'); + $error++; + break; + } } - // Make a redirect to avoid to launch the delete later after a back button - header("Location: ".$_SERVER["PHP_SELF"].($param ? '?'.$param : '')); - exit; - } -} -if ($action == 'delbookkeepingyearconfirm' && $user->rights->accounting->mouvements->supprimer_tous) { - $delmonth = GETPOST('delmonth', 'int'); - $delyear = GETPOST('delyear', 'int'); - if ($delyear == -1) { - $delyear = 0; - } - $deljournal = GETPOST('deljournal', 'alpha'); - if ($deljournal == -1) { - $deljournal = 0; - } - - if (!empty($delmonth) || !empty($delyear) || !empty($deljournal)) { - $result = $object->deleteByYearAndJournal($delyear, $deljournal, '', ($delmonth > 0 ? $delmonth : 0)); - if ($result < 0) { - setEventMessages($object->error, $object->errors, 'errors'); - } else { - setEventMessages("RecordDeleted", null, 'mesgs'); + // Message for elements well deleted + if ($nbok > 1) { + setEventMessages($langs->trans("RecordsDeleted", $nbok), null, 'mesgs'); + } elseif ($nbok > 0) { + setEventMessages($langs->trans("RecordDeleted", $nbok), null, 'mesgs'); + } elseif (!$error) { + setEventMessages($langs->trans("NoRecordDeleted"), null, 'mesgs'); } - // Make a redirect to avoid to launch the delete later after a back button - header("Location: ".$_SERVER["PHP_SELF"].($param ? '?'.$param : '')); - exit; - } else { - setEventMessages("NoRecordDeleted", null, 'warnings'); - } -} -if ($action == 'delmouvconfirm' && $user->rights->accounting->mouvements->supprimer) { - $mvt_num = GETPOST('mvt_num', 'int'); - - if (!empty($mvt_num)) { - $result = $object->deleteMvtNum($mvt_num); - if ($result < 0) { - setEventMessages($object->error, $object->errors, 'errors'); - } else { - setEventMessages($langs->trans("RecordDeleted"), null, 'mesgs'); + if (!$error) { + header("Location: ".$_SERVER["PHP_SELF"]."?noreset=1".($param ? '&'.$param : '')); + exit; } + } - header("Location: ".$_SERVER["PHP_SELF"]."?noreset=1".($param ? '&'.$param : '')); - exit; + // others mass actions + if (!$error && getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING') && $user->rights->accounting->mouvements->creer) { + if ($massaction == 'lettering') { + $lettering = new Lettering($db); + $nb_lettering = $lettering->bookkeepingLetteringAll($toselect); + if ($nb_lettering < 0) { + setEventMessages('', $lettering->errors, 'errors'); + $error++; + $nb_lettering = max(0, abs($nb_lettering) - 2); + } elseif ($nb_lettering == 0) { + $nb_lettering = 0; + setEventMessages($langs->trans('AccountancyNoLetteringModified'), array(), 'mesgs'); + } + if ($nb_lettering == 1) { + setEventMessages($langs->trans('AccountancyOneLetteringModifiedSuccessfully'), array(), 'mesgs'); + } elseif ($nb_lettering > 1) { + setEventMessages($langs->trans('AccountancyLetteringModifiedSuccessfully', $nb_lettering), array(), 'mesgs'); + } + + if (!$error) { + header('Location: ' . $_SERVER['PHP_SELF'] . '?noreset=1' . $param); + exit(); + } + } elseif ($action == 'unlettering' && $confirm == "yes") { + $lettering = new Lettering($db); + $nb_lettering = $lettering->bookkeepingLetteringAll($toselect, true); + if ($nb_lettering < 0) { + setEventMessages('', $lettering->errors, 'errors'); + $error++; + $nb_lettering = max(0, abs($nb_lettering) - 2); + } elseif ($nb_lettering == 0) { + $nb_lettering = 0; + setEventMessages($langs->trans('AccountancyNoUnletteringModified'), array(), 'mesgs'); + } + if ($nb_lettering == 1) { + setEventMessages($langs->trans('AccountancyOneUnletteringModifiedSuccessfully'), array(), 'mesgs'); + } elseif ($nb_lettering > 1) { + setEventMessages($langs->trans('AccountancyUnletteringModifiedSuccessfully', $nb_lettering), array(), 'mesgs'); + } + + if (!$error) { + header('Location: ' . $_SERVER['PHP_SELF'] . '?noreset=1' . $param); + exit(); + } + } } } @@ -394,73 +491,101 @@ $formfile = new FormFile($db); $formother = new FormOther($db); $form = new Form($db); -$title_page = $langs->trans("Operations").' - '.$langs->trans("VueByAccountAccounting").' ('.$langs->trans("Bookkeeping").')'; +$title_page = $langs->trans("Operations").' - '.$langs->trans("VueByAccountAccounting").' ('; +if ($type == 'sub') { + $title_page .= $langs->trans("BookkeepingSubAccount"); +} else { + $title_page .= $langs->trans("Bookkeeping"); +} +$title_page .= ')'; llxHeader('', $title_page); // List $nbtotalofrecords = ''; if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) { - $nbtotalofrecords = $object->fetchAllByAccount($sortorder, $sortfield, 0, 0, $filter); + if ($type == 'sub') { + $nbtotalofrecords = $object->fetchAllByAccount($sortorder, $sortfield, 0, 0, $filter, 'AND', 1); + } else { + $nbtotalofrecords = $object->fetchAllByAccount($sortorder, $sortfield, 0, 0, $filter); + } + if ($nbtotalofrecords < 0) { setEventMessages($object->error, $object->errors, 'errors'); } } -$result = $object->fetchAllByAccount($sortorder, $sortfield, $limit, $offset, $filter); +if ($type == 'sub') { + $result = $object->fetchAllByAccount($sortorder, $sortfield, $limit, $offset, $filter, 'AND', 1); +} else { + $result = $object->fetchAllByAccount($sortorder, $sortfield, $limit, $offset, $filter); +} if ($result < 0) { setEventMessages($object->error, $object->errors, 'errors'); } +$arrayofselected = is_array($toselect) ? $toselect : array(); + $num = count($object->lines); -if ($action == 'delmouv') { - $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?mvt_num='.GETPOST('mvt_num'), $langs->trans('DeleteMvt'), $langs->trans('ConfirmDeleteMvtPartial'), 'delmouvconfirm', '', 0, 1); - print $formconfirm; +///if ($action == 'delbookkeepingyear') { +// $form_question = array(); +// $delyear = GETPOST('delyear', 'int'); +// $deljournal = GETPOST('deljournal', 'alpha'); +// +// if (empty($delyear)) { +// $delyear = dol_print_date(dol_now(), '%Y'); +// } +// $month_array = array(); +// for ($i = 1; $i <= 12; $i++) { +// $month_array[$i] = $langs->trans("Month".sprintf("%02d", $i)); +// } +// $year_array = $formaccounting->selectyear_accountancy_bookkepping($delyear, 'delyear', 0, 'array'); +// $journal_array = $formaccounting->select_journal($deljournal, 'deljournal', '', 1, 1, 1, '', 0, 1); +// +// $form_question['delmonth'] = array( +// 'name' => 'delmonth', +// 'type' => 'select', +// 'label' => $langs->trans('DelMonth'), +// 'values' => $month_array, +// 'default' => '' +// ); +// $form_question['delyear'] = array( +// 'name' => 'delyear', +// 'type' => 'select', +// 'label' => $langs->trans('DelYear'), +// 'values' => $year_array, +// 'default' => $delyear +// ); +// $form_question['deljournal'] = array( +// 'name' => 'deljournal', +// 'type' => 'other', // We don't use select here, the journal_array is already a select html component +// 'label' => $langs->trans('DelJournal'), +// 'value' => $journal_array, +// 'default' => $deljournal +// ); +// +// $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?'.$param, $langs->trans('DeleteMvt'), $langs->trans('ConfirmDeleteMvt', $langs->transnoentitiesnoconv("RegistrationInAccounting")), 'delbookkeepingyearconfirm', $form_question, '', 1, 300); +//} + +// Print form confirm +print $formconfirm; + +// List of mass actions available +$arrayofmassactions = array(); +if (getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING') && $user->rights->accounting->mouvements->creer) { + $arrayofmassactions['lettering'] = img_picto('', 'check', 'class="pictofixedwidth"') . $langs->trans('Lettering'); + $arrayofmassactions['preunlettering'] = img_picto('', 'uncheck', 'class="pictofixedwidth"') . $langs->trans('Unlettering'); } -if ($action == 'delbookkeepingyear') { - $form_question = array(); - $delyear = GETPOST('delyear', 'int'); - $deljournal = GETPOST('deljournal', 'alpha'); - - if (empty($delyear)) { - $delyear = dol_print_date(dol_now(), '%Y'); - } - $month_array = array(); - for ($i = 1; $i <= 12; $i++) { - $month_array[$i] = $langs->trans("Month".sprintf("%02d", $i)); - } - $year_array = $formaccounting->selectyear_accountancy_bookkepping($delyear, 'delyear', 0, 'array'); - $journal_array = $formaccounting->select_journal($deljournal, 'deljournal', '', 1, 1, 1, '', 0, 1); - - $form_question['delmonth'] = array( - 'name' => 'delmonth', - 'type' => 'select', - 'label' => $langs->trans('DelMonth'), - 'values' => $month_array, - 'default' => '' - ); - $form_question['delyear'] = array( - 'name' => 'delyear', - 'type' => 'select', - 'label' => $langs->trans('DelYear'), - 'values' => $year_array, - 'default' => $delyear - ); - $form_question['deljournal'] = array( - 'name' => 'deljournal', - 'type' => 'other', // We don't use select here, the journal_array is already a select html component - 'label' => $langs->trans('DelJournal'), - 'value' => $journal_array, - 'default' => $deljournal - ); - - $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?'.$param, $langs->trans('DeleteMvt'), $langs->trans('ConfirmDeleteMvt', $langs->transnoentitiesnoconv("RegistrationInAccounting")), 'delbookkeepingyearconfirm', $form_question, '', 1, 300); - print $formconfirm; +if ($user->rights->accounting->mouvements->supprimer) { + $arrayofmassactions['predeletebookkeepingwriting'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete"); } - +if (GETPOST('nomassaction', 'int') || in_array($massaction, array('preunlettering', 'predeletebookkeepingwriting'))) { + $arrayofmassactions = array(); +} +$massactionbutton = $form->selectMassAction($massaction, $arrayofmassactions); print '
'; print ''; @@ -469,15 +594,22 @@ if ($optioncss != '') { print ''; } print ''; +print ''; print ''; print ''; +print ''; $parameters = array(); $reshook = $hookmanager->executeHooks('addMoreActionsButtonsList', $parameters, $object, $action); // Note that $action and $object may have been modified by hook if (empty($reshook)) { $newcardbutton = dolGetButtonTitle($langs->trans('ViewFlatList'), '', 'fa fa-list paddingleft imgforviewmode', DOL_URL_ROOT.'/accountancy/bookkeeping/list.php?'.$param); - $newcardbutton .= dolGetButtonTitle($langs->trans('GroupByAccountAccounting'), '', 'fa fa-stream paddingleft imgforviewmode', DOL_URL_ROOT.'/accountancy/bookkeeping/listbyaccount.php?'.$param, '', 1, array('morecss' => 'marginleftonly btnTitleSelected')); - $newcardbutton .= dolGetButtonTitle($langs->trans('GroupBySubAccountAccounting'), '', 'fa fa-align-left vmirror paddingleft imgforviewmode', DOL_URL_ROOT.'/accountancy/bookkeeping/listbysubaccount.php?'.$param, '', 1, array('morecss' => 'marginleftonly')); + if ($type == 'sub') { + $newcardbutton .= dolGetButtonTitle($langs->trans('GroupByAccountAccounting'), '', 'fa fa-stream paddingleft imgforviewmode', DOL_URL_ROOT . '/accountancy/bookkeeping/listbyaccount.php?' . $url_param, '', 1, array('morecss' => 'marginleftonly')); + $newcardbutton .= dolGetButtonTitle($langs->trans('GroupBySubAccountAccounting'), '', 'fa fa-align-left vmirror paddingleft imgforviewmode', DOL_URL_ROOT . '/accountancy/bookkeeping/listbyaccount.php?type=sub&' . $url_param, '', 1, array('morecss' => 'marginleftonly btnTitleSelected')); + } else { + $newcardbutton .= dolGetButtonTitle($langs->trans('GroupByAccountAccounting'), '', 'fa fa-stream paddingleft imgforviewmode', DOL_URL_ROOT . '/accountancy/bookkeeping/listbyaccount.php?' . $url_param, '', 1, array('morecss' => 'marginleftonly btnTitleSelected')); + $newcardbutton .= dolGetButtonTitle($langs->trans('GroupBySubAccountAccounting'), '', 'fa fa-align-left vmirror paddingleft imgforviewmode', DOL_URL_ROOT . '/accountancy/bookkeeping/listbyaccount.php?type=sub&' . $url_param, '', 1, array('morecss' => 'marginleftonly')); + } $newcardbutton .= dolGetButtonTitle($langs->trans('NewAccountingMvt'), '', 'fa fa-plus-circle paddingleft', DOL_URL_ROOT.'/accountancy/bookkeeping/card.php?action=create'); } @@ -488,11 +620,29 @@ if ($limit > 0 && $limit != $conf->liste_limit) { $param .= '&limit='.urlencode($limit); } -print_barre_liste($title_page, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $result, $nbtotalofrecords, 'title_accountancy', 0, $newcardbutton, '', $limit, 0, 0, 1); +print_barre_liste($title_page, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $result, $nbtotalofrecords, 'title_accountancy', 0, $newcardbutton, '', $limit, 0, 0, 1); + +if ($massaction == 'preunlettering') { + print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassUnlettering"), $langs->trans("ConfirmMassUnletteringQuestion", count($toselect)), "unlettering", null, '', 0, 200, 500, 1); +} elseif ($massaction == 'predeletebookkeepingwriting') { + print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassDeleteBookkeepingWriting"), $langs->trans("ConfirmMassDeleteBookkeepingWritingQuestion", count($toselect)), "deletebookkeepingwriting", null, '', 0, 200, 500, 1); +} +//DeleteMvt=Supprimer des lignes d'opérations de la comptabilité +//DelMonth=Mois à effacer +//DelYear=Année à supprimer +//DelJournal=Journal à supprimer +//ConfirmDeleteMvt=Cette action supprime les lignes des opérations pour l'année/mois et/ou pour le journal sélectionné (au moins un critère est requis). Vous devrez utiliser de nouveau la fonctionnalité '%s' pour retrouver vos écritures dans la comptabilité. +//ConfirmDeleteMvtPartial=Cette action supprime l'écriture de la comptabilité (toutes les lignes opérations liées à une même écriture seront effacées). + +//$topicmail = "Information"; +//$modelmail = "accountingbookkeeping"; +//$objecttmp = new BookKeeping($db); +//$trackid = 'bk'.$object->id; +include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php'; $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage; $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields -if ($massactionbutton) { +if ($massactionbutton && $contextpage != 'poslist') { $selectedfields .= $form->showCheckAddButtons('checkforselect', 1); } @@ -509,9 +659,17 @@ $moreforfilter = ''; $moreforfilter .= '
'; $moreforfilter .= $langs->trans('AccountAccounting').': '; $moreforfilter .= '
'; -$moreforfilter .= $formaccounting->select_account($search_accountancy_code_start, 'search_accountancy_code_start', $langs->trans('From'), array(), 1, 1, 'maxwidth200'); +if ($type == 'sub') { + $moreforfilter .= $formaccounting->select_auxaccount($search_accountancy_code_start, 'search_accountancy_code_start', $langs->trans('From'), 'maxwidth200'); +} else { + $moreforfilter .= $formaccounting->select_account($search_accountancy_code_start, 'search_accountancy_code_start', $langs->trans('From'), array(), 1, 1, 'maxwidth200'); +} $moreforfilter .= ' '; -$moreforfilter .= $formaccounting->select_account($search_accountancy_code_end, 'search_accountancy_code_end', $langs->trans('to'), array(), 1, 1, 'maxwidth200'); +if ($type == 'sub') { + $moreforfilter .= $formaccounting->select_auxaccount($search_accountancy_code_end, 'search_accountancy_code_end', $langs->trans('to'), 'maxwidth200'); +} else { + $moreforfilter .= $formaccounting->select_account($search_accountancy_code_end, 'search_accountancy_code_end', $langs->trans('to'), array(), 1, 1, 'maxwidth200'); +} $moreforfilter .= '
'; $moreforfilter .= '
'; @@ -599,6 +757,11 @@ if (!empty($arrayfields['t.date_validated']['checked'])) { print ''; print ''; } +if (!empty($arrayfields['t.import_key']['checked'])) { + print ''; + print ''; + print ''; +} // Fields from hook $parameters = array('arrayfields'=>$arrayfields); @@ -643,6 +806,9 @@ if (!empty($arrayfields['t.date_export']['checked'])) { if (!empty($arrayfields['t.date_validated']['checked'])) { print_liste_field_titre($arrayfields['t.date_validated']['label'], $_SERVER['PHP_SELF'], "t.date_validated", "", $param, '', $sortfield, $sortorder, 'center '); } +if (!empty($arrayfields['t.import_key']['checked'])) { + print_liste_field_titre($arrayfields['t.import_key']['label'], $_SERVER["PHP_SELF"], "t.import_key", "", $param, '', $sortfield, $sortorder, 'center '); +} // Hook fields $parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder); $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook @@ -667,7 +833,11 @@ while ($i < min($num, $limit)) { $total_debit += $line->debit; $total_credit += $line->credit; - $accountg = length_accountg($line->numero_compte); + if ($type == 'sub') { + $accountg = length_accounta($line->subledger_account); + } else { + $accountg = length_accountg($line->numero_compte); + } //if (empty($accountg)) $accountg = '-'; $colspan = 0; // colspan before field 'label of operation' @@ -686,7 +856,11 @@ while ($i < min($num, $limit)) { // Show a subtotal by accounting account if (isset($displayed_account_number)) { print ''; - print ''.$langs->trans("TotalForAccount").' '.length_accountg($displayed_account_number).':'; + if ($type == 'sub') { + print '' . $langs->trans("TotalForAccount") . ' ' . length_accounta($displayed_account_number) . ':'; + } else { + print '' . $langs->trans("TotalForAccount") . ' ' . length_accountg($displayed_account_number) . ':'; + } print ''.price($sous_total_debit).''; print ''.price($sous_total_credit).''; print ''; @@ -712,11 +886,28 @@ while ($i < min($num, $limit)) { // Show the break account print ''; - print ''; - if ($line->numero_compte != "" && $line->numero_compte != '-1') { - print length_accountg($line->numero_compte).' : '.$object->get_compte_desc($line->numero_compte); + print ''; + if ($type == 'sub') { + if ($line->subledger_account != "" && $line->subledger_account != '-1') { + print $line->subledger_label . ' : ' . length_accounta($line->subledger_account); + } else { + // Should not happen: subledger account must be null or a non empty value + print '' . $langs->trans("Unknown"); + if ($line->subledger_label) { + print ' (' . $line->subledger_label . ')'; + $htmltext = 'EmptyStringForSubledgerAccountButSubledgerLabelDefined'; + } else { + $htmltext = 'EmptyStringForSubledgerAccountAndSubledgerLabel'; + } + print $form->textwithpicto('', $htmltext); + print ''; + } } else { - print ''.$langs->trans("Unknown").''; + if ($line->numero_compte != "" && $line->numero_compte != '-1') { + print length_accountg($line->numero_compte) . ' : ' . $object->get_compte_desc($line->numero_compte); + } else { + print '' . $langs->trans("Unknown") . ''; + } } print ''; print ''; @@ -890,22 +1081,26 @@ while ($i < min($num, $limit)) { } } + if (!empty($arrayfields['t.import_key']['checked'])) { + print ''.$line->import_key."\n"; + if (!$i) { + $totalarray['nbfield']++; + } + } + // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$line); $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Action column print ''; - if (empty($line->date_export) && empty($line->date_validation)) { - if ($user->rights->accounting->mouvements->creer) { - print '' . img_edit() . ''; - } - } - if (empty($line->date_validation)) { - if ($user->rights->accounting->mouvements->supprimer) { - print ''.img_delete().''; + if (($massactionbutton || $massaction) && $contextpage != 'poslist') { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + $selected = 0; + if (in_array($line->id, $arrayofselected)) { + $selected = 1; } + print ''; } print ''; if (!$i) { @@ -955,11 +1150,11 @@ print ""; print ''; // TODO Replace this with mass delete action -if ($user->rights->accounting->mouvements->supprimer_tous) { - print '
'."\n"; - print ''.$langs->trans("DeleteMvt").''; - print '
'; -} +//if ($user->rights->accounting->mouvements->supprimer_tous) { +// print '
'."\n"; +// print ''.$langs->trans("DeleteMvt").''; +// print '
'; +//} print '
'; diff --git a/htdocs/accountancy/bookkeeping/listbysubaccount.php b/htdocs/accountancy/bookkeeping/listbysubaccount.php deleted file mode 100644 index c6fb95d5ab7..00000000000 --- a/htdocs/accountancy/bookkeeping/listbysubaccount.php +++ /dev/null @@ -1,979 +0,0 @@ - - * Copyright (C) 2013-2016 Olivier Geffroy - * Copyright (C) 2013-2020 Florian Henry - * Copyright (C) 2013-2021 Alexandre Spangaro - * Copyright (C) 2018-2020 Frédéric France - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/** - * \file htdocs/accountancy/bookkeeping/listbysubaccount.php - * \ingroup Accountancy (Double entries) - * \brief List operation of ledger ordered by subaccount number - */ - -require '../../main.inc.php'; - -require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/accountancy/class/bookkeeping.class.php'; -require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingjournal.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaccounting.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; - -// Load translation files required by the page -$langs->loadLangs(array("accountancy", "compta")); - -$action = GETPOST('action', 'aZ09'); -$search_date_startyear = GETPOST('search_date_startyear', 'int'); -$search_date_startmonth = GETPOST('search_date_startmonth', 'int'); -$search_date_startday = GETPOST('search_date_startday', 'int'); -$search_date_endyear = GETPOST('search_date_endyear', 'int'); -$search_date_endmonth = GETPOST('search_date_endmonth', 'int'); -$search_date_endday = GETPOST('search_date_endday', 'int'); -$search_date_start = dol_mktime(0, 0, 0, $search_date_startmonth, $search_date_startday, $search_date_startyear); -$search_date_end = dol_mktime(23, 59, 59, $search_date_endmonth, $search_date_endday, $search_date_endyear); -$search_doc_date = dol_mktime(0, 0, 0, GETPOST('doc_datemonth', 'int'), GETPOST('doc_dateday', 'int'), GETPOST('doc_dateyear', 'int')); -$search_date_export_startyear = GETPOST('search_date_export_startyear', 'int'); -$search_date_export_startmonth = GETPOST('search_date_export_startmonth', 'int'); -$search_date_export_startday = GETPOST('search_date_export_startday', 'int'); -$search_date_export_endyear = GETPOST('search_date_export_endyear', 'int'); -$search_date_export_endmonth = GETPOST('search_date_export_endmonth', 'int'); -$search_date_export_endday = GETPOST('search_date_export_endday', 'int'); -$search_date_export_start = dol_mktime(0, 0, 0, $search_date_export_startmonth, $search_date_export_startday, $search_date_export_startyear); -$search_date_export_end = dol_mktime(23, 59, 59, $search_date_export_endmonth, $search_date_export_endday, $search_date_export_endyear); -$search_date_validation_startyear = GETPOST('search_date_validation_startyear', 'int'); -$search_date_validation_startmonth = GETPOST('search_date_validation_startmonth', 'int'); -$search_date_validation_startday = GETPOST('search_date_validation_startday', 'int'); -$search_date_validation_endyear = GETPOST('search_date_validation_endyear', 'int'); -$search_date_validation_endmonth = GETPOST('search_date_validation_endmonth', 'int'); -$search_date_validation_endday = GETPOST('search_date_validation_endday', 'int'); -$search_date_validation_start = dol_mktime(0, 0, 0, $search_date_validation_startmonth, $search_date_validation_startday, $search_date_validation_startyear); -$search_date_validation_end = dol_mktime(23, 59, 59, $search_date_validation_endmonth, $search_date_validation_endday, $search_date_validation_endyear); - -$search_accountancy_code = GETPOST("search_accountancy_code"); -$search_accountancy_code_start = GETPOST('search_accountancy_code_start', 'alpha'); -if ($search_accountancy_code_start == - 1) { - $search_accountancy_code_start = ''; -} -$search_accountancy_code_end = GETPOST('search_accountancy_code_end', 'alpha'); -if ($search_accountancy_code_end == - 1) { - $search_accountancy_code_end = ''; -} -$search_doc_ref = GETPOST('search_doc_ref', 'alpha'); -$search_label_operation = GETPOST('search_label_operation', 'alpha'); -$search_mvt_num = GETPOST('search_mvt_num', 'int'); -$search_direction = GETPOST('search_direction', 'alpha'); -$search_ledger_code = GETPOST('search_ledger_code', 'array'); -$search_debit = GETPOST('search_debit', 'alpha'); -$search_credit = GETPOST('search_credit', 'alpha'); -$search_lettering_code = GETPOST('search_lettering_code', 'alpha'); -$search_not_reconciled = GETPOST('search_not_reconciled', 'alpha'); - -if (GETPOST("button_delmvt_x") || GETPOST("button_delmvt.x") || GETPOST("button_delmvt")) { - $action = 'delbookkeepingyear'; -} - -// Load variable for pagination -$limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : (empty($conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION) ? $conf->liste_limit : $conf->global->ACCOUNTING_LIMIT_LIST_VENTILATION); -$sortfield = GETPOST('sortfield', 'aZ09comma'); -$sortorder = GETPOST('sortorder', 'aZ09comma'); -$page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int'); -if (empty($page) || $page < 0) { - $page = 0; -} -$offset = $limit * $page; -$pageprev = $page - 1; -$pagenext = $page + 1; -if ($sortorder == "") { - $sortorder = "ASC"; -} -if ($sortfield == "") { - $sortfield = "t.doc_date,t.rowid"; -} - -// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context -$object = new BookKeeping($db); -$formfile = new FormFile($db); -$hookmanager->initHooks(array('bookkeepingbysubaccountlist')); - -$formaccounting = new FormAccounting($db); -$form = new Form($db); - -if (empty($search_date_start) && empty($search_date_end) && !GETPOSTISSET('search_date_startday') && !GETPOSTISSET('search_date_startmonth') && !GETPOSTISSET('search_date_starthour')) { - $sql = "SELECT date_start, date_end from ".MAIN_DB_PREFIX."accounting_fiscalyear "; - $sql .= " where date_start < '".$db->idate(dol_now())."' and date_end > '".$db->idate(dol_now())."'"; - $sql .= $db->plimit(1); - $res = $db->query($sql); - - if ($res->num_rows > 0) { - $fiscalYear = $db->fetch_object($res); - $search_date_start = strtotime($fiscalYear->date_start); - $search_date_end = strtotime($fiscalYear->date_end); - } else { - $month_start = ($conf->global->SOCIETE_FISCAL_MONTH_START ? ($conf->global->SOCIETE_FISCAL_MONTH_START) : 1); - $year_start = dol_print_date(dol_now(), '%Y'); - if (dol_print_date(dol_now(), '%m') < $month_start) { - $year_start--; // If current month is lower that starting fiscal month, we start last year - } - $year_end = $year_start + 1; - $month_end = $month_start - 1; - if ($month_end < 1) { - $month_end = 12; - $year_end--; - } - $search_date_start = dol_mktime(0, 0, 0, $month_start, 1, $year_start); - $search_date_end = dol_get_last_day($year_end, $month_end); - } -} - -$arrayfields = array( - // 't.subledger_account'=>array('label'=>$langs->trans("SubledgerAccount"), 'checked'=>1), - 't.piece_num'=>array('label'=>$langs->trans("TransactionNumShort"), 'checked'=>1), - 't.code_journal'=>array('label'=>$langs->trans("Codejournal"), 'checked'=>1), - 't.doc_date'=>array('label'=>$langs->trans("Docdate"), 'checked'=>1), - 't.doc_ref'=>array('label'=>$langs->trans("Piece"), 'checked'=>1), - 't.label_operation'=>array('label'=>$langs->trans("Label"), 'checked'=>1), - 't.debit'=>array('label'=>$langs->trans("Debit"), 'checked'=>1), - 't.credit'=>array('label'=>$langs->trans("Credit"), 'checked'=>1), - 't.lettering_code'=>array('label'=>$langs->trans("LetteringCode"), 'checked'=>1), - 't.date_export'=>array('label'=>$langs->trans("DateExport"), 'checked'=>1), - 't.date_validated'=>array('label'=>$langs->trans("DateValidation"), 'checked'=>1), -); - -if (empty($conf->global->ACCOUNTING_ENABLE_LETTERING)) { - unset($arrayfields['t.lettering_code']); -} - -if ($search_date_start && empty($search_date_startyear)) { - $tmparray = dol_getdate($search_date_start); - $search_date_startyear = $tmparray['year']; - $search_date_startmonth = $tmparray['mon']; - $search_date_startday = $tmparray['mday']; -} -if ($search_date_end && empty($search_date_endyear)) { - $tmparray = dol_getdate($search_date_end); - $search_date_endyear = $tmparray['year']; - $search_date_endmonth = $tmparray['mon']; - $search_date_endday = $tmparray['mday']; -} - -if (empty($conf->accounting->enabled)) { - accessforbidden(); -} -if ($user->socid > 0) { - accessforbidden(); -} -if (empty($user->rights->accounting->mouvements->lire)) { - accessforbidden(); -} - - -/* - * Action - */ - -if (GETPOST('cancel', 'alpha')) { - $action = 'list'; $massaction = ''; -} -if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') { - $massaction = ''; -} - -$parameters = array('socid'=>$socid); -$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks -if ($reshook < 0) { - setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); -} - -if (empty($reshook)) { - include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php'; - - if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers - $search_doc_date = ''; - $search_accountancy_code = ''; - $search_accountancy_code_start = ''; - $search_accountancy_code_end = ''; - $search_label_account = ''; - $search_doc_ref = ''; - $search_label_operation = ''; - $search_mvt_num = ''; - $search_direction = ''; - $search_ledger_code = array(); - $search_date_start = ''; - $search_date_end = ''; - $search_date_startyear = ''; - $search_date_startmonth = ''; - $search_date_startday = ''; - $search_date_endyear = ''; - $search_date_endmonth = ''; - $search_date_endday = ''; - $search_date_export_start = ''; - $search_date_export_end = ''; - $search_date_export_startyear = ''; - $search_date_export_startmonth = ''; - $search_date_export_startday = ''; - $search_date_export_endyear = ''; - $search_date_export_endmonth = ''; - $search_date_export_endday = ''; - $search_date_validation_start = ''; - $search_date_validation_end = ''; - $search_date_validation_startyear = ''; - $search_date_validation_startmonth = ''; - $search_date_validation_startday = ''; - $search_date_validation_endyear = ''; - $search_date_validation_endmonth = ''; - $search_date_validation_endday = ''; - $search_debit = ''; - $search_credit = ''; - $search_lettering_code = ''; - $search_not_reconciled = ''; - } - - // Must be after the remove filter action, before the export. - $param = ''; - $filter = array(); - - if (!empty($search_date_start)) { - $filter['t.doc_date>='] = $search_date_start; - $param .= '&search_date_startmonth='.$search_date_startmonth.'&search_date_startday='.$search_date_startday.'&search_date_startyear='.$search_date_startyear; - } - if (!empty($search_date_end)) { - $filter['t.doc_date<='] = $search_date_end; - $param .= '&search_date_endmonth='.$search_date_endmonth.'&search_date_endday='.$search_date_endday.'&search_date_endyear='.$search_date_endyear; - } - if (!empty($search_doc_date)) { - $filter['t.doc_date'] = $search_doc_date; - $param .= '&doc_datemonth='.GETPOST('doc_datemonth', 'int').'&doc_dateday='.GETPOST('doc_dateday', 'int').'&doc_dateyear='.GETPOST('doc_dateyear', 'int'); - } - if (!empty($search_accountancy_code_start)) { - $filter['t.subledger_account>='] = $search_accountancy_code_start; - $param .= '&search_accountancy_code_start='.urlencode($search_accountancy_code_start); - } - if (!empty($search_accountancy_code_end)) { - $filter['t.subledger_account<='] = $search_accountancy_code_end; - $param .= '&search_accountancy_code_end='.urlencode($search_accountancy_code_end); - } - if (!empty($search_label_account)) { - $filter['t.label_compte'] = $search_label_account; - $param .= '&search_label_compte='.urlencode($search_label_account); - } - if (!empty($search_mvt_num)) { - $filter['t.piece_num'] = $search_mvt_num; - $param .= '&search_mvt_num='.urlencode($search_mvt_num); - } - if (!empty($search_doc_ref)) { - $filter['t.doc_ref'] = $search_doc_ref; - $param .= '&search_doc_ref='.urlencode($search_doc_ref); - } - if (!empty($search_label_operation)) { - $filter['t.label_operation'] = $search_label_operation; - $param .= '&search_label_operation='.urlencode($search_label_operation); - } - if (!empty($search_direction)) { - $filter['t.sens'] = $search_direction; - $param .= '&search_direction='.urlencode($search_direction); - } - if (!empty($search_ledger_code)) { - $filter['t.code_journal'] = $search_ledger_code; - foreach ($search_ledger_code as $code) { - $param .= '&search_ledger_code[]='.urlencode($code); - } - } - if (!empty($search_debit)) { - $filter['t.debit'] = $search_debit; - $param .= '&search_debit='.urlencode($search_debit); - } - if (!empty($search_credit)) { - $filter['t.credit'] = $search_credit; - $param .= '&search_credit='.urlencode($search_credit); - } - if (!empty($search_lettering_code)) { - $filter['t.lettering_code'] = $search_lettering_code; - $param .= '&search_lettering_code='.urlencode($search_lettering_code); - } - if (!empty($search_not_reconciled)) { - $filter['t.reconciled_option'] = $search_not_reconciled; - $param .= '&search_not_reconciled='.urlencode($search_not_reconciled); - } - if (!empty($search_date_export_start)) { - $filter['t.date_export>='] = $search_date_export_start; - $param .= '&search_date_export_startmonth='.$search_date_export_startmonth.'&search_date_export_startday='.$search_date_export_startday.'&search_date_export_startyear='.$search_date_export_startyear; - } - if (!empty($search_date_export_end)) { - $filter['t.date_export<='] = $search_date_export_end; - $param .= '&search_date_export_endmonth='.$search_date_export_endmonth.'&search_date_export_endday='.$search_date_export_endday.'&search_date_export_endyear='.$search_date_export_endyear; - } - if (!empty($search_date_validation_start)) { - $filter['t.date_validated>='] = $search_date_validation_start; - $param .= '&search_date_validation_startmonth='.$search_date_validation_startmonth.'&search_date_validation_startday='.$search_date_validation_startday.'&search_date_validation_startyear='.$search_date_validation_startyear; - } - if (!empty($search_date_validation_end)) { - $filter['t.date_validated<='] = $search_date_validation_end; - $param .= '&search_date_validation_endmonth='.$search_date_validation_endmonth.'&search_date_validation_endday='.$search_date_validation_endday.'&search_date_validation_endyear='.$search_date_validation_endyear; - } -} - -if ($action == 'delbookkeeping' && $user->rights->accounting->mouvements->supprimer) { - $import_key = GETPOST('importkey', 'alpha'); - - if (!empty($import_key)) { - $result = $object->deleteByImportkey($import_key); - if ($result < 0) { - setEventMessages($object->error, $object->errors, 'errors'); - } - - // Make a redirect to avoid to launch the delete later after a back button - header("Location: ".$_SERVER["PHP_SELF"].($param ? '?'.$param : '')); - exit; - } -} -if ($action == 'delbookkeepingyearconfirm' && $user->rights->accounting->mouvements->supprimer_tous) { - $delmonth = GETPOST('delmonth', 'int'); - $delyear = GETPOST('delyear', 'int'); - if ($delyear == -1) { - $delyear = 0; - } - $deljournal = GETPOST('deljournal', 'alpha'); - if ($deljournal == -1) { - $deljournal = 0; - } - - if (!empty($delmonth) || !empty($delyear) || !empty($deljournal)) { - $result = $object->deleteByYearAndJournal($delyear, $deljournal, '', ($delmonth > 0 ? $delmonth : 0)); - if ($result < 0) { - setEventMessages($object->error, $object->errors, 'errors'); - } else { - setEventMessages("RecordDeleted", null, 'mesgs'); - } - - // Make a redirect to avoid to launch the delete later after a back button - header("Location: ".$_SERVER["PHP_SELF"].($param ? '?'.$param : '')); - exit; - } else { - setEventMessages("NoRecordDeleted", null, 'warnings'); - } -} -if ($action == 'delmouvconfirm' && $user->rights->accounting->mouvements->supprimer) { - $mvt_num = GETPOST('mvt_num', 'int'); - - if (!empty($mvt_num)) { - $result = $object->deleteMvtNum($mvt_num); - if ($result < 0) { - setEventMessages($object->error, $object->errors, 'errors'); - } else { - setEventMessages($langs->trans("RecordDeleted"), null, 'mesgs'); - } - - header("Location: ".$_SERVER["PHP_SELF"]."?noreset=1".($param ? '&'.$param : '')); - exit; - } -} - - -/* - * View - */ - -$formaccounting = new FormAccounting($db); -$formfile = new FormFile($db); -$formother = new FormOther($db); -$form = new Form($db); - -$title_page = $langs->trans("Operations").' - '.$langs->trans("VueByAccountAccounting").' ('.$langs->trans("BookkeepingSubAccount").')'; - -llxHeader('', $title_page); - -// List -$nbtotalofrecords = ''; -if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) { - $nbtotalofrecords = $object->fetchAllByAccount($sortorder, $sortfield, 0, 0, $filter, 'AND', 1); - if ($nbtotalofrecords < 0) { - setEventMessages($object->error, $object->errors, 'errors'); - } -} - -$result = $object->fetchAllByAccount($sortorder, $sortfield, $limit, $offset, $filter, 'AND', 1); - -if ($result < 0) { - setEventMessages($object->error, $object->errors, 'errors'); -} - -$num = count($object->lines); - - -if ($action == 'delmouv') { - $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?mvt_num='.GETPOST('mvt_num'), $langs->trans('DeleteMvt'), $langs->trans('ConfirmDeleteMvtPartial'), 'delmouvconfirm', '', 0, 1); - print $formconfirm; -} -if ($action == 'delbookkeepingyear') { - $form_question = array(); - $delyear = GETPOST('delyear', 'int'); - $deljournal = GETPOST('deljournal', 'alpha'); - - if (empty($delyear)) { - $delyear = dol_print_date(dol_now(), '%Y'); - } - $month_array = array(); - for ($i = 1; $i <= 12; $i++) { - $month_array[$i] = $langs->trans("Month".sprintf("%02d", $i)); - } - $year_array = $formaccounting->selectyear_accountancy_bookkepping($delyear, 'delyear', 0, 'array'); - $journal_array = $formaccounting->select_journal($deljournal, 'deljournal', '', 1, 1, 1, '', 0, 1); - - $form_question['delmonth'] = array( - 'name' => 'delmonth', - 'type' => 'select', - 'label' => $langs->trans('DelMonth'), - 'values' => $month_array, - 'default' => '' - ); - $form_question['delyear'] = array( - 'name' => 'delyear', - 'type' => 'select', - 'label' => $langs->trans('DelYear'), - 'values' => $year_array, - 'default' => $delyear - ); - $form_question['deljournal'] = array( - 'name' => 'deljournal', - 'type' => 'other', // We don't use select here, the journal_array is already a select html component - 'label' => $langs->trans('DelJournal'), - 'value' => $journal_array, - 'default' => $deljournal - ); - - $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?'.$param, $langs->trans('DeleteMvt'), $langs->trans('ConfirmDeleteMvt', $langs->transnoentitiesnoconv("RegistrationInAccounting")), 'delbookkeepingyearconfirm', $form_question, '', 1, 300); - print $formconfirm; -} - - -print '
'; -print ''; -print ''; -if ($optioncss != '') { - print ''; -} -print ''; -print ''; -print ''; - -$parameters = array(); -$reshook = $hookmanager->executeHooks('addMoreActionsButtonsList', $parameters, $object, $action); // Note that $action and $object may have been modified by hook -if (empty($reshook)) { - $newcardbutton = dolGetButtonTitle($langs->trans('ViewFlatList'), '', 'fa fa-list paddingleft imgforviewmode', DOL_URL_ROOT.'/accountancy/bookkeeping/list.php?'.$param); - $newcardbutton .= dolGetButtonTitle($langs->trans('GroupByAccountAccounting'), '', 'fa fa-stream paddingleft imgforviewmode', DOL_URL_ROOT.'/accountancy/bookkeeping/listbyaccount.php?'.$param, '', 1, array('morecss' => 'marginleftonly')); - $newcardbutton .= dolGetButtonTitle($langs->trans('GroupBySubAccountAccounting'), '', 'fa fa-align-left vmirror paddingleft imgforviewmode', DOL_URL_ROOT.'/accountancy/bookkeeping/listbysubaccount.php?'.$param, '', 1, array('morecss' => 'marginleftonly btnTitleSelected')); - $newcardbutton .= dolGetButtonTitle($langs->trans('NewAccountingMvt'), '', 'fa fa-plus-circle paddingleft', DOL_URL_ROOT.'/accountancy/bookkeeping/card.php?action=create'); -} - -if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) { - $param .= '&contextpage='.urlencode($contextpage); -} -if ($limit > 0 && $limit != $conf->liste_limit) { - $param .= '&limit='.urlencode($limit); -} - -print_barre_liste($title_page, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $result, $nbtotalofrecords, 'title_accountancy', 0, $newcardbutton, '', $limit, 0, 0, 1); - -print info_admin($langs->trans("WarningRecordWithoutSubledgerAreExcluded")); - -$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage; -$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields -if ($massactionbutton) { - $selectedfields .= $form->showCheckAddButtons('checkforselect', 1); -} - -// Reverse sort order -if (preg_match('/^asc/i', $sortorder)) { - $sortorder = "asc"; -} else { - $sortorder = "desc"; -} - -$moreforfilter = ''; - -// Accountancy account -$moreforfilter .= '
'; -$moreforfilter .= $langs->trans('AccountAccounting').': '; -$moreforfilter .= '
'; -$moreforfilter .= $formaccounting->select_auxaccount($search_accountancy_code_start, 'search_accountancy_code_start', $langs->trans('From'), 'maxwidth200'); -$moreforfilter .= ' '; -$moreforfilter .= $formaccounting->select_auxaccount($search_accountancy_code_end, 'search_accountancy_code_end', $langs->trans('to'), 'maxwidth200'); -$moreforfilter .= '
'; -$moreforfilter .= '
'; - -$parameters = array(); -$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters); // Note that $action and $object may have been modified by hook -if (empty($reshook)) { - $moreforfilter .= $hookmanager->resPrint; -} else { - $moreforfilter = $hookmanager->resPrint; -} - -print '
'; -print $moreforfilter; -print '
'; - -print '
'; -print ''; - -// Filters lines -print ''; - -// Movement number -if (!empty($arrayfields['t.piece_num']['checked'])) { - print ''; -} -// Code journal -if (!empty($arrayfields['t.code_journal']['checked'])) { - print ''; -} -// Date document -if (!empty($arrayfields['t.doc_date']['checked'])) { - print ''; -} -// Ref document -if (!empty($arrayfields['t.doc_ref']['checked'])) { - print ''; -} -// Label operation -if (!empty($arrayfields['t.label_operation']['checked'])) { - print ''; -} -// Debit -if (!empty($arrayfields['t.debit']['checked'])) { - print ''; -} -// Credit -if (!empty($arrayfields['t.credit']['checked'])) { - print ''; -} -// Lettering code -if (!empty($arrayfields['t.lettering_code']['checked'])) { - print ''; -} -// Date export -if (!empty($arrayfields['t.date_export']['checked'])) { - print ''; -} -// Date validation -if (!empty($arrayfields['t.date_validated']['checked'])) { - print ''; -} - -// Fields from hook -$parameters = array('arrayfields'=>$arrayfields); -$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook -print $hookmanager->resPrint; - -// Action column -print ''; -print "\n"; - -print ''; -if (!empty($arrayfields['t.piece_num']['checked'])) { - print_liste_field_titre($arrayfields['t.piece_num']['label'], $_SERVER['PHP_SELF'], "t.piece_num", "", $param, '', $sortfield, $sortorder); -} -if (!empty($arrayfields['t.code_journal']['checked'])) { - print_liste_field_titre($arrayfields['t.code_journal']['label'], $_SERVER['PHP_SELF'], "t.code_journal", "", $param, '', $sortfield, $sortorder, 'center '); -} -if (!empty($arrayfields['t.doc_date']['checked'])) { - print_liste_field_titre($arrayfields['t.doc_date']['label'], $_SERVER['PHP_SELF'], "t.doc_date", "", $param, '', $sortfield, $sortorder, 'center '); -} -if (!empty($arrayfields['t.doc_ref']['checked'])) { - print_liste_field_titre($arrayfields['t.doc_ref']['label'], $_SERVER['PHP_SELF'], "t.doc_ref", "", $param, "", $sortfield, $sortorder); -} -if (!empty($arrayfields['t.label_operation']['checked'])) { - print_liste_field_titre($arrayfields['t.label_operation']['label'], $_SERVER['PHP_SELF'], "t.label_operation", "", $param, "", $sortfield, $sortorder); -} -if (!empty($arrayfields['t.debit']['checked'])) { - print_liste_field_titre($arrayfields['t.debit']['label'], $_SERVER['PHP_SELF'], "t.debit", "", $param, '', $sortfield, $sortorder, 'right '); -} -if (!empty($arrayfields['t.credit']['checked'])) { - print_liste_field_titre($arrayfields['t.credit']['label'], $_SERVER['PHP_SELF'], "t.credit", "", $param, '', $sortfield, $sortorder, 'right '); -} -if (!empty($arrayfields['t.lettering_code']['checked'])) { - print_liste_field_titre($arrayfields['t.lettering_code']['label'], $_SERVER['PHP_SELF'], "t.lettering_code", "", $param, '', $sortfield, $sortorder, 'center '); -} -if (!empty($arrayfields['t.date_export']['checked'])) { - print_liste_field_titre($arrayfields['t.date_export']['label'], $_SERVER['PHP_SELF'], "t.date_export", "", $param, '', $sortfield, $sortorder, 'center '); -} -if (!empty($arrayfields['t.date_validated']['checked'])) { - print_liste_field_titre($arrayfields['t.date_validated']['label'], $_SERVER['PHP_SELF'], "t.date_validated", "", $param, '', $sortfield, $sortorder, 'center '); -} -// Hook fields -$parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder); -$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook -print $hookmanager->resPrint; -print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch '); -print "\n"; - - -$total_debit = 0; -$total_credit = 0; -$sous_total_debit = 0; -$sous_total_credit = 0; -$displayed_account_number = null; // Start with undefined to be able to distinguish with empty - -// Loop on record -// -------------------------------------------------------------------- -$i = 0; -$totalarray = array(); -while ($i < min($num, $limit)) { - $line = $object->lines[$i]; - - $total_debit += $line->debit; - $total_credit += $line->credit; - - $accountg = length_accounta($line->subledger_account); - //if (empty($accountg)) $accountg = '-'; - - $colspan = 0; // colspan before field 'label of operation' - $colspanend = 3; // colspan after debit/credit - if (!empty($arrayfields['t.piece_num']['checked'])) { $colspan++; } - if (!empty($arrayfields['t.code_journal']['checked'])) { $colspan++; } - if (!empty($arrayfields['t.doc_date']['checked'])) { $colspan++; } - if (!empty($arrayfields['t.doc_ref']['checked'])) { $colspan++; } - if (!empty($arrayfields['t.label_operation']['checked'])) { $colspan++; } - if (!empty($arrayfields['t.date_export']['checked'])) { $colspanend++; } - if (!empty($arrayfields['t.date_validating']['checked'])) { $colspanend++; } - if (!empty($arrayfields['t.lettering_code']['checked'])) { $colspanend++; } - - // Is it a break ? - if ($accountg != $displayed_account_number || !isset($displayed_account_number)) { - // Show a subtotal by accounting account - if (isset($displayed_account_number)) { - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - // Show balance of last shown account - $balance = $sous_total_debit - $sous_total_credit; - print ''; - print ''; - if ($balance > 0) { - print ''; - print ''; - } else { - print ''; - print ''; - } - print ''; - print ''; - } - - // Show the break account - print ''; - print ''; - print ''; - - $displayed_account_number = $accountg; - //if (empty($displayed_account_number)) $displayed_account_number='-'; - $sous_total_debit = 0; - $sous_total_credit = 0; - - $colspan = 0; - } - - print ''; - - // Piece number - if (!empty($arrayfields['t.piece_num']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Journal code - if (!empty($arrayfields['t.code_journal']['checked'])) { - $accountingjournal = new AccountingJournal($db); - $result = $accountingjournal->fetch('', $line->code_journal); - $journaltoshow = (($result > 0) ? $accountingjournal->getNomUrl(0, 0, 0, '', 0) : $line->code_journal); - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Document date - if (!empty($arrayfields['t.doc_date']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Document ref - if (!empty($arrayfields['t.doc_ref']['checked'])) { - if ($line->doc_type == 'customer_invoice') { - $langs->loadLangs(array('bills')); - - require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; - $objectstatic = new Facture($db); - $objectstatic->fetch($line->fk_doc); - //$modulepart = 'facture'; - - $filename = dol_sanitizeFileName($line->doc_ref); - $filedir = $conf->facture->dir_output.'/'.dol_sanitizeFileName($line->doc_ref); - $urlsource = $_SERVER['PHP_SELF'].'?id='.$objectstatic->id; - $documentlink = $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir); - } elseif ($line->doc_type == 'supplier_invoice') { - $langs->loadLangs(array('bills')); - - require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php'; - $objectstatic = new FactureFournisseur($db); - $objectstatic->fetch($line->fk_doc); - //$modulepart = 'invoice_supplier'; - - $filename = dol_sanitizeFileName($line->doc_ref); - $filedir = $conf->fournisseur->facture->dir_output.'/'.get_exdir($line->fk_doc, 2, 0, 0, $objectstatic, $modulepart).dol_sanitizeFileName($line->doc_ref); - $subdir = get_exdir($objectstatic->id, 2, 0, 0, $objectstatic, $modulepart).dol_sanitizeFileName($line->doc_ref); - $documentlink = $formfile->getDocumentsLink($objectstatic->element, $subdir, $filedir); - } elseif ($line->doc_type == 'expense_report') { - $langs->loadLangs(array('trips')); - - require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php'; - $objectstatic = new ExpenseReport($db); - $objectstatic->fetch($line->fk_doc); - //$modulepart = 'expensereport'; - - $filename = dol_sanitizeFileName($line->doc_ref); - $filedir = $conf->expensereport->dir_output.'/'.dol_sanitizeFileName($line->doc_ref); - $urlsource = $_SERVER['PHP_SELF'].'?id='.$objectstatic->id; - $documentlink = $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir); - } elseif ($line->doc_type == 'bank') { - require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; - $objectstatic = new AccountLine($db); - $objectstatic->fetch($line->fk_doc); - } else { - // Other type - } - - print '\n"; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Label operation - if (!empty($arrayfields['t.label_operation']['checked'])) { - // Affiche un lien vers la facture client/fournisseur - $doc_ref = preg_replace('/\(.*\)/', '', $line->doc_ref); - print strlen(length_accounta($line->subledger_account)) == 0 ? '' : ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Amount debit - if (!empty($arrayfields['t.debit']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'totaldebit'; - } - $totalarray['val']['totaldebit'] += $line->debit; - } - - // Amount credit - if (!empty($arrayfields['t.credit']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - if (!$i) { - $totalarray['pos'][$totalarray['nbfield']] = 'totalcredit'; - } - $totalarray['val']['totalcredit'] += $line->credit; - } - - // Lettering code - if (!empty($arrayfields['t.lettering_code']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Exported operation date - if (!empty($arrayfields['t.date_export']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Validated operation date - if (!empty($arrayfields['t.date_validated']['checked'])) { - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - } - - // Fields from hook - $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj); - $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - - // Action column - print ''; - if (!$i) { - $totalarray['nbfield']++; - } - - // Comptabilise le sous-total - $sous_total_debit += $line->debit; - $sous_total_credit += $line->credit; - - print "\n"; - - $i++; -} - -if ($num > 0 && $colspan > 0) { - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - // Show balance of last shown account - $balance = $sous_total_debit - $sous_total_credit; - print ''; - print ''; - if ($balance > 0) { - print ''; - print ''; - } else { - print ''; - print ''; - } - print ''; - print ''; -} - -// Show total line -include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php'; - - -print "
'; - print $formaccounting->multi_select_journal($search_ledger_code, 'search_ledger_code', 0, 1, 1, 1); - print ''; - print '
'; - print $form->selectDate($search_date_start, 'search_date_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From")); - print '
'; - print '
'; - print $form->selectDate($search_date_end, 'search_date_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to")); - print '
'; - print '
'; - print ''; - print '
'.$langs->trans("NotReconciled").''; - print '
'; - print '
'; - print $form->selectDate($search_date_export_start, 'search_date_export_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From")); - print '
'; - print '
'; - print $form->selectDate($search_date_export_end, 'search_date_export_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to")); - print '
'; - print '
'; - print '
'; - print $form->selectDate($search_date_validation_start, 'search_date_validation_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("From")); - print '
'; - print '
'; - print $form->selectDate($search_date_validation_end, 'search_date_validation_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to")); - print '
'; - print '
'; -$searchpicto = $form->showFilterButtons(); -print $searchpicto; -print '
'.$langs->trans("TotalForAccount").' '.length_accounta($displayed_account_number).':'.price($sous_total_debit).''.price($sous_total_credit).'
'.$langs->trans("Balance").':'; - print price($sous_total_debit - $sous_total_credit); - print ''; - print price($sous_total_credit - $sous_total_debit); - print '
'; - if ($line->subledger_account != "" && $line->subledger_account != '-1') { - print $line->subledger_label.' : '.length_accounta($line->subledger_account); - } else { - // Should not happen: subledger account must be null or a non empty value - print ''.$langs->trans("Unknown"); - if ($line->subledger_label) { - print ' ('.$line->subledger_label.')'; - $htmltext = 'EmptyStringForSubledgerAccountButSubledgerLabelDefined'; - } else { - $htmltext = 'EmptyStringForSubledgerAccountAndSubledgerLabel'; - } - print $form->textwithpicto('', $htmltext); - print ''; - } - print '
'; - $object->id = $line->id; - $object->piece_num = $line->piece_num; - print $object->getNomUrl(1, '', 0, '', 1); - print ''.$journaltoshow.''.dol_print_date($line->doc_date, 'day').''; - - print ''; - // Picto + Ref - print '
'; - - if ($line->doc_type == 'customer_invoice' || $line->doc_type == 'supplier_invoice' || $line->doc_type == 'expense_report') { - print $objectstatic->getNomUrl(1, '', 0, 0, '', 0, -1, 1); - print $documentlink; - } elseif ($line->doc_type == 'bank') { - print $objectstatic->getNomUrl(1); - $bank_ref = strstr($line->doc_ref, '-'); - print " " . $bank_ref; - } else { - print $line->doc_ref; - } - print '
'; - - print "
'.$line->label_operation.''.$line->label_operation.'
('.length_accounta($line->subledger_account).')
'.($line->debit ? price($line->debit) : '').''.($line->credit ? price($line->credit) : '').''.$line->lettering_code.''.dol_print_date($line->date_export, 'dayhour').''.dol_print_date($line->date_validation, 'dayhour').''; - if (empty($line->date_export) && empty($line->date_validation)) { - if ($user->rights->accounting->mouvements->creer) { - print '' . img_edit() . ''; - } - } - if (empty($line->date_validation)) { - if ($user->rights->accounting->mouvements->supprimer) { - print ''.img_delete().''; - } - } - print '
'.$langs->trans("TotalForAccount").' '.$accountg.':'.price($sous_total_debit).''.price($sous_total_credit).'
'.$langs->trans("Balance").':'; - print price($sous_total_debit - $sous_total_credit); - print ''; - print price($sous_total_credit - $sous_total_debit); - print '
"; -print '
'; - -// TODO Replace this with mass delete action -if ($user->rights->accounting->mouvements->supprimer_tous) { - print '
'."\n"; - print ''.$langs->trans("DeleteMvt").''; - print '
'; -} - -print '
'; - -// End of page -llxFooter(); -$db->close(); diff --git a/htdocs/accountancy/class/bookkeeping.class.php b/htdocs/accountancy/class/bookkeeping.class.php index a83a311010d..21b723b003b 100644 --- a/htdocs/accountancy/class/bookkeeping.class.php +++ b/htdocs/accountancy/class/bookkeeping.class.php @@ -852,7 +852,8 @@ class BookKeeping extends CommonObject $sql .= " t.piece_num,"; $sql .= " t.date_creation,"; $sql .= " t.date_export,"; - $sql .= " t.date_validated as date_validation"; + $sql .= " t.date_validated as date_validation,"; + $sql .= " t.import_key"; // Manage filter $sqlwhere = array(); if (count($filter) > 0) { @@ -947,6 +948,7 @@ class BookKeeping extends CommonObject $line->date_creation = $this->db->jdate($obj->date_creation); $line->date_export = $this->db->jdate($obj->date_export); $line->date_validation = $this->db->jdate($obj->date_validation); + $line->import_key = $obj->import_key; $this->lines[] = $line; diff --git a/htdocs/accountancy/class/lettering.class.php b/htdocs/accountancy/class/lettering.class.php index f722a716b79..a31a4675851 100644 --- a/htdocs/accountancy/class/lettering.class.php +++ b/htdocs/accountancy/class/lettering.class.php @@ -33,6 +33,12 @@ include_once DOL_DOCUMENT_ROOT."/core/lib/date.lib.php"; */ class Lettering extends BookKeeping { + /** + * @var BookKeeping[] Bookkeeping cached + */ + public static $bookkeeping_cached = array(); + + /** * letteringThirdparty * @@ -119,6 +125,7 @@ class Lettering extends BookKeeping $ids[$obj2->rowid] = $obj2->rowid; $ids_fact[] = $obj2->fact_id; } + $this->db->free($resql2); } else { $this->errors[] = $this->db->lasterror; return -1; @@ -146,6 +153,7 @@ class Lettering extends BookKeeping while ($obj2 = $this->db->fetch_object($resql2)) { $ids[$obj2->rowid] = $obj2->rowid; } + $this->db->free($resql2); } else { $this->errors[] = $this->db->lasterror; return -1; @@ -205,6 +213,7 @@ class Lettering extends BookKeeping while ($obj2 = $this->db->fetch_object($resql2)) { $ids[$obj2->rowid] = $obj2->rowid; } + $this->db->free($resql2); } else { $this->errors[] = $this->db->lasterror; return -1; @@ -216,6 +225,7 @@ class Lettering extends BookKeeping $result = $this->updateLettering($ids); } } + $this->db->free($resql); } if ($error) { foreach ($this->errors as $errmsg) { @@ -230,17 +240,31 @@ class Lettering extends BookKeeping /** * - * @param array $ids ids array - * @param boolean $notrigger no trigger - * @return number + * @param array $ids ids array + * @param boolean $notrigger no trigger + * @return int */ public function updateLettering($ids = array(), $notrigger = false) { $error = 0; $lettre = 'AAA'; - $sql = "SELECT DISTINCT lettering_code FROM ".MAIN_DB_PREFIX."accounting_bookkeeping WHERE "; - $sql .= " lettering_code != '' ORDER BY lettering_code DESC limit 1"; + $sql = "SELECT DISTINCT ab2.lettering_code" . + " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping As ab" . + " LEFT JOIN " . MAIN_DB_PREFIX . "bank_url AS bu ON bu.fk_bank = ab.fk_doc" . + " LEFT JOIN " . MAIN_DB_PREFIX . "bank_url AS bu2 ON bu2.url_id = bu.url_id" . + " LEFT JOIN " . MAIN_DB_PREFIX . "accounting_bookkeeping AS ab2 ON ab2.fk_doc = bu2.fk_bank" . + " WHERE ab.rowid IN (" . $this->db->sanitize(implode(',', $ids)) . ")" . + " AND ab.doc_type = 'bank'" . + " AND ab2.doc_type = 'bank'" . + " AND bu.type = 'company'" . + " AND bu2.type = 'company'" . + " AND ab.subledger_account != ''" . + " AND ab2.subledger_account != ''" . + " AND ab.lettering_code IS NULL" . + " AND ab2.lettering_code != ''" . + " ORDER BY ab2.lettering_code DESC" . + " LIMIT 1 "; $result = $this->db->query($sql); if ($result) { @@ -249,13 +273,14 @@ class Lettering extends BookKeeping if (!empty($obj->lettering_code)) { $lettre++; } + $this->db->free($result); } else { $this->errors[] = 'Error'.$this->db->lasterror(); $error++; } $sql = "SELECT SUM(ABS(debit)) as deb, SUM(ABS(credit)) as cred FROM ".MAIN_DB_PREFIX."accounting_bookkeeping WHERE "; - $sql .= " rowid IN (".$this->db->sanitize(implode(',', $ids)).") AND date_validated IS NULL"; + $sql .= " rowid IN (".$this->db->sanitize(implode(',', $ids)).") AND lettering_code IS NULL AND subledger_account != ''"; $result = $this->db->query($sql); if ($result) { $obj = $this->db->fetch_object($result); @@ -263,6 +288,7 @@ class Lettering extends BookKeeping $this->errors[] = 'Total not exacts '.round(abs($obj->deb), 2).' vs '.round(abs($obj->cred), 2); $error++; } + $this->db->free($result); } else { $this->errors[] = 'Erreur sql'.$this->db->lasterror(); $error++; @@ -276,8 +302,7 @@ class Lettering extends BookKeeping $sql = "UPDATE ".MAIN_DB_PREFIX."accounting_bookkeeping SET"; $sql .= " lettering_code='".$this->db->escape($lettre)."'"; $sql .= " , date_lettering = '".$this->db->idate($now)."'"; // todo correct date it's false - $sql .= " WHERE rowid IN (".$this->db->sanitize(implode(',', $ids)).") AND date_validated IS NULL "; - $this->db->begin(); + $sql .= " WHERE rowid IN (".$this->db->sanitize(implode(',', $ids)).") AND lettering_code IS NULL AND subledger_account != ''"; dol_syslog(get_class($this)."::update", LOG_DEBUG); $resql = $this->db->query($sql); @@ -293,11 +318,422 @@ class Lettering extends BookKeeping dol_syslog(get_class($this)."::update ".$errmsg, LOG_ERR); $this->error .= ($this->error ? ', '.$errmsg : $errmsg); } - $this->db->rollback(); return -1 * $error; } else { - $this->db->commit(); return 1; } } + + /** + * + * @param array $ids ids array + * @param boolean $notrigger no trigger + * @return int + */ + public function deleteLettering($ids, $notrigger = false) + { + $error = 0; + + $sql = "UPDATE ".MAIN_DB_PREFIX."accounting_bookkeeping SET"; + $sql .= " lettering_code = NULL"; + $sql .= " , date_lettering = NULL"; + $sql .= " WHERE rowid IN (".$this->db->sanitize(implode(',', $ids)).")"; + $sql .= " AND subledger_account != ''"; + + dol_syslog(get_class($this)."::update", LOG_DEBUG); + $resql = $this->db->query($sql); + if (!$resql) { + $error++; + $this->errors[] = "Error ".$this->db->lasterror(); + } + + // Commit or rollback + if ($error) { + foreach ($this->errors as $errmsg) { + dol_syslog(get_class($this)."::update ".$errmsg, LOG_ERR); + $this->error .= ($this->error ? ', '.$errmsg : $errmsg); + } + return -1 * $error; + } else { + return 1; + } + } + + /** + * Lettering bookkeeping lines all types + * + * @param array $bookkeeping_ids Lettering specific list of bookkeeping id + * @param bool $unlettering Do unlettering + * @return int <0 if error (nb lettered = result -1), 0 if noting to lettering, >0 if OK (nb lettered) + */ + public function bookkeepingLetteringAll($bookkeeping_ids, $unlettering = false) + { + dol_syslog(__METHOD__ . " - ", LOG_DEBUG); + + $error = 0; + $errors = array(); + $nb_lettering = 0; + + $result = $this->bookkeepingLettering($bookkeeping_ids, 'customer_invoice', $unlettering); + if ($result < 0) { + $error++; + $errors = array_merge($errors, $this->errors); + $nb_lettering += abs($result) - 2; + } else { + $nb_lettering += $result; + } + + $result = $this->bookkeepingLettering($bookkeeping_ids, 'supplier_invoice', $unlettering); + if ($result < 0) { + $error++; + $errors = array_merge($errors, $this->errors); + $nb_lettering += abs($result) - 2; + } else { + $nb_lettering += $result; + } + + if ($error) { + $this->errors = $errors; + return -2 - $nb_lettering; + } else { + return $nb_lettering; + } + } + + /** + * Lettering bookkeeping lines + * + * @param array $bookkeeping_ids Lettering specific list of bookkeeping id + * @param string $type Type of bookkeeping type to lettering ('customer_invoice' or 'supplier_invoice') + * @param bool $unlettering Do unlettering + * @return int <0 if error (nb lettered = result -1), 0 if noting to lettering, >0 if OK (nb lettered) + */ + public function bookkeepingLettering($bookkeeping_ids, $type = 'customer_invoice', $unlettering = false) + { + global $langs; + + $this->errors = array(); + + // Clean parameters + $bookkeeping_ids = is_array($bookkeeping_ids) ? $bookkeeping_ids : array(); + $type = trim($type); + + $error = 0; + $nb_lettering = 0; + $grouped_lines = $this->getLinkedLines($bookkeeping_ids, $type); + foreach ($grouped_lines as $lines) { + $group_error = 0; + $total = 0; + $do_it = !$unlettering; + $lettering_code = null; + $piece_num_lines = array(); + $bookkeeping_lines = array(); + foreach ($lines as $line_infos) { + $bookkeeping_lines[$line_infos['id']] = $line_infos['id']; + $piece_num_lines[$line_infos['piece_num']] = $line_infos['piece_num']; + $total += ($line_infos['credit'] > 0 ? $line_infos['credit'] : -$line_infos['debit']); + + // Check lettering code + if ($unlettering) { + if (isset($lettering_code) && $lettering_code != $line_infos['lettering_code']) { + $this->errors[] = $langs->trans('AccountancyErrorMismatchLetteringCode'); + $group_error++; + break; + } + if (!isset($lettering_code)) $lettering_code = (string)$line_infos['lettering_code']; + if (!empty($line_infos['lettering_code'])) $do_it = true; + } elseif (!empty($line_infos['lettering_code'])) $do_it = false; + } + + // Check balance amount + if (!$group_error && !$unlettering && price2num($total) != 0) { + $this->errors[] = $langs->trans('AccountancyErrorMismatchBalanceAmount', $total); + $group_error++; + } + + // Lettering/Unlettering the group of bookkeeping lines + if (!$group_error && $do_it) { + if ($unlettering) $result = $this->deleteLettering($bookkeeping_lines); + else $result = $this->updateLettering($bookkeeping_lines); + if ($result < 0) { + $group_error++; + } else { + $nb_lettering++; + } + } + + if ($group_error) { + $this->errors[] = $langs->trans('AccountancyErrorLetteringBookkeeping', implode(', ', $piece_num_lines)); + $error++; + } + } + + if ($error) { + return -2 - $nb_lettering; + } else { + return $nb_lettering; + } + } + + /** + * Lettering bookkeeping lines + * + * @param array $bookkeeping_ids Lettering specific list of bookkeeping id + * @param string $type Type of bookkeeping type to lettering ('customer_invoice' or 'supplier_invoice') + * @return array|int <0 if error otherwise all linked lines by block + */ + public function getLinkedLines($bookkeeping_ids, $type = 'customer_invoice') + { + global $conf, $langs; + $this->errors = array(); + + // Clean parameters + $bookkeeping_ids = is_array($bookkeeping_ids) ? $bookkeeping_ids : array(); + $type = trim($type); + + if ($type == 'customer_invoice') { + $doc_type = 'customer_invoice'; + $bank_url_type = 'payment'; + $payment_element = 'paiement_facture'; + $fk_payment_element = 'fk_paiement'; + $fk_element = 'fk_facture'; + $account_number = $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER; + } elseif ($type == 'supplier_invoice') { + $doc_type = 'supplier_invoice'; + $bank_url_type = 'payment_supplier'; + $payment_element = 'paiementfourn_facturefourn'; + $fk_payment_element = 'fk_paiementfourn'; + $fk_element = 'fk_facturefourn'; + $account_number = $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER; + } else { + $langs->load('errors'); + $this->errors[] = $langs->trans('ErrorBadParameters'); + return -1; + } + + $payment_ids = array(); + + // Get all payment id from bank lines + $sql = "SELECT DISTINCT bu.url_id AS payment_id" . + " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping AS ab" . + " LEFT JOIN " . MAIN_DB_PREFIX . "bank_url AS bu ON bu.fk_bank = ab.fk_doc" . + " WHERE ab.doc_type = 'bank'" . + // " AND ab.subledger_account != ''" . + // " AND ab.numero_compte = '" . $this->db->escape($account_number) . "'" . + " AND bu.type = '" . $this->db->escape($bank_url_type) . "'"; + if (!empty($bookkeeping_ids)) $sql .= " AND ab.rowid IN (" . $this->db->sanitize(implode(',', $bookkeeping_ids)) . ")"; + + dol_syslog(__METHOD__ . " - Get all payment id from bank lines", LOG_DEBUG); + $resql = $this->db->query($sql); + if (!$resql) { + $this->errors[] = "Error " . $this->db->lasterror(); + return -1; + } + + while ($obj = $this->db->fetch_object($resql)) { + $payment_ids[$obj->payment_id] = $obj->payment_id; + } + $this->db->free($resql); + + // Get all payment id from payment lines + $sql = "SELECT DISTINCT pe.$fk_payment_element AS payment_id" . + " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping AS ab" . + " LEFT JOIN " . MAIN_DB_PREFIX . "$payment_element AS pe ON pe.$fk_element = ab.fk_doc" . + " WHERE ab.doc_type = '" . $this->db->escape($doc_type) . "'" . + // " AND ab.subledger_account != ''" . + // " AND ab.numero_compte = '" . $this->db->escape($account_number) . "'" . + " AND pe.$fk_payment_element IS NOT NULL"; + if (!empty($bookkeeping_ids)) $sql .= " AND ab.rowid IN (" . $this->db->sanitize(implode(',', $bookkeeping_ids)) . ")"; + + dol_syslog(__METHOD__ . " - Get all payment id from bank lines", LOG_DEBUG); + $resql = $this->db->query($sql); + if (!$resql) { + $this->errors[] = "Error " . $this->db->lasterror(); + return -1; + } + + while ($obj = $this->db->fetch_object($resql)) { + $payment_ids[$obj->payment_id] = $obj->payment_id; + } + $this->db->free($resql); + + if (empty($payment_ids)) { + return array(); + } + + // Get all payments linked by group + $payment_by_group = $this->getLinkedPaymentByGroup($payment_ids, $type); + + $groups = array(); + foreach ($payment_by_group as $payment_list) { + $lines = array(); + + // Get bank lines + $sql = "SELECT DISTINCT ab.rowid, ab.piece_num, ab.lettering_code, ab.debit, ab.credit" . + " FROM " . MAIN_DB_PREFIX . "bank_url AS bu" . + " LEFT JOIN " . MAIN_DB_PREFIX . "accounting_bookkeeping AS ab ON ab.fk_doc = bu.fk_bank" . + " WHERE bu.url_id IN (" . $this->db->sanitize(implode(',', $payment_list)) . ")" . + " AND bu.type = '" . $this->db->escape($bank_url_type) . "'" . + " AND ab.doc_type = 'bank'" . + " AND ab.subledger_account != ''" . + " AND ab.numero_compte = '" . $this->db->escape($account_number) . "'"; + + dol_syslog(__METHOD__ . " - Get bank lines", LOG_DEBUG); + $resql = $this->db->query($sql); + if (!$resql) { + $this->errors[] = "Error " . $this->db->lasterror(); + return -1; + } + + while ($obj = $this->db->fetch_object($resql)) { + $lines[$obj->rowid] = array('id' => $obj->rowid, 'piece_num' => $obj->piece_num, 'lettering_code' => $obj->lettering_code, 'debit' => $obj->debit, 'credit' => $obj->credit); + } + $this->db->free($resql); + + // Get payment lines + $sql = "SELECT DISTINCT ab.rowid, ab.piece_num, ab.lettering_code, ab.debit, ab.credit" . + " FROM " . MAIN_DB_PREFIX . "$payment_element AS pe" . + " LEFT JOIN " . MAIN_DB_PREFIX . "accounting_bookkeeping AS ab ON ab.fk_doc = pe.$fk_element" . + " WHERE pe.$fk_payment_element IN (" . $this->db->sanitize(implode(',', $payment_list)) . ")" . + " AND ab.doc_type = '" . $this->db->escape($doc_type) . "'" . + " AND ab.subledger_account != ''" . + " AND ab.numero_compte = '" . $this->db->escape($account_number) . "'"; + + dol_syslog(__METHOD__ . " - Get payment lines", LOG_DEBUG); + $resql = $this->db->query($sql); + if (!$resql) { + $this->errors[] = "Error " . $this->db->lasterror(); + return -1; + } + + while ($obj = $this->db->fetch_object($resql)) { + $lines[$obj->rowid] = array('id' => $obj->rowid, 'piece_num' => $obj->piece_num, 'lettering_code' => $obj->lettering_code, 'debit' => $obj->debit, 'credit' => $obj->credit); + } + $this->db->free($resql); + + if (!empty($lines)) { + $groups[] = $lines; + } + } + + return $groups; + } + + public function getLinkedPaymentByGroup($payment_ids, $type) + { + global $langs; + + // Clean parameters + $payment_ids = is_array($payment_ids) ? $payment_ids : array(); + $type = trim($type); + + if (empty($payment_ids)) { + return array(); + } + + if ($type == 'customer_invoice') { + $payment_element = 'paiement_facture'; + $fk_payment_element = 'fk_paiement'; + $fk_element = 'fk_facture'; + } elseif ($type == 'supplier_invoice') { + $payment_element = 'paiementfourn_facturefourn'; + $fk_payment_element = 'fk_paiementfourn'; + $fk_element = 'fk_facturefourn'; + } else { + $langs->load('errors'); + $this->errors[] = $langs->trans('ErrorBadParameters'); + return -1; + } + + // Get payment lines + $sql = "SELECT DISTINCT pe2.$fk_payment_element, pe2.$fk_element" . + " FROM " . MAIN_DB_PREFIX . "$payment_element AS pe" . + " LEFT JOIN " . MAIN_DB_PREFIX . "$payment_element AS pe2 ON pe2.$fk_element = pe.$fk_element" . + " WHERE pe.$fk_payment_element IN (" . $this->db->sanitize(implode(',', $payment_ids)) . ")"; + + dol_syslog(__METHOD__ . " - Get payment lines", LOG_DEBUG); + $resql = $this->db->query($sql); + if (!$resql) { + $this->errors[] = "Error " . $this->db->lasterror(); + return -1; + } + + $current_payment_ids = array(); + $payment_by_element = array(); + $element_by_payment = array(); + while ($obj = $this->db->fetch_object($resql)) { + $current_payment_ids[$obj->$fk_payment_element] = $obj->$fk_payment_element; + $element_by_payment[$obj->$fk_payment_element][$obj->$fk_element] = $obj->$fk_element; + $payment_by_element[$obj->$fk_element][$obj->$fk_payment_element] = $obj->$fk_payment_element; + } + $this->db->free($resql); + + if (count(array_diff($payment_ids, $current_payment_ids))) { + return $this->getLinkedPaymentByGroup($current_payment_ids, $type); + } + + return $this->getGroupElements($payment_by_element, $element_by_payment); + } + + /** + * Get payment ids grouped by payment id and element id in common + * + * @param array &$payment_by_element List of payment ids by element id + * @param array &$element_by_payment List of element ids by payment id + * @param int $element_id Element Id (used for recursive function) + * @param array &$current_group Current group (used for recursive function) + * @return array List of payment ids grouped by payment id and element id in common + */ + public function getGroupElements(&$payment_by_element, &$element_by_payment, $element_id = 0, &$current_group = array()) + { + $grouped_payments = array(); + if ($element_id > 0 && !isset($payment_by_element[$element_id])) { + // Return if specific element id not found + return $grouped_payments; + } + + if ($element_id == 0) { + // Save list when is the begin of recursive function + $save_payment_by_element = $payment_by_element; + $save_element_by_payment = $element_by_payment; + } + + do { + // Get current element id, get this payment id list and delete the entry + $current_element_id = $element_id > 0 ? $element_id : array_keys($payment_by_element)[0]; + $payment_ids = $payment_by_element[$current_element_id]; + unset($payment_by_element[$current_element_id]); + + foreach ($payment_ids as $payment_id) { + // Continue if payment id in not found + if (!isset($element_by_payment[$payment_id])) continue; + + // Set the payment in the current group + $current_group[$payment_id] = $payment_id; + + // Get current element ids, get this payment id list and delete the entry + $element_ids = $element_by_payment[$payment_id]; + unset($element_by_payment[$payment_id]); + + // Set payment id on the current group for each element id of the payment + foreach ($element_ids as $id) { + $this->getGroupElements($payment_by_element, $element_by_payment, $id, $current_group); + } + } + + if ($element_id == 0) { + // Save current group and reset the current group when is the begin of recursive function + $grouped_payments[] = $current_group; + $current_group = array(); + } + } while(!empty($payment_by_element) && $element_id == 0); + + if ($element_id == 0) { + // Restore list when is the begin of recursive function + $payment_by_element = $save_payment_by_element; + $element_by_payment = $save_element_by_payment; + } + + return $grouped_payments; + } } diff --git a/htdocs/accountancy/journal/bankjournal.php b/htdocs/accountancy/journal/bankjournal.php index 4841b8bf171..8a02ac3849a 100644 --- a/htdocs/accountancy/journal/bankjournal.php +++ b/htdocs/accountancy/journal/bankjournal.php @@ -665,6 +665,8 @@ if (!$error && $action == 'writebookkeeping') { // Line into thirdparty account foreach ($tabtp[$key] as $k => $mt) { if ($mt) { + $lettering = false; + $reflabel = ''; if (!empty($val['lib'])) { $reflabel .= dol_string_nohtmltag($val['lib']).($val['soclib'] ? " - " : ""); @@ -693,11 +695,13 @@ if (!$error && $action == 'writebookkeeping') { $bookkeeping->date_creation = $now; if ($tabtype[$key] == 'payment') { // If payment is payment of customer invoice, we get ref of invoice + $lettering = true; $bookkeeping->subledger_account = $k; // For payment, the subledger account is stored as $key of $tabtp $bookkeeping->subledger_label = $tabcompany[$key]['name']; // $tabcompany is defined only if we are sure there is 1 thirdparty for the bank transaction $bookkeeping->numero_compte = $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER; $bookkeeping->label_compte = $accountingaccountcustomer->label; } elseif ($tabtype[$key] == 'payment_supplier') { // If payment is payment of supplier invoice, we get ref of invoice + $lettering = true; $bookkeeping->subledger_account = $k; // For payment, the subledger account is stored as $key of $tabtp $bookkeeping->subledger_label = $tabcompany[$key]['name']; // $tabcompany is defined only if we are sure there is 1 thirdparty for the bank transaction $bookkeeping->numero_compte = $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER; @@ -780,6 +784,12 @@ if (!$error && $action == 'writebookkeeping') { $errorforline++; setEventMessages($bookkeeping->error, $bookkeeping->errors, 'errors'); } + } else { + if ($lettering && getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING')) { + require_once DOL_DOCUMENT_ROOT . '/accountancy/class/lettering.class.php'; + $lettering_static = new Lettering($db); + $nb_lettering = $lettering_static->bookkeepingLetteringAll(array($bookkeeping->id)); + } } } } diff --git a/htdocs/accountancy/journal/purchasesjournal.php b/htdocs/accountancy/journal/purchasesjournal.php index 8b1ac0d3de3..7c0a8b90f7d 100644 --- a/htdocs/accountancy/journal/purchasesjournal.php +++ b/htdocs/accountancy/journal/purchasesjournal.php @@ -377,6 +377,12 @@ if ($action == 'writebookkeeping') { $errorforinvoice[$key] = 'other'; setEventMessages($bookkeeping->error, $bookkeeping->errors, 'errors'); } + } else { + if (getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING')) { + require_once DOL_DOCUMENT_ROOT . '/accountancy/class/lettering.class.php'; + $lettering_static = new Lettering($db); + $nb_lettering = $lettering_static->bookkeepingLettering(array($bookkeeping->id), 'supplier_invoice'); + } } } } diff --git a/htdocs/accountancy/journal/sellsjournal.php b/htdocs/accountancy/journal/sellsjournal.php index 7a5ccd79b21..7cc7f0effbc 100644 --- a/htdocs/accountancy/journal/sellsjournal.php +++ b/htdocs/accountancy/journal/sellsjournal.php @@ -390,6 +390,12 @@ if ($action == 'writebookkeeping') { $errorforinvoice[$key] = 'other'; setEventMessages($bookkeeping->error, $bookkeeping->errors, 'errors'); } + } else { + if (getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING')) { + require_once DOL_DOCUMENT_ROOT . '/accountancy/class/lettering.class.php'; + $lettering_static = new Lettering($db); + $nb_lettering = $lettering_static->bookkeepingLettering(array($bookkeeping->id), 'customer_invoice'); + } } } } diff --git a/htdocs/langs/en_US/accountancy.lang b/htdocs/langs/en_US/accountancy.lang index fd5ff8461fe..b3088e4427e 100644 --- a/htdocs/langs/en_US/accountancy.lang +++ b/htdocs/langs/en_US/accountancy.lang @@ -395,6 +395,21 @@ Range=Range of accounting account Calculated=Calculated Formula=Formula +## Reconcile +Unlettering=Unreconcile +AccountancyNoLetteringModified=No reconcile modified +AccountancyOneLetteringModifiedSuccessfully=One reconcile successfully modified +AccountancyLetteringModifiedSuccessfully=%s reconcile successfully modified +AccountancyNoUnletteringModified=No unreconcile modified +AccountancyOneUnletteringModifiedSuccessfully=One unreconcile successfully modified +AccountancyUnletteringModifiedSuccessfully=%s unreconcile successfully modified + +## Confirm box +ConfirmMassUnlettering=Bulk Unreconcile confirmation +ConfirmMassUnletteringQuestion=Are you sure you want to Unreconcile the %s selected record(s)? +ConfirmMassDeleteBookkeepingWriting=Bulk Delete confirmation +ConfirmMassDeleteBookkeepingWritingQuestion=This will delete the transaction from the accounting (all lines related to the same transaction will be deleted) Are you sure you want to delete the %s selected record(s)? + ## Error SomeMandatoryStepsOfSetupWereNotDone=Some mandatory steps of setup was not done, please complete them ErrorNoAccountingCategoryForThisCountry=No accounting account group available for country %s (See Home - Setup - Dictionaries) @@ -407,6 +422,9 @@ Binded=Lines bound ToBind=Lines to bind UseMenuToSetBindindManualy=Lines not yet bound, use menu %s to make the binding manually SorryThisModuleIsNotCompatibleWithTheExperimentalFeatureOfSituationInvoices=Sorry this module is not compatible with the experimental feature of situation invoices +AccountancyErrorMismatchLetterCode=Mismatch in reconcile code +AccountancyErrorMismatchBalanceAmount=The balance (%s) is not equal to 0 +AccountancyErrorLetteringBookkeeping=Errors have occurred concerning the transactions: %s ## Import ImportAccountingEntries=Accounting entries From 0c8a6bd6f017bfe2ab899fa74f71659df437392d Mon Sep 17 00:00:00 2001 From: melina Date: Thu, 28 Apr 2022 08:39:02 +0200 Subject: [PATCH 228/738] fix commit --- htdocs/takepos/ajax/ajax.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/htdocs/takepos/ajax/ajax.php b/htdocs/takepos/ajax/ajax.php index 9afde9ba341..0de7cb857a6 100644 --- a/htdocs/takepos/ajax/ajax.php +++ b/htdocs/takepos/ajax/ajax.php @@ -218,7 +218,7 @@ if ($action == 'getProducts') { // Add tables from hooks $parameters=array(); - $reshook=$hookmanager->executeHooks('printFieldListTables', $parameters); + $reshook=$hookmanager->executeHooks('printFieldListTables', $parameters); $sql .= $hookmanager->resPrint; $sql .= ' WHERE entity IN ('.getEntity('product').')'; @@ -229,7 +229,7 @@ if ($action == 'getProducts') { $sql .= natural_search(array('ref', 'label', 'barcode'), $term); // Add where from hooks $parameters=array(); - $reshook=$hookmanager->executeHooks('printFieldListWhere', $parameters); + $reshook=$hookmanager->executeHooks('printFieldListWhere', $parameters); $sql .= $hookmanager->resPrint; $resql = $db->query($sql); @@ -269,9 +269,11 @@ if ($action == 'getProducts') { ); // Add entries to row from hooks $parameters=array(); - $parameters['row'] = end($rows); + $parameters['row'] = $row; $parameters['obj'] = $obj; - $reshook=$hookmanager->executeHooks('completeAjaxReturnArray', $parameters); + $hookmanager->executeHooks('completeAjaxReturnArray', $parameters); + if (!empty($hookmanager->resArray)) $row = $hookmanager->resArray; + $rows[] = $row; } echo json_encode($rows); } else { From f634d7e50384faa0a1df4bd4f2eacb0fb97f7814 Mon Sep 17 00:00:00 2001 From: melina Date: Thu, 28 Apr 2022 08:42:44 +0200 Subject: [PATCH 229/738] fix commit --- htdocs/takepos/ajax/ajax.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/takepos/ajax/ajax.php b/htdocs/takepos/ajax/ajax.php index 0de7cb857a6..13956794f18 100644 --- a/htdocs/takepos/ajax/ajax.php +++ b/htdocs/takepos/ajax/ajax.php @@ -254,7 +254,7 @@ if ($action == 'getProducts') { } } - $rows[] = array( + $row = array( 'rowid' => $obj->rowid, 'ref' => $obj->ref, 'label' => $obj->label, From be2502c29f2d69db2dea3972c58e1ae4a889afdd Mon Sep 17 00:00:00 2001 From: lmarcouiller Date: Thu, 28 Apr 2022 10:50:55 +0200 Subject: [PATCH 230/738] New : module webhook database structure --- .../mysql/tables/llx_webhook_target.key.sql | 27 ++++++++++++++ .../mysql/tables/llx_webhook_target.sql | 36 +++++++++++++++++++ .../llx_webhook_target_extrafields.key.sql | 19 ++++++++++ .../tables/llx_webhook_target_extrafields.sql | 23 ++++++++++++ 4 files changed, 105 insertions(+) create mode 100644 htdocs/install/mysql/tables/llx_webhook_target.key.sql create mode 100644 htdocs/install/mysql/tables/llx_webhook_target.sql create mode 100644 htdocs/install/mysql/tables/llx_webhook_target_extrafields.key.sql create mode 100644 htdocs/install/mysql/tables/llx_webhook_target_extrafields.sql diff --git a/htdocs/install/mysql/tables/llx_webhook_target.key.sql b/htdocs/install/mysql/tables/llx_webhook_target.key.sql new file mode 100644 index 00000000000..04a0dbb306a --- /dev/null +++ b/htdocs/install/mysql/tables/llx_webhook_target.key.sql @@ -0,0 +1,27 @@ +-- Copyright (C) ---Put here your own copyright and developer email--- +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see https://www.gnu.org/licenses/. + + +-- BEGIN MODULEBUILDER INDEXES +ALTER TABLE llx_webhook_target ADD INDEX idx_webhook_target_rowid (rowid); +ALTER TABLE llx_webhook_target ADD INDEX idx_webhook_target_ref (ref); +ALTER TABLE llx_webhook_target ADD CONSTRAINT llx_webhook_target_fk_user_creat FOREIGN KEY (fk_user_creat) REFERENCES llx_user(rowid); +ALTER TABLE llx_webhook_target ADD INDEX idx_webhook_target_status (status); +-- END MODULEBUILDER INDEXES + +--ALTER TABLE llx_webhook_target ADD UNIQUE INDEX uk_webhook_target_fieldxy(fieldx, fieldy); + +--ALTER TABLE llx_webhook_target ADD CONSTRAINT llx_webhook_target_fk_field FOREIGN KEY (fk_field) REFERENCES llx_webhook_myotherobject(rowid); + diff --git a/htdocs/install/mysql/tables/llx_webhook_target.sql b/htdocs/install/mysql/tables/llx_webhook_target.sql new file mode 100644 index 00000000000..f9a6b61d489 --- /dev/null +++ b/htdocs/install/mysql/tables/llx_webhook_target.sql @@ -0,0 +1,36 @@ +-- Copyright (C) ---Put here your own copyright and developer email--- +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see https://www.gnu.org/licenses/. + + +CREATE TABLE llx_webhook_target( + -- BEGIN MODULEBUILDER FIELDS + rowid integer AUTO_INCREMENT PRIMARY KEY NOT NULL, + ref varchar(128) DEFAULT '(PROV)' NOT NULL, + label varchar(255), + description text, + note_public text, + note_private text, + date_creation datetime NOT NULL, + tms timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + fk_user_creat integer NOT NULL, + fk_user_modif integer, + last_main_doc varchar(255), + import_key varchar(14), + model_pdf varchar(255), + status integer NOT NULL, + url varchar(255) NOT NULL, + trigger_codes text NOT NULL + -- END MODULEBUILDER FIELDS +) ENGINE=innodb; diff --git a/htdocs/install/mysql/tables/llx_webhook_target_extrafields.key.sql b/htdocs/install/mysql/tables/llx_webhook_target_extrafields.key.sql new file mode 100644 index 00000000000..c8ebcf12bdc --- /dev/null +++ b/htdocs/install/mysql/tables/llx_webhook_target_extrafields.key.sql @@ -0,0 +1,19 @@ +-- Copyright (C) ---Put here your own copyright and developer email--- +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see https://www.gnu.org/licenses/. + + +-- BEGIN MODULEBUILDER INDEXES +ALTER TABLE llx_webhook_target_extrafields ADD INDEX idx_target_fk_object(fk_object); +-- END MODULEBUILDER INDEXES diff --git a/htdocs/install/mysql/tables/llx_webhook_target_extrafields.sql b/htdocs/install/mysql/tables/llx_webhook_target_extrafields.sql new file mode 100644 index 00000000000..0af3a1fadda --- /dev/null +++ b/htdocs/install/mysql/tables/llx_webhook_target_extrafields.sql @@ -0,0 +1,23 @@ +-- Copyright (C) ---Put here your own copyright and developer email--- +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see https://www.gnu.org/licenses/. + +create table llx_webhook_target_extrafields +( + rowid integer AUTO_INCREMENT PRIMARY KEY, + tms timestamp, + fk_object integer NOT NULL, + import_key varchar(14) -- import key +) ENGINE=innodb; + From 729d1f57aaa1757470b0a855fec3eebbc4949619 Mon Sep 17 00:00:00 2001 From: Christophe Battarel Date: Thu, 28 Apr 2022 10:53:16 +0200 Subject: [PATCH 231/738] fix select fields --- htdocs/takepos/ajax/ajax.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/takepos/ajax/ajax.php b/htdocs/takepos/ajax/ajax.php index a3bcc04b5c8..ff2cbd65d51 100644 --- a/htdocs/takepos/ajax/ajax.php +++ b/htdocs/takepos/ajax/ajax.php @@ -208,7 +208,7 @@ if ($action == 'getProducts') { } } - $sql = 'SELECT rowid, ref, label, tosell, tobuy, barcode, price' ; + $sql = 'SELECT p.rowid, p.ref, p.label, p.tosell, p.tobuy, p.barcode, p.price' ; // Add fields from hooks $parameters=array(); $reshook=$hookmanager->executeHooks('printFieldListSelect', $parameters); // Note that $action and $object may have been modified by hook From d376d285888cec7ade770db59a9a032d0aefa831 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 28 Apr 2022 11:12:21 +0200 Subject: [PATCH 232/738] Missing trans --- htdocs/langs/en_US/users.lang | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/htdocs/langs/en_US/users.lang b/htdocs/langs/en_US/users.lang index 888c9f52161..5bfbec87294 100644 --- a/htdocs/langs/en_US/users.lang +++ b/htdocs/langs/en_US/users.lang @@ -123,4 +123,8 @@ ForceUserHolidayValidator=Force leave request validator ValidatorIsSupervisorByDefault=By default, the validator is the supervisor of the user. Keep empty to keep this behaviour. UserPersonalEmail=Personal email UserPersonalMobile=Personal mobile phone -WarningNotLangOfInterface=Warning, this is the main language the user speak, not the language of the interface he choosed to see. To change the interface language visible by this user, go on tab %s \ No newline at end of file +WarningNotLangOfInterface=Warning, this is the main language the user speak, not the language of the interface he choosed to see. To change the interface language visible by this user, go on tab %s +DateLastLogin=Date last login +DatePreviousLogin=Date previous login +IPLastLogin=IP last login +IPPreviousLogin=IP previous login From fc6228a48ca487560c112c0d754f5c7b461b8fa2 Mon Sep 17 00:00:00 2001 From: IC-faycal Date: Thu, 28 Apr 2022 11:27:15 +0200 Subject: [PATCH 233/738] NEW Events on Proposal to Return to Draft --- .../triggers/interface_50_modAgenda_ActionsAuto.class.php | 8 ++++++++ htdocs/langs/en_US/agenda.lang | 1 + 2 files changed, 9 insertions(+) diff --git a/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php b/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php index cf6a8220c29..187e3f5a156 100644 --- a/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php +++ b/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php @@ -186,6 +186,14 @@ class InterfaceActionsAuto extends DolibarrTriggers } $object->actionmsg = $langs->transnoentities("PropalValidatedInDolibarr", ($object->newref ? $object->newref : $object->ref)); + $object->sendtoid = 0; + } elseif ($action == 'PROPAL_MODIFY') { + // Load translation files required by the page + $langs->loadLangs(array("agenda", "other", "propal")); + + if (empty($object->actionmsg2)) $object->actionmsg2 = $langs->transnoentities("PropalBackToDraftInDolibarr", ($object->newref ? $object->newref : $object->ref)); + $object->actionmsg = $langs->transnoentities("PropalBackToDraftInDolibarr", ($object->newref ? $object->newref : $object->ref)); + $object->sendtoid = 0; } elseif ($action == 'PROPAL_SENTBYMAIL') { // Load translation files required by the page diff --git a/htdocs/langs/en_US/agenda.lang b/htdocs/langs/en_US/agenda.lang index bc9c7dab537..73bb8d92346 100644 --- a/htdocs/langs/en_US/agenda.lang +++ b/htdocs/langs/en_US/agenda.lang @@ -45,6 +45,7 @@ CONTRACT_DELETEInDolibarr=Contract %s deleted PropalClosedSignedInDolibarr=Proposal %s signed PropalClosedRefusedInDolibarr=Proposal %s refused PropalValidatedInDolibarr=Proposal %s validated +PropalBackToDraftInDolibarr=Proposal %s go back to draft status PropalClassifiedBilledInDolibarr=Proposal %s classified billed InvoiceValidatedInDolibarr=Invoice %s validated InvoiceValidatedInDolibarrFromPos=Invoice %s validated from POS From ed4610b36bde8878574d0ab4922627f37f443717 Mon Sep 17 00:00:00 2001 From: Adrien Raze Date: Thu, 28 Apr 2022 11:45:55 +0200 Subject: [PATCH 234/738] FIX : Move column "Real Qty" just before "Real PMP" column --- htdocs/product/inventory/inventory.php | 48 +++++++++++++++++--------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/htdocs/product/inventory/inventory.php b/htdocs/product/inventory/inventory.php index 204c6539c29..f7691193e24 100644 --- a/htdocs/product/inventory/inventory.php +++ b/htdocs/product/inventory/inventory.php @@ -910,15 +910,17 @@ if ($object->id > 0) { print ''; } print ''.$langs->trans("ExpectedQty").''; - print ''; - print $form->textwithpicto($langs->trans("RealQty"), $langs->trans("InventoryRealQtyHelp")); - print ''; if (!empty($conf->global->INVENTORY_MANAGE_REAL_PMP)) { print ''.$langs->trans('PMPExpected').''; print ''.$langs->trans('ExpectedValuation').''; + print ''.$form->textwithpicto($langs->trans("RealQty"), $langs->trans("InventoryRealQtyHelp")).''; print ''.$langs->trans('PMPReal').''; print ''.$langs->trans('RealValuation').''; - } + } else { + print ''; + print $form->textwithpicto($langs->trans("RealQty"), $langs->trans("InventoryRealQtyHelp")); + print ''; + } if ($object->status == $object::STATUS_DRAFT || $object->status == $object::STATUS_VALIDATED) { // Actions or link to stock movement print ''; @@ -1041,7 +1043,6 @@ if ($object->id > 0) { // Real quantity if ($object->status == $object::STATUS_DRAFT || $object->status == $object::STATUS_VALIDATED) { - print ''; $qty_view = GETPOST("id_".$obj->rowid) && price2num(GETPOST("id_".$obj->rowid), 'MS') >= 0 ? GETPOST("id_".$obj->rowid) : $obj->qty_view; //if (!$hasinput && $qty_view !== null && $obj->qty_stock != $qty_view) { @@ -1049,11 +1050,6 @@ if ($object->id > 0) { $hasinput = true; } - print ''; - print img_picto('', 'eraser', 'class="opacitymedium"'); - print ''; - print ''; - print ''; if (! empty($conf->global->INVENTORY_MANAGE_REAL_PMP)) { //PMP Expected if (! empty($obj->pmp_expected)) $pmp_expected = $obj->pmp_expected; @@ -1066,6 +1062,14 @@ if ($object->id > 0) { print ''; print price($pmp_valuation); print ''; + + print ''; + print ''; + print img_picto('', 'eraser', 'class="opacitymedium"'); + print ''; + print ''; + print ''; + //PMP Real print ''; @@ -1081,18 +1085,22 @@ if ($object->id > 0) { $totalExpectedValuation += $pmp_valuation; $totalRealValuation += $pmp_valuation_real; - } + } else { + print ''; + print ''; + print img_picto('', 'eraser', 'class="opacitymedium"'); + print ''; + print ''; + print ''; + } // Picto delete line print ''; print ''.img_delete().''; $qty_tmp = price2num(GETPOST("id_".$obj->rowid."_input_tmp", 'MS')) >= 0 ? GETPOST("id_".$obj->rowid."_input_tmp") : $qty_view; - print ''; + print ''; print ''; } else { - print ''; - print $obj->qty_view; // qty found - print ''; if (!empty($conf->global->INVENTORY_MANAGE_REAL_PMP)) { //PMP Expected if (! empty($obj->pmp_expected)) $pmp_expected = $obj->pmp_expected; @@ -1105,6 +1113,10 @@ if ($object->id > 0) { print price($pmp_valuation); print ''; + print ''; + print $obj->qty_view; // qty found + print ''; + //PMP Real print ''; if (! empty($obj->pmp_real)) $pmp_real = $obj->pmp_real; @@ -1119,7 +1131,11 @@ if ($object->id > 0) { $totalExpectedValuation += $pmp_valuation; $totalRealValuation += $pmp_valuation_real; - } + } else { + print ''; + print $obj->qty_view; // qty found + print ''; + } if ($obj->fk_movement > 0) { $stockmovment = new MouvementStock($db); $stockmovment->fetch($obj->fk_movement); From 701960bd70654bf643d07d5c53f829cb175e6d85 Mon Sep 17 00:00:00 2001 From: lmarcouiller Date: Thu, 28 Apr 2022 11:47:13 +0200 Subject: [PATCH 235/738] try to fix build fail --- htdocs/install/mysql/tables/llx_webhook_target_extrafields.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/install/mysql/tables/llx_webhook_target_extrafields.sql b/htdocs/install/mysql/tables/llx_webhook_target_extrafields.sql index 0af3a1fadda..a01ac0e1d1c 100644 --- a/htdocs/install/mysql/tables/llx_webhook_target_extrafields.sql +++ b/htdocs/install/mysql/tables/llx_webhook_target_extrafields.sql @@ -16,7 +16,7 @@ create table llx_webhook_target_extrafields ( rowid integer AUTO_INCREMENT PRIMARY KEY, - tms timestamp, + tms timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, fk_object integer NOT NULL, import_key varchar(14) -- import key ) ENGINE=innodb; From 75f540c30cde44d9dc1eef300f44c319e29e7205 Mon Sep 17 00:00:00 2001 From: Christophe Battarel Date: Thu, 28 Apr 2022 11:49:15 +0200 Subject: [PATCH 236/738] fix for reshook when several module use the hook but only on is concerned --- htdocs/product/class/product.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index bb411d530c7..1bacf75c7d2 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -1810,7 +1810,7 @@ class Product extends CommonObject // Note that $action and $object may have been modified by some hooks global $action; $reshook = $hookmanager->executeHooks('getSellPrice', $parameters, $this, $action); - if ( ! empty($reshook)) { + if ( ! empty($hookmanager->resArray)) { return $hookmanager->resArray; } From f0e65e8bdd259ba8aedc4cbc0d9a74e4a95833fd Mon Sep 17 00:00:00 2001 From: lainwir3d Date: Thu, 14 Apr 2022 00:37:26 +0400 Subject: [PATCH 237/738] FIX #20733 Inventory: Do not use batch qty even if present if batch module is disabled. --- htdocs/product/inventory/class/inventory.class.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/htdocs/product/inventory/class/inventory.class.php b/htdocs/product/inventory/class/inventory.class.php index bb55bc1b143..c506204d3f0 100644 --- a/htdocs/product/inventory/class/inventory.class.php +++ b/htdocs/product/inventory/class/inventory.class.php @@ -306,9 +306,14 @@ class Inventory extends CommonObject $inventoryline->fk_warehouse = $obj->fk_warehouse; $inventoryline->fk_product = $obj->fk_product; $inventoryline->batch = $obj->batch; - $inventoryline->qty_stock = ($obj->batch ? $obj->qty : $obj->reel); // If there is batch detail, we take qty for batch, else global qty $inventoryline->datec = dol_now(); + if ($conf->productbatch->enabled) { + $inventoryline->qty_stock = ($obj->batch ? $obj->qty : $obj->reel); // If there is batch detail, we take qty for batch, else global qty + }else{ + $inventoryline->qty_stock = $obj->reel; + } + $resultline = $inventoryline->create($user); if ($resultline <= 0) { $this->error = $inventoryline->error; From 6ab88d0169572afbee05f63e8c41979260a62691 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Thu, 28 Apr 2022 10:09:02 +0000 Subject: [PATCH 238/738] Fixing style errors. --- htdocs/product/inventory/class/inventory.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/inventory/class/inventory.class.php b/htdocs/product/inventory/class/inventory.class.php index c506204d3f0..f49b262bc13 100644 --- a/htdocs/product/inventory/class/inventory.class.php +++ b/htdocs/product/inventory/class/inventory.class.php @@ -310,7 +310,7 @@ class Inventory extends CommonObject if ($conf->productbatch->enabled) { $inventoryline->qty_stock = ($obj->batch ? $obj->qty : $obj->reel); // If there is batch detail, we take qty for batch, else global qty - }else{ + } else { $inventoryline->qty_stock = $obj->reel; } From 900caf5a443910fa4d3f98ff329b30115909c853 Mon Sep 17 00:00:00 2001 From: John BOTELLA Date: Thu, 28 Apr 2022 12:12:20 +0200 Subject: [PATCH 239/738] Fix missing budget export --- htdocs/core/modules/modProjet.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/modProjet.class.php b/htdocs/core/modules/modProjet.class.php index 791442dab1c..b97aad1b149 100644 --- a/htdocs/core/modules/modProjet.class.php +++ b/htdocs/core/modules/modProjet.class.php @@ -222,7 +222,7 @@ class modProjet extends DolibarrModules 's.phone'=>'Text', 's.email'=>'Text', 's.siren'=>'Text', 's.siret'=>'Text', 's.ape'=>'Text', 's.idprof4'=>'Text', 's.code_compta'=>'Text', 's.code_compta_fournisseur'=>'Text', 'p.rowid'=>"List:projet:ref::project", 'p.ref'=>"Text", 'p.title'=>"Text", 'p.usage_opportunity'=>'Boolean', 'p.usage_task'=>'Boolean', 'p.usage_bill_time'=>'Boolean', - 'p.datec'=>"Date", 'p.dateo'=>"Date", 'p.datee'=>"Date", 'p.fk_statut'=>'Status', 'cls.code'=>"Text", 'p.opp_percent'=>'Numeric', 'p.opp_amount'=>'Numeric', 'p.description'=>"Text", 'p.entity'=>'Numeric', + 'p.datec'=>"Date", 'p.dateo'=>"Date", 'p.datee'=>"Date", 'p.fk_statut'=>'Status', 'cls.code'=>"Text", 'p.opp_percent'=>'Numeric', 'p.opp_amount'=>'Numeric', 'p.description'=>"Text", 'p.entity'=>'Numeric', 'p.budget_amount'=>'Numeric', 'pt.rowid'=>'Numeric', 'pt.ref'=>'Text', 'pt.label'=>'Text', 'pt.dateo'=>"Date", 'pt.datee'=>"Date", 'pt.duration_effective'=>"Duree", 'pt.planned_workload'=>"Numeric", 'pt.progress'=>"Numeric", 'pt.description'=>"Text", 'ptt.rowid'=>'Numeric', 'ptt.task_date'=>'Date', 'ptt.task_duration'=>"Duree", 'ptt.fk_user'=>"List:user:CONCAT(lastname,' ',firstname)", 'ptt.note'=>"Text" ); @@ -235,7 +235,7 @@ class modProjet extends DolibarrModules 's.phone'=>'Phone', 's.email'=>'Email', 's.siren'=>'ProfId1', 's.siret'=>'ProfId2', 's.ape'=>'ProfId3', 's.idprof4'=>'ProfId4', 's.code_compta'=>'CustomerAccountancyCode', 's.code_compta_fournisseur'=>'SupplierAccountancyCode', 'p.rowid'=>"ProjectId", 'p.ref'=>"RefProject", 'p.title'=>'ProjectLabel', 'p.usage_opportunity'=>'ProjectFollowOpportunity', 'p.usage_task'=>'ProjectFollowTasks', 'p.usage_bill_time'=>'BillTime', - 'p.datec'=>"DateCreation", 'p.dateo'=>"DateStart", 'p.datee'=>"DateEnd", 'p.fk_statut'=>'ProjectStatus', 'cls.code'=>'OpportunityStatus', 'p.opp_percent'=>'OpportunityProbability', 'p.opp_amount'=>'OpportunityAmount', 'p.description'=>"Description" + 'p.datec'=>"DateCreation", 'p.dateo'=>"DateStart", 'p.datee'=>"DateEnd", 'p.fk_statut'=>'ProjectStatus', 'cls.code'=>'OpportunityStatus', 'p.opp_percent'=>'OpportunityProbability', 'p.opp_amount'=>'OpportunityAmount', 'p.budget_amount'=>'Budget', 'p.description'=>"Description" ); // Add multicompany field if (!empty($conf->global->MULTICOMPANY_ENTITY_IN_EXPORT_IF_SHARED)) From b35b40649f575f1d4f90c56c63b7c55125443037 Mon Sep 17 00:00:00 2001 From: lainwir3d Date: Thu, 28 Apr 2022 15:42:49 +0400 Subject: [PATCH 240/738] CLOSE #20736 Allow extrafields SQL filters on REST API product lookup --- htdocs/product/class/api_products.class.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/htdocs/product/class/api_products.class.php b/htdocs/product/class/api_products.class.php index e44aef221f6..c1a387167ec 100644 --- a/htdocs/product/class/api_products.class.php +++ b/htdocs/product/class/api_products.class.php @@ -173,9 +173,10 @@ class Products extends DolibarrApi * @param int $variant_filter Use this param to filter list (0 = all, 1=products without variants, 2=parent of variants, 3=variants only) * @param bool $pagination_data If this parameter is set to true the response will include pagination data. Default value is false. Page starts from 0 * @param int $includestockdata Load also information about stock (slower) + * @param bool $allow_extrafields_sqlfilters Allow sqlfilters to contain extrafields filter (slower). * @return array Array of product objects */ - public function index($sortfield = "t.ref", $sortorder = 'ASC', $limit = 100, $page = 0, $mode = 0, $category = 0, $sqlfilters = '', $ids_only = false, $variant_filter = 0, $pagination_data = false, $includestockdata = 0) + public function index($sortfield = "t.ref", $sortorder = 'ASC', $limit = 100, $page = 0, $mode = 0, $category = 0, $sqlfilters = '', $ids_only = false, $variant_filter = 0, $pagination_data = false, $includestockdata = 0, $allow_extrafields_sqlfilters = false) { global $db, $conf; @@ -192,6 +193,11 @@ class Products extends DolibarrApi if ($category > 0) { $sql .= ", ".$this->db->prefix()."categorie_product as c"; } + + if ($allow_extrafields_sqlfilters) { + $sql .= " LEFT JOIN llx_product_extrafields AS ef ON ef.fk_object = t.rowid"; + } + $sql .= ' WHERE t.entity IN ('.getEntity('product').')'; if ($variant_filter == 1) { From 88bd28323cfe03bccccfdda7b7b6a4e35d6e5548 Mon Sep 17 00:00:00 2001 From: lainwir3d Date: Thu, 28 Apr 2022 16:46:42 +0400 Subject: [PATCH 241/738] FIX #20738 Inventory: Add missing for movement number / card. --- htdocs/product/inventory/inventory.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/product/inventory/inventory.php b/htdocs/product/inventory/inventory.php index 204c6539c29..dde5248a528 100644 --- a/htdocs/product/inventory/inventory.php +++ b/htdocs/product/inventory/inventory.php @@ -1120,6 +1120,7 @@ if ($object->id > 0) { $totalExpectedValuation += $pmp_valuation; $totalRealValuation += $pmp_valuation_real; } + print ''; if ($obj->fk_movement > 0) { $stockmovment = new MouvementStock($db); $stockmovment->fetch($obj->fk_movement); From 68864840b64e25131fe513201dc8e509e03b5410 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Thu, 28 Apr 2022 13:25:50 +0000 Subject: [PATCH 242/738] Fixing style errors. --- htdocs/accountancy/class/lettering.class.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/accountancy/class/lettering.class.php b/htdocs/accountancy/class/lettering.class.php index a31a4675851..39c56d5e3d8 100644 --- a/htdocs/accountancy/class/lettering.class.php +++ b/htdocs/accountancy/class/lettering.class.php @@ -440,7 +440,7 @@ class Lettering extends BookKeeping $group_error++; break; } - if (!isset($lettering_code)) $lettering_code = (string)$line_infos['lettering_code']; + if (!isset($lettering_code)) $lettering_code = (string) $line_infos['lettering_code']; if (!empty($line_infos['lettering_code'])) $do_it = true; } elseif (!empty($line_infos['lettering_code'])) $do_it = false; } @@ -518,8 +518,8 @@ class Lettering extends BookKeeping " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping AS ab" . " LEFT JOIN " . MAIN_DB_PREFIX . "bank_url AS bu ON bu.fk_bank = ab.fk_doc" . " WHERE ab.doc_type = 'bank'" . - // " AND ab.subledger_account != ''" . - // " AND ab.numero_compte = '" . $this->db->escape($account_number) . "'" . + // " AND ab.subledger_account != ''" . + // " AND ab.numero_compte = '" . $this->db->escape($account_number) . "'" . " AND bu.type = '" . $this->db->escape($bank_url_type) . "'"; if (!empty($bookkeeping_ids)) $sql .= " AND ab.rowid IN (" . $this->db->sanitize(implode(',', $bookkeeping_ids)) . ")"; @@ -540,8 +540,8 @@ class Lettering extends BookKeeping " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping AS ab" . " LEFT JOIN " . MAIN_DB_PREFIX . "$payment_element AS pe ON pe.$fk_element = ab.fk_doc" . " WHERE ab.doc_type = '" . $this->db->escape($doc_type) . "'" . - // " AND ab.subledger_account != ''" . - // " AND ab.numero_compte = '" . $this->db->escape($account_number) . "'" . + // " AND ab.subledger_account != ''" . + // " AND ab.numero_compte = '" . $this->db->escape($account_number) . "'" . " AND pe.$fk_payment_element IS NOT NULL"; if (!empty($bookkeeping_ids)) $sql .= " AND ab.rowid IN (" . $this->db->sanitize(implode(',', $bookkeeping_ids)) . ")"; @@ -726,7 +726,7 @@ class Lettering extends BookKeeping $grouped_payments[] = $current_group; $current_group = array(); } - } while(!empty($payment_by_element) && $element_id == 0); + } while (!empty($payment_by_element) && $element_id == 0); if ($element_id == 0) { // Restore list when is the begin of recursive function From 5379db7c6bbfeb25259c5d173183da5de0354348 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Thu, 28 Apr 2022 15:49:08 +0200 Subject: [PATCH 243/738] Fix stickler-ci --- htdocs/accountancy/class/lettering.class.php | 98 ++++++++++---------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/htdocs/accountancy/class/lettering.class.php b/htdocs/accountancy/class/lettering.class.php index a31a4675851..1532768826d 100644 --- a/htdocs/accountancy/class/lettering.class.php +++ b/htdocs/accountancy/class/lettering.class.php @@ -249,22 +249,22 @@ class Lettering extends BookKeeping $error = 0; $lettre = 'AAA'; - $sql = "SELECT DISTINCT ab2.lettering_code" . - " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping As ab" . - " LEFT JOIN " . MAIN_DB_PREFIX . "bank_url AS bu ON bu.fk_bank = ab.fk_doc" . - " LEFT JOIN " . MAIN_DB_PREFIX . "bank_url AS bu2 ON bu2.url_id = bu.url_id" . - " LEFT JOIN " . MAIN_DB_PREFIX . "accounting_bookkeeping AS ab2 ON ab2.fk_doc = bu2.fk_bank" . - " WHERE ab.rowid IN (" . $this->db->sanitize(implode(',', $ids)) . ")" . - " AND ab.doc_type = 'bank'" . - " AND ab2.doc_type = 'bank'" . - " AND bu.type = 'company'" . - " AND bu2.type = 'company'" . - " AND ab.subledger_account != ''" . - " AND ab2.subledger_account != ''" . - " AND ab.lettering_code IS NULL" . - " AND ab2.lettering_code != ''" . - " ORDER BY ab2.lettering_code DESC" . - " LIMIT 1 "; + $sql = "SELECT DISTINCT ab2.lettering_code"; + $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping As ab"; + $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "bank_url AS bu ON bu.fk_bank = ab.fk_doc"; + $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "bank_url AS bu2 ON bu2.url_id = bu.url_id"; + $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "accounting_bookkeeping AS ab2 ON ab2.fk_doc = bu2.fk_bank"; + $sql .= " WHERE ab.rowid IN (" . $this->db->sanitize(implode(',', $ids)) . ")"; + $sql .= " AND ab.doc_type = 'bank'"; + $sql .= " AND ab2.doc_type = 'bank'"; + $sql .= " AND bu.type = 'company'"; + $sql .= " AND bu2.type = 'company'"; + $sql .= " AND ab.subledger_account != ''"; + $sql .= " AND ab2.subledger_account != ''"; + $sql .= " AND ab.lettering_code IS NULL"; + $sql .= " AND ab2.lettering_code != ''"; + $sql .= " ORDER BY ab2.lettering_code DESC"; + $sql .= " LIMIT 1 "; $result = $this->db->query($sql); if ($result) { @@ -514,13 +514,13 @@ class Lettering extends BookKeeping $payment_ids = array(); // Get all payment id from bank lines - $sql = "SELECT DISTINCT bu.url_id AS payment_id" . - " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping AS ab" . - " LEFT JOIN " . MAIN_DB_PREFIX . "bank_url AS bu ON bu.fk_bank = ab.fk_doc" . - " WHERE ab.doc_type = 'bank'" . - // " AND ab.subledger_account != ''" . - // " AND ab.numero_compte = '" . $this->db->escape($account_number) . "'" . - " AND bu.type = '" . $this->db->escape($bank_url_type) . "'"; + $sql = "SELECT DISTINCT bu.url_id AS payment_id"; + $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping AS ab"; + $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "bank_url AS bu ON bu.fk_bank = ab.fk_doc"; + $sql .= " WHERE ab.doc_type = 'bank'"; + // $sql .= " AND ab.subledger_account != ''"; + // $sql .= " AND ab.numero_compte = '" . $this->db->escape($account_number) . "'"; + $sql .= " AND bu.type = '" . $this->db->escape($bank_url_type) . "'"; if (!empty($bookkeeping_ids)) $sql .= " AND ab.rowid IN (" . $this->db->sanitize(implode(',', $bookkeeping_ids)) . ")"; dol_syslog(__METHOD__ . " - Get all payment id from bank lines", LOG_DEBUG); @@ -536,13 +536,13 @@ class Lettering extends BookKeeping $this->db->free($resql); // Get all payment id from payment lines - $sql = "SELECT DISTINCT pe.$fk_payment_element AS payment_id" . - " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping AS ab" . - " LEFT JOIN " . MAIN_DB_PREFIX . "$payment_element AS pe ON pe.$fk_element = ab.fk_doc" . - " WHERE ab.doc_type = '" . $this->db->escape($doc_type) . "'" . - // " AND ab.subledger_account != ''" . - // " AND ab.numero_compte = '" . $this->db->escape($account_number) . "'" . - " AND pe.$fk_payment_element IS NOT NULL"; + $sql = "SELECT DISTINCT pe.$fk_payment_element AS payment_id"; + $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping AS ab"; + $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "$payment_element AS pe ON pe.$fk_element = ab.fk_doc"; + $sql .= " WHERE ab.doc_type = '" . $this->db->escape($doc_type) . "'"; + // $sql .= " AND ab.subledger_account != ''"; + // $sql .= " AND ab.numero_compte = '" . $this->db->escape($account_number) . "'"; + $sql .= " AND pe.$fk_payment_element IS NOT NULL"; if (!empty($bookkeeping_ids)) $sql .= " AND ab.rowid IN (" . $this->db->sanitize(implode(',', $bookkeeping_ids)) . ")"; dol_syslog(__METHOD__ . " - Get all payment id from bank lines", LOG_DEBUG); @@ -569,14 +569,14 @@ class Lettering extends BookKeeping $lines = array(); // Get bank lines - $sql = "SELECT DISTINCT ab.rowid, ab.piece_num, ab.lettering_code, ab.debit, ab.credit" . - " FROM " . MAIN_DB_PREFIX . "bank_url AS bu" . - " LEFT JOIN " . MAIN_DB_PREFIX . "accounting_bookkeeping AS ab ON ab.fk_doc = bu.fk_bank" . - " WHERE bu.url_id IN (" . $this->db->sanitize(implode(',', $payment_list)) . ")" . - " AND bu.type = '" . $this->db->escape($bank_url_type) . "'" . - " AND ab.doc_type = 'bank'" . - " AND ab.subledger_account != ''" . - " AND ab.numero_compte = '" . $this->db->escape($account_number) . "'"; + $sql = "SELECT DISTINCT ab.rowid, ab.piece_num, ab.lettering_code, ab.debit, ab.credit"; + $sql .= " FROM " . MAIN_DB_PREFIX . "bank_url AS bu"; + $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "accounting_bookkeeping AS ab ON ab.fk_doc = bu.fk_bank"; + $sql .= " WHERE bu.url_id IN (" . $this->db->sanitize(implode(',', $payment_list)) . ")"; + $sql .= " AND bu.type = '" . $this->db->escape($bank_url_type) . "'"; + $sql .= " AND ab.doc_type = 'bank'"; + $sql .= " AND ab.subledger_account != ''"; + $sql .= " AND ab.numero_compte = '" . $this->db->escape($account_number) . "'"; dol_syslog(__METHOD__ . " - Get bank lines", LOG_DEBUG); $resql = $this->db->query($sql); @@ -591,13 +591,13 @@ class Lettering extends BookKeeping $this->db->free($resql); // Get payment lines - $sql = "SELECT DISTINCT ab.rowid, ab.piece_num, ab.lettering_code, ab.debit, ab.credit" . - " FROM " . MAIN_DB_PREFIX . "$payment_element AS pe" . - " LEFT JOIN " . MAIN_DB_PREFIX . "accounting_bookkeeping AS ab ON ab.fk_doc = pe.$fk_element" . - " WHERE pe.$fk_payment_element IN (" . $this->db->sanitize(implode(',', $payment_list)) . ")" . - " AND ab.doc_type = '" . $this->db->escape($doc_type) . "'" . - " AND ab.subledger_account != ''" . - " AND ab.numero_compte = '" . $this->db->escape($account_number) . "'"; + $sql = "SELECT DISTINCT ab.rowid, ab.piece_num, ab.lettering_code, ab.debit, ab.credit"; + $sql .= " FROM " . MAIN_DB_PREFIX . "$payment_element AS pe"; + $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "accounting_bookkeeping AS ab ON ab.fk_doc = pe.$fk_element"; + $sql .= " WHERE pe.$fk_payment_element IN (" . $this->db->sanitize(implode(',', $payment_list)) . ")"; + $sql .= " AND ab.doc_type = '" . $this->db->escape($doc_type) . "'"; + $sql .= " AND ab.subledger_account != ''"; + $sql .= " AND ab.numero_compte = '" . $this->db->escape($account_number) . "'"; dol_syslog(__METHOD__ . " - Get payment lines", LOG_DEBUG); $resql = $this->db->query($sql); @@ -646,10 +646,10 @@ class Lettering extends BookKeeping } // Get payment lines - $sql = "SELECT DISTINCT pe2.$fk_payment_element, pe2.$fk_element" . - " FROM " . MAIN_DB_PREFIX . "$payment_element AS pe" . - " LEFT JOIN " . MAIN_DB_PREFIX . "$payment_element AS pe2 ON pe2.$fk_element = pe.$fk_element" . - " WHERE pe.$fk_payment_element IN (" . $this->db->sanitize(implode(',', $payment_ids)) . ")"; + $sql = "SELECT DISTINCT pe2.$fk_payment_element, pe2.$fk_element"; + $sql .= " FROM " . MAIN_DB_PREFIX . "$payment_element AS pe"; + $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "$payment_element AS pe2 ON pe2.$fk_element = pe.$fk_element"; + $sql .= " WHERE pe.$fk_payment_element IN (" . $this->db->sanitize(implode(',', $payment_ids)) . ")"; dol_syslog(__METHOD__ . " - Get payment lines", LOG_DEBUG); $resql = $this->db->query($sql); From 5fe448e86cb455bbe629a72e15b63c0a00d9a63a Mon Sep 17 00:00:00 2001 From: Adrien Raze Date: Thu, 28 Apr 2022 15:49:31 +0200 Subject: [PATCH 244/738] FIX : [inventory] Update PMP when qty stay the same --- htdocs/product/inventory/inventory.php | 39 +++++++++++++------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/htdocs/product/inventory/inventory.php b/htdocs/product/inventory/inventory.php index f7691193e24..48f9c83513f 100644 --- a/htdocs/product/inventory/inventory.php +++ b/htdocs/product/inventory/inventory.php @@ -186,25 +186,6 @@ if (empty($reshook)) { break; } - if (!empty($line->pmp_real) && !empty($conf->global->INVENTORY_MANAGE_REAL_PMP)) { - $sqlpmp = 'UPDATE '.MAIN_DB_PREFIX.'product SET pmp = '.((float) $line->pmp_real).' WHERE rowid = '.((int) $line->fk_product); - $resqlpmp = $db->query($sqlpmp); - if (! $resqlpmp) { - $error++; - setEventMessages($db->lasterror(), null, 'errors'); - break; - } - if (!empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED)) { - $sqlpmp = 'UPDATE '.MAIN_DB_PREFIX.'product_perentity SET pmp = '.((float) $line->pmp_real).' WHERE fk_product = '.((int) $line->fk_product).' AND entity='.$conf->entity; - $resqlpmp = $db->query($sqlpmp); - if (! $resqlpmp) { - $error++; - setEventMessages($db->lasterror(), null, 'errors'); - break; - } - } - } - // Update line with id of stock movement (and the start quantity if it has changed this last recording) $sqlupdate = "UPDATE ".MAIN_DB_PREFIX."inventorydet"; $sqlupdate .= " SET fk_movement = ".((int) $idstockmove); @@ -219,6 +200,26 @@ if (empty($reshook)) { break; } } + + if (!empty($line->pmp_real) && !empty($conf->global->INVENTORY_MANAGE_REAL_PMP)) { + $sqlpmp = 'UPDATE '.MAIN_DB_PREFIX.'product SET pmp = '.((float) $line->pmp_real).' WHERE rowid = '.((int) $line->fk_product); + $resqlpmp = $db->query($sqlpmp); + if (! $resqlpmp) { + $error++; + setEventMessages($db->lasterror(), null, 'errors'); + break; + } + if (!empty($conf->global->MAIN_PRODUCT_PERENTITY_SHARED)) { + $sqlpmp = 'UPDATE '.MAIN_DB_PREFIX.'product_perentity SET pmp = '.((float) $line->pmp_real).' WHERE fk_product = '.((int) $line->fk_product).' AND entity='.$conf->entity; + $resqlpmp = $db->query($sqlpmp); + if (! $resqlpmp) { + $error++; + setEventMessages($db->lasterror(), null, 'errors'); + break; + } + } + } + } $i++; } From 96e247bf8935caa8e4b841bccb40ac1bad3f53be Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Thu, 28 Apr 2022 13:55:54 +0000 Subject: [PATCH 245/738] Fixing style errors. --- htdocs/accountancy/class/lettering.class.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/accountancy/class/lettering.class.php b/htdocs/accountancy/class/lettering.class.php index 2c2c07e7944..a32df04e79a 100644 --- a/htdocs/accountancy/class/lettering.class.php +++ b/htdocs/accountancy/class/lettering.class.php @@ -518,8 +518,8 @@ class Lettering extends BookKeeping $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping AS ab"; $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "bank_url AS bu ON bu.fk_bank = ab.fk_doc"; $sql .= " WHERE ab.doc_type = 'bank'"; - // $sql .= " AND ab.subledger_account != ''"; - // $sql .= " AND ab.numero_compte = '" . $this->db->escape($account_number) . "'"; + // $sql .= " AND ab.subledger_account != ''"; + // $sql .= " AND ab.numero_compte = '" . $this->db->escape($account_number) . "'"; $sql .= " AND bu.type = '" . $this->db->escape($bank_url_type) . "'"; if (!empty($bookkeeping_ids)) $sql .= " AND ab.rowid IN (" . $this->db->sanitize(implode(',', $bookkeeping_ids)) . ")"; @@ -540,8 +540,8 @@ class Lettering extends BookKeeping $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping AS ab"; $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "$payment_element AS pe ON pe.$fk_element = ab.fk_doc"; $sql .= " WHERE ab.doc_type = '" . $this->db->escape($doc_type) . "'"; - // $sql .= " AND ab.subledger_account != ''"; - // $sql .= " AND ab.numero_compte = '" . $this->db->escape($account_number) . "'"; + // $sql .= " AND ab.subledger_account != ''"; + // $sql .= " AND ab.numero_compte = '" . $this->db->escape($account_number) . "'"; $sql .= " AND pe.$fk_payment_element IS NOT NULL"; if (!empty($bookkeeping_ids)) $sql .= " AND ab.rowid IN (" . $this->db->sanitize(implode(',', $bookkeeping_ids)) . ")"; From f2d81f97b9687796b342c295cc4a38a2add6662a Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Thu, 28 Apr 2022 17:10:30 +0200 Subject: [PATCH 246/738] Comment function --- htdocs/accountancy/class/lettering.class.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/htdocs/accountancy/class/lettering.class.php b/htdocs/accountancy/class/lettering.class.php index a32df04e79a..58443cfec8d 100644 --- a/htdocs/accountancy/class/lettering.class.php +++ b/htdocs/accountancy/class/lettering.class.php @@ -619,6 +619,13 @@ class Lettering extends BookKeeping return $groups; } + /** + * Linked payment by group + * + * @param array $payment_ids list of payment id + * @param string $type Type of bookkeeping type to lettering ('customer_invoice' or 'supplier_invoice') + * @return array|int <0 if error otherwise all linked lines by block + */ public function getLinkedPaymentByGroup($payment_ids, $type) { global $langs; From 7752c5f1221316575b691a529ff049512aa5cb1c Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Thu, 28 Apr 2022 17:24:10 +0200 Subject: [PATCH 247/738] Comment function --- htdocs/accountancy/class/lettering.class.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/accountancy/class/lettering.class.php b/htdocs/accountancy/class/lettering.class.php index 58443cfec8d..a2718973185 100644 --- a/htdocs/accountancy/class/lettering.class.php +++ b/htdocs/accountancy/class/lettering.class.php @@ -685,10 +685,10 @@ class Lettering extends BookKeeping /** * Get payment ids grouped by payment id and element id in common * - * @param array &$payment_by_element List of payment ids by element id - * @param array &$element_by_payment List of element ids by payment id + * @param array $payment_by_element List of payment ids by element id + * @param array $element_by_payment List of element ids by payment id * @param int $element_id Element Id (used for recursive function) - * @param array &$current_group Current group (used for recursive function) + * @param array $current_group Current group (used for recursive function) * @return array List of payment ids grouped by payment id and element id in common */ public function getGroupElements(&$payment_by_element, &$element_by_payment, $element_id = 0, &$current_group = array()) From ebe68350d1d2770b0500560fdeda5fe00639745f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 28 Apr 2022 17:34:04 +0200 Subject: [PATCH 248/738] IP for last and previous login is now saved inuser table --- htdocs/user/class/user.class.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index f01820f93e9..8c61af9ccbb 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -275,6 +275,8 @@ class User extends CommonObject public $datelastlogin; public $datepreviouslogin; + public $iplastlogin; + public $ippreviouslogin; public $datestartvalidity; public $dateendvalidity; @@ -2111,9 +2113,13 @@ class User extends CommonObject // phpcs:enable $now = dol_now(); + $userremoteip = getUserRemoteIP(); + $sql = "UPDATE ".$this->db->prefix()."user SET"; $sql .= " datepreviouslogin = datelastlogin,"; + $sql .= " ippreviouslogin = iplastlogin,"; $sql .= " datelastlogin = '".$this->db->idate($now)."',"; + $sql .= " iplastlogin = '".$this->db->escape($userremoteip)."',"; $sql .= " tms = tms"; // La date de derniere modif doit changer sauf pour la mise a jour de date de derniere connexion $sql .= " WHERE rowid = ".((int) $this->id); @@ -2122,6 +2128,8 @@ class User extends CommonObject if ($resql) { $this->datepreviouslogin = $this->datelastlogin; $this->datelastlogin = $now; + $this->ippreviouslogin = $this->iplastlogin; + $this->iplastlogin = $userremoteip; return 1; } else { $this->error = $this->db->lasterror().' sql='.$sql; @@ -3116,7 +3124,9 @@ class User extends CommonObject $this->datem = $now; $this->datelastlogin = $now; + $this->iplastlogin = '127.0.0.1'; $this->datepreviouslogin = $now; + $this->ippreviouslogin = '127.0.0.1'; $this->statut = 1; $this->entity = 1; From 93815404a27d5d474c578c97e496efdcfc8eb863 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 28 Apr 2022 18:46:52 +0200 Subject: [PATCH 249/738] Fix phpcs --- htdocs/compta/localtax/card.php | 4 ++-- htdocs/compta/paiement_vat.php | 2 +- htdocs/compta/tva/card.php | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/compta/localtax/card.php b/htdocs/compta/localtax/card.php index 45cb1f03bb8..9bd37eafa36 100644 --- a/htdocs/compta/localtax/card.php +++ b/htdocs/compta/localtax/card.php @@ -177,10 +177,10 @@ if ($action == 'create') { if (!empty($conf->banque->enabled)) { // Type payment print ''.$langs->trans("PaymentMode").''; - $form->select_types_paiements(GETPOST("paiementtype"), "paiementtype", '', 0, 1, 0, 0, 1,'maxwidth500 widthcentpercentminusx'); + $form->select_types_paiements(GETPOST("paiementtype"), "paiementtype", '', 0, 1, 0, 0, 1, 'maxwidth500 widthcentpercentminusx'); print "\n"; print ""; - + // Bank account print ''.$langs->trans("Account").''; print img_picto('', 'bank_account', 'pictofixedwidth'); diff --git a/htdocs/compta/paiement_vat.php b/htdocs/compta/paiement_vat.php index 2f7b775096d..28bc838c296 100644 --- a/htdocs/compta/paiement_vat.php +++ b/htdocs/compta/paiement_vat.php @@ -207,7 +207,7 @@ if ($action == 'create') { print ''; print ''.$langs->trans("PaymentMode").''; - $form->select_types_paiements(GETPOSTISSET("paiementtype") ? GETPOST("paiementtype", "int") : $tva->paiementtype, "paiementtype", '', 0, 1, 0, 0, 1,'maxwidth500 widthcentpercentminusx'); + $form->select_types_paiements(GETPOSTISSET("paiementtype") ? GETPOST("paiementtype", "int") : $tva->paiementtype, "paiementtype", '', 0, 1, 0, 0, 1, 'maxwidth500 widthcentpercentminusx'); print "\n"; print ''; diff --git a/htdocs/compta/tva/card.php b/htdocs/compta/tva/card.php index 3ffb405f8ad..3a34d71c11d 100644 --- a/htdocs/compta/tva/card.php +++ b/htdocs/compta/tva/card.php @@ -490,7 +490,7 @@ if ($action == 'create') { // Type payment print ''.$langs->trans("PaymentMode").''; - $form->select_types_paiements(GETPOST("type_payment", 'int'), "type_payment", '', 0, 1, 0, 0, 1,'maxwidth500 widthcentpercentminusx'); + $form->select_types_paiements(GETPOST("type_payment", 'int'), "type_payment", '', 0, 1, 0, 0, 1, 'maxwidth500 widthcentpercentminusx'); print "\n"; print ""; From 559694dd4fa70a874f9851c8ef7b79fa517ad6ce Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 28 Apr 2022 19:05:23 +0200 Subject: [PATCH 250/738] API doc --- htdocs/compta/facture/class/api_invoices.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/facture/class/api_invoices.class.php b/htdocs/compta/facture/class/api_invoices.class.php index 551edb05731..3623a36cbb9 100644 --- a/htdocs/compta/facture/class/api_invoices.class.php +++ b/htdocs/compta/facture/class/api_invoices.class.php @@ -1724,8 +1724,8 @@ class Invoices extends DolibarrApi * * Return an array with invoice informations * - * @param int $id ID of template invoice - * @param int $contact_list 0:Return array contains all properties, 1:Return array contains just id, 1: Return array contains just id, -1: Do not return contacts/adddesses + * @param int $id ID of template invoice + * @param int $contact_list 0:Return array contains all properties, 1:Return array contains just id, -1: Do not return contacts/adddesses * @return array|mixed data without useless information * * @url GET templates/{id} From 3b98f74a56bfbb829050284e5c1e93b0ab0ed21b Mon Sep 17 00:00:00 2001 From: lainwir3d Date: Thu, 28 Apr 2022 22:56:44 +0400 Subject: [PATCH 251/738] Fix typo and switch to old join style. --- htdocs/product/class/api_products.class.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/htdocs/product/class/api_products.class.php b/htdocs/product/class/api_products.class.php index c1a387167ec..262d83a0afc 100644 --- a/htdocs/product/class/api_products.class.php +++ b/htdocs/product/class/api_products.class.php @@ -195,7 +195,7 @@ class Products extends DolibarrApi } if ($allow_extrafields_sqlfilters) { - $sql .= " LEFT JOIN llx_product_extrafields AS ef ON ef.fk_object = t.rowid"; + $sql .= ", ".MAIN_DB_PREFIX."product_extrafields AS ef"; } $sql .= ' WHERE t.entity IN ('.getEntity('product').')'; @@ -223,6 +223,11 @@ class Products extends DolibarrApi // Show only services $sql .= " AND t.fk_product_type = 1"; } + + if ($allow_extrafields_sqlfilters) { + $sql .= " AND ef.fk_object = t.rowid"; + } + // Add sql filters if ($sqlfilters) { $errormessage = ''; From a129b6d13260cc0c8ac77fa0fc4d9ce2e5183a57 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 28 Apr 2022 22:29:48 +0200 Subject: [PATCH 252/738] FIX phpcs --- htdocs/core/class/rssparser.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/rssparser.class.php b/htdocs/core/class/rssparser.class.php index 2048a80bae6..93224b9f04d 100644 --- a/htdocs/core/class/rssparser.class.php +++ b/htdocs/core/class/rssparser.class.php @@ -230,7 +230,7 @@ class RssParser if (!empty($result['content'])) { $str = $result['content']; - } elseif (!empty($result['curl_error_msg'])){ + } elseif (!empty($result['curl_error_msg'])) { $this->error = 'Error retrieving URL '.$this->_urlRSS.' - '.$result['curl_error_msg']; return -1; } From 822a0a37f3aaf7e649233ef20249311174c5a1f0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 28 Apr 2022 22:28:32 +0200 Subject: [PATCH 253/738] Fix phpunit --- htdocs/langs/en_US/admin.lang | 2 +- htdocs/user/class/user.class.php | 4 ++++ test/phpunit/UserTest.php | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 0009cd00bcf..970426eb488 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -2143,7 +2143,7 @@ DeleteEmailCollector=Delete email collector ConfirmDeleteEmailCollector=Are you sure you want to delete this email collector? RecipientEmailsWillBeReplacedWithThisValue=Recipient emails will be always replaced with this value AtLeastOneDefaultBankAccountMandatory=At least 1 default bank account must be defined -RESTRICT_ON_IP=Allow access to some host IP only (wildcard not allowed, use space between values). Empty means every hosts can access. +RESTRICT_ON_IP=Allow API access to only certain client IPs (wildcard not allowed, use space between values). Empty means every clients can access. IPListExample=127.0.0.1 192.168.0.2 [::1] BaseOnSabeDavVersion=Based on the library SabreDAV version NotAPublicIp=Not a public IP diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 8c61af9ccbb..6f10ada3267 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -437,6 +437,8 @@ class User extends CommonObject $sql .= " u.tms as datem,"; $sql .= " u.datelastlogin as datel,"; $sql .= " u.datepreviouslogin as datep,"; + $sql .= " u.iplastlogin,"; + $sql .= " u.ippreviouslogin,"; $sql .= " u.datelastpassvalidation,"; $sql .= " u.datestartvalidity,"; $sql .= " u.dateendvalidity,"; @@ -564,6 +566,8 @@ class User extends CommonObject $this->datem = $this->db->jdate($obj->datem); $this->datelastlogin = $this->db->jdate($obj->datel); $this->datepreviouslogin = $this->db->jdate($obj->datep); + $this->iplastlogin = $obj->iplastlogin; + $this->ippreviouslogin = $obj->ippreviouslogin; $this->datestartvalidity = $this->db->jdate($obj->datestartvalidity); $this->dateendvalidity = $this->db->jdate($obj->dateendvalidity); diff --git a/test/phpunit/UserTest.php b/test/phpunit/UserTest.php index 699e9fd89f0..c6ccc3b01a0 100644 --- a/test/phpunit/UserTest.php +++ b/test/phpunit/UserTest.php @@ -204,7 +204,7 @@ class UserTest extends PHPUnit\Framework\TestCase $newlocalobject=new User($this->savdb); $newlocalobject->initAsSpecimen(); $this->changeProperties($newlocalobject); - $this->assertEquals($this->objCompare($localobject, $newlocalobject, true, array('id','socid','societe_id','specimen','note','ref','pass','pass_indatabase','pass_indatabase_crypted','pass_temp','datec','datem','datelastlogin','datepreviouslogin','trackid')), array()); // Actual, Expected + $this->assertEquals($this->objCompare($localobject, $newlocalobject, true, array('id','socid','societe_id','specimen','note','ref','pass','pass_indatabase','pass_indatabase_crypted','pass_temp','datec','datem','datelastlogin','datepreviouslogin','iplastlogin','ippreviouslogin','trackid')), array()); // Actual, Expected return $localobject; } From accb900d4f54fbf4f4b9fa2be89bfae4ee94be7d Mon Sep 17 00:00:00 2001 From: Christophe Battarel Date: Fri, 29 Apr 2022 09:45:36 +0200 Subject: [PATCH 254/738] ajax load only one page of search results --- htdocs/takepos/ajax/ajax.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/htdocs/takepos/ajax/ajax.php b/htdocs/takepos/ajax/ajax.php index a3bcc04b5c8..5e0b329676a 100644 --- a/htdocs/takepos/ajax/ajax.php +++ b/htdocs/takepos/ajax/ajax.php @@ -48,6 +48,8 @@ $category = GETPOST('category', 'alphanohtml'); // Can be id of category or 'sup $action = GETPOST('action', 'aZ09'); $term = GETPOST('term', 'alpha'); $id = GETPOST('id', 'int'); +$search_start = GETPOST('search_start', 'int'); +$search_limit = GETPOST('search_limit', 'int'); if (empty($user->rights->takepos->run)) { accessforbidden(); @@ -232,6 +234,9 @@ if ($action == 'getProducts') { $reshook=$hookmanager->executeHooks('printFieldListWhere', $parameters); // Note that $action and $object may have been modified by hook $sql .= $hookmanager->resPrint; + // load only one page of products + $sql.= ' LIMIT '. $search_start . ',' . $search_limit; + $resql = $db->query($sql); if ($resql) { $rows = array(); From 78f46bb98b13978e27e24811007158eb4ae0ee0e Mon Sep 17 00:00:00 2001 From: Christophe Battarel Date: Fri, 29 Apr 2022 09:49:10 +0200 Subject: [PATCH 255/738] search next or previous page of products if asked --- htdocs/takepos/index.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/htdocs/takepos/index.php b/htdocs/takepos/index.php index b23907b64f1..eab5b12c3c1 100644 --- a/htdocs/takepos/index.php +++ b/htdocs/takepos/index.php @@ -372,6 +372,9 @@ function LoadProducts(position, issubcat) { function MoreProducts(moreorless) { console.log("MoreProducts"); + + if ($('#search_pagination').val() != '') return Search2('', moreorless); + var maxproduct = ; if (moreorless=="more"){ From fb076a92828e33bc3ec084650bf8157837061f92 Mon Sep 17 00:00:00 2001 From: Christophe Battarel Date: Fri, 29 Apr 2022 10:00:25 +0200 Subject: [PATCH 256/738] FIX pagination on search results --- htdocs/takepos/index.php | 49 ++++++++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 9 deletions(-) diff --git a/htdocs/takepos/index.php b/htdocs/takepos/index.php index eab5b12c3c1..d934765b846 100644 --- a/htdocs/takepos/index.php +++ b/htdocs/takepos/index.php @@ -559,12 +559,20 @@ function New() { * @param {int} keyCodeForEnter Key code for "enter" * return {void} */ -function Search2(keyCodeForEnter) { +function Search2(keyCodeForEnter, moreorless) { console.log("Search2 Call ajax search to replace products keyCodeForEnter="+keyCodeForEnter); + var search_term = $('#search').val(); + var search_start = 0; + var search_limit = ; + if (moreorless != null) { + search_term = $('#search_pagination').val(); + search_start = $('#search_start_'+moreorless).val(); + } + var search = false; var eventKeyCode = window.event.keyCode; - if (typeof keyCodeForEnter === 'undefined' || eventKeyCode == keyCodeForEnter) { + if (keyCodeForEnter == '' || eventKeyCode == keyCodeForEnter) { search = true; } @@ -579,7 +587,8 @@ function Search2(keyCodeForEnter) { pageproducts = 0; jQuery(".wrapper2 .catwatermark").hide(); - $.getJSON('/takepos/ajax/ajax.php?action=search&term=' + $('#search').val(), function (data) { + var nbsearchresults = 0; + $.getJSON('/takepos/ajax/ajax.php?action=search&term=' + search_term + '&search_start=' + search_start + '&search_limit=' + search_limit, function (data) { for (i = 0; i < ; i++) { if (typeof (data[i]) == "undefined") { $("#prodesc" + i).text(""); @@ -618,6 +627,7 @@ function Search2(keyCodeForEnter) { } $("#prodiv" + i).data("rowid", data[i]['rowid']); $("#prodiv" + i).data("iscat", 0); + nbsearchresults++; } }).always(function (data) { // If there is only 1 answer @@ -642,6 +652,24 @@ function Search2(keyCodeForEnter) { } else ClearSearch(); } + // memorize search_term and start for pagination + $("#search_pagination").val($("#search").val()); + if (search_start == 0) { + $("#prodiv span").hide(); + } + else { + $("#prodiv span").show(); + var search_start_less = Math.max(0, parseInt(search_start) - parseInt()); + $("#search_start_less").val(search_start_less); + } + if (nbsearchresults != ) { + $("#prodiv span").hide(); + } + else { + $("#prodiv span").show(); + var search_start_more = parseInt(search_start) + parseInt(); + $("#search_start_more").val(search_start_more); + } }); }, 500); // 500ms delay } @@ -918,7 +946,7 @@ if (empty($conf->global->TAKEPOS_HIDE_HEAD_BAR)) {
From a11b5b43998501dec9f1da1332bdba6f209590a5 Mon Sep 17 00:00:00 2001 From: Christophe Battarel Date: Fri, 29 Apr 2022 10:12:53 +0200 Subject: [PATCH 257/738] escape sql string for my Travais friend --- htdocs/takepos/ajax/ajax.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/takepos/ajax/ajax.php b/htdocs/takepos/ajax/ajax.php index 5e0b329676a..e15963efb9a 100644 --- a/htdocs/takepos/ajax/ajax.php +++ b/htdocs/takepos/ajax/ajax.php @@ -235,7 +235,7 @@ if ($action == 'getProducts') { $sql .= $hookmanager->resPrint; // load only one page of products - $sql.= ' LIMIT '. $search_start . ',' . $search_limit; + $sql.= ' LIMIT '. $db->escape($search_start) . ',' . $db->escape($search_limit); $resql = $db->query($sql); if ($resql) { From 6d79d03cb2a275d4b41845752030e6be261ec9d0 Mon Sep 17 00:00:00 2001 From: melina Date: Fri, 29 Apr 2022 10:43:35 +0200 Subject: [PATCH 258/738] add comment to fix stickler --- htdocs/takepos/ajax/ajax.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/takepos/ajax/ajax.php b/htdocs/takepos/ajax/ajax.php index 3ec334bd703..3af186813e2 100644 --- a/htdocs/takepos/ajax/ajax.php +++ b/htdocs/takepos/ajax/ajax.php @@ -54,7 +54,7 @@ if (empty($user->rights->takepos->run)) { } // Initialize technical object to manage hooks. Note that conf->hooks_modules contains array of hooks -$hookmanager->initHooks(array('takeposproductsearch')); +$hookmanager->initHooks(array('takeposproductsearch')); // new context for product search hooks /* * View From 726b899d30e4defe41113f79d765287254e19554 Mon Sep 17 00:00:00 2001 From: Quentin-Seekness <72733832+Quentin-Seekness@users.noreply.github.com> Date: Fri, 29 Apr 2022 10:45:08 +0200 Subject: [PATCH 259/738] FIX: Delete an extrafield where type is double Found the bug on a propal's extrafield, it was impossible to delete a decimal extrafield. In updateExtraField() the $value stayed "" where it needed to be null. The same issue can be found in insertExtraFields(). --- htdocs/core/class/commonobject.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 272d66e4855..aa88aeb825a 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -5999,7 +5999,7 @@ abstract class CommonObject $this->errors[] = $langs->trans("ExtraFieldHasWrongValue", $attributeLabel); return -1; } elseif ($value == '') { - $new_array_options[$key] = null; + $value = null; } //dol_syslog("double value"." sur ".$attributeLabel."(".$value." is '".$attributeType."')", LOG_DEBUG); $new_array_options[$key] = $value; @@ -6365,7 +6365,7 @@ abstract class CommonObject $this->errors[] = $langs->trans("ExtraFieldHasWrongValue", $attributeLabel); return -1; } elseif ($value === '') { - $this->array_options["options_".$key] = null; + $value = null; } //dol_syslog("double value"." sur ".$attributeLabel."(".$value." is '".$attributeType."')", LOG_DEBUG); $this->array_options["options_".$key] = $value; From 812b9adee735c64225f7e48e0110ad81b3d123ef Mon Sep 17 00:00:00 2001 From: Christophe Battarel Date: Fri, 29 Apr 2022 10:58:04 +0200 Subject: [PATCH 260/738] still trying to please Travis... losing my time --- htdocs/takepos/ajax/ajax.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/takepos/ajax/ajax.php b/htdocs/takepos/ajax/ajax.php index e15963efb9a..380e205d53f 100644 --- a/htdocs/takepos/ajax/ajax.php +++ b/htdocs/takepos/ajax/ajax.php @@ -235,7 +235,7 @@ if ($action == 'getProducts') { $sql .= $hookmanager->resPrint; // load only one page of products - $sql.= ' LIMIT '. $db->escape($search_start) . ',' . $db->escape($search_limit); + $sql .= ' LIMIT '. $db->escape($search_start) . ',' . $db->escape($search_limit); $resql = $db->query($sql); if ($resql) { From d682cb3103f3feefb1394e810e8b8cc788eb0bdb Mon Sep 17 00:00:00 2001 From: Christophe Battarel Date: Fri, 29 Apr 2022 11:09:32 +0200 Subject: [PATCH 261/738] please Travis --- htdocs/takepos/ajax/ajax.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/takepos/ajax/ajax.php b/htdocs/takepos/ajax/ajax.php index 380e205d53f..20fb282b1cd 100644 --- a/htdocs/takepos/ajax/ajax.php +++ b/htdocs/takepos/ajax/ajax.php @@ -235,7 +235,7 @@ if ($action == 'getProducts') { $sql .= $hookmanager->resPrint; // load only one page of products - $sql .= ' LIMIT '. $db->escape($search_start) . ',' . $db->escape($search_limit); + $sql.= $db->plimit($search_limit, $search_start); $resql = $db->query($sql); if ($resql) { From d496ad65e618650b34cd2e82d33f8f79acfb5525 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 29 Apr 2022 11:16:15 +0200 Subject: [PATCH 262/738] Enhance the feature of keyword detection for partnership --- htdocs/core/modules/modPartnership.class.php | 18 ++++++++++-------- .../install/mysql/migration/15.0.0-16.0.0.sql | 6 +++++- ...llx_c_partnership_type-partnership.key.sql} | 0 ... => llx_c_partnership_type-partnership.sql} | 1 + .../tables/llx_partnership-partnership.sql | 5 +++-- htdocs/langs/en_US/partnership.lang | 4 +++- .../core/modules/modMyModule.class.php | 2 ++ htdocs/partnership/class/partnership.class.php | 7 ++++--- 8 files changed, 28 insertions(+), 15 deletions(-) rename htdocs/install/mysql/tables/{llx_c_partnership_type.key.sql => llx_c_partnership_type-partnership.key.sql} (100%) rename htdocs/install/mysql/tables/{llx_c_partnership_type.sql => llx_c_partnership_type-partnership.sql} (92%) diff --git a/htdocs/core/modules/modPartnership.class.php b/htdocs/core/modules/modPartnership.class.php index 3bec23d0d37..c08cf66db06 100644 --- a/htdocs/core/modules/modPartnership.class.php +++ b/htdocs/core/modules/modPartnership.class.php @@ -219,19 +219,21 @@ class modPartnership extends DolibarrModules // Label of tables 'tablib'=>array("PartnershipType"), // Request to select fields - 'tabsql'=>array('SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.MAIN_DB_PREFIX.'c_partnership_type as f WHERE f.entity = '.$conf->entity), + 'tabsql'=>array('SELECT f.rowid as rowid, f.code, f.label, f.keyword, f.active FROM '.MAIN_DB_PREFIX.'c_partnership_type as f WHERE f.entity = '.((int) $conf->entity)), // Sort order 'tabsqlsort'=>array("label ASC"), // List of fields (result of select to show dictionary) - 'tabfield'=>array("code,label"), + 'tabfield'=>array("code,label,keyword"), // List of fields (list of fields to edit a record) - 'tabfieldvalue'=>array("code,label"), + 'tabfieldvalue'=>array("code,label,keyword"), // List of fields (list of fields for insert) - 'tabfieldinsert'=>array("code,label"), + 'tabfieldinsert'=>array("code,label,keyword"), // Name of columns with primary key (try to always name it 'rowid') 'tabrowid'=>array("rowid"), // Condition to show each dictionary - 'tabcond'=>array($conf->partnership->enabled) + 'tabcond'=>array($conf->partnership->enabled), + // Help tooltip for each fields of the dictionary + 'tabhelp'=>array(array('keyword'=>$langs->trans('KeywordToCheckInWebsite'))) ); // Boxes/Widgets @@ -428,7 +430,7 @@ class modPartnership extends DolibarrModules $sql = array(); // Document templates - $moduledir = 'partnership'; + $moduledir = dol_sanitizeFileName('partnership'); $myTmpObjects = array(); $myTmpObjects['Partnership'] = array('includerefgeneration'=>0, 'includedocgeneration'=>0); @@ -437,8 +439,8 @@ class modPartnership extends DolibarrModules continue; } if ($myTmpObjectArray['includerefgeneration']) { - $src = DOL_DOCUMENT_ROOT.'/install/doctemplates/partnership/template_partnerships.odt'; - $dirodt = DOL_DATA_ROOT.'/doctemplates/partnership'; + $src = DOL_DOCUMENT_ROOT.'/install/doctemplates/'.$moduledir.'/template_partnerships.odt'; + $dirodt = DOL_DATA_ROOT.'/doctemplates/'.$moduledir; $dest = $dirodt.'/template_partnerships.odt'; if (file_exists($src) && !file_exists($dest)) { diff --git a/htdocs/install/mysql/migration/15.0.0-16.0.0.sql b/htdocs/install/mysql/migration/15.0.0-16.0.0.sql index 39560240475..7170ebb62f4 100644 --- a/htdocs/install/mysql/migration/15.0.0-16.0.0.sql +++ b/htdocs/install/mysql/migration/15.0.0-16.0.0.sql @@ -334,4 +334,8 @@ ALTER TABLE llx_actioncomm MODIFY COLUMN note mediumtext; DELETE FROM llx_boxes WHERE box_id IN (select rowid FROM llx_boxes_def WHERE file IN ('box_bom.php@bom', 'box_bom.php')); DELETE FROM llx_boxes_def WHERE file IN ('box_bom.php@bom', 'box_bom.php'); -ALTER TABLE llx_takepos_floor_tables ADD UNIQUE(entity,label); \ No newline at end of file +ALTER TABLE llx_takepos_floor_tables ADD UNIQUE(entity,label); + +ALTER TABLE llx_partnership ADD COLUMN url_to_check varchar(255); +ALTER TABLE llx_c_partnership_type ADD COLUMN keyword varchar(128); + diff --git a/htdocs/install/mysql/tables/llx_c_partnership_type.key.sql b/htdocs/install/mysql/tables/llx_c_partnership_type-partnership.key.sql similarity index 100% rename from htdocs/install/mysql/tables/llx_c_partnership_type.key.sql rename to htdocs/install/mysql/tables/llx_c_partnership_type-partnership.key.sql diff --git a/htdocs/install/mysql/tables/llx_c_partnership_type.sql b/htdocs/install/mysql/tables/llx_c_partnership_type-partnership.sql similarity index 92% rename from htdocs/install/mysql/tables/llx_c_partnership_type.sql rename to htdocs/install/mysql/tables/llx_c_partnership_type-partnership.sql index 99841f967cb..fe4dd904662 100644 --- a/htdocs/install/mysql/tables/llx_c_partnership_type.sql +++ b/htdocs/install/mysql/tables/llx_c_partnership_type-partnership.sql @@ -31,6 +31,7 @@ create table llx_c_partnership_type entity integer DEFAULT 1 NOT NULL, code varchar(32) NOT NULL, label varchar(128) NOT NULL, + keyword varchar(128), -- a keyword to check into url of partner website or a dedicated url defined into partneship record active tinyint DEFAULT 1 NOT NULL )ENGINE=innodb; diff --git a/htdocs/install/mysql/tables/llx_partnership-partnership.sql b/htdocs/install/mysql/tables/llx_partnership-partnership.sql index e3a5cb37e05..8f83e2e82e5 100644 --- a/htdocs/install/mysql/tables/llx_partnership-partnership.sql +++ b/htdocs/install/mysql/tables/llx_partnership-partnership.sql @@ -34,8 +34,9 @@ CREATE TABLE llx_partnership( note_private text, note_public text, last_main_doc varchar(255), - count_last_url_check_error integer DEFAULT '0', - last_check_backlink datetime NULL, + url_to_check varchar(255), -- url to check to find a specific keyword (defined into llx_c_partnership) to keep status of partnership valid + count_last_url_check_error integer DEFAULT '0', -- last result of check of keyword into url + last_check_backlink datetime NULL, -- date of last check of keyword into url import_key varchar(14), model_pdf varchar(255) ) ENGINE=innodb; \ No newline at end of file diff --git a/htdocs/langs/en_US/partnership.lang b/htdocs/langs/en_US/partnership.lang index f542bfab670..9c11e1cda2e 100644 --- a/htdocs/langs/en_US/partnership.lang +++ b/htdocs/langs/en_US/partnership.lang @@ -59,6 +59,7 @@ BacklinkNotFoundOnPartnerWebsite=Backlink not found on partner website ConfirmClosePartnershipAsk=Are you sure you want to cancel this partnership? PartnershipType=Partnership type PartnershipRefApproved=Partnership %s approved +KeywordToCheckInWebsite=If you want to check that a given keyword is present into the website of each partner, define this keyword here # # Template Mail @@ -89,4 +90,5 @@ PartnershipDraft=Draft PartnershipAccepted=Accepted PartnershipRefused=Refused PartnershipCanceled=Canceled -PartnershipManagedFor=Partners are \ No newline at end of file +PartnershipManagedFor=Partners are + diff --git a/htdocs/modulebuilder/template/core/modules/modMyModule.class.php b/htdocs/modulebuilder/template/core/modules/modMyModule.class.php index b1caea730f9..d843687157a 100644 --- a/htdocs/modulebuilder/template/core/modules/modMyModule.class.php +++ b/htdocs/modulebuilder/template/core/modules/modMyModule.class.php @@ -222,6 +222,8 @@ class modMyModule extends DolibarrModules 'tabrowid'=>array("rowid", "rowid", "rowid"), // Condition to show each dictionary 'tabcond'=>array($conf->mymodule->enabled, $conf->mymodule->enabled, $conf->mymodule->enabled) + // Help tooltip for each fields of the dictionary + 'tabhelp'=>array(array('code'=>$langs->trans('CodeTooltipHelp'))) ); */ diff --git a/htdocs/partnership/class/partnership.class.php b/htdocs/partnership/class/partnership.class.php index b673856d124..7d7d6a65d14 100644 --- a/htdocs/partnership/class/partnership.class.php +++ b/htdocs/partnership/class/partnership.class.php @@ -119,9 +119,10 @@ class Partnership extends CommonObject 'date_partnership_start' => array('type'=>'date', 'label'=>'DatePartnershipStart', 'enabled'=>'1', 'position'=>52, 'notnull'=>1, 'visible'=>1,), 'date_partnership_end' => array('type'=>'date', 'label'=>'DatePartnershipEnd', 'enabled'=>'1', 'position'=>53, 'notnull'=>0, 'visible'=>1,), 'status' => array('type'=>'smallint', 'label'=>'Status', 'enabled'=>'1', 'position'=>54, 'notnull'=>0, 'visible'=>2, 'index'=>1, 'arrayofkeyval'=>array('-1'=>'','0'=>'Draft', '1'=>'Accepted', '2'=>'Refused', '9'=>'Terminated'),), - 'count_last_url_check_error' => array('type'=>'integer', 'label'=>'CountLastUrlCheckError', 'enabled'=>'1', 'position'=>63, 'notnull'=>0, 'visible'=>-2, 'default'=>'0',), - 'last_check_backlink' => array('type'=>'datetime', 'label'=>'LastCheckBacklink', 'enabled'=>'1', 'position'=>65, 'notnull'=>0, 'visible'=>-2,), - 'reason_decline_or_cancel' => array('type'=>'text', 'label'=>'ReasonDeclineOrCancel', 'enabled'=>'1', 'position'=>64, 'notnull'=>0, 'visible'=>-2,), + 'url_to_check' => array('type'=>'varchar(255)', 'label'=>'UrlToCheck', 'enabled'=>'1', 'position'=>70, 'notnull'=>0, 'visible'=>-1), + 'count_last_url_check_error' => array('type'=>'integer', 'label'=>'CountLastUrlCheckError', 'enabled'=>'1', 'position'=>71, 'notnull'=>0, 'visible'=>-2, 'default'=>'0',), + 'last_check_backlink' => array('type'=>'datetime', 'label'=>'LastCheckBacklink', 'enabled'=>'1', 'position'=>72, 'notnull'=>0, 'visible'=>-2,), + 'reason_decline_or_cancel' => array('type'=>'text', 'label'=>'ReasonDeclineOrCancel', 'enabled'=>'1', 'position'=>73, 'notnull'=>0, 'visible'=>-2,), // fk_member and fk_soc are added into constructor ); From 3e4cd251eabf9f7559c8f8dd933474b611685f6f Mon Sep 17 00:00:00 2001 From: GregM Date: Fri, 29 Apr 2022 11:45:50 +0200 Subject: [PATCH 263/738] add edit extrafields Massaction products --- htdocs/core/actions_massactions.inc.php | 70 +++++++++++++++++++++++++ htdocs/core/tpl/massactions_pre.tpl.php | 25 +++++++++ htdocs/langs/en_US/main.lang | 4 ++ htdocs/product/list.php | 1 + 4 files changed, 100 insertions(+) diff --git a/htdocs/core/actions_massactions.inc.php b/htdocs/core/actions_massactions.inc.php index c5ff1d8f82a..5f5703fc872 100644 --- a/htdocs/core/actions_massactions.inc.php +++ b/htdocs/core/actions_massactions.inc.php @@ -1602,6 +1602,76 @@ if (!$error && ($massaction == 'disable' || ($action == 'disable' && $confirm == } } +if (!$error && $action == 'confirm_edit_value_extrafields' && $confirm == 'yes' && $permissiontoadd){ + $db->begin(); + + /** @var CommonObject $objecttmp */ + $objecttmp = new $objectclass($db); + + $nbok = 0; + $e = new ExtraFields($db); + $e->fetch_name_optionals_label($objecttmp->table_element); + + foreach ($toselect as $toselectid) { + $result = $objecttmp->fetch($toselectid); + + if ($result>0) { + + if (isset($e->attributes[$objecttmp->table_element]['type']) && is_array($e->attributes[$objecttmp->table_element]['type'])) { + foreach ($e->attributes[$objecttmp->table_element]['type'] as $key => $type){ + + //Permet de gérer les types d'extrafields + if (in_array($type, array('price', 'double'))) { + $value_arr = GETPOST("options_".$key, 'alpha'); + if(empty($value_arr)){ + continue; + } + $value_key = price2num($value_arr); + //var_dump($value_key);exit; + }else if (in_array($type, array('date'))) { + // Clean parameters + $value_key = dol_mktime(12, 0, 0, GETPOST("options_" . $key . "month", 'int'), GETPOST("options_" . $key . "day", 'int'), GETPOST("options_" . $key . "year", 'int')); + //var_dump($value_key);exit; + if(empty($value_key)){ + continue; + } + }else if (in_array($type, array('datetime'))) { + // Clean parameters + $value_key = dol_mktime(GETPOST("options_".$key."hour", 'int'), GETPOST("options_".$key."min", 'int'), GETPOST("options_".$key."sec", 'int'), GETPOST("options_".$key."month", 'int'), GETPOST("options_".$key."day", 'int'), GETPOST("options_".$key."year", 'int'), 'tzuserrel'); + if(empty($value_key)){ + continue; + } + } else { + $value_key = GETPOST("options_".$key); + if ((in_array($type, array('link')) && $key == '-1') || empty($value_key)) { + continue; + } + } + $objecttmp->array_options["options_".$key] = $value_key; + } + } + $objecttmp->insertExtraFields(); + + } else { + setEventMessages($objecttmp->error, $objecttmp->errors, 'errors'); + $error++; + break; + } + } + + if (!$error) { + if ($nbok > 1) { + setEventMessages($langs->trans("RecordsDisabled", $nbok), null, 'mesgs'); + } else { + setEventMessages($langs->trans("save"), null, 'mesgs'); + } + $db->commit(); + } else { + $db->rollback(); + } + +} + // Approve for leave only if (!$error && ($massaction == 'approveleave' || ($action == 'approveleave' && $confirm == 'yes')) && $permissiontoapprove) { $db->begin(); diff --git a/htdocs/core/tpl/massactions_pre.tpl.php b/htdocs/core/tpl/massactions_pre.tpl.php index de034f652d3..40394cb99ff 100644 --- a/htdocs/core/tpl/massactions_pre.tpl.php +++ b/htdocs/core/tpl/massactions_pre.tpl.php @@ -211,6 +211,31 @@ if ($massaction == 'presend') { print dol_get_fiche_end(); } +if ($massaction == 'edit_extrafields') { + + require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; + $elementtype = 'product'; + /** @var CommonObject $objecttmp */ + $extrafields = new ExtraFields($db); + + $extrafields->fetch_name_optionals_label($elementtype); + $extrafields_list = $extrafields->attributes[$elementtype]['label']; + + $formquestion = array(); + if (!empty($extrafields_list)) { + $myParamExtra = $object->showOptionals($extrafields, 'create'); + + $formquestion[] = array( + 'type' => 'other', + 'value' => $object->showOptionals($extrafields, 'create') + ); + + print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmEditExtrafield"), $langs->trans("ConfirmEditExtrafieldQuestion", count($toselect)), "confirm_edit_value_extrafields", $formquestion, 1, 0, 200, 500, 1); + } else { + setEventMessage($langs->trans("noExtrafields")); + } +} + if ($massaction == 'preenable') { print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassEnabling"), $langs->trans("ConfirmMassEnablingQuestion", count($toselect)), "enable", null, 'yes', 0, 200, 500, 1); } diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index c66895e58a4..c543fcf31e0 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -1169,3 +1169,7 @@ CanceledShown=Canceled shown Terminate=Terminate Terminated=Terminated AddLineOnPosition=Add line on position (at the end if empty) +ConfirmEditExtrafield = Modifier les champs supplémentaires en masse +ChangeValueExtrafield = Modifier la valeur du champ supplémentaire +ConfirmEditExtrafieldQuestion = Etes vous sur de modifier cet extrafield ? +ConfirmEditValueExtrafieldQuestion = Etes vous sur de modifier la valeur de cet extrafield ? diff --git a/htdocs/product/list.php b/htdocs/product/list.php index de5e4f278b7..7cd0a91c923 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -727,6 +727,7 @@ if ($resql) { // List of mass actions available $arrayofmassactions = array( 'generate_doc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"), + 'edit_extrafields'=>img_picto('', 'edit', 'class="pictofixedwidth"').$langs->trans("Extrafields"), //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"), //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"), ); From bdd9b2acf4557c9b86e2988afb4ca468dfe09e5d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 29 Apr 2022 11:50:55 +0200 Subject: [PATCH 264/738] Clean css --- htdocs/core/lib/usergroups.lib.php | 7 ++++-- htdocs/langs/en_US/admin.lang | 2 +- htdocs/takepos/css/pos.css.php | 2 +- htdocs/theme/eldy/global.inc.php | 2 +- htdocs/theme/eldy/info-box.inc.php | 4 ++-- htdocs/theme/md/info-box.inc.php | 2 +- htdocs/theme/md/style.css.php | 38 +++++++++++++++--------------- 7 files changed, 30 insertions(+), 27 deletions(-) diff --git a/htdocs/core/lib/usergroups.lib.php b/htdocs/core/lib/usergroups.lib.php index c963c74c8b6..9bc0a59cf86 100644 --- a/htdocs/core/lib/usergroups.lib.php +++ b/htdocs/core/lib/usergroups.lib.php @@ -367,6 +367,7 @@ function showSkins($fuser, $edit = 0, $foruserprofile = false) $url = 'https://www.dolistore.com/9-skins'; print ''; print $langs->trans('DownloadMoreSkins'); + print img_picto('', 'globe', 'class="paddingleft"'); print ''; print ''; } @@ -435,7 +436,9 @@ function showSkins($fuser, $edit = 0, $foruserprofile = false) $colorbacktitle1 = ''; $colortexttitle = ''; $colorbacklineimpair1 = ''; + $colorbacklineimpair2 = ''; $colorbacklinepair1 = ''; + $colorbacklinepair2 = ''; $colortextlink = ''; $colorbacklinepairhover = ''; $colorbacklinepairhover = ''; @@ -746,7 +749,7 @@ function showSkins($fuser, $edit = 0, $foruserprofile = false) print ''.$langs->trans("BackgroundTableLineOddColor").''; print ''; if ($edit) { - print $formother->selectColor(colorArrayToHex(colorStringToArray((!empty($conf->global->THEME_ELDY_LINEIMPAIR1) ? $conf->global->THEME_ELDY_LINEIMPAIR1 : ''), array()), ''), 'THEME_ELDY_LINEIMPAIR1', '', 1, '', '', 'colorbacklinepair2').' '; + print $formother->selectColor(colorArrayToHex(colorStringToArray((!empty($conf->global->THEME_ELDY_LINEIMPAIR1) ? $conf->global->THEME_ELDY_LINEIMPAIR1 : ''), array()), ''), 'THEME_ELDY_LINEIMPAIR1', '', 1, '', '', 'colorbacklineimpair2').' '; } else { $color = colorArrayToHex(colorStringToArray($conf->global->THEME_ELDY_LINEIMPAIR1, array()), ''); if ($color) { @@ -770,7 +773,7 @@ function showSkins($fuser, $edit = 0, $foruserprofile = false) print ''.$langs->trans("BackgroundTableLineEvenColor").''; print ''; if ($edit) { - print $formother->selectColor(colorArrayToHex(colorStringToArray((!empty($conf->global->THEME_ELDY_LINEPAIR1) ? $conf->global->THEME_ELDY_LINEPAIR1 : ''), array()), ''), 'THEME_ELDY_LINEPAIR1', '', 1, '', '', 'colorbacklineimpair2').' '; + print $formother->selectColor(colorArrayToHex(colorStringToArray((!empty($conf->global->THEME_ELDY_LINEPAIR1) ? $conf->global->THEME_ELDY_LINEPAIR1 : ''), array()), ''), 'THEME_ELDY_LINEPAIR1', '', 1, '', '', 'colorbacklinepair2').' '; } else { $color = colorArrayToHex(colorStringToArray($conf->global->THEME_ELDY_LINEPAIR1, array()), ''); if ($color) { diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 970426eb488..bbb46d83900 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1925,7 +1925,7 @@ ConfFileMustContainCustom=Installing or building an external module from applica HighlightLinesOnMouseHover=Highlight table lines when mouse move passes over HighlightLinesColor=Highlight color of the line when the mouse passes over (use 'ffffff' for no highlight) HighlightLinesChecked=Highlight color of the line when it is checked (use 'ffffff' for no highlight) -UseBorderOnTable=Active border on tables +UseBorderOnTable=Show left-right borders on tables BtnActionColor=Color of the action button TextBtnActionColor=Text color of the action button TextTitleColor=Text color of Page title diff --git a/htdocs/takepos/css/pos.css.php b/htdocs/takepos/css/pos.css.php index ba85c111bcd..45130981876 100644 --- a/htdocs/takepos/css/pos.css.php +++ b/htdocs/takepos/css/pos.css.php @@ -311,7 +311,7 @@ table.postablelines tr td { .posinvoiceline td { height: 40px !important; - background-color: var(--colorbacklineimpair1); + background-color: var(--colorbacklineimpair2); } .postablelines td.linecolht { diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 356c8f45d63..c2c4d12012b 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -13,7 +13,7 @@ --colorbacktitle1: rgb(); --colorbacktabcard1: rgb(); --colorbacktabactive: rgb(); - --colorbacklinepair1: rgb(); + --colorbacklineimpair1: rgb(); --colorbacklineimpair2: rgb(); --colorbacklinepair1: rgb(); --colorbacklinepair2: rgb(); diff --git a/htdocs/theme/eldy/info-box.inc.php b/htdocs/theme/eldy/info-box.inc.php index 8e4df027809..2d33a716692 100644 --- a/htdocs/theme/eldy/info-box.inc.php +++ b/htdocs/theme/eldy/info-box.inc.php @@ -21,7 +21,7 @@ if (!defined('ISLOADEDBYSTEELSHEET')) { display: block; position: relative; min-height: 90px; - /* background: #fff; */ + background: var(--colorbacklineimpair2); width: 100%; box-shadow: 1px 1px 15px rgba(192, 192, 192, 0.2); border-radius: 2px; @@ -88,7 +88,7 @@ if (!defined('ISLOADEDBYSTEELSHEET')) { text-align: center; font-size: 2.8em; line-height: 90px; - background: rgba(0, 0, 0, 0.08) !important; + background: var(--colorbacktitle1) !important; } .info-box-module .info-box-icon { diff --git a/htdocs/theme/md/info-box.inc.php b/htdocs/theme/md/info-box.inc.php index 1ea21ac44d1..8ffd6fc3f93 100644 --- a/htdocs/theme/md/info-box.inc.php +++ b/htdocs/theme/md/info-box.inc.php @@ -133,7 +133,7 @@ a.info-box-text-a i.fa.fa-exclamation-triangle { display: block; position: relative; min-height: 90px; - background: #fff; + background: var(--colorbacklineimpair2); width: 100%; /* box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.1); */ border-radius: 2px; diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index f1a07efbb0c..5317d6085fa 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -359,7 +359,7 @@ body { color: rgb(); font-size: ; - line-height: 1.3; + line-height: 1.4; font-family: ; margin-top: 0; margin-bottom: 0; @@ -3968,10 +3968,10 @@ table.hidepaginationnext .paginationnext { /* Prepare to remove class pair - impair .noborder > tbody > tr:nth-child(even) td { - background: linear-gradient(to bottom, var(--colorbacklineimpair1) 85%, var(--colorbacklineimpair2) 100%); - background: -o-linear-gradient(bottom, var(--colorbacklineimpair1) 85%, var(--colorbacklineimpair2) 100%); - background: -moz-linear-gradient(bottom, var(--colorbacklineimpair1) 85%, var(--colorbacklineimpair2) 100%); - background: -webkit-linear-gradient(bottom, var(--colorbacklineimpair1) 85%, var(--colorbacklineimpair2) 100%); + background: linear-gradient(to bottom, var(--colorbacklineimpai2) 85%, var(--colorbacklineimpair2) 100%); + background: -o-linear-gradient(bottom, var(--colorbacklineimpair2) 85%, var(--colorbacklineimpair2) 100%); + background: -moz-linear-gradient(bottom, var(--colorbacklineimpair2) 85%, var(--colorbacklineimpair2) 100%); + background: -webkit-linear-gradient(bottom, var(--colorbacklineimpair2) 85%, var(--colorbacklineimpair2) 100%); font-family: ; border: 0px; margin-bottom: 1px; @@ -3980,10 +3980,10 @@ table.hidepaginationnext .paginationnext { } .noborder > tbody > tr:nth-child(odd) td { - background: linear-gradient(to bottom, var(--colorbacklinepair1) 85%, var(--colorbacklinepair2) 100%); - background: -o-linear-gradient(bottom, var(--colorbacklinepair1) 85%, var(--colorbacklinepair2) 100%); - background: -moz-linear-gradient(bottom, var(--colorbacklinepair1) 85%, var(--colorbacklinepair2) 100%); - background: -webkit-linear-gradient(bottom, var(--colorbacklinepair1) 85%, var(--colorbacklinepair2) 100%); + background: linear-gradient(to bottom, var(--colorbacklinepair2) 85%, var(--colorbacklinepair2) 100%); + background: -o-linear-gradient(bottom, var(--colorbacklinepair2) 85%, var(--colorbacklinepair2) 100%); + background: -moz-linear-gradient(bottom, var(--colorbacklinepair2) 85%, var(--colorbacklinepair2) 100%); + background: -webkit-linear-gradient(bottom, var(--colorbacklinepair2) 85%, var(--colorbacklinepair2) 100%); font-family: ; border: 0px; margin-bottom: 1px; @@ -4038,10 +4038,10 @@ ul.noborder li:nth-child(odd):not(.liste_titre) { } .impair, .nohover .impair:hover, tr.impair td.nohover { - background: var(--colorbacklineimpair1); + background: var(--colorbacklineimpair2); } #GanttChartDIV { - background-color: var(--colorbacklineimpair1); + background-color: var(--colorbacklineimpair2); } .oddeven, .evenodd, .pair, .nohover .pair:hover, tr.pair td.nohover, .tagtr.oddeven { @@ -4059,12 +4059,12 @@ table.dataTable tr.oddeven { /* For no hover style */ td.oddeven, table.nohover tr.impair, table.nohover tr.pair, table.nohover tr.impair td, table.nohover tr.pair td, tr.nohover td, form.nohover, form.nohover:hover { - background-color: var(--colorbacklineimpair1) !important; - background: var(--colorbacklineimpair1) !important; + background-color: var(--colorbacklineimpair2) !important; + background: var(--colorbacklineimpair2) !important; } td.evenodd, tr.nohoverpair td, #trlinefordates td { - background-color: var(--colorbacklinepair1) !important; - background: var(--colorbacklinepair1) !important; + background-color: var(--colorbacklinepair2) !important; + background: var(--colorbacklinepair2) !important; } .trforbreak td { font-weight: bold; @@ -4277,10 +4277,10 @@ div .tdtop { div:not(.fichecenter):not(.fichehalfleft):not(.fichehalfright) > .border > tbody > tr:nth-of-type(even):not(.liste_titre), .liste > tbody > tr:nth-of-type(even):not(.liste_titre), div:not(.fichecenter):not(.fichehalfleft):not(.fichehalfright) .oddeven.tagtr:nth-of-type(even):not(.liste_titre) { - background: linear-gradient(to bottom, var(--colorbacklineimpair1) 0%, var(--colorbacklineimpair2) 100%); - background: -o-linear-gradient(bottom, var(--colorbacklineimpair1) 0%, var(--colorbacklineimpair2) 100%); - background: -moz-linear-gradient(bottom, var(--colorbacklineimpair1) 0%, var(--colorbacklineimpair2) 100%); - background: -webkit-linear-gradient(bottom, var(--colorbacklineimpair1) 0%, var(--colorbacklineimpair2) 100%); + background: linear-gradient(to bottom, var(--colorbacklineimpair2) 0%, var(--colorbacklineimpair2) 100%); + background: -o-linear-gradient(bottom, var(--colorbacklineimpair2) 0%, var(--colorbacklineimpair2) 100%); + background: -moz-linear-gradient(bottom, var(--colorbacklineimpair2) 0%, var(--colorbacklineimpair2) 100%); + background: -webkit-linear-gradient(bottom, var(--colorbacklineimpair2) 0%, var(--colorbacklineimpair2) 100%); } .noborder > tbody > tr:nth-child(even):not(:last-of-type) td:not(.liste_titre), .liste > tbody > tr:nth-child(even):not(:last-of-type) td:not(.liste_titre), .noborder .tagtr:nth-child(even):not(:last-of-type) .oddeven.tagtd:not(.liste_titre) From 708d3610a5a6c48e98e8682d674c13fae9d99536 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 29 Apr 2022 13:04:29 +0200 Subject: [PATCH 265/738] Look and feel v16 --- htdocs/comm/propal/card.php | 6 +-- htdocs/commande/card.php | 6 +-- htdocs/core/class/html.form.class.php | 16 ++++--- htdocs/core/class/html.formprojet.class.php | 50 +++++++++++---------- htdocs/core/lib/functions.lib.php | 4 +- htdocs/projet/admin/project.php | 7 +-- 6 files changed, 48 insertions(+), 41 deletions(-) diff --git a/htdocs/comm/propal/card.php b/htdocs/comm/propal/card.php index f6989d90d59..c36c3e86663 100644 --- a/htdocs/comm/propal/card.php +++ b/htdocs/comm/propal/card.php @@ -1650,13 +1650,13 @@ if ($action == 'create') { // Terms of payment print ''.$langs->trans('PaymentConditionsShort').''; - print img_picto('', 'paiment'); + print img_picto('', 'payment', 'class="pictofixedwidth"'); $form->select_conditions_paiements((GETPOSTISSET('cond_reglement_id') && GETPOST('cond_reglement_id') != 0) ? GETPOST('cond_reglement_id', 'int') : $soc->cond_reglement_id, 'cond_reglement_id', -1, 1); print ''; // Mode of payment print ''.$langs->trans('PaymentMode').''; - print img_picto('', 'bank').' '; + print img_picto('', 'bank', 'class="pictofixedwidth').' '; $form->select_types_paiements((GETPOSTISSET('mode_reglement_id') ? GETPOST('mode_reglement_id', 'int') : $soc->mode_reglement_id), 'mode_reglement_id', 'CRDT', 0, 1, 0, 0, 1, 'maxwidth200 widthcentpercentminusx'); print ''; @@ -1752,7 +1752,7 @@ if ($action == 'create') { print ''; print ''.$form->editfieldkey('Currency', 'multicurrency_code', '', $object, 0).''; print ''; - print $form->selectMultiCurrency($currency_code, 'multicurrency_code', 0); + print img_picto('', 'currency', 'class="pictofixedwidth"').$form->selectMultiCurrency($currency_code, 'multicurrency_code', 0); print ''; } diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index 53b6d40d6b0..d33ea387947 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -1670,7 +1670,7 @@ if ($action == 'create' && $usercancreate) { // Terms of the settlement print ''.$langs->trans('PaymentConditionsShort').''; - print img_picto('', 'paiment'); + print img_picto('', 'payment', 'class="pictofixedwidth"'); $form->select_conditions_paiements($cond_reglement_id, 'cond_reglement_id', - 1, 1); print ''; @@ -1759,10 +1759,10 @@ if ($action == 'create' && $usercancreate) { // Template to use by default print ''.$langs->trans('DefaultModel').''; print ''; - print img_picto('', 'pdf', 'class="pictofixedwidth"'); include_once DOL_DOCUMENT_ROOT.'/core/modules/commande/modules_commande.php'; $liste = ModelePDFCommandes::liste_modeles($db); $preselected = $conf->global->COMMANDE_ADDON_PDF; + print img_picto('', 'pdf', 'class="pictofixedwidth"'); print $form->selectarray('model', $liste, $preselected, 0, 0, 0, '', 0, 0, 0, '', 'maxwidth200 widthcentpercentminusx', 1); print ""; @@ -1771,7 +1771,7 @@ if ($action == 'create' && $usercancreate) { print ''; print ''.$form->editfieldkey("Currency", 'multicurrency_code', '', $object, 0).''; print ''; - print $form->selectMultiCurrency($currency_code, 'multicurrency_code'); + print img_picto('', 'currency', 'class="pictofixedwidth"').$form->selectMultiCurrency($currency_code, 'multicurrency_code'); print ''; } diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index f86fcd88030..749b4dddb13 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -5872,6 +5872,7 @@ class Form } $out .= ''; + // Make select dynamic include_once DOL_DOCUMENT_ROOT.'/core/lib/ajax.lib.php'; $out .= ajax_combobox($htmlname); @@ -7753,13 +7754,6 @@ class Form } } - // Add code for jquery to use multiselect - if ($addjscombo && $jsbeautify) { - // Enhance with select2 - include_once DOL_DOCUMENT_ROOT.'/core/lib/ajax.lib.php'; - $out .= ajax_combobox($htmlname, array(), 0, 0, 'resolve', $show_empty < 0 ? (string) $show_empty : '-1'); - } - $out .= ''; + $out .= ajax_autocompleter($selected, $htmlname, DOL_URL_ROOT.'/projet/ajax/projects.php', $urloption, $conf->global->PROJECT_USE_SEARCH_TO_SELECT, 0, array( // 'update' => array( // 'projectid' => 'id' // ) )); - - $out .= ''; } else { $out .= $this->select_projects_list($socid, $selected, $htmlname, $maxlength, $option_only, $show_empty, abs($discard_closed), $forcefocus, $disabled, 0, $filterkey, 1, $forceaddid, $htmlid, $morecss); } if ($discard_closed > 0) { - if (class_exists('Form')) { - if (!is_object($form)) { - $form = new Form($this->db); - } + if (!empty($form)) { $out .= $form->textwithpicto('', $langs->trans("ClosedProjectsAreHidden")); } } diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 24557d1e90e..de31b0d632f 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -3730,7 +3730,7 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $ 'bank_account', 'barcode', 'bank', 'bell', 'bill', 'billa', 'billr', 'billd', 'bookmark', 'bom', 'briefcase-medical', 'bug', 'building', 'card', 'calendar', 'calendarmonth', 'calendarweek', 'calendarday', 'calendarperuser', 'calendarpertype', 'cash-register', 'category', 'chart', 'check', 'clock', 'close_title', 'cog', 'collab', 'company', 'contact', 'country', 'contract', 'conversation', 'cron', 'cubes', - 'multicurrency', + 'currency', 'multicurrency', 'delete', 'dolly', 'dollyrevert', 'donation', 'download', 'dynamicprice', 'edit', 'ellipsis-h', 'email', 'entity', 'eraser', 'establishment', 'expensereport', 'external-link-alt', 'external-link-square-alt', 'filter', 'file-code', 'file-export', 'file-import', 'file-upload', 'autofill', 'folder', 'folder-open', 'folder-plus', @@ -3789,7 +3789,7 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $ 'switch_off'=>'toggle-off', 'switch_on'=>'toggle-on', 'switch_on_red'=>'toggle-on', 'check'=>'check', 'bookmark'=>'star', 'bank'=>'university', 'close_title'=>'times', 'delete'=>'trash', 'filter'=>'filter', 'list-alt'=>'list-alt', 'calendar'=>'calendar-alt', 'calendarmonth'=>'calendar-alt', 'calendarweek'=>'calendar-week', 'calendarday'=>'calendar-day', 'calendarperuser'=>'table', - 'intervention'=>'ambulance', 'invoice'=>'file-invoice-dollar', 'multicurrency'=>'dollar-sign', 'order'=>'file-invoice', + 'intervention'=>'ambulance', 'invoice'=>'file-invoice-dollar', 'currency'=>'dollar-sign', 'multicurrency'=>'dollar-sign', 'order'=>'file-invoice', 'error'=>'exclamation-triangle', 'warning'=>'exclamation-triangle', 'other'=>'square', 'playdisabled'=>'play', 'pdf'=>'file-pdf', 'poll'=>'check-double', 'pos'=>'cash-register', 'preview'=>'binoculars', 'project'=>'project-diagram', 'projectpub'=>'project-diagram', 'projecttask'=>'tasks', 'propal'=>'file-signature', diff --git a/htdocs/projet/admin/project.php b/htdocs/projet/admin/project.php index adef0826992..37a2bb246ce 100644 --- a/htdocs/projet/admin/project.php +++ b/htdocs/projet/admin/project.php @@ -766,6 +766,7 @@ $form = new Form($db); print '
'; print ''; print ''; +print ''; print ''; print ''; @@ -788,7 +789,7 @@ if (!$conf->use_javascript_ajax) { ); print $form->selectarray("activate_PROJECT_USE_SEARCH_TO_SELECT", $arrval, $conf->global->PROJECT_USE_SEARCH_TO_SELECT); print '"; } print ''; @@ -799,7 +800,7 @@ print ''; print ''; print ''; @@ -818,7 +819,7 @@ print ''; print ''; print ''; print '
'; - print ''; + print ''; print "
'.$langs->trans("AllowToSelectProjectFromOtherCompany").''; print ' '; print $form->textwithpicto('', $langs->trans('AllowToLinkFromOtherCompany')); -print ''; +print ''; print '
'.$langs->trans("TimesheetPreventAfterFollowingMonths").''; print ' '; -print ''; +print ''; print '
'; From 147e61472c382549f4e2889b4390a25719be3534 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 29 Apr 2022 13:10:28 +0200 Subject: [PATCH 266/738] Clean code: Remove all   entities. --- htdocs/adherents/list.php | 2 +- htdocs/comm/propal/card.php | 8 ++++---- htdocs/supplier_proposal/list.php | 4 ++-- htdocs/user/list.php | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/htdocs/adherents/list.php b/htdocs/adherents/list.php index 1936d855a7e..b99d763b7b0 100644 --- a/htdocs/adherents/list.php +++ b/htdocs/adherents/list.php @@ -587,7 +587,7 @@ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php'; // List of mass actions available $arrayofmassactions = array( - //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').' '.$langs->trans("SendByMail"), + //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"), //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"), ); if ($user->rights->adherent->creer) { diff --git a/htdocs/comm/propal/card.php b/htdocs/comm/propal/card.php index c36c3e86663..07e041a8fd1 100644 --- a/htdocs/comm/propal/card.php +++ b/htdocs/comm/propal/card.php @@ -1646,7 +1646,7 @@ if ($action == 'create') { print ''; // Validaty duration - print ''.$langs->trans("ValidityDuration").''.img_picto('', 'clock').'  '.$langs->trans("days").''; + print ''.$langs->trans("ValidityDuration").''.img_picto('', 'clock', 'class="paddingright"').' '.$langs->trans("days").''; // Terms of payment print ''.$langs->trans('PaymentConditionsShort').''; @@ -1656,7 +1656,7 @@ if ($action == 'create') { // Mode of payment print ''.$langs->trans('PaymentMode').''; - print img_picto('', 'bank', 'class="pictofixedwidth').' '; + print img_picto('', 'bank', 'class="pictofixedwidth"'); $form->select_types_paiements((GETPOSTISSET('mode_reglement_id') ? GETPOST('mode_reglement_id', 'int') : $soc->mode_reglement_id), 'mode_reglement_id', 'CRDT', 0, 1, 0, 0, 1, 'maxwidth200 widthcentpercentminusx'); print ''; @@ -1679,7 +1679,7 @@ if ($action == 'create') { print ' ('.$langs->trans('AfterOrder').')'; } print ''; - print img_picto('', 'clock').' '; + print img_picto('', 'clock', 'class="pictofixedwidth"'); $form->selectAvailabilityDelay('', 'availability_id', '', 1, 'maxwidth200 widthcentpercentminusx'); print ''; @@ -1741,7 +1741,7 @@ if ($action == 'create') { print ''; print ''.$langs->trans("DefaultModel").''; print ''; - print img_picto('', 'pdf').' '; + print img_picto('', 'pdf', 'class="pictofixedwidth"'); $liste = ModelePDFPropales::liste_modeles($db); $preselected = (!empty($conf->global->PROPALE_ADDON_PDF_ODT_DEFAULT) ? $conf->global->PROPALE_ADDON_PDF_ODT_DEFAULT : getDolGlobalString("PROPALE_ADDON_PDF")); print $form->selectarray('model', $liste, $preselected, 0, 0, 0, '', 0, 0, 0, '', 'maxwidth200 widthcentpercentminusx', 1); diff --git a/htdocs/supplier_proposal/list.php b/htdocs/supplier_proposal/list.php index ad35c8f9914..c6411f9c169 100644 --- a/htdocs/supplier_proposal/list.php +++ b/htdocs/supplier_proposal/list.php @@ -573,10 +573,10 @@ if ($resql) { $arrayofmassactions = array( 'generate_doc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"), 'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"), - //'presend'=>img_picto('', 'email',, 'class="pictofixedwidth"').' '.$langs->trans("SendByMail"), + //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"), ); if ($user->rights->supplier_proposal->supprimer) { - $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').' '.$langs->trans("Delete"); + $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete"); } if (in_array($massaction, array('presend', 'predelete'))) { $arrayofmassactions = array(); diff --git a/htdocs/user/list.php b/htdocs/user/list.php index cd87e286225..9cc1fa88953 100644 --- a/htdocs/user/list.php +++ b/htdocs/user/list.php @@ -551,7 +551,7 @@ if ($permissiontoadd) { if ($permissiontoadd) { $arrayofmassactions['preaffecttag'] = img_picto('', 'category', 'class="pictofixedwidth"').$langs->trans("AffectTag"); } -//if ($permissiontodelete) $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').' '.$langs->trans("Delete"); +//if ($permissiontodelete) $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete"); if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend', 'predelete', 'preaffecttag'))) { $arrayofmassactions = array(); From 3780e83615294c888f897b5daf826d7f28a48a11 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 29 Apr 2022 13:20:14 +0200 Subject: [PATCH 267/738] Trans --- htdocs/langs/en_US/members.lang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/langs/en_US/members.lang b/htdocs/langs/en_US/members.lang index 8646c40b98f..faa2e0d0fcd 100644 --- a/htdocs/langs/en_US/members.lang +++ b/htdocs/langs/en_US/members.lang @@ -15,7 +15,7 @@ ErrorMemberIsAlreadyLinkedToThisThirdParty=Another member (name: %s, logi ErrorUserPermissionAllowsToLinksToItselfOnly=For security reasons, you must be granted permissions to edit all users to be able to link a member to a user that is not yours. SetLinkToUser=Link to a Dolibarr user SetLinkToThirdParty=Link to a Dolibarr third party -MembersCards=Business cards for members +MembersCards=Generation of cards for members MembersList=List of members MembersListToValid=List of draft members (to be validated) MembersListValid=List of valid members @@ -163,7 +163,7 @@ MoreActionsOnSubscription=Complementary action suggested by default when recordi MoreActionBankDirect=Create a direct entry on bank account MoreActionBankViaInvoice=Create an invoice, and a payment on bank account MoreActionInvoiceOnly=Create an invoice with no payment -LinkToGeneratedPages=Generate visit cards +LinkToGeneratedPages=Generation of business cards or address sheets LinkToGeneratedPagesDesc=This screen allows you to generate PDF files with business cards for all your members or a particular member. DocForAllMembersCards=Generate business cards for all members DocForOneMemberCards=Generate business cards for a particular member From fed14db94a5cd9df24b12c5013d44cf47f79e6a5 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 29 Apr 2022 13:22:46 +0200 Subject: [PATCH 268/738] css --- htdocs/core/lib/functions.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index de31b0d632f..51741179753 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -3866,7 +3866,7 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $ 'ecm'=>'infobox-action', 'eventorganization'=>'infobox-project', 'hrm'=>'infobox-adherent', 'group'=>'infobox-adherent', 'intervention'=>'infobox-contrat', 'incoterm'=>'infobox-supplier_proposal', - 'multicurrency'=>'infobox-bank_account', + 'currency'=>'infobox-bank_account', 'multicurrency'=>'infobox-bank_account', 'members'=>'infobox-adherent', 'member'=>'infobox-adherent', 'money-bill-alt'=>'infobox-bank_account', 'order'=>'infobox-commande', 'user'=>'infobox-adherent', 'users'=>'infobox-adherent', From 8ad57b3d7ab4c5193afa1d3bf4db84e125e6fcf9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 29 Apr 2022 13:43:51 +0200 Subject: [PATCH 269/738] Fix td --- htdocs/admin/ihm.php | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/htdocs/admin/ihm.php b/htdocs/admin/ihm.php index 2c997d746d9..fdfd8bb8fae 100644 --- a/htdocs/admin/ihm.php +++ b/htdocs/admin/ihm.php @@ -485,18 +485,17 @@ if ($mode == 'other') { print ''; print ''; + print $langs->trans("Miscellaneous"); + print ''; + print ''; + print ''; // Max size of lists print ''; - print ''; print ''; // Max size of short lists on customer card print ''; - print ''; print ''; // show input border @@ -504,7 +503,6 @@ if ($mode == 'other') { print ''; - print ''; print ''; */ @@ -512,21 +510,18 @@ if ($mode == 'other') { print ''; - print ''; print ''; // DefaultWorkingDays print ''; - print ''; print ''; // DefaultWorkingHours print ''; - print ''; print ''; // Firstname/Name @@ -534,7 +529,6 @@ if ($mode == 'other') { $array = array(0 => $langs->trans("Firstname") . ' ' . $langs->trans("Lastname"), 1 => $langs->trans("Lastname") . ' ' . $langs->trans("Firstname")); print $form->selectarray('MAIN_FIRSTNAME_NAME_POSITION', $array, (isset($conf->global->MAIN_FIRSTNAME_NAME_POSITION) ? $conf->global->MAIN_FIRSTNAME_NAME_POSITION : 0)); print ''; - print ''; print ''; // Hide unauthorized menus @@ -542,7 +536,6 @@ if ($mode == 'other') { //print $form->selectyesno('MAIN_MENU_HIDE_UNAUTHORIZED', isset($conf->global->MAIN_MENU_HIDE_UNAUTHORIZED) ? $conf->global->MAIN_MENU_HIDE_UNAUTHORIZED : 0, 1); print ajax_constantonoff("MAIN_MENU_HIDE_UNAUTHORIZED", array(), $conf->entity, 0, 0, 1, 0, 0, 0, '', 'other'); print ''; - print ''; print ''; // Hide unauthorized button @@ -550,7 +543,6 @@ if ($mode == 'other') { //print $form->selectyesno('MAIN_BUTTON_HIDE_UNAUTHORIZED', isset($conf->global->MAIN_BUTTON_HIDE_UNAUTHORIZED) ? $conf->global->MAIN_BUTTON_HIDE_UNAUTHORIZED : 0, 1); print ajax_constantonoff("MAIN_BUTTON_HIDE_UNAUTHORIZED", array(), $conf->entity, 0, 0, 1, 0, 0, 0, '', 'other'); print ''; - print ''; print ''; // Hide version link @@ -559,7 +551,6 @@ if ($mode == 'other') { print ''; - print ''; print ''; */ @@ -569,7 +560,6 @@ if ($mode == 'other') { print ''; - print ''; print ''; // Hide wiki link on login page @@ -578,7 +568,6 @@ if ($mode == 'other') { print ajax_constantonoff("MAIN_HELP_DISABLELINK", array(), $conf->entity, 0, 0, 1, 0, 0, 0, '', 'other'); //print $form->selectyesno('MAIN_HELP_DISABLELINK', isset($conf->global->MAIN_HELP_DISABLELINK) ? $conf->global->MAIN_HELP_DISABLELINK : 0, 1); print ''; - print ''; print ''; // Disable javascript and ajax @@ -586,8 +575,6 @@ if ($mode == 'other') { print ajax_constantonoff("MAIN_DISABLE_JAVASCRIPT", array(), $conf->entity, 0, 0, 1, 0, 0, 0, '', 'other'); print ' ' . $langs->trans("DisableJavascriptNote") . ''; print ''; - print ''; print ''; print '
'; - print $langs->trans("Miscelaneous"); - print ''; - print '
' . $langs->trans("DefaultMaxSizeList") . ' 
' . $langs->trans("DefaultMaxSizeShortList") . ' 
'.$langs->trans("showInputBorder").''; print $form->selectyesno('main_showInputBorder',isset($conf->global->THEME_ELDY_SHOW_BORDER_INPUT)?$conf->global->THEME_ELDY_SHOW_BORDER_INPUT:0,1); print ' 
' . $langs->trans("WeekStartOnDay") . ''; print $formother->select_dayofweek((isset($conf->global->MAIN_START_WEEK) ? $conf->global->MAIN_START_WEEK : '1'), 'MAIN_START_WEEK', 0); print ' 
' . $langs->trans("DefaultWorkingDays") . ''; print ''; print ' 
' . $langs->trans("DefaultWorkingHours") . ''; print ''; print ' 
 
 
 
'.$langs->trans("HideVersionLink").''; print $form->selectyesno('MAIN_HIDE_VERSION',$conf->global->MAIN_HIDE_VERSION,1); print ' 
'; print ''; print ' 
 
'; - print '
' . "\n"; From 921aabfc54eb4610f26fc9c8dacc19cbabc54474 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 29 Apr 2022 14:11:38 +0200 Subject: [PATCH 270/738] Look and feel v16 --- htdocs/core/class/html.formfile.class.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index 1d3faca93cb..acb7d5b5f2a 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -246,10 +246,10 @@ class FormFile $out .= ''.$options.''; } $out .= ''; - $out .= ' '; - $out .= ''; + $out .= ' '; + $out .= ''; + $out .= ''; $out .= ''; $out .= ''; } From 223db9bb76f66af8e2ce341699bde4c58910180a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 29 Apr 2022 14:32:47 +0200 Subject: [PATCH 271/738] Fix: Not SetEventMessages inside a CRUD class. --- htdocs/compta/paiement/class/paiement.class.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/paiement/class/paiement.class.php b/htdocs/compta/paiement/class/paiement.class.php index c5f40896a18..ae4064462e2 100644 --- a/htdocs/compta/paiement/class/paiement.class.php +++ b/htdocs/compta/paiement/class/paiement.class.php @@ -419,7 +419,8 @@ class Paiement extends CommonObject } if ($error) { - setEventMessages($discount->error, $discount->errors, 'errors'); + $this->error = $discount->error; + $this->errors = $discount->errors; $error++; } } @@ -460,7 +461,8 @@ class Paiement extends CommonObject $result = $invoice->generateDocument($invoice->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref); if ($result < 0) { - setEventMessages($invoice->error, $invoice->errors, 'errors'); + $this->error = $invoice->error; + $this->errors = $invoice->errors; $error++; } } From 8b248c75f29eff7a9ab61846bdc7f23ee5bf8c05 Mon Sep 17 00:00:00 2001 From: John BOTELLA Date: Fri, 29 Apr 2022 15:10:15 +0200 Subject: [PATCH 272/738] Factor save --- htdocs/core/actions_massactions.inc.php | 58 +++++++------------------ 1 file changed, 15 insertions(+), 43 deletions(-) diff --git a/htdocs/core/actions_massactions.inc.php b/htdocs/core/actions_massactions.inc.php index 5f5703fc872..ccf2fbec73e 100644 --- a/htdocs/core/actions_massactions.inc.php +++ b/htdocs/core/actions_massactions.inc.php @@ -1602,56 +1602,29 @@ if (!$error && ($massaction == 'disable' || ($action == 'disable' && $confirm == } } -if (!$error && $action == 'confirm_edit_value_extrafields' && $confirm == 'yes' && $permissiontoadd){ +if (!$error && $action == 'confirm_edit_value_extrafields' && $confirm == 'yes' && $permissiontoadd) { $db->begin(); - /** @var CommonObject $objecttmp */ - $objecttmp = new $objectclass($db); - $nbok = 0; - $e = new ExtraFields($db); - $e->fetch_name_optionals_label($objecttmp->table_element); + $extrafieldKeyToUpdate = GETPOST('extrafield-key-yo-update'); // TODO A FAIRE coté formulaire : ajouter le select de l'extrafield a utiliser + $extrafieldKeyToUpdate = 'code_tva_achat'; // TODO A FAIRE coté formulaire : ajouter le select de l'extrafield a utiliser + + // TODO vérifier que $extrafieldKeyToUpdate correspond bien a un extrafield foreach ($toselect as $toselectid) { + /** @var CommonObject $objecttmp */ + $objecttmp = new $objectclass($db); $result = $objecttmp->fetch($toselectid); - if ($result>0) { - - if (isset($e->attributes[$objecttmp->table_element]['type']) && is_array($e->attributes[$objecttmp->table_element]['type'])) { - foreach ($e->attributes[$objecttmp->table_element]['type'] as $key => $type){ - - //Permet de gérer les types d'extrafields - if (in_array($type, array('price', 'double'))) { - $value_arr = GETPOST("options_".$key, 'alpha'); - if(empty($value_arr)){ - continue; - } - $value_key = price2num($value_arr); - //var_dump($value_key);exit; - }else if (in_array($type, array('date'))) { - // Clean parameters - $value_key = dol_mktime(12, 0, 0, GETPOST("options_" . $key . "month", 'int'), GETPOST("options_" . $key . "day", 'int'), GETPOST("options_" . $key . "year", 'int')); - //var_dump($value_key);exit; - if(empty($value_key)){ - continue; - } - }else if (in_array($type, array('datetime'))) { - // Clean parameters - $value_key = dol_mktime(GETPOST("options_".$key."hour", 'int'), GETPOST("options_".$key."min", 'int'), GETPOST("options_".$key."sec", 'int'), GETPOST("options_".$key."month", 'int'), GETPOST("options_".$key."day", 'int'), GETPOST("options_".$key."year", 'int'), 'tzuserrel'); - if(empty($value_key)){ - continue; - } - } else { - $value_key = GETPOST("options_".$key); - if ((in_array($type, array('link')) && $key == '-1') || empty($value_key)) { - continue; - } - } - $objecttmp->array_options["options_".$key] = $value_key; - } + // Fill array 'array_options' with data from add form + $e = new ExtraFields($db); + $ret = $e->setOptionalsFromPost(null, $objecttmp, $extrafieldKeyToUpdate); + if ($ret > 0) { + $objecttmp->insertExtraFields(); // TODO gérer l'erreur + } else { + $error++; + setEventMessages($objecttmp->error, $objecttmp->errors, 'errors'); } - $objecttmp->insertExtraFields(); - } else { setEventMessages($objecttmp->error, $objecttmp->errors, 'errors'); $error++; @@ -1669,7 +1642,6 @@ if (!$error && $action == 'confirm_edit_value_extrafields' && $confirm == 'yes' } else { $db->rollback(); } - } // Approve for leave only From 02cf3fa36102ecebd890d5d9d12652d01d1aad0d Mon Sep 17 00:00:00 2001 From: John BOTELLA Date: Fri, 29 Apr 2022 15:38:12 +0200 Subject: [PATCH 273/738] end factoring --- htdocs/core/actions_massactions.inc.php | 12 +++++++----- htdocs/core/tpl/massactions_pre.tpl.php | 6 +++++- htdocs/product/list.php | 2 +- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/htdocs/core/actions_massactions.inc.php b/htdocs/core/actions_massactions.inc.php index ccf2fbec73e..6308c33d268 100644 --- a/htdocs/core/actions_massactions.inc.php +++ b/htdocs/core/actions_massactions.inc.php @@ -1605,20 +1605,22 @@ if (!$error && ($massaction == 'disable' || ($action == 'disable' && $confirm == if (!$error && $action == 'confirm_edit_value_extrafields' && $confirm == 'yes' && $permissiontoadd) { $db->begin(); - $nbok = 0; + $objecttmp = new $objectclass($db); + $e = new ExtraFields($db);// fetch optionals attributes and labels + $e->fetch_name_optionals_label($objecttmp->table_element); - $extrafieldKeyToUpdate = GETPOST('extrafield-key-yo-update'); // TODO A FAIRE coté formulaire : ajouter le select de l'extrafield a utiliser - $extrafieldKeyToUpdate = 'code_tva_achat'; // TODO A FAIRE coté formulaire : ajouter le select de l'extrafield a utiliser + $nbok = 0; + $extrafieldKeyToUpdate = GETPOST('extrafield-key-to-update'); // TODO A FAIRE coté formulaire : ajouter le select de l'extrafield a utiliser // TODO vérifier que $extrafieldKeyToUpdate correspond bien a un extrafield foreach ($toselect as $toselectid) { /** @var CommonObject $objecttmp */ - $objecttmp = new $objectclass($db); + $objecttmp = new $objectclass($db); // to avoid ghost data $result = $objecttmp->fetch($toselectid); if ($result>0) { // Fill array 'array_options' with data from add form - $e = new ExtraFields($db); $ret = $e->setOptionalsFromPost(null, $objecttmp, $extrafieldKeyToUpdate); + if ($ret > 0) { $objecttmp->insertExtraFields(); // TODO gérer l'erreur } else { diff --git a/htdocs/core/tpl/massactions_pre.tpl.php b/htdocs/core/tpl/massactions_pre.tpl.php index 40394cb99ff..8e364cd24e1 100644 --- a/htdocs/core/tpl/massactions_pre.tpl.php +++ b/htdocs/core/tpl/massactions_pre.tpl.php @@ -212,7 +212,6 @@ if ($massaction == 'presend') { } if ($massaction == 'edit_extrafields') { - require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; $elementtype = 'product'; /** @var CommonObject $objecttmp */ @@ -225,6 +224,11 @@ if ($massaction == 'edit_extrafields') { if (!empty($extrafields_list)) { $myParamExtra = $object->showOptionals($extrafields, 'create'); + $formquestion[] = array( + 'type' => 'other', + 'value' => $form->selectarray('extrafield-key-to-update', $extrafields_list, GETPOST('extrafield-key-to-update')) + ); + $formquestion[] = array( 'type' => 'other', 'value' => $object->showOptionals($extrafields, 'create') diff --git a/htdocs/product/list.php b/htdocs/product/list.php index 7cd0a91c923..4824015c299 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -740,7 +740,7 @@ if ($resql) { $arrayofmassactions['switchonpurchasestatus'] = img_picto('', 'stop-circle', 'class="pictofixedwidth"').$langs->trans("SwitchOnPurchaseStatus"); $arrayofmassactions['preaffecttag'] = img_picto('', 'category', 'class="pictofixedwidth"').$langs->trans("AffectTag"); } - if (in_array($massaction, array('presend', 'predelete','preaffecttag'))) { + if (in_array($massaction, array('presend', 'predelete','preaffecttag', 'edit_extrafields'))) { $arrayofmassactions = array(); } $massactionbutton = $form->selectMassAction('', $arrayofmassactions); From 3dd90ecf416d7e62e94b20110f66d9ef84228568 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 29 Apr 2022 16:02:05 +0200 Subject: [PATCH 274/738] js escape --- htdocs/takepos/index.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/takepos/index.php b/htdocs/takepos/index.php index d934765b846..1b1608d53e7 100644 --- a/htdocs/takepos/index.php +++ b/htdocs/takepos/index.php @@ -946,7 +946,7 @@ if (empty($conf->global->TAKEPOS_HIDE_HEAD_BAR)) {
'; + print ''."\n"; + print '
'."\n"; - print "\n"; + print ''."\n"; // Show the file area only when this page is not opend from the Extended POS if ($contextpage != 'poslist') { diff --git a/htdocs/compta/sociales/list.php b/htdocs/compta/sociales/list.php index 8d63e52256e..082a485f817 100644 --- a/htdocs/compta/sociales/list.php +++ b/htdocs/compta/sociales/list.php @@ -713,16 +713,35 @@ while ($i < min($num, $limit)) { $totalarray['nbfield']++; } - print ''; + print ''."\n"; + $i++; } // Show total line include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php'; -print ''; -print ''; -print ''; +// If no record found +if ($num == 0) { + $colspan = 1; + foreach ($arrayfields as $key => $val) { + if (!empty($val['checked'])) { + $colspan++; + } + } + print ''.$langs->trans("NoRecordFound").''; +} + +$db->free($resql); + +$parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql); +$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object); // Note that $action and $object may have been modified by hook +print $hookmanager->resPrint; + +print ''."\n"; +print ''."\n"; + +print ''."\n"; // End of page llxFooter(); diff --git a/htdocs/compta/tva/list.php b/htdocs/compta/tva/list.php index f1731420852..5f76b2e9190 100644 --- a/htdocs/compta/tva/list.php +++ b/htdocs/compta/tva/list.php @@ -190,8 +190,8 @@ $sql .= $db->order($sortfield, $sortorder); $nbtotalofrecords = ''; if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) { - $result = $db->query($sql); - $nbtotalofrecords = $db->num_rows($result); + $resql = $db->query($sql); + $nbtotalofrecords = $db->num_rows($resql); // if total resultset is smaller then paging size (filtering), goto and load page 0 if (($page * $limit) > $nbtotalofrecords) { @@ -202,15 +202,15 @@ if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) { $sql .= $db->plimit($limit + 1, $offset); -$result = $db->query($sql); -if (!$result) { +$resql = $db->query($sql); +if (!$resql) { dol_print_error($db); llxFooter(); $db->close(); exit; } -$num = $db->num_rows($result); +$num = $db->num_rows($resql); $param = ''; if (!empty($contextpage) && $contextpage != $_SERVER['PHP_SELF']) { @@ -429,7 +429,7 @@ print ''; $i = 0; $totalarray = array(); while ($i < min($num, $limit)) { - $obj = $db->fetch_object($result); + $obj = $db->fetch_object($resql); $tva_static->id = $obj->rowid; $tva_static->ref = $obj->rowid; @@ -549,11 +549,27 @@ $totalarray['nbfield']++; // Show total line include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php'; -print ''; -print ''; -print ''; +// If no record found +if ($num == 0) { + $colspan = 1; + foreach ($arrayfields as $key => $val) { + if (!empty($val['checked'])) { + $colspan++; + } + } + print ''.$langs->trans("NoRecordFound").''; +} -$db->free($result); +$db->free($resql); + +$parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql); +$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object); // Note that $action and $object may have been modified by hook +print $hookmanager->resPrint; + +print ''."\n"; +print ''."\n"; + +print ''."\n"; // End of page llxFooter(); diff --git a/htdocs/contact/consumption.php b/htdocs/contact/consumption.php index 631bf932640..02813cee469 100644 --- a/htdocs/contact/consumption.php +++ b/htdocs/contact/consumption.php @@ -355,7 +355,7 @@ if (empty($elementTypeArray) && !$object->thirdparty->client && !$object->thirdp // Define type of elements $typeElementString = $form->selectarray("type_element", $elementTypeArray, GETPOST('type_element'), $showempty, 0, 0, '', 0, 0, $disabled, '', 'maxwidth150onsmartphone'); -$button = ''; +$button = ''; $param = ''; $param .= "&sref=".urlencode($sref); diff --git a/htdocs/contact/list.php b/htdocs/contact/list.php index 31b2153c2c8..93d61f8a903 100644 --- a/htdocs/contact/list.php +++ b/htdocs/contact/list.php @@ -1309,19 +1309,31 @@ while ($i < min($num, $limit)) { $i++; } +// Show total line +include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php'; + +// If no record found +if ($num == 0) { + $colspan = 1; + foreach ($arrayfields as $key => $val) { + if (!empty($val['checked'])) { + $colspan++; + } + } + print ''.$langs->trans("NoRecordFound").''; +} + $db->free($resql); $parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql); $reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; -print ""; -print ""; - -//if ($num > $limit || $page) print_barre_liste('', $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_companies.png', 0, '', '', $limit, 1); - -print ''; +print ''."\n"; +print ''."\n"; +print ''."\n"; +// End of page llxFooter(); $db->close(); diff --git a/htdocs/modulebuilder/template/myobject_list.php b/htdocs/modulebuilder/template/myobject_list.php index 8771ad0f9b6..9638eb4ce7f 100644 --- a/htdocs/modulebuilder/template/myobject_list.php +++ b/htdocs/modulebuilder/template/myobject_list.php @@ -811,7 +811,7 @@ if ($num == 0) { $db->free($resql); $parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql); -$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object); // Note that $action and $object may have been modified by hook +$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; print ''."\n"; diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php index 746b4dc0db0..e7b9e5097ea 100644 --- a/htdocs/societe/list.php +++ b/htdocs/societe/list.php @@ -863,9 +863,6 @@ $arrayofmassactions = array( // 'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"), ); //if($user->rights->societe->creer) $arrayofmassactions['createbills']=$langs->trans("CreateInvoiceForThisCustomer"); -if ($user->rights->societe->supprimer) { - $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete"); -} if ($user->rights->societe->creer) { $arrayofmassactions['preaffecttag'] = img_picto('', 'category', 'class="pictofixedwidth"').$langs->trans("AffectTag"); } @@ -881,6 +878,9 @@ if ($user->rights->societe->creer) { if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend', 'predelete', 'preaffecttag', 'preenable', 'preclose'))) { $arrayofmassactions = array(); } +if ($user->rights->societe->supprimer) { + $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete"); +} $massactionbutton = $form->selectMassAction('', $arrayofmassactions); $typefilter = ''; From e3ff7b43ab699f4d1a6dbe9a1b001d372a7b12d2 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 May 2022 11:39:55 +0200 Subject: [PATCH 442/738] Merge branch 'develop' of git@github.com:Dolibarr/dolibarr.git into develop --- htdocs/accountancy/journal/sellsjournal.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/htdocs/accountancy/journal/sellsjournal.php b/htdocs/accountancy/journal/sellsjournal.php index a4cda49af64..426bc6d7795 100644 --- a/htdocs/accountancy/journal/sellsjournal.php +++ b/htdocs/accountancy/journal/sellsjournal.php @@ -422,6 +422,9 @@ if ($action == 'writebookkeeping') { if ($k == getDolGlobalString('ACCOUNTING_ACCOUNT_CUSTOMER_DEPOSIT')) { $bookkeeping->subledger_account = $tabcompany[$key]['code_compta']; $bookkeeping->subledger_label = $tabcompany[$key]['name']; + } else { + $bookkeeping->subledger_account = ''; + $bookkeeping->subledger_label = ''; } } else { $bookkeeping->subledger_account = ''; From 7e94d53882ee35c99bf42182846a0b45a6842505 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 May 2022 11:51:39 +0200 Subject: [PATCH 443/738] Clean not used files --- build/makepack-dolibarr.pl | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/build/makepack-dolibarr.pl b/build/makepack-dolibarr.pl index 906601d94d4..b648bd7aff7 100755 --- a/build/makepack-dolibarr.pl +++ b/build/makepack-dolibarr.pl @@ -582,9 +582,7 @@ if ($nboftargetok) { $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/teclib*`; $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/timesheet*`; $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/webmail*`; - $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/themes/oblyon*`; - $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/themes/allscreen*`; - $ret=`rm -f $BUILDROOT/$PROJECT/htdocs/theme/common/octicons/LICENSE`; + $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/theme/common/fontawesome-5/svgs`; # Removed other test files $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/public/test`; From 218749ead4cdb8093a2b0487be0d4450d925682a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 May 2022 11:52:22 +0200 Subject: [PATCH 444/738] Merge branch 'develop' of git@github.com:Dolibarr/dolibarr.git into develop --- .../theme/common/weather/weather-clear-night.png | Bin 2276 -> 0 bytes htdocs/theme/common/weather/weather-clear.png | Bin 7439 -> 0 bytes .../common/weather/weather-clouds-night.png | Bin 4363 -> 0 bytes htdocs/theme/common/weather/weather-clouds.png | Bin 6267 -> 0 bytes .../common/weather/weather-few-clouds-night.png | Bin 2212 -> 0 bytes .../theme/common/weather/weather-few-clouds.png | Bin 5730 -> 0 bytes .../common/weather/weather-freezing-rain.png | Bin 5046 -> 0 bytes htdocs/theme/common/weather/weather-hail.png | Bin 5090 -> 0 bytes .../theme/common/weather/weather-many-clouds.png | Bin 4399 -> 0 bytes htdocs/theme/common/weather/weather-mist.png | Bin 1524 -> 0 bytes .../theme/common/weather/weather-showers-day.png | Bin 6954 -> 0 bytes .../common/weather/weather-showers-night.png | Bin 6123 -> 0 bytes .../weather/weather-showers-scattered-day.png | Bin 6317 -> 0 bytes .../weather/weather-showers-scattered-night.png | Bin 5171 -> 0 bytes .../common/weather/weather-showers-scattered.png | Bin 4937 -> 0 bytes htdocs/theme/common/weather/weather-showers.png | Bin 5138 -> 0 bytes .../theme/common/weather/weather-snow-rain.png | Bin 5406 -> 0 bytes .../weather/weather-snow-scattered-day.png | Bin 6823 -> 0 bytes .../weather/weather-snow-scattered-night.png | Bin 5583 -> 0 bytes .../common/weather/weather-snow-scattered.png | Bin 5038 -> 0 bytes htdocs/theme/common/weather/weather-snow.png | Bin 5332 -> 0 bytes .../theme/common/weather/weather-storm-day.png | Bin 7437 -> 0 bytes .../theme/common/weather/weather-storm-night.png | Bin 7471 -> 0 bytes htdocs/theme/common/weather/weather-storm.png | Bin 7261 -> 0 bytes 24 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 htdocs/theme/common/weather/weather-clear-night.png delete mode 100644 htdocs/theme/common/weather/weather-clear.png delete mode 100644 htdocs/theme/common/weather/weather-clouds-night.png delete mode 100644 htdocs/theme/common/weather/weather-clouds.png delete mode 100644 htdocs/theme/common/weather/weather-few-clouds-night.png delete mode 100644 htdocs/theme/common/weather/weather-few-clouds.png delete mode 100644 htdocs/theme/common/weather/weather-freezing-rain.png delete mode 100644 htdocs/theme/common/weather/weather-hail.png delete mode 100644 htdocs/theme/common/weather/weather-many-clouds.png delete mode 100644 htdocs/theme/common/weather/weather-mist.png delete mode 100644 htdocs/theme/common/weather/weather-showers-day.png delete mode 100644 htdocs/theme/common/weather/weather-showers-night.png delete mode 100644 htdocs/theme/common/weather/weather-showers-scattered-day.png delete mode 100644 htdocs/theme/common/weather/weather-showers-scattered-night.png delete mode 100644 htdocs/theme/common/weather/weather-showers-scattered.png delete mode 100644 htdocs/theme/common/weather/weather-showers.png delete mode 100644 htdocs/theme/common/weather/weather-snow-rain.png delete mode 100644 htdocs/theme/common/weather/weather-snow-scattered-day.png delete mode 100644 htdocs/theme/common/weather/weather-snow-scattered-night.png delete mode 100644 htdocs/theme/common/weather/weather-snow-scattered.png delete mode 100644 htdocs/theme/common/weather/weather-snow.png delete mode 100644 htdocs/theme/common/weather/weather-storm-day.png delete mode 100644 htdocs/theme/common/weather/weather-storm-night.png delete mode 100644 htdocs/theme/common/weather/weather-storm.png diff --git a/htdocs/theme/common/weather/weather-clear-night.png b/htdocs/theme/common/weather/weather-clear-night.png deleted file mode 100644 index f89b2ad8cada273150187dffce8aeae88aa91083..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2276 zcmVDgE0yw36#QR45dvp8emRp(IPtQNR*?KecbElxdV$G=m z&<5RKhOgXu@N(zBWb-_|)9kJ<(I#Wcv1$3U!S}!Wx$Y-!f7D4Ssmw_QQ1HV2Zu1rA z-F27KTxn<9#mB?PMOR8vQYwxl(+~gP2WeX*8Ond1krrtt53_Vw4E^=y_F4huNI3Y8!nT7X9zpNtHTLKp!x97?`AT)V@Q zKNuuJ*f;>%{r%6f=UwMHO{O4q8n}#zK?n{Zj?CC4Aj42$N%e|{! z{^oN2j`r@0cl_YhyHAtiQ7P>y%SfL$5sqF<^vaY8IRU3@nwLE6qWIQq z6hO}ZLHj*VY@RzHBLPYVtP@jG0wsn1GLRc0ERo=*j46pIsaRx3$GrI6J8kD3z_6ScOX!IHyDaOck`CWWtzVv6mr^FvlbU?Xm52?|Z_qg|iU=rT>+?c;Lij zRMI(+#S~WI^WS?u#KEQH2q^{23>nLYB}Vep*>R(XULN0W1OT&Md;i_StqBo14t>BO zCnZN1lw>T@W(k*=SmvyRl#p-;pMVOZJamkC=vo_RBLL2uw+FXaCBWqX70Z;Y$z*km z+#Zm#pEWXE3?)W>D5!)uV1kR~7&Qu9{{K7=zZ|}u6~K}Q@3~>vOUYI5KjW}mUSi3$ zFJC|F;qY^Y%+V$$qtL5U-6srLC1y=oaWJ=w8h^dyy}u^Fpiy3PiX(Lm1xIk0BcVY9 zkCK!cE-@2|qjt2+VHt76mG%**7RPBIYy*(IVQINWH?MYN{R~<)XsXaiJ8R%=5UanwW6eN1`^M0L4phjIO+l(xm;ZmNR|?4 zkTIZ1NrQPT2~9i|tHu8Q*m#tA)`7#l*#H>3MZ=QPW28{7oL>==Q86T?&jL96FcW}R1#y9;p`QrQu^&f|6M+PhWhW5d>|dJ9n1N>A{rZ>*mXeS;JT;^ap$5=-8WO;$EyeiilB+nV;efiKVIONWs53{0 zJ}&m>TcVi&43t;++_VUB@ilPvStX$W*)Ni}4ZeC}M=mh*@IV%AXm%cJOmo@ER$xQ~ zUzkg0lz{3=2ZL{=)M?SeW1>;Z(7`9BMGaR~&|()Iphl0Ow6?%lcFeFel|@(6QBs`w zBPKV@2(WEhf8R(=#G^rtruH@8qN|;>&DDU*k zr6;V)QZX5oLY#(q&Ok(s4lb66;`fIg7gtUxDFt8ztbIKtD$;m!nXDoG%D6Vp5fBMX7wWi5L*?JNLueBPuoopd6fYc)NQ~zkO6=_Ly}I z9t+ga01klmOGQp1%v^P1_2;q7&smLYcfZ0O3d05ggiu^#|J80Y*fSuYB;_c}twh1(G_mI_KOu_JPq0_M67Edt$rUq zW=ce&^t-sUG32Bq)Al`X^_F@>WlrP_Ngll6jGugtxy)`nEOYqusmq3y0>Mx_FDS8k z%?f3FVEesq@!@)WLT5-20^WD#pZTErUABikJQB5|CM{6vQ5F;&D^I|RZNC4k55Lk+ zgG}L1!dWtRf8(_mT7QUtnZBuE)M|H_#qB8jOIjWQRd~RgV$a9W7~(G_I|R@lsdR8^-t{Da~bc#-nqm7 z?=|L)hoP{ebi611arl+_k6r4Qt%zK~PtmzzgHyUmuu@xV4q892Pus=#qJs-hv)oO+ y%uyROr}}KU1u*Cjy`Vo7dc$jTZLZC=xqb};coKLhwc*160000 diff --git a/htdocs/theme/common/weather/weather-clear.png b/htdocs/theme/common/weather/weather-clear.png deleted file mode 100644 index ed1d48065f3fb3aee5b7d47cef6f0d869b6ccca7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7439 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 l$L+Wsx8ru)j@xlN{y+LoGz5R`r|zkH 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 UJ;M`Knu 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 M07*qoM6N<$f^50evj6}9 diff --git a/htdocs/theme/common/weather/weather-hail.png b/htdocs/theme/common/weather/weather-hail.png deleted file mode 100644 index 9df0bdc24d720eefffadef0e5bd4727de341b2db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5090 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 diff --git a/htdocs/theme/common/weather/weather-mist.png b/htdocs/theme/common/weather/weather-mist.png deleted file mode 100644 index a2b57a5e408e01d4324463b276d147fa6f97cf13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1524 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 diff --git a/htdocs/theme/common/weather/weather-showers-night.png b/htdocs/theme/common/weather/weather-showers-night.png deleted file mode 100644 index 1fff3febf5c3132287309a8eede8dd0e70c122be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6123 zcmV@ z1DIq-BoKQmGt1a^%RN z0|yR#_l<9Scw z#bVJE3I&tT=M6nc5+l#R8_eP<~4_mF`b_V2>VNL_25T8`cco{ z{oUU^OG@w-_9{@tQQi`G`FRfBT<{rv`O*J?GxIIPbVP_Vf8 zzz`0TlasSR;5X(1#<63^;vfI`$M5^pr#|%stvdw>zcK)L%fIe*uiGF(+p}`z%B5Jl zr>DmN0`5(0H=9kvSUdpb%H^^_ImUW!AWZ0Z2tWa#_abqL*|%@s2R`$e&wNU2PTyG& z0`v24!JquepUmICfB)YM4-YR@%o>zH0q#dfN6o~|=)(iR2n!D! z>n&cqn2>n?JKph*XG0T!`OEeIEQ)0+uYK)ne@|9@_Q=Qx7RUNN-WfA%JnwwN!UF>X zhIigm0E_tdM9Ebt)6mYJKX1;SJzLlK2fp{c@4Zgf_?PVgklsTj=(7>tTND6rbFApy znU3}SvnM+m0KgGSeWulFnNz1u@ys|vz>_3gLAdm3+-EhehdSez1^}Didh4yda?$rf zUy*pFV968tb7H)<$4lo#rh*Ha2E1T)1FxcdQB+9xSdj0PrE9 z#&{1P>p`%u*7y=Y|Dpl#m0m$YJ_jLr_EuM&j|(#lg$M=D`dmqW#5m8afn`w^(0q}E zCvfFGF>h|U)w(5}1gIx7MDbo)S*M0ww_I113o z0Hi|V*jIaANycLR@$qqkb!j~NvKTL6Z8}Ob4w8ikbq_%Xx_`Ve<|g&z=MKQjU;c6{ z;cT%O*l&I7TcsOsyz!n&OT#FHyQ8FMeUygXz1z~TILhEL0Kjipl6lN$9i>s$00=rB zg0lRM!bS%v#!wvsE?jbd{r(y4*=63(1%Ow-`qfs-l;pZYxm-|Ajj4#`*FW^34}Gzo zjZS*z)?4=(8bV@OU*zEKSdZ>&0h9tHz(66!pd>C%gBWpp)&d+F$}v|bMxzrY-UL8! z!72e!Qf6rVOgv!c&Yfo6x^-6Wm+BA`XyJmaIjrl}-Me=`rC2O1j^m^#!8Zlg4x}bE z8#it=mtTIlx#Ef|jW1zQR#hP&cp~&HPe%cSH>69(P~`acjJtU8B5ME?fcgPQI#0G>g04mUczh1#s5jS6}n%L0RPv2{AsJYxB>We*cmuh9D- zierl)+_PnWU%z?slb>RGtG(u`tFJ~dtm#jA z4^Lq{ow$C;XzaQQTH1WEpE;_07g1QVY)A@5&_q}T>#$y{`XsLK784# zRZm#5c=1CnUL3s`h`h?B(%ee5x>&-uP8>gRXw&9RkJf_2A~u`P7phsQ8qyIkvv@-O zM*x)8gGnv#tpsO)bU-OA!|y(qqZsZ=2=Ja-fohJ}_Kc6hSeNw)8$!W<7x38ya6DJ| zx?)sdP9oa>34jPDuLag^+_2$I#bW8QdGqEQ$gA7w+KGBSC=`n6x{;B4N$`R;v>9Q= zu9Stel;=a2=d;*15e1BTdWlT9*SxNTA3_1D!dXQS^IZk!%UTriQE2MPqG* zGFVuypQSKa(Nd%o3#L>orlC9{O%oF(amrYPbDRLEa``G&H21j2Jy6c*`+$UR82_fP!06TLias}9x?kmy%4S>)u&R?)#Lq5zE@K!lA z3*fd`GD}_7vaZ3au|7g|qb@FN+no%6RR0(9nwJl3kV+XV08?Ppg9EN8i*DP#Ll);q zT$#x-%x4U(Pw{-Od*9oPOELIBVMsXskCPvraPnV@XaL4In#(MExxHNv2qY;P1VKR= zK@p~0EQr;6(&=_5MK-C$PZsMXjq95 z0GnK?pirWA_qp2Y8DGhiwmHK-gpRI(bAn7{yw3{s6)RRs*)#BjFL(e!Ay=fHP{vqF z7#do$QD;5CVEiA7-|BY=0C+bW&6-fh6=ql+MbnOv8L9TzGhy`eb} zsz|X4AZ#c=nmRumHK$IVy0Bv9%70bLjUVuU2bkLhpwVc>VLmsVFXRJ%Cin87SVm-| zvZCzXGwyozOvS(Ltm(LyYw#4jB_ED%l3sEc%hD$5L$Q}S1Jt1H!HGImu6E3x*>b1 zu9%pNqE6CNDOG!W`@(zPd*Q;xAIinYtPKXm1p|RJM{%qL(ctm^h#Tv^-SZok z&ay@}Kjt^fJ6|!$7bUKoW?bqzMVRv-jo^2eO)O{#q|^%UP+{3CzM9|D zQyuB+@0+Kz`rS2aR@bh$;)-+z0RH>4Kl?Lk@l>oDojZR%H##~NoIH7|Q=6z4%RS|4 zz1}pFN--#ya~47Y1P~&mA}c>51E?h;FFbt7wEzHt8h2WjzG%@U(^m77$Ey<%L-UIbv*Qn_p^s^57>m4`bQVECzN zTdUVGAp~g|PZQCmkekg}u1HS14fDHtz?IZ==0@5Z5Ae;0MsKx(i%@H%5ytR5#9Y^D z`4AWi^Oh`GeD_9u{Ax1htdF7`D^oQv7qQJ1@;O6ib1`L?pA}G1J ztvugsO_~EE3#C_Ly*s*41t#B&7E_fV!2#-(vzNKXN3SI-MUll_J!joPVJF@P3VuQmjL+YH^0fJs}y3bHCmH| zfRr5cDUikded+|EN(5>0Kgzk^vz+Ye^kOlOw`64KNz5Ilq=ZE=0AWECVjOV|C|!ux zr8=Kc01WU$3~`$KR8s& z7Yb)p+YhNi9E1FXE+-coyOc#8fPx6`5k_#I0q~3hzY7?wMObh}Fj~U+G~oshWli-U zV|J%B`=Uge@rd^pTpKrc1);Add9rv4o?}U|lard??K-SoBn2M-(&x`P7){Y#}-P%IMrewt?;TsBi4 zZ^%34dFC7dPoO**!F|~QBx2QhO-5iSPs(I0r%kNv(=JyUS33K8VAKd7F6_xV7UC3v zLpkV=Q(`1rDwg`2t>(V|zQNHTNMkga)l@>7uYc{!-QBx(w1$U=#)atk@X+v9-EYbX z0Pkv`?c<+<2}Oa~ry*k86Bdfo5rQ-dA#x<<1bN#NXq@=+R^9OiV5jaMH3a*5md{$| zeePt+dP;6DOuQNB{s4V_WH2O$eDPdSUsl=NsInW00;==Jb?I*e7Ym0y5n!)zvan- zt}^5tLPbgC=sn8U3QiF~r+E_Wb^*#WzF{p2u{6>G4jAUJH=)WL3ct?8`1nU|7XaFS z{^x(#6DLj=nysm!o=Ro87OKj%8W-wGw^JG3x_+ShC|TplSKZXKJ2q4<)$DYa(>x%& zP{ER_S;|(eMMao0jzIm7Z;jeV-De;rR`G!BoRhdLVN(G1ATuTrQh3FWZ|d5iYS*k@ zR?e6p+fZKDO&#yRIWE&=->Fm=L<0kTAF}37wx>V+>2}SU&9+oZEgBp>s_alT`Aut< zZ`n82^ZO^716%Jo_fQ*IwOQT~mS-;J;EItvC6Mr`UbXZ-=f(!7Yhiq0V0&>({KGEE zJRjz2lhd72H%fXW_9Pyo@o`@M4^1dM$Dq6* zPP1-^odXrEzMvZ?$dfPQ`5d+O}<*vu)M3tt55QHfi|g zb-6abA06{=oWE|lP{41YGw1~aef|3h{0cPdJDH(ABxyQh_7lcKgL53zg^PRpheXs# z0(XUu?nE1xN@O~2NN`3<2mC{rPdrpmsv8qLV{_R_(G+S>+#vwYLB0C=? zm7GaNN)o>i)$v9mbXu%Wd)tt_;H$?Dx79XpE~+HkgltXOpt+y?^r0pfI#vEivs78! zHB1jJJ6HUrok06e3nx@z@9l|C-#VUcZ>nzS5r%Q}Od;*mF>yFoK(4opj5axOyuSKG zzEW9p_|09l`3Jv>i4CgxYFnoi1igz4h_~pJjK(^~gom8kl~-KWLToQRQ+qhpU4Bq( zmB3?ggxK@-$*i_fzBR$Ook^P7?jU3}M;r7WLv#mUvxB<|s&;<%_~7Z2$J9rT9MMzo z3o+(@?)$HzhdE%~GvrTTHeSk&1CWDl>AnhQFB_k6 z*>HDHZE5GGx4)?x=%}b~uPLh@megr*p2cKW^N92a8`h*T;^b@V+T>C>qoTAOy{#1; zT7^_IEbWvG$@c4WzWTT%XWyoL3d_eXG{`Z7&tvflx4&8jg$e^5Vr^w!seEj>a|FKy zf#*{$9Ji+*ySnZ?m*Sp!voUCC7Rz5fIpCc9@O?1gJ@4(n8+W$oICiTNF@ev_XV$T- z)0{8?!Cjb)%lzlOVwQUA`wnbY04`wi|L4KB44VUh!RLAq5Nt@mM7%}L>p#dH@}2$i znJdM8o_!=mFgck9nBq4vDB9N&!rfCA1UM@*1(*S<|p9ck9HZRUsKM|h;Y zbBadI}7f1wI=l3Vf~WJG%PW02sg5C^4#6kX_o4RN4*BY6b)w<8eKutyQMp z*3X~g5+ZN2a(BNG2CSx~tqe(z znm+L!&1YZ9YdHSmM*wtyH#zH$>F;oy0z!ecBqp%5w!Yn1r_gDX-Tk=CJLC4n-tl3} zz{#+~Wwwzo_ywnU1epsNfNqF|3;0V}9x;LM03d$PvBLV2EqC9eG4fKx%@4cZGr-E# z@P<4VbAeLQ)_Q%<%$>N#l*3>u$+7;%Zg7T^D1zCpxUAynzDGB|`Q99b^`;=Wl${qR>x{d-zlQ z2`KnkB9Xdb+N6Q(;CfEjicS42t2xQ|HmZqpMhaz;vjBz&(wuGT5e|3VaFQ}1YFky|kS^Pj(!{{xK{aIg7{JRtx8002ovPDHLkV1hti?<@cS diff --git a/htdocs/theme/common/weather/weather-showers-scattered-day.png b/htdocs/theme/common/weather/weather-showers-scattered-day.png deleted file mode 100644 index ae098117351df526fee6029e0a03bad1359ac36e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6317 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 diff --git a/htdocs/theme/common/weather/weather-showers-scattered-night.png b/htdocs/theme/common/weather/weather-showers-scattered-night.png deleted file mode 100644 index ad0283a08db6c9ea96cae7dc4e6705e128b0e9ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5171 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 Hu0mjfn)^)Q diff --git a/htdocs/theme/common/weather/weather-showers.png b/htdocs/theme/common/weather/weather-showers.png deleted file mode 100644 index 38cd41f03b512a5199eadd727722dfb41c233914..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5138 zcmV+t6z%JYP)PD5P(q*D+)^+-GfD_DT$ZB22dUe$kHxh<^R3s000000QjAhlH{Bv#^^3VRi%{T zTYKMn?_o}R?7g36c2`yJ{#C72#u#C(^*ZPCWyUI?>qvHNsp+wq?Jy^XlXZAMGcz+Y z^FOq_2bLK=Gc&_5Gv-V@0XyU1*w6I1ss5GvRdAT=r1IL;1=5vtrRuflWB>cV|NELt zF1h&MZomDu?|ti=-+aqI{^LKc{Oo5x>pk->~C2d8IT3K`=KtIraS;Zn)u#^YiluIyyS) zAO7%%^}Py2^uz%`>qO4|`}eEwe)qdhI-SnNaqM9{f`aY2TyDeq_3NLvV#SK*v=j;} zwbE7?Muc~YPVddT)DIp!_%rPDW$bbN3tsSoYN1e&cV^C+$DS+3qX`a~hfSL{sqNdh zlTmzhbd-8~dkI!n#bVJ~T3Q-_)nC}(-#>EOZMW?k9v=R4SaTd6Fo^j!@1=E2uIuSI zij+QIiD+SA;gX4oiO)avsZTx7+S(e)`2BZfo*xYW9CY=e4}Hk$>FI$kzpY;|rJQ!xP4N$05W zEiF4-*IikyR*wLHfTuURj?sMI*Vs3@codrRmw)+}1b6IQvu4f91_y_pHH&81 zmdd0v-MM^j5OP(f@0vb1GBW%^fYNE(7F#(FSBKKJa$Hw_i7Y4^sVL$ep9&ww0ScLC z2b|zkDwViatA+J?U7tL8l8ziXYFDcjr&g<5;1Pf2$_br^*d)gmh7a~W7wVvrS&;`kJS1Yw{fSl;4y z+y%h634jPL9%1IkvEH~;DlK2PZvFPI?jGIW*Ea%B8{)IcB76P1^(QCpocR9ap+moz znwr}Cp7*?G=?h=@LaZL8=43LNRBvD3X4kPjHk55Q`MXwEuI(r-I&%}@85mYttnVW3 zZQD*vZxQ}UCk>CcEv*d~m}Xga0crHTsdPGvb%oBZPQq(}NedBRPtRL6JUsHz<;#{o z!X2zf%7uMXFl^8H90w{ILyBHz3)9}PjM`p#N+WFu>wI5 zDv*?_R4Y`g*Ezm*?0Sk40f{Z!sQY4NN-6ER9;MSM5#ZF}_>EH$`F@}RKVTRzUx2i; z+1!940aFwv07qe#VkG(A0S z!IRwnfk6x58U4$@{G0!cZ+s(Iw{Bg$bLY+n6gmz#-!B$t5A^r-EP(@BK}2d{aZ%09 zFA#%~&1OM}SqWtp5CqAfKmkj`S_E!LgeQ`Bh72{?%1&DnGGP=62(gwJ5Jl06Y)d>S zol21&)^&7t zw)#O(nkyFf%@*e-78kF-dv;x}fY700%V6qm`S zNtD(ag0teTSP+a23ku3&Nr@f9{wi^75G2(bjb=6=0SiDY(U%wqYGy)9X<46835TMW za;;d$U4@pGS56(C>Wc9PT82~U$nfYc$d^eYTiKSyE~){@49NA;sj0~y?>}(orT_PT zlXLeAK&e!T9M`TRwF$$gyp%$M?|=VCQC^heFMa7t_XvdjmbbiK%`YrP9i1Ip z^10j^aZRQ9aE1DS0T4hi&MH9(n>^1Y2+QN7<4CM;EN{}DHoxpCm={L@X&Ka#A;K^e zzLAU*g))ys2?oKIJrk!Q;)p@IO#wfL8%GhMfwPh9nREf&Vp5I5$Ss#k^)L$JY%ZP8 z7YfeqT~7*EuU;A6a?35}kf7ypzM9^D=fQu@q%ys^e0DVDc@|sEb~rxMY#9+)plSN3 zlk!A)Gv;d?< zY7w3Rh$7j?G_8eziE9#45rq+H#?}xJF`%};~AwrzJ1m%GClIvaqsYuD1X z*IsL(LhISEVf}kiojoH;8gYzbToi^^uu@_*mO7ouP%fJl;gRnpb9l_~wK^@8mNXP$ zOOg>Dmes5@*(A!FyQm>T@QdsZP|v(f!J6VJXZbDbo6l#Vv;a(D5Sn+UOqVX_IvgNg z&(P4|&eGESjTkDQ1pqA0Kf+jW!*0IifpNK`AgT%>#$q8#*c*prpgao-Mi#5W9TndJ zB-Z&*H$}B-1xi_p3ngmG%|bzaEpd)+++4#04sl<2ap&zVtI%|CvqWILJDVu zO=P%-)`ieZ9|s zlI>(jD?wbkZVJK`pyME>MJX}_Ct;wHTOt=Sn9oelodx19#K=kz3rQr37|;w^iZ_A5 zMH!P(Os(L!LXu~C4)LCBFd)F|gn03{0l}>I@LBFR^;+%NWtUy1O$bQ)$VWb+;2Qqu z)@`>RnmYWKLxcVA0Lc{asvq@1FM}JZgsr&_h{W354cCfwg&t#z4$lbL;4 zh_e{UxNOXTSaKkd2nmj8pw|TiRFSNx%yAf`Q;G|L36Vl^Rzf_0txR;3j*ej)02o&@F&4-2w?dJkSl*lm#ia8%r+;+3v82*8moV;JD&$b@asnZXj^zvayB&2e4If1{ zzR(0W+<5aMZd`S2YL&`mO++HJ#CY;Kj1MA?xrFp6iR&g`poZsLomkfMQq9~hz~DjL zSgdGrzLk)qJPX-TVD!X~yf=i`EWzcYj47yO8hcL|iU&v-SR|o?E)(qjzJXW65YAGm z{CA}8qg`^zCA4qf{*>*wpDUa3;;$mVh@T*uD)L0Fnui~~Q{Iku@i zc!6!vE3e;MqVdgnC9N5^CZ`!dcpL?bMgv%+`C^3!olGV5i%W|1f+w|Ux#UPH6K|0{ z2=f_W12WHvqr};--5XFxAy8|UWdsFE4usbQ+VGBJQZNV-t8lgzwzswXHK_;KUiZ4! z(V8{Gl*wooP9Hv8S9V^x!|PUzPRwQhf4bZ@w!8aagJs2Gt_X4lbBTKsg=iLp=TNF( z+-}abjx9LROvl#LXn1wN$s9m0R_lHm*3Clfs&EBS;WTgPQ<*=tUk}iY zta|{!|1(L-nW#u@+iq&**5cIyXLECH{tkwp&Avf_ z<<8zZys7tp&vhufW4S^_zOb>kt*U##S6=&<@s}eM`vz zY*;RQW^NImlGS-K&@!NLJhgyF^-q%qaq5rWZR*SItgIA~Q<~3vHJ^E~l;zGh7K(UHy{P&rNXgVC zc82_P0*Z%`a>lNnOj4YCHMV9p3TXaF;qX$3a{k$3i$Iwv{1h@RvbKR z%iczdD4*~#_1j_;v31OjOpQliRW$FYS;_Exf}wpPx)y}9?ZWG#qxY()mYMQo#Sy2F zk|7qXvJ2mW8@uJxNUU1B{%bFOR@nXjPjO=xI%s(yN#f&yh20m^m`=qw{1lk(N@tpD zS3B{{a4JCEQur89(oHvyEWGZN*jf)7JPW4-xM!YN#;wZZL5+8AceTEGx;>~tXr+n7 zy>H$yD_OY17Sr>CHM$H3cic2I9{_adR5t_|wQ-=1UglK0NB*-ot?fTE-D%_$d1ipoP#>{0z#~K55lo}K? z82fjJ8U~C$N1SWa;OqJLnUI_Q{lrI}=@UJGmFobbE*3PHv(gc(u#SD8#x7D6>=-ZI zx?VY}NUVlDBu%+=b9(cV3h+!vAkgdl z;Ae*T=J)qfm@%eqnfvO^BPUOThLEa#<@tT{ud8KPgFC69|E5Q9m--lh3KFQvQqIlE zkKFZ{u5q$G@y;t}&j#O;Gs{5DvL)VGg%9|3-uk+#a^w~j=tuj&8d{mYd*<$&h*R3n z3NhrTzH&hnCA?5VKU0db0NMsL`&G# z;k7x}!v>OyXYY7cdgLJ$Ft#Ma=PZ27Es93xUUZ6Ao(BL5tn$y_omR8wj!%g0|Fbf5 ztMh2T^un@B($FdRGWz;BBrwF5sIgQEU%?||YJlln%Z0B&F)O!ey7ZE2W6z~eKtI}B z<1+>TTEv5QcDF6Ndgl~Tc|SMA$T>HbjC(TSTZC1fIp)aOc@;Dmc~%=0OyBmFYjW>6 zd_B}FyQ6{SQC>k5?AJq=#RIv33|~dB#09>BUG$)5%i@d63A{6}5M7lJT)uyN?-L)W z9AjGc!mj{@?rat9i08A~=5Ggv^QG4o16>hzO3x7ITnHlfMUGMfSKCi+p3&ij{g2GSY9qZ3N z1iiWQS3dgqy{9h0pAd=}d9g7=*C6;^`O9Bc0QlumPQBYJ-2eap07*qoM6N<$f~AW4 A)Bpeg diff --git a/htdocs/theme/common/weather/weather-snow-rain.png b/htdocs/theme/common/weather/weather-snow-rain.png deleted file mode 100644 index dc742aa1c4c7872fa28f7b862f5d710bd44318b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5406 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 IM6N<$g78RZ!~g&Q diff --git a/htdocs/theme/common/weather/weather-snow-scattered-day.png b/htdocs/theme/common/weather/weather-snow-scattered-day.png deleted file mode 100644 index 0048fec3df022aee9473c8896c1b34e2aef75ba7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6823 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 VXn=*I4|D(k002ovPDHLkV1hQR51{}6 diff --git a/htdocs/theme/common/weather/weather-snow-scattered-night.png b/htdocs/theme/common/weather/weather-snow-scattered-night.png deleted file mode 100644 index d8b0ccaa7ff12a3b92460a113a497ab758135e84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5583 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 m7ylScFu?>9OfbO&6J7#*#BHSJbzbfO0000; z1CT6D)`p*xnWgTT?wRSiw)y{S+qUfut`%4_xPi581=hCt857^VW6yLCT2+;2t7{!t zd*6t(pZ7%azb@gQBz*|*1RzB=Pr~pvLLExwz!b_D&_KBea))0R&rvma3m${E19W>4-SG`nUiu#fKmoppa1f!3|(cXYlk;K0g5Q9{@n#0^A58#?Z!UU_+5GQXvu5L@7#$6+#e4 zDfM1SO^J(6p3`wgiq%<6!WTOJDlZ0+9XN0nlrKHiiI0N}w7i zAVY%IJd6lss;Mx9CsDznDj=B%JzyKyRHZ3GQ=ugyo3DLO54Zm{4~r_hp0~Qziq)sz zSX!L@z_DY8!yo_nM?ZZ3``!fgCP+eQDFzL3)q?V*xOpx zqwSU+%KD5eae@g9dAny_-i)iv*2c|5rN%VEk}8W|`{`&l?Vt6ah1KLqt7}bD2!JGs zGzuf__4{*`SYH3W_r3GImtA&Q6Y&3Z0A<*p!;oNAY>WwOsO~`63moiha(sEx-zsDO z*<{D{hvTuM64v%2)=|ns)@#vSpQN*VRWIMV+x7&MeH*)N5LrLQ>)`77g@`tCZr%ZVUX}3q~!nd-kC$65n z!o1+%;?lZMKHlcW2*x^+B#|hJM8rszroNx1Ad=UHl3qX6cyn|67a#h-Tkp5Bve?Wr z4V%r?9*~WUjF@J#DL@L~_#1Tg>{)sC(&^yr*IZbOn#1bGPKt?cFjC#xeY|mL#M1Pw z+|c!Jxa$UYv_WLBZW}2dU#3#3Wh$Xyz!{{P{ReB!5uhoXzd#y3sV-i0I%W{i*bF*X-5YMoPS9j+)5 z0R`_>0X5c=Wx0r$L0_?dSNr``)|wlxT1|AcUiZ!gGMGOzJNxEGKjQAscl;T8*ux%X zY;kJ6*dUJMppqoJE7j^Ps+G#U&z?JX$Ab27p64cxk|_5%0Aoks*fM42_y43?p377t~wpY#xN6L{W^h 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 From 419fd940252948802230b477cbdc85d3bebc097f Mon Sep 17 00:00:00 2001 From: lvessiller Date: Tue, 10 May 2022 12:08:23 +0200 Subject: [PATCH 445/738] NEW uncheck send message when private message is checked --- htdocs/core/class/html.formticket.class.php | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/htdocs/core/class/html.formticket.class.php b/htdocs/core/class/html.formticket.class.php index aba62587fa1..331fe542cb4 100644 --- a/htdocs/core/class/html.formticket.class.php +++ b/htdocs/core/class/html.formticket.class.php @@ -1208,19 +1208,37 @@ class FormTicket jQuery(document).ready(function() { send_email=' . $send_email.'; if (send_email) { + if (!jQuery("#send_msg_email").is(":checked")) { + jQuery("#send_msg_email").prop("checked", true).trigger("change"); + } jQuery(".email_line").show(); } else { + if (!jQuery("#private_message").is(":checked")) { + jQuery("#private_message").prop("checked", true).trigger("change"); + } jQuery(".email_line").hide(); } jQuery("#send_msg_email").click(function() { if(jQuery(this).is(":checked")) { + if (jQuery("#private_message").is(":checked")) { + jQuery("#private_message").prop("checked", false).trigger("change"); + } jQuery(".email_line").show(); } else { jQuery(".email_line").hide(); } - });'; + }); + + jQuery("#private_message").click(function() { + if (jQuery(this).is(":checked")) { + if (jQuery("#send_msg_email").is(":checked")) { + jQuery("#send_msg_email").prop("checked", false).trigger("change"); + } + jQuery(".email_line").hide(); + } + });'; print '}); '; From ed13280ea10d932419615a0bb64199354b078e28 Mon Sep 17 00:00:00 2001 From: lmarcouiller Date: Tue, 10 May 2022 12:15:52 +0200 Subject: [PATCH 446/738] fix bug in select boxes --- htdocs/imports/import.php | 163 ++++++++++++++++---------------- htdocs/langs/en_US/exports.lang | 1 + 2 files changed, 85 insertions(+), 79 deletions(-) diff --git a/htdocs/imports/import.php b/htdocs/imports/import.php index a8fa3013ea2..d4b7ad4e4b6 100644 --- a/htdocs/imports/import.php +++ b/htdocs/imports/import.php @@ -35,8 +35,6 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/import.lib.php'; // Load translation files required by the page $langs->loadLangs(array('exports', 'compta', 'errors')); -$selectimport = true; - // Security check $result = restrictedArea($user, 'import'); @@ -321,54 +319,6 @@ if ($step == 4 && $action == 'select_model') { $_SESSION["dol_array_match_file_to_database"] = $serialized_array_match_file_to_database; } } - -if ($action == 'saveorder') { - // Enregistrement de la position des champs - dol_syslog("boxorder=".GETPOST('boxorder')." datatoimport=".GETPOST("datatoimport"), LOG_DEBUG); - $part = explode(':', GETPOST('boxorder')); - $colonne = $part[0]; - $list = $part[1]; - dol_syslog('column='.$colonne.' list='.$list); - - // Init targets fields array - $fieldstarget = $objimport->array_import_fields[0]; - - // Reinit match arrays. We redefine array_match_file_to_database - $serialized_array_match_file_to_database = ''; - $array_match_file_to_database = array(); - $fieldsarray = explode(',', $list); - $pos = 0; - foreach ($fieldsarray as $fieldnb) { // For each elem in list. fieldnb start from 1 to ... - // Get name of database fields at position $pos and put it into $namefield - $posbis = 0; $namefield = ''; - foreach ($fieldstarget as $key => $val) { // key: val: - //dol_syslog('AjaxImport key='.$key.' val='.$val); - if ($posbis < $pos) { - $posbis++; - continue; - } - // We found the key of targets that is at position pos - $namefield = $key; - //dol_syslog('AjaxImport Field name found for file field nb '.$fieldnb.'='.$namefield); - - break; - } - - if ($fieldnb && $namefield) { - $array_match_file_to_database[$fieldnb] = $namefield; - if ($serialized_array_match_file_to_database) { - $serialized_array_match_file_to_database .= ','; - } - $serialized_array_match_file_to_database .= ($fieldnb.'='.$namefield); - } - - $pos++; - } - - // We save new matching in session - $_SESSION["dol_array_match_file_to_database"] = $serialized_array_match_file_to_database; - dol_syslog('dol_array_match_file_to_database='.$serialized_array_match_file_to_database); -} if ($action == 'saveselectorder') { // Enregistrement de la position des champs $serialized_array_match_file_to_database = ''; @@ -793,7 +743,7 @@ if ($step == 3 && $datatoimport) { // STEP 4: Page to make matching between source file and database fields -if ($step == 4 && $datatoimport && $selectimport) { +if ($step == 4 && $datatoimport) { $serialized_array_match_file_to_database = isset($_SESSION["dol_array_match_file_to_database_select"]) ? $_SESSION["dol_array_match_file_to_database_select"] : ''; $array_match_file_to_database = array(); $fieldsarray = explode(',', $serialized_array_match_file_to_database); @@ -885,7 +835,8 @@ if ($step == 4 && $datatoimport && $selectimport) { $array_match_database_to_file = array_flip($array_match_file_to_database); $fieldstarget_tmp = array(); - + $arraykeysfieldtarget = array_keys($fieldstarget); + $position = 0; foreach ($fieldstarget as $key => $label) { $isrequired = preg_match('/\*$/', $label); if (!empty($isrequired)) { @@ -896,9 +847,27 @@ if ($step == 4 && $datatoimport && $selectimport) { } if (!empty($array_match_database_to_file[$key])) { $fieldstarget_tmp[$key]["imported"] = true; + $fieldstarget_tmp[$key]["position"] = $array_match_database_to_file[$key]-1; + $keytoswap = $key; + while (!empty($array_match_database_to_file[$keytoswap])) { + if ($position+1 > $array_match_database_to_file[$keytoswap]) { + $keytoswapwith = $array_match_database_to_file[$keytoswap]-1; + $tmp = [$keytoswap=>$fieldstarget_tmp[$keytoswap]]; + unset($fieldstarget_tmp[$keytoswap]); + $fieldstarget_tmp = arrayInsert($fieldstarget_tmp, $keytoswapwith, $tmp); + $keytoswapwith = $arraykeysfieldtarget[$array_match_database_to_file[$keytoswap]-1]; + $tmp = $fieldstarget_tmp[$keytoswapwith]; + unset($fieldstarget_tmp[$keytoswapwith]); + $fieldstarget_tmp[$keytoswapwith] = $tmp; + $keytoswap = $keytoswapwith; + } else { + break; + } + } } else { $fieldstarget_tmp[$key]["imported"] = false; } + $position++; } $fieldstarget = $fieldstarget_tmp; @@ -1144,7 +1113,6 @@ if ($step == 4 && $datatoimport && $selectimport) { print ''; print $optionsnotused; print ''; - //print ajax_combobox("select_".$newlabel); print ""; print ''; $filecolumn = !empty($array_match_database_to_file[$code])?$array_match_database_to_file[$code]:0; @@ -1210,7 +1178,7 @@ if ($step == 4 && $datatoimport && $selectimport) { print ''; // List of not imported fields - print ''.$langs->trans("NotImportedFields").''; + print ''.$langs->trans("NotUsedFields").''; print ''; @@ -1261,15 +1229,42 @@ if ($step == 4 && $datatoimport && $selectimport) { print '$(".targetselectchange").focus(function(){'."\n"; print 'previousselectedvalueimport = $(this).val();'."\n"; print 'previousselectedlabelimport = $(this).children("option:selected").text();'."\n"; + print 'console.log(previousselectedvalueimport)'."\n"; print '})'."\n"; print '$(".targetselectchange").change(function(){'."\n"; print 'if(previousselectedlabelimport != "" && previousselectedvalueimport != -1){'."\n"; - print '$(".targetselectchange").not($( this )).append(new Option(previousselectedlabelimport,previousselectedvalueimport));'."\n"; + print '$(".targetselectchange").not($(this)).append(new Option(previousselectedlabelimport,previousselectedvalueimport));'."\n"; + print 'let valuetochange = $(this).val(); '."\n"; + print '$(".boxtdunused").each(function(){'."\n"; + print 'if ($(this).text().includes(valuetochange)){'."\n"; + print 'arraychild = $(this)[0].childNodes'."\n"; + print 'arraytexttomodify = arraychild[0].textContent.split(" ")'."\n"; + print 'arraytexttomodify[1] = previousselectedvalueimport '."\n"; + print 'textmodified = arraytexttomodify.join(" ") '."\n"; + print 'arraychild[0].textContent = textmodified'."\n"; + print 'arraychild[1].innerHTML = previousselectedlabelimport'."\n"; + print '}'."\n"; + print '})'."\n"; print '}'."\n"; print 'if($( this ).val() != -1){'."\n"; print '$(".targetselectchange").not($( this )).find(\'option[value="\'+$( this ).val()+\'"]\').remove();'."\n"; - print '$(".targetselectchange").not($( this )).find(\'option[value="\'+$( this ).val()+\'"]\').remove();'."\n"; print '}'."\n"; + print '$(this).blur()'."\n"; + print 'arrayselectedfields = [];'."\n"; + print 'arrayselectedfields.push("0");'."\n"; + print '$(".targetselectchange").each(function(){'."\n"; + print 'value = $(this).val()'."\n"; + print 'arrayselectedfields.push(value);'."\n"; + print '});'."\n"; + print '$.ajax({'."\n"; + print 'type: "POST",'."\n"; + print 'dataType: "json",'."\n"; + print 'url: "'.$_SERVER["PHP_SELF"].'?action=saveselectorder",'."\n"; + print 'data: "selectorder="+arrayselectedfields.toString(),'."\n"; + print 'success: function(){'."\n"; + print 'console.log("Select order saved");'."\n"; + print '},'."\n"; + print '});'."\n"; print '});'."\n"; print '})'."\n"; print ''."\n"; @@ -1282,31 +1277,10 @@ if ($step == 4 && $datatoimport && $selectimport) { if (count($array_match_file_to_database)) { if ($mandatoryfieldshavesource) { - print ''.$langs->trans("NextStep").''; + print ''.$langs->trans("NextStep").''; } else { print ''.$langs->trans("NextStep").''; } - if ($conf->use_javascript_ajax) { - print ''."\n"; - } } print ''; @@ -2238,7 +2212,11 @@ function show_elem($fieldssource, $pos, $key, $var, $nostyle = '') // The image must have the class 'boxhandle' beause it's value used in DOM draggable objects to define the area used to catch the full object //print img_picto($langs->trans("MoveField", $pos), 'grip_title', 'class="boxhandle" style="cursor:move;"'); print ''; - print ''; + if (isset($fieldssource[$pos]['imported']) && $fieldssource[$pos]['imported'] == false) { + print ''; + } else { + print ''; + } print $langs->trans("Field").' '.$pos; if (empty($fieldssource[$pos]['example1'])) { $example = $fieldssource[$pos]['label']; @@ -2289,3 +2267,30 @@ function getnewkey(&$fieldssource, &$listofkey) $listofkey[$i] = 1; return $i; } +/** + * Return array with element inserted in it at position $position + * + * @param array $array Array of field source + * @param mixed $position key of postion to insert to + * @param array $insertArray Array to insert + * @return array + */ +function arrayInsert($array, $position, $insertArray) +{ + $ret = []; + + if ($position == count($array)) { + $ret = $array + $insertArray; + } else { + $i = 0; + foreach ($array as $key => $value) { + if ($position == $i++) { + $ret += $insertArray; + } + + $ret[$key] = $value; + } + } + + return $ret; +} diff --git a/htdocs/langs/en_US/exports.lang b/htdocs/langs/en_US/exports.lang index a20741472b7..44cb98d3679 100644 --- a/htdocs/langs/en_US/exports.lang +++ b/htdocs/langs/en_US/exports.lang @@ -136,3 +136,4 @@ NbUpdate=Number of updated lines: %s MultipleRecordFoundWithTheseFilters=Multiple records have been found with these filters: %s StocksWithBatch=Stocks and location (warehouse) of products with batch/serial number WarningFirstImportedLine=The first line(s) will not be imported with the current selection +NotUsedFields=Fields of database not used \ No newline at end of file From 6f8eef9550fd9c886b7f8229cd98f29ef62e19d0 Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Tue, 10 May 2022 12:56:22 +0200 Subject: [PATCH 447/738] FIX missing executeHooks --- htdocs/install/upgrade2.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/htdocs/install/upgrade2.php b/htdocs/install/upgrade2.php index cda8fc0bc13..f7a97c8af82 100644 --- a/htdocs/install/upgrade2.php +++ b/htdocs/install/upgrade2.php @@ -173,7 +173,12 @@ if (!GETPOST('action', 'aZ09') || preg_match('/upgrade/i', GETPOST('action', 'aZ // Create the global $hookmanager object include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php'; $hookmanager = new HookManager($db); - $reshook = $hookmanager->initHooks(array('doUpgradeBefore')); + $hookmanager->initHooks(array('upgrade2')); + + $parameters = array('versionfrom' => $versionfrom, 'versionto' => $versionto); + $object = new stdClass(); + $action = "upgrade"; + $reshook = $hookmanager->executeHooks('doUpgradeBefore', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks if ($reshook >= 0 && is_array($hookmanager->resArray)) { // Example: $hookmanager->resArray = array(2, 3, 10); $listofentities = array_unique(array_merge($listofentities, $hookmanager->resArray)); From 8692038be2c48980ea19191998843cdf1df76440 Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Tue, 10 May 2022 14:03:09 +0200 Subject: [PATCH 448/738] FIX missing loading of global conf --- htdocs/install/upgrade2.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/htdocs/install/upgrade2.php b/htdocs/install/upgrade2.php index cda8fc0bc13..1818a1bc327 100644 --- a/htdocs/install/upgrade2.php +++ b/htdocs/install/upgrade2.php @@ -167,6 +167,9 @@ if (!GETPOST('action', 'aZ09') || preg_match('/upgrade/i', GETPOST('action', 'aZ } $conf->db->dolibarr_main_db_cryptkey = $dolibarr_main_db_cryptkey; + // Load global conf + $conf->setValues($db); + $listofentities = array(1); @@ -4616,7 +4619,7 @@ function migrate_user_photospath2() if ($entity > 1) { $dir = DOL_DATA_ROOT.'/'.$entity.'/users'; } else { - $dir = $conf->user->multidir_output[$entity]; // $conf->user->multidir_output[] for each entity is construct by the multicompany module + $dir = DOL_DATA_ROOT.'/users'; } if ($dir) { From 91d539bbefc24f2c8693887a05b014ce6d51e2cb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 May 2022 14:38:40 +0200 Subject: [PATCH 449/738] Clean code of not used method --- htdocs/core/class/cunits.class.php | 30 ++++++++++++------- htdocs/core/class/validate.class.php | 15 ++++++---- .../class/ProductCombination.class.php | 25 ++++++++++------ 3 files changed, 44 insertions(+), 26 deletions(-) diff --git a/htdocs/core/class/cunits.class.php b/htdocs/core/class/cunits.class.php index d7571b8ca90..dfc22fd37ec 100644 --- a/htdocs/core/class/cunits.class.php +++ b/htdocs/core/class/cunits.class.php @@ -463,22 +463,30 @@ class CUnits // extends CommonObject } /** - * get scale of unit factor - * @param int $id id of unit in dictionary - * @return float|int + * Get scale of unit factor + * + * @param int $id Id of unit in dictionary + * @return float|int Scale of unit */ public function scaleOfUnitPow($id) { $base = 10; - // TODO : add base col into unit dictionary table - $unit = $this->db->getRow("SELECT scale, unit_type from ".$this->db->prefix()."c_units WHERE rowid = ".intval($id)); - if ($unit) { - // TODO : if base exist in unit dictionary table remove this convertion exception and update convertion infos in database exemple time hour currently scale 3600 will become scale 2 base 60 - if ($unit->unit_type == 'time') { - return floatval($unit->scale); - } - return pow($base, floatval($unit->scale)); + $sql = "SELECT scale, unit_type FROM ".$this->db->prefix()."c_units WHERE rowid = ".((int) $id); + + $resql = $this->db->query($sql); + if ($resql) { + // TODO : add base col into unit dictionary table + $unit = $this->db->fetch_object($sql); + if ($unit) { + // TODO : if base exists in unit dictionary table, remove this convertion exception and update convertion infos in database. + // Example time hour currently scale 3600 will become scale 2 base 60 + if ($unit->unit_type == 'time') { + return floatval($unit->scale); + } + + return pow($base, floatval($unit->scale)); + } } return 0; diff --git a/htdocs/core/class/validate.class.php b/htdocs/core/class/validate.class.php index d3aa5707c05..ac4c14f7937 100644 --- a/htdocs/core/class/validate.class.php +++ b/htdocs/core/class/validate.class.php @@ -281,14 +281,17 @@ class Validate } foreach ($value_arr as $val) { - $sql = "SELECT ".$col." FROM ".$this->db->prefix().$table." WHERE ".$col." = '".$this->db->escape($val)."'"; // nore quick than count(*) to check existing of a row - $resql = $this->db->getRow($sql); + $sql = "SELECT ".$col." FROM ".$this->db->prefix().$table." WHERE ".$col." = '".$this->db->escape($val)."' LIMIT 1"; // more quick than count(*) to check existing of a row + $resql = $this->db->query($sql); if ($resql) { - continue; - } else { - $this->error = $this->outputLang->trans('RequireValidExistingElement'); - return false; + $obj = $this->db->fetch_object($resql); + if ($obj) { + continue; + } } + // If something was wrong + $this->error = $this->outputLang->trans('RequireValidExistingElement'); + return false; } return true; diff --git a/htdocs/variants/class/ProductCombination.class.php b/htdocs/variants/class/ProductCombination.class.php index 2de511811a7..63e721c0d37 100644 --- a/htdocs/variants/class/ProductCombination.class.php +++ b/htdocs/variants/class/ProductCombination.class.php @@ -1057,12 +1057,16 @@ class ProductCombinationLevel */ public function fetch($rowid) { - $sql = "SELECT rowid, fk_product_attribute_combination, fk_price_level, variation_price, variation_price_percentage FROM ".MAIN_DB_PREFIX.$this->table_element." WHERE rowid = ".(int) $rowid; + $sql = "SELECT rowid, fk_product_attribute_combination, fk_price_level, variation_price, variation_price_percentage"; + $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element; + $sql .= " WHERE rowid = ".(int) $rowid; - $obj = $this->db->getRow($sql); - - if ($obj) { - return $this->fetchFormObj($obj); + $resql = $this->db->query($sql); + if ($resql) { + $obj = $this->db->fetch_object($resql); + if ($obj) { + return $this->fetchFormObj($obj); + } } return -1; @@ -1141,11 +1145,14 @@ class ProductCombinationLevel $sql = "SELECT rowid id"; $sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element; $sql .= " WHERE fk_product_attribute_combination = ".(int) $this->fk_product_attribute_combination; - $sql .= ' AND fk_price_level = '.intval($this->fk_price_level); + $sql .= ' AND fk_price_level = '.((int) $this->fk_price_level); - $existObj = $this->db->getRow($sql); - if ($existObj) { - $this->id = $existObj->id; + $resql = $this->db->query($sql); + if ($resql) { + $obj = $this->db->fetch_object($resql); + if ($obj) { + $this->id = $obj->id; + } } } From 8ef75ecc7c1dd5f47e59c7af5f676cf2870e8ff3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 May 2022 15:27:43 +0200 Subject: [PATCH 450/738] Better fix fox #20807 --- htdocs/compta/bank/line.php | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/htdocs/compta/bank/line.php b/htdocs/compta/bank/line.php index d1750a0bb94..90a35b30c86 100644 --- a/htdocs/compta/bank/line.php +++ b/htdocs/compta/bank/line.php @@ -52,11 +52,12 @@ if (!empty($conf->salaries->enabled)) { $id = GETPOST('rowid', 'int'); -$accountid = (GETPOST('id', 'int') ? GETPOST('id', 'int') : GETPOST('account', 'int')); +$rowid = GETPOST("rowid", 'int'); +$accountoldid = GETPOST('account', 'int'); // GETPOST('account') is old account id +$accountid = GETPOST('accountid', 'int'); // GETPOST('accountid') is new account id $ref = GETPOST('ref', 'alpha'); $action = GETPOST('action', 'aZ09'); $confirm = GETPOST('confirm', 'alpha'); -$rowid = GETPOST("rowid", 'int'); $orig_account = GETPOST("orig_account"); $backtopage = GETPOST('backtopage', 'alpha'); $cancel = GETPOST('cancel', 'alpha'); @@ -68,7 +69,7 @@ if ($user->socid) { $socid = $user->socid; } -$result = restrictedArea($user, 'banque', $accountid, 'bank_account'); +$result = restrictedArea($user, 'banque', $accountoldid, 'bank_account'); if (!$user->rights->banque->lire && !$user->rights->banque->consolidate) { accessforbidden(); } @@ -126,15 +127,19 @@ if ($user->rights->banque->modifier && $action == "update") { $acline->fetch($rowid); $acsource = new Account($db); - $acsource->fetch($id); + $acsource->fetch($accountoldid); $actarget = new Account($db); if (GETPOST('accountid', 'int') > 0 && !$acline->rappro && !$acline->getVentilExportCompta()) { // We ask to change bank account $actarget->fetch(GETPOST('accountid', 'int')); } else { - $actarget->fetch($id); + $actarget->fetch($accountoldid); } + if (!($actarget->id > 0)) { + setEventMessages($langs->trans("ErrorFailedToLoadBankAccount"), null, 'errors'); + $error++; + } if ($actarget->courant == Account::TYPE_CASH && GETPOST('value', 'alpha') != 'LIQ') { setEventMessages($langs->trans("ErrorCashAccountAcceptsOnlyCashMoney"), null, 'errors'); $error++; @@ -228,7 +233,7 @@ if ($user->rights->banque->consolidate && ($action == 'num_releve' || $action == $db->begin(); $sql = "UPDATE ".MAIN_DB_PREFIX."bank"; - $sql .= " SET num_releve=".($num_rel ? "'".$db->escape($num_rel)."'" : "null"); + $sql .= " SET num_releve = ".($num_rel ? "'".$db->escape($num_rel)."'" : "null"); if (empty($num_rel)) { $sql .= ", rappro = 0"; } else { @@ -302,7 +307,6 @@ if ($result) { print ''; print ''; print ''; - print ''; print dol_get_fiche_head($head, 'bankline', $langs->trans('LineRecord'), 0, 'accountline', 0); @@ -607,11 +611,7 @@ if ($result) { print dol_get_fiche_end(); - if (!$objp->rappro) { - print '

    '; - } else { - print '

    '; - } + print '

    '; print ""; From f28dd2827bbbbddef81e2eead50cad2efd86f8c3 Mon Sep 17 00:00:00 2001 From: kevin Date: Tue, 10 May 2022 15:41:38 +0200 Subject: [PATCH 451/738] Update Ticket::setProject method signature --- htdocs/ticket/class/ticket.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/ticket/class/ticket.class.php b/htdocs/ticket/class/ticket.class.php index d63fa68dbfb..2d517be8ef0 100644 --- a/htdocs/ticket/class/ticket.class.php +++ b/htdocs/ticket/class/ticket.class.php @@ -2020,7 +2020,7 @@ class Ticket extends CommonObject * @param int $projectid Project id to link element to * @return int <0 if KO, >0 if OK */ - public function setProject($projectid) + public function setProject($projectid, $notrigger = 0) { if (!$this->table_element) { dol_syslog(get_class($this)."::setProject was called on objet with property table_element not defined", LOG_ERR); From a10e8c369656795d4ffe700e6ee070235c0cb65d Mon Sep 17 00:00:00 2001 From: kevin Date: Tue, 10 May 2022 15:44:41 +0200 Subject: [PATCH 452/738] Remove method Ticket::setProject because method already defined into parent CommonObject --- htdocs/ticket/class/ticket.class.php | 32 ---------------------------- 1 file changed, 32 deletions(-) diff --git a/htdocs/ticket/class/ticket.class.php b/htdocs/ticket/class/ticket.class.php index 2d517be8ef0..72ec8625e0e 100644 --- a/htdocs/ticket/class/ticket.class.php +++ b/htdocs/ticket/class/ticket.class.php @@ -2013,38 +2013,6 @@ class Ticket extends CommonObject } } - /** - * Link element with a project - * Override core function because of key name 'fk_project' used for this module - * - * @param int $projectid Project id to link element to - * @return int <0 if KO, >0 if OK - */ - public function setProject($projectid, $notrigger = 0) - { - if (!$this->table_element) { - dol_syslog(get_class($this)."::setProject was called on objet with property table_element not defined", LOG_ERR); - return -1; - } - - $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element; - if ($projectid) { - $sql .= ' SET fk_project = '.((int) $projectid); - } else { - $sql .= ' SET fk_project = NULL'; - } - $sql .= ' WHERE rowid = '.((int) $this->id); - - dol_syslog(get_class($this)."::setProject sql=".$sql); - if ($this->db->query($sql)) { - $this->fk_project = ((int) $projectid); - return 1; - } else { - dol_print_error($this->db); - return -1; - } - } - /** * Link element with a contract * From 7e439a824848546a539229f3fd19de4e5fabcf1d Mon Sep 17 00:00:00 2001 From: lmarcouiller Date: Tue, 10 May 2022 15:50:01 +0200 Subject: [PATCH 453/738] add of selectimportfieldsource in lang --- htdocs/imports/import.php | 8 +++++--- htdocs/langs/en_US/exports.lang | 3 ++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/htdocs/imports/import.php b/htdocs/imports/import.php index d4b7ad4e4b6..15d83cfe8e7 100644 --- a/htdocs/imports/import.php +++ b/htdocs/imports/import.php @@ -791,8 +791,10 @@ if ($step == 4 && $datatoimport) { // Put into array fieldssource starting with 1. $i = 1; foreach ($arrayrecord as $key => $val) { - $fieldssource[$i]['example1'] = dol_trunc($val['val'], 24); - $i++; + if ($val["type"] != -1) { + $fieldssource[$i]['example1'] = dol_trunc($val['val'], 24); + $i++; + } } $obj->import_close_file(); } @@ -994,7 +996,7 @@ if ($step == 4 && $datatoimport) { print '
    '; print ''; - $s = $langs->trans("SelectImportFields", '{s1}'); + $s = $langs->trans("SelectImportFieldsSource", '{s1}'); $s = str_replace('{s1}', img_picto('', 'grip_title', '', false, 0, 0, '', '', 0), $s); print $s; print ' '; diff --git a/htdocs/langs/en_US/exports.lang b/htdocs/langs/en_US/exports.lang index 44cb98d3679..e7ac91e5722 100644 --- a/htdocs/langs/en_US/exports.lang +++ b/htdocs/langs/en_US/exports.lang @@ -136,4 +136,5 @@ NbUpdate=Number of updated lines: %s MultipleRecordFoundWithTheseFilters=Multiple records have been found with these filters: %s StocksWithBatch=Stocks and location (warehouse) of products with batch/serial number WarningFirstImportedLine=The first line(s) will not be imported with the current selection -NotUsedFields=Fields of database not used \ No newline at end of file +NotUsedFields=Fields of database not used +SelectImportFieldsSource = Choose the source file fields you want to import and their target field in database by choosing the fields in each select boxes, or select a predefined import profile: From fea6771a7a883bbcd64a8e87656ddaec8389ee62 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 May 2022 15:57:52 +0200 Subject: [PATCH 454/738] Module Partnership is stable --- htdocs/core/modules/modPartnership.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/modPartnership.class.php b/htdocs/core/modules/modPartnership.class.php index f37d7d2403d..8ebbd3029b7 100644 --- a/htdocs/core/modules/modPartnership.class.php +++ b/htdocs/core/modules/modPartnership.class.php @@ -75,7 +75,7 @@ class modPartnership extends DolibarrModules // $this->editor_url = 'https://www.example.com'; // Possible values for version are: 'development', 'experimental', 'dolibarr', 'dolibarr_deprecated' or a version string like 'x.y.z' - $this->version = 'experimental'; + $this->version = 'dolibarr'; // Url to the file with your last numberversion of this module //$this->url_last_version = 'http://www.example.com/versionmodule.txt'; From c9a0dd327f8e2886329a56421759f119a7d5d09b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 May 2022 16:04:20 +0200 Subject: [PATCH 455/738] Fix default value --- htdocs/core/lib/company.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/company.lib.php b/htdocs/core/lib/company.lib.php index 4bf8a0e7219..e98a25ddbee 100644 --- a/htdocs/core/lib/company.lib.php +++ b/htdocs/core/lib/company.lib.php @@ -271,7 +271,7 @@ function societe_prepare_head(Societe $object) $h++; } - if (getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR') == 'thirdparty') { + if (getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR', 'thirdparty') == 'thirdparty') { if (!empty($user->rights->partnership->read)) { $langs->load("partnership"); $nbPartnership = is_array($object->partnerships) ? count($object->partnerships) : 0; From 3a5fe5063d4d2514d5c6acccb0b673cb71b5773f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 May 2022 16:19:00 +0200 Subject: [PATCH 456/738] Debug v16 --- htdocs/adherents/partnership.php | 17 ++++++++++++----- htdocs/core/actions_massactions.inc.php | 6 +++--- htdocs/core/lib/company.lib.php | 2 +- htdocs/core/modules/modPartnership.class.php | 3 +-- htdocs/core/tpl/card_presend.tpl.php | 2 +- htdocs/core/tpl/massactions_pre.tpl.php | 2 +- htdocs/partnership/admin/setup.php | 6 +++--- htdocs/partnership/class/partnership.class.php | 2 +- .../class/partnershiputils.class.php | 4 ++-- htdocs/partnership/partnership_card.php | 2 +- htdocs/partnership/partnership_list.php | 2 +- htdocs/public/partnership/new.php | 4 ++-- htdocs/societe/partnership.php | 6 +++--- 13 files changed, 32 insertions(+), 26 deletions(-) diff --git a/htdocs/adherents/partnership.php b/htdocs/adherents/partnership.php index 160a037c187..a01e7d28ed2 100644 --- a/htdocs/adherents/partnership.php +++ b/htdocs/adherents/partnership.php @@ -85,11 +85,18 @@ $usercanclose = $user->rights->partnership->write; // Used by the include of $upload_dir = $conf->partnership->multidir_output[isset($object->entity) ? $object->entity : 1]; -if ($conf->global->PARTNERSHIP_IS_MANAGED_FOR != 'member') accessforbidden(); -if (empty($conf->partnership->enabled)) accessforbidden(); -if (empty($permissiontoread)) accessforbidden(); -if ($action == 'edit' && empty($permissiontoadd)) accessforbidden(); - +if (getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR') != 'member') { + accessforbidden('Partnership module is not activated for members'); +} +if (empty($conf->partnership->enabled)) { + accessforbidden(); +} +if (empty($permissiontoread)) { + accessforbidden(); +} +if ($action == 'edit' && empty($permissiontoadd)) { + accessforbidden(); +} if (($action == 'update' || $action == 'edit') && $object->status != $object::STATUS_DRAFT) { accessforbidden(); } diff --git a/htdocs/core/actions_massactions.inc.php b/htdocs/core/actions_massactions.inc.php index 383684b377a..b94655fbc14 100644 --- a/htdocs/core/actions_massactions.inc.php +++ b/htdocs/core/actions_massactions.inc.php @@ -90,7 +90,7 @@ if (!$error && $massaction == 'confirm_presend') { if ($objecttmp->element == 'expensereport') { $thirdparty = new User($db); } - if ($objecttmp->element == 'partnership' && $conf->global->PARTNERSHIP_IS_MANAGED_FOR == 'member') { + if ($objecttmp->element == 'partnership' && getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR') == 'member') { $thirdparty = new Adherent($db); } if ($objecttmp->element == 'holiday') { @@ -110,7 +110,7 @@ if (!$error && $massaction == 'confirm_presend') { if ($objecttmp->element == 'expensereport') { $thirdpartyid = $objecttmp->fk_user_author; } - if ($objecttmp->element == 'partnership' && $conf->global->PARTNERSHIP_IS_MANAGED_FOR == 'member') { + if ($objecttmp->element == 'partnership' && getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR') == 'member') { $thirdpartyid = $objecttmp->fk_member; } if ($objecttmp->element == 'holiday') { @@ -264,7 +264,7 @@ if (!$error && $massaction == 'confirm_presend') { $fuser = new User($db); $fuser->fetch($objectobj->fk_user_author); $sendto = $fuser->email; - } elseif ($objectobj->element == 'partnership' && $conf->global->PARTNERSHIP_IS_MANAGED_FOR == 'member') { + } elseif ($objectobj->element == 'partnership' && getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR') == 'member') { $fadherent = new Adherent($db); $fadherent->fetch($objectobj->fk_member); $sendto = $fadherent->email; diff --git a/htdocs/core/lib/company.lib.php b/htdocs/core/lib/company.lib.php index 197a6c95687..4938d20c3c4 100644 --- a/htdocs/core/lib/company.lib.php +++ b/htdocs/core/lib/company.lib.php @@ -263,7 +263,7 @@ function societe_prepare_head(Societe $object) $h++; } - if (getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR') == 'thirdparty') { + if (getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR', 'thirdparty') == 'thirdparty') { if (!empty($user->rights->partnership->read)) { $langs->load("partnership"); $nbPartnership = is_array($object->partnerships) ? count($object->partnerships) : 0; diff --git a/htdocs/core/modules/modPartnership.class.php b/htdocs/core/modules/modPartnership.class.php index 8ebbd3029b7..13877c7418f 100644 --- a/htdocs/core/modules/modPartnership.class.php +++ b/htdocs/core/modules/modPartnership.class.php @@ -177,8 +177,7 @@ class modPartnership extends DolibarrModules // Array to add new pages in new tabs $this->tabs = array(); - $tabtoadd = (!empty(getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR')) && getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR') == 'member') ? 'member' : 'thirdparty'; - + $tabtoadd = getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR', 'thirdparty'); if ($tabtoadd == 'member') { $fk_mainmenu = "members"; } else { diff --git a/htdocs/core/tpl/card_presend.tpl.php b/htdocs/core/tpl/card_presend.tpl.php index 83f96c1bcb1..0c744e165d3 100644 --- a/htdocs/core/tpl/card_presend.tpl.php +++ b/htdocs/core/tpl/card_presend.tpl.php @@ -152,7 +152,7 @@ if ($action == 'presend') { $fuser = new User($db); $fuser->fetch($object->fk_user_author); $liste['thirdparty'] = $fuser->getFullName($outputlangs)." <".$fuser->email.">"; - } elseif ($object->element == 'partnership' && $conf->global->PARTNERSHIP_IS_MANAGED_FOR == 'member') { + } elseif ($object->element == 'partnership' && getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR') == 'member') { $fadherent = new Adherent($db); $fadherent->fetch($object->fk_member); $liste['member'] = $fadherent->getFullName($outputlangs)." <".$fadherent->email.">"; diff --git a/htdocs/core/tpl/massactions_pre.tpl.php b/htdocs/core/tpl/massactions_pre.tpl.php index 207dc1b7265..678bf219bef 100644 --- a/htdocs/core/tpl/massactions_pre.tpl.php +++ b/htdocs/core/tpl/massactions_pre.tpl.php @@ -131,7 +131,7 @@ if ($massaction == 'presend') { $fuser = new User($db); $fuser->fetch($thirdpartyid); $liste['thirdparty'] = $fuser->getFullName($langs)." <".$fuser->email.">"; - } elseif ($objecttmp->element == 'partnership' && $conf->global->PARTNERSHIP_IS_MANAGED_FOR == 'member') { + } elseif ($objecttmp->element == 'partnership' && getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR') == 'member') { $fadherent = new Adherent($db); $fadherent->fetch($objecttmp->fk_member); $liste['member'] = $fadherent->getFullName($langs)." <".$fadherent->email.">"; diff --git a/htdocs/partnership/admin/setup.php b/htdocs/partnership/admin/setup.php index 100dc7027a3..a398a6860b1 100644 --- a/htdocs/partnership/admin/setup.php +++ b/htdocs/partnership/admin/setup.php @@ -124,8 +124,8 @@ print ''; print ''.$langs->trans("PARTNERSHIP_IS_MANAGED_FOR").''; print ''; print ''; print ajax_combobox('select_PARTNERSHIP_IS_MANAGED_FOR'); print ''; @@ -133,7 +133,7 @@ print ''.$langs->trans("partnershipforthirdparty print ''; -//if (!empty($conf->global->PARTNERSHIP_IS_MANAGED_FOR) && $conf->global->PARTNERSHIP_IS_MANAGED_FOR == 'member') { +//if (getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR') == 'member') { print ''.$langs->trans("PARTNERSHIP_NBDAYS_AFTER_MEMBER_EXPIRATION_BEFORE_CANCEL").''; print ''; $dnbdays = '30'; diff --git a/htdocs/partnership/class/partnership.class.php b/htdocs/partnership/class/partnership.class.php index 7d7d6a65d14..030cbf09e79 100644 --- a/htdocs/partnership/class/partnership.class.php +++ b/htdocs/partnership/class/partnership.class.php @@ -199,7 +199,7 @@ class Partnership extends CommonObject $this->db = $db; - if (!empty($conf->global->PARTNERSHIP_IS_MANAGED_FOR) && $conf->global->PARTNERSHIP_IS_MANAGED_FOR == 'member') { + if (!empty($conf->global->PARTNERSHIP_IS_MANAGED_FOR) && getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR') == 'member') { $this->fields['fk_member'] = array('type'=>'integer:Adherent:adherents/class/adherent.class.php:1', 'label'=>'Member', 'enabled'=>'1', 'position'=>50, 'notnull'=>-1, 'visible'=>1, 'index'=>1, 'picto'=>'member', 'csslist'=>'tdoverflowmax150'); } else { $this->fields['fk_soc'] = array('type'=>'integer:Societe:societe/class/societe.class.php:1:status=1 AND entity IN (__SHARED_ENTITIES__)', 'label'=>'ThirdParty', 'enabled'=>'1', 'position'=>50, 'notnull'=>-1, 'visible'=>1, 'index'=>1, 'picto'=>'company', 'css'=>'maxwidth500', 'csslist'=>'tdoverflowmax150'); diff --git a/htdocs/partnership/class/partnershiputils.class.php b/htdocs/partnership/class/partnershiputils.class.php index ef4f7cfdeb4..9ad2e5b7ca2 100644 --- a/htdocs/partnership/class/partnershiputils.class.php +++ b/htdocs/partnership/class/partnershiputils.class.php @@ -64,7 +64,7 @@ class PartnershipUtils { global $conf, $langs, $user; - $managedfor = empty($conf->global->PARTNERSHIP_IS_MANAGED_FOR) ? 'thirdparty' : $conf->global->PARTNERSHIP_IS_MANAGED_FOR; + $managedfor = getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR', 'thirdparty'); if ($managedfor != 'member') { return 0; // If option 'PARTNERSHIP_IS_MANAGED_FOR' = 'thirdparty', this cron job does nothing. @@ -219,7 +219,7 @@ class PartnershipUtils { global $conf, $langs, $user; - $managedfor = $conf->global->PARTNERSHIP_IS_MANAGED_FOR; + $managedfor = getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR'); $partnership = new Partnership($this->db); $MAXPERCALL = (empty($conf->global->PARTNERSHIP_MAX_WARNING_BACKLINK_PER_CALL) ? 10 : $conf->global->PARTNERSHIP_MAX_WARNING_BACKLINK_PER_CALL); // Limit to 10 per call diff --git a/htdocs/partnership/partnership_card.php b/htdocs/partnership/partnership_card.php index c83a83e6357..9752651ef29 100644 --- a/htdocs/partnership/partnership_card.php +++ b/htdocs/partnership/partnership_card.php @@ -79,7 +79,7 @@ $permissiontodelete = $user->rights->partnership->delete || ($permissiontoadd & $permissionnote = $user->rights->partnership->write; // Used by the include of actions_setnotes.inc.php $permissiondellink = $user->rights->partnership->write; // Used by the include of actions_dellink.inc.php $upload_dir = $conf->partnership->multidir_output[isset($object->entity) ? $object->entity : 1]; -$managedfor = empty($conf->global->PARTNERSHIP_IS_MANAGED_FOR) ? 'thirdparty' : $conf->global->PARTNERSHIP_IS_MANAGED_FOR; +$managedfor = getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR', 'thirdparty'); if (empty($conf->partnership->enabled)) accessforbidden(); if (empty($permissiontoread)) accessforbidden(); diff --git a/htdocs/partnership/partnership_list.php b/htdocs/partnership/partnership_list.php index 42d4354516e..014d576f5d6 100644 --- a/htdocs/partnership/partnership_list.php +++ b/htdocs/partnership/partnership_list.php @@ -74,7 +74,7 @@ $extrafields->fetch_name_optionals_label($object->table_element); $search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_'); -$managedfor = empty($conf->global->PARTNERSHIP_IS_MANAGED_FOR) ? 'thirdparty' : $conf->global->PARTNERSHIP_IS_MANAGED_FOR; +$managedfor = getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR', 'thirdparty'); if ($managedfor != 'member' && $sortfield == 'd.datefin') $sortfield = ''; diff --git a/htdocs/public/partnership/new.php b/htdocs/public/partnership/new.php index fe57f4ea424..d7ee25613a8 100644 --- a/htdocs/public/partnership/new.php +++ b/htdocs/public/partnership/new.php @@ -204,9 +204,9 @@ if (empty($reshook) && $action == 'add') { $partnership = new Partnership($db); // We try to find the thirdparty or the member - if (empty($conf->global->PARTNERSHIP_IS_MANAGED_FOR) || $conf->global->PARTNERSHIP_IS_MANAGED_FOR == 'thirdparty') { + if (getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR', 'thirdparty') == 'thirdparty') { $partnership->fk_member = 0; - } elseif ($conf->global->PARTNERSHIP_IS_MANAGED_FOR == 'member') { + } elseif (getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR', 'thirdparty') == 'member') { $partnership->fk_soc = 0; } diff --git a/htdocs/societe/partnership.php b/htdocs/societe/partnership.php index 2ce4884932e..05079d263a9 100644 --- a/htdocs/societe/partnership.php +++ b/htdocs/societe/partnership.php @@ -52,7 +52,7 @@ if (!empty($user->socid)) { $socid = $user->socid; } -if (empty($id) && $socid && (empty($conf->global->PARTNERSHIP_IS_MANAGED_FOR) || $conf->global->PARTNERSHIP_IS_MANAGED_FOR == 'thirdparty')) { +if (empty($id) && $socid && (getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR', 'thirdparty') == 'thirdparty')) { $id = $socid; } @@ -94,8 +94,8 @@ $usercanclose = $user->rights->partnership->write; // Used by the include of act $upload_dir = $conf->partnership->multidir_output[isset($object->entity) ? $object->entity : 1]; -if (!empty($conf->global->PARTNERSHIP_IS_MANAGED_FOR) && $conf->global->PARTNERSHIP_IS_MANAGED_FOR != 'thirdparty') { - accessforbidden(); +if (getDolGlobalString('PARTNERSHIP_IS_MANAGED_FOR', 'thirdparty') != 'thirdparty') { + accessforbidden('Partnership is not activated for thirdparties'); } if (empty($conf->partnership->enabled)) { accessforbidden(); From 1f59e329cd20eb246497877327deba9c3dbc6e28 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 10 May 2022 16:50:33 +0200 Subject: [PATCH 457/738] Work on public form for partnership --- htdocs/core/class/html.form.class.php | 4 +- htdocs/langs/en_US/partnership.lang | 16 +++---- htdocs/partnership/admin/website.php | 39 +++++----------- .../partnership/class/partnership.class.php | 2 +- htdocs/partnership/lib/partnership.lib.php | 2 +- htdocs/public/partnership/new.php | 44 +++++++------------ 6 files changed, 41 insertions(+), 66 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 0feb7e6519d..b91fb4a243c 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -7778,7 +7778,7 @@ class Form * * @param string $htmlname Name of html select area. Must start with "multi" if this is a multiselect * @param array $array Array like array(key => value) or array(key=>array('label'=>..., 'data-...'=>..., 'disabled'=>..., 'css'=>...)) - * @param string|string[] $id Preselected key or preselected keys for multiselect + * @param string|string[] $id Preselected key or preselected keys for multiselect. Use 'ifone' to autoselect record if there is only one record. * @param int|string $show_empty 0 no empty value allowed, 1 or string to add an empty value into list (If 1: key is -1 and value is '' or ' ', If placeholder string: key is -1 and value is the string), <0 to add an empty value with key that is this value. * @param int $key_in_label 1 to show key into label with format "[key] value" * @param int $value_as_key 1 to use value as key @@ -7895,7 +7895,7 @@ class Form } } else { $id = (string) $id; // if $id = 0, then $id = '0' - if ($id != '' && $id == $key && !$disabled) { + if ($id != '' && ($id == $key || ($id == 'ifone' && count($array) == 1)) && !$disabled) { $out .= ' selected'; // To preselect a value } } diff --git a/htdocs/langs/en_US/partnership.lang b/htdocs/langs/en_US/partnership.lang index 9c11e1cda2e..5c85e4d7830 100644 --- a/htdocs/langs/en_US/partnership.lang +++ b/htdocs/langs/en_US/partnership.lang @@ -42,6 +42,7 @@ PARTNERSHIP_BACKLINKS_TO_CHECK=Backlinks to check PARTNERSHIP_NBDAYS_AFTER_MEMBER_EXPIRATION_BEFORE_CANCEL=Nb of days before cancelling status of a partnership when a subscription has expired ReferingWebsiteCheck=Check of website referring ReferingWebsiteCheckDesc=You can enable a feature to check that your partners has added a backlink to your website domains on their own website. +PublicFormRegistrationPartnerDesc=Dolibarr can provide you a public URL/website to allow external visitors to request to be part of the partnership program. # # Object @@ -60,6 +61,11 @@ ConfirmClosePartnershipAsk=Are you sure you want to cancel this partnership? PartnershipType=Partnership type PartnershipRefApproved=Partnership %s approved KeywordToCheckInWebsite=If you want to check that a given keyword is present into the website of each partner, define this keyword here +PartnershipDraft=Draft +PartnershipAccepted=Accepted +PartnershipRefused=Refused +PartnershipCanceled=Canceled +PartnershipManagedFor=Partners are # # Template Mail @@ -83,12 +89,6 @@ CountLastUrlCheckError=Number of errors for last URL check LastCheckBacklink=Date of last URL check ReasonDeclineOrCancel=Reason for declining or canceling -# -# Status -# -PartnershipDraft=Draft -PartnershipAccepted=Accepted -PartnershipRefused=Refused -PartnershipCanceled=Canceled -PartnershipManagedFor=Partners are +NewPartnershipRequest=New partnership request +NewPartnershipRequestDesc=This form allows you to request to be part of one of our partnership program. If you need help to fill this form, please contact by email %s. diff --git a/htdocs/partnership/admin/website.php b/htdocs/partnership/admin/website.php index 5fb48248280..49fd7ff91df 100644 --- a/htdocs/partnership/admin/website.php +++ b/htdocs/partnership/admin/website.php @@ -78,12 +78,14 @@ if ($action == 'update') { $form = new Form($db); +$title = $langs->trans('PartnershipSetup'); +$help_url = ''; //$help_url = 'EN:Module_Partnership|FR:Module_Adhérents|ES:Módulo_Miembros'; -llxHeader('', $langs->trans("PartnershipsSetup"), $help_url); +llxHeader('', $title, $help_url); $linkback = ''.$langs->trans("BackToModuleList").''; -print load_fiche_titre($langs->trans("PartnershipsSetup"), $linkback, 'title_setup'); +print load_fiche_titre($title, $linkback, 'title_setup'); $head = partnershipAdminPrepareHead(); @@ -93,7 +95,7 @@ print '
    '; print ''; print ''; -print dol_get_fiche_head($head, 'website', $langs->trans("Partnerships"), -1, 'user'); +print dol_get_fiche_head($head, 'website', $langs->trans("Partnerships"), -1, 'partnership'); if ($conf->use_javascript_ajax) { print "\n".''; + // Lines to produce From 1555a6540b8cfab2494580b0fc22760bdf7c9420 Mon Sep 17 00:00:00 2001 From: atm-lena Date: Wed, 11 May 2022 12:40:51 +0200 Subject: [PATCH 478/738] Translation --- htdocs/mrp/mo_production.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/mrp/mo_production.php b/htdocs/mrp/mo_production.php index cbe25d529d9..d6dc4d250d0 100644 --- a/htdocs/mrp/mo_production.php +++ b/htdocs/mrp/mo_production.php @@ -1068,7 +1068,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea print ''; print '
    '; - // traitement entrepot par défaut + // default warehouse processing print ''; + } } // If ticket created from another object @@ -325,7 +420,7 @@ class FormTicket print ''; print ''; print ''; - print ''.img_picto($langs->trans("Refresh"), 'refresh', 'id="captcha_refresh_img"').''; + print ''.img_picto($langs->trans("Refresh"), 'refresh', 'id="captcha_refresh_img"').''; print ''; print ''; } diff --git a/htdocs/core/lib/ticket.lib.php b/htdocs/core/lib/ticket.lib.php index 2e70bfba3b9..5b220553bfe 100644 --- a/htdocs/core/lib/ticket.lib.php +++ b/htdocs/core/lib/ticket.lib.php @@ -233,7 +233,7 @@ function llxHeaderTicket($title, $head = "", $disablejs = 0, $disablehead = 0, $ print '
    '; print '
    '; if ($urllogo) { - print ''; + print ''; print ''; print ''; diff --git a/htdocs/langs/en_US/errors.lang b/htdocs/langs/en_US/errors.lang index 60b2b424aaa..b39d3243376 100644 --- a/htdocs/langs/en_US/errors.lang +++ b/htdocs/langs/en_US/errors.lang @@ -286,6 +286,7 @@ ErrorYouTryToPayInvoicesInACurrencyFromBankWithAnotherCurrency=You try to pay in ErrorInvoiceLoadThirdParty=Can't load third-party object for invoice "%s" ErrorInvoiceLoadThirdPartyKey=Third-party key "%s" no set for invoice "%s" ErrorDeleteLineNotAllowedByObjectStatus=Delete line is not allowed by actual object status +ErrorAjaxRequestFailed=Request failed # Warnings WarningParamUploadMaxFileSizeHigherThanPostMaxSize=Your PHP parameter upload_max_filesize (%s) is higher than PHP parameter post_max_size (%s). This is not a consistent setup. diff --git a/htdocs/langs/en_US/ticket.lang b/htdocs/langs/en_US/ticket.lang index c1cfa5e9757..76d6923e43c 100644 --- a/htdocs/langs/en_US/ticket.lang +++ b/htdocs/langs/en_US/ticket.lang @@ -99,6 +99,8 @@ TicketNewEmailBodyHelp=The text specified here will be inserted into the email c TicketParamPublicInterface=Public interface setup TicketsEmailMustExist=Require an existing email address to create a ticket TicketsEmailMustExistHelp=In the public interface, the email address should already be filled in the database to create a new ticket. +TicketCreateThirdPartyWithContactIfNotExist=Create a third party with contact if it does not exist with the given email +TicketCreateThirdPartyWithContactIfNotExistHelp=Create a third party with contact if it does not exist with the given email PublicInterface=Public interface TicketUrlPublicInterfaceLabelAdmin=Alternative URL for public interface TicketUrlPublicInterfaceHelpAdmin=It is possible to define an alias to the web server and thus make available the public interface with another URL (the server must act as a proxy on this new URL) diff --git a/htdocs/langs/fr_FR/errors.lang b/htdocs/langs/fr_FR/errors.lang index 80d4034a1ba..0c682b5a672 100644 --- a/htdocs/langs/fr_FR/errors.lang +++ b/htdocs/langs/fr_FR/errors.lang @@ -277,6 +277,7 @@ ErrorIsNotADraft=%s n'est pas au statut brouillon ErrorExecIdFailed=Impossible d'exécuter la commande "id" ErrorBadCharIntoLoginName=Caractère non autorisé dans le nom de connexion ErrorRequestTooLarge=Error, request too large +ErrorAjaxRequestFailed=La requête a échoué # Warnings WarningParamUploadMaxFileSizeHigherThanPostMaxSize=Votre paramètre PHP upload_max_filesize (%s) est supérieur au paramètre PHP post_max_size (%s). Ceci n'est pas une configuration cohérente. diff --git a/htdocs/langs/fr_FR/ticket.lang b/htdocs/langs/fr_FR/ticket.lang index e19871f09df..96d7feb6558 100644 --- a/htdocs/langs/fr_FR/ticket.lang +++ b/htdocs/langs/fr_FR/ticket.lang @@ -99,6 +99,8 @@ TicketNewEmailBodyHelp=Le texte spécifié ici sera inséré dans l'e-mail confi TicketParamPublicInterface=Configuration de l'interface publique\n TicketsEmailMustExist=Une adresse e-mail existante est requise pour créer un ticket TicketsEmailMustExistHelp=Pour accéder à l'interface publique et créer un nouveau ticket, votre compte doit déjà être existant. +TicketCreateThirdPartyWithContactIfNotExist=Créer un tiers avec contact s'il n'existe pas avec l'email saisi +TicketCreateThirdPartyWithContactIfNotExistHelp=Créer un tiers avec contact s'il n'existe pas avec l'email saisi PublicInterface=Interface publique TicketUrlPublicInterfaceLabelAdmin=URL alternative pour l'interface publique TicketUrlPublicInterfaceHelpAdmin=Il est possible de définir un alias vers le serveur et de rendre ainsi l'interface publique accessible avec une autre URL (le serveur doit agir comme un proxy sur cette nouvelle URL) diff --git a/htdocs/public/ticket/ajax/ajax.php b/htdocs/public/ticket/ajax/ajax.php new file mode 100644 index 00000000000..a75c796539c --- /dev/null +++ b/htdocs/public/ticket/ajax/ajax.php @@ -0,0 +1,87 @@ + + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/public/ticket/ajax/ajax.php + * \brief Ajax component for Ticket. + */ + +if (!defined('NOTOKENRENEWAL')) { + define('NOTOKENRENEWAL', '1'); // Disables token renewal +} +if (!defined('NOREQUIREHTML')) { + define('NOREQUIREHTML', '1'); +} +if (!defined('NOREQUIREAJAX')) { + define('NOREQUIREAJAX', '1'); +} +if (!defined('NOREQUIRESOC')) { + define('NOREQUIRESOC', '1'); +} +if (!defined('NOCSRFCHECK')) { + define('NOCSRFCHECK', '1'); +} +// Do not check anti CSRF attack test +if (!defined('NOREQUIREMENU')) { + define('NOREQUIREMENU', '1'); +} +// If there is no need to load and show top and left menu +if (!defined("NOLOGIN")) { + define("NOLOGIN", '1'); +} +if (!defined('NOIPCHECK')) { + define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip +} +if (!defined('NOBROWSERNOTIF')) { + define('NOBROWSERNOTIF', '1'); +} + +include_once '../../../main.inc.php'; // Load $user and permissions + +$action = GETPOST('action', 'aZ09'); +$id = GETPOST('id', 'int'); +$email = GETPOST('email', 'alphanohtml'); + + +/* + * View + */ + +top_httphead(); + +if ($action == 'getContacts') { + $return = array( + 'contacts' => array(), + 'error' => '', + ); + + if (!empty($email)) { + require_once DOL_DOCUMENT_ROOT.'/ticket/class/ticket.class.php'; + + $ticket = new Ticket($db); + $contacts = $ticket->searchContactByEmail($email); + if (is_array($contacts)) { + $return['contacts'] = $contacts; + } else { + $return['error'] = $ticket->errorsToString(); + } + } + + echo json_encode($return); + exit(); +} diff --git a/htdocs/public/ticket/create_ticket.php b/htdocs/public/ticket/create_ticket.php index 371789edc62..f7e6e023a7f 100644 --- a/htdocs/public/ticket/create_ticket.php +++ b/htdocs/public/ticket/create_ticket.php @@ -63,6 +63,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php'; +require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php'; // Load translation files required by the page $langs->loadLangs(array('companies', 'other', 'mails', 'ticket')); @@ -78,6 +79,11 @@ $hookmanager->initHooks(array('publicnewticketcard', 'globalcard')); $object = new Ticket($db); $extrafields = new ExtraFields($db); +$contacts = array(); +$with_contact = null; +if (!empty($conf->global->TICKET_CREATE_THIRD_PARTY_WITH_CONTACT_IF_NOT_EXIST)) { + $with_contact = new Contact($db); +} $extrafields->fetch_name_optionals_label($object->table_element); @@ -153,18 +159,50 @@ if (empty($reshook) && $action == 'create_ticket' && GETPOST('save', 'alpha')) { } } + $contact_lastname = ''; + $contact_firstname = ''; + $company_name = ''; + $contact_phone = ''; + if ($with_contact) { + // set linked contact to add in form + if (is_array($contacts) && count($contacts) == 1) { + $with_contact = current($contacts); + } + + // check mandatory fields on contact + $contact_lastname = trim(GETPOST('contact_lastname', 'alphanohtml')); + $contact_firstname = trim(GETPOST('contact_firstname', 'alphanohtml')); + $company_name = trim(GETPOST('company_name', 'alphanohtml')); + $contact_phone = trim(GETPOST('contact_phone', 'alphanohtml')); + if (!($with_contact->id > 0)) { + // check lastname + if (empty($contact_lastname)) { + $error++; + array_push($object->errors, $langs->trans('ErrorFieldRequired', $langs->transnoentities('Lastname'))); + $action = ''; + } + // check firstname + if (empty($contact_firstname)) { + $error++; + array_push($object->errors, $langs->trans('ErrorFieldRequired', $langs->transnoentities('Firstname'))); + $action = ''; + } + } + } + if (!GETPOST("subject", "restricthtml")) { $error++; array_push($object->errors, $langs->trans("ErrorFieldRequired", $langs->transnoentities("Subject"))); $action = ''; - } elseif (!GETPOST("message", "restricthtml")) { + } + if (!GETPOST("message", "restricthtml")) { $error++; - array_push($object->errors, $langs->trans("ErrorFieldRequired", $langs->transnoentities("message"))); + array_push($object->errors, $langs->trans("ErrorFieldRequired", $langs->transnoentities("Message"))); $action = ''; } // Check email address - if (!isValidEmail($origin_email)) { + if (!empty($origin_email) && !isValidEmail($origin_email)) { $error++; array_push($object->errors, $langs->trans("ErrorBadEmailAddress", $langs->transnoentities("email"))); $action = ''; @@ -193,6 +231,48 @@ if (empty($reshook) && $action == 'create_ticket' && GETPOST('save', 'alpha')) { $object->type_code = GETPOST("type_code", 'aZ09'); $object->category_code = GETPOST("category_code", 'aZ09'); $object->severity_code = GETPOST("severity_code", 'aZ09'); + + if (!is_object($user)) { + $user = new User($db); + } + + // create third-party with contact + $usertoassign = 0; + if ($with_contact && !($with_contact->id > 0)) { + $company = new Societe($db); + if (!empty($company_name)) { + $company->name = $company_name; + } else { + $company->particulier = 1; + $company->name = dolGetFirstLastname($contact_firstname, $contact_lastname); + } + $result = $company->create($user); + if ($result < 0) { + $error++; + $errors = ($company->error ? array($company->error) : $company->errors); + array_push($object->errors, $errors); + $action = 'create_ticket'; + } + + // create contact and link to this new company + if (!$error) { + $with_contact->email = $origin_email; + $with_contact->lastname = $contact_lastname; + $with_contact->firstname = $contact_firstname; + $with_contact->socid = $company->id; + $with_contact->phone_pro = $contact_phone; + $result = $with_contact->create($user); + if ($result < 0) { + $error++; + $errors = ($with_contact->error ? array($with_contact->error) : $with_contact->errors); + array_push($object->errors, $errors); + $action = 'create_ticket'; + } else { + $contacts = array($with_contact); + } + } + } + if (is_array($searched_companies)) { $object->fk_soc = $searched_companies[0]->id; } @@ -206,9 +286,6 @@ if (empty($reshook) && $action == 'create_ticket' && GETPOST('save', 'alpha')) { // Generate new ref $object->ref = $object->getDefaultRef(); - if (!is_object($user)) { - $user = new User($db); - } $object->context['disableticketemail'] = 1; // Disable emails sent by ticket trigger when creation is done from this page, emails are already sent later @@ -402,7 +479,7 @@ if ($action != "infos_success") { print '
    '; } else { print '
    '.$langs->trans('TicketPublicInfoCreateTicket').'
    '; - $formticket->showForm(0, 'edit', 1); + $formticket->showForm(0, 'edit', 1, $with_contact); } } From 94dcee622b22c297011a49e2f1e3efa619585363 Mon Sep 17 00:00:00 2001 From: lvessiller Date: Thu, 12 May 2022 17:58:31 +0200 Subject: [PATCH 501/738] FIX stickler --- htdocs/admin/ticket_public.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/admin/ticket_public.php b/htdocs/admin/ticket_public.php index 29e0cce4036..cb009b54655 100644 --- a/htdocs/admin/ticket_public.php +++ b/htdocs/admin/ticket_public.php @@ -159,7 +159,7 @@ if ($action == 'setTICKET_ENABLE_PUBLIC_INTERFACE') { $errors[] = $db->lasterror(); } } -} elseif (preg_match('/set_(.*)/',$action,$reg)) { +} elseif (preg_match('/set_(.*)/', $action,$reg)) { $code = $reg[1]; $value = GETPOSTISSET($code) ? GETPOST($code, 'int') : 1; $res = dolibarr_set_const($db, $code, $value, 'chaine', 0, '', $conf->entity); @@ -190,7 +190,7 @@ if ($action == 'setTICKET_ENABLE_PUBLIC_INTERFACE') { } } } -} elseif (preg_match('/del_(.*)/',$action,$reg)) { +} elseif (preg_match('/del_(.*)/', $action,$reg)) { $code = $reg[1]; $res = dolibarr_del_const($db, $code, $conf->entity); if (!($res > 0)) { From 775a8c5334704b3f667ebe8a88d74a52512cd5db Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 12 May 2022 20:18:58 +0200 Subject: [PATCH 502/738] Look and feel v16 --- htdocs/core/class/html.form.class.php | 28 ++++++-- htdocs/core/lib/functions.lib.php | 64 ++++++++++++++----- htdocs/main.inc.php | 4 +- .../modulebuilder/template/myobject_card.php | 4 +- htdocs/projet/card.php | 15 ++++- htdocs/societe/card.php | 7 +- htdocs/website/index.php | 6 +- 7 files changed, 97 insertions(+), 31 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index f600f1a5fcb..48a00919d65 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -10079,14 +10079,15 @@ class Form /** * Output the buttons to submit a creation/edit form * - * @param string $save_label Alternative label for save button - * @param string $cancel_label Alternative label for cancel button - * @param array $morebuttons Add additional buttons between save and cancel - * @param bool $withoutdiv Option to remove enclosing centered div - * @param string $morecss More CSS - * @return string Html code with the buttons + * @param string $save_label Alternative label for save button + * @param string $cancel_label Alternative label for cancel button + * @param array $morebuttons Add additional buttons between save and cancel + * @param bool $withoutdiv Option to remove enclosing centered div + * @param string $morecss More CSS + * @param string $dol_openinpopup If the button are shown in a context of a page shown inside a popup, we put here the string name of popup. + * @return string Html code with the buttons */ - public function buttonsSaveCancel($save_label = 'Save', $cancel_label = 'Cancel', $morebuttons = array(), $withoutdiv = 0, $morecss = '') + public function buttonsSaveCancel($save_label = 'Save', $cancel_label = 'Cancel', $morebuttons = array(), $withoutdiv = 0, $morecss = '', $dol_openinpopup = '') { global $langs; @@ -10124,6 +10125,19 @@ class Form } $retstring .= $withoutdiv ? '': '
    '; + if ($dol_openinpopup) { + $retstring .= ''."\n"; + $retstring .= ''; + // TODO @LDR for the save button, in action "add", set parent var to return data and close the window + //$retstring .= 'setid '; + //$retstring .= 'setlabel'; + } + return $retstring; } } diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 14281e47a69..8776381b922 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -1575,36 +1575,70 @@ function dol_syslog($message, $level = LOG_INFO, $ident = 0, $suffixinfilename = * Such buttons must be included inside a HTML form. * * @param string $name A name for the html component - * @param string $label Label of button + * @param string $label Label shown in Popup title top bar * @param string $buttonstring button string * @param string $url Url to open * @param string $disabled Disabled text + * @param string $morecss More CSS + * @param string $backtopagejsfields The back to page must be managed using javascript instead of a redirect. + * Value is 'Name of html component to set with id:Name of html component to set with label' + * TODO Support this mode, for example when used from the page create a project on thirdparty creation. * @return string HTML component with button */ -function dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled = '') +function dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled = '', $morecss = 'button bordertransp', $backtopagejsfields = '') { if (strpos($url, '?') > 0) { - $url .= '&dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup=1'; + $url .= '&dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup='.urlencode($name); } else { - $url .= '?dol_hide_menuinpopup=1&dol_hide_leftmenu=1&dol_openinpopup=1'; + $url .= '?dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup='.urlencode($name); + } + + $out .= ''; + + $backtopagejsfieldsid = ''; $backtopagejsfieldslabel = ''; + if ($backtopagejsfields) { + $url .= '&backtopagejsfields='.urlencode($backtopagejsfields); + $tmpbacktopagejsfields = explode(':', $backtopagejsfields); + $backtopagejsfieldsid = empty($tmpbacktopagejsfields[0]) ? '' : $tmpbacktopagejsfields[0]; + $backtopagejsfieldslabel = empty($tmpbacktopagejsfields[1]) ? '' : $tmpbacktopagejsfields[1]; } //print ''; - $out = ''.$buttonstring.''; + $out .= ''."\n"; + $out .= ''.$buttonstring.''; + $out .= ''; + $out .= ''; + $out .= ''; $out .= ''; $out .= ''; diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 21218f099fe..4581814f0f8 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -1367,11 +1367,11 @@ if (!function_exists("llxHeader")) { print ''."\n"; // top menu and left menu area - if (empty($conf->dol_hide_topmenu) || GETPOST('dol_invisible_topmenu', 'int')) { + if ((empty($conf->dol_hide_topmenu) || GETPOST('dol_invisible_topmenu', 'int')) && !GETPOST('dol_openinpopup', 'aZ09')) { top_menu($head, $title, $target, $disablejs, $disablehead, $arrayofjs, $arrayofcss, $morequerystring, $help_url); } - if (empty($conf->dol_hide_leftmenu)) { + if (empty($conf->dol_hide_leftmenu) && !GETPOST('dol_openinpopup', 'aZ09')) { left_menu('', $help_url, '', '', 1, $title, 1); // $menumanager is retrieved with a global $menumanager inside this function } diff --git a/htdocs/modulebuilder/template/myobject_card.php b/htdocs/modulebuilder/template/myobject_card.php index 6d5c807c3f0..002685415cc 100644 --- a/htdocs/modulebuilder/template/myobject_card.php +++ b/htdocs/modulebuilder/template/myobject_card.php @@ -87,13 +87,15 @@ $langs->loadLangs(array("mymodule@mymodule", "other")); // Get parameters $id = GETPOST('id', 'int'); $ref = GETPOST('ref', 'alpha'); +$lineid = GETPOST('lineid', 'int'); + $action = GETPOST('action', 'aZ09'); $confirm = GETPOST('confirm', 'alpha'); $cancel = GETPOST('cancel', 'aZ09'); $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'myobjectcard'; // To manage different context of search $backtopage = GETPOST('backtopage', 'alpha'); $backtopageforcancel = GETPOST('backtopageforcancel', 'alpha'); -$lineid = GETPOST('lineid', 'int'); +$dol_openinpopup = GETPOST('dol_openinpopup', 'aZ09'); // Initialize technical objects $object = new MyObject($db); diff --git a/htdocs/projet/card.php b/htdocs/projet/card.php index c5fc08a6402..6a27472a7e3 100644 --- a/htdocs/projet/card.php +++ b/htdocs/projet/card.php @@ -46,8 +46,11 @@ $id = GETPOST('id', 'int'); $ref = GETPOST('ref', 'alpha'); $action = GETPOST('action', 'aZ09'); $backtopage = GETPOST('backtopage', 'alpha'); +$backtopagejsfields = GETPOST('backtopagejsfields', 'alpha'); $cancel = GETPOST('cancel', 'alpha'); $confirm = GETPOST('confirm', 'aZ09'); +$dol_openinpopup = GETPOST('dol_openinpopup', 'aZ09'); + $status = GETPOST('status', 'int'); $opp_status = GETPOST('opp_status', 'int'); $opp_percent = price2num(GETPOST('opp_percent', 'alpha')); @@ -505,9 +508,10 @@ if ($action == 'create' && $user->rights->projet->creer) { print load_fiche_titre($titlenew, '', 'project'); print ''; - print ''; print ''; + print ''; print ''; + print ''; print dol_get_fiche_head(); @@ -605,7 +609,7 @@ if ($action == 'create' && $user->rights->projet->creer) { if (!empty($conf->global->PROJECT_FILTER_FOR_THIRDPARTY_LIST)) { $filteronlist = $conf->global->PROJECT_FILTER_FOR_THIRDPARTY_LIST; } - $text = img_picto('', 'company').$form->select_company(GETPOST('socid', 'int'), 'socid', $filteronlist, 'SelectThirdParty', 1, 0, array(), 0, 'minwidth300 widthcentpercentminusxx'); + $text = img_picto('', 'company').$form->select_company(GETPOST('socid', 'int'), 'socid', $filteronlist, 'SelectThirdParty', 1, 0, array(), 0, 'minwidth300 widthcentpercentminusxx maxwidth500'); if (empty($conf->global->PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS) && empty($conf->dol_use_jmobile)) { $texthelp = $langs->trans("IfNeedToUseOtherObjectKeepEmpty"); print $form->textwithtooltip($text.' '.img_help(), $texthelp, 1); @@ -613,7 +617,12 @@ if ($action == 'create' && $user->rights->projet->creer) { print $text; } if (!GETPOSTISSET('backtopage')) { - print ' '; + $url = '/societe/card.php?action=create&client=3&fournisseur=0&backtopage='.urlencode($_SERVER["PHP_SELF"].'?action=create'); + $newbutton = ''; + // TODO @LDR Impletment this + //$tmpbacktopagejsfields = 'socid:search_socid'; + //print dolButtonToOpenUrlInDialogPopup('addthirdparty', $langs->transnoentitiesnoconv('AddThirdParty'), $newbutton, $url, '', '', $tmpbacktopagejsfields); + print ' '.$newbutton.''; } print ''; } diff --git a/htdocs/societe/card.php b/htdocs/societe/card.php index 154a376cca7..cbb8de3cf28 100644 --- a/htdocs/societe/card.php +++ b/htdocs/societe/card.php @@ -84,7 +84,9 @@ $error = 0; $errors = array(); $action = (GETPOST('action', 'aZ09') ? GETPOST('action', 'aZ09') : 'view'); $cancel = GETPOST('cancel', 'alpha'); $backtopage = GETPOST('backtopage', 'alpha'); +$backtopagejsfields = GETPOST('backtopagejsfields', 'alpha'); $backtopageforcancel = GETPOST('backtopageforcancel', 'alpha'); +$dol_openinpopup = GETPOST('dol_openinpopup', 'aZ09'); $confirm = GETPOST('confirm', 'alpha'); $socid = GETPOST('socid', 'int') ?GETPOST('socid', 'int') : GETPOST('id', 'int'); @@ -1262,8 +1264,9 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { print ''; // Chrome ignor autocomplete print ''; - print ''; print ''; + print ''; + print ''; print ''; print ''; print ''; @@ -1721,7 +1724,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { print dol_get_fiche_end(); - print $form->buttonsSaveCancel("AddThirdParty"); + print $form->buttonsSaveCancel("AddThirdParty", 'Cancel', null, 0, '', $dol_openinpopup); print ''."\n"; } elseif ($action == 'edit') { diff --git a/htdocs/website/index.php b/htdocs/website/index.php index d454ec8f532..02926e2add8 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -68,6 +68,9 @@ $toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'websitelist'; // To manage different context of search $backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print') +$dol_hide_topmenu = GETPOST('dol_hide_topmenu', 'int'); +$dol_hide_leftmenu = GETPOST('dol_hide_leftmenu', 'int'); +$dol_openinpopup = GETPOST('dol_openinpopup', 'aZ09'); $type_container = GETPOST('WEBSITE_TYPE_CONTAINER', 'alpha'); @@ -2558,6 +2561,7 @@ print ''."\n"; print '
    '; print ''; print ''; +print ''; if ($action == 'createsite') { print ''; @@ -2638,7 +2642,7 @@ if (!GETPOST('hide_websitemenu')) { //var_dump($objectpage);exit; - print '
    '; + print '
    '; // // Toolbar for websites From d6f576b2f7f2a961ce227de39d98a1cacea53634 Mon Sep 17 00:00:00 2001 From: lvessiller Date: Fri, 13 May 2022 08:48:05 +0200 Subject: [PATCH 503/738] FIX travis From d624a1e25e2c9d5033650dc307883c544c7c2a15 Mon Sep 17 00:00:00 2001 From: lvessiller Date: Fri, 13 May 2022 08:57:08 +0200 Subject: [PATCH 504/738] FIX stickler-ci --- htdocs/admin/ticket_public.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/admin/ticket_public.php b/htdocs/admin/ticket_public.php index cb009b54655..4df687dd2bd 100644 --- a/htdocs/admin/ticket_public.php +++ b/htdocs/admin/ticket_public.php @@ -159,7 +159,7 @@ if ($action == 'setTICKET_ENABLE_PUBLIC_INTERFACE') { $errors[] = $db->lasterror(); } } -} elseif (preg_match('/set_(.*)/', $action,$reg)) { +} elseif (preg_match('/set_(.*)/', $action, $reg)) { $code = $reg[1]; $value = GETPOSTISSET($code) ? GETPOST($code, 'int') : 1; $res = dolibarr_set_const($db, $code, $value, 'chaine', 0, '', $conf->entity); @@ -190,7 +190,7 @@ if ($action == 'setTICKET_ENABLE_PUBLIC_INTERFACE') { } } } -} elseif (preg_match('/del_(.*)/', $action,$reg)) { +} elseif (preg_match('/del_(.*)/', $action, $reg)) { $code = $reg[1]; $res = dolibarr_del_const($db, $code, $conf->entity); if (!($res > 0)) { From 8e525681cc6cd0f04ed97e46ab27787caf094049 Mon Sep 17 00:00:00 2001 From: lvessiller Date: Fri, 13 May 2022 09:08:01 +0200 Subject: [PATCH 505/738] FIX reload travis From 6106d54632e5cf56f52cb23c1a21810a1e4dcd43 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 13 May 2022 09:54:10 +0200 Subject: [PATCH 506/738] css --- htdocs/theme/eldy/global.inc.php | 2 ++ htdocs/theme/md/style.css.php | 2 +- htdocs/user/card.php | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 2ac2e0744b3..83d7bc120e2 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -3481,6 +3481,8 @@ div .tdtop { vertical-align: top !important; /*padding-top: 10px !important; padding-bottom: 2px !important; */ + padding-top: 6px !important; + padding-bottom: 4px !important; } table.border td, table.bordernooddeven td, div.border div div.tagtd { diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 15c9ef74612..d8a6a1d928c 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -4144,7 +4144,7 @@ div.tabBar .noborder { } div .tdtop { vertical-align: top !important; - padding-top: 5px !important; + padding-top: 8px !important; padding-bottom: 0px !important; } diff --git a/htdocs/user/card.php b/htdocs/user/card.php index 3a27e308172..f789023b8d4 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -1707,7 +1707,7 @@ if ($action == 'create' || $action == 'adduserldap') { print "\n"; // VCard - print ''.$langs->trans("VCard").''; + print ''.$langs->trans("VCard").''; print ''; print ''; print img_picto($langs->trans("Download"), 'vcard.png', 'class="paddingrightonly"'); From 9b0c7d0904e3b2b68b9ff80fe3e017a4b638681d Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Fri, 13 May 2022 09:58:00 +0200 Subject: [PATCH 507/738] new: add hidden option to add export file with date time --- htdocs/exports/class/export.class.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/htdocs/exports/class/export.class.php b/htdocs/exports/class/export.class.php index c87f03f3110..89d0caaa24f 100644 --- a/htdocs/exports/class/export.class.php +++ b/htdocs/exports/class/export.class.php @@ -615,6 +615,9 @@ class Export } else { $filename = "export_".$datatoexport; } + if (!empty($conf->global->EXPORT_NAME_WITH_DT)) { + $filename .= dol_print_date(dol_now(), '%Y%m%d%_%H%M'); + } $filename .= '.'.$objmodel->getDriverExtension(); $dirname = $conf->export->dir_temp.'/'.$user->id; From 89e5d3e1c214c5df76f9fd86969ffc3804a78861 Mon Sep 17 00:00:00 2001 From: lvessiller Date: Fri, 13 May 2022 10:02:35 +0200 Subject: [PATCH 508/738] FIX merge from develop --- htdocs/langs/fr_FR/errors.lang | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/langs/fr_FR/errors.lang b/htdocs/langs/fr_FR/errors.lang index 938c3ab9d36..234dc56941c 100644 --- a/htdocs/langs/fr_FR/errors.lang +++ b/htdocs/langs/fr_FR/errors.lang @@ -283,7 +283,6 @@ ErrorAttributeIsUsedIntoProduct=Cet attribut est utilisé dans une ou plusieurs ErrorAttributeValueIsUsedIntoProduct=Cette valeur d'attribut est utilisée dans une ou plusieurs variantes de produit ErrorPaymentInBothCurrency=Erreur, tous les montants doivent être entrés dans la même colonne. ErrorYouTryToPayInvoicesInACurrencyFromBankWithAnotherCurrency=Vous essayez de payer une facture en monnaie %s depuis un compte en %s -ErrorRequestTooLarge=Error, request too large ErrorAjaxRequestFailed=La requête a échoué # Warnings From fa6d738037807376db0f1b58310ef5778133fd01 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Fri, 13 May 2022 10:46:02 +0200 Subject: [PATCH 509/738] NEW: Add event block on facture_rec #20870 --- htdocs/compta/facture/card-rec.php | 15 ++++++++++++++- htdocs/core/lib/functions2.lib.php | 5 +++++ htdocs/user/class/user.class.php | 3 ++- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/facture/card-rec.php b/htdocs/compta/facture/card-rec.php index 6300e387067..18b1e752c0b 100644 --- a/htdocs/compta/facture/card-rec.php +++ b/htdocs/compta/facture/card-rec.php @@ -1695,7 +1695,20 @@ if ($action == 'create') { $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem); - print '
    '; + print ''; + print '
    '; + + $MAXEVENT = 10; + + //$morehtmlcenter = dolGetButtonTitle($langs->trans('SeeAll'), '', 'fa fa-list-alt imgforviewmode', dol_buildpath('/mymodule/myobject_agenda.php', 1).'?id='.$object->id); + + // List of actions on element + include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php'; + $formactions = new FormActions($db); + $somethingshown = $formactions->showactions($object, $object->element, (is_object($object->thirdparty) ? $object->thirdparty->id : 0), 1, '', $MAXEVENT, '', $morehtmlcenter); + + print '
    '; + print ''; } } diff --git a/htdocs/core/lib/functions2.lib.php b/htdocs/core/lib/functions2.lib.php index 8c419eec3c9..f80f041730e 100644 --- a/htdocs/core/lib/functions2.lib.php +++ b/htdocs/core/lib/functions2.lib.php @@ -2229,6 +2229,11 @@ function dolGetElementUrl($objectid, $objecttype, $withpicto = 0, $option = '') $classpath = 'product/stock/class'; $classfile = 'entrepot'; $classname = 'Entrepot'; + } elseif ($objecttype == 'facturerec') { + $classpath = 'compta/facture/class'; + $classfile = 'facture-rec'; + $classname = 'FactureRec'; + $module='facture'; } if (!empty($conf->$module->enabled)) { diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 33ca6d0ec9c..b0630f0394e 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -717,7 +717,8 @@ class User extends CommonObject 'knowledgerecord' => 'knowledgerecord@knowledgemanagement', 'skill@hrm' => 'all@hrm', // skill / job / position objects rights are for the moment grouped into right level "all" 'job@hrm' => 'all@hrm', // skill / job / position objects rights are for the moment grouped into right level "all" - 'position@hrm' => 'all@hrm' // skill / job / position objects rights are for the moment grouped into right level "all" + 'position@hrm' => 'all@hrm', // skill / job / position objects rights are for the moment grouped into right level "all" + 'facturerec' => 'facture' ); if (!empty($moduletomoduletouse[$module])) { $module = $moduletomoduletouse[$module]; From 0425becc03d046bdeab6a0a3f04d245c994a8ed6 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Fri, 13 May 2022 11:23:49 +0200 Subject: [PATCH 510/738] add c_action_trigger and fix travis --- htdocs/admin/agenda.php | 3 + .../facture/class/facture-rec.class.php | 93 +++++++++++++++++-- .../install/mysql/data/llx_10_c_regions.sql | 36 +++---- .../mysql/data/llx_c_action_trigger.sql | 7 +- 4 files changed, 113 insertions(+), 26 deletions(-) diff --git a/htdocs/admin/agenda.php b/htdocs/admin/agenda.php index af09d32bc73..52926cf1b19 100644 --- a/htdocs/admin/agenda.php +++ b/htdocs/admin/agenda.php @@ -173,6 +173,9 @@ if (!empty($triggers)) { if ($module == 'contact') { $module = 'societe'; } + if ($module == 'facturerec') { + $module = 'facture'; + } // If 'element' value is myobject@mymodule instead of mymodule $tmparray = explode('@', $module); diff --git a/htdocs/compta/facture/class/facture-rec.class.php b/htdocs/compta/facture/class/facture-rec.class.php index 7058364d1f1..aa9479de384 100644 --- a/htdocs/compta/facture/class/facture-rec.class.php +++ b/htdocs/compta/facture/class/facture-rec.class.php @@ -270,6 +270,7 @@ class FactureRec extends CommonInvoice if ($result > 0) { // On positionne en mode brouillon la facture $this->brouillon = 1; + $this->fk_soc = $facsrc->socid; $sql = "INSERT INTO ".MAIN_DB_PREFIX."facture_rec ("; $sql .= "titre"; @@ -301,7 +302,7 @@ class FactureRec extends CommonInvoice $sql .= ", suspended"; $sql .= ") VALUES ("; $sql .= "'".$this->db->escape($this->titre ? $this->titre : $this->title)."'"; - $sql .= ", ".((int) $facsrc->socid); + $sql .= ", ".((int) $this->fk_soc); $sql .= ", ".((int) $conf->entity); $sql .= ", '".$this->db->idate($now)."'"; $sql .= ", ".(!empty($facsrc->total_ttc) ? ((float) $facsrc->total_ttc) : '0'); @@ -1788,10 +1789,13 @@ class FactureRec extends CommonInvoice * * @param int $frequency value of frequency * @param string $unit unit of frequency (d, m, y) + * @param int $notrigger Disable the trigger * @return int <0 if KO, >0 if OK */ - public function setFrequencyAndUnit($frequency, $unit) + public function setFrequencyAndUnit($frequency, $unit, $notrigger = 0) { + global $user; + if (!$this->table_element) { dol_syslog(get_class($this)."::setFrequencyAndUnit was called on objet with property table_element not defined", LOG_ERR); return -1; @@ -1815,6 +1819,16 @@ class FactureRec extends CommonInvoice if (!empty($unit)) { $this->unit_frequency = $unit; } + + if (!$notrigger) { + // Call trigger + $result = $this->call_trigger('BILLREC_MODIFY', $user); + if ($result < 0) { + return $result; + } + // End call triggers + } + return 1; } else { dol_print_error($this->db); @@ -1827,10 +1841,14 @@ class FactureRec extends CommonInvoice * * @param datetime $date date of execution * @param int $increment_nb_gen_done 0 do nothing more, >0 increment nb_gen_done + * @param int $notrigger Disable the trigger * @return int <0 if KO, >0 if OK */ - public function setNextDate($date, $increment_nb_gen_done = 0) + public function setNextDate($date, $increment_nb_gen_done = 0, $notrigger = 0) { + + global $user; + if (!$this->table_element) { dol_syslog(get_class($this)."::setNextDate was called on objet with property table_element not defined", LOG_ERR); return -1; @@ -1848,6 +1866,15 @@ class FactureRec extends CommonInvoice if ($increment_nb_gen_done > 0) { $this->nb_gen_done++; } + + if (!$notrigger) { + // Call trigger + $result = $this->call_trigger('BILLREC_MODIFY', $user); + if ($result < 0) { + return $result; + } + // End call triggers + } return 1; } else { dol_print_error($this->db); @@ -1859,10 +1886,14 @@ class FactureRec extends CommonInvoice * Update the maximum period * * @param int $nb number of maximum period + * @param int $notrigger Disable the trigger * @return int <0 if KO, >0 if OK */ - public function setMaxPeriod($nb) + public function setMaxPeriod($nb, $notrigger = 0) { + + global $user; + if (!$this->table_element) { dol_syslog(get_class($this)."::setMaxPeriod was called on objet with property table_element not defined", LOG_ERR); return -1; @@ -1879,6 +1910,16 @@ class FactureRec extends CommonInvoice dol_syslog(get_class($this)."::setMaxPeriod", LOG_DEBUG); if ($this->db->query($sql)) { $this->nb_gen_max = $nb; + + if (!$notrigger) { + // Call trigger + $result = $this->call_trigger('BILLREC_MODIFY', $user); + if ($result < 0) { + return $result; + } + // End call triggers + } + return 1; } else { dol_print_error($this->db); @@ -1890,10 +1931,13 @@ class FactureRec extends CommonInvoice * Update the auto validate flag of invoice * * @param int $validate 0 to create in draft, 1 to create and validate invoice + * @param int $notrigger Disable the trigger * @return int <0 if KO, >0 if OK */ - public function setAutoValidate($validate) + public function setAutoValidate($validate, $notrigger = 0) { + global $user; + if (!$this->table_element) { dol_syslog(get_class($this)."::setAutoValidate was called on objet with property table_element not defined", LOG_ERR); return -1; @@ -1906,6 +1950,16 @@ class FactureRec extends CommonInvoice dol_syslog(get_class($this)."::setAutoValidate", LOG_DEBUG); if ($this->db->query($sql)) { $this->auto_validate = $validate; + + if (!$notrigger) { + // Call trigger + $result = $this->call_trigger('BILLREC_MODIFY', $user); + if ($result < 0) { + return $result; + } + // End call triggers + } + return 1; } else { dol_print_error($this->db); @@ -1917,10 +1971,13 @@ class FactureRec extends CommonInvoice * Update the auto generate documents * * @param int $validate 0 no document, 1 to generate document + * @param int $notrigger Disable the trigger * @return int <0 if KO, >0 if OK */ - public function setGeneratePdf($validate) + public function setGeneratePdf($validate, $notrigger = 0) { + global $user; + if (!$this->table_element) { dol_syslog(get_class($this)."::setGeneratePdf was called on objet with property table_element not defined", LOG_ERR); return -1; @@ -1933,6 +1990,16 @@ class FactureRec extends CommonInvoice dol_syslog(get_class($this)."::setGeneratePdf", LOG_DEBUG); if ($this->db->query($sql)) { $this->generate_pdf = $validate; + + if (!$notrigger) { + // Call trigger + $result = $this->call_trigger('BILLREC_MODIFY', $user); + if ($result < 0) { + return $result; + } + // End call triggers + } + return 1; } else { dol_print_error($this->db); @@ -1944,10 +2011,12 @@ class FactureRec extends CommonInvoice * Update the model for documents * * @param string $model model of document generator + * @param int $notrigger Disable the trigger * @return int <0 if KO, >0 if OK */ - public function setModelPdf($model) + public function setModelPdf($model, $notrigger = 0) { + global $user; if (!$this->table_element) { dol_syslog(get_class($this)."::setModelPdf was called on objet with property table_element not defined", LOG_ERR); return -1; @@ -1960,6 +2029,16 @@ class FactureRec extends CommonInvoice dol_syslog(get_class($this)."::setModelPdf", LOG_DEBUG); if ($this->db->query($sql)) { $this->model_pdf = $model; + + if (!$notrigger) { + // Call trigger + $result = $this->call_trigger('BILLREC_MODIFY', $user); + if ($result < 0) { + return $result; + } + // End call triggers + } + return 1; } else { dol_print_error($this->db); diff --git a/htdocs/install/mysql/data/llx_10_c_regions.sql b/htdocs/install/mysql/data/llx_10_c_regions.sql index 1ab671f085e..df4f0dabee8 100644 --- a/htdocs/install/mysql/data/llx_10_c_regions.sql +++ b/htdocs/install/mysql/data/llx_10_c_regions.sql @@ -515,22 +515,22 @@ INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) values ( 2 -- Burundi Regions (id country=61) -- https://fr.wikipedia.org/wiki/Provinces_du_Burundi -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6101, '', 0, "Bubanza"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6102, '', 0, "Bujumbura Mairie"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6103, '', 0, "Bujumbura Rural"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6104, '', 0, "Bururi"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6105, '', 0, "Cankuzo"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6106, '', 0, "Cibitoke"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6107, '', 0, "Gitega"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6108, '', 0, "Karuzi"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6109, '', 0, "Kayanza"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6110, '', 0, "Kirundo"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6111, '', 0, "Makamba"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6112, '', 0, "Muramvya"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6113, '', 0, "Muyinga"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6114, '', 0, "Mwaro"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6115, '', 0, "Ngozi"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6116, '', 0, "Rumonge"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6117, '', 0, "Rutana"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6118, '', 0, "Ruyigi"); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6101, '', 0, 'Bubanza'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6102, '', 0, 'Bujumbura Mairie'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6103, '', 0, 'Bujumbura Rural'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6104, '', 0, 'Bururi'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6105, '', 0, 'Cankuzo'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6106, '', 0, 'Cibitoke'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6107, '', 0, 'Gitega'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6108, '', 0, 'Karuzi'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6109, '', 0, 'Kayanza'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6110, '', 0, 'Kirundo'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6111, '', 0, 'Makamba'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6112, '', 0, 'Muramvya'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6113, '', 0, 'Muyinga'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6114, '', 0, 'Mwaro'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6115, '', 0, 'Ngozi'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6116, '', 0, 'Rumonge'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6117, '', 0, 'Rutana'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6118, '', 0, 'Ruyigi'); diff --git a/htdocs/install/mysql/data/llx_c_action_trigger.sql b/htdocs/install/mysql/data/llx_c_action_trigger.sql index d039c285a3e..ab4395f35ed 100644 --- a/htdocs/install/mysql/data/llx_c_action_trigger.sql +++ b/htdocs/install/mysql/data/llx_c_action_trigger.sql @@ -167,10 +167,15 @@ insert into llx_c_action_trigger (code,label,description,elementtype,rang) value insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TASK_DELETE','Task deleted','Executed when a project task is deleted','project',152); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ACTION_CREATE','Action added','Executed when an action is added to the agenda','agenda',700); --- oliday +-- holiday insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('HOLIDAY_CREATE','Holiday created','Executed when a holiday is created','holiday',800); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('HOLIDAY_MODIFY','Holiday modified','Executed when a holiday is modified','holiday',801); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('HOLIDAY_VALIDATE','Holiday validated','Executed when a holiday is validated','holiday',802); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('HOLIDAY_APPROVE','Holiday aprouved','Executed when a holiday is aprouved','holiday',803); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('HOLIDAY_CANCEL','Holiday canceled','Executed when a holiday is canceled','holiday',802); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('HOLIDAY_DELETE','Holiday deleted','Executed when a holiday is deleted','holiday',804); + +-- facture rec +insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILLREC_CREATE','Template invoices created','Executed when a Template invoices is created','facturerec',900); +insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILLREC_MODIFY','Template invoices update','Executed when a Template invoices is updated','facturerec',901); +insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILLREC_DELETE','Template invoices deleted','Executed when a Template invoices is deleted','facturerec',902); From 8ebeb0bf8a57f29e27405df6fd399131282ace06 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Fri, 13 May 2022 11:29:48 +0200 Subject: [PATCH 511/738] =?UTF-8?q?add=20c=5Faction=5Ftrigger=20for=20auto?= =?UTF-8?q?=20batch=20invoice=20cr=C3=A9ation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- htdocs/compta/facture/class/facture-rec.class.php | 15 ++++++++++++++- .../install/mysql/data/llx_c_action_trigger.sql | 1 + 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/htdocs/compta/facture/class/facture-rec.class.php b/htdocs/compta/facture/class/facture-rec.class.php index aa9479de384..a406a48c7f6 100644 --- a/htdocs/compta/facture/class/facture-rec.class.php +++ b/htdocs/compta/facture/class/facture-rec.class.php @@ -1257,9 +1257,10 @@ class FactureRec extends CommonInvoice * * @param int $restrictioninvoiceid 0=All qualified template invoices found. > 0 = restrict action on invoice ID * @param int $forcevalidation 1=Force validation of invoice whatever is template auto_validate flag. + * @param int $notrigger Disable the trigger * @return int 0 if OK, < 0 if KO (this function is used also by cron so only 0 is OK) */ - public function createRecurringInvoices($restrictioninvoiceid = 0, $forcevalidation = 0) + public function createRecurringInvoices($restrictioninvoiceid = 0, $forcevalidation = 0, $notrigger = 0) { global $conf, $langs, $db, $user, $hookmanager; @@ -1339,6 +1340,8 @@ class FactureRec extends CommonInvoice $this->error = $facture->error; $error++; } + + if (!$error && ($facturerec->auto_validate || $forcevalidation)) { $result = $facture->validate($user); if ($result <= 0) { @@ -1357,6 +1360,16 @@ class FactureRec extends CommonInvoice $error++; } } + if (!$error && !$notrigger) { + // Call trigger + $result = $facturerec->call_trigger('BILLREC_CREATEBILL', $user); + if ($result < 0) { + $this->errors = $facturerec->errors; + $this->error = $facturerec->error; + $error++; + } + // End call triggers + } } else { $error++; $this->error = "Failed to load invoice template with id=".$line->rowid.", entity=".$conf->entity."\n"; diff --git a/htdocs/install/mysql/data/llx_c_action_trigger.sql b/htdocs/install/mysql/data/llx_c_action_trigger.sql index ab4395f35ed..e4936c53ba3 100644 --- a/htdocs/install/mysql/data/llx_c_action_trigger.sql +++ b/htdocs/install/mysql/data/llx_c_action_trigger.sql @@ -179,3 +179,4 @@ insert into llx_c_action_trigger (code,label,description,elementtype,rang) value insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILLREC_CREATE','Template invoices created','Executed when a Template invoices is created','facturerec',900); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILLREC_MODIFY','Template invoices update','Executed when a Template invoices is updated','facturerec',901); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILLREC_DELETE','Template invoices deleted','Executed when a Template invoices is deleted','facturerec',902); +insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILLREC_AUTOCREATEBILL','Template invoices use to create invoices with auto batch','Executed when a Template invoices is use to create invoice with auto batch','facturerec',903); From 82017d7a394bc2608ba637d06693f548524dae42 Mon Sep 17 00:00:00 2001 From: Thomas Negre Date: Thu, 12 May 2022 14:42:55 +0200 Subject: [PATCH 512/738] allow to modify invoices that have been validated in the past --- htdocs/compta/facture/card.php | 2 +- htdocs/compta/facture/class/facture.class.php | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index 7de827ff1d2..d3132a0cb4a 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -305,7 +305,7 @@ if (empty($reshook)) { $object->fetch($id); if (!empty($conf->global-> INVOICE_CHECK_POSTERIOR_DATE)) { - $last_of_type = $object->willBeLastOfSameType(); + $last_of_type = $object->willBeLastOfSameType($allow_validated_drafts = true); if (empty($object->date_validation) && !$last_of_type[0]) { setEventMessages($langs->transnoentities("ErrorInvoiceIsNotLastOfSameType", $object->ref, dol_print_date($object->date, 'day'), dol_print_date($last_of_type[1], 'day')), null, 'errors'); $action = ''; diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 9079e99dcf8..435b358ae32 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -3009,7 +3009,7 @@ class Facture extends CommonInvoice return -1; } if (!empty($conf->global-> INVOICE_CHECK_POSTERIOR_DATE)) { - $last_of_type = $this->willBeLastOfSameType(); + $last_of_type = $this->willBeLastOfSameType($allow_validated_drafts = true); if (!$last_of_type[0]) { $this->error = $langs->transnoentities("ErrorInvoiceIsNotLastOfSameType", $this->ref, dol_print_date($this->date, 'day'), dol_print_date($last_of_type[1], 'day')); return -1; @@ -5567,9 +5567,10 @@ class Facture extends CommonInvoice /** * See if current invoice date is posterior to the last invoice date among validated invoices of same type. + * @param boolean $allow_validated_drafts return true if the invoice has been validated before returning to DRAFT state. * @return boolean */ - public function willBeLastOfSameType() + public function willBeLastOfSameType($allow_validated_drafts = false) { // get date of last validated invoices of same type $sql = "SELECT datef"; @@ -5586,7 +5587,12 @@ class Facture extends CommonInvoice $last_date = $this->db->jdate($obj->datef); $invoice_date = $this->date; - return [$invoice_date >= $last_date, $last_date]; + $is_last_of_same_type = $invoice_date >= $last_date; + if ($allow_validated_drafts) { + $is_last_of_same_type = $is_last_of_same_type || (!strpos($this->ref, 'PROV') && $this->status == self::STATUS_DRAFT); + } + + return [$is_last_of_same_type, $last_date]; } else { // element is first of type to be validated return [true]; From a77c2c2260ee4fe9b0daf26dcd564659e25ffd7f Mon Sep 17 00:00:00 2001 From: lmarcouiller Date: Fri, 13 May 2022 11:51:58 +0200 Subject: [PATCH 513/738] Fix : import with selectbox --- htdocs/imports/import.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/imports/import.php b/htdocs/imports/import.php index 15d83cfe8e7..b87b1e18f1a 100644 --- a/htdocs/imports/import.php +++ b/htdocs/imports/import.php @@ -352,6 +352,7 @@ if ($step == 1 || !$datatoimport) { $serialized_array_match_file_to_database = ''; $array_match_file_to_database = array(); $_SESSION["dol_array_match_file_to_database"] = ''; + $_SESSION["dol_array_match_file_to_database_select"] = ''; $param = ''; if ($excludefirstline) { From 2ec2dc59a40534f78448a9044ce6b9690e802c2f Mon Sep 17 00:00:00 2001 From: lmarcouiller Date: Fri, 13 May 2022 14:55:21 +0200 Subject: [PATCH 514/738] New : import fields in societe class --- .../modules/import/import_csv.modules.php | 36 +++++++++++++---- .../modules/import/import_xlsx.modules.php | 39 +++++++++++++++---- htdocs/core/modules/modSociete.class.php | 20 ++++++++++ 3 files changed, 79 insertions(+), 16 deletions(-) diff --git a/htdocs/core/modules/import/import_csv.modules.php b/htdocs/core/modules/import/import_csv.modules.php index e45630df298..62f0ca6d387 100644 --- a/htdocs/core/modules/import/import_csv.modules.php +++ b/htdocs/core/modules/import/import_csv.modules.php @@ -709,15 +709,35 @@ class ImportCsv extends ModeleImports } // Define $listfields and $listvalues to build SQL request - $listfields[] = $fieldname; - - // Note: arrayrecord (and 'type') is filled with ->import_read_record called by import.php page before calling import_insert - if (empty($newval) && $arrayrecord[($key - 1)]['type'] < 0) { - $listvalues[] = ($newval == '0' ? $newval : "null"); - } elseif (empty($newval) && $arrayrecord[($key - 1)]['type'] == 0) { - $listvalues[] = "''"; + if ($conf->socialnetworks->enabled && strpos($fieldname, "socialnetworks") !== false) { + if (!in_array("socialnetworks", $listfields)) { + $listfields[] = "socialnetworks"; + } + if (!empty($newval) && $arrayrecord[($key - 1)]['type'] > 0) { + $socialkey = array_search("socialnetworks", $listfields); + if (empty($listvalues[$socialkey]) || $listvalues[$socialkey] == "null") { + $socialnetwork = explode("_", $fieldname)[1]; + $newvalue = '\'{ "'.$socialnetwork.'" : "'.$this->db->escape($newval).'" }\''; + $listvalues[$socialkey] = $newvalue; + } else { + $socialnetwork = explode("_", $fieldname)[1]; + $jsondata = $listvalues[$socialkey]; + $jsondata = str_replace("'", "", $jsondata); + $json = json_decode($jsondata); + $json->$socialnetwork = $this->db->escape($newval); + $listvalues[$socialkey] = "'".$this->db->escape(json_encode($json))."'"; + } + } } else { - $listvalues[] = "'".$this->db->escape($newval)."'"; + $listfields[] = $fieldname; + // Note: arrayrecord (and 'type') is filled with ->import_read_record called by import.php page before calling import_insert + if (empty($newval) && $arrayrecord[($key - 1)]['type'] < 0) { + $listvalues[] = ($newval == '0' ? $newval : "null"); + } elseif (empty($newval) && $arrayrecord[($key - 1)]['type'] == 0) { + $listvalues[] = "''"; + } else { + $listvalues[] = "'".$this->db->escape($newval)."'"; + } } } $i++; diff --git a/htdocs/core/modules/import/import_xlsx.modules.php b/htdocs/core/modules/import/import_xlsx.modules.php index 9fa5cbf2c44..a64063fa9af 100644 --- a/htdocs/core/modules/import/import_xlsx.modules.php +++ b/htdocs/core/modules/import/import_xlsx.modules.php @@ -363,6 +363,8 @@ class ImportXlsx extends ModeleImports $warning = 0; $this->errors = array(); $this->warnings = array(); + $this->nbinsert = 0; + $this->nbupdate = 0; //dol_syslog("import_csv.modules maxfields=".$maxfields." importid=".$importid); @@ -750,15 +752,36 @@ class ImportXlsx extends ModeleImports } // Define $listfields and $listvalues to build SQL request - $listfields[] = $fieldname; - - // Note: arrayrecord (and 'type') is filled with ->import_read_record called by import.php page before calling import_insert - if (empty($newval) && $arrayrecord[($key)]['type'] < 0) { - $listvalues[] = ($newval == '0' ? $newval : "null"); - } elseif (empty($newval) && $arrayrecord[($key)]['type'] == 0) { - $listvalues[] = "''"; + if ($conf->socialnetworks->enabled && strpos($fieldname, "socialnetworks") !== false) { + if (!in_array("socialnetworks", $listfields)) { + $listfields[] = "socialnetworks"; + } + if (!empty($newval) && $arrayrecord[($key)]['type'] > 0) { + $socialkey = array_search("socialnetworks", $listfields); + if (empty($listvalues[$socialkey]) || $listvalues[$socialkey] == "null") { + $socialnetwork = explode("_", $fieldname)[1]; + $newvalue = '\'{ "'.$socialnetwork.'" : "'.$this->db->escape($newval).'" }\''; + $listvalues[$socialkey] = $newvalue; + } else { + $socialnetwork = explode("_", $fieldname)[1]; + $jsondata = $listvalues[$socialkey]; + $jsondata = str_replace("'", "", $jsondata); + $json = json_decode($jsondata); + $json->$socialnetwork = $this->db->escape($newval); + $listvalues[$socialkey] = "'".$this->db->escape(json_encode($json))."'"; + } + } } else { - $listvalues[] = "'" . $this->db->escape($newval) . "'"; + $listfields[] = $fieldname; + + // Note: arrayrecord (and 'type') is filled with ->import_read_record called by import.php page before calling import_insert + if (empty($newval) && $arrayrecord[($key)]['type'] < 0) { + $listvalues[] = ($newval == '0' ? $newval : "null"); + } elseif (empty($newval) && $arrayrecord[($key)]['type'] == 0) { + $listvalues[] = "''"; + } else { + $listvalues[] = "'" . $this->db->escape($newval) . "'"; + } } } $i++; diff --git a/htdocs/core/modules/modSociete.class.php b/htdocs/core/modules/modSociete.class.php index 09089d57563..84a5e97f1bf 100644 --- a/htdocs/core/modules/modSociete.class.php +++ b/htdocs/core/modules/modSociete.class.php @@ -519,6 +519,16 @@ class modSociete extends DolibarrModules if (!empty($conf->global->ACCOUNTANCY_USE_PRODUCT_ACCOUNT_ON_THIRDPARTY)) { $this->import_fields_array[$r] += array('s.accountancy_code_sell'=>'ProductAccountancySellCode', 's.accountancy_code_buy'=>'ProductAccountancyBuyCode'); } + // Add social networks fields + if (!empty($conf->socialnetworks->enabled)) { + $sql = "SELECT code, label FROM ".MAIN_DB_PREFIX."c_socialnetworks WHERE active = 1"; + $resql = $this->db->query($sql); + while ($obj = $this->db->fetch_object($resql)) { + $fieldname = 's.socialnetworks_'.$obj->code; + $fieldlabel = ucfirst($obj->label); + $this->import_fields_array[$r][$fieldname] = $fieldlabel; + } + } // Add extra fields $sql = "SELECT name, label, fieldrequired FROM ".MAIN_DB_PREFIX."extrafields WHERE type <> 'separate' AND elementtype = 'societe' AND entity IN (0, ".$conf->entity.")"; $resql = $this->db->query($sql); @@ -695,6 +705,16 @@ class modSociete extends DolibarrModules 's.note_private' => "NotePrivate", 's.note_public' => "NotePublic" ); + // Add social networks fields + if (!empty($conf->socialnetworks->enabled)) { + $sql = "SELECT code, label FROM ".MAIN_DB_PREFIX."c_socialnetworks WHERE active = 1"; + $resql = $this->db->query($sql); + while ($obj = $this->db->fetch_object($resql)) { + $fieldname = 's.socialnetworks_'.$obj->code; + $fieldlabel = ucfirst($obj->label); + $this->import_fields_array[$r][$fieldname] = $fieldlabel; + } + } // Add extra fields $sql = "SELECT name, label, fieldrequired FROM ".MAIN_DB_PREFIX."extrafields WHERE type != 'separate' AND elementtype = 'socpeople' AND entity IN (0, ".$conf->entity.")"; $resql = $this->db->query($sql); From cfc8ce2ea86ce423540cfb5536dd9b8de709db0c Mon Sep 17 00:00:00 2001 From: lmarcouiller Date: Fri, 13 May 2022 15:02:17 +0200 Subject: [PATCH 515/738] Revert "New : import fields in societe class" This reverts commit 2ec2dc59a40534f78448a9044ce6b9690e802c2f. --- .../modules/import/import_csv.modules.php | 36 ++++------------- .../modules/import/import_xlsx.modules.php | 39 ++++--------------- htdocs/core/modules/modSociete.class.php | 20 ---------- 3 files changed, 16 insertions(+), 79 deletions(-) diff --git a/htdocs/core/modules/import/import_csv.modules.php b/htdocs/core/modules/import/import_csv.modules.php index 62f0ca6d387..e45630df298 100644 --- a/htdocs/core/modules/import/import_csv.modules.php +++ b/htdocs/core/modules/import/import_csv.modules.php @@ -709,35 +709,15 @@ class ImportCsv extends ModeleImports } // Define $listfields and $listvalues to build SQL request - if ($conf->socialnetworks->enabled && strpos($fieldname, "socialnetworks") !== false) { - if (!in_array("socialnetworks", $listfields)) { - $listfields[] = "socialnetworks"; - } - if (!empty($newval) && $arrayrecord[($key - 1)]['type'] > 0) { - $socialkey = array_search("socialnetworks", $listfields); - if (empty($listvalues[$socialkey]) || $listvalues[$socialkey] == "null") { - $socialnetwork = explode("_", $fieldname)[1]; - $newvalue = '\'{ "'.$socialnetwork.'" : "'.$this->db->escape($newval).'" }\''; - $listvalues[$socialkey] = $newvalue; - } else { - $socialnetwork = explode("_", $fieldname)[1]; - $jsondata = $listvalues[$socialkey]; - $jsondata = str_replace("'", "", $jsondata); - $json = json_decode($jsondata); - $json->$socialnetwork = $this->db->escape($newval); - $listvalues[$socialkey] = "'".$this->db->escape(json_encode($json))."'"; - } - } + $listfields[] = $fieldname; + + // Note: arrayrecord (and 'type') is filled with ->import_read_record called by import.php page before calling import_insert + if (empty($newval) && $arrayrecord[($key - 1)]['type'] < 0) { + $listvalues[] = ($newval == '0' ? $newval : "null"); + } elseif (empty($newval) && $arrayrecord[($key - 1)]['type'] == 0) { + $listvalues[] = "''"; } else { - $listfields[] = $fieldname; - // Note: arrayrecord (and 'type') is filled with ->import_read_record called by import.php page before calling import_insert - if (empty($newval) && $arrayrecord[($key - 1)]['type'] < 0) { - $listvalues[] = ($newval == '0' ? $newval : "null"); - } elseif (empty($newval) && $arrayrecord[($key - 1)]['type'] == 0) { - $listvalues[] = "''"; - } else { - $listvalues[] = "'".$this->db->escape($newval)."'"; - } + $listvalues[] = "'".$this->db->escape($newval)."'"; } } $i++; diff --git a/htdocs/core/modules/import/import_xlsx.modules.php b/htdocs/core/modules/import/import_xlsx.modules.php index a64063fa9af..9fa5cbf2c44 100644 --- a/htdocs/core/modules/import/import_xlsx.modules.php +++ b/htdocs/core/modules/import/import_xlsx.modules.php @@ -363,8 +363,6 @@ class ImportXlsx extends ModeleImports $warning = 0; $this->errors = array(); $this->warnings = array(); - $this->nbinsert = 0; - $this->nbupdate = 0; //dol_syslog("import_csv.modules maxfields=".$maxfields." importid=".$importid); @@ -752,36 +750,15 @@ class ImportXlsx extends ModeleImports } // Define $listfields and $listvalues to build SQL request - if ($conf->socialnetworks->enabled && strpos($fieldname, "socialnetworks") !== false) { - if (!in_array("socialnetworks", $listfields)) { - $listfields[] = "socialnetworks"; - } - if (!empty($newval) && $arrayrecord[($key)]['type'] > 0) { - $socialkey = array_search("socialnetworks", $listfields); - if (empty($listvalues[$socialkey]) || $listvalues[$socialkey] == "null") { - $socialnetwork = explode("_", $fieldname)[1]; - $newvalue = '\'{ "'.$socialnetwork.'" : "'.$this->db->escape($newval).'" }\''; - $listvalues[$socialkey] = $newvalue; - } else { - $socialnetwork = explode("_", $fieldname)[1]; - $jsondata = $listvalues[$socialkey]; - $jsondata = str_replace("'", "", $jsondata); - $json = json_decode($jsondata); - $json->$socialnetwork = $this->db->escape($newval); - $listvalues[$socialkey] = "'".$this->db->escape(json_encode($json))."'"; - } - } - } else { - $listfields[] = $fieldname; + $listfields[] = $fieldname; - // Note: arrayrecord (and 'type') is filled with ->import_read_record called by import.php page before calling import_insert - if (empty($newval) && $arrayrecord[($key)]['type'] < 0) { - $listvalues[] = ($newval == '0' ? $newval : "null"); - } elseif (empty($newval) && $arrayrecord[($key)]['type'] == 0) { - $listvalues[] = "''"; - } else { - $listvalues[] = "'" . $this->db->escape($newval) . "'"; - } + // Note: arrayrecord (and 'type') is filled with ->import_read_record called by import.php page before calling import_insert + if (empty($newval) && $arrayrecord[($key)]['type'] < 0) { + $listvalues[] = ($newval == '0' ? $newval : "null"); + } elseif (empty($newval) && $arrayrecord[($key)]['type'] == 0) { + $listvalues[] = "''"; + } else { + $listvalues[] = "'" . $this->db->escape($newval) . "'"; } } $i++; diff --git a/htdocs/core/modules/modSociete.class.php b/htdocs/core/modules/modSociete.class.php index 84a5e97f1bf..09089d57563 100644 --- a/htdocs/core/modules/modSociete.class.php +++ b/htdocs/core/modules/modSociete.class.php @@ -519,16 +519,6 @@ class modSociete extends DolibarrModules if (!empty($conf->global->ACCOUNTANCY_USE_PRODUCT_ACCOUNT_ON_THIRDPARTY)) { $this->import_fields_array[$r] += array('s.accountancy_code_sell'=>'ProductAccountancySellCode', 's.accountancy_code_buy'=>'ProductAccountancyBuyCode'); } - // Add social networks fields - if (!empty($conf->socialnetworks->enabled)) { - $sql = "SELECT code, label FROM ".MAIN_DB_PREFIX."c_socialnetworks WHERE active = 1"; - $resql = $this->db->query($sql); - while ($obj = $this->db->fetch_object($resql)) { - $fieldname = 's.socialnetworks_'.$obj->code; - $fieldlabel = ucfirst($obj->label); - $this->import_fields_array[$r][$fieldname] = $fieldlabel; - } - } // Add extra fields $sql = "SELECT name, label, fieldrequired FROM ".MAIN_DB_PREFIX."extrafields WHERE type <> 'separate' AND elementtype = 'societe' AND entity IN (0, ".$conf->entity.")"; $resql = $this->db->query($sql); @@ -705,16 +695,6 @@ class modSociete extends DolibarrModules 's.note_private' => "NotePrivate", 's.note_public' => "NotePublic" ); - // Add social networks fields - if (!empty($conf->socialnetworks->enabled)) { - $sql = "SELECT code, label FROM ".MAIN_DB_PREFIX."c_socialnetworks WHERE active = 1"; - $resql = $this->db->query($sql); - while ($obj = $this->db->fetch_object($resql)) { - $fieldname = 's.socialnetworks_'.$obj->code; - $fieldlabel = ucfirst($obj->label); - $this->import_fields_array[$r][$fieldname] = $fieldlabel; - } - } // Add extra fields $sql = "SELECT name, label, fieldrequired FROM ".MAIN_DB_PREFIX."extrafields WHERE type != 'separate' AND elementtype = 'socpeople' AND entity IN (0, ".$conf->entity.")"; $resql = $this->db->query($sql); From 1e406276c580939be97f4d76fc24bb9052206544 Mon Sep 17 00:00:00 2001 From: lmarcouiller Date: Fri, 13 May 2022 15:04:30 +0200 Subject: [PATCH 516/738] New : import fields in societe class --- .../modules/import/import_csv.modules.php | 36 +++++++++++++---- .../modules/import/import_xlsx.modules.php | 39 +++++++++++++++---- htdocs/core/modules/modSociete.class.php | 20 ++++++++++ 3 files changed, 79 insertions(+), 16 deletions(-) diff --git a/htdocs/core/modules/import/import_csv.modules.php b/htdocs/core/modules/import/import_csv.modules.php index e45630df298..62f0ca6d387 100644 --- a/htdocs/core/modules/import/import_csv.modules.php +++ b/htdocs/core/modules/import/import_csv.modules.php @@ -709,15 +709,35 @@ class ImportCsv extends ModeleImports } // Define $listfields and $listvalues to build SQL request - $listfields[] = $fieldname; - - // Note: arrayrecord (and 'type') is filled with ->import_read_record called by import.php page before calling import_insert - if (empty($newval) && $arrayrecord[($key - 1)]['type'] < 0) { - $listvalues[] = ($newval == '0' ? $newval : "null"); - } elseif (empty($newval) && $arrayrecord[($key - 1)]['type'] == 0) { - $listvalues[] = "''"; + if ($conf->socialnetworks->enabled && strpos($fieldname, "socialnetworks") !== false) { + if (!in_array("socialnetworks", $listfields)) { + $listfields[] = "socialnetworks"; + } + if (!empty($newval) && $arrayrecord[($key - 1)]['type'] > 0) { + $socialkey = array_search("socialnetworks", $listfields); + if (empty($listvalues[$socialkey]) || $listvalues[$socialkey] == "null") { + $socialnetwork = explode("_", $fieldname)[1]; + $newvalue = '\'{ "'.$socialnetwork.'" : "'.$this->db->escape($newval).'" }\''; + $listvalues[$socialkey] = $newvalue; + } else { + $socialnetwork = explode("_", $fieldname)[1]; + $jsondata = $listvalues[$socialkey]; + $jsondata = str_replace("'", "", $jsondata); + $json = json_decode($jsondata); + $json->$socialnetwork = $this->db->escape($newval); + $listvalues[$socialkey] = "'".$this->db->escape(json_encode($json))."'"; + } + } } else { - $listvalues[] = "'".$this->db->escape($newval)."'"; + $listfields[] = $fieldname; + // Note: arrayrecord (and 'type') is filled with ->import_read_record called by import.php page before calling import_insert + if (empty($newval) && $arrayrecord[($key - 1)]['type'] < 0) { + $listvalues[] = ($newval == '0' ? $newval : "null"); + } elseif (empty($newval) && $arrayrecord[($key - 1)]['type'] == 0) { + $listvalues[] = "''"; + } else { + $listvalues[] = "'".$this->db->escape($newval)."'"; + } } } $i++; diff --git a/htdocs/core/modules/import/import_xlsx.modules.php b/htdocs/core/modules/import/import_xlsx.modules.php index 9fa5cbf2c44..a64063fa9af 100644 --- a/htdocs/core/modules/import/import_xlsx.modules.php +++ b/htdocs/core/modules/import/import_xlsx.modules.php @@ -363,6 +363,8 @@ class ImportXlsx extends ModeleImports $warning = 0; $this->errors = array(); $this->warnings = array(); + $this->nbinsert = 0; + $this->nbupdate = 0; //dol_syslog("import_csv.modules maxfields=".$maxfields." importid=".$importid); @@ -750,15 +752,36 @@ class ImportXlsx extends ModeleImports } // Define $listfields and $listvalues to build SQL request - $listfields[] = $fieldname; - - // Note: arrayrecord (and 'type') is filled with ->import_read_record called by import.php page before calling import_insert - if (empty($newval) && $arrayrecord[($key)]['type'] < 0) { - $listvalues[] = ($newval == '0' ? $newval : "null"); - } elseif (empty($newval) && $arrayrecord[($key)]['type'] == 0) { - $listvalues[] = "''"; + if ($conf->socialnetworks->enabled && strpos($fieldname, "socialnetworks") !== false) { + if (!in_array("socialnetworks", $listfields)) { + $listfields[] = "socialnetworks"; + } + if (!empty($newval) && $arrayrecord[($key)]['type'] > 0) { + $socialkey = array_search("socialnetworks", $listfields); + if (empty($listvalues[$socialkey]) || $listvalues[$socialkey] == "null") { + $socialnetwork = explode("_", $fieldname)[1]; + $newvalue = '\'{ "'.$socialnetwork.'" : "'.$this->db->escape($newval).'" }\''; + $listvalues[$socialkey] = $newvalue; + } else { + $socialnetwork = explode("_", $fieldname)[1]; + $jsondata = $listvalues[$socialkey]; + $jsondata = str_replace("'", "", $jsondata); + $json = json_decode($jsondata); + $json->$socialnetwork = $this->db->escape($newval); + $listvalues[$socialkey] = "'".$this->db->escape(json_encode($json))."'"; + } + } } else { - $listvalues[] = "'" . $this->db->escape($newval) . "'"; + $listfields[] = $fieldname; + + // Note: arrayrecord (and 'type') is filled with ->import_read_record called by import.php page before calling import_insert + if (empty($newval) && $arrayrecord[($key)]['type'] < 0) { + $listvalues[] = ($newval == '0' ? $newval : "null"); + } elseif (empty($newval) && $arrayrecord[($key)]['type'] == 0) { + $listvalues[] = "''"; + } else { + $listvalues[] = "'" . $this->db->escape($newval) . "'"; + } } } $i++; diff --git a/htdocs/core/modules/modSociete.class.php b/htdocs/core/modules/modSociete.class.php index e4cf484df58..3b0a297ae0c 100644 --- a/htdocs/core/modules/modSociete.class.php +++ b/htdocs/core/modules/modSociete.class.php @@ -519,6 +519,16 @@ class modSociete extends DolibarrModules if (!empty($conf->global->ACCOUNTANCY_USE_PRODUCT_ACCOUNT_ON_THIRDPARTY)) { $this->import_fields_array[$r] += array('s.accountancy_code_sell'=>'ProductAccountancySellCode', 's.accountancy_code_buy'=>'ProductAccountancyBuyCode'); } + // Add social networks fields + if (!empty($conf->socialnetworks->enabled)) { + $sql = "SELECT code, label FROM ".MAIN_DB_PREFIX."c_socialnetworks WHERE active = 1"; + $resql = $this->db->query($sql); + while ($obj = $this->db->fetch_object($resql)) { + $fieldname = 's.socialnetworks_'.$obj->code; + $fieldlabel = ucfirst($obj->label); + $this->import_fields_array[$r][$fieldname] = $fieldlabel; + } + } // Add extra fields $sql = "SELECT name, label, fieldrequired FROM ".MAIN_DB_PREFIX."extrafields WHERE type <> 'separate' AND elementtype = 'societe' AND entity IN (0, ".$conf->entity.")"; $resql = $this->db->query($sql); @@ -718,6 +728,16 @@ class modSociete extends DolibarrModules 's.note_private' => "NotePrivate", 's.note_public' => "NotePublic" ); + // Add social networks fields + if (!empty($conf->socialnetworks->enabled)) { + $sql = "SELECT code, label FROM ".MAIN_DB_PREFIX."c_socialnetworks WHERE active = 1"; + $resql = $this->db->query($sql); + while ($obj = $this->db->fetch_object($resql)) { + $fieldname = 's.socialnetworks_'.$obj->code; + $fieldlabel = ucfirst($obj->label); + $this->import_fields_array[$r][$fieldname] = $fieldlabel; + } + } // Add extra fields $sql = "SELECT name, label, fieldrequired FROM ".MAIN_DB_PREFIX."extrafields WHERE type != 'separate' AND elementtype = 'socpeople' AND entity IN (0, ".$conf->entity.")"; $resql = $this->db->query($sql); From 1ba8bc9147588f51b9ae1f720ed6055f33accce3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 14 May 2022 07:51:48 +0200 Subject: [PATCH 517/738] css --- htdocs/societe/list.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php index bdc0fae08e0..80b0142a572 100644 --- a/htdocs/societe/list.php +++ b/htdocs/societe/list.php @@ -1466,7 +1466,7 @@ while ($i < min($num, $limit)) { } // Address if (!empty($arrayfields['s.address']['checked'])) { - print ''.dol_escape_htmltag($obj->address).''; + print ''.dol_escape_htmltag($obj->address).''; if (!$i) { $totalarray['nbfield']++; } @@ -1673,7 +1673,7 @@ while ($i < min($num, $limit)) { print $hookmanager->resPrint; // Date creation if (!empty($arrayfields['s.datec']['checked'])) { - print ''; + print ''; print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); print ''; if (!$i) { @@ -1682,7 +1682,7 @@ while ($i < min($num, $limit)) { } // Date modification if (!empty($arrayfields['s.tms']['checked'])) { - print ''; + print ''; print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); print ''; if (!$i) { @@ -1691,7 +1691,7 @@ while ($i < min($num, $limit)) { } // Status if (!empty($arrayfields['s.status']['checked'])) { - print ''.$companystatic->getLibStatut(5).''; + print ''.$companystatic->getLibStatut(5).''; if (!$i) { $totalarray['nbfield']++; } From 508cbee1a5e008d45535edd8fa994fdc04a20d9e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 15 May 2022 22:29:19 +0200 Subject: [PATCH 518/738] Fix php8 --- htdocs/accountancy/admin/productaccount.php | 14 ++++++------ .../class/accountingaccount.class.php | 10 ++++----- htdocs/accountancy/class/lettering.class.php | 16 +++++++------- htdocs/adherents/class/subscription.class.php | 10 ++++----- htdocs/adherents/index.php | 20 ++++++++--------- htdocs/compta/facture/prelevement.php | 20 ++++++++--------- htdocs/compta/paiement_charge.php | 2 +- htdocs/compta/paiement_vat.php | 2 +- htdocs/compta/prelevement/stats.php | 3 ++- htdocs/contrat/index.php | 22 ++++++++++++------- htdocs/core/boxes/box_boms.php | 2 +- htdocs/core/boxes/box_clients.php | 2 +- htdocs/core/boxes/box_contacts.php | 2 +- htdocs/core/boxes/box_contracts.php | 9 ++++---- htdocs/core/boxes/box_members.php | 2 +- htdocs/core/boxes/box_mos.php | 2 +- htdocs/core/boxes/box_propales.php | 2 +- htdocs/don/payment/payment.php | 2 +- htdocs/expensereport/payment/payment.php | 2 +- .../class/fournisseur.commande.class.php | 2 +- htdocs/loan/payment/payment.php | 2 +- htdocs/ticket/class/ticket.class.php | 7 +++++- 22 files changed, 84 insertions(+), 71 deletions(-) diff --git a/htdocs/accountancy/admin/productaccount.php b/htdocs/accountancy/admin/productaccount.php index 1a682636077..c8cb62cd7e0 100644 --- a/htdocs/accountancy/admin/productaccount.php +++ b/htdocs/accountancy/admin/productaccount.php @@ -395,8 +395,8 @@ $sql .= $db->order($sortfield, $sortorder); $nbtotalofrecords = ''; if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) { - $result = $db->query($sql); - $nbtotalofrecords = $db->num_rows($result); + $resql = $db->query($sql); + $nbtotalofrecords = $db->num_rows($resql); if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0 $page = 0; $offset = 0; @@ -406,9 +406,9 @@ if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) { $sql .= $db->plimit($limit + 1, $offset); dol_syslog("/accountancy/admin/productaccount.php", LOG_DEBUG); -$result = $db->query($sql); -if ($result) { - $num = $db->num_rows($result); +$resql = $db->query($sql); +if ($resql) { + $num = $db->num_rows($resql); $i = 0; $param = ''; @@ -608,7 +608,7 @@ if ($result) { $i = 0; while ($i < min($num, $limit)) { - $obj = $db->fetch_object($result); + $obj = $db->fetch_object($resql); // Ref produit as link $product_static->ref = $obj->ref; @@ -891,7 +891,7 @@ if ($result) { print ''; - $db->free($result); + $db->free($resql); } else { dol_print_error($db); } diff --git a/htdocs/accountancy/class/accountingaccount.class.php b/htdocs/accountancy/class/accountingaccount.class.php index ac943180b58..72efffc2b49 100644 --- a/htdocs/accountancy/class/accountingaccount.class.php +++ b/htdocs/accountancy/class/accountingaccount.class.php @@ -586,11 +586,11 @@ class AccountingAccount extends CommonObject $sql .= ' WHERE a.rowid = ' . ((int) $id); dol_syslog(get_class($this) . '::info sql=' . $sql); - $result = $this->db->query($sql); + $resql = $this->db->query($sql); - if ($result) { - if ($this->db->num_rows($result)) { - $obj = $this->db->fetch_object($result); + if ($resql) { + if ($this->db->num_rows($resql)) { + $obj = $this->db->fetch_object($resql); $this->id = $obj->rowid; if ($obj->fk_user_author) { $cuser = new User($this->db); @@ -605,7 +605,7 @@ class AccountingAccount extends CommonObject $this->date_creation = $this->db->jdate($obj->datec); $this->date_modification = $this->db->jdate($obj->tms); } - $this->db->free($result); + $this->db->free($resql); } else { dol_print_error($this->db); } diff --git a/htdocs/accountancy/class/lettering.class.php b/htdocs/accountancy/class/lettering.class.php index a2718973185..81caaa05358 100644 --- a/htdocs/accountancy/class/lettering.class.php +++ b/htdocs/accountancy/class/lettering.class.php @@ -266,14 +266,14 @@ class Lettering extends BookKeeping $sql .= " ORDER BY ab2.lettering_code DESC"; $sql .= " LIMIT 1 "; - $result = $this->db->query($sql); - if ($result) { - $obj = $this->db->fetch_object($result); + $resqla = $this->db->query($sql); + if ($resqla) { + $obj = $this->db->fetch_object($resqla); $lettre = (empty($obj->lettering_code) ? 'AAA' : $obj->lettering_code); if (!empty($obj->lettering_code)) { $lettre++; } - $this->db->free($result); + $this->db->free($resqla); } else { $this->errors[] = 'Error'.$this->db->lasterror(); $error++; @@ -281,14 +281,14 @@ class Lettering extends BookKeeping $sql = "SELECT SUM(ABS(debit)) as deb, SUM(ABS(credit)) as cred FROM ".MAIN_DB_PREFIX."accounting_bookkeeping WHERE "; $sql .= " rowid IN (".$this->db->sanitize(implode(',', $ids)).") AND lettering_code IS NULL AND subledger_account != ''"; - $result = $this->db->query($sql); - if ($result) { - $obj = $this->db->fetch_object($result); + $resqlb = $this->db->query($sql); + if ($resqlb) { + $obj = $this->db->fetch_object($resqlb); if (!(round(abs($obj->deb), 2) === round(abs($obj->cred), 2))) { $this->errors[] = 'Total not exacts '.round(abs($obj->deb), 2).' vs '.round(abs($obj->cred), 2); $error++; } - $this->db->free($result); + $this->db->free($resqlb); } else { $this->errors[] = 'Erreur sql'.$this->db->lasterror(); $error++; diff --git a/htdocs/adherents/class/subscription.class.php b/htdocs/adherents/class/subscription.class.php index 9aef78174de..b3cfe027197 100644 --- a/htdocs/adherents/class/subscription.class.php +++ b/htdocs/adherents/class/subscription.class.php @@ -490,17 +490,17 @@ class Subscription extends CommonObject $sql .= ' FROM '.MAIN_DB_PREFIX.'subscription as c'; $sql .= ' WHERE c.rowid = '.((int) $id); - $result = $this->db->query($sql); - if ($result) { - if ($this->db->num_rows($result)) { - $obj = $this->db->fetch_object($result); + $resql = $this->db->query($sql); + if ($resql) { + if ($this->db->num_rows($resql)) { + $obj = $this->db->fetch_object($resql); $this->id = $obj->rowid; $this->date_creation = $this->db->jdate($obj->datec); $this->date_modification = $this->db->jdate($obj->datem); } - $this->db->free($result); + $this->db->free($resql); } else { dol_print_error($this->db); } diff --git a/htdocs/adherents/index.php b/htdocs/adherents/index.php index 2b0c295afbd..1ef98dddb6d 100644 --- a/htdocs/adherents/index.php +++ b/htdocs/adherents/index.php @@ -99,12 +99,12 @@ $sql .= " WHERE t.entity IN (".getEntity('member_type').")"; $sql .= " GROUP BY t.rowid, t.libelle, t.subscription, d.statut"; dol_syslog("index.php::select nb of members per type", LOG_DEBUG); -$result = $db->query($sql); -if ($result) { - $num = $db->num_rows($result); +$resql = $db->query($sql); +if ($resql) { + $num = $db->num_rows($resql); $i = 0; while ($i < $num) { - $objp = $db->fetch_object($result); + $objp = $db->fetch_object($resql); $adhtype = new AdherentType($db); $adhtype->id = $objp->rowid; @@ -127,7 +127,7 @@ if ($result) { $i++; } - $db->free($result); + $db->free($resql); } $now = dol_now(); @@ -143,16 +143,16 @@ $sql .= " AND t.rowid = d.fk_adherent_type"; $sql .= " GROUP BY d.fk_adherent_type"; dol_syslog("index.php::select nb of uptodate members by type", LOG_DEBUG); -$result = $db->query($sql); -if ($result) { - $num = $db->num_rows($result); +$resql = $db->query($sql); +if ($resql) { + $num = $db->num_rows($resql); $i = 0; while ($i < $num) { - $objp = $db->fetch_object($result); + $objp = $db->fetch_object($resql); $MembersUpToDate[$objp->fk_adherent_type] = $objp->somme; $i++; } - $db->free(); + $db->free($resql); } /* diff --git a/htdocs/compta/facture/prelevement.php b/htdocs/compta/facture/prelevement.php index 316254b0398..583626f0220 100644 --- a/htdocs/compta/facture/prelevement.php +++ b/htdocs/compta/facture/prelevement.php @@ -310,9 +310,9 @@ if ($object->id > 0) { $sql .= " AND pfd.ext_payment_id IS NULL"; $sql .= " ORDER BY pfd.date_demande DESC"; - $result_sql = $db->query($sql); - if ($result_sql) { - $num = $db->num_rows($result_sql); + $resql = $db->query($sql); + if ($resql) { + $num = $db->num_rows($resql); $numopen = $num; } else { dol_print_error($db); @@ -695,9 +695,9 @@ if ($object->id > 0) { $sql .= " AND pfd.traite = 0"; $sql .= " AND pfd.ext_payment_id IS NULL"; - $result_sql = $db->query($sql); - if ($result_sql) { - $obj = $db->fetch_object($result_sql); + $resql = $db->query($sql); + if ($resql) { + $obj = $db->fetch_object($resql); if ($obj) { $pending = $obj->amount; } @@ -797,17 +797,17 @@ if ($object->id > 0) { $sql .= " AND pfd.ext_payment_id IS NULL"; $sql .= " ORDER BY pfd.date_demande DESC"; - $result_sql = $db->query($sql); + $resql = $db->query($sql); $num = 0; - if ($result_sql) { + if ($resql) { $i = 0; $tmpuser = new User($db); $num = $db->num_rows($result); while ($i < $num) { - $obj = $db->fetch_object($result_sql); + $obj = $db->fetch_object($resql); $tmpuser->id = $obj->user_id; $tmpuser->login = $obj->login; @@ -840,7 +840,7 @@ if ($object->id > 0) { $i++; } - $db->free($result_sql); + $db->free($resql); } else { dol_print_error($db); } diff --git a/htdocs/compta/paiement_charge.php b/htdocs/compta/paiement_charge.php index 7cd49a9427c..640ffc78d99 100644 --- a/htdocs/compta/paiement_charge.php +++ b/htdocs/compta/paiement_charge.php @@ -198,7 +198,7 @@ if ($action == 'create') { if ($resql) { $obj = $db->fetch_object($resql); $sumpaid = $obj->total; - $db->free(); + $db->free($resql); } /*print ''.$langs->trans("AlreadyPaid").''.price($sumpaid,0,$outputlangs,1,-1,-1,$conf->currency).''; print ''.$langs->trans("RemainderToPay").''.price($total-$sumpaid,0,$outputlangs,1,-1,-1,$conf->currency).'';*/ diff --git a/htdocs/compta/paiement_vat.php b/htdocs/compta/paiement_vat.php index 28bc838c296..84d2765b278 100644 --- a/htdocs/compta/paiement_vat.php +++ b/htdocs/compta/paiement_vat.php @@ -194,7 +194,7 @@ if ($action == 'create') { if ($resql) { $obj = $db->fetch_object($resql); $sumpaid = $obj->total; - $db->free(); + $db->free($resql); } /*print ''.$langs->trans("AlreadyPaid").''.price($sumpaid,0,$outputlangs,1,-1,-1,$conf->currency).''; print ''.$langs->trans("RemainderToPay").''.price($total-$sumpaid,0,$outputlangs,1,-1,-1,$conf->currency).'';*/ diff --git a/htdocs/compta/prelevement/stats.php b/htdocs/compta/prelevement/stats.php index 9c30db6e08a..8ee4c854600 100644 --- a/htdocs/compta/prelevement/stats.php +++ b/htdocs/compta/prelevement/stats.php @@ -143,7 +143,8 @@ if ($resql) { print price($total); print ' '; print ""; - $db->free(); + + $db->free($resql); } else { dol_print_error($db); } diff --git a/htdocs/contrat/index.php b/htdocs/contrat/index.php index 99739260b36..db0f515273c 100644 --- a/htdocs/contrat/index.php +++ b/htdocs/contrat/index.php @@ -346,22 +346,27 @@ if ($result) { while ($i < $num) { $obj = $db->fetch_object($result); + $datem = $db->jdate($obj->tms); + + $staticcontrat->ref = ($obj->ref ? $obj->ref : $obj->cid); + $staticcontrat->id = $obj->cid; + + $staticcompany->id = $obj->socid; + $staticcompany->name = $obj->name; print ''; print ''; - $staticcontrat->ref = ($obj->ref ? $obj->ref : $obj->cid); - $staticcontrat->id = $obj->cid; print $staticcontrat->getNomUrl(1, 16); if ($obj->nb_late) { print img_warning($langs->trans("Late")); } print ''; print ''; - $staticcompany->id = $obj->socid; - $staticcompany->name = $obj->name; print $staticcompany->getNomUrl(1, '', 20); print ''; - print ''.dol_print_date($db->jdate($obj->tms), 'dayhour').''; + print ''; + print dol_print_date($datem, 'dayhour'); + print ''; //print ''.$staticcontrat->LibStatut($obj->statut,2).''; print ''.($obj->nb_initial > 0 ? ''.$obj->nb_initial.''.$staticcontratligne->LibStatut(0, 3, -1, 'class="paddingleft"') : '').''; print ''.($obj->nb_running > 0 ? ''.$obj->nb_running.''.$staticcontratligne->LibStatut(4, 3, 0, 'class="marginleft"') : '').''; @@ -451,7 +456,7 @@ if ($resql) { print "\n"; $i++; } - $db->free(); + $db->free($resql); print ""; } else { @@ -532,7 +537,8 @@ if ($resql) { print "\n"; $i++; } - $db->free(); + + $db->free($resql); print ""; } else { @@ -614,7 +620,7 @@ if ($resql) { print "\n"; $i++; } - $db->free(); + $db->free($resql); print ""; } else { diff --git a/htdocs/core/boxes/box_boms.php b/htdocs/core/boxes/box_boms.php index d96fac8bc76..a9a4f8746da 100644 --- a/htdocs/core/boxes/box_boms.php +++ b/htdocs/core/boxes/box_boms.php @@ -147,7 +147,7 @@ class box_boms extends ModeleBoxes } $this->info_box_contents[$line][] = array( - 'td' => 'class="right"', + 'td' => 'class="center nowraponall" title="'.dol_escape_htmltag($langs->trans("DateModification").': '.dol_print_date($datem, 'dayhour', 'tzuserrel')).'"', 'text' => dol_print_date($datem, 'day', 'tzuserrel'), ); diff --git a/htdocs/core/boxes/box_clients.php b/htdocs/core/boxes/box_clients.php index 2afa630860b..4a7ea965006 100644 --- a/htdocs/core/boxes/box_clients.php +++ b/htdocs/core/boxes/box_clients.php @@ -140,7 +140,7 @@ class box_clients extends ModeleBoxes ); $this->info_box_contents[$line][] = array( - 'td' => 'class="center nowraponall"', + 'td' => 'class="center nowraponall" title="'.dol_escape_htmltag($langs->trans("DateModification").': '.dol_print_date($datem, 'dayhour', 'tzuserrel')).'"', 'text' => dol_print_date($datem, "day", 'tzuserrel') ); diff --git a/htdocs/core/boxes/box_contacts.php b/htdocs/core/boxes/box_contacts.php index b2ba608d689..ea35a080d0e 100644 --- a/htdocs/core/boxes/box_contacts.php +++ b/htdocs/core/boxes/box_contacts.php @@ -177,7 +177,7 @@ class box_contacts extends ModeleBoxes ); $this->info_box_contents[$line][] = array( - 'td' => 'class="right"', + 'td' => 'class="center nowraponall" title="'.dol_escape_htmltag($langs->trans("DateModification").': '.dol_print_date($datem, 'dayhour', 'tzuserrel')).'"', 'text' => dol_print_date($datem, "day", 'tzuserrel'), ); diff --git a/htdocs/core/boxes/box_contracts.php b/htdocs/core/boxes/box_contracts.php index 8eeb1b93323..dddafffdc02 100644 --- a/htdocs/core/boxes/box_contracts.php +++ b/htdocs/core/boxes/box_contracts.php @@ -83,8 +83,8 @@ class box_contracts extends ModeleBoxes $thirdpartytmp = new Societe($this->db); $sql = "SELECT s.nom as name, s.rowid as socid, s.email, s.client, s.fournisseur, s.code_client, s.code_fournisseur, s.code_compta, s.code_compta_fournisseur,"; - $sql .= " c.rowid, c.ref, c.statut as fk_statut, c.date_contrat, c.datec, c.fin_validite, c.date_cloture"; - $sql .= ", c.ref_customer, c.ref_supplier"; + $sql .= " c.rowid, c.ref, c.statut as fk_statut, c.date_contrat, c.datec, c.tms as date_modification, c.fin_validite, c.date_cloture,"; + $sql .= " c.ref_customer, c.ref_supplier"; $sql .= " FROM ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."contrat as c"; if (empty($user->rights->societe->client->voir) && !$user->socid) { $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; @@ -117,6 +117,7 @@ class box_contracts extends ModeleBoxes $objp = $this->db->fetch_object($resql); $datec = $this->db->jdate($objp->datec); + $datem = $this->db->jdate($objp->date_modification); $dateterm = $this->db->jdate($objp->fin_validite); $dateclose = $this->db->jdate($objp->date_cloture); $late = ''; @@ -155,8 +156,8 @@ class box_contracts extends ModeleBoxes ); $this->info_box_contents[$line][] = array( - 'td' => 'class="right"', - 'text' => dol_print_date($datec, 'day', 'tzuserrel'), + 'td' => 'class="center nowraponall" title="'.dol_escape_htmltag($langs->trans("DateModification").': '.dol_print_date($datem, 'dayhour', 'tzuserrel')).'"', + 'text' => dol_print_date($datem, 'day', 'tzuserrel'), ); $this->info_box_contents[$line][] = array( diff --git a/htdocs/core/boxes/box_members.php b/htdocs/core/boxes/box_members.php index 5865cba2530..e091d58643b 100644 --- a/htdocs/core/boxes/box_members.php +++ b/htdocs/core/boxes/box_members.php @@ -145,7 +145,7 @@ class box_members extends ModeleBoxes ); $this->info_box_contents[$line][] = array( - 'td' => 'class="center nowraponall"', + 'td' => 'class="center nowraponall" title="'.dol_escape_htmltag($langs->trans("DateModification").': '.dol_print_date($datem, 'dayhour', 'tzuserrel')).'"', 'text' => dol_print_date($datem, "day", 'tzuserrel'), ); diff --git a/htdocs/core/boxes/box_mos.php b/htdocs/core/boxes/box_mos.php index 6436fb8e34e..cff19388c17 100644 --- a/htdocs/core/boxes/box_mos.php +++ b/htdocs/core/boxes/box_mos.php @@ -144,7 +144,7 @@ class box_mos extends ModeleBoxes } $this->info_box_contents[$line][] = array( - 'td' => 'class="center nowraponall"', + 'td' => 'class="center nowraponall" title="'.dol_escape_htmltag($langs->trans("DateModification").': '.dol_print_date($datem, 'dayhour', 'tzuserrel')).'"', 'text' => dol_print_date($datem, 'day', 'tzuserrel'), ); diff --git a/htdocs/core/boxes/box_propales.php b/htdocs/core/boxes/box_propales.php index f3f9496325f..97b7bd5fd51 100644 --- a/htdocs/core/boxes/box_propales.php +++ b/htdocs/core/boxes/box_propales.php @@ -165,7 +165,7 @@ class box_propales extends ModeleBoxes ); $this->info_box_contents[$line][] = array( - 'td' => 'class="center nowraponall"', + 'td' => 'class="center nowraponall" title="'.dol_escape_htmltag($langs->trans("Date").': '.dol_print_date($datem, 'day', 'tzuserrel')).'"', 'text' => dol_print_date($date, 'day', 'tzuserrel'), ); diff --git a/htdocs/don/payment/payment.php b/htdocs/don/payment/payment.php index 5128509c88c..6cc37303346 100644 --- a/htdocs/don/payment/payment.php +++ b/htdocs/don/payment/payment.php @@ -149,7 +149,7 @@ $resql = $db->query($sql); if ($resql) { $obj = $db->fetch_object($resql); $sumpaid = $obj->total; - $db->free(); + $db->free($resql); } diff --git a/htdocs/expensereport/payment/payment.php b/htdocs/expensereport/payment/payment.php index ee80c9bc24a..185b3cdc139 100644 --- a/htdocs/expensereport/payment/payment.php +++ b/htdocs/expensereport/payment/payment.php @@ -212,7 +212,7 @@ if ($action == 'create' || empty($action)) { if ($resql) { $obj = $db->fetch_object($resql); $sumpaid = $obj->total; - $db->free(); + $db->free($resql); } print ''.$langs->trans("AlreadyPaid").''.price($sumpaid, 0, $outputlangs, 1, -1, -1, $conf->currency).''; print ''.$langs->trans("RemainderToPay").''.price($total - $sumpaid, 0, $outputlangs, 1, -1, -1, $conf->currency).''; diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php index 1d26fb5cfab..b08e31381a1 100644 --- a/htdocs/fourn/class/fournisseur.commande.class.php +++ b/htdocs/fourn/class/fournisseur.commande.class.php @@ -3523,7 +3523,7 @@ class CommandeFournisseur extends CommonOrder empty($this->receptions[$obj->rowid]) ? $this->receptions[$obj->rowid] = $obj->qty : $this->receptions[$obj->rowid] += $obj->qty; $i++; } - $this->db->free(); + $this->db->free($resql); return $num; } else { diff --git a/htdocs/loan/payment/payment.php b/htdocs/loan/payment/payment.php index 47fa5b37846..ac2b967593c 100644 --- a/htdocs/loan/payment/payment.php +++ b/htdocs/loan/payment/payment.php @@ -244,7 +244,7 @@ if ($action == 'create') { if ($resql) { $obj = $db->fetch_object($resql); $sumpaid = $obj->total; - $db->free(); + $db->free($resql); } print '
    '; diff --git a/htdocs/ticket/class/ticket.class.php b/htdocs/ticket/class/ticket.class.php index 72ec8625e0e..9e097e303c8 100644 --- a/htdocs/ticket/class/ticket.class.php +++ b/htdocs/ticket/class/ticket.class.php @@ -1372,7 +1372,12 @@ class Ticket extends CommonObject $label .= ''.$langs->trans('Ref').': '.$this->ref.'
    '; $label .= ''.$langs->trans('TicketTrackId').': '.$this->track_id.'
    '; $label .= ''.$langs->trans('Subject').': '.$this->subject; - + if ($this->date_creation) { + $label .= '
    '.$langs->trans('DateCreation').': '.$this->date_creation; + } + if ($this->date_modification) { + $label .= '
    '.$langs->trans('DateModification').': '.$this->date_modification; + } $url = DOL_URL_ROOT.'/ticket/card.php?id='.$this->id; if ($option != 'nolink') { From ac60aa47110809121962251bfeba8a1d6f43c4e3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 May 2022 10:45:42 +0200 Subject: [PATCH 519/738] NEW Add filter "opportunity status" on statistics of projects. --- htdocs/projet/class/project.class.php | 6 +- htdocs/projet/class/projectstats.class.php | 24 ++++- htdocs/projet/list.php | 4 +- htdocs/projet/stats/index.php | 89 +++++-------------- .../workstation/class/workstation.class.php | 6 +- 5 files changed, 53 insertions(+), 76 deletions(-) diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index 98f2fed52b4..4fd6c3976fe 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -236,14 +236,14 @@ class Project extends CommonObject 'datee' =>array('type'=>'date', 'label'=>'DateEnd', 'enabled'=>1, 'visible'=>1, 'position'=>35), 'description' =>array('type'=>'text', 'label'=>'Description', 'enabled'=>1, 'visible'=>3, 'position'=>55, 'searchall'=>1), 'public' =>array('type'=>'integer', 'label'=>'Visibility', 'enabled'=>1, 'visible'=>1, 'position'=>65), - 'fk_opp_status' =>array('type'=>'integer', 'label'=>'OpportunityStatusShort', 'enabled'=>1, 'visible'=>1, 'position'=>75), - 'opp_percent' =>array('type'=>'double(5,2)', 'label'=>'OpportunityProbabilityShort', 'enabled'=>1, 'visible'=>1, 'position'=>80), + 'fk_opp_status' =>array('type'=>'integer', 'label'=>'OpportunityStatusShort', 'enabled'=>'!empty($conf->global->PROJECT_USE_OPPORTUNITIES)', 'visible'=>1, 'position'=>75), + 'opp_percent' =>array('type'=>'double(5,2)', 'label'=>'OpportunityProbabilityShort', 'enabled'=>'!empty($conf->global->PROJECT_USE_OPPORTUNITIES)', 'visible'=>1, 'position'=>80), 'note_private' =>array('type'=>'text', 'label'=>'NotePrivate', 'enabled'=>1, 'visible'=>0, 'position'=>85, 'searchall'=>1), 'note_public' =>array('type'=>'text', 'label'=>'NotePublic', 'enabled'=>1, 'visible'=>0, 'position'=>90, 'searchall'=>1), 'model_pdf' =>array('type'=>'varchar(255)', 'label'=>'ModelPdf', 'enabled'=>1, 'visible'=>0, 'position'=>95), 'date_close' =>array('type'=>'datetime', 'label'=>'DateClosing', 'enabled'=>1, 'visible'=>0, 'position'=>105), 'fk_user_close' =>array('type'=>'integer', 'label'=>'UserClosing', 'enabled'=>1, 'visible'=>0, 'position'=>110), - 'opp_amount' =>array('type'=>'double(24,8)', 'label'=>'OpportunityAmountShort', 'enabled'=>1, 'visible'=>1, 'position'=>115), + 'opp_amount' =>array('type'=>'double(24,8)', 'label'=>'OpportunityAmountShort', 'enabled'=>1, 'visible'=>'!empty($conf->global->PROJECT_USE_OPPORTUNITIES)', 'position'=>115), 'budget_amount' =>array('type'=>'double(24,8)', 'label'=>'Budget', 'enabled'=>1, 'visible'=>1, 'position'=>119), 'usage_bill_time' =>array('type'=>'integer', 'label'=>'UsageBillTimeShort', 'enabled'=>1, 'visible'=>-1, 'position'=>130), 'usage_opportunity' =>array('type'=>'integer', 'label'=>'UsageOpportunity', 'enabled'=>1, 'visible'=>-1, 'position'=>135), diff --git a/htdocs/projet/class/projectstats.class.php b/htdocs/projet/class/projectstats.class.php index efd8ecc3424..9b2314deacc 100644 --- a/htdocs/projet/class/projectstats.class.php +++ b/htdocs/projet/class/projectstats.class.php @@ -28,6 +28,10 @@ class ProjectStats extends Stats public $userid; public $socid; public $year; + public $yearmonth; + public $status; + public $opp_status; + /** * Constructor @@ -180,7 +184,25 @@ class ProjectStats extends Stats } if (!empty($this->status)) { - $sqlwhere[] = " t.fk_opp_status IN (".$this->db->sanitize($this->status).")"; + $sqlwhere[] = " t.fk_statut IN (".$this->db->sanitize($this->status).")"; + } + + if (!empty($this->opp_status)) { + if (is_numeric($this->opp_status) && $this->opp_status > 0) { + $sqlwhere[] = " t.fk_opp_status = ".((int) $this->opp_status); + } + if ($this->opp_status == 'all') { + $sqlwhere[] = " (t.fk_opp_status IS NOT NULL AND t.fk_opp_status <> -1)"; + } + if ($this->opp_status == 'openedopp') { + $sqlwhere[] = " (t.fk_opp_status IS NOT NULL AND t.fk_opp_status <> -1 AND t.fk_opp_status NOT IN (SELECT rowid FROM ".MAIN_DB_PREFIX."c_lead_status WHERE code IN ('WON','LOST')))"; + } + if ($this->opp_status == 'notopenedopp') { + $sqlwhere[] = " (t.fk_opp_status IS NULL OR t.fk_opp_status = -1 OR t.fk_opp_status IN (SELECT rowid FROM ".MAIN_DB_PREFIX."c_lead_status WHERE code = 'WON'))"; + } + if ($this->opp_status == 'none') { + $sqlwhere[] = " (t.fk_opp_status IS NULL OR t.fk_opp_status = -1)"; + } } if (empty($user->rights->projet->all->lire)) { diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php index 0d5c4964003..1ba9d6be483 100644 --- a/htdocs/projet/list.php +++ b/htdocs/projet/list.php @@ -1174,8 +1174,8 @@ while ($i < min($num, $limit)) { } // Title if (!empty($arrayfields['p.title']['checked'])) { - print ''; - print dol_trunc($obj->title, 80); + print ''; + print $obj->title; print ''; if (!$i) { $totalarray['nbfield']++; diff --git a/htdocs/projet/stats/index.php b/htdocs/projet/stats/index.php index f41651e15d8..58e8fbb4a01 100644 --- a/htdocs/projet/stats/index.php +++ b/htdocs/projet/stats/index.php @@ -24,18 +24,15 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/dolgraph.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/project.lib.php'; require_once DOL_DOCUMENT_ROOT.'/projet/class/projectstats.class.php'; -// Security check -if (!$user->rights->projet->lire) { - accessforbidden(); -} - - $WIDTH = DolGraph::getDefaultGraphSizeForStats('width'); $HEIGHT = DolGraph::getDefaultGraphSizeForStats('height'); +$search_opp_status = GETPOST("search_opp_status", 'alpha'); + $userid = GETPOST('userid', 'int'); $socid = GETPOST('socid', 'int'); // Security check @@ -44,19 +41,25 @@ if ($user->socid > 0) { $socid = $user->socid; } $nowyear = strftime("%Y", dol_now()); -$year = GETPOST('year') > 0 ?GETPOST('year') : $nowyear; +$year = GETPOST('year', 'int') > 0 ? GETPOST('year', 'int') : $nowyear; $startyear = $year - (empty($conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS) ? 2 : max(1, min(10, $conf->global->MAIN_STATS_GRAPHS_SHOW_N_YEARS))); $endyear = $year; // Load translation files required by the page $langs->loadLangs(array('companies', 'projects')); +// Security check +if (!$user->rights->projet->lire) { + accessforbidden(); +} + /* * View */ $form = new Form($db); +$formproject = new FormProjets($db); $includeuserlist = array(); @@ -82,66 +85,11 @@ if (!empty($year)) { $stats_project->year = $year; } -/* -if (!empty($conf->global->PROJECT_USE_OPPORTUNITIES)) -{ - // Current stats of project amount per status - $data1 = $stats_project->getAllProjectByStatus(); - - if (!is_array($data1) && $data1 < 0) { - setEventMessages($stats_project->error, null, 'errors'); +if (!empty($conf->global->PROJECT_USE_OPPORTUNITIES)) { + if ($search_opp_status) { + $stats_project->opp_status = $search_opp_status; } - if (empty($data1)) - { - $showpointvalue = 0; - $nocolor = 1; - $data1 = array(array(0=>$langs->trans("None"), 1=>1)); - } - - $filenamenb = $conf->project->dir_output."/stats/projectbystatus.png"; - $fileurlnb = DOL_URL_ROOT.'/viewimage.php?modulepart=projectstats&file=projectbystatus.png'; - $px = new DolGraph(); - $mesg = $px->isGraphKo(); - if (empty($mesg)) { - $i = 0; $tot = count($data1); $legend = array(); - while ($i <= $tot) - { - $legend[] = $data1[$i][0]; - $i++; - } - - $px->SetData($data1); - unset($data1); - - if ($nocolor) - $px->SetDataColor(array( - array( - 220, - 220, - 220 - ) - )); - - $px->SetLegend($legend); - $px->setShowLegend(0); - $px->setShowPointValue($showpointvalue); - $px->setShowPercent(1); - $px->SetMaxValue($px->GetCeilMaxValue()); - $px->SetWidth($WIDTH); - $px->SetHeight($HEIGHT); - $px->SetShading(3); - $px->SetHorizTickIncrement(1); - $px->SetCssPrefix("cssboxes"); - $px->SetType(array('pie')); - $px->SetTitle($langs->trans('OpportunitiesStatusForProjects')); - $result = $px->draw($filenamenb, $fileurlnb); - if ($result < 0) { - setEventMessages($px->error, null, 'errors'); - } - } else { - setEventMessages(null, $mesg, 'errors'); - } -}*/ +} // Build graphic number of object @@ -285,12 +233,19 @@ print ''.$langs->trans("ThirdParty").''; print img_picto('', 'company', 'class="pictofixedwidth"'); print $form->select_company($socid, 'socid', '', 1, 0, 0, array(), 0, 'widthcentpercentminusx maxwidth300', ''); print ''; +// Opportunity status +if (!empty($conf->global->PROJECT_USE_OPPORTUNITIES)) { + print ''.$langs->trans("OpportunityStatusShort").''; + print $formproject->selectOpportunityStatus('search_opp_status', $search_opp_status, 1, 0, 1, 0, 'maxwidth300', 1); + print ''; +} + // User /*print ''.$langs->trans("ProjectCommercial").''; print $form->select_dolusers($userid, 'userid', 1, array(),0,$includeuserlist); print '';*/ // Year -print ''.$langs->trans("Year").''; +print ''.$langs->trans("Year").' ('.$langs->trans("DateCreation").')'; if (!in_array($year, $arrayyears)) { $arrayyears[$year] = $year; } diff --git a/htdocs/workstation/class/workstation.class.php b/htdocs/workstation/class/workstation.class.php index df6d697f73f..4131f074e85 100644 --- a/htdocs/workstation/class/workstation.class.php +++ b/htdocs/workstation/class/workstation.class.php @@ -101,12 +101,12 @@ class Workstation extends CommonObject public $fields=array( 'rowid' => array('type'=>'integer', 'label'=>'TechnicalID', 'enabled'=>'1', 'position'=>1, 'notnull'=>1, 'visible'=>0, 'noteditable'=>'1', 'index'=>1, 'css'=>'left', 'comment'=>"Id"), 'ref' => array('type'=>'varchar(128)', 'label'=>'Ref', 'enabled'=>'1', 'position'=>10, 'notnull'=>1, 'visible'=>1, 'noteditable'=>'0', 'default'=>'', 'index'=>1, 'searchall'=>1, 'showoncombobox'=>'1', 'comment'=>"Reference of object"), - 'label' => array('type'=>'varchar(255)', 'label'=>'Label', 'enabled'=>'1', 'position'=>30, 'notnull'=>1, 'visible'=>1, 'searchall'=>1, 'css'=>'minwidth300', 'showoncombobox'=>'2',), + 'label' => array('type'=>'varchar(255)', 'label'=>'Label', 'enabled'=>'1', 'position'=>30, 'notnull'=>1, 'visible'=>1, 'searchall'=>1, 'css'=>'minwidth300', 'csslist'=>'tdoverflowmax125', 'showoncombobox'=>'2',), 'type' => array('type'=>'varchar(8)', 'label'=>'Type', 'enabled'=>'1', 'position'=>32, 'default'=>1, 'notnull'=>1, 'visible'=>1, 'arrayofkeyval'=>array('HUMAN'=>'Human', 'MACHINE'=>'Machine', 'BOTH'=>'HumanMachine'),), 'note_public' => array('type'=>'html', 'label'=>'NotePublic', 'enabled'=>'1', 'position'=>61, 'notnull'=>0, 'visible'=>0,), 'note_private' => array('type'=>'html', 'label'=>'NotePrivate', 'enabled'=>'1', 'position'=>62, 'notnull'=>0, 'visible'=>0,), - 'date_creation' => array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>'1', 'position'=>500, 'notnull'=>1, 'visible'=>-2,), - 'tms' => array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>'1', 'position'=>501, 'notnull'=>0, 'visible'=>-2,), + 'date_creation' => array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>'1', 'position'=>500, 'notnull'=>1, 'visible'=>-2, 'csslist'=>'nowraponall'), + 'tms' => array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>'1', 'position'=>501, 'notnull'=>0, 'visible'=>-2, 'csslist'=>'nowraponall'), 'fk_user_creat' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserAuthor', 'enabled'=>'1', 'position'=>510, 'notnull'=>1, 'visible'=>-2, 'foreignkey'=>'user.rowid',), 'fk_user_modif' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserModif', 'enabled'=>'1', 'position'=>511, 'notnull'=>-1, 'visible'=>-2,), 'import_key' => array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>'1', 'position'=>512, 'notnull'=>-1, 'visible'=>-2,), From e6c103733ed6242fd60127cd57606b7de06216fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Mon, 16 May 2022 11:06:21 +0200 Subject: [PATCH 520/738] dlc dluo are inverted --- htdocs/reception/card.php | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/htdocs/reception/card.php b/htdocs/reception/card.php index c4a3b108b34..9e4cb346398 100644 --- a/htdocs/reception/card.php +++ b/htdocs/reception/card.php @@ -352,8 +352,10 @@ if (empty($reshook)) { } $qty = "qtyl".$i; $comment = "comment".$i; - $eatby = "dlc".$i; - $sellby = "dluo".$i; + // EATBY <-> DLUO see productbatch.class.php + // SELLBY <-> DLC + $eatby = "dluo".$i; + $sellby = "dlc".$i; $batch = "batch".$i; $cost_price = "cost_price".$i; @@ -628,9 +630,11 @@ if (empty($reshook)) { $batch = "batch".$line_id; $dlc = "dlc".$line_id; $dluo = "dluo".$line_id; - $eatby = GETPOST($dlc, 'alpha'); + // EATBY <-> DLUO + $eatby = GETPOST($dluo, 'alpha'); $eatbydate = str_replace('/', '-', $eatby); - $sellby = GETPOST($dluo, 'alpha'); + // SELLBY <-> DLC + $sellby = GETPOST($dlc, 'alpha'); $sellbydate = str_replace('/', '-', $sellby); $line->batch = GETPOST($batch, 'alpha'); $line->eatby = strtotime($eatbydate); @@ -641,8 +645,7 @@ if (empty($reshook)) { setEventMessages($line->error, $line->errors, 'errors'); $error++; } - } else // Product no predefined - { + } else { // Product no predefined $qty = "qtyl".$line_id; $line->id = $line_id; $line->qty = GETPOST($qty, 'int'); From c3673bfc3c20b3fc491437dc546085889e7022f7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 May 2022 13:05:17 +0200 Subject: [PATCH 521/738] NEW A public form for to send a message and create a lead is available --- htdocs/adherents/admin/member.php | 2 +- htdocs/adherents/admin/website.php | 5 +- htdocs/contrat/class/contrat.class.php | 12 +- htdocs/core/class/commonobject.class.php | 11 +- htdocs/core/class/html.formmail.class.php | 4 +- htdocs/core/lib/project.lib.php | 14 +- htdocs/core/tpl/extrafields_add.tpl.php | 2 + htdocs/intracommreport/list.php | 2 +- htdocs/langs/en_US/admin.lang | 3 +- htdocs/langs/en_US/main.lang | 2 + htdocs/langs/en_US/projects.lang | 5 + .../class/price_parser.class.php | 1 - htdocs/projet/admin/website.php | 53 +++++- htdocs/projet/class/project.class.php | 2 + htdocs/projet/list.php | 2 +- htdocs/projet/stats/index.php | 2 +- htdocs/public/members/new.php | 5 +- htdocs/public/partnership/new.php | 4 +- htdocs/public/project/new.php | 174 +++++++++--------- htdocs/theme/eldy/progress.inc.php | 6 +- 20 files changed, 185 insertions(+), 126 deletions(-) diff --git a/htdocs/adherents/admin/member.php b/htdocs/adherents/admin/member.php index d51dd8ef730..64197636d0e 100644 --- a/htdocs/adherents/admin/member.php +++ b/htdocs/adherents/admin/member.php @@ -64,7 +64,7 @@ if ($action == 'set_default') { } elseif ($action == 'del_default') { $ret = delDocumentModel($value, $type); if ($ret > 0) { - if ($conf->global->MEMBER_ADDON_PDF_ODT == "$value") { + if (getDolGlobalString('MEMBER_ADDON_PDF_ODT') == "$value") { dolibarr_del_const($db, 'MEMBER_ADDON_PDF_ODT', $conf->entity); } } diff --git a/htdocs/adherents/admin/website.php b/htdocs/adherents/admin/website.php index ed09c206abf..6199991f29c 100644 --- a/htdocs/adherents/admin/website.php +++ b/htdocs/adherents/admin/website.php @@ -95,12 +95,13 @@ if ($action == 'update') { $form = new Form($db); +$title = $langs->trans("MembersSetup"); $help_url = 'EN:Module_Foundations|FR:Module_Adhérents|ES:Módulo_Miembros'; -llxHeader('', $langs->trans("MembersSetup"), $help_url); +llxHeader('', $title, $help_url); $linkback = '
    '.$langs->trans("BackToModuleList").''; -print load_fiche_titre($langs->trans("MembersSetup"), $linkback, 'title_setup'); +print load_fiche_titre($title, $linkback, 'title_setup'); $head = member_admin_prepare_head(); diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index d85ad51946a..0befd4820ff 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -772,16 +772,6 @@ class Contrat extends CommonObject $now = dol_now(); - /* - if (!is_object($extrafields)) { - require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; - $extrafields = new ExtraFields($this->db); - } - - $line = new ContratLigne($this->db); - $extrafields->fetch_name_optionals_label(ContratLigne::$table_element, true); - */ - $this->lines = array(); $pos = 0; @@ -875,7 +865,7 @@ class Contrat extends CommonObject $line->date_fin_prevue = $this->db->jdate($objp->date_fin_validite); $line->date_fin_reel = $this->db->jdate($objp->date_cloture); - // Retrieve all extrafields for contract + // Retrieve all extrafields for contract line // fetch optionals attributes and labels $line->fetch_optionals(); diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index e1ed8855378..6466754f241 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -7805,7 +7805,7 @@ abstract class CommonObject * @param string $keyprefix Prefix string to add before name and id of field (can be used to avoid duplicate names) * @param string $onetrtd All fields in same tr td. Used by objectline_create.tpl.php for example. * @param string $display_type "card" for form display, "line" for document line display (extrafields on propal line, order line, etc...) - * @return string + * @return string String with html content to show */ public function showOptionals($extrafields, $mode = 'view', $params = null, $keysuffix = '', $keyprefix = '', $onetrtd = 0, $display_type = 'card') { @@ -7814,13 +7814,20 @@ abstract class CommonObject if (!is_object($form)) { $form = new Form($db); } + if (!is_object($extrafields)) { + dol_syslog('Bad parameter extrafields for showOptionals', LOG_ERR); + return 'Bad parameter extrafields for showOptionals'; + } + if (!is_array($extrafields->attributes[$this->table_element])) { + dol_syslog("extrafields->attributes was not loaded with extrafields->fetch_name_optionals_label(table_element);", LOG_WARNING); + } $out = ''; $parameters = array(); $reshook = $hookmanager->executeHooks('showOptionals', $parameters, $this, $action); // Note that $action and $object may have been modified by hook if (empty($reshook)) { - if (key_exists('label', $extrafields->attributes[$this->table_element]) && is_array($extrafields->attributes[$this->table_element]['label']) && count($extrafields->attributes[$this->table_element]['label']) > 0) { + if (is_array($extrafields->attributes[$this->table_element]) && key_exists('label', $extrafields->attributes[$this->table_element]) && is_array($extrafields->attributes[$this->table_element]['label']) && count($extrafields->attributes[$this->table_element]['label']) > 0) { $out .= "\n"; $out .= ' '; $out .= "\n"; diff --git a/htdocs/core/class/html.formmail.class.php b/htdocs/core/class/html.formmail.class.php index 244da59b5ff..19ea745c8e1 100644 --- a/htdocs/core/class/html.formmail.class.php +++ b/htdocs/core/class/html.formmail.class.php @@ -1533,10 +1533,12 @@ class FormMail extends Form if (!is_object($extrafields)) { $extrafields = new ExtraFields($this->db); } - $extrafields->fetch_name_optionals_label('product', true); $product = new Product($this->db); $product->fetch($line->fk_product, '', '', 1); $product->fetch_optionals(); + + $extrafields->fetch_name_optionals_label($product->table_element, true); + if (is_array($extrafields->attributes[$product->table_element]['label']) && count($extrafields->attributes[$product->table_element]['label']) > 0) { foreach ($extrafields->attributes[$product->table_element]['label'] as $key => $label) { $substit_line['__PRODUCT_EXTRAFIELD_'.strtoupper($key).'__'] = $product->array_options['options_'.$key]; diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php index 15162c8b273..68e76e85ca3 100644 --- a/htdocs/core/lib/project.lib.php +++ b/htdocs/core/lib/project.lib.php @@ -509,14 +509,12 @@ function project_admin_prepare_head() $head[$h][2] = 'attributes_task'; $h++; - if (getDolGlobalInt('MAIN_FEATURES_LEVEL') >= 2) { - $langs->load("members"); + $langs->load("members"); - $head[$h][0] = DOL_URL_ROOT.'/projet/admin/website.php'; - $head[$h][1] = $langs->trans("BlankSubscriptionForm"); - $head[$h][2] = 'website'; - $h++; - } + $head[$h][0] = DOL_URL_ROOT.'/projet/admin/website.php'; + $head[$h][1] = $langs->trans("BlankSubscriptionForm"); + $head[$h][2] = 'website'; + $h++; complete_head_from_modules($conf, $langs, null, $head, $h, 'project_admin', 'remove'); @@ -2819,7 +2817,7 @@ function getTaskProgressView($task, $label = true, $progressNumber = true, $hide $out .= ' '; } else { // bad - $out .= '
    '; + $out .= '
    '; $out .= '
    '; $out .= '
    '; } diff --git a/htdocs/core/tpl/extrafields_add.tpl.php b/htdocs/core/tpl/extrafields_add.tpl.php index 2f44bbe9c48..fa150d6a27b 100644 --- a/htdocs/core/tpl/extrafields_add.tpl.php +++ b/htdocs/core/tpl/extrafields_add.tpl.php @@ -41,6 +41,7 @@ if (!isset($parameters)) { } $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; if (empty($reshook)) { $params = array(); @@ -48,6 +49,7 @@ if (empty($reshook)) { $params['tpl_context'] = $tpl_context; } $params['cols'] = key_exists('colspanvalue', $parameters) ? $parameters['colspanvalue'] : ''; + print $object->showOptionals($extrafields, 'create', $params); } diff --git a/htdocs/intracommreport/list.php b/htdocs/intracommreport/list.php index b6bfd45c91a..1478dbea83f 100644 --- a/htdocs/intracommreport/list.php +++ b/htdocs/intracommreport/list.php @@ -82,7 +82,7 @@ $form = new Form($db); /* // fetch optionals attributes and labels -$extralabels = $extrafields->fetch_name_optionals_label('intracommreport'); +$extralabels = $extrafields->fetch_name_optionals_label($object->table_element); $search_array_options=$extrafields->getOptionalsFromPost($object->table_element, '', 'search_'); */ diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 3a0e96d58da..8dcd1f9f93d 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -2253,4 +2253,5 @@ HashForPing=Hash used for ping ReadOnlyMode=Is instance in "Read Only" mode DEBUGBAR_USE_LOG_FILE=Use the dolibarr.log file to trap Logs UsingLogFileShowAllRecordOfSubrequestButIsSlower=Use the dolibarr.log file to trap Logs instead of live memory catching. It allows to catch all logs instead of only log of current process (so including the one of ajax subrequests pages) but will make your instance very very slow. Not recommended. -FixedOrPercent=Fixed (use keyword 'fixed') or percent (use keyword 'percent') \ No newline at end of file +FixedOrPercent=Fixed (use keyword 'fixed') or percent (use keyword 'percent') +DefaultOpportunityStatus=Default opportunity status (first status when lead is created) \ No newline at end of file diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index 530f3b6af0e..97111df74cd 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -1174,3 +1174,5 @@ ConfirmAllocateCommercial=Assign sales representative confirmation ConfirmAllocateCommercialQuestion=Are you sure you want to assign the %s selected record(s)? CommercialsAffected=Sales representatives affected CommercialAffected=Sales representative affected +YourMessage=Votre message +YourMessageHasBeenReceived=Your message has been received. We will answer or contact you as soon as possible. \ No newline at end of file diff --git a/htdocs/langs/en_US/projects.lang b/htdocs/langs/en_US/projects.lang index 1e0ed42d3e3..739a35dcebf 100644 --- a/htdocs/langs/en_US/projects.lang +++ b/htdocs/langs/en_US/projects.lang @@ -289,3 +289,8 @@ FormForNewLeadDesc=Thanks to fill the following form to contact us. You can also ProjectsHavingThisContact=Projects having this contact StartDateCannotBeAfterEndDate=End date cannot be before start date ErrorPROJECTLEADERRoleMissingRestoreIt=The "PROJECTLEADER" role is missing or has been de-activited, please restore in the dictionary of contact types +LeadPublicFormDesc=You can enable here a public page to allow your prospects to make a first contact to you from a public online form +EnablePublicLeadForm=Enable the public form for contact +NewLeadbyWeb=Your message or request has been recorded. We will answer or contact your soon. +NewLeadForm=New contact form +LeadFromPublicForm=Online lead from public form \ No newline at end of file diff --git a/htdocs/product/dynamic_price/class/price_parser.class.php b/htdocs/product/dynamic_price/class/price_parser.class.php index 9bd986a3c73..764ff919cc7 100644 --- a/htdocs/product/dynamic_price/class/price_parser.class.php +++ b/htdocs/product/dynamic_price/class/price_parser.class.php @@ -154,7 +154,6 @@ class PriceParser //Retrieve all extrafield for product and add it to values $extrafields = new ExtraFields($this->db); - $extrafields->fetch_name_optionals_label('product', true); $product->fetch_optionals(); if (is_array($extrafields->attributes[$product->table_element]['label'])) { foreach ($extrafields->attributes[$product->table_element]['label'] as $key => $label) { diff --git a/htdocs/projet/admin/website.php b/htdocs/projet/admin/website.php index 25497fef436..37b858757ca 100644 --- a/htdocs/projet/admin/website.php +++ b/htdocs/projet/admin/website.php @@ -28,6 +28,7 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/project.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php'; require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'; // Load translation files required by the page @@ -35,10 +36,14 @@ $langs->loadLangs(array("admin", "members")); $action = GETPOST('action', 'aZ09'); +$defaultoppstatus = getDolGlobalInt('PROJECT_DEFAULT_OPPORTUNITY_STATUS_FOR_ONLINE_LEAD'); + if (!$user->admin) { accessforbidden(); } +$error = 0; + /* * Actions @@ -54,8 +59,10 @@ if ($action == 'setPROJECT_ENABLE_PUBLIC') { if ($action == 'update') { $public = GETPOST('PROJECT_ENABLE_PUBLIC'); + $defaultoppstatus = GETPOST('PROJECT_DEFAULT_OPPORTUNITY_STATUS_FOR_ONLINE_LEAD', 'int'); $res = dolibarr_set_const($db, "PROJECT_ENABLE_PUBLIC", $public, 'chaine', 0, '', $conf->entity); + $res = dolibarr_set_const($db, "PROJECT_DEFAULT_OPPORTUNITY_STATUS_FOR_ONLINE_LEAD", $defaultoppstatus, 'chaine', 0, '', $conf->entity); if (!($res > 0)) { $error++; @@ -74,13 +81,15 @@ if ($action == 'update') { */ $form = new Form($db); +$formproject = new FormProjets($db); +$title = $langs->trans("ProjectsSetup"); $help_url = ''; -llxHeader('', $langs->trans("ProjectsSetup"), $help_url); +llxHeader('', $title, $help_url); $linkback = ''.$langs->trans("BackToModuleList").''; -print load_fiche_titre($langs->trans("ProjectsSetup"), $linkback, 'title_setup'); +print load_fiche_titre($title, $linkback, 'title_setup'); $head = project_admin_prepare_head(); @@ -90,11 +99,12 @@ print ''; print ''; print ''; -print dol_get_fiche_head($head, 'website', $langs->trans("Projects"), -1, 'user'); +print dol_get_fiche_head($head, 'website', $langs->trans("Projects"), -1, 'project'); print ''.$langs->trans("LeadPublicFormDesc").'

    '; +$param = ''; $enabledisablehtml = $langs->trans("EnablePublicLeadForm").' '; if (empty($conf->global->PROJECT_ENABLE_PUBLIC)) { @@ -111,6 +121,33 @@ if (empty($conf->global->PROJECT_ENABLE_PUBLIC)) { print $enabledisablehtml; print ''; +print '
    '; + +if (!empty($conf->global->PROJECT_ENABLE_PUBLIC)) { + print '
    '; + + print '
    '; + print ''; + + print ''; + print ''; + print ''; + print "\n"; + + // Default opportunity status + print '\n"; + + print '
    '.$langs->trans("Parameter").''.$langs->trans("Value").'
    '; + print $langs->trans("DefaultOpportunityStatus"); + print ''; + print $formproject->selectOpportunityStatus('PROJECT_DEFAULT_OPPORTUNITY_STATUS_FOR_ONLINE_LEAD', GETPOSTISSET('PROJECT_DEFAULT_OPPORTUNITY_STATUS_FOR_ONLINE_LEAD') ? GETPOST('PROJECT_DEFAULT_OPPORTUNITY_STATUS_FOR_ONLINE_LEAD', 'int') : $defaultoppstatus, 1, 0, 0, 0, '', 0, 1); + print "
    '; + print '
    '; + + print '
    '; + print ''; + print '
    '; +} print dol_get_fiche_end(); @@ -120,8 +157,8 @@ print ''; if (!empty($conf->global->PROJECT_ENABLE_PUBLIC)) { print '
    '; //print $langs->trans('FollowingLinksArePublic').'
    '; - print img_picto('', 'globe').' '.$langs->trans('BlankSubscriptionForm').':
    '; - if ($conf->multicompany->enabled) { + print img_picto('', 'globe').' '.$langs->trans('BlankSubscriptionForm').'
    '; + if (!empty($conf->multicompany->enabled)) { $entity_qr = '?entity='.$conf->entity; } else { $entity_qr = ''; @@ -132,7 +169,11 @@ if (!empty($conf->global->PROJECT_ENABLE_PUBLIC)) { $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file //$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current - print ''.$urlwithroot.'/public/project/new.php'.$entity_qr.''; + print ''; + print ajax_autoselect('publicurlmember'); } // End of page diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index 4fd6c3976fe..cadeb278ae7 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -159,7 +159,9 @@ class Project extends CommonObject public $statuts_long; public $statut; // 0=draft, 1=opened, 2=closed + public $opp_status; // opportunity status, into table llx_c_lead_status + public $fk_opp_status; // opportunity status, into table llx_c_lead_status public $opp_percent; // opportunity probability public $email_msgid; diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php index 1ba9d6be483..0e6df96a8ed 100644 --- a/htdocs/projet/list.php +++ b/htdocs/projet/list.php @@ -932,7 +932,7 @@ if (!empty($arrayfields['p.public']['checked'])) { // Opp status if (!empty($arrayfields['p.fk_opp_status']['checked'])) { print ''; - print $formproject->selectOpportunityStatus('search_opp_status', $search_opp_status, 1, 0, 1, 0, 'maxwidth100', 1); + print $formproject->selectOpportunityStatus('search_opp_status', $search_opp_status, 1, 0, 1, 0, 'maxwidth100', 1, 0); print ''; } if (!empty($arrayfields['p.opp_amount']['checked'])) { diff --git a/htdocs/projet/stats/index.php b/htdocs/projet/stats/index.php index 58e8fbb4a01..5926451e321 100644 --- a/htdocs/projet/stats/index.php +++ b/htdocs/projet/stats/index.php @@ -236,7 +236,7 @@ print ''; // Opportunity status if (!empty($conf->global->PROJECT_USE_OPPORTUNITIES)) { print ''.$langs->trans("OpportunityStatusShort").''; - print $formproject->selectOpportunityStatus('search_opp_status', $search_opp_status, 1, 0, 1, 0, 'maxwidth300', 1); + print $formproject->selectOpportunityStatus('search_opp_status', $search_opp_status, 1, 0, 1, 0, 'maxwidth300', 1, 1); print ''; } diff --git a/htdocs/public/members/new.php b/htdocs/public/members/new.php index 055ffec56f9..7a27ae14b62 100644 --- a/htdocs/public/members/new.php +++ b/htdocs/public/members/new.php @@ -57,7 +57,6 @@ if (!defined('NOIPCHECK')) { // For MultiCompany module. // Do not use GETPOST here, function is not defined and define must be done before including main.inc.php -// TODO This should be useless. Because entity must be retrieve from object ref and not from url. $entity = (!empty($_GET['entity']) ? (int) $_GET['entity'] : (!empty($_POST['entity']) ? (int) $_POST['entity'] : 1)); if (is_numeric($entity)) { define("DOLENTITY", $entity); @@ -430,7 +429,7 @@ if (empty($reshook) && $action == 'added') { llxHeaderVierge($langs->trans("NewMemberForm")); // Si on a pas ete redirige - print '
    '; + print '

    '; print '
    '; print $langs->trans("NewMemberbyWeb"); print '
    '; @@ -448,7 +447,7 @@ if (empty($reshook) && $action == 'added') { $form = new Form($db); $formcompany = new FormCompany($db); $adht = new AdherentType($db); -$extrafields->fetch_name_optionals_label('adherent'); // fetch optionals attributes and labels +$extrafields->fetch_name_optionals_label($object->table_element); // fetch optionals attributes and labels llxHeaderVierge($langs->trans("NewSubscription")); diff --git a/htdocs/public/partnership/new.php b/htdocs/public/partnership/new.php index cbc1b849115..f6f0efc4fb2 100644 --- a/htdocs/public/partnership/new.php +++ b/htdocs/public/partnership/new.php @@ -419,7 +419,7 @@ if (empty($reshook) && $action == 'added') { llxHeaderVierge($langs->trans("NewPartnershipForm")); // Si on a pas ete redirige - print '
    '; + print '

    '; print '
    '; print $langs->trans("NewPartnershipbyWeb"); print '
    '; @@ -437,7 +437,7 @@ if (empty($reshook) && $action == 'added') { $form = new Form($db); $formcompany = new FormCompany($db); -$extrafields->fetch_name_optionals_label('partnership'); // fetch optionals attributes and labels +$extrafields->fetch_name_optionals_label($partnership->table_element); // fetch optionals attributes and labels llxHeaderVierge($langs->trans("NewPartnershipRequest")); diff --git a/htdocs/public/project/new.php b/htdocs/public/project/new.php index 971031e7a80..85106ce51de 100644 --- a/htdocs/public/project/new.php +++ b/htdocs/public/project/new.php @@ -45,7 +45,6 @@ if (!defined('NOIPCHECK')) { // For MultiCompany module. // Do not use GETPOST here, function is not defined and define must be done before including main.inc.php -// TODO This should be useless. Because entity must be retrieve from object ref and not from url. $entity = (!empty($_GET['entity']) ? (int) $_GET['entity'] : (!empty($_POST['entity']) ? (int) $_POST['entity'] : 1)); if (is_numeric($entity)) { define("DOLENTITY", $entity); @@ -132,9 +131,9 @@ function llxHeaderVierge($title, $head = "", $disablejs = 0, $disablehead = 0, $ print '
    '; } - if (!empty($conf->global->PROJECT_IMAGE_PUBLIC_ORGANIZEDEVENT)) { - print '
    '; - print ''; + if (!empty($conf->global->PROJECT_IMAGE_PUBLIC_NEWLEAD)) { + print '
    '; + print ''; print '
    '; } @@ -159,22 +158,6 @@ function llxFooterVierge() } -$arrayofdata = array(); -if (GETPOST('action') == 'addlead') { - // When a json request is sent - $entityBody = file_get_contents('php://input'); - - if ($entityBody) { - $arrayofdata = json_decode($entityBody, true); - } - - print 'Date received and lead created'; - - $db->close(); - exit; -} - - /* * Actions @@ -194,42 +177,6 @@ if (empty($reshook) && $action == 'add') { $db->begin(); - // test if lead already exists - /* - if (empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED)) { - if (!GETPOST('login')) { - $error++; - $errmsg .= $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Login"))."
    \n"; - } - $sql = "SELECT login FROM ".MAIN_DB_PREFIX."adherent WHERE login='".$db->escape(GETPOST('login'))."'"; - $result = $db->query($sql); - if ($result) { - $num = $db->num_rows($result); - } - if ($num != 0) { - $error++; - $langs->load("errors"); - $errmsg .= $langs->trans("ErrorLoginAlreadyExists")."
    \n"; - } - if (!GETPOSTISSET("pass1") || !GETPOSTISSET("pass2") || GETPOST("pass1", 'none') == '' || GETPOST("pass2", 'none') == '' || GETPOST("pass1", 'none') != GETPOST("pass2", 'none')) { - $error++; - $langs->load("errors"); - $errmsg .= $langs->trans("ErrorPasswordsMustMatch")."
    \n"; - } - if (!GETPOST("email")) { - $error++; - $errmsg .= $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("EMail"))."
    \n"; - } - } - */ - if (GETPOST('type') <= 0) { - $error++; - $errmsg .= $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Type"))."
    \n"; - } - if (!in_array(GETPOST('morphy'), array('mor', 'phy'))) { - $error++; - $errmsg .= $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv('Nature'))."
    \n"; - } if (!GETPOST("lastname")) { $error++; $errmsg .= $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Lastname"))."
    \n"; @@ -238,27 +185,87 @@ if (empty($reshook) && $action == 'add') { $error++; $errmsg .= $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Firstname"))."
    \n"; } + if (!GETPOST("email")) { + $error++; + $errmsg .= $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Email"))."
    \n"; + } + if (!GETPOST("description")) { + $error++; + $errmsg .= $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Message"))."
    \n"; + } if (GETPOST("email") && !isValidEmail(GETPOST("email"))) { $error++; $langs->load("errors"); $errmsg .= $langs->trans("ErrorBadEMail", GETPOST("email"))."
    \n"; } + // Set default opportunity status + $defaultoppstatus = getDolGlobalString('PROJECT_DEFAULT_OPPORTUNITY_STATUS_FOR_ONLINE_LEAD'); + if (empty($defaultoppstatus)) { + $error++; + $langs->load("errors"); + $errmsg .= $langs->trans("ErrorModuleSetupNotComplete", $langs->transnoentitiesnoconv("Project"))."
    \n"; + } if (!$error) { - // email a peu pres correct et le login n'existe pas $proj = new Project($db); - $proj->statut = -1; + $thirdparty = new Societe($db); + + // Search thirdparty and set it if found to the new created project + $result = $thirdparty->fetch(0, '', '', '', '', '', '', '', '', '', $object->email); + if ($result > 0) { + $proj->socid = $thirdparty->id; + } + + // Defined the ref into $defaultref + $defaultref = ''; + $modele = empty($conf->global->PROJECT_ADDON) ? 'mod_project_simple' : $conf->global->PROJECT_ADDON; + + // Search template files + $file = ''; $classname = ''; $filefound = 0; + $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']); + foreach ($dirmodels as $reldir) { + $file = dol_buildpath($reldir."core/modules/project/".$modele.'.php', 0); + if (file_exists($file)) { + $filefound = 1; + $classname = $modele; + break; + } + } + + if ($filefound) { + $result = dol_include_once($reldir."core/modules/project/".$modele.'.php'); + $modProject = new $classname; + + $defaultref = $modProject->getNextValue($thirdparty, $object); + } + + if (is_numeric($defaultref) && $defaultref <= 0) { + $defaultref = ''; + } + + if (empty($defaultref)) { + $defaultref = 'PJ'.dol_print_date(dol_now(), 'dayrfc'); + } + + $proj->ref = $defaultref; + $proj->statut = $proj::STATUS_DRAFT; + $proj->status = $proj::STATUS_DRAFT; $proj->email = GETPOST("email"); - $proj->note_private = GETPOST("note_private"); + $proj->public = 1; + $proj->usage_opportunity = 1; + $proj->title = $langs->trans("LeadFromPublicForm"); + $proj->description = GETPOST("description", "alphanohtml"); + $proj->opp_status = $defaultoppstatus; + $proj->fk_opp_status = $defaultoppstatus; - - // Fill array 'array_options' with data from add form + // Fill array 'array_options' with data from the form $extrafields->fetch_name_optionals_label($proj->table_element); $ret = $extrafields->setOptionalsFromPost(null, $proj); if ($ret < 0) { $error++; } + // Create the project $result = $proj->create($user); if ($result > 0) { require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'; @@ -275,7 +282,7 @@ if (empty($reshook) && $action == 'add') { $outputlangs = new Translate('', $conf); $outputlangs->setDefaultLang(empty($object->thirdparty->default_lang) ? $mysoc->default_lang : $object->thirdparty->default_lang); // Load traductions files required by page - $outputlangs->loadLangs(array("main", "members")); + $outputlangs->loadLangs(array("main", "members", "projects")); // Get email content from template $arraydefaultmessage = null; $labeltouse = $conf->global->PROJECT_EMAIL_TEMPLATE_AUTOLEAD; @@ -288,11 +295,15 @@ if (empty($reshook) && $action == 'add') { $subject = $arraydefaultmessage->topic; $msg = $arraydefaultmessage->content; } + if (empty($labeltosue)) { + $labeltouse = '['.$mysoc->name.'] '.$langs->trans("YourMessage"); + $msg = $langs->trans("YourMessageHasBeenReceived"); + } $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object); complete_substitutions_array($substitutionarray, $outputlangs, $object); $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs); - $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnValid()), $substitutionarray, $outputlangs); + $texttosend = make_substitutions($msg, $substitutionarray, $outputlangs); if ($subjecttosend && $texttosend) { $moreinheader = 'X-Dolibarr-Info: send_an_email by public/lead/new.php'."\r\n"; @@ -317,10 +328,11 @@ if (empty($reshook) && $action == 'add') { if (!empty($entity)) { $urlback .= '&entity='.$entity; } - dol_syslog("project lead ".$proj->ref." was created, we redirect to ".$urlback); + + dol_syslog("project lead ".$proj->ref." has been created, we redirect to ".$urlback); } else { $error++; - $errmsg .= join('
    ', $proj->errors); + $errmsg .= $proj->error.'
    '.join('
    ', $proj->errors); } } @@ -334,23 +346,16 @@ if (empty($reshook) && $action == 'add') { } } -// Create lead from $arrayofdata -if (empty($reshook) && !empty($arrayofdata)) { - // TODO - dol_syslog(var_export($arrayofdata, true)); - // ... -} - // Action called after a submitted was send and member created successfully // If MEMBER_URL_REDIRECT_SUBSCRIPTION is set to url we never go here because a redirect was done to this url. // backtopage parameter with an url was set on member submit page, we never go here because a redirect was done to this url. if (empty($reshook) && $action == 'added') { - llxHeaderVierge($langs->trans("NewMemberForm")); + llxHeaderVierge($langs->trans("NewLeadForm")); // Si on a pas ete redirige - print '
    '; + print '

    '; print '
    '; - print $langs->trans("NewMemberbyWeb"); + print $langs->trans("NewLeadbyWeb"); print '
    '; llxFooterVierge(); @@ -365,8 +370,8 @@ if (empty($reshook) && $action == 'added') { $form = new Form($db); $formcompany = new FormCompany($db); -$extrafields->fetch_name_optionals_label('project'); // fetch optionals attributes and labels +$extrafields->fetch_name_optionals_label($object->table_element); // fetch optionals attributes and labels llxHeaderVierge($langs->trans("NewContact")); @@ -415,14 +420,16 @@ jQuery(document).ready(function () { print ''."\n"; // Lastname -print ''."\n"; +print ''."\n"; // Firstname -print ''."\n"; +print ''."\n"; +// EMail +print ''."\n"; // Company print ''."\n"; // Address print ''."\n"; +print ''."\n"; // Zip / Town print ''; if (empty($conf->global->SOCIETE_DISABLE_STATE)) { print ''; } -// EMail -print ''."\n"; + // Other attributes $tpl_context = 'public'; // define template context to public include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php'; // Comments print ''; -print ''; -print ''; +print ''; +print ''; print ''."\n"; print "
    '.$langs->trans("Lastname").' *
    '.$langs->trans("Lastname").' *
    '.$langs->trans("Firstname").' *
    '.$langs->trans("Firstname").' *
    '.$langs->trans("Email").' *
    '.$langs->trans("Company").'
    '.$langs->trans("Address").''."\n"; -print '
    '.$langs->trans('Zip').' / '.$langs->trans('Town').''; print $formcompany->select_ziptown(GETPOST('zipcode'), 'zipcode', array('town', 'selectcountry_id', 'state_id'), 6, 1); @@ -453,21 +460,20 @@ print '
    '.$langs->trans('State').''; if ($country_code) { - print $formcompany->select_state(GETPOST("state_id"), $country_code); + print $formcompany->select_state(GETPOST("state_id", 'int'), $country_code); } else { print ''; } print '
    '.$langs->trans("Email").' *
    '.$langs->trans("Comments").''.$langs->trans("Message").' *
    \n"; diff --git a/htdocs/theme/eldy/progress.inc.php b/htdocs/theme/eldy/progress.inc.php index e74c84cf89e..1bc40e2f2fc 100644 --- a/htdocs/theme/eldy/progress.inc.php +++ b/htdocs/theme/eldy/progress.inc.php @@ -194,4 +194,8 @@ body[class*="colorblind-"] .progress-bar-red, body[class*="colorblind-"] .progre } .progress-bar-consumed { background-color: rgb(0, 0, 0, 0.15); -} \ No newline at end of file +} +.progress-bar-consumed-late { + background-color: ; +} + From 84fccb098870ae8871bfc821d011f167ace5312e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 May 2022 13:57:11 +0200 Subject: [PATCH 522/738] Debug v16 --- htdocs/core/class/extrafields.class.php | 31 ++++++++++++----- htdocs/core/lib/project.lib.php | 12 ++++--- htdocs/projet/admin/project.php | 2 +- htdocs/public/project/new.php | 45 ++++++++++++++++++++++--- htdocs/societe/class/societe.class.php | 2 +- 5 files changed, 72 insertions(+), 20 deletions(-) diff --git a/htdocs/core/class/extrafields.class.php b/htdocs/core/class/extrafields.class.php index 3a396e365d7..768031467bc 100644 --- a/htdocs/core/class/extrafields.class.php +++ b/htdocs/core/class/extrafields.class.php @@ -1948,14 +1948,15 @@ class ExtraFields /** * Fill array_options property of object by extrafields value (using for data sent by forms) * - * @param array $extralabels Deprecated (old $array of extrafields, now set this to null) - * @param object $object Object - * @param string $onlykey Only some keys are filled: - * 'string' => When we make update of only one extrafield ($action = 'update_extras'), calling page can set this to avoid to have other extrafields being reset. - * '@GETPOSTISSET' => When we make update of several extrafields ($action = 'update'), calling page can set this to avoid to have fields not into POST being reset. - * @return int 1 if array_options set, 0 if no value, -1 if error (field required missing for example) + * @param array $extralabels Deprecated (old $array of extrafields, now set this to null) + * @param object $object Object + * @param string $onlykey Only some keys are filled: + * 'string' => When we make update of only one extrafield ($action = 'update_extras'), calling page can set this to avoid to have other extrafields being reset. + * '@GETPOSTISSET' => When we make update of several extrafields ($action = 'update'), calling page can set this to avoid to have fields not into POST being reset. + * @param int $todefaultifmissing 1=Set value to the default value in database if value is mandatory and missing + * @return int 1 if array_options set, 0 if no value, -1 if error (field required missing for example) */ - public function setOptionalsFromPost($extralabels, &$object, $onlykey = '') + public function setOptionalsFromPost($extralabels, &$object, $onlykey = '', $todefaultifmissing = 0) { global $_POST, $langs; @@ -2015,8 +2016,10 @@ class ExtraFields || (!is_array($_POST["options_".$key]) && isset($_POST["options_".$key]) && $this->attributes[$object->table_element]['type'][$key] == 'sellist' && $_POST['options_'.$key] == '0') || (is_array($_POST["options_".$key]) && empty($_POST["options_".$key]))) { //print 'ccc'.$value.'-'.$this->attributes[$object->table_element]['required'][$key]; + + // Field is not defined. We mark this as a problem. We may fix it later if there is a default value and $todefaultifmissing is set. $nofillrequired++; - $error_field_required[] = $langs->transnoentitiesnoconv($value); + $error_field_required[$key] = $langs->transnoentitiesnoconv($value); } } @@ -2047,12 +2050,22 @@ class ExtraFields } } + if (!empty($error_field_required[$key]) && $todefaultifmissing) { + // Value is required but we have a default value and we asked to set empty value to the default value + if (!empty($this->attributes[$object->table_element]['default']) && !is_null($this->attributes[$object->table_element]['default'][$key])) { + $value_key = $this->attributes[$object->table_element]['default'][$key]; + unset($error_field_required[$key]); + $nofillrequired--; + } + } + $object->array_options["options_".$key] = $value_key; } if ($nofillrequired) { $langs->load('errors'); - setEventMessages($langs->trans('ErrorFieldsRequired').' : '.implode(', ', $error_field_required), null, 'errors'); + $this->error = $langs->trans('ErrorFieldsRequired').' : '.implode(', ', $error_field_required); + setEventMessages($this->error, null, 'errors'); return -1; } else { return 1; diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php index 68e76e85ca3..56aa24a8523 100644 --- a/htdocs/core/lib/project.lib.php +++ b/htdocs/core/lib/project.lib.php @@ -509,12 +509,14 @@ function project_admin_prepare_head() $head[$h][2] = 'attributes_task'; $h++; - $langs->load("members"); + if (!empty($conf->global->PROJECT_USE_OPPORTUNITIES)) { + $langs->load("members"); - $head[$h][0] = DOL_URL_ROOT.'/projet/admin/website.php'; - $head[$h][1] = $langs->trans("BlankSubscriptionForm"); - $head[$h][2] = 'website'; - $h++; + $head[$h][0] = DOL_URL_ROOT.'/projet/admin/website.php'; + $head[$h][1] = $langs->trans("BlankSubscriptionForm"); + $head[$h][2] = 'website'; + $h++; + } complete_head_from_modules($conf, $langs, null, $head, $h, 'project_admin', 'remove'); diff --git a/htdocs/projet/admin/project.php b/htdocs/projet/admin/project.php index 4bfb899cffe..36ef3a501ff 100644 --- a/htdocs/projet/admin/project.php +++ b/htdocs/projet/admin/project.php @@ -265,7 +265,7 @@ print ' '."\n"; print ''; print ''.$langs->trans("ManageOpportunitiesStatus").''; print ''; -print ajax_constantonoff("PROJECT_USE_OPPORTUNITIES"); +print ajax_constantonoff("PROJECT_USE_OPPORTUNITIES", null, null, 0, 0, 1); print ''; print ""; print ''; diff --git a/htdocs/public/project/new.php b/htdocs/public/project/new.php index 85106ce51de..4838c88c5a1 100644 --- a/htdocs/public/project/new.php +++ b/htdocs/public/project/new.php @@ -206,16 +206,53 @@ if (empty($reshook) && $action == 'add') { $errmsg .= $langs->trans("ErrorModuleSetupNotComplete", $langs->transnoentitiesnoconv("Project"))."
    \n"; } - if (!$error) { - $proj = new Project($db); - $thirdparty = new Societe($db); + $proj = new Project($db); + $thirdparty = new Societe($db); + if (!$error) { // Search thirdparty and set it if found to the new created project $result = $thirdparty->fetch(0, '', '', '', '', '', '', '', '', '', $object->email); if ($result > 0) { $proj->socid = $thirdparty->id; - } + } else { + // Create the prospect + if (GETPOST('societe')) { + $thirdparty->name = GETPOST('societe'); + $thirdparty->name_alias = dolGetFirstLastname(GETPOST('firstname'), GETPOST('lastname')); + } else { + $thirdparty->name = dolGetFirstLastname(GETPOST('firstname'), GETPOST('lastname')); + } + $thirdparty->address = GETPOST('address'); + $thirdparty->zip = GETPOST('zip'); + $thirdparty->town = GETPOST('town'); + $thirdparty->country_id = GETPOST('country_id', 'int'); + $thirdparty->state_id = GETPOST('state_id'); + $thirdparty->client = $thirdparty::PROSPECT; + $thirdparty->code_client = 'auto'; + $thirdparty->code_fournisseur = 'auto'; + // Fill array 'array_options' with data from the form + $extrafields->fetch_name_optionals_label($thirdparty->table_element); + $ret = $extrafields->setOptionalsFromPost(null, $thirdparty, '', 1); + //var_dump($thirdparty->array_options);exit; + if ($ret < 0) { + $error++; + $errmsg = ($extrafields->error ? $extrafields->error.'
    ' : '').join('
    ', $extrafields->errors); + } + + if (!$error) { + $result = $thirdparty->create($user); + if ($result <= 0) { + $error++; + $errmsg = ($thirdparty->error ? $thirdparty->error.'
    ' : '').join('
    ', $thirdparty->errors); + } else { + $proj->socid = $thirdparty->id; + } + } + } + } + + if (!$error) { // Defined the ref into $defaultref $defaultref = ''; $modele = empty($conf->global->PROJECT_ADDON) ? 'mod_project_simple' : $conf->global->PROJECT_ADDON; diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 1d32063c27b..30f8515e92c 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -956,7 +956,7 @@ class Societe extends CommonObject $sql .= ", accountancy_code_sell"; $sql .= ") VALUES ("; $sql .= $this->id; - $sql .= ", ".$conf->entity; + $sql .= ", ".((int) $conf->entity); $sql .= ", '".$this->db->escape($this->accountancy_code_customer)."'"; $sql .= ", '".$this->db->escape($this->accountancy_code_supplier)."'"; $sql .= ", '".$this->db->escape($this->accountancy_code_buy)."'"; From a92974c8184a8f47b9e7688c1f047210964ac564 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 May 2022 14:08:16 +0200 Subject: [PATCH 523/738] Fix typo --- htdocs/comm/action/class/actioncomm.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php index 9d122cfce7e..f22cea8d04e 100644 --- a/htdocs/comm/action/class/actioncomm.class.php +++ b/htdocs/comm/action/class/actioncomm.class.php @@ -1598,7 +1598,7 @@ class ActionComm extends CommonObject //$tooltip .= '
    '.img_picto('', 'email').' '.$langs->trans("Email").''; $tooltip .= '
    '.$langs->trans('MailTopic').': '.$this->email_subject; $tooltip .= '
    '.$langs->trans('MailFrom').': '.str_replace(array('<', '>'), array('&lt', '&gt'), $this->email_from); - $tooltip .= '
    '.$langs->trans('MailTo').':, '.str_replace(array('<', '>'), array('&lt', '&gt'), $this->email_to); + $tooltip .= '
    '.$langs->trans('MailTo').': '.str_replace(array('<', '>'), array('&lt', '&gt'), $this->email_to); if (!empty($this->email_tocc)) { $tooltip .= '
    '.$langs->trans('MailCC').': '.str_replace(array('<', '>'), array('&lt', '&gt'), $this->email_tocc); } From 7926945477f4cc7ffb47ddb14bce36c60b290efb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 May 2022 14:49:06 +0200 Subject: [PATCH 524/738] FIX update of recruitment should not fill email_msgid in actioncomm --- htdocs/core/actions_addupdatedelete.inc.php | 2 +- ...terface_50_modAgenda_ActionsAuto.class.php | 23 +++++++++++-------- .../class/recruitmentcandidature.class.php | 5 ++++ .../recruitmentcandidature_card.php | 2 ++ 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/htdocs/core/actions_addupdatedelete.inc.php b/htdocs/core/actions_addupdatedelete.inc.php index f97d4aa94ee..cec127eeac4 100644 --- a/htdocs/core/actions_addupdatedelete.inc.php +++ b/htdocs/core/actions_addupdatedelete.inc.php @@ -121,7 +121,7 @@ if ($action == 'add' && !empty($permissiontoadd)) { // Fill array 'array_options' with data from add form if (!$error) { - $ret = $extrafields->setOptionalsFromPost(null, $object); + $ret = $extrafields->setOptionalsFromPost(null, $object, '', 1); if ($ret < 0) { $error++; } diff --git a/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php b/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php index 187e3f5a156..0e018514353 100644 --- a/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php +++ b/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php @@ -924,7 +924,8 @@ class InterfaceActionsAuto extends DolibarrTriggers } } - // If trackid is not defined, we set it + // If trackid is not defined, we set it. + // Note that it should be set by caller. This is for compatibility purpose only. if (empty($object->trackid)) { // See also similar list into emailcollector.class.php if (preg_match('/^COMPANY_/', $action)) { @@ -1039,15 +1040,17 @@ class InterfaceActionsAuto extends DolibarrTriggers $actioncomm->contact_id = $contactforaction->id; // deprecated, use ->socpeopleassigned instead $actioncomm->authorid = $user->id; // User saving action $actioncomm->userownerid = $user->id; // Owner of action - // Fields defined when action is an email (content should be into object->actionmsg to be added into note, subject into object->actionms2 to be added into label) - $actioncomm->email_msgid = empty($object->email_msgid) ? null : $object->email_msgid; - $actioncomm->email_from = empty($object->email_from) ? null : $object->email_from; - $actioncomm->email_sender = empty($object->email_sender) ? null : $object->email_sender; - $actioncomm->email_to = empty($object->email_to) ? null : $object->email_to; - $actioncomm->email_tocc = empty($object->email_tocc) ? null : $object->email_tocc; - $actioncomm->email_tobcc = empty($object->email_tobcc) ? null : $object->email_tobcc; - $actioncomm->email_subject = empty($object->email_subject) ? null : $object->email_subject; - $actioncomm->errors_to = empty($object->errors_to) ? null : $object->errors_to; + // Fields defined when action is an email (content should be into object->actionmsg to be added into event note, subject should be into object->actionms2 to be added into event label) + if (!property_exists($object, 'email_fields_no_propagate_in_actioncomm') || empty($object->email_fields_no_propagate_in_actioncomm)) { + $actioncomm->email_msgid = empty($object->email_msgid) ? null : $object->email_msgid; + $actioncomm->email_from = empty($object->email_from) ? null : $object->email_from; + $actioncomm->email_sender = empty($object->email_sender) ? null : $object->email_sender; + $actioncomm->email_to = empty($object->email_to) ? null : $object->email_to; + $actioncomm->email_tocc = empty($object->email_tocc) ? null : $object->email_tocc; + $actioncomm->email_tobcc = empty($object->email_tobcc) ? null : $object->email_tobcc; + $actioncomm->email_subject = empty($object->email_subject) ? null : $object->email_subject; + $actioncomm->errors_to = empty($object->errors_to) ? null : $object->errors_to; + } // Object linked (if link is for thirdparty, contact, project it is a recording error. We should not have links in link table // for such objects because there is already a dedicated field into table llx_actioncomm or llx_actioncomm_resources. diff --git a/htdocs/recruitment/class/recruitmentcandidature.class.php b/htdocs/recruitment/class/recruitmentcandidature.class.php index 77b5b5b21ae..fb08409eb27 100644 --- a/htdocs/recruitment/class/recruitmentcandidature.class.php +++ b/htdocs/recruitment/class/recruitmentcandidature.class.php @@ -62,6 +62,11 @@ class RecruitmentCandidature extends CommonObject */ public $picto = 'recruitmentcandidature'; + /** + * @var int Do not exploit fields email_xxx into triggers. + */ + public $email_fields_no_propagate_in_actioncomm; + const STATUS_DRAFT = 0; const STATUS_VALIDATED = 1; diff --git a/htdocs/recruitment/recruitmentcandidature_card.php b/htdocs/recruitment/recruitmentcandidature_card.php index eca3a497e61..186864deb84 100644 --- a/htdocs/recruitment/recruitmentcandidature_card.php +++ b/htdocs/recruitment/recruitmentcandidature_card.php @@ -134,7 +134,9 @@ if (empty($reshook)) { $triggermodname = 'RECRUITMENTCANDIDATURE_MODIFY'; // Name of trigger action code to execute when we modify record // Actions cancel, add, update, update_extras, confirm_validate, confirm_delete, confirm_deleteline, confirm_clone, confirm_close, confirm_setdraft, confirm_reopen + $object->email_fields_no_propagate_in_actioncomm = 1; include DOL_DOCUMENT_ROOT.'/core/actions_addupdatedelete.inc.php'; + $object->email_fields_no_propagate_in_actioncomm = 0; // Actions when linking object each other include DOL_DOCUMENT_ROOT.'/core/actions_dellink.inc.php'; From b75c0d805b73079221ade5240fd80caabf85c83d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 May 2022 15:01:33 +0200 Subject: [PATCH 525/738] Add more field --- htdocs/install/mysql/tables/llx_webhook_target-webhook.sql | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/htdocs/install/mysql/tables/llx_webhook_target-webhook.sql b/htdocs/install/mysql/tables/llx_webhook_target-webhook.sql index 1e0cc0fdbac..21446e1f775 100644 --- a/htdocs/install/mysql/tables/llx_webhook_target-webhook.sql +++ b/htdocs/install/mysql/tables/llx_webhook_target-webhook.sql @@ -28,7 +28,9 @@ CREATE TABLE llx_webhook_target( fk_user_modif integer, import_key varchar(14), status integer DEFAULT 0 NOT NULL, - url varchar(255) NOT NULL, - trigger_codes text NOT NULL + url varchar(255) NOT NULL, + connection_method varchar(255) NULL, -- to store the way to authenticate to the webhook + connection_data varchar(255) NULL, -- to store the data to use to authenticate to the webhook + trigger_codes text NOT NULL -- list of selected trigger that must call the webhook -- END MODULEBUILDER FIELDS ) ENGINE=innodb; From 8410ba709a4e410dafc1867a49f7903bb7bc45d3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 May 2022 15:02:24 +0200 Subject: [PATCH 526/738] Fix field --- htdocs/install/mysql/tables/llx_webhook_target-webhook.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/install/mysql/tables/llx_webhook_target-webhook.sql b/htdocs/install/mysql/tables/llx_webhook_target-webhook.sql index 21446e1f775..28802156847 100644 --- a/htdocs/install/mysql/tables/llx_webhook_target-webhook.sql +++ b/htdocs/install/mysql/tables/llx_webhook_target-webhook.sql @@ -31,6 +31,6 @@ CREATE TABLE llx_webhook_target( url varchar(255) NOT NULL, connection_method varchar(255) NULL, -- to store the way to authenticate to the webhook connection_data varchar(255) NULL, -- to store the data to use to authenticate to the webhook - trigger_codes text NOT NULL -- list of selected trigger that must call the webhook + trigger_codes text NULL -- list of selected trigger that must call the webhook -- END MODULEBUILDER FIELDS ) ENGINE=innodb; From 7c444364851992677970022ae3fdb920b1f29378 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 May 2022 15:04:57 +0200 Subject: [PATCH 527/738] Fix phpunit --- .../install/mysql/data/llx_10_c_regions.sql | 43 +++++++++---------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/htdocs/install/mysql/data/llx_10_c_regions.sql b/htdocs/install/mysql/data/llx_10_c_regions.sql index 1ab671f085e..752bc7de395 100644 --- a/htdocs/install/mysql/data/llx_10_c_regions.sql +++ b/htdocs/install/mysql/data/llx_10_c_regions.sql @@ -146,6 +146,27 @@ INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) values ( 5 INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) values ( 56, 5601, '', 0, 'Brasil'); +-- Burundi Regions (id country=61) -- https://fr.wikipedia.org/wiki/Provinces_du_Burundi +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6101, '', 0, 'Bubanza'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6102, '', 0, 'Bujumbura Mairie'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6103, '', 0, 'Bujumbura Rural'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6104, '', 0, 'Bururi'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6105, '', 0, 'Cankuzo'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6106, '', 0, 'Cibitoke'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6107, '', 0, 'Gitega'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6108, '', 0, 'Karuzi'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6109, '', 0, 'Kayanza'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6110, '', 0, 'Kirundo'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6111, '', 0, 'Makamba'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6112, '', 0, 'Muramvya'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6113, '', 0, 'Muyinga'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6114, '', 0, 'Mwaro'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6115, '', 0, 'Ngozi'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6116, '', 0, 'Rumonge'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6117, '', 0, 'Rutana'); +INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6118, '', 0, 'Ruyigi'); + + -- Canada Region (id country=14) INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) values ( 14, 1401, '', 0, 'Canada'); @@ -512,25 +533,3 @@ INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) values ( 2 INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) values ( 232, 23208, '', 0, 'Nor-Oriental'); INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) values ( 232, 23209, '', 0, 'Zuliana'); - - --- Burundi Regions (id country=61) -- https://fr.wikipedia.org/wiki/Provinces_du_Burundi -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6101, '', 0, "Bubanza"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6102, '', 0, "Bujumbura Mairie"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6103, '', 0, "Bujumbura Rural"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6104, '', 0, "Bururi"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6105, '', 0, "Cankuzo"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6106, '', 0, "Cibitoke"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6107, '', 0, "Gitega"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6108, '', 0, "Karuzi"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6109, '', 0, "Kayanza"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6110, '', 0, "Kirundo"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6111, '', 0, "Makamba"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6112, '', 0, "Muramvya"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6113, '', 0, "Muyinga"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6114, '', 0, "Mwaro"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6115, '', 0, "Ngozi"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6116, '', 0, "Rumonge"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6117, '', 0, "Rutana"); -INSERT INTO llx_c_regions (fk_pays, code_region, cheflieu, tncc, nom) VALUES ( 61, 6118, '', 0, "Ruyigi"); - From 783337604de542e435b19d6cf7621707d7c60cf5 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 May 2022 15:28:36 +0200 Subject: [PATCH 528/738] Fix regression in address formating --- htdocs/core/lib/functions.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 8776381b922..8772cd55714 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -2257,7 +2257,7 @@ function dol_format_address($object, $withcountry = 0, $sep = "\n", $outputlangs $ret = ''; $countriesusingstate = array('AU', 'CA', 'US', 'IN', 'GB', 'ES', 'UK', 'TR', 'CN'); // See also MAIN_FORCE_STATE_INTO_ADDRESS - $sep = "\n"; + // See format of addresses on https://en.wikipedia.org/wiki/Address // Address if (empty($mode)) { From 80bce5a893c98d21e87b73668aacfef9d38345bc Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 May 2022 16:06:00 +0200 Subject: [PATCH 529/738] Look and feel v16 --- htdocs/societe/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/societe/index.php b/htdocs/societe/index.php index eb0c1e35230..e198056b362 100644 --- a/htdocs/societe/index.php +++ b/htdocs/societe/index.php @@ -353,7 +353,7 @@ if ($result) { $lastmodified .= $thirdparty_static->getTypeUrl(); $lastmodified .= ''; // Last modified date - $lastmodified .= ''; + $lastmodified .= 'date_modification, 'dayhour')).'">'; $lastmodified .= dol_print_date($thirdparty_static->date_modification, 'day'); $lastmodified .= ""; $lastmodified .= ''; From 937d0418b4a7e8bf83a4c2cdc9d50fbfc47c051a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 May 2022 16:08:54 +0200 Subject: [PATCH 530/738] Fix tz --- htdocs/core/lib/functions.lib.php | 2 +- htdocs/societe/index.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 8772cd55714..24c39d0f298 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -2357,7 +2357,7 @@ function dol_strftime($fmt, $ts = false, $is_gmt = false) * @param string $tzoutput true or 'gmt' => string is for Greenwich location * false or 'tzserver' => output string is for local PHP server TZ usage * 'tzuser' => output string is for user TZ (current browser TZ with current dst) => In a future, we should have same behaviour than 'tzuserrel' - * 'tzuserrel' => output string is for user TZ (current browser TZ with dst or not, depending on date position) (TODO not implemented yet) + * 'tzuserrel' => output string is for user TZ (current browser TZ with dst or not, depending on date position) * @param Translate $outputlangs Object lang that contains language for text translation. * @param boolean $encodetooutput false=no convert into output pagecode * @return string Formated date or '' if time is null diff --git a/htdocs/societe/index.php b/htdocs/societe/index.php index e198056b362..8cae5ef49f8 100644 --- a/htdocs/societe/index.php +++ b/htdocs/societe/index.php @@ -353,8 +353,8 @@ if ($result) { $lastmodified .= $thirdparty_static->getTypeUrl(); $lastmodified .= ''; // Last modified date - $lastmodified .= 'date_modification, 'dayhour')).'">'; - $lastmodified .= dol_print_date($thirdparty_static->date_modification, 'day'); + $lastmodified .= 'date_modification, 'dayhour', 'tzuserrel')).'">'; + $lastmodified .= dol_print_date($thirdparty_static->date_modification, 'day', 'tzuserrel'); $lastmodified .= ""; $lastmodified .= ''; $lastmodified .= $thirdparty_static->getLibStatut(3); From 5d148a8a995076a575b09a957ca352d40e8c1c8c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 May 2022 16:53:19 +0200 Subject: [PATCH 531/738] Fix alignement --- htdocs/imports/import.php | 43 +++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/htdocs/imports/import.php b/htdocs/imports/import.php index b87b1e18f1a..84ecc417a76 100644 --- a/htdocs/imports/import.php +++ b/htdocs/imports/import.php @@ -1079,16 +1079,16 @@ if ($step == 4 && $datatoimport) { } } - $height = '24px'; //needs px for css height attribute below + $height = '32px'; //needs px for css height attribute below $i = 0; $mandatoryfieldshavesource = true; - print ''; + print '
    '; foreach ($fieldstarget as $code => $line) { if ($i == $minpos) { break; } - print ''; + print ''; $entity = (!empty($objimport->array_import_entities[0][$code]) ? $objimport->array_import_entities[0][$code] : $objimport->array_import_icon[0]); $tablealias = preg_replace('/(\..*)$/i', '', $code); @@ -1116,6 +1116,7 @@ if ($step == 4 && $datatoimport) { print ''; print $optionsnotused; print ''; + //print ajax_combobox('selectorderimport_'.($i+1)); print ""; print ''; diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index cadeb278ae7..b66452b2c5f 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -1206,7 +1206,8 @@ class Project extends CommonObject $label .= ($label ? '
    ' : '').''.$langs->trans('Ref').': '.$this->ref; // The space must be after the : to not being explode when showing the title in img_picto $label .= ($label ? '
    ' : '').''.$langs->trans('Label').': '.$this->title; // The space must be after the : to not being explode when showing the title in img_picto if (isset($this->public)) { - $label .= '
    '.$langs->trans("Visibility").": ".($this->public ? $langs->trans("SharedProject") : $langs->trans("PrivateProject")); + $label .= '
    '.$langs->trans("Visibility").": "; + $label .= ($this->public ? img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"').$langs->trans("SharedProject") : img_picto($langs->trans('PrivateProject'), 'private', 'class="paddingrightonly"').$langs->trans("PrivateProject")); } if (!empty($this->thirdparty_name)) { $label .= ($label ? '
    ' : '').''.$langs->trans('ThirdParty').': '.$this->thirdparty_name; // The space must be after the : to not being explode when showing the title in img_picto diff --git a/htdocs/projet/comment.php b/htdocs/projet/comment.php index 52a1f581df8..3bea4b5db03 100644 --- a/htdocs/projet/comment.php +++ b/htdocs/projet/comment.php @@ -125,8 +125,10 @@ print '
    '; $filecolumn = !empty($array_match_database_to_file[$code])?$array_match_database_to_file[$code]:0; @@ -1224,7 +1225,7 @@ if ($step == 4 && $datatoimport) { print ''; - if ($conf->use_javascript_ajax) { + if (!empty($conf->use_javascript_ajax)) { print ''."\n"; @@ -2174,24 +2177,24 @@ $db->close(); */ function show_elem($fieldssource, $pos, $key, $var, $nostyle = '') { - global $langs, $bc; + global $langs; - $height = '28px'; + $height = '32px'; if ($key == 'none') { //stop multiple duplicate ids with no number print "\n\n\n"; print '
    '."\n"; - print ''."\n"; + print '
    '."\n"; } else { print "\n\n\n"; print '
    '."\n"; - print '
    '."\n"; + print '
    '."\n"; } if (($pos && $pos > count($fieldssource)) && (!isset($fieldssource[$pos]["imported"]))) { // No fields - print ''; + print ''; print ''; @@ -2200,7 +2203,7 @@ function show_elem($fieldssource, $pos, $key, $var, $nostyle = '') print ''; print ''; } elseif ($key == 'none') { // Empty line - print ''; + print ''; print ''; @@ -2210,7 +2213,7 @@ function show_elem($fieldssource, $pos, $key, $var, $nostyle = '') print ''; } else { // Print field of source file - print ''; + print ''; print ''; + print ''; + print '"; + print ''; // List of not imported fields + /* print ''; print ''; + */ print '
    '; //print img_picto(($pos > 0 ? $langs->trans("MoveField", $pos) : ''), 'grip_title', 'class="boxhandle" style="cursor:move;"'); print '
    '; print ' '; print '
    '; // The image must have the class 'boxhandle' beause it's value used in DOM draggable objects to define the area used to catch the full object //print img_picto($langs->trans("MoveField", $pos), 'grip_title', 'class="boxhandle" style="cursor:move;"'); From c3c29393c101c380422711d13496172af9a7fe4f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 May 2022 18:00:59 +0200 Subject: [PATCH 532/738] Look and feel v16 --- htdocs/core/lib/functions.lib.php | 9 +-- htdocs/imports/import.php | 13 ++-- htdocs/langs/en_US/projects.lang | 2 +- htdocs/projet/card.php | 6 ++ htdocs/projet/class/project.class.php | 3 +- htdocs/projet/comment.php | 2 + htdocs/projet/contact.php | 2 + htdocs/projet/element.php | 2 + htdocs/projet/ganttview.php | 2 + htdocs/projet/list.php | 96 ++++++++++++++------------- htdocs/projet/tasks.php | 2 + htdocs/projet/tasks/comment.php | 2 + htdocs/projet/tasks/contact.php | 2 + htdocs/projet/tasks/document.php | 2 + htdocs/projet/tasks/note.php | 2 + htdocs/projet/tasks/task.php | 2 + htdocs/projet/tasks/time.php | 2 + htdocs/theme/eldy/global.inc.php | 2 +- htdocs/theme/md/style.css.php | 2 +- htdocs/ticket/list.php | 2 + 20 files changed, 98 insertions(+), 59 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 24c39d0f298..559d2516e0a 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -3788,7 +3788,7 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $ 'recent', 'reception', 'recruitmentcandidature', 'recruitmentjobposition', 'resource', 'recurring', 'shapes', 'square', 'stop-circle', 'supplier', 'supplier_proposal', 'supplier_order', 'supplier_invoice', 'timespent', 'title_setup', 'title_accountancy', 'title_bank', 'title_hrm', 'title_agenda', - 'uncheck', 'user-cog', 'user-injured', 'user-md', 'vat', 'website', 'workstation', + 'uncheck', 'user-cog', 'user-injured', 'user-md', 'vat', 'website', 'workstation', 'world', 'private', 'conferenceorbooth', 'eventorganization' ))) { $fakey = $pictowithouttext; @@ -3839,7 +3839,7 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $ 'title_agenda'=>'calendar-alt', 'uncheck'=>'times', 'uparrow'=>'share', 'vat'=>'money-check-alt', 'vcard'=>'address-card', 'jabber'=>'comment-o', - 'website'=>'globe-americas', 'workstation'=>'pallet', + 'website'=>'globe-americas', 'workstation'=>'pallet', 'world'=>'globe', 'private'=>'user-lock', 'conferenceorbooth'=>'chalkboard-teacher', 'eventorganization'=>'project-diagram' ); if ($pictowithouttext == 'off') { @@ -3908,7 +3908,8 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $ 'error'=>'pictoerror', 'warning'=>'pictowarning', 'switch_on'=>'font-status4', 'switch_on_red'=>'font-status8', 'holiday'=>'infobox-holiday', 'info'=>'opacityhigh', 'invoice'=>'infobox-commande', 'knowledgemanagement'=>'infobox-contrat rotate90', 'loan'=>'infobox-bank_account', - 'payment'=>'infobox-bank_account', 'payment_vat'=>'infobox-bank_account', 'poll'=>'infobox-adherent', 'pos'=>'infobox-bank_account', 'project'=>'infobox-project', 'projecttask'=>'infobox-project', 'propal'=>'infobox-propal', + 'payment'=>'infobox-bank_account', 'payment_vat'=>'infobox-bank_account', 'poll'=>'infobox-adherent', 'pos'=>'infobox-bank_account', 'project'=>'infobox-project', 'projecttask'=>'infobox-project', + 'propal'=>'infobox-propal', 'private'=>'infobox-project', 'reception'=>'flip', 'recruitmentjobposition'=>'infobox-adherent', 'recruitmentcandidature'=>'infobox-adherent', 'resource'=>'infobox-action', 'salary'=>'infobox-bank_account', 'shipment'=>'infobox-commande', 'supplier_invoice'=>'infobox-order_supplier', 'supplier_invoicea'=>'infobox-order_supplier', 'supplier_invoiced'=>'infobox-order_supplier', @@ -3931,7 +3932,7 @@ function img_picto($titlealt, $picto, $moreatt = '', $pictoisfullpath = false, $ //'dolly'=>'#a69944', 'dollyrevert'=>'#a69944', 'lot'=>'#a69944', 'map-marker-alt'=>'#aaa', 'mrp'=>'#a69944', 'product'=>'#a69944', 'service'=>'#a69944', 'inventory'=>'#a69944', 'stock'=>'#a69944', 'movement'=>'#a69944', - 'other'=>'#ddd', + 'other'=>'#ddd', 'world'=>'#986c6a', 'partnership'=>'#6c6aa8', 'playdisabled'=>'#ccc', 'printer'=>'#444', 'projectpub'=>'#986c6a', 'reception'=>'#a69944', 'resize'=>'#444', 'rss'=>'#cba', //'shipment'=>'#a69944', 'security'=>'#999', 'square'=>'#888', 'stop-circle'=>'#888', 'stats'=>'#444', 'switch_off'=>'#999', 'technic'=>'#999', 'timespent'=>'#555', diff --git a/htdocs/imports/import.php b/htdocs/imports/import.php index 84ecc417a76..c12b5746e82 100644 --- a/htdocs/imports/import.php +++ b/htdocs/imports/import.php @@ -1097,7 +1097,8 @@ if ($step == 4 && $datatoimport) { $entityicon = !empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity; // $entityicon must string name of picto of the field like 'project', 'company', 'contact', 'modulename', ... $entitylang = $entitytolang[$entity] ? $entitytolang[$entity] : $objimport->array_import_label[0]; // $entitylang must be a translation key to describe object the field is related to, like 'Company', 'Contact', 'MyModyle', ... - print '=>'.img_object('', $entityicon).' '.$langs->trans($entitylang).'=> '.img_object('', $entityicon).' '.$langs->trans($entitylang).''; print ''; //print ajax_combobox('selectorderimport_'.($i+1)); print "'; $filecolumn = !empty($array_match_database_to_file[$code])?$array_match_database_to_file[$code]:0; // Source field info @@ -1182,6 +1185,7 @@ if ($step == 4 && $datatoimport) { print '
    '.$langs->trans("NotUsedFields").'
    '; @@ -1220,6 +1224,7 @@ if ($step == 4 && $datatoimport) { $i++; } print '
    '; print '
    '; diff --git a/htdocs/langs/en_US/projects.lang b/htdocs/langs/en_US/projects.lang index 739a35dcebf..e0fa85dd273 100644 --- a/htdocs/langs/en_US/projects.lang +++ b/htdocs/langs/en_US/projects.lang @@ -6,7 +6,7 @@ ProjectLabel=Project label ProjectsArea=Projects Area ProjectStatus=Project status SharedProject=Everybody -PrivateProject=Project contacts +PrivateProject=Assigned contacts ProjectsImContactFor=Projects for which I am explicitly a contact AllAllowedProjects=All project I can read (mine + public) AllProjects=All projects diff --git a/htdocs/projet/card.php b/htdocs/projet/card.php index 6a27472a7e3..2db236ff606 100644 --- a/htdocs/projet/card.php +++ b/htdocs/projet/card.php @@ -651,8 +651,10 @@ if ($action == 'create' && $user->rights->projet->creer) { print ''; if (GETPOST('public') == 0) { + print img_picto($langs->trans('PrivateProject'), 'private', 'class="paddingrightonly"'); print $langs->trans("PrivateProject"); } else { + print img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"'); print $langs->trans("SharedProject"); } } @@ -926,8 +928,10 @@ if ($action == 'create' && $user->rights->projet->creer) { print ''; if ($object->public == 0) { + print img_picto($langs->trans('PrivateProject'), 'private', 'class="paddingrightonly"'); print $langs->trans("PrivateProject"); } else { + print img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"'); print $langs->trans("SharedProject"); } } @@ -1075,8 +1079,10 @@ if ($action == 'create' && $user->rights->projet->creer) { // Visibility print '
    '.$langs->trans("Visibility").''; if ($object->public) { + print img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"'); print $langs->trans('SharedProject'); } else { + print img_picto($langs->trans('SharedProject'), 'private', 'class="paddingrightonly"'); print $langs->trans('PrivateProject'); } print '
    '; // Visibility print ''; diff --git a/htdocs/projet/contact.php b/htdocs/projet/contact.php index d1563cbfab8..6eaae5c473d 100644 --- a/htdocs/projet/contact.php +++ b/htdocs/projet/contact.php @@ -349,8 +349,10 @@ if ($id > 0 || !empty($ref)) { // Visibility print ''; diff --git a/htdocs/projet/element.php b/htdocs/projet/element.php index 80fccce7912..64f7a221449 100644 --- a/htdocs/projet/element.php +++ b/htdocs/projet/element.php @@ -271,8 +271,10 @@ if (!empty($conf->global->PROJECT_USE_OPPORTUNITIES) || empty($conf->global->PRO // Visibility print ''; diff --git a/htdocs/projet/ganttview.php b/htdocs/projet/ganttview.php index 7266e029985..050528da933 100644 --- a/htdocs/projet/ganttview.php +++ b/htdocs/projet/ganttview.php @@ -171,8 +171,10 @@ if (($id > 0 && is_numeric($id)) || !empty($ref)) { // Visibility print ''; diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php index 0e6df96a8ed..5373a80c952 100644 --- a/htdocs/projet/list.php +++ b/htdocs/projet/list.php @@ -924,11 +924,15 @@ if (!empty($arrayfields['p.datee']['checked'])) { print ''; } if (!empty($arrayfields['p.public']['checked'])) { - print ''; } +if (!empty($arrayfields['c.assigned']['checked'])) { + print ''; +} // Opp status if (!empty($arrayfields['p.fk_opp_status']['checked'])) { print ''; } -if (!empty($arrayfields['c.assigned']['checked'])) { - print ''; -} if (!empty($arrayfields['p.usage_opportunity']['checked'])) { print ''; if (!$i) { $totalarray['nbfield']++; } } + // Contacts of project + if (!empty($arrayfields['c.assigned']['checked'])) { + print ''; + } // Opp Status if (!empty($arrayfields['p.fk_opp_status']['checked'])) { print ''; - } // Usage opportunity if (!empty($arrayfields['p.usage_opportunity']['checked'])) { print ''; diff --git a/htdocs/projet/tasks/comment.php b/htdocs/projet/tasks/comment.php index a2bbba52305..c5f655f8e46 100644 --- a/htdocs/projet/tasks/comment.php +++ b/htdocs/projet/tasks/comment.php @@ -185,8 +185,10 @@ if ($id > 0 || !empty($ref)) { // Visibility print ''; diff --git a/htdocs/projet/tasks/contact.php b/htdocs/projet/tasks/contact.php index 0b26161c28c..327d8783256 100644 --- a/htdocs/projet/tasks/contact.php +++ b/htdocs/projet/tasks/contact.php @@ -244,8 +244,10 @@ if ($id > 0 || !empty($ref)) { // Visibility print ''; diff --git a/htdocs/projet/tasks/document.php b/htdocs/projet/tasks/document.php index c57610d0130..0e520989d8c 100644 --- a/htdocs/projet/tasks/document.php +++ b/htdocs/projet/tasks/document.php @@ -200,8 +200,10 @@ if ($object->id > 0) { // Visibility print ''; diff --git a/htdocs/projet/tasks/note.php b/htdocs/projet/tasks/note.php index 5f3d74a3c68..652b195afd4 100644 --- a/htdocs/projet/tasks/note.php +++ b/htdocs/projet/tasks/note.php @@ -190,8 +190,10 @@ if ($object->id > 0) { // Visibility print ''; diff --git a/htdocs/projet/tasks/task.php b/htdocs/projet/tasks/task.php index f6e9b6803af..0c323d5e058 100644 --- a/htdocs/projet/tasks/task.php +++ b/htdocs/projet/tasks/task.php @@ -285,8 +285,10 @@ if ($id > 0 || !empty($ref)) { // Visibility print ''; diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php index 6f04cd16a51..fa987805a25 100644 --- a/htdocs/projet/tasks/time.php +++ b/htdocs/projet/tasks/time.php @@ -823,8 +823,10 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser // Visibility print ''; diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 254253f8d04..76e7a74450d 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -3973,7 +3973,7 @@ table.hidepaginationnext .paginationnext { /* Set the color for hover lines */ -.oddeven:hover, .evenodd:hover, .impair:hover, .pair:hover +.oddeven:hover, .evenodd:hover, .oddevenimport:hover, .evenoddimport:hover, .impair:hover, .pair:hover { background: var(--colorbacklinepairhover) !important; /* Must be background to be stronger than background of odd or even */ } diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 5cf1f7a750b..879bd52e864 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -3929,7 +3929,7 @@ ul.noborder li:nth-child(odd):not(.liste_titre) { -webkit-box-shadow: unset; } -.oddeven:hover, .evenodd:hover, .impair:hover, .pair:hover +.oddeven:hover, .evenodd:hover, .oddevenimport:hover, .evenoddimport:hover, .impair:hover, .pair:hover { background: rgb() !important; } diff --git a/htdocs/ticket/list.php b/htdocs/ticket/list.php index a8314c4bf89..5204b0ffea7 100644 --- a/htdocs/ticket/list.php +++ b/htdocs/ticket/list.php @@ -592,8 +592,10 @@ if ($projectid > 0 || $project_ref) { // Visibility print ''; From 04f64dd252d16b4092be1a1de59a68c22dc8eeaf Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 May 2022 18:54:50 +0200 Subject: [PATCH 533/738] Look and feel v16 --- htdocs/projet/card.php | 9 +++++---- htdocs/projet/contact.php | 3 +++ htdocs/projet/element.php | 5 ++++- htdocs/projet/tasks/comment.php | 9 ++++----- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/htdocs/projet/card.php b/htdocs/projet/card.php index 2db236ff606..873cb7ce82d 100644 --- a/htdocs/projet/card.php +++ b/htdocs/projet/card.php @@ -1105,21 +1105,22 @@ if ($action == 'create' && $user->rights->projet->creer) { // Opportunity Amount print ''; // Opportunity Weighted Amount + /* print ''; + */ } // Date start - end diff --git a/htdocs/projet/contact.php b/htdocs/projet/contact.php index 6eaae5c473d..3230c325039 100644 --- a/htdocs/projet/contact.php +++ b/htdocs/projet/contact.php @@ -377,6 +377,9 @@ if ($id > 0 || !empty($ref)) { print ''; } diff --git a/htdocs/projet/element.php b/htdocs/projet/element.php index 64f7a221449..caad4374da0 100644 --- a/htdocs/projet/element.php +++ b/htdocs/projet/element.php @@ -299,6 +299,9 @@ if (!empty($conf->global->PROJECT_USE_OPPORTUNITIES)) { print ''; } @@ -698,7 +701,7 @@ if (!$showdatefilter) { print $form->selectDate($datee, 'datee', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to")); print ''; print '
    '; - print ''; + print ''; print '
    '; print ''; print ''; diff --git a/htdocs/projet/tasks/comment.php b/htdocs/projet/tasks/comment.php index c5f655f8e46..e2686ded9f2 100644 --- a/htdocs/projet/tasks/comment.php +++ b/htdocs/projet/tasks/comment.php @@ -205,19 +205,18 @@ if ($id > 0 || !empty($ref)) { // Opportunity percent print ''; // Opportunity Amount print ''; } From b87b997c7dfdac81b120b85187594329bc63924e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 May 2022 19:19:52 +0200 Subject: [PATCH 534/738] Debug v16 --- htdocs/core/class/html.form.class.php | 7 ++++++- .../eventorganization/conferenceorbooth_list.php | 8 +++++--- .../conferenceorboothattendee_list.php | 15 ++++++++++++--- htdocs/projet/card.php | 10 +++++++--- 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 48a00919d65..05ac16fbfa6 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -234,7 +234,11 @@ class Form if (preg_match('/^(string|safehtmlstring|email)/', $typeofdata)) { $tmp = explode(':', $typeofdata); $ret .= ''; - } elseif (preg_match('/^(numeric|amount|integer)/', $typeofdata)) { + } elseif (preg_match('/^(integer)/', $typeofdata)) { + $tmp = explode(':', $typeofdata); + $valuetoshow = price2num($editvalue ? $editvalue : $value, 0); + $ret .= ''; + } elseif (preg_match('/^(numeric|amount)/', $typeofdata)) { $tmp = explode(':', $typeofdata); $valuetoshow = price2num($editvalue ? $editvalue : $value); $ret .= ''; @@ -280,6 +284,7 @@ class Form $ret .= ''; } + // Button save-cancel if (empty($notabletag)) { $ret .= ''; diff --git a/htdocs/eventorganization/conferenceorboothattendee_list.php b/htdocs/eventorganization/conferenceorboothattendee_list.php index ee7fe97421a..878b1baf992 100644 --- a/htdocs/eventorganization/conferenceorboothattendee_list.php +++ b/htdocs/eventorganization/conferenceorboothattendee_list.php @@ -59,6 +59,7 @@ $conf_or_booth_id = GETPOST('conforboothid', 'int'); $withproject = GETPOST('withproject', 'int'); $fk_project = GETPOST('fk_project', 'int') ? GETPOST('fk_project', 'int') : GETPOST('projectid', 'int'); +$projectid = $fk_project; $withProjectUrl=''; @@ -459,10 +460,12 @@ if ($projectstatic->id > 0 || $confOrBooth > 0) { // Visibility print ''; @@ -541,6 +544,12 @@ if ($projectstatic->id > 0 || $confOrBooth > 0) { print $form->editfieldval($form->textwithpicto($langs->trans('PriceOfRegistration'), $langs->trans("PriceOfRegistrationHelp")), 'price_registration', $projectstatic->price_registration, $projectstatic, 0, 'amount', '', 0, 0, '', 0, '', 'projectid'); print ""; + print '"; + print ''; - print ''; + print ''; print ''; } @@ -970,7 +972,7 @@ if ($action == 'create' && $user->rights->projet->creer) { if ($comefromclone) { print ' checked '; } - print '/>'; + print '/>'; print ''; // Date end @@ -980,7 +982,9 @@ if ($action == 'create' && $user->rights->projet->creer) { // Budget print ''; - print ''; + print ''; print ''; // Description From 71c0f08b6c56b575e7195bc118c460329ec6a20a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 May 2022 19:47:06 +0200 Subject: [PATCH 535/738] Debug v16 --- .../public/eventorganization/attendee_new.php | 240 ++++++++++-------- 1 file changed, 132 insertions(+), 108 deletions(-) diff --git a/htdocs/public/eventorganization/attendee_new.php b/htdocs/public/eventorganization/attendee_new.php index 70bad2a31dc..40e082c6f2e 100644 --- a/htdocs/public/eventorganization/attendee_new.php +++ b/htdocs/public/eventorganization/attendee_new.php @@ -92,15 +92,27 @@ if ($type == 'conf') { $errmsg .= $project->error; } } + +$currentnbofattendees = 0; if ($type == 'global') { $resultproject = $project->fetch($id); if ($resultproject < 0) { $error++; $errmsg .= $project->error; + } else { + $sql = "SELECT COUNT(*) as nb FROM ".MAIN_DB_PREFIX."projet"; + $sql .= " WHERE ".MAIN_DB_PREFIX."eventorganization_conferenceorboothattendee = ".((int) $project->id); + + $resql = $db->query($resql); + if ($resql) { + $obj = $db->fetch_object($resql); + if ($obj) { + $currentnbofattendees = $obj->nb; + } + } } } - // Security check $securekeyreceived = GETPOST('securekey', 'alpha'); $securekeytocompare = dol_hash($conf->global->EVENTORGANIZATION_SECUREKEY.'conferenceorbooth'.$id, 'md5'); @@ -628,6 +640,7 @@ print '
    '; print $langs->trans("EvntOrgWelcomeMessage", $project->title . ' '. $conference->label); print '
    '; +$maxattendees = 0; if ($conference->id) { print $langs->trans("Date").': '; print dol_print_date($conference->datep); @@ -642,138 +655,149 @@ if ($conference->id) { print ' - '; print dol_print_date($project->date_end); } + $maxattendees = $project->max_attendees; } print '
    '; +if ($maxattendees && $currentnbofattendees >= $maxattendees) { + print '
    '; + print '
    '.$langs->trans("MaxNbOfAttendeesReached").'
    '; + print '
    '; +} + + print '
    '; dol_htmloutput_errors($errmsg); -if (!empty($conference->id) && $conference->status==ConferenceOrBooth::STATUS_CONFIRMED || (!empty($project->id) && $project->status==Project::STATUS_VALIDATED)) { - // Print form - print '
    ' . "\n"; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; +if ((!empty($conference->id) && $conference->status == ConferenceOrBooth::STATUS_CONFIRMED) || (!empty($project->id) && $project->status == Project::STATUS_VALIDATED)) { + if (empty($maxattendees) || $currentnbofattendees < $maxattendees) { + // Print form + print '' . "\n"; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; - print '
    '; + print '
    '; - print '
    ' . $langs->trans("FieldsWithAreMandatory", '*') . '
    '; - //print $langs->trans("FieldsWithIsForPublic",'**').'
    '; + print '
    ' . $langs->trans("FieldsWithAreMandatory", '*') . '
    '; + //print $langs->trans("FieldsWithIsForPublic",'**').'
    '; - print dol_get_fiche_head(''); + print dol_get_fiche_head(''); - print ''; + '; - print '
    '.$langs->trans("Visibility").''; if ($object->public) { + print img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"'); print $langs->trans('SharedProject'); } else { + print img_picto($langs->trans('PrivateProject'), 'private', 'class="paddingrightonly"'); print $langs->trans('PrivateProject'); } print '
    '.$langs->trans("Visibility").''; if ($object->public) { + print img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"'); print $langs->trans('SharedProject'); } else { + print img_picto($langs->trans('PrivateProject'), 'private', 'class="paddingrightonly"'); print $langs->trans('PrivateProject'); } print '
    '.$langs->trans("Visibility").''; if ($object->public) { + print img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"'); print $langs->trans('SharedProject'); } else { + print img_picto($langs->trans('PrivateProject'), 'private', 'class="paddingrightonly"'); print $langs->trans('PrivateProject'); } print '
    '.$langs->trans("Visibility").''; if ($object->public) { + print img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"'); print $langs->trans('SharedProject'); } else { + print img_picto($langs->trans('PrivateProject'), 'private', 'class="paddingrightonly"'); print $langs->trans('PrivateProject'); } print '
    '; + print ''; $array = array(''=>'', 0 => $langs->trans("PrivateProject"), 1 => $langs->trans("SharedProject")); print $form->selectarray('search_public', $array, $search_public); print ''; + print ''; @@ -954,10 +958,6 @@ if (!empty($arrayfields['p.budget_amount']['checked'])) { print ''; print ''; - print ''; print $form->selectyesno('search_usage_opportunity', $search_usage_opportunity, 1, false, 1); @@ -1060,7 +1060,10 @@ if (!empty($arrayfields['p.datee']['checked'])) { print_liste_field_titre($arrayfields['p.datee']['label'], $_SERVER["PHP_SELF"], "p.datee", "", $param, '', $sortfield, $sortorder, 'center '); } if (!empty($arrayfields['p.public']['checked'])) { - print_liste_field_titre($arrayfields['p.public']['label'], $_SERVER["PHP_SELF"], "p.public", "", $param, "", $sortfield, $sortorder); + print_liste_field_titre($arrayfields['p.public']['label'], $_SERVER["PHP_SELF"], "p.public", "", $param, "", $sortfield, $sortorder, 'center '); +} +if (!empty($arrayfields['c.assigned']['checked'])) { + print_liste_field_titre($arrayfields['c.assigned']['label'], $_SERVER["PHP_SELF"], "", '', $param, '', $sortfield, $sortorder, 'center ', ''); } if (!empty($arrayfields['p.fk_opp_status']['checked'])) { print_liste_field_titre($arrayfields['p.fk_opp_status']['label'], $_SERVER["PHP_SELF"], 'p.fk_opp_status', "", $param, '', $sortfield, $sortorder, 'center '); @@ -1077,9 +1080,6 @@ if (!empty($arrayfields['opp_weighted_amount']['checked'])) { if (!empty($arrayfields['p.budget_amount']['checked'])) { print_liste_field_titre($arrayfields['p.budget_amount']['label'], $_SERVER["PHP_SELF"], 'p.budget_amount', "", $param, '', $sortfield, $sortorder, 'right '); } -if (!empty($arrayfields['c.assigned']['checked'])) { - print_liste_field_titre($arrayfields['c.assigned']['label'], $_SERVER["PHP_SELF"], "", '', $param, '', $sortfield, $sortorder, 'center ', ''); -} if (!empty($arrayfields['p.usage_opportunity']['checked'])) { print_liste_field_titre($arrayfields['p.usage_opportunity']['label'], $_SERVER["PHP_SELF"], 'p.usage_opportunity', "", $param, '', $sortfield, $sortorder, 'right '); } @@ -1258,17 +1258,54 @@ while ($i < min($num, $limit)) { } // Visibility if (!empty($arrayfields['p.public']['checked'])) { - print ''; + print ''; if ($obj->public) { - print $langs->trans('SharedProject'); + print img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"'); + //print $langs->trans('SharedProject'); } else { - print $langs->trans('PrivateProject'); + print img_picto($langs->trans('PrivateProject'), 'private', 'class="paddingrightonly"'); + //print $langs->trans('PrivateProject'); } print ''; + $ifisrt = 1; + foreach (array('internal', 'external') as $source) { + $tab = $object->liste_contact(-1, $source); + $numcontact = count($tab); + if (!empty($numcontact)) { + foreach ($tab as $contactproject) { + //var_dump($contacttask); + if ($source == 'internal') { + $c = new User($db); + } else { + $c = new Contact($db); + } + $c->fetch($contactproject['id']); + if (!empty($c->photo)) { + if (get_class($c) == 'User') { + print $c->getNomUrl(-2, '', 0, 0, 24, 1, '', ($ifisrt ? '' : 'notfirst')); + } else { + print $c->getNomUrl(-2, '', 0, '', -1, 0, ($ifisrt ? '' : 'notfirst')); + } + } else { + if (get_class($c) == 'User') { + print $c->getNomUrl(2, '', 0, 0, 24, 1, '', ($ifisrt ? '' : 'notfirst')); + } else { + print $c->getNomUrl(2, '', 0, '', -1, 0, ($ifisrt ? '' : 'notfirst')); + } + } + $ifisrt = 0; + } + } + } + print ''; @@ -1340,41 +1377,6 @@ while ($i < min($num, $limit)) { $totalarray['pos'][$totalarray['nbfield']] = 'p.budget_amount'; } } - // Contacts of project - if (!empty($arrayfields['c.assigned']['checked'])) { - print ''; - $ifisrt = 1; - foreach (array('internal', 'external') as $source) { - $tab = $object->liste_contact(-1, $source); - $numcontact = count($tab); - if (!empty($numcontact)) { - foreach ($tab as $contactproject) { - //var_dump($contacttask); - if ($source == 'internal') { - $c = new User($db); - } else { - $c = new Contact($db); - } - $c->fetch($contactproject['id']); - if (!empty($c->photo)) { - if (get_class($c) == 'User') { - print $c->getNomUrl(-2, '', 0, 0, 24, 1, '', ($ifisrt ? '' : 'notfirst')); - } else { - print $c->getNomUrl(-2, '', 0, '', -1, 0, ($ifisrt ? '' : 'notfirst')); - } - } else { - if (get_class($c) == 'User') { - print $c->getNomUrl(2, '', 0, 0, 24, 1, '', ($ifisrt ? '' : 'notfirst')); - } else { - print $c->getNomUrl(2, '', 0, '', -1, 0, ($ifisrt ? '' : 'notfirst')); - } - } - $ifisrt = 0; - } - } - } - print ''; diff --git a/htdocs/projet/tasks.php b/htdocs/projet/tasks.php index aabca026f20..eacd507b35c 100644 --- a/htdocs/projet/tasks.php +++ b/htdocs/projet/tasks.php @@ -603,8 +603,10 @@ if ($id > 0 || !empty($ref)) { // Visibility print '
    '.$langs->trans("Visibility").''; if ($object->public) { + print img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"'); print $langs->trans('SharedProject'); } else { + print img_picto($langs->trans('PrivateProject'), 'private', 'class="paddingrightonly"'); print $langs->trans('PrivateProject'); } print '
    '.$langs->trans("Visibility").''; if ($projectstatic->public) { + print img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"'); print $langs->trans('SharedProject'); } else { + print img_picto($langs->trans('PrivateProject'), 'private', 'class="paddingrightonly"'); print $langs->trans('PrivateProject'); } print '
    '.$langs->trans("Visibility").''; if ($projectstatic->public) { + print img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"'); print $langs->trans('SharedProject'); } else { + print img_picto($langs->trans('PrivateProject'), 'private', 'class="paddingrightonly"'); print $langs->trans('PrivateProject'); } print '
    '.$langs->trans("Visibility").''; if ($projectstatic->public) { + print img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"'); print $langs->trans('SharedProject'); } else { + print img_picto($langs->trans('PrivateProject'), 'private', 'class="paddingrightonly"'); print $langs->trans('PrivateProject'); } print '
    '.$langs->trans("Visibility").''; if ($projectstatic->public) { + print img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"'); print $langs->trans('SharedProject'); } else { + print img_picto($langs->trans('PrivateProject'), 'private', 'class="paddingrightonly"'); print $langs->trans('PrivateProject'); } print '
    '.$langs->trans("Visibility").''; if ($projectstatic->public) { + print img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"'); print $langs->trans('SharedProject'); } else { + print img_picto($langs->trans('PrivateProject'), 'private', 'class="paddingrightonly"'); print $langs->trans('PrivateProject'); } print '
    '.$langs->trans("Visibility").''; if ($projectstatic->public) { + print img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"'); print $langs->trans('SharedProject'); } else { + print img_picto($langs->trans('PrivateProject'), 'private', 'class="paddingrightonly"'); print $langs->trans('PrivateProject'); } print '
    '.$langs->trans("Visibility").''; if ($projectstat->public) { + print img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"'); print $langs->trans('SharedProject'); } else { + print img_picto($langs->trans('PrivateProject'), 'private', 'class="paddingrightonly"'); print $langs->trans('PrivateProject'); } print '
    '.$langs->trans("OpportunityAmount").''; - /*if ($object->opp_status) - { - print price($obj->opp_amount, 1, $langs, 1, 0, -1, $conf->currency); - }*/ if (strcmp($object->opp_amount, '')) { print ''.price($object->opp_amount, 0, $langs, 1, 0, -1, $conf->currency).''; + if (strcmp($object->opp_percent, '')) { + print '       '.$langs->trans("Weighted").': '.price($object->opp_amount * $object->opp_percent / 100, 0, $langs, 1, 0, -1, $conf->currency).''; + } } print '
    '.$langs->trans('OpportunityWeightedAmount').''; if (strcmp($object->opp_amount, '') && strcmp($object->opp_percent, '')) { print ''.price($object->opp_amount * $object->opp_percent / 100, 0, $langs, 1, 0, -1, $conf->currency).''; } print '
    '.$langs->trans("OpportunityAmount").''; if (strcmp($object->opp_amount, '')) { print ''.price($object->opp_amount, '', $langs, 0, 0, 0, $conf->currency).''; + if (strcmp($object->opp_percent, '')) { + print '       '.$langs->trans("Weighted").': '.price($object->opp_amount * $object->opp_percent / 100, 0, $langs, 1, 0, -1, $conf->currency).''; + } } print '
    '.$langs->trans("OpportunityAmount").''; if (strcmp($object->opp_amount, '')) { print ''.price($object->opp_amount, '', $langs, 1, 0, 0, $conf->currency).''; + if (strcmp($object->opp_percent, '')) { + print '       '.$langs->trans("Weighted").': '.price($object->opp_amount * $object->opp_percent / 100, 0, $langs, 1, 0, -1, $conf->currency).''; + } } print '
    '.$langs->trans("OpportunityProbability").''; - if (strcmp($object->opp_percent, '')) { + if (strcmp($projectstatic->opp_percent, '')) { print price($projectstatic->opp_percent, 0, $langs, 1, 0).' %'; } print '
    '.$langs->trans("OpportunityAmount").''; - /*if ($object->opp_status) - { - print price($obj->opp_amount, 1, $langs, 1, 0, -1, $conf->currency); - }*/ if (strcmp($projectstatic->opp_amount, '')) { print price($projectstatic->opp_amount, 0, $langs, 1, 0, -1, $conf->currency); + if (strcmp($projectstatic->opp_percent, '')) { + print '       '.$langs->trans("Weighted").': '.price($projectstatic->opp_amount * $projectstatic->opp_percent / 100, 0, $langs, 1, 0, -1, $conf->currency).''; + } } print '
    '; } diff --git a/htdocs/eventorganization/conferenceorbooth_list.php b/htdocs/eventorganization/conferenceorbooth_list.php index 88dad1bbac0..6d42d881ab8 100644 --- a/htdocs/eventorganization/conferenceorbooth_list.php +++ b/htdocs/eventorganization/conferenceorbooth_list.php @@ -333,10 +333,12 @@ if ($projectid > 0) { // Visibility print '
    '.$langs->trans("Visibility").''; - if ($project->public) { - print $langs->trans('SharedProject'); + if ($project->public == 0) { + print img_picto($langs->trans('PrivateProject'), 'private', 'class="paddingrightonly"'); + print $langs->trans("PrivateProject"); } else { - print $langs->trans('PrivateProject'); + print img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"'); + print $langs->trans("SharedProject"); } print '
    '.$langs->trans("Visibility").''; - if ($projectstatic->public) { - print $langs->trans('SharedProject'); + if ($projectstatic->public == 0) { + print img_picto($langs->trans('PrivateProject'), 'private', 'class="paddingrightonly"'); + print $langs->trans("PrivateProject"); } else { - print $langs->trans('PrivateProject'); + print img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"'); + print $langs->trans("SharedProject"); } print '
    '; + print $form->editfieldkey($form->textwithpicto($langs->trans('MaxNbOfAttendees'), ''), 'max_attendees', '', $projectstatic, $permissiontoadd, 'integer:3', '&withproject=1', 0, 0, 'projectid'); + print ''; + print $form->editfieldval($form->textwithpicto($langs->trans('MaxNbOfAttendees'), ''), 'max_attendees', $projectstatic->max_attendees, $projectstatic, $permissiontoadd, 'integer:3', '', 0, 0, '&withproject=1', 0, '', 'projectid'); + print "
    '.$langs->trans("EventOrganizationICSLink").''; // Define $urlwithroot $urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root)); diff --git a/htdocs/projet/card.php b/htdocs/projet/card.php index 873cb7ce82d..df50f0703e0 100644 --- a/htdocs/projet/card.php +++ b/htdocs/projet/card.php @@ -959,7 +959,9 @@ if ($action == 'create' && $user->rights->projet->creer) { // Opportunity amount print '
    '.$langs->trans("OpportunityAmount").''; + print $langs->getCurrencySymbol($conf->currency); + print '
    '.$langs->trans("Budget").''; + print $langs->getCurrencySymbol($conf->currency); + print '
    ' . "\n"; + print '
    ' . "\n"; - // Email - print '' . "\n"; - - // Company - print '' . "\n"; - - // Email company for invoice - if ($project->price_registration) { - print '' . "\n"; - } + print '' . "\n"; - // Address - print '' . "\n"; + // Company + print '' . "\n"; - // Zip / Town - print ''; + // Email company for invoice + if ($project->price_registration) { + print '' . "\n"; + } - // Country - print '' . "\n"; + + // Zip / Town + print ''; + + // Country + print ''; - // State - if (empty($conf->global->SOCIETE_DISABLE_STATE)) { - print ''; + // State + if (empty($conf->global->SOCIETE_DISABLE_STATE)) { + print ''; } + + if ($project->price_registration) { + print ''; + } + + $notetoshow = $note_public; + print ''; + + print "
    ' . $langs->trans("EmailAttendee") . '*'; - print img_picto('', 'email', 'class="pictofixedwidth"'); - print '
    ' . $langs->trans("Company"); - if (!empty(floatval($project->price_registration))) { - print '*'; - } - print ' '; - print img_picto('', 'company', 'class="pictofixedwidth"'); - print '
    ' . $langs->trans("EmailCompanyForInvoice") . ''; + // Email + print '
    ' . $langs->trans("EmailAttendee") . '*'; print img_picto('', 'email', 'class="pictofixedwidth"'); - print '
    ' . $langs->trans("Address") . '' . "\n"; - print '
    ' . $langs->trans("Company"); + if (!empty(floatval($project->price_registration))) { + print '*'; + } + print ' '; + print img_picto('', 'company', 'class="pictofixedwidth"'); + print '
    ' . $langs->trans('Zip') . ' / ' . $langs->trans('Town') . ''; - print $formcompany->select_ziptown(GETPOST('zipcode'), 'zipcode', array('town', 'selectcountry_id', 'state_id'), 6, 1); - print ' / '; - print $formcompany->select_ziptown(GETPOST('town'), 'town', array('zipcode', 'selectcountry_id', 'state_id'), 0, 1); - print '
    ' . $langs->trans("EmailCompanyForInvoice") . ''; + print img_picto('', 'email', 'class="pictofixedwidth"'); + print '
    ' . $langs->trans('Country') . '*'; - print img_picto('', 'country', 'class="pictofixedwidth"'); - $country_id = GETPOST('country_id'); - if (!$country_id && !empty($conf->global->MEMBER_NEWFORM_FORCECOUNTRYCODE)) { - $country_id = getCountry($conf->global->MEMBER_NEWFORM_FORCECOUNTRYCODE, 2, $db, $langs); - } - if (!$country_id && !empty($conf->geoipmaxmind->enabled)) { - $country_code = dol_user_country(); - //print $country_code; - if ($country_code) { - $new_country_id = getCountry($country_code, 3, $db, $langs); - //print 'xxx'.$country_code.' - '.$new_country_id; - if ($new_country_id) { - $country_id = $new_country_id; + // Address + print '
    ' . $langs->trans("Address") . '' . "\n"; + print '
    ' . $langs->trans('Zip') . ' / ' . $langs->trans('Town') . ''; + print $formcompany->select_ziptown(GETPOST('zipcode'), 'zipcode', array('town', 'selectcountry_id', 'state_id'), 6, 1); + print ' / '; + print $formcompany->select_ziptown(GETPOST('town'), 'town', array('zipcode', 'selectcountry_id', 'state_id'), 0, 1); + print '
    ' . $langs->trans('Country') . '*'; + print img_picto('', 'country', 'class="pictofixedwidth"'); + $country_id = GETPOST('country_id'); + if (!$country_id && !empty($conf->global->MEMBER_NEWFORM_FORCECOUNTRYCODE)) { + $country_id = getCountry($conf->global->MEMBER_NEWFORM_FORCECOUNTRYCODE, 2, $db, $langs); + } + if (!$country_id && !empty($conf->geoipmaxmind->enabled)) { + $country_code = dol_user_country(); + //print $country_code; + if ($country_code) { + $new_country_id = getCountry($country_code, 3, $db, $langs); + //print 'xxx'.$country_code.' - '.$new_country_id; + if ($new_country_id) { + $country_id = $new_country_id; + } } } - } - $country_code = getCountry($country_id, 2, $db, $langs); - print $form->select_country($country_id, 'country_id'); - print '
    ' . $langs->trans('State') . ''; - if ($country_code) { - print $formcompany->select_state(GETPOST("state_id"), $country_code); - } else { - print ''; + $country_code = getCountry($country_id, 2, $db, $langs); + print $form->select_country($country_id, 'country_id', '', 0, 'minwidth200 widthcentpercentminusx maxwidth300'); + print '
    ' . $langs->trans('State') . ''; + if ($country_code) { + print img_picto('', 'state', 'class="pictofixedwidth"'); + print $formcompany->select_state(GETPOST("state_id"), $country_code); + } else { + print ''; + } + print '
    ' . $langs->trans('Price') . ''; + print price($project->price_registration, 1, $langs, 1, -1, -1, $conf->currency); + print '
    ' . $langs->trans('Note') . ''; + if (!empty($conf->global->EVENTORGANIZATION_DEFAULT_NOTE_ON_REGISTRATION)) { + $notetoshow = str_replace('\n', "\n", $conf->global->EVENTORGANIZATION_DEFAULT_NOTE_ON_REGISTRATION); + } + print ''; print '
    \n"; + + print dol_get_fiche_end(); + + // Save + print '
    '; + print ''; + if (!empty($backtopage)) { + print '     '; + } + print '
    '; + + + print "\n"; + print "
    "; + print '
    '; } - - if ($project->price_registration) { - print '' . $langs->trans('Price') . ''; - print price($project->price_registration, 1, $langs, 1, -1, -1, $conf->currency); - print ''; - } - - $notetoshow = $note_public; - print '' . $langs->trans('Note') . ''; - if (!empty($conf->global->EVENTORGANIZATION_DEFAULT_NOTE_ON_REGISTRATION)) { - $notetoshow = str_replace('\n', "\n", $conf->global->EVENTORGANIZATION_DEFAULT_NOTE_ON_REGISTRATION); - } - print ''; - print ''; - - print "\n"; - - print dol_get_fiche_end(); - - // Save - print '
    '; - print ''; - if (!empty($backtopage)) { - print '     '; - } - print '
    '; - - - print "\n"; - print "
    "; - print ''; } else { print $langs->trans("ConferenceIsNotConfirmed"); } From c020325587e6e3781ce242a295eb6a0082d0888c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 May 2022 19:54:49 +0200 Subject: [PATCH 536/738] Debug v16 --- htdocs/categories/index.php | 3 ++- htdocs/product/class/product.class.php | 28 ++++++++++++++++---------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/htdocs/categories/index.php b/htdocs/categories/index.php index f4456ed79bf..4a9e771416c 100644 --- a/htdocs/categories/index.php +++ b/htdocs/categories/index.php @@ -102,7 +102,8 @@ if (empty($nosearch)) { print ''.$langs->trans("Search").''; print ''; print ''; - print $langs->trans("Name").':'; + print $langs->trans("Name").':'; + print ''; print ''; diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index a6cac07d7e1..9a48b184c73 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -4895,17 +4895,23 @@ class Product extends CommonObject $label .= "
    ".$langs->trans("PMPValue").': '.price($this->pmp, 0, '', 1, -1, -1, $conf->currency); } - if (!empty($conf->accounting->enabled) && $this->status) { - include_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; - $label .= '
    '.$langs->trans('ProductAccountancySellCode').': '.length_accountg($this->accountancy_code_sell); - $label .= '
    '.$langs->trans('ProductAccountancySellIntraCode').': '.length_accountg($this->accountancy_code_sell_intra); - $label .= '
    '.$langs->trans('ProductAccountancySellExportCode').': '.length_accountg($this->accountancy_code_sell_export); - } - if (!empty($conf->accounting->enabled) && $this->status_buy) { - include_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; - $label .= '
    '.$langs->trans('ProductAccountancyBuyCode').': '.length_accountg($this->accountancy_code_buy); - $label .= '
    '.$langs->trans('ProductAccountancyBuyIntraCode').': '.length_accountg($this->accountancy_code_buy_intra); - $label .= '
    '.$langs->trans('ProductAccountancyBuyExportCode').': '.length_accountg($this->accountancy_code_buy_export); + if (!empty($conf->accounting->enabled)) { + if ($this->status) { + include_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; + $label .= '
    '; + $label .= '
    '.$langs->trans('ProductAccountancySellCode').': '.length_accountg($this->accountancy_code_sell); + $label .= '
    '.$langs->trans('ProductAccountancySellIntraCode').': '.length_accountg($this->accountancy_code_sell_intra); + $label .= '
    '.$langs->trans('ProductAccountancySellExportCode').': '.length_accountg($this->accountancy_code_sell_export); + } + if ($this->status_buy) { + include_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; + if (empty($this->status)) { + $label .= '
    '; + } + $label .= '
    '.$langs->trans('ProductAccountancyBuyCode').': '.length_accountg($this->accountancy_code_buy); + $label .= '
    '.$langs->trans('ProductAccountancyBuyIntraCode').': '.length_accountg($this->accountancy_code_buy_intra); + $label .= '
    '.$langs->trans('ProductAccountancyBuyExportCode').': '.length_accountg($this->accountancy_code_buy_export); + } } $linkclose = ''; From 049799c2e615e7c5ebacb7b245af2cf839fb9254 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 May 2022 20:28:00 +0200 Subject: [PATCH 537/738] Update to ckeditor 4.18 --- COPYRIGHT | 2 +- ChangeLog | 2 +- SECURITY.md | 5 +- htdocs/core/class/doleditor.class.php | 19 +- htdocs/includes/ckeditor/UPGRADE.md | 2 +- htdocs/includes/ckeditor/ckeditor/CHANGES.md | 942 +++++--- htdocs/includes/ckeditor/ckeditor/LICENSE.md | 25 +- htdocs/includes/ckeditor/ckeditor/README.md | 10 +- htdocs/includes/ckeditor/ckeditor/SECURITY.md | 10 + .../ckeditor/ckeditor/adapters/jquery.js | 8 +- .../ckeditor/bender-runner.config.json | 16 + .../ckeditor/ckeditor/build-config.js | 86 +- htdocs/includes/ckeditor/ckeditor/ckeditor.js | 2042 +++++++++-------- htdocs/includes/ckeditor/ckeditor/config.js | 2 +- .../includes/ckeditor/ckeditor/contents.css | 2 +- htdocs/includes/ckeditor/ckeditor/lang/af.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/ar.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/az.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/bg.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/bn.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/bs.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/ca.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/cs.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/cy.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/da.js | 5 + .../includes/ckeditor/ckeditor/lang/de-ch.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/de.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/el.js | 5 + .../includes/ckeditor/ckeditor/lang/en-au.js | 5 + .../includes/ckeditor/ckeditor/lang/en-ca.js | 5 + .../includes/ckeditor/ckeditor/lang/en-gb.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/en.js | 6 +- htdocs/includes/ckeditor/ckeditor/lang/eo.js | 5 + .../includes/ckeditor/ckeditor/lang/es-mx.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/es.js | 6 +- htdocs/includes/ckeditor/ckeditor/lang/et.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/eu.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/fa.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/fi.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/fo.js | 5 + .../includes/ckeditor/ckeditor/lang/fr-ca.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/fr.js | 6 +- htdocs/includes/ckeditor/ckeditor/lang/gl.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/gu.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/he.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/hi.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/hr.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/hu.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/id.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/is.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/it.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/ja.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/ka.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/km.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/ko.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/ku.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/lt.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/lv.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/mk.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/mn.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/ms.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/nb.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/nl.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/no.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/oc.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/pl.js | 5 + .../includes/ckeditor/ckeditor/lang/pt-br.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/pt.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/ro.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/ru.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/si.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/sk.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/sl.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/sq.js | 5 + .../ckeditor/ckeditor/lang/sr-latn.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/sr.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/sv.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/th.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/tr.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/tt.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/ug.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/uk.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/vi.js | 5 + .../includes/ckeditor/ckeditor/lang/zh-cn.js | 5 + htdocs/includes/ckeditor/ckeditor/lang/zh.js | 5 + .../plugins/a11yhelp/dialogs/a11yhelp.js | 2 +- .../dialogs/lang/_translationstatus.txt | 2 +- .../plugins/a11yhelp/dialogs/lang/af.js | 2 +- .../plugins/a11yhelp/dialogs/lang/ar.js | 16 +- .../plugins/a11yhelp/dialogs/lang/az.js | 2 +- .../plugins/a11yhelp/dialogs/lang/bg.js | 6 +- .../plugins/a11yhelp/dialogs/lang/ca.js | 2 +- .../plugins/a11yhelp/dialogs/lang/cs.js | 6 +- .../plugins/a11yhelp/dialogs/lang/cy.js | 2 +- .../plugins/a11yhelp/dialogs/lang/da.js | 12 +- .../plugins/a11yhelp/dialogs/lang/de-ch.js | 19 +- .../plugins/a11yhelp/dialogs/lang/de.js | 2 +- .../plugins/a11yhelp/dialogs/lang/el.js | 2 +- .../plugins/a11yhelp/dialogs/lang/en-au.js | 16 +- .../plugins/a11yhelp/dialogs/lang/en-gb.js | 16 +- .../plugins/a11yhelp/dialogs/lang/en.js | 16 +- .../plugins/a11yhelp/dialogs/lang/eo.js | 2 +- .../plugins/a11yhelp/dialogs/lang/es-mx.js | 2 +- .../plugins/a11yhelp/dialogs/lang/es.js | 2 +- .../plugins/a11yhelp/dialogs/lang/et.js | 2 +- .../plugins/a11yhelp/dialogs/lang/eu.js | 2 +- .../plugins/a11yhelp/dialogs/lang/fa.js | 6 +- .../plugins/a11yhelp/dialogs/lang/fi.js | 2 +- .../plugins/a11yhelp/dialogs/lang/fo.js | 16 +- .../plugins/a11yhelp/dialogs/lang/fr-ca.js | 2 +- .../plugins/a11yhelp/dialogs/lang/fr.js | 2 +- .../plugins/a11yhelp/dialogs/lang/gl.js | 2 +- .../plugins/a11yhelp/dialogs/lang/gu.js | 16 +- .../plugins/a11yhelp/dialogs/lang/he.js | 2 +- .../plugins/a11yhelp/dialogs/lang/hi.js | 16 +- .../plugins/a11yhelp/dialogs/lang/hr.js | 2 +- .../plugins/a11yhelp/dialogs/lang/hu.js | 2 +- .../plugins/a11yhelp/dialogs/lang/id.js | 2 +- .../plugins/a11yhelp/dialogs/lang/it.js | 2 +- .../plugins/a11yhelp/dialogs/lang/ja.js | 2 +- .../plugins/a11yhelp/dialogs/lang/km.js | 16 +- .../plugins/a11yhelp/dialogs/lang/ko.js | 2 +- .../plugins/a11yhelp/dialogs/lang/ku.js | 2 +- .../plugins/a11yhelp/dialogs/lang/lt.js | 16 +- .../plugins/a11yhelp/dialogs/lang/lv.js | 4 +- .../plugins/a11yhelp/dialogs/lang/mk.js | 6 +- .../plugins/a11yhelp/dialogs/lang/mn.js | 16 +- .../plugins/a11yhelp/dialogs/lang/nb.js | 2 +- .../plugins/a11yhelp/dialogs/lang/nl.js | 2 +- .../plugins/a11yhelp/dialogs/lang/no.js | 2 +- .../plugins/a11yhelp/dialogs/lang/oc.js | 2 +- .../plugins/a11yhelp/dialogs/lang/pl.js | 2 +- .../plugins/a11yhelp/dialogs/lang/pt-br.js | 2 +- .../plugins/a11yhelp/dialogs/lang/pt.js | 2 +- .../plugins/a11yhelp/dialogs/lang/ro.js | 2 +- .../plugins/a11yhelp/dialogs/lang/ru.js | 2 +- .../plugins/a11yhelp/dialogs/lang/si.js | 2 +- .../plugins/a11yhelp/dialogs/lang/sk.js | 4 +- .../plugins/a11yhelp/dialogs/lang/sl.js | 2 +- .../plugins/a11yhelp/dialogs/lang/sq.js | 2 +- .../plugins/a11yhelp/dialogs/lang/sr-latn.js | 2 +- .../plugins/a11yhelp/dialogs/lang/sr.js | 2 +- .../plugins/a11yhelp/dialogs/lang/sv.js | 2 +- .../plugins/a11yhelp/dialogs/lang/th.js | 16 +- .../plugins/a11yhelp/dialogs/lang/tr.js | 2 +- .../plugins/a11yhelp/dialogs/lang/tt.js | 16 +- .../plugins/a11yhelp/dialogs/lang/ug.js | 2 +- .../plugins/a11yhelp/dialogs/lang/uk.js | 2 +- .../plugins/a11yhelp/dialogs/lang/vi.js | 2 +- .../plugins/a11yhelp/dialogs/lang/zh-cn.js | 2 +- .../plugins/a11yhelp/dialogs/lang/zh.js | 2 +- .../ckeditor/plugins/about/dialogs/about.js | 4 +- .../plugins/clipboard/dialogs/paste.js | 2 +- .../colordialog/dialogs/colordialog.css | 2 +- .../colordialog/dialogs/colordialog.js | 2 +- .../copyformatting/styles/copyformatting.css | 2 +- .../plugins/dialog/dialogDefinition.js | 2 +- .../ckeditor/plugins/dialog/styles/dialog.css | 18 + .../ckeditor/plugins/div/dialogs/div.js | 17 +- .../ckeditor/plugins/exportpdf/CHANGELOG.md | 72 + .../ckeditor/plugins/exportpdf/LICENSE.md | 18 + .../ckeditor/plugins/exportpdf/README.md | 102 + .../plugins/exportpdf/plugindefinition.js | 1 + .../plugins/exportpdf/tests/_helpers/tools.js | 5 + .../plugins/exportpdf/tests/authentication.js | 6 + .../plugins/exportpdf/tests/exportpdf.js | 10 + .../tests/manual/configfilename.html | 27 + .../exportpdf/tests/manual/configfilename.md | 46 + .../exportpdf/tests/manual/emptyeditor.html | 18 + .../exportpdf/tests/manual/emptyeditor.md | 34 + .../exportpdf/tests/manual/integration.html | 148 ++ .../exportpdf/tests/manual/integration.md | 12 + .../tests/manual/integrations/easyimage.html | 27 + .../tests/manual/integrations/easyimage.md | 26 + .../exportpdf/tests/manual/notifications.html | 19 + .../exportpdf/tests/manual/notifications.md | 36 + .../tests/manual/notificationsasync.html | 45 + .../tests/manual/notificationsasync.md | 27 + .../exportpdf/tests/manual/paperformat.html | 29 + .../exportpdf/tests/manual/paperformat.md | 18 + .../exportpdf/tests/manual/readonly.html | 18 + .../exportpdf/tests/manual/readonly.md | 28 + .../exportpdf/tests/manual/stylesheets.html | 36 + .../exportpdf/tests/manual/stylesheets.md | 19 + .../exportpdf/tests/manual/tokenfetching.html | 23 + .../exportpdf/tests/manual/tokenfetching.md | 19 + .../tests/manual/tokentwoeditorscorrect.html | 38 + .../tests/manual/tokentwoeditorscorrect.md | 14 + .../tests/manual/tokentwoeditorswrong.html | 38 + .../tests/manual/tokentwoeditorswrong.md | 14 + .../tests/manual/tokenwithouturl.html | 19 + .../exportpdf/tests/manual/tokenwithouturl.md | 31 + .../exportpdf/tests/manual/wrongendpoint.html | 21 + .../exportpdf/tests/manual/wrongendpoint.md | 34 + .../plugins/exportpdf/tests/notification.js | 4 + .../plugins/exportpdf/tests/resourcespaths.js | 9 + .../plugins/exportpdf/tests/statistics.js | 3 + .../plugins/exportpdf/tests/stylesheets.js | 18 + .../ckeditor/plugins/find/dialogs/find.js | 44 +- .../ckeditor/plugins/forms/dialogs/button.js | 10 +- .../plugins/forms/dialogs/checkbox.js | 6 +- .../ckeditor/plugins/forms/dialogs/form.js | 4 +- .../plugins/forms/dialogs/hiddenfield.js | 8 +- .../ckeditor/plugins/forms/dialogs/radio.js | 4 +- .../ckeditor/plugins/forms/dialogs/select.js | 32 +- .../plugins/forms/dialogs/textarea.js | 11 +- .../plugins/forms/dialogs/textfield.js | 16 +- .../ckeditor/ckeditor/plugins/icons.png | Bin 12453 -> 12237 bytes .../ckeditor/ckeditor/plugins/icons_hidpi.png | Bin 41377 -> 38309 bytes .../ckeditor/plugins/iframe/dialogs/iframe.js | 15 +- .../ckeditor/plugins/image/dialogs/image.js | 52 +- .../ckeditor/plugins/link/dialogs/anchor.js | 10 +- .../ckeditor/plugins/link/dialogs/link.js | 52 +- .../plugins/liststyle/dialogs/liststyle.js | 14 +- .../plugins/pastefromgdocs/filter/default.js | 8 + .../pastefromlibreoffice/filter/default.js | 11 + .../plugins/pastefromword/filter/default.js | 94 +- .../plugins/pastetools/filter/common.js | 24 + .../plugins/pastetools/filter/image.js | 12 + .../plugins/preview/images/pagebreak.gif | Bin 0 -> 99 bytes .../plugins/preview/styles/screen.css | 10 + .../ckeditor/plugins/scayt/CHANGELOG.md | 18 +- .../ckeditor/plugins/scayt/LICENSE.md | 4 +- .../ckeditor/ckeditor/plugins/scayt/README.md | 14 +- .../ckeditor/plugins/smiley/dialogs/smiley.js | 2 +- .../dialogs/lang/_translationstatus.txt | 2 +- .../plugins/specialchar/dialogs/lang/af.js | 2 +- .../plugins/specialchar/dialogs/lang/ar.js | 2 +- .../plugins/specialchar/dialogs/lang/az.js | 2 +- .../plugins/specialchar/dialogs/lang/bg.js | 2 +- .../plugins/specialchar/dialogs/lang/ca.js | 2 +- .../plugins/specialchar/dialogs/lang/cs.js | 2 +- .../plugins/specialchar/dialogs/lang/cy.js | 2 +- .../plugins/specialchar/dialogs/lang/da.js | 6 +- .../plugins/specialchar/dialogs/lang/de-ch.js | 12 +- .../plugins/specialchar/dialogs/lang/de.js | 2 +- .../plugins/specialchar/dialogs/lang/el.js | 2 +- .../plugins/specialchar/dialogs/lang/en-au.js | 2 +- .../plugins/specialchar/dialogs/lang/en-ca.js | 2 +- .../plugins/specialchar/dialogs/lang/en-gb.js | 2 +- .../plugins/specialchar/dialogs/lang/en.js | 2 +- .../plugins/specialchar/dialogs/lang/eo.js | 2 +- .../plugins/specialchar/dialogs/lang/es-mx.js | 2 +- .../plugins/specialchar/dialogs/lang/es.js | 2 +- .../plugins/specialchar/dialogs/lang/et.js | 2 +- .../plugins/specialchar/dialogs/lang/eu.js | 2 +- .../plugins/specialchar/dialogs/lang/fa.js | 2 +- .../plugins/specialchar/dialogs/lang/fi.js | 2 +- .../plugins/specialchar/dialogs/lang/fr-ca.js | 2 +- .../plugins/specialchar/dialogs/lang/fr.js | 2 +- .../plugins/specialchar/dialogs/lang/gl.js | 2 +- .../plugins/specialchar/dialogs/lang/he.js | 2 +- .../plugins/specialchar/dialogs/lang/hr.js | 2 +- .../plugins/specialchar/dialogs/lang/hu.js | 2 +- .../plugins/specialchar/dialogs/lang/id.js | 20 +- .../plugins/specialchar/dialogs/lang/it.js | 2 +- .../plugins/specialchar/dialogs/lang/ja.js | 2 +- .../plugins/specialchar/dialogs/lang/km.js | 2 +- .../plugins/specialchar/dialogs/lang/ko.js | 2 +- .../plugins/specialchar/dialogs/lang/ku.js | 2 +- .../plugins/specialchar/dialogs/lang/lt.js | 2 +- .../plugins/specialchar/dialogs/lang/lv.js | 2 +- .../plugins/specialchar/dialogs/lang/nb.js | 2 +- .../plugins/specialchar/dialogs/lang/nl.js | 2 +- .../plugins/specialchar/dialogs/lang/no.js | 2 +- .../plugins/specialchar/dialogs/lang/oc.js | 2 +- .../plugins/specialchar/dialogs/lang/pl.js | 2 +- .../plugins/specialchar/dialogs/lang/pt-br.js | 2 +- .../plugins/specialchar/dialogs/lang/pt.js | 2 +- .../plugins/specialchar/dialogs/lang/ro.js | 2 +- .../plugins/specialchar/dialogs/lang/ru.js | 2 +- .../plugins/specialchar/dialogs/lang/si.js | 2 +- .../plugins/specialchar/dialogs/lang/sk.js | 2 +- .../plugins/specialchar/dialogs/lang/sl.js | 2 +- .../plugins/specialchar/dialogs/lang/sq.js | 2 +- .../specialchar/dialogs/lang/sr-latn.js | 2 +- .../plugins/specialchar/dialogs/lang/sr.js | 2 +- .../plugins/specialchar/dialogs/lang/sv.js | 2 +- .../plugins/specialchar/dialogs/lang/th.js | 2 +- .../plugins/specialchar/dialogs/lang/tr.js | 2 +- .../plugins/specialchar/dialogs/lang/tt.js | 2 +- .../plugins/specialchar/dialogs/lang/ug.js | 2 +- .../plugins/specialchar/dialogs/lang/uk.js | 2 +- .../plugins/specialchar/dialogs/lang/vi.js | 2 +- .../plugins/specialchar/dialogs/lang/zh-cn.js | 2 +- .../plugins/specialchar/dialogs/lang/zh.js | 2 +- .../specialchar/dialogs/specialchar.js | 22 +- .../ckeditor/plugins/table/dialogs/table.js | 37 +- .../plugins/tabletools/dialogs/tableCell.js | 30 +- .../plugins/templates/dialogs/templates.css | 2 +- .../plugins/templates/dialogs/templates.js | 15 +- .../plugins/templates/templatedefinition.js | 4 + .../plugins/templates/templates/default.js | 2 +- .../ckeditor/skins/moono-lisa/dialog.css | 4 +- .../ckeditor/skins/moono-lisa/dialog_ie.css | 4 +- .../ckeditor/skins/moono-lisa/dialog_ie8.css | 4 +- .../skins/moono-lisa/dialog_iequirks.css | 4 +- .../ckeditor/skins/moono-lisa/editor.css | 4 +- .../skins/moono-lisa/editor_gecko.css | 4 +- .../ckeditor/skins/moono-lisa/editor_ie.css | 4 +- .../ckeditor/skins/moono-lisa/editor_ie8.css | 4 +- .../skins/moono-lisa/editor_iequirks.css | 4 +- .../ckeditor/skins/moono-lisa/icons.png | Bin 12453 -> 12237 bytes .../ckeditor/skins/moono-lisa/icons_hidpi.png | Bin 41377 -> 38309 bytes .../ckeditor/skins/moono-lisa/readme.md | 2 +- htdocs/includes/ckeditor/ckeditor/styles.js | 2 +- htdocs/theme/eldy/ckeditor/config.js | 2 +- htdocs/theme/md/ckeditor/config.js | 2 +- htdocs/website/index.php | 2 +- 309 files changed, 3980 insertions(+), 1841 deletions(-) create mode 100644 htdocs/includes/ckeditor/ckeditor/SECURITY.md create mode 100644 htdocs/includes/ckeditor/ckeditor/bender-runner.config.json create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/af.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/ar.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/az.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/bg.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/bn.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/bs.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/ca.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/cs.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/cy.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/da.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/de-ch.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/de.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/el.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/en-au.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/en-ca.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/en-gb.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/eo.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/es-mx.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/et.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/eu.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/fa.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/fi.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/fo.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/fr-ca.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/gl.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/gu.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/he.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/hi.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/hr.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/hu.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/id.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/is.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/it.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/ja.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/ka.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/km.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/ko.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/ku.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/lt.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/lv.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/mk.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/mn.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/ms.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/nb.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/nl.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/no.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/oc.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/pl.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/pt-br.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/pt.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/ro.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/ru.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/si.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/sk.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/sl.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/sq.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/sr-latn.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/sr.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/sv.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/th.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/tr.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/tt.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/ug.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/uk.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/vi.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/zh-cn.js create mode 100644 htdocs/includes/ckeditor/ckeditor/lang/zh.js create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/dialog/styles/dialog.css create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/CHANGELOG.md create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/LICENSE.md create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/README.md create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/plugindefinition.js create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/_helpers/tools.js create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/authentication.js create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/exportpdf.js create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/configfilename.html create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/configfilename.md create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/emptyeditor.html create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/emptyeditor.md create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/integration.html create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/integration.md create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/integrations/easyimage.html create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/integrations/easyimage.md create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/notifications.html create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/notifications.md create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/notificationsasync.html create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/notificationsasync.md create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/paperformat.html create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/paperformat.md create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/readonly.html create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/readonly.md create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/stylesheets.html create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/stylesheets.md create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokenfetching.html create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokenfetching.md create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokentwoeditorscorrect.html create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokentwoeditorscorrect.md create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokentwoeditorswrong.html create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokentwoeditorswrong.md create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokenwithouturl.html create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokenwithouturl.md create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/wrongendpoint.html create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/wrongendpoint.md create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/notification.js create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/resourcespaths.js create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/statistics.js create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/stylesheets.js create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/pastefromgdocs/filter/default.js create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/pastefromlibreoffice/filter/default.js create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/pastetools/filter/common.js create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/pastetools/filter/image.js create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/preview/images/pagebreak.gif create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/preview/styles/screen.css create mode 100644 htdocs/includes/ckeditor/ckeditor/plugins/templates/templatedefinition.js diff --git a/COPYRIGHT b/COPYRIGHT index a2101a1db0a..de293e3867e 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -24,7 +24,6 @@ Component Version License GPL Compatible ------------------------------------------------------------------------------------- PHP libraries: ADOdb-Date 0.36 Modified BSD License Yes Date convertion (not into rpm package) -CKEditor 4.12.1 LGPL-2.1+ Yes Editor WYSIWYG EvalMath 1.0 BSD Yes Safe math expressions evaluation Escpos-php 2.2 MIT License Yes Thermal receipt printer library, for use with ESC/POS compatible printers GeoIP2 0.2.0 Apache License 2.0 Yes Lib to make geoip convert @@ -50,6 +49,7 @@ TCPDI 1.0.0 LGPL-3+ / Apache 2.0 Yes JS libraries: Ace 1.4.14 BSD Yes JS library to get code syntaxique coloration in a textarea. ChartJS 3.7.1 MIT License Yes JS library for graph +CKEditor 4.18 LGPL-2.1+ Yes Editor WYSIWYG jQuery 3.6.0 MIT License Yes JS library jQuery UI 1.13.1 GPL and MIT License Yes JS library plugin UI jQuery select2 4.0.13 GPL and Apache License Yes JS library plugin for sexier multiselect. Warning: 4.0.6+ create troubles without patching css diff --git a/ChangeLog b/ChangeLog index a458f7eea74..7a815b66dcd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -9,7 +9,7 @@ English Dolibarr ChangeLog For users: --------------- -NEW: PHP 8.0 compatibility +NEW: PHP 8.1 compatibility diff --git a/SECURITY.md b/SECURITY.md index c55d6d26ab0..cd3156bece9 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -6,8 +6,9 @@ This file contains some policies about the security reports on Dolibarr ERP CRM | Version | Supported | | ---------- | ---------------------- | -| <= 14.0.4 | :x: | -| >= 14.0.5+ | :white_check_mark: except CSRF attacks| +| <= 15.0.0 | :x: | +| >= 15.0.1+ | :white_check_mark: except CSRF attacks| +| >= 16.0.0 | :white_check_mark: | | >= develop | :white_check_mark: | ## Reporting a Vulnerability diff --git a/htdocs/core/class/doleditor.class.php b/htdocs/core/class/doleditor.class.php index 23c04a98a81..2be0c36c56c 100644 --- a/htdocs/core/class/doleditor.class.php +++ b/htdocs/core/class/doleditor.class.php @@ -170,6 +170,9 @@ class DolEditor if (empty($conf->global->FCKEDITOR_ENABLE_WSC)) { // spellchecker has end of life december 2021 $pluginstodisable .= ',wsc'; } + if (empty($conf->global->FCKEDITOR_ENABLE_PDF)) { + $pluginstodisable .= ',exportpdf'; + } $scaytautostartup = ''; if (!empty($conf->global->FCKEDITOR_ENABLE_SCAYT_AUTOSTARTUP)) { $scaytautostartup = 'scayt_autoStartup: true,'; @@ -189,14 +192,14 @@ class DolEditor tmpeditor = CKEDITOR.replace(\''.$this->htmlname.'\', { /* property:xxx is same than CKEDITOR.config.property = xxx */ - customConfig : ckeditorConfig, - removePlugins : \''.$pluginstodisable.'\', - readOnly : '.($this->readonly ? 'true' : 'false').', - htmlEncodeOutput :'.$htmlencode_force.', - allowedContent :'.($disallowAnyContent ? 'false' : 'true').', /* Advanced Content Filter (ACF) is own when allowedContent is false */ - extraAllowedContent : \'a[target];div{float,display}\', /* Add the style float and display into div to default other allowed tags */ - disallowedContent : '.($disallowAnyContent ? '\'\'' : '\'\'').', /* Tags that are not allowed */ - fullPage : '.($fullpage ? 'true' : 'false').', /* if true, the html, header and body tags are kept */ + customConfig: ckeditorConfig, + removePlugins: \''.$pluginstodisable.'\', + readOnly: '.($this->readonly ? 'true' : 'false').', + htmlEncodeOutput:'.$htmlencode_force.', + allowedContent:'.($disallowAnyContent ? 'false' : 'true').', /* Advanced Content Filter (ACF) is own when allowedContent is false */ + extraAllowedContent: \'a[target];div{float,display}\', /* Add the style float and display into div to default other allowed tags */ + disallowedContent: '.($disallowAnyContent ? '\'\'' : '\'\'').', /* Tags that are not allowed */ + fullPage: '.($fullpage ? 'true' : 'false').', /* if true, the html, header and body tags are kept */ toolbar: \''.$this->toolbarname.'\', toolbarStartupExpanded: '.($this->toolbarstartexpanded ? 'true' : 'false').', width: '.($this->width ? '\''.$this->width.'\'' : '\'\'').', diff --git a/htdocs/includes/ckeditor/UPGRADE.md b/htdocs/includes/ckeditor/UPGRADE.md index e35dc6cff39..73d46f6eb74 100644 --- a/htdocs/includes/ckeditor/UPGRADE.md +++ b/htdocs/includes/ckeditor/UPGRADE.md @@ -6,4 +6,4 @@ To upgrade ckeditor: - Choose skin mona-lisa - Choose all languages - Download -- Repalce files and remove dir 'samples'. \ No newline at end of file +- Replace files and remove dir 'samples'. \ No newline at end of file diff --git a/htdocs/includes/ckeditor/ckeditor/CHANGES.md b/htdocs/includes/ckeditor/ckeditor/CHANGES.md index 225251b7913..94ecf8517b9 100644 --- a/htdocs/includes/ckeditor/ckeditor/CHANGES.md +++ b/htdocs/includes/ckeditor/ckeditor/CHANGES.md @@ -1,71 +1,495 @@ CKEditor 4 Changelog ==================== +## CKEditor 4.18.0 + +**Security Updates:** + +* Fixed an XSS vulnerability in the core module reported by GitHub Security Lab team member [Kevin Backhouse](https://github.com/kevinbackhouse). + + Issue summary: The vulnerability allowed to inject malformed HTML bypassing content sanitization, which could result in executing a JavaScript code. See [CVE-2022-24728](https://github.com/ckeditor/ckeditor4/security/advisories/GHSA-4fc4-4p5g-6w89) for more details. + +* Fixed a Regular expression Denial of Service (ReDoS) vulnerability in dialog plugin discovered by the CKEditor 4 team during our regular security audit. + + Issue summary: The vulnerability allowed to abuse a dialog input validator regular expression, which could cause a significant performance drop resulting in a browser tab freeze. See [CVE-2022-24729](https://github.com/ckeditor/ckeditor4/security/advisories/GHSA-f6rf-9m92-x2hh) for more details. + +You can read more details in the relevant security advisory and [contact us](security@cksource.com) if you have more questions. + +**An upgrade is highly recommended!** + +**Highlights:** + +[Web Spell Checker](https://webspellchecker.com/) ended support for WebSpellChecker Dialog on December 31st, 2021. This means the plugin is not supported any longer. Therefore, we decided to deprecate and remove the WebSpellChecker Dialog plugin from CKEditor 4 presets. + +We strongly encourage everyone to choose one of the other available spellchecking solutions - [Spell Check As You Type (SCAYT)](https://ckeditor.com/cke4/addon/scayt) or [WProofreader](https://ckeditor.com/cke4/addon/wproofreader). + +Fixed issues: + +* [#5097](https://github.com/ckeditor/ckeditor4/issues/5097): [Chrome] Fixed: Incorrect conversion of points to pixels while using [`CKEDITOR.tools.convertToPx()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-convertToPx). +* [#5044](https://github.com/ckeditor/ckeditor4/issues/5044): Fixed: `select` elements with `multiple` attribute had incorrect styling. Thanks to [John R. D'Orazio](https://github.com/JohnRDOrazio)! + +Other changes: + +* [#5093](https://github.com/ckeditor/ckeditor4/issues/5093): Deprecated and removed WebSpellChecker Dialog from presets. +* [#5127](https://github.com/ckeditor/ckeditor4/issues/5127): Deprecated the [`CKEDITOR.rnd`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#property-rnd) property to discourage using it in a security-sensitive context. +* [#5087](https://github.com/ckeditor/ckeditor4/issues/5087): Improved the jQuery adapter by replacing a deprecated jQuery API with existing counterparts. Thanks to [Fran Boon](https://github.com/flavour)! +* [#5128](https://github.com/ckeditor/ckeditor4/issues/5128): Improved the [Emoji](https://ckeditor.com/cke4/addon/emoji) definitions encoding set by the [`config.emoji_emojiListUrl`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-emoji_emojiListUrl) configuration option. + +## CKEditor 4.17.2 + +Fixed issues: + +* [#4934](https://github.com/ckeditor/ckeditor4/issues/4934): Fixed: Active focus in dialog tabs is not visible in the High Contrast mode. +* [#547](https://github.com/ckeditor/ckeditor4/issues/547): Fixed: Dragging and dropping elements like images within a table is no longer available. +* [#4875](https://github.com/ckeditor/ckeditor4/issues/4875): Fixed: It is not possible to delete multiple selected lists. +* [#4873](https://github.com/ckeditor/ckeditor4/issues/4873): Fixed: Pasting content from MS Word and Outlook with horizontal lines prevents images from being uploaded. +* [#4952](https://github.com/ckeditor/ckeditor4/issues/4952): Fixed: Dragging and dropping images within a table cell appends additional elements. +* [#4761](https://github.com/ckeditor/ckeditor4/issues/4761): Fixed: Some CSS files are missing unique timestamp used to prevent browser to cache static resources between editor releases. +* [#4987](https://github.com/ckeditor/ckeditor4/issues/4987): Fixed: [Find/Replace](https://ckeditor.com/cke4/addon/find) is not recognizing more than one space character. +* [#5061](https://github.com/ckeditor/ckeditor4/issues/5061): Fixed: [Find/Replace](https://ckeditor.com/cke4/addon/find) plugin incorrectly handles multiple whitespace during replacing text. +* [#5004](https://github.com/ckeditor/ckeditor4/issues/5004): Fixed: `MutationObserver` used in [IFrame Editing Area](https://ckeditor.com/cke4/addon/wysiwygarea) plugin causes memory leaks. +* [#4994](https://github.com/ckeditor/ckeditor4/issues/4994): Fixed: [Easy Image](https://ckeditor.com/cke4/addon/easyimage) plugin caused content pasted from Word to turn into an image. + +API changes: + +* [#4918](https://github.com/ckeditor/ckeditor4/issues/4918): Explicitly set the [`config.useComputedState`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-useComputedState) default value to `true`. Thanks to [Shabab Karim](https://github.com/shabab477)! +* [#4761](https://github.com/ckeditor/ckeditor4/issues/4761): The [`CKEDITOR.appendTimestamp()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-appendTimestamp) function was added. +* [#4761](https://github.com/ckeditor/ckeditor4/issues/4761): [`CKEDITOR.dom.document#appendStyleSheet()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_document.html#method-appendStyleSheet) and [`CKEDITOR.tools.buildStyleHtml()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-buildStyleHtml) now use the newly added [`CKEDITOR.appendTimestamp()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-appendTimestamp) function to correctly handle caching of CSS files. + +Other changes: + +* [#5014](https://github.com/ckeditor/ckeditor4/issues/5014): Fixed: Toolbar configurator fails when plugin does not define a toolbar group. Thanks to [SuperPat](https://github.com/SuperPat45)! + +## CKEditor 4.17.1 + +**Highlights:** + +Due to a regression in CKEeditor 4.17.0 version that was only revealed after the release and affected a limited area of operation, CSS assets loaded via relative links started to point into invalid location when loaded from external resources. + +We have therefore decided to immediately release CKEditor 4.17.1 that fixed this problem. If you have already upgraded to v4.17.0, make sure to upgrade to v4.17.1 to avoid this regression. + +Fixed issues: + +* [#4979](https://github.com/ckeditor/ckeditor4/issues/3757): Fixed: Added cache key in [#4761](https://github.com/ckeditor/ckeditor4/issues/4761) started to breaking relative links for external CSS resources. The fix has been reverted and will be corrected in the next editor version. + +## CKEditor 4.17 + +**Security Updates:** + +* Fixed XSS vulnerability in the core module reported by [William Bowling](https://github.com/wbowling). + + Issue summary: The vulnerability allowed to inject malformed comments HTML bypassing content sanitization, which could result in executing JavaScript code. See [CVE-2021-41165](https://github.com/ckeditor/ckeditor4/security/advisories/GHSA-7h26-63m7-qhf2) for more details. + +* Fixed XSS vulnerability in the core module reported by [Maurice Dauer](https://twitter.com/laytonctf). + + Issue summary: The vulnerability allowed to inject malformed HTML bypassing content sanitization, which could result in executing JavaScript code. See [CVE-2021-41164](https://github.com/ckeditor/ckeditor4/security/advisories/GHSA-pvmx-g8h5-cprj) for more details. + +You can read more details in the relevant security advisory and [contact us](security@cksource.com) if you have more questions. + +**An upgrade is highly recommended!** + +**Highlights:** + +Adobe [ended support of Flash Player](https://www.adobe.com/products/flashplayer/end-of-life.html) on December 31, 2020 and blocked Flash content from running in Flash Player beginning January 12, 2021. +We have decided to deprecate and remove the [Flash](https://ckeditor.com/cke4/addon/flash) plugin from CKEditor 4 to help protect users' systems and discourage using insecure software. + +New Features: + +* [#3433](https://github.com/ckeditor/ckeditor4/issues/3433): Marked required fields in dialogs with asterisk (`*`) symbol. +* [#4374](https://github.com/ckeditor/ckeditor4/issues/4374): Integrated the [Maximize](https://ckeditor.com/cke4/addon/maximize) plugin with browser's History API. +* [#4461](https://github.com/ckeditor/ckeditor4/issues/4461): Introduced the possibility to delay editor initialization while it is in a detached DOM element. +* [#4462](https://github.com/ckeditor/ckeditor4/issues/4462): Introduced support for reattaching editor container element to DOM. +* [#4612](https://github.com/ckeditor/ckeditor4/issues/4612): Allow pasting images as Base64 from [clipboard](https://ckeditor.com/cke4/addon/clipboard) in all browsers except IE. +* [#4681](https://github.com/ckeditor/ckeditor4/issues/4681): Allow drag and drop images as Base64. +* [#4750](https://github.com/ckeditor/ckeditor4/issues/4750): Added notification for pasting and dropping unsupported file types into the editor. +* [#4807](https://github.com/ckeditor/ckeditor4/issues/4807): [Chrome] Improved the performance of pasting large images. Thanks to [FlowIT-JIT](https://github.com/FlowIT-JIT)! +* [#4850](https://github.com/ckeditor/ckeditor4/issues/4850): Added support for loading [content templates](https://ckeditor.com/cke4/addon/templates) from HTML files. Thanks to [Fynn96](https://github.com/Fynn96)! +* [#4874](https://github.com/ckeditor/ckeditor4/issues/4874): Added the [`config.clipboard_handleImages`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-clipboard_handleImages) configuration option for enabling and disabling built-in support for pasting and dropping images in the [Clipboard](https://ckeditor.com/cke4/addon/clipboard) plugin. Thanks to [FlowIT-JIT](https://github.com/FlowIT-JIT)! +* [#4026](https://github.com/ckeditor/ckeditor4/issues/4026): [Preview](https://ckeditor.com/cke4/addon/preview) plugin now uses the [`editor#title`](http://localhost/ckeditor4-docs/build/docs/ckeditor4/latest/api/CKEDITOR_editor.html#property-title) property for the title of the preview window. Thanks to [Ely](https://github.com/Elyasin)! +* [#4467](https://github.com/ckeditor/ckeditor4/issues/4467): Added support for inserting content next to a block [widgets](https://ckeditor.com/cke4/addon/widget) using keyboard navigation. Thanks to [bunglegrind](https://github.com/bunglegrind)! + +Fixed Issues: + +* [#3757](https://github.com/ckeditor/ckeditor4/issues/3757): [Firefox] Fixed: images pasted from [clipboard](https://ckeditor.com/cke4/addon/clipboard) are not inserted as Base64-encoded images. +* [#3876](https://github.com/ckeditor/ckeditor4/issues/3876): Fixed: The [Print](https://ckeditor.com/cke4/addon/print) plugin incorrectly prints links and images. +* [#4444](https://github.com/ckeditor/ckeditor4/issues/4444): [Firefox] Fixed: Print preview is incorrectly loaded from CDN. +* [#4596](https://github.com/ckeditor/ckeditor4/issues/4596): Fixed: Incorrect handling of HSL/HSLA values in [`CKEDITOR.tools.color`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_color.html). +* [#4597](https://github.com/ckeditor/ckeditor4/issues/4597): Fixed: Incorrect color conversion for HSL/HSLA values in [`CKEDITOR.tools.color`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_color.html). +* [#4604](https://github.com/ckeditor/ckeditor4/issues/4604): Fixed: [`CKEDITOR.plugins.clipboard.dataTransfer#getTypes()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_clipboard_dataTransfer.html#method-getTypes) returns no types. +* [#4761](https://github.com/ckeditor/ckeditor4/issues/4761): Fixed: Not all resources loaded by the editor respect the cache key. +* [#4783](https://github.com/ckeditor/ckeditor4/issues/4783): Fixed: The [Accessibility Help](https://ckeditor.com/cke4/addon/a11yhelp) dialog does not contain info about focus being moved back to the editing area upon activating a toolbar button. +* [#4790](https://github.com/ckeditor/ckeditor4/issues/4790): Fixed: Printing page is invoked before the printed page is fully loaded. +* [#4874](https://github.com/ckeditor/ckeditor4/issues/4874): Fixed: Built-in support for pasting and dropping images in the [Clipboard](https://ckeditor.com/cke4/addon/clipboard) plugin restricts third party plugins from handling image pasting. Thanks to [FlowIT-JIT](https://github.com/FlowIT-JIT)! +* [#4888](https://github.com/ckeditor/ckeditor4/issues/4888): Fixed: The [`CKEDITOR.dialog#setState()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog.html#method-setState) method throws error when there is no "OK" button in the dialog. +* [#4858](https://github.com/ckeditor/ckeditor4/issues/4858): Fixed: The [Autolink](https://ckeditor.com/cke4/addon/autolink) plugin incorrectly escapes the `&` characters when pasting links into the editor. +* [#4892](https://github.com/ckeditor/ckeditor4/issues/4892): Fixed: Focus of buttons in dialogs is not visible enough in High Contrast mode. +* [#3858](https://github.com/ckeditor/ckeditor4/issues/3858): Fixed: Pasting content in `ENTER_BR` [enter mode](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-enterMode) crashes the editor. +* [#4891](https://github.com/ckeditor/ckeditor4/issues/4891): Fixed: The [Autogrow](https://ckeditor.com/cke4/addon/autogrow) plugin applies fixed width to the editor. + +API Changes: + +* [#4462](https://github.com/ckeditor/ckeditor4/issues/4462): [`CKEDITOR.editor#getSelection()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-getSelection) now returns `null` if the editor is in recreating state. +* [#4583](https://github.com/ckeditor/ckeditor4/issues/4583): Added support for new, comma-less color syntax to [`CKEDITOR.tools.color`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_color.html). +* [#4604](https://github.com/ckeditor/ckeditor4/issues/4604): Added the [`CKEDITOR.plugins.clipboard.dataTransfer#isFileTransfer()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_clipboard_dataTransfer.html#method-isFileTransfer) method. +* [#4790](https://github.com/ckeditor/ckeditor4/issues/4790): Added `callback` parameter to [`CKEDITOR.plugins.preview#createPreview()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_preview.html#method-createPreview) method. + +Other Changes: + +* [#4866](https://github.com/ckeditor/ckeditor4/issues/#4866): The [Flash](https://ckeditor.com/cke4/addon/flash) plugin is now deprecated and has been removed from CKEditor 4. +* [#4901](https://github.com/ckeditor/ckeditor4/issues/4901): Redesigned buttons placement in the [Content templates](https://ckeditor.com/cke4/addon/templates) dialog to make it more UX friendly. Thanks to [Fynn96](https://github.com/Fynn96)! + +## CKEditor 4.16.2 + +**Security Updates:** + +* Fixed XSS vulnerability in the [Clipboard](https://ckeditor.com/cke4/addon/clipboard) plugin reported by [Anton Subbotin](https://github.com/skavans). + + Issue summary: The vulnerability allowed to abuse paste functionality using malformed HTML, which could result in injecting arbitrary HTML into the editor. See [CVE-2021-32809](https://github.com/ckeditor/ckeditor4/security/advisories/GHSA-7889-rm5j-hpgg) for more details. + +* Fixed XSS vulnerability in the [Widget](https://ckeditor.com/cke4/addon/widget) plugin reported by [Anton Subbotin](https://github.com/skavans). + + Issue summary: The vulnerability allowed to abuse undo functionality using malformed [Widget](https://ckeditor.com/cke4/addon/widget) HTML, which could result in executing JavaScript code. See [CVE-2021-32808](https://github.com/ckeditor/ckeditor4/security/advisories/GHSA-6226-h7ff-ch6c) for more details. + +* Fixed XSS vulnerability in the [Fake Objects](https://ckeditor.com/cke4/addon/fakeobjects) plugin reported by [Mika Kulmala](https://github.com/kulmik). + + Issue summary: The vulnerability allowed to inject malformed [Fake Objects](https://ckeditor.com/cke4/addon/fakeobjects) HTML, which could result in executing JavaScript code. See [CVE-2021-37695](https://github.com/ckeditor/ckeditor4/security/advisories/GHSA-m94c-37g6-cjhc) for more details. + +You can read more details in the relevant security advisory and [contact us](security@cksource.com) if you have more questions. + +**An upgrade is highly recommended!** + +Fixed Issues: +* [#4777](https://github.com/ckeditor/ckeditor4/issues/4777): Fixed: HTML comments in widgets not processed correctly. +* [#4733](https://github.com/ckeditor/ckeditor4/pull/4733): Fixed: [Link](https://ckeditor.com/cke4/addon/link) prevent duplicate anchors in text with styles. + * [#4728](https://github.com/ckeditor/ckeditor4/issues/4728): Fixed: Multiple anchors in one line and multi-line with text style. + * [#3863](https://github.com/ckeditor/ckeditor4/issues/3863): Fixed: Multiple anchors in single word with text style. +* [#3819](https://github.com/ckeditor/ckeditor4/issues/3819): [Chrome] Fixed: After removing one of the two consecutive spaces, the ` ` character appears in the editor instead of a space. +* [#4666](https://github.com/ckeditor/ckeditor4/pull/4666): [IE] Introduce CSS.escape polyfill. Thanks to [limingli0707](https://github.com/limingli0707)! + * [#681](https://github.com/ckeditor/ckeditor4/issues/681): Fixed: Table elements (td, tr, th, ..) with an id that starts with dot (.) causes javascript runtime err. + * [#641](https://github.com/ckeditor/ckeditor4/issues/641): Fixed: UploadImage Plugin Widgets not working in IE, Opera, Safari, PhantomJS. +* [#3638](https://github.com/ckeditor/ckeditor4/issues/3638): Fixed: Opening the same dialog twice causes it to become hidden under the dialog's page cover. +* [#4247](https://github.com/ckeditor/ckeditor4/issues/4247): Fixed: [Color Button](https://ckeditor.com/cke4/addon/colorbutton)'s incorrect rendering on the first opening. +* [#4555](https://github.com/ckeditor/ckeditor4/issues/4555): Fixed: [Font](https://ckeditor.com/cke4/addon/font) styles with attributes are not applied correctly when used multiple times over the same selection. +* [#4782](https://github.com/ckeditor/ckeditor4/issues/4782): [Firefox] Fixed: `TypeError` is thrown when switching to Source View and back while [Autocomplete](https://ckeditor.com/cke4/addon/autocomplete) plugin is enabled. + +## CKEditor 4.16.1 + +Fixed Issues: +* [#4617](https://github.com/ckeditor/ckeditor4/issues/4617): Fixed: [Autocomplete](https://ckeditor.com/cke4/addon/autocomplete) is not accessible in inline editors. +* [#4493](https://github.com/ckeditor/ckeditor4/issues/4493): Fixed: The [drop-down](https://ckeditor.com/cke4/addon/richcombo) label does not reflect the current value of the drop-down. +* [#1572](https://github.com/ckeditor/ckeditor4/issues/1572): Fixed: A paragraph before or after a [widget](https://ckeditor.com/cke4/addon/widget) cannot be removed. Thanks to [bunglegrind](https://github.com/bunglegrind)! +* [#4301](https://github.com/ckeditor/ckeditor4/issues/4301): Fixed: Pasted content is overwritten when pasted in an initially empty editor with the [`div` Enter mode](https://ckeditor.com/docs/ckeditor4/latest/features/enterkey.html). +* [#4351](https://github.com/ckeditor/ckeditor4/issues/4351): Fixed: Incorrect values for RGBA/HSLA colors in [Color Dialog](https://ckeditor.com/cke4/addon/colordialog). +* [#4509](https://github.com/ckeditor/ckeditor4/issues/4509): Fixed: Incorrect handling of drag & drop inside [widgets](https://ckeditor.com/cke4/addon/widget) and nested editables. +* [#4611](https://github.com/ckeditor/ckeditor4/issues/4611): [Android, iOS] Fixed: Incorrect hover styles for buttons in the toolbar on mobile devices. +* [#4652](https://github.com/ckeditor/ckeditor4/issues/4652): Fixed: [Event data](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_eventInfo.html) set to `false` is treated as an event cancellation. +* [#4659](https://github.com/ckeditor/ckeditor4/issues/4659): Fixed: [`CKEDITOR.htmlParser`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_htmlParser.html) does not treat `--!>` as a comment end tag correctly. + +## CKEditor 4.16 + +**Security Updates:** + +* Fixed ReDoS vulnerability in the [Autolink](https://ckeditor.com/cke4/addon/autolink) plugin. + + Issue summary: It was possible to execute a ReDoS-type attack inside CKEditor 4 by persuading a victim to paste a specially crafted URL-like text into the editor and press Enter or Space. + +* Fixed ReDoS vulnerability in the [Advanced Tab for Dialogs](https://ckeditor.com/cke4/addon/dialogadvtab) plugin. + + Issue summary: It was possible to execute a ReDoS-type attack inside CKEditor 4 by persuading a victim to paste a specially crafted text into the Styles dialog. + +**An upgrade is highly recommended!** + +New Features: + +* [#2800](https://github.com/ckeditor/ckeditor4/issues/2800): Unsupported image formats are now gracefully handled by the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin on paste, additionally showing descriptive error messages. +* [#2800](https://github.com/ckeditor/ckeditor4/issues/2800): Unsupported image formats are now gracefully handled by the [Paste from LibreOffice](https://ckeditor.com/cke4/addon/pastefromlibreoffice) plugin on paste, additionally showing descriptive error messages. +* [#3582](https://github.com/ckeditor/ckeditor4/issues/3582): Introduced smart positioning of the [Autocomplete](https://ckeditor.com/cke4/addon/autocomplete) panel used by the [Mentions](https://ckeditor.com/cke4/addon/mentions) and [Emoji](https://ckeditor.com/cke4/addon/emoji) plugins. The panel will now be additionally positioned related to the browser viewport to be always fully visible. +* [#4388](https://github.com/ckeditor/ckeditor4/issues/4388): Added the option to remove an iframe created with the [IFrame Dialog](https://ckeditor.com/cke4/addon/iframe) plugin from the sequential keyboard navigation using the `tabindex` attribute. Thanks to [Timo Kirkkala](https://github.com/kirkkala)! + +Fixed Issues: + +* [#1134](https://github.com/ckeditor/ckeditor4/issues/1134): [Safari] Fixed: [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) does not embed images. +* [#2800](https://github.com/ckeditor/ckeditor4/issues/2800): Fixed: No images are imported from Microsoft Word when the content is pasted via the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin if there is at least one image of unsupported format. +* [#4379](https://github.com/ckeditor/ckeditor4/issues/4379): [Edge] Fixed: Incorrect detection of the [high contrast mode](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_a11y.html#high-contrast-mode). +* [#4422](https://github.com/ckeditor/ckeditor4/issues/4422): Fixed: Missing space between the button name and the keyboard shortcut inside the button label in the [high contrast mode](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_a11y.html#high-contrast-mode). +* [#2208](https://github.com/ckeditor/ckeditor4/issues/2208): [IE] Fixed: The [Autolink](https://ckeditor.com/cke4/addon/autolink) plugin duplicates the native browser implementation. +* [#1824](https://github.com/ckeditor/ckeditor4/issues/1824): Fixed: The [Autolink](https://ckeditor.com/cke4/addon/autolink) plugin should require the [Link](https://ckeditor.com/cke4/addon/link) plugin. +* [#4253](https://github.com/ckeditor/ckeditor4/issues/4253): Fixed: The [Editor Placeholder](https://ckeditor.com/cke4/addon/editorplaceholder) plugin throws an error during the editor initialization with [`config.fullPage`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-fullPage) enabled when there is no `` tag in the editor content. +* [#4372](https://github.com/ckeditor/ckeditor4/issues/4372): Fixed: The [Autogrow](https://ckeditor.com/cke4/addon/autogrow) plugin changes the editor's width when used with an absolute [`config.width`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-width) value. + +API Changes: + +* [#4358](https://github.com/ckeditor/ckeditor4/issues/4358): Introduced the [`CKEDITOR.tools.color`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_color.html) class which adds colors validation and methods for converting colors between various formats: named colors, HEX, RGB, RGBA, HSL and HSLA. +* [#3782](https://github.com/ckeditor/ckeditor4/issues/3782): Moved the [`CKEDITOR.plugins.pastetools.filters.word.images`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_pastetools_filters_word_images.html) filters to the [`CKEDITOR.plugins.pastetools.filters.image`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_pastetools_filters_image.html) namespace. +* [#4297](https://github.com/ckeditor/ckeditor4/issues/4297): All [`CKEDITOR.plugins.pastetools.filters`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_pastetools_filters.html) are now available under the [`CKEDITOR.pasteTools`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#property-pasteTools) alias. +* [#4394](https://github.com/ckeditor/ckeditor4/issues/4394): Introduced [`CKEDITOR.ajax`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ajax.html) specialized loading methods for loading binary ([`CKEDITOR.ajax.loadBinary()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ajax.html#method-loadBinary)) and text ([`CKEDITOR.ajax.loadText()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ajax.html#method-loadText)) data. + +Other Changes: + +* The [WebSpellChecker](https://ckeditor.com/cke4/addon/wsc) (WSC) plugin is now disabled by default in [Standard and Full presets](https://ckeditor.com/cke4/presets). It can be enabled via [`extraPlugins`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-extraPlugins) configuration option. + +## CKEditor 4.15.1 + +**Security Updates:** + +* Fixed XSS vulnerability in the [Color History feature](https://ckeditor.com/docs/ckeditor4/latest/features/colorbutton.html#color-history) reported by [Mark Wade](https://github.com/mark-wade). + + Issue summary: It was possible to execute an XSS-type attack inside CKEditor 4 by persuading a victim to paste a specially crafted HTML code into the [Color Button](https://ckeditor.com/cke4/addon/colorbutton) dialog. + +**An upgrade is highly recommended!** + +Fixed Issues: + +* [#4293](https://github.com/ckeditor/ckeditor4/issues/4293): Fixed: The [`CKEDITOR.inlineAll()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-inlineAll) method tries to initialize inline editor also on elements with an editor already attached to them. +* [#3961](https://github.com/ckeditor/ckeditor4/issues/3961): Fixed: The [Table Resize](https://ckeditor.com/cke4/addon/tableresize) plugin prevents editing of merged cells. +* [#3649](https://github.com/ckeditor/ckeditor4/issues/3649): Fixed: Applying a [block format](https://ckeditor.com/docs/ckeditor4/latest/features/format.html) should remove existing block styles. +* [#4282](https://github.com/ckeditor/ckeditor4/issues/4282): Fixed: The [script loader](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_scriptLoader.html) does not execute callback for scripts already loaded when called for the second time. Thanks to [Alexander Korotkevich](https://github.com/aldoom)! +* [#4273](https://github.com/ckeditor/ckeditor4/issues/4273): Fixed: A memory leak in the [`CKEDITOR.domReady()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-domReady) method connected with not removing `load` event listeners. Thanks to [rohit1](https://github.com/rohit1)! +* [#1330](https://github.com/ckeditor/ckeditor4/issues/1330): Fixed: Incomplete CSS margin parsing if an `auto` or `0` value is used. +* [#4286](https://github.com/ckeditor/ckeditor4/issues/4286): Fixed: The [Auto Grow](https://ckeditor.com/cke4/addon/autogrow) plugin causes the editor width to be set to `0` on editor resize. +* [#848](https://github.com/ckeditor/ckeditor4/issues/848): Fixed: Arabic text not being "bound" correctly when pasting. Thanks to [Thomas Hunkapiller](https://github.com/devoidfury) and [J. Ivan Duarte Rodríguez](https://github.com/jidrone-mbm)! + +API Changes: + +* [#3649](https://github.com/ckeditor/ckeditor4/issues/3649): Added a new [`stylesRemove`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#event-stylesRemove) editor event. + +Other Changes: + +* [#4262](https://github.com/ckeditor/ckeditor4/issues/4262): Removed the global reference to the `stylesLoaded` variable. Thanks to [Levi Carter](https://github.com/swiftMessenger)! +* Updated the [Export to PDF](https://ckeditor.com/cke4/addon/exportpdf) plugin to `1.0.1` version: + * Improved external CSS support for [classic editor](https://ckeditor.com/docs/ckeditor4/latest/examples/classic.html) by handling exceptions and displaying convenient [error messages](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_errors.html#exportpdf-stylesheets-incaccessible). + +## CKEditor 4.15 + +New features: + +* [#3940](https://github.com/ckeditor/ckeditor4/issues/3940): Introduced the `colorName` property for customizing foreground and background styles in the [Color Button](https://ckeditor.com/cke4/addon/colorbutton) plugin via the [`config.colorButton_foreStyle`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-colorButton_foreStyle) and [`config.colorButton_backStyle`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-colorButton_backStyle) configuration options. +* [#3793](https://github.com/ckeditor/ckeditor4/issues/3793): Introduced the [Editor Placeholder](https://ckeditor.com/cke4/addon/editorplaceholder) plugin. +* [#1795](https://github.com/ckeditor/ckeditor4/issues/1795): The colors picked from the [Color Dialog](https://ckeditor.com/cke4/addon/colordialog) are now stored in the [Color Button](https://ckeditor.com/cke4/addon/colorbutton) palette and can be reused easily. +* [#3783](https://github.com/ckeditor/ckeditor4/issues/3783): The colors used in the document are now displayed as a part of the [Color Button](https://ckeditor.com/cke4/addon/colorbutton) palette. + +Fixed Issues: + +* [#4060](https://github.com/ckeditor/ckeditor4/issues/4060): Fixed: The content inside a [widget](https://ckeditor.com/cke4/addon/widget) nested editable is escaped twice. +* [#4183](https://github.com/ckeditor/ckeditor4/issues/4183): [Safari] Fixed: Incorrect image dimensions when using the [Easy Image](https://ckeditor.com/cke4/addon/easyimage) plugin alongside the [IFrame Editing Area](https://ckeditor.com/cke4/addon/wysiwygarea) plugin. +* [#3693](https://github.com/ckeditor/ckeditor4/issues/3693): Fixed: Incorrect default values for several [Color Button](https://ckeditor.com/cke4/addon/colorbutton) configuration variables in the API documentation. +* [#3795](https://github.com/ckeditor/ckeditor4/issues/3795): Fixed: Setting the [`config.dataIndentationChars`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-dataIndentationChars) configuration option to an empty string is ignored and replaced by a tab (`\t`) character. Thanks to [Thomas Grinderslev](https://github.com/Znegl)! +* [#4107](https://github.com/ckeditor/ckeditor4/issues/4107): Fixed: Multiple [Autocomplete](https://ckeditor.com/cke4/addon/autocomplete) instances cause keyboard navigation issues. +* [#4041](https://github.com/ckeditor/ckeditor4/issues/4041): Fixed: The[`selection.scrollIntoView`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_selection.html#method-scrollIntoView) method throws an error when the editor selection is not set. +* [#3361](https://github.com/ckeditor/ckeditor4/issues/3361): Fixed: Loading multiple [custom editor configurations](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-customConfig) is prone to a race condition between these. +* [#4007](https://github.com/ckeditor/ckeditor4/issues/4007): Fixed: Screen readers do not announce the [Rich Combo](https://ckeditor.com/cke4/addon/richcombo) plugin is collapsed or expanded. +* [#4141](https://github.com/ckeditor/ckeditor4/issues/4141): Fixed: The styles are incorrectly applied when there is a ` + +

    Divarea Editor

    +
    + Divarea Editor +
    + +

    Inline Editor

    +
    + Inline Editor +
    + + diff --git a/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/stylesheets.md b/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/stylesheets.md new file mode 100644 index 00000000000..96a3d8725e7 --- /dev/null +++ b/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/stylesheets.md @@ -0,0 +1,19 @@ +@bender-tags: exportpdf, feature, 31 +@bender-ui: collapsed +@bender-include: ../_helpers/tools.js +@bender-ckeditor-plugins: toolbar, basicstyles, notification + +**Note:** This test uses Bootstrap CDN. If something goes wrong, check if the link works correctly first. + +1. Use `Export to PDF` button in the first editor. +1. Open generated file. + + **Expected:** + + Text from editor was converted to a green badge. + + **Unexpected:** + + Content is the same as in the editor. + +1. Repeat the same steps for the second and third editor. diff --git a/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokenfetching.html b/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokenfetching.html new file mode 100644 index 00000000000..60d8205cb13 --- /dev/null +++ b/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokenfetching.html @@ -0,0 +1,23 @@ +
    +

    Foo bar

    +
    + +
    + + diff --git a/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokenfetching.md b/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokenfetching.md new file mode 100644 index 00000000000..de9ba3587c2 --- /dev/null +++ b/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokenfetching.md @@ -0,0 +1,19 @@ +@bender-tags: exportpdf, feature, 77 +@bender-ui: collapsed +@bender-include: ../_helpers/tools.js +@bender-ckeditor-plugins: wysiwygarea, toolbar, basicstyles, notification, format + +Note: You need the Internet connection to run this test. + +1. Click `Export to PDF` toolbar button. +1. Examine the area in the red frame below. + + **Expected:** There is a long token string in the frame. + + **Unexpected:** Frame is empty or says 'undefined'. + +1. Wait for the file to download and open it. + + **Expected:** No information about being created with CKEditor was added. + + **Unexpected:** There is an additional note about CKEditor at the bottom of page. diff --git a/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokentwoeditorscorrect.html b/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokentwoeditorscorrect.html new file mode 100644 index 00000000000..183c3df0c57 --- /dev/null +++ b/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokentwoeditorscorrect.html @@ -0,0 +1,38 @@ +

    Editor 1

    +
    +

    Foo bar

    +
    +
    + +

    Editor 2

    +
    +

    Foo bar

    +
    +
    + + diff --git a/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokentwoeditorscorrect.md b/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokentwoeditorscorrect.md new file mode 100644 index 00000000000..3f6b9bfe548 --- /dev/null +++ b/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokentwoeditorscorrect.md @@ -0,0 +1,14 @@ +@bender-tags: exportpdf, feature, 77 +@bender-ui: collapsed +@bender-include: ../_helpers/tools.js +@bender-ckeditor-plugins: wysiwygarea, toolbar, basicstyles, notification, format + +Note: You need the Internet connection to run this test. + +1. Click `Export to PDF` button in both editors. + +1. Examine the area in the red frames below each editor. + + **Expected:** Content of two boxes are two different long strings. + + **Unexpected:** Values in both boxes are the same or one of them says `undefined`. diff --git a/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokentwoeditorswrong.html b/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokentwoeditorswrong.html new file mode 100644 index 00000000000..f3efc6c03a4 --- /dev/null +++ b/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokentwoeditorswrong.html @@ -0,0 +1,38 @@ +

    Editor 1

    +
    +

    Foo bar

    +
    +
    + +

    Editor 2

    +
    +

    Foo bar

    +
    +
    + + diff --git a/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokentwoeditorswrong.md b/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokentwoeditorswrong.md new file mode 100644 index 00000000000..a718c443f2a --- /dev/null +++ b/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokentwoeditorswrong.md @@ -0,0 +1,14 @@ +@bender-tags: exportpdf, feature, 77 +@bender-ui: collapsed +@bender-include: ../_helpers/tools.js +@bender-ckeditor-plugins: wysiwygarea, toolbar, basicstyles, notification, format + +Note: You need the Internet connection to run this test. + +1. Click `Export to PDF` button in both editors. + +1. Examine the area in the red frames below each editor. + + **Expected:** First box contains token value and the second one `undefined`. + + **Unexpected:** Values in both boxes are the same or none of them is `undefined`. diff --git a/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokenwithouturl.html b/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokenwithouturl.html new file mode 100644 index 00000000000..a7236ab7a59 --- /dev/null +++ b/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokenwithouturl.html @@ -0,0 +1,19 @@ +
    +

    Foo bar

    +
    + +
    + + diff --git a/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokenwithouturl.md b/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokenwithouturl.md new file mode 100644 index 00000000000..2de03aaee32 --- /dev/null +++ b/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/tokenwithouturl.md @@ -0,0 +1,31 @@ +@bender-tags: exportpdf, feature, 77 +@bender-ui: collapsed +@bender-include: ../_helpers/tools.js +@bender-ckeditor-plugins: wysiwygarea, toolbar, basicstyles, notification, format + +Note: You need the Internet connection to run this test. + +1. Open and examine console. + + **Expected:** `exportpdf-no-token-url` warning appeared. + + **Unexpected:** No warning. + +1. Click `Export to PDF` button in the editor. +1. Examine the area in the red frame below. + + **Expected:** Frame has text `undefined`. + + **Unexpected:** There is a long token string in the frame. + +1. Examine console. + + **Expected:** `exportpdf-no-token` warning appeared. + + **Unexpected:** No warning. + +1. Wait for the file to download and open it. + + **Expected:** File contains info about being created with CKEditor. + + **Unexpected:** No copyright info was added. diff --git a/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/wrongendpoint.html b/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/wrongendpoint.html new file mode 100644 index 00000000000..efd801dbc71 --- /dev/null +++ b/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/wrongendpoint.html @@ -0,0 +1,21 @@ +
    +

    Hello world!

    +
    + +
    +

    Hello world!

    +
    + + diff --git a/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/wrongendpoint.md b/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/wrongendpoint.md new file mode 100644 index 00000000000..7231719ad77 --- /dev/null +++ b/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/manual/wrongendpoint.md @@ -0,0 +1,34 @@ +@bender-tags: exportpdf, feature, 4 +@bender-ui: collapsed +@bender-include: ../_helpers/tools.js +@bender-ckeditor-plugins: wysiwygarea, toolbar, notification + +**Note:** Errors in console during this test are allowed. + +1. Click `Export to PDF` button in the first editor. + + **Expected:** + + * Warning notification with `Error occured.` message appeared. + * Button is clickable. + * File wasn't downloaded. + + **Unexpected:** + + * Notification didn't show up. + * Button wasn't reenabled. + * File was downloaded. + +2. Click `Export to PDF` button in the second editor. + + **Expected:** + + * Alert appeared instead of notification. + * Button is clickable. + * File wasn't downloaded. + + **Unexpected:** + + * Notification didn't show up. + * Button wasn't reenabled. + * File was downloaded. diff --git a/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/notification.js b/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/notification.js new file mode 100644 index 00000000000..ebd706d9ede --- /dev/null +++ b/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/notification.js @@ -0,0 +1,4 @@ +(function(){bender.loadExternalPlugin("exportpdf","/apps/plugin/");CKEDITOR.plugins.load("exportpdf",function(){function c(a,b){var c=a._.notificationArea.notifications[0];assert.areSame(b.message,c.message,"Message should be the same.");assert.areSame(b.type,c.type,"Type should be the same.");assert.areSame(b.progress,c.progress,"Progress should be the same.")}bender.editors={successEditor:{config:exportPdfUtils.getDefaultConfig("unit")},errorEditor:{config:exportPdfUtils.getDefaultConfig("unit")}}; +bender.test({setUp:function(){bender.tools.ignoreUnsupportedEnvironment("exportpdf");sinon.stub(CKEDITOR.plugins.exportpdf,"downloadFile")},tearDown:function(){CKEDITOR.plugins.exportpdf.downloadFile.restore()},"test notifications and progress steps are correct in happy path":function(){var a=this.editors.successEditor;this.editorBots.successEditor.setHtmlWithSelection('\x3cp id\x3d"test"\x3eHello, World!\x3c/p\x3e^');a.once("exportPdf",function(){c(a,{message:"Processing PDF document...",type:"progress", +progress:0})});a.once("exportPdf",function(){c(a,{message:"Processing PDF document...",type:"progress",progress:.2})},null,null,16);exportPdfUtils.useXHR(a,function(b){b.addEventListener("progress",function(){c(a,{message:"Processing PDF document...",type:"progress",progress:.8})});b.addEventListener("loadend",function(){c(a,{message:"Document is ready!",type:"success",progress:1})});b.respond(200,{},"")})},"test notifications and progress steps are correct in sad path":function(){var a=this.editors.errorEditor; +this.editorBots.errorEditor.setHtmlWithSelection('\x3cp id\x3d"test"\x3eHello, World!\x3c/p\x3e^');exportPdfUtils.useXHR(a,function(b){var d=sinon.stub(console,"error",function(a){assert.areSame("Validation failed.",a.message,"Message from endpoint is incorrect.");d.restore()});b.addEventListener("loadend",function(){c(a,{message:"Error occurred.",type:"warning"})});b.respond(400,{},'{ "message": "Validation failed." }')})}})})})(); \ No newline at end of file diff --git a/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/resourcespaths.js b/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/resourcespaths.js new file mode 100644 index 00000000000..1964499f080 --- /dev/null +++ b/htdocs/includes/ckeditor/ckeditor/plugins/exportpdf/tests/resourcespaths.js @@ -0,0 +1,9 @@ +(function(){bender.loadExternalPlugin("exportpdf","/apps/plugin/");CKEDITOR.plugins.load("exportpdf",function(){function a(a,d,b){b=exportPdfUtils.getDefaultConfig("unit",b||{});bender.editorBot.create({name:"editor"+Date.now(),config:b},function(b){var c=b.editor;b.setHtmlWithSelection(a);c.once("exportPdf",function(b){assert.areEqual(a,b.data.html)},null,null,10);c.once("exportPdf",function(a){a.cancel();assert.areEqual('\x3cdiv class\x3d"cke_editable cke_contents_ltr"\x3e'+d+"\x3c/div\x3e",a.data.html)}, +null,null,16);c.execCommand("exportPdf")})}function b(a,b){a=a.replace(/\/$/g,"");b&&0b.length){var d=this._.walker.textNode;if(d)a.setStartAfter(d);else return null}else d=b[0],b=b[b.length-1],a.setStart(d.textNode,d.offset),a.setEnd(b.textNode,b.offset+1);return a},updateFromDomRange:function(a){var b=new n(a);this._.cursors=[];do a=b.next(),a.character&&this._.cursors.push(a);while(a.character);this._.rangeLength=this._.cursors.length},setMatched:function(){this._.isMatched=!0},clearMatched:function(){this._.isMatched= -!1},isMatched:function(){return this._.isMatched},highlight:function(){if(!(1>this._.cursors.length)){this._.highlightRange&&this.removeHighlight();var a=this.toDomRange(),b=a.createBookmark();z.applyToRange(a,c);a.moveToBookmark(b);this._.highlightRange=a;b=a.startContainer;b.type!=CKEDITOR.NODE_ELEMENT&&(b=b.getParent());b.scrollIntoView();this.updateFromDomRange(a)}},removeHighlight:function(){if(this._.highlightRange){var a=this._.highlightRange.createBookmark();z.removeFromRange(this._.highlightRange, -c);this._.highlightRange.moveToBookmark(a);this.updateFromDomRange(this._.highlightRange);this._.highlightRange=null}},isReadOnly:function(){return this._.highlightRange?this._.highlightRange.startContainer.isReadOnly():0},moveBack:function(){var a=this._.walker.back(),b=this._.cursors;a.hitMatchBoundary&&(this._.cursors=b=[]);b.unshift(a);b.length>this._.rangeLength&&b.pop();return a},moveNext:function(){var a=this._.walker.next(),b=this._.cursors;a.hitMatchBoundary&&(this._.cursors=b=[]);b.push(a); -b.length>this._.rangeLength&&b.shift();return a},getEndCharacter:function(){var a=this._.cursors;return 1>a.length?null:a[a.length-1].character},getNextCharacterRange:function(a){var b,d;d=this._.cursors;d=(b=d[d.length-1])&&b.textNode?new n(y(b)):this._.walker;return new t(d,a)},getCursors:function(){return this._.cursors}};var A=function(a,b){var d=[-1];b&&(a=a.toLowerCase());for(var c=0;c=b||8192<=b&& -8202>=b||E.test(a)},f={searchRange:null,matchRange:null,find:function(a,b,d,e,D,u){this.matchRange?(this.matchRange.removeHighlight(),this.matchRange=this.matchRange.getNextCharacterRange(a.length)):this.matchRange=new t(new n(this.searchRange),a.length);for(var h=new A(a,!b),k=0,l="%";null!==l;){for(this.matchRange.moveNext();l=this.matchRange.getEndCharacter();){k=h.feedCharacter(l);if(2==k)break;this.matchRange.moveNext().hitMatchBoundary&&h.reset()}if(2==k){if(d){var g=this.matchRange.getCursors(), -p=g[g.length-1],g=g[0],m=c.createRange();m.setStartAt(c.editable(),CKEDITOR.POSITION_AFTER_START);m.setEnd(g.textNode,g.offset);g=m;p=y(p);g.trim();p.trim();g=new n(g,!0);p=new n(p,!0);if(!B(g.back().character)||!B(p.next().character))continue}this.matchRange.setMatched();!1!==D&&this.matchRange.highlight();return!0}}this.matchRange.clearMatched();this.matchRange.removeHighlight();return e&&!u?(this.searchRange=r(1),this.matchRange=null,f.find.apply(this,Array.prototype.slice.call(arguments).concat([!0]))): -!1},replaceCounter:0,replace:function(a,b,d,e,f,u,h){m=1;a=0;a=this.hasMatchOptionsChanged(b,e,f);if(!this.matchRange||!this.matchRange.isMatched()||this.matchRange._.isReplaced||this.matchRange.isReadOnly()||a)a&&this.matchRange&&(this.matchRange.clearMatched(),this.matchRange.removeHighlight(),this.matchRange=null),a=this.find(b,e,f,u,!h);else{this.matchRange.removeHighlight();b=this.matchRange.toDomRange();d=c.document.createText(d);if(!h){var k=c.getSelection();k.selectRanges([b]);c.fire("saveSnapshot")}b.deleteContents(); -b.insertNode(d);h||(k.selectRanges([b]),c.fire("saveSnapshot"));this.matchRange.updateFromDomRange(b);h||this.matchRange.highlight();this.matchRange._.isReplaced=!0;this.replaceCounter++;a=1}m=0;return a},matchOptions:null,hasMatchOptionsChanged:function(a,b,d){a=[a,b,d].join(".");b=this.matchOptions&&this.matchOptions!=a;this.matchOptions=a;return b}},e=c.lang.find;return{title:e.title,resizable:CKEDITOR.DIALOG_RESIZE_NONE,minWidth:350,minHeight:170,buttons:[CKEDITOR.dialog.cancelButton(c,{label:c.lang.common.close})], -contents:[{id:"find",label:e.find,title:e.find,accessKey:"",elements:[{type:"hbox",widths:["230px","90px"],children:[{type:"text",id:"txtFindFind",label:e.findWhat,isChanged:!1,labelLayout:"horizontal",accessKey:"F"},{type:"button",id:"btnFind",align:"left",style:"width:100%",label:e.find,onClick:function(){var a=this.getDialog();f.find(a.getValueOf("find","txtFindFind"),a.getValueOf("find","txtFindCaseChk"),a.getValueOf("find","txtFindWordChk"),a.getValueOf("find","txtFindCyclic"))||alert(e.notFoundMsg)}}]}, -{type:"fieldset",className:"cke_dialog_find_fieldset",label:CKEDITOR.tools.htmlEncode(e.findOptions),style:"margin-top:29px",children:[{type:"vbox",padding:0,children:[{type:"checkbox",id:"txtFindCaseChk",isChanged:!1,label:e.matchCase},{type:"checkbox",id:"txtFindWordChk",isChanged:!1,label:e.matchWord},{type:"checkbox",id:"txtFindCyclic",isChanged:!1,"default":!0,label:e.matchCyclic}]}]}]},{id:"replace",label:e.replace,accessKey:"M",elements:[{type:"hbox",widths:["230px","90px"],children:[{type:"text", -id:"txtFindReplace",label:e.findWhat,isChanged:!1,labelLayout:"horizontal",accessKey:"F"},{type:"button",id:"btnFindReplace",align:"left",style:"width:100%",label:e.replace,onClick:function(){var a=this.getDialog();f.replace(a,a.getValueOf("replace","txtFindReplace"),a.getValueOf("replace","txtReplace"),a.getValueOf("replace","txtReplaceCaseChk"),a.getValueOf("replace","txtReplaceWordChk"),a.getValueOf("replace","txtReplaceCyclic"))||alert(e.notFoundMsg)}}]},{type:"hbox",widths:["230px","90px"],children:[{type:"text", -id:"txtReplace",label:e.replaceWith,isChanged:!1,labelLayout:"horizontal",accessKey:"R"},{type:"button",id:"btnReplaceAll",align:"left",style:"width:100%",label:e.replaceAll,isChanged:!1,onClick:function(){var a=this.getDialog();f.replaceCounter=0;f.searchRange=r(1);f.matchRange&&(f.matchRange.removeHighlight(),f.matchRange=null);for(c.fire("saveSnapshot");f.replace(a,a.getValueOf("replace","txtFindReplace"),a.getValueOf("replace","txtReplace"),a.getValueOf("replace","txtReplaceCaseChk"),a.getValueOf("replace", -"txtReplaceWordChk"),!1,!0););f.replaceCounter?(alert(e.replaceSuccessMsg.replace(/%1/,f.replaceCounter)),c.fire("saveSnapshot")):alert(e.notFoundMsg)}}]},{type:"fieldset",label:CKEDITOR.tools.htmlEncode(e.findOptions),children:[{type:"vbox",padding:0,children:[{type:"checkbox",id:"txtReplaceCaseChk",isChanged:!1,label:e.matchCase},{type:"checkbox",id:"txtReplaceWordChk",isChanged:!1,label:e.matchWord},{type:"checkbox",id:"txtReplaceCyclic",isChanged:!1,"default":!0,label:e.matchCyclic}]}]}]}],onLoad:function(){var a= -this,b,d=0;this.on("hide",function(){d=0});this.on("show",function(){d=1});this.selectPage=CKEDITOR.tools.override(this.selectPage,function(c){return function(e){c.call(a,e);var f=a._.tabs[e],h;h="find"===e?"txtFindWordChk":"txtReplaceWordChk";b=a.getContentElement(e,"find"===e?"txtFindFind":"txtFindReplace");a.getContentElement(e,h);f.initialized||(CKEDITOR.document.getById(b._.inputId),f.initialized=!0);if(d){var k;e="find"===e?1:0;var f=1-e,l,g=q.length;for(l=0;l=b||8192<=b&&8202>=b||F.test(a)}function r(a){var b=d.getSelection().getRanges()[0],c=d.editable();b&&!a?(a=b.clone(),a.collapse(!0)):(a=d.createRange(),a.setStartAt(c,CKEDITOR.POSITION_AFTER_START));a.setEndAt(c,CKEDITOR.POSITION_BEFORE_END);return a}function G(a,b){var c=b.replace(H,function(a){a=a.split("");return CKEDITOR.tools.array.map(a,function(a,b){return 0=== +b%2?" ":a}).join("")});return a.document.createText(c)}var A=new CKEDITOR.style(CKEDITOR.tools.extend({attributes:{"data-cke-highlight":1},fullMatch:1,ignoreReadonly:1,childRule:function(){return 0}},d.config.find_highlight,!0));n.prototype={next:function(){return this.move()},back:function(){return this.move(!0)},move:function(a){var b=this.textNode;if(null===b)return w.call(this);this._.matchBoundary=!1;if(b&&a&&0b.length){var c=this._.walker.textNode;if(c)a.setStartAfter(c);else return null}else c=b[0],b=b[b.length-1],a.setStart(c.textNode,c.offset), +a.setEnd(b.textNode,b.offset+1);return a},updateFromDomRange:function(a){var b=new n(a);this._.cursors=[];do a=b.next(),a.character&&this._.cursors.push(a);while(a.character);this._.rangeLength=this._.cursors.length},setMatched:function(){this._.isMatched=!0},clearMatched:function(){this._.isMatched=!1},isMatched:function(){return this._.isMatched},highlight:function(){if(!(1>this._.cursors.length)){this._.highlightRange&&this.removeHighlight();var a=this.toDomRange(),b=a.createBookmark();A.applyToRange(a, +d);a.moveToBookmark(b);this._.highlightRange=a;b=a.startContainer;b.type!=CKEDITOR.NODE_ELEMENT&&(b=b.getParent());b.scrollIntoView();this.updateFromDomRange(a)}},removeHighlight:function(){if(this._.highlightRange){var a=this._.highlightRange.createBookmark();A.removeFromRange(this._.highlightRange,d);this._.highlightRange.moveToBookmark(a);this.updateFromDomRange(this._.highlightRange);this._.highlightRange=null}},isReadOnly:function(){return this._.highlightRange?this._.highlightRange.startContainer.isReadOnly(): +0},moveBack:function(){var a=this._.walker.back(),b=this._.cursors;a.hitMatchBoundary&&(this._.cursors=b=[]);b.unshift(a);b.length>this._.rangeLength&&b.pop();return a},moveNext:function(){var a=this._.walker.next(),b=this._.cursors;a.hitMatchBoundary&&(this._.cursors=b=[]);b.push(a);b.length>this._.rangeLength&&b.shift();return a},getEndCharacter:function(){var a=this._.cursors;return 1>a.length?null:a[a.length-1].character},getNextCharacterRange:function(a){var b,c;c=this._.cursors;c=(b=c[c.length- +1])&&b.textNode?new n(y(b)):this._.walker;return new u(c,a)},getCursors:function(){return this._.cursors}};var B=function(a,b){var c=[-1];b&&(a=a.toLowerCase());for(var d=0;dCKEDITOR.document.$.documentMode?b.document.createElement('\x3cinput name\x3d"'+CKEDITOR.tools.htmlEncode(a)+'"\x3e'):b.document.createElement("input");a.setAttribute("type","hidden");this.commitContent(a);a=b.createFakeElement(a,"cke_hidden","hiddenfield");this.hiddenField?(a.replace(this.hiddenField),b.getSelection().selectElement(a)):b.insertElement(a);return!0},contents:[{id:"info",label:d.lang.forms.hidden.title,title:d.lang.forms.hidden.title,elements:[{id:"_cke_saved_name", -type:"text",label:d.lang.forms.hidden.name,"default":"",accessKey:"N",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:function(a){this.getValue()?a.setAttribute("name",this.getValue()):a.removeAttribute("name")}},{id:"value",type:"text",label:d.lang.forms.hidden.value,"default":"",accessKey:"V",setup:function(a){this.setValue(a.getAttribute("value")||"")},commit:function(a){this.getValue()?a.setAttribute("value",this.getValue()):a.removeAttribute("value")}}]}]}}); \ No newline at end of file +CKEDITOR.dialog.add("hiddenfield",function(c){return{title:c.lang.forms.hidden.title,hiddenField:null,minWidth:350,minHeight:110,getModel:function(a){return(a=a.getSelection().getSelectedElement())&&a.data("cke-real-element-type")&&"hiddenfield"==a.data("cke-real-element-type")?a:null},onShow:function(){var a=this.getParentEditor(),b=this.getModel(a);b&&(this.setupContent(a.restoreRealElement(b)),a.getSelection().selectElement(b))},onOk:function(){var a=this.getValueOf("info","_cke_saved_name"),b= +this.getParentEditor(),a=CKEDITOR.env.ie&&8>CKEDITOR.document.$.documentMode?b.document.createElement('\x3cinput name\x3d"'+CKEDITOR.tools.htmlEncode(a)+'"\x3e'):b.document.createElement("input");a.setAttribute("type","hidden");this.commitContent(a);var a=b.createFakeElement(a,"cke_hidden","hiddenfield"),c=this.getModel(b);c?(a.replace(c),b.getSelection().selectElement(a)):b.insertElement(a);return!0},contents:[{id:"info",label:c.lang.forms.hidden.title,title:c.lang.forms.hidden.title,elements:[{id:"_cke_saved_name", +type:"text",label:c.lang.forms.hidden.name,"default":"",accessKey:"N",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:function(a){this.getValue()?a.setAttribute("name",this.getValue()):a.removeAttribute("name")}},{id:"value",type:"text",label:c.lang.forms.hidden.value,"default":"",accessKey:"V",setup:function(a){this.setValue(a.getAttribute("value")||"")},commit:function(a){this.getValue()?a.setAttribute("value",this.getValue()):a.removeAttribute("value")}}]}]}}); \ No newline at end of file diff --git a/htdocs/includes/ckeditor/ckeditor/plugins/forms/dialogs/radio.js b/htdocs/includes/ckeditor/ckeditor/plugins/forms/dialogs/radio.js index 2c6ab56087d..a9d2543edfe 100644 --- a/htdocs/includes/ckeditor/ckeditor/plugins/forms/dialogs/radio.js +++ b/htdocs/includes/ckeditor/ckeditor/plugins/forms/dialogs/radio.js @@ -1,8 +1,8 @@ /* - Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. + Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ -CKEDITOR.dialog.add("radio",function(c){return{title:c.lang.forms.checkboxAndRadio.radioTitle,minWidth:350,minHeight:140,onShow:function(){delete this.radioButton;var a=this.getParentEditor().getSelection().getSelectedElement();a&&"input"==a.getName()&&"radio"==a.getAttribute("type")&&(this.radioButton=a,this.setupContent(a))},onOk:function(){var a,b=this.radioButton;b||(a=this.getParentEditor(),b=a.document.createElement("input"),b.setAttribute("type","radio"),a.insertElement(b));this.commitContent({element:b})}, +CKEDITOR.dialog.add("radio",function(c){return{title:c.lang.forms.checkboxAndRadio.radioTitle,minWidth:350,minHeight:140,getModel:function(a){return(a=a.getSelection().getSelectedElement())&&"input"==a.getName()&&"radio"==a.getAttribute("type")?a:null},onShow:function(){var a=this.getModel(this.getParentEditor());a&&this.setupContent(a)},onOk:function(){var a=this.getParentEditor(),b=this.getModel(a);b||(b=a.document.createElement("input"),b.setAttribute("type","radio"),a.insertElement(b));this.commitContent({element:b})}, contents:[{id:"info",label:c.lang.forms.checkboxAndRadio.radioTitle,title:c.lang.forms.checkboxAndRadio.radioTitle,elements:[{id:"name",type:"text",label:c.lang.common.name,"default":"",accessKey:"N",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:function(a){a=a.element;this.getValue()?a.data("cke-saved-name",this.getValue()):(a.data("cke-saved-name",!1),a.removeAttribute("name"))}},{id:"value",type:"text",label:c.lang.forms.checkboxAndRadio.value,"default":"", accessKey:"V",setup:function(a){this.setValue(a.getAttribute("value")||"")},commit:function(a){a=a.element;this.getValue()?a.setAttribute("value",this.getValue()):a.removeAttribute("value")}},{id:"checked",type:"checkbox",label:c.lang.forms.checkboxAndRadio.selected,"default":"",accessKey:"S",value:"checked",setup:function(a){this.setValue(a.getAttribute("checked"))},commit:function(a){var b=a.element;if(CKEDITOR.env.ie){var d=b.getAttribute("checked"),e=!!this.getValue();d!=e&&(d=CKEDITOR.dom.element.createFromHtml('\x3cinput type\x3d"radio"'+ (e?' checked\x3d"checked"':"")+"\x3e\x3c/input\x3e",c.document),b.copyAttributes(d,{type:1,checked:1}),d.replace(b),e&&d.setAttribute("checked","checked"),c.getSelection().selectElement(d),a.element=d)}else a=this.getValue(),CKEDITOR.env.webkit&&(b.$.checked=a),a?b.setAttribute("checked","checked"):b.removeAttribute("checked")}},{id:"required",type:"checkbox",label:c.lang.forms.checkboxAndRadio.required,"default":"",accessKey:"Q",value:"required",setup:CKEDITOR.plugins.forms._setupRequiredAttribute, diff --git a/htdocs/includes/ckeditor/ckeditor/plugins/forms/dialogs/select.js b/htdocs/includes/ckeditor/ckeditor/plugins/forms/dialogs/select.js index 5cf2de518ef..d8242545113 100644 --- a/htdocs/includes/ckeditor/ckeditor/plugins/forms/dialogs/select.js +++ b/htdocs/includes/ckeditor/ckeditor/plugins/forms/dialogs/select.js @@ -1,21 +1,21 @@ /* - Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. + Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ CKEDITOR.dialog.add("select",function(c){function h(a,b,e,d,c){a=f(a);d=d?d.createElement("OPTION"):document.createElement("OPTION");if(a&&d&&"option"==d.getName())CKEDITOR.env.ie?(isNaN(parseInt(c,10))?a.$.options.add(d.$):a.$.options.add(d.$,c),d.$.innerHTML=0c?0:c).insertBeforeMe(d):a.append(d),d.setText(0b)return!1;a=a.getChild(b);a.setText(e);a.setValue(d);return a}function m(a){for(a=f(a);a.getChild(0)&&a.getChild(0).remove(););}function l(a,b,e){a=f(a);var d=g(a);if(0>d)return!1;b=d+b;b=0>b?0:b;b=b>=a.getChildCount()?a.getChildCount()-1:b;if(d==b)return!1;var d=a.getChild(d),c=d.getText(),r=d.getValue();d.remove();d=h(a,c,r,e?e:null,b);k(a,b);return d}function g(a){return(a=f(a))?a.$.selectedIndex:-1} -function k(a,b){a=f(a);if(0>b)return null;var e=a.getChildren().count();a.$.selectedIndex=b>=e?e-1:b;return a}function n(a){return(a=f(a))?a.getChildren():!1}function f(a){return a&&a.domId&&a.getInputElement().$?a.getInputElement():a&&a.$?a:!1}return{title:c.lang.forms.select.title,minWidth:CKEDITOR.env.ie?460:395,minHeight:CKEDITOR.env.ie?320:300,onShow:function(){delete this.selectBox;this.setupContent("clear");var a=this.getParentEditor().getSelection().getSelectedElement();if(a&&"select"==a.getName()){this.selectBox= -a;this.setupContent(a.getName(),a);for(var a=n(a),b=0;bb)return null;var e=a.getChildren().count();a.$.selectedIndex=b>=e?e-1:b;return a}function n(a){return(a=f(a))?a.getChildren():!1}function f(a){return a&&a.domId&&a.getInputElement().$?a.getInputElement():a&&a.$?a:!1}return{title:c.lang.forms.select.title,minWidth:CKEDITOR.env.ie?460:395,minHeight:CKEDITOR.env.ie?320:300,getModel:function(a){return(a=a.getSelection().getSelectedElement())&&"select"==a.getName()?a:null},onShow:function(){this.setupContent("clear");var a= +this.getModel(this.getParentEditor());if(a){this.setupContent(a.getName(),a);for(var a=n(a),b=0;bh5FGFcgwMv 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 Q{x#@7Qqn|~D_VyC4`zyhmjD0& literal 12453 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 diff --git a/htdocs/includes/ckeditor/ckeditor/plugins/icons_hidpi.png b/htdocs/includes/ckeditor/ckeditor/plugins/icons_hidpi.png index 185b99188265aedc5bdb8757884dc6ec1784e178..bc5403c2569676be79af205c23cffb7a31fd56a9 100644 GIT binary patch literal 38309 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 J+ZKlt{sjf(O?ChP literal 41377 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 V$ajA79UTIXix+g&%T%qx{{w79#~%Oy diff --git a/htdocs/includes/ckeditor/ckeditor/plugins/iframe/dialogs/iframe.js b/htdocs/includes/ckeditor/ckeditor/plugins/iframe/dialogs/iframe.js index 5b2ac7671c4..f29a82e8f94 100644 --- a/htdocs/includes/ckeditor/ckeditor/plugins/iframe/dialogs/iframe.js +++ b/htdocs/includes/ckeditor/ckeditor/plugins/iframe/dialogs/iframe.js @@ -1,10 +1,11 @@ /* - Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. + Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ -(function(){function c(b){var c=this instanceof CKEDITOR.ui.dialog.checkbox;b.hasAttribute(this.id)&&(b=b.getAttribute(this.id),c?this.setValue(e[this.id]["true"]==b.toLowerCase()):this.setValue(b))}function d(b){var c=""===this.getValue(),a=this instanceof CKEDITOR.ui.dialog.checkbox,d=this.getValue();c?b.removeAttribute(this.att||this.id):a?b.setAttribute(this.id,e[this.id][d]):b.setAttribute(this.att||this.id,d)}var e={scrolling:{"true":"yes","false":"no"},frameborder:{"true":"1","false":"0"}}; -CKEDITOR.dialog.add("iframe",function(b){var f=b.lang.iframe,a=b.lang.common,e=b.plugins.dialogadvtab;return{title:f.title,minWidth:350,minHeight:260,onShow:function(){this.fakeImage=this.iframeNode=null;var a=this.getSelectedElement();a&&a.data("cke-real-element-type")&&"iframe"==a.data("cke-real-element-type")&&(this.fakeImage=a,this.iframeNode=a=b.restoreRealElement(a),this.setupContent(a))},onOk:function(){var a;a=this.fakeImage?this.iframeNode:new CKEDITOR.dom.element("iframe");var c={},d={}; -this.commitContent(a,c,d);a=b.createFakeElement(a,"cke_iframe","iframe",!0);a.setAttributes(d);a.setStyles(c);this.fakeImage?(a.replace(this.fakeImage),b.getSelection().selectElement(a)):b.insertElement(a)},contents:[{id:"info",label:a.generalTab,accessKey:"I",elements:[{type:"vbox",padding:0,children:[{id:"src",type:"text",label:a.url,required:!0,validate:CKEDITOR.dialog.validate.notEmpty(f.noUrl),setup:c,commit:d}]},{type:"hbox",children:[{id:"width",type:"text",requiredContent:"iframe[width]", -style:"width:100%",labelLayout:"vertical",label:a.width,validate:CKEDITOR.dialog.validate.htmlLength(a.invalidHtmlLength.replace("%1",a.width)),setup:c,commit:d},{id:"height",type:"text",requiredContent:"iframe[height]",style:"width:100%",labelLayout:"vertical",label:a.height,validate:CKEDITOR.dialog.validate.htmlLength(a.invalidHtmlLength.replace("%1",a.height)),setup:c,commit:d},{id:"align",type:"select",requiredContent:"iframe[align]","default":"",items:[[a.notSet,""],[a.left,"left"],[a.right, -"right"],[a.alignTop,"top"],[a.alignMiddle,"middle"],[a.alignBottom,"bottom"]],style:"width:100%",labelLayout:"vertical",label:a.align,setup:function(a,b){c.apply(this,arguments);if(b){var d=b.getAttribute("align");this.setValue(d&&d.toLowerCase()||"")}},commit:function(a,b,c){d.apply(this,arguments);this.getValue()&&(c.align=this.getValue())}}]},{type:"hbox",widths:["50%","50%"],children:[{id:"scrolling",type:"checkbox",requiredContent:"iframe[scrolling]",label:f.scrolling,setup:c,commit:d},{id:"frameborder", -type:"checkbox",requiredContent:"iframe[frameborder]",label:f.border,setup:c,commit:d}]},{type:"hbox",widths:["50%","50%"],children:[{id:"name",type:"text",requiredContent:"iframe[name]",label:a.name,setup:c,commit:d},{id:"title",type:"text",requiredContent:"iframe[title]",label:a.advisoryTitle,setup:c,commit:d}]},{id:"longdesc",type:"text",requiredContent:"iframe[longdesc]",label:a.longDescr,setup:c,commit:d}]},e&&e.createAdvancedTab(b,{id:1,classes:1,styles:1},"iframe")]}})})(); \ No newline at end of file +(function(){function d(c){var e=this instanceof CKEDITOR.ui.dialog.checkbox;c.hasAttribute(this.id)&&(c=c.getAttribute(this.id),e?this.setValue(g[this.id]["true"]==c.toLowerCase()):this.setValue(c))}function f(c){var e=this.getValue(),a=this.att||this.id,d=this instanceof CKEDITOR.ui.dialog.checkbox?g[this.id][e]:e;""===e||"tabindex"===a&&!1===e?c.removeAttribute(a):c.setAttribute(a,d)}var g={scrolling:{"true":"yes","false":"no"},frameborder:{"true":"1","false":"0"},tabindex:{"true":"-1","false":!1}}; +CKEDITOR.dialog.add("iframe",function(c){var e=c.lang.iframe,a=c.lang.common,g=c.plugins.dialogadvtab;return{title:e.title,minWidth:350,minHeight:260,getModel:function(b){return(b=b.getSelection().getSelectedElement())&&"iframe"===b.data("cke-real-element-type")?b:null},onShow:function(){this.fakeImage=this.iframeNode=null;var b=this.getSelectedElement();b&&b.data("cke-real-element-type")&&"iframe"==b.data("cke-real-element-type")&&(this.fakeImage=b,this.iframeNode=b=c.restoreRealElement(b),this.setupContent(b))}, +onOk:function(){var b;b=this.fakeImage?this.iframeNode:new CKEDITOR.dom.element("iframe");var a={},d={};this.commitContent(b,a,d);b=c.createFakeElement(b,"cke_iframe","iframe",!0);b.setAttributes(d);b.setStyles(a);this.fakeImage?(b.replace(this.fakeImage),c.getSelection().selectElement(b)):c.insertElement(b)},contents:[{id:"info",label:a.generalTab,accessKey:"I",elements:[{type:"vbox",padding:0,children:[{id:"src",type:"text",label:a.url,required:!0,validate:CKEDITOR.dialog.validate.notEmpty(e.noUrl), +setup:d,commit:f}]},{type:"hbox",children:[{id:"width",type:"text",requiredContent:"iframe[width]",style:"width:100%",labelLayout:"vertical",label:a.width,validate:CKEDITOR.dialog.validate.htmlLength(a.invalidHtmlLength.replace("%1",a.width)),setup:d,commit:f},{id:"height",type:"text",requiredContent:"iframe[height]",style:"width:100%",labelLayout:"vertical",label:a.height,validate:CKEDITOR.dialog.validate.htmlLength(a.invalidHtmlLength.replace("%1",a.height)),setup:d,commit:f},{id:"align",type:"select", +requiredContent:"iframe[align]","default":"",items:[[a.notSet,""],[a.left,"left"],[a.right,"right"],[a.alignTop,"top"],[a.alignMiddle,"middle"],[a.alignBottom,"bottom"]],style:"width:100%",labelLayout:"vertical",label:a.align,setup:function(a,c){d.apply(this,arguments);if(c){var e=c.getAttribute("align");this.setValue(e&&e.toLowerCase()||"")}},commit:function(a,c,d){f.apply(this,arguments);this.getValue()&&(d.align=this.getValue())}}]},{type:"hbox",widths:["33%","33%","33%"],children:[{id:"scrolling", +type:"checkbox",requiredContent:"iframe[scrolling]",label:e.scrolling,setup:d,commit:f},{id:"frameborder",type:"checkbox",requiredContent:"iframe[frameborder]",label:e.border,setup:d,commit:f},{id:"tabindex",type:"checkbox",requiredContent:"iframe[tabindex]",label:e.tabindex,setup:d,commit:f}]},{type:"hbox",widths:["50%","50%"],children:[{id:"name",type:"text",requiredContent:"iframe[name]",label:a.name,setup:d,commit:f},{id:"title",type:"text",requiredContent:"iframe[title]",label:a.advisoryTitle, +setup:d,commit:f}]},{id:"longdesc",type:"text",requiredContent:"iframe[longdesc]",label:a.longDescr,setup:d,commit:f}]},g&&g.createAdvancedTab(c,{id:1,classes:1,styles:1},"iframe")]}})})(); \ No newline at end of file diff --git a/htdocs/includes/ckeditor/ckeditor/plugins/image/dialogs/image.js b/htdocs/includes/ckeditor/ckeditor/plugins/image/dialogs/image.js index a3e5d2deb9b..f9f6ce23f52 100644 --- a/htdocs/includes/ckeditor/ckeditor/plugins/image/dialogs/image.js +++ b/htdocs/includes/ckeditor/ckeditor/plugins/image/dialogs/image.js @@ -1,5 +1,5 @@ /* - Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. + Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ (function(){var u=function(d,k){function u(){var a=arguments,b=this.getContentElement("advanced","txtdlgGenStyle");b&&b.commit.apply(b,a);this.foreach(function(b){b.commit&&"txtdlgGenStyle"!=b.id&&b.commit.apply(b,a)})}function g(a){if(!v){v=1;var b=this.getDialog(),c=b.imageElement;if(c){this.commit(1,c);a=[].concat(a);for(var d=a.length,h,e=0;eCKEDITOR.env.version&&(a["class"]="cke_anchor"),a=new CKEDITOR.style({element:"a",attributes:a}),a.type=CKEDITOR.STYLE_INLINE,a.applyToRange(b)))},onHide:function(){delete this._.selectedElement},onShow:function(){var b=c.getSelection(),a;a=b.getRanges()[0];var d=b.getSelectedElement();a.shrink(CKEDITOR.SHRINK_ELEMENT);a=(d=a.getEnclosedNode())&&d.type===CKEDITOR.NODE_ELEMENT&&("anchor"===d.data("cke-real-element-type")|| -d.is("a"))?d:void 0;var f=(d=a&&a.data("cke-realelement"))?CKEDITOR.plugins.link.tryRestoreFakeAnchor(c,a):CKEDITOR.plugins.link.getSelectedLink(c);if(f){this._.selectedElement=f;var e=f.data("cke-saved-name");this.setValueOf("info","txtName",e||"");!d&&b.selectElement(f);a&&(this._.selectedElement=a)}this.getContentElement("info","txtName").focus()},contents:[{id:"info",label:c.lang.link.anchor.title,accessKey:"I",elements:[{type:"text",id:"txtName",label:c.lang.link.anchor.name,required:!0,validate:function(){return this.getValue()? -!0:(alert(c.lang.link.anchor.errorName),!1)}}]}]}}); \ No newline at end of file +CKEDITOR.dialog.add("anchor",function(c){function f(b,a){return b.createFakeElement(b.document.createElement("a",{attributes:a}),"cke_anchor","anchor")}return{title:c.lang.link.anchor.title,minWidth:300,minHeight:60,getModel:function(b){var a=b.getSelection();b=a.getRanges()[0];a=a.getSelectedElement();b.shrink(CKEDITOR.SHRINK_ELEMENT);(a=b.getEnclosedNode())&&a.type===CKEDITOR.NODE_TEXT&&(a=a.getParent());a&&!a.is("a")&&(a=a.getAscendant("a")||a);b=a&&a.type===CKEDITOR.NODE_ELEMENT&&("anchor"=== +a.data("cke-real-element-type")||a.is("a"))?a:void 0;return b||null},onOk:function(){var b=CKEDITOR.tools.trim(this.getValueOf("info","txtName")),b={id:b,name:b,"data-cke-saved-name":b},a=this.getModel(c);if(a)a.data("cke-realelement")?(b=f(c,b),b.replace(a),CKEDITOR.env.ie&&c.getSelection().selectElement(b)):a.setAttributes(b);else if(a=(a=c.getSelection())&&a.getRanges()[0],a.collapsed)b=f(c,b),a.insertNode(b);else{CKEDITOR.env.ie&&9>CKEDITOR.env.version&&(b["class"]="cke_anchor");var d=a.clone(); +d.enlarge(CKEDITOR.ENLARGE_ELEMENT);for(var e=new CKEDITOR.dom.walker(d),d=d.collapsed?d.startContainer:e.next(),g=a.createBookmark();d;)d.type===CKEDITOR.NODE_ELEMENT&&d.getAttribute("data-cke-saved-name")&&(d.remove(!0),e.reset()),d=e.next();a.moveToBookmark(g);b=new CKEDITOR.style({element:"a",attributes:b});b.type=CKEDITOR.STYLE_INLINE;b.applyToRange(a)}},onShow:function(){var b=c.getSelection(),a=this.getModel(c),d=a&&a.data("cke-realelement");if(a=d?CKEDITOR.plugins.link.tryRestoreFakeAnchor(c, +a):CKEDITOR.plugins.link.getSelectedLink(c)){var e=a.data("cke-saved-name");this.setValueOf("info","txtName",e||"");!d&&b.selectElement(a)}this.getContentElement("info","txtName").focus()},contents:[{id:"info",label:c.lang.link.anchor.title,accessKey:"I",elements:[{type:"text",id:"txtName",label:c.lang.link.anchor.name,required:!0,validate:function(){return this.getValue()?!0:(alert(c.lang.link.anchor.errorName),!1)}}]}]}}); \ No newline at end of file diff --git a/htdocs/includes/ckeditor/ckeditor/plugins/link/dialogs/link.js b/htdocs/includes/ckeditor/ckeditor/plugins/link/dialogs/link.js index 7305fd2df24..51bd322e210 100644 --- a/htdocs/includes/ckeditor/ckeditor/plugins/link/dialogs/link.js +++ b/htdocs/includes/ckeditor/ckeditor/plugins/link/dialogs/link.js @@ -1,30 +1,30 @@ /* - Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. + Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ (function(){function u(){var c=this.getDialog(),p=c._.editor,n=p.config.linkPhoneRegExp,q=p.config.linkPhoneMsg,p=CKEDITOR.dialog.validate.notEmpty(p.lang.link.noTel).apply(this);if(!c.getContentElement("info","linkType")||"tel"!=c.getValueOf("info","linkType"))return!0;if(!0!==p)return p;if(n)return CKEDITOR.dialog.validate.regex(n,q).call(this)}CKEDITOR.dialog.add("link",function(c){function p(a,b){var c=a.createRange();c.setStartBefore(b);c.setEndAfter(b);return c}var n=CKEDITOR.plugins.link,q, -t=function(){var a=this.getDialog(),b=a.getContentElement("target","popupFeatures"),a=a.getContentElement("target","linkTargetName"),r=this.getValue();if(b&&a)switch(b=b.getElement(),b.hide(),a.setValue(""),r){case "frame":a.setLabel(c.lang.link.targetFrameName);a.getElement().show();break;case "popup":b.show();a.setLabel(c.lang.link.targetPopupName);a.getElement().show();break;default:a.setValue(r),a.getElement().hide()}},l=function(a){a.target&&this.setValue(a.target[this.id]||"")},e=function(a){a.advanced&& -this.setValue(a.advanced[this.id]||"")},k=function(a){a.target||(a.target={});a.target[this.id]=this.getValue()||""},m=function(a){a.advanced||(a.advanced={});a.advanced[this.id]=this.getValue()||""},g=c.lang.common,b=c.lang.link,d;return{title:b.title,minWidth:"moono-lisa"==(CKEDITOR.skinName||c.config.skin)?450:350,minHeight:240,contents:[{id:"info",label:b.info,title:b.info,elements:[{type:"text",id:"linkDisplayText",label:b.displayText,setup:function(){this.enable();this.setValue(c.getSelection().getSelectedText()); -q=this.getValue()},commit:function(a){a.linkText=this.isEnabled()?this.getValue():""}},{id:"linkType",type:"select",label:b.type,"default":"url",items:[[b.toUrl,"url"],[b.toAnchor,"anchor"],[b.toEmail,"email"],[b.toPhone,"tel"]],onChange:function(){var a=this.getDialog(),b=["urlOptions","anchorOptions","emailOptions","telOptions"],r=this.getValue(),f=a.definition.getContents("upload"),f=f&&f.hidden;"url"==r?(c.config.linkShowTargetTab&&a.showPage("target"),f||a.showPage("upload")):(a.hidePage("target"), -f||a.hidePage("upload"));for(f=0;f=f.length&&n.showDisplayTextForElement(h,a)?c.show():c.hide();this._.selectedElements=f;this.setupContent(b)},onOk:function(){var a={};this.commitContent(a);if(this._.selectedElements.length){var b=this._.selectedElements,g=n.getLinkAttributes(c,a),f=[],h,d,l,e,k;for(k=0;k=f.length&&n.showDisplayTextForElement(m,a)?c.show():c.hide();this._.selectedElements=f;this.setupContent(b)},onOk:function(){var a={};this.commitContent(a);if(this._.selectedElements.length){var b=this._.selectedElements,h=n.getLinkAttributes(c,a),f=[],m,l,d,g,e,k;for(k=0;k/g,"]--\x3e");var f=CKEDITOR.htmlParser.fragment.fromHtml(a),g={root:function(a){a.filterChildren(p);CKEDITOR.plugins.pastefromword.lists.cleanup(h.createLists(a))},elementNames:[[/^\?xml:namespace$/,""],[/^v:shapetype/,""],[new RegExp(A.join("|")),""]],elements:{a:function(a){if(a.attributes.name){if("_GoBack"==a.attributes.name){delete a.name;return}if(a.attributes.name.match(/^OLE_LINK\d+$/)){delete a.name;return}}if(a.attributes.href&&a.attributes.href.match(/#.+$/)){var b= -a.attributes.href.match(/#(.+)$/)[1];y[b]=a}a.attributes.name&&y[a.attributes.name]&&(a=y[a.attributes.name],a.attributes.href=a.attributes.href.replace(/.*#(.*)$/,"#$1"))},div:function(a){if(b.plugins.pagebreak&&a.attributes["data-cke-pagebreak"])return a;k.createStyleStack(a,p,b)},img:function(a){if(a.parent&&a.parent.attributes){var b=a.parent.attributes;(b=b.style||b.STYLE)&&b.match(/mso\-list:\s?Ignore/)&&(a.attributes["cke-ignored"]=!0)}k.mapCommonStyles(a);a.attributes.src&&a.attributes.src.match(/^file:\/\//)&& -a.attributes.alt&&a.attributes.alt.match(/^https?:\/\//)&&(a.attributes.src=a.attributes.alt);a=a.attributes["v:shapes"]?a.attributes["v:shapes"].split(" "):[];b=CKEDITOR.tools.array.every(a,function(a){return-1/)?!0:!1},convertToFakeListItem:function(a,b){r.isDegenerateListItem(a,b)&&r.assignListLevels(a,b);this.getListItemInfo(b);if(!b.attributes["cke-dissolved"]){var c;b.forEach(function(a){!c&&"img"==a.name&&a.attributes["cke-ignored"]&&"*"==a.attributes.alt&&(c="·",a.remove())},CKEDITOR.NODE_ELEMENT);b.forEach(function(a){c||a.value.match(/^ /)||(c=a.value)},CKEDITOR.NODE_TEXT);if("undefined"==typeof c)return; -b.attributes["cke-symbol"]=c.replace(/(?: | ).*$/,"");h.removeSymbolText(b)}var d=b.attributes&&m.parseCssText(b.attributes.style);if(d["margin-left"]){var e=d["margin-left"],f=b.attributes["cke-list-level"];(e=Math.max(CKEDITOR.tools.convertToPx(e)-40*f,0))?d["margin-left"]=e+"px":delete d["margin-left"];b.attributes.style=CKEDITOR.tools.writeCssText(d)}b.name="cke:li"},convertToRealListItems:function(a){var b=[];a.forEach(function(a){"cke:li"==a.name&&(a.name="li",b.push(a))},CKEDITOR.NODE_ELEMENT, -!1);return b},removeSymbolText:function(a){var b=a.attributes["cke-symbol"],c=a.findOne(function(a){return a.value&&-1b&&(a.attributes.dir="rtl")},createList:function(a){return(a.attributes["cke-symbol"].match(/([\da-np-zA-NP-Z]).?/)||[])[1]?new CKEDITOR.htmlParser.element("ol"):new CKEDITOR.htmlParser.element("ul")},createLists:function(a){function b(a){return CKEDITOR.tools.array.reduce(a,function(a,b){if(b.attributes&&b.attributes.style)var c=CKEDITOR.tools.parseCssText(b.attributes.style)["margin-left"]; -return c?a+parseInt(c,10):a},0)}var c,d,e,f=h.convertToRealListItems(a);if(0===f.length)return[];var g=h.groupLists(f);for(a=0;al.length;){var m=h.createList(c),u=n.children;0e;e++)c[e]&&delete c[e];c[a[f].attributes["cke-list-level"]]=l;d[d.length-1].push(a[f]);e=k}[].splice.apply(b,[].concat([m.indexOf(b,a),1],d))},isAListContinuation:function(a){var b=a;do if((b=b.previous)&&b.type===CKEDITOR.NODE_ELEMENT){if(void 0=== -b.attributes["cke-list-level"])break;if(b.attributes["cke-list-level"]===a.attributes["cke-list-level"])return b.attributes["cke-list-id"]===a.attributes["cke-list-id"]}while(b);return!1},getElementIndentation:function(a){a=m.parseCssText(a.attributes.style);if(a.margin||a.MARGIN){a.margin=a.margin||a.MARGIN;var b={styles:{margin:a.margin}};CKEDITOR.filter.transformationsTools.splitMarginShorthand(b);a["margin-left"]=b.styles["margin-left"]}return parseInt(m.convertToPx(a["margin-left"]||"0px"),10)}, -toArabic:function(a){return a.match(/[ivxl]/i)?a.match(/^l/i)?50+h.toArabic(a.slice(1)):a.match(/^lx/i)?40+h.toArabic(a.slice(1)):a.match(/^x/i)?10+h.toArabic(a.slice(1)):a.match(/^ix/i)?9+h.toArabic(a.slice(2)):a.match(/^v/i)?5+h.toArabic(a.slice(1)):a.match(/^iv/i)?4+h.toArabic(a.slice(2)):a.match(/^i/i)?1+h.toArabic(a.slice(1)):h.toArabic(a.slice(1)):0},getSymbolInfo:function(a,b){var c=a.toUpperCase()==a?"upper-":"lower-",d={"·":["disc",-1],o:["circle",-2],"§":["square",-3]};if(a in d||b&&b.match(/(disc|circle|square)/))return{index:d[a][1], -type:d[a][0]};if(a.match(/\d/))return{index:a?parseInt(h.getSubsectionSymbol(a),10):0,type:"decimal"};a=a.replace(/\W/g,"").toLowerCase();return!b&&a.match(/[ivxl]+/i)||b&&"alpha"!=b||"roman"==b?{index:h.toArabic(a),type:c+"roman"}:a.match(/[a-z]/i)?{index:a.charCodeAt(0)-97,type:c+"alpha"}:{index:-1,type:"disc"}},getListItemInfo:function(a){if(void 0!==a.attributes["cke-list-id"])return{id:a.attributes["cke-list-id"],level:a.attributes["cke-list-level"]};var b=m.parseCssText(a.attributes.style)["mso-list"], -c={id:"0",level:"1"};b&&(b+=" ",c.level=b.match(/level(.+?)\s+/)[1],c.id=b.match(/l(\d+?)\s+/)[1]);a.attributes["cke-list-level"]=void 0!==a.attributes["cke-list-level"]?a.attributes["cke-list-level"]:c.level;a.attributes["cke-list-id"]=c.id;return c}};h=CKEDITOR.plugins.pastefromword.lists;CKEDITOR.plugins.pastefromword.images={extractFromRtf:function(a){var b=[],c=/\{\\pict[\s\S]+?\\bliptag\-?\d+(\\blipupi\-?\d+)?(\{\\\*\\blipuid\s?[\da-fA-F]+)?[\s\}]*?/,d;a=a.match(new RegExp("(?:("+c.source+"))([\\da-fA-F\\s]+)\\}", -"g"));if(!a)return b;for(var e=0;e]+src="([^"]+)[^>]+/g,c=[],d;d=b.exec(a);)c.push(d[1]);return c}};CKEDITOR.plugins.pastefromword.heuristics={isEdgeListItem:function(a,b){if(!CKEDITOR.env.edge||!a.config.pasteFromWord_heuristicsEdgeList)return!1; -var c="";b.forEach&&b.forEach(function(a){c+=a.value},CKEDITOR.NODE_TEXT);return c.match(/^(?: | )*\(?[a-zA-Z0-9]+?[\.\)](?: | ){2,}/)?!0:r.isDegenerateListItem(a,b)},cleanupEdgeListItem:function(a){var b=!1;a.forEach(function(a){b||(a.value=a.value.replace(/^(?: |[\s])+/,""),a.value.length&&(b=!0))},CKEDITOR.NODE_TEXT)},isDegenerateListItem:function(a,b){return!!b.attributes["cke-list-level"]||b.attributes.style&&!b.attributes.style.match(/mso\-list/)&&!!b.find(function(a){if(a.type== -CKEDITOR.NODE_ELEMENT&&b.name.match(/h\d/i)&&a.getHtml().match(/^[a-zA-Z0-9]+?[\.\)]$/))return!0;var d=m.parseCssText(a.attributes&&a.attributes.style,!0);if(!d)return!1;var e=d["font-family"]||"";return(d.font||d["font-size"]||"").match(/7pt/i)&&!!a.previous||e.match(/symbol/i)},!0).length},assignListLevels:function(a,b){if(!b.attributes||void 0===b.attributes["cke-list-level"]){for(var c=[h.getElementIndentation(b)],d=[b],e=[],f=CKEDITOR.tools.array,g=f.map;b.next&&b.next.attributes&&!b.next.attributes["cke-list-level"]&& -r.isDegenerateListItem(a,b.next);)b=b.next,c.push(h.getElementIndentation(b)),d.push(b);var k=g(c,function(a,b){return 0===b?0:a-c[b-1]}),l=this.guessIndentationStep(f.filter(c,function(a){return 0!==a})),e=g(c,function(a){return Math.round(a/l)});-1!==f.indexOf(e,0)&&(e=g(e,function(a){return a+1}));f.forEach(d,function(a,b){a.attributes["cke-list-level"]=e[b]});return{indents:c,levels:e,diffs:k}}},guessIndentationStep:function(a){return a.length?Math.min.apply(null,a):null},correctLevelShift:function(a){if(this.isShifted(a)){var b= -CKEDITOR.tools.array.filter(a.children,function(a){return"ul"==a.name||"ol"==a.name}),c=CKEDITOR.tools.array.reduce(b,function(a,b){return(b.children&&1==b.children.length&&r.isShifted(b.children[0])?[b]:b.children).concat(a)},[]);CKEDITOR.tools.array.forEach(b,function(a){a.remove()});CKEDITOR.tools.array.forEach(c,function(b){a.add(b)});delete a.name}},isShifted:function(a){return"li"!==a.name?!1:0===CKEDITOR.tools.array.filter(a.children,function(a){return a.name&&("ul"==a.name||"ol"==a.name|| -"p"==a.name&&0===a.children.length)?!1:!0}).length}};r=CKEDITOR.plugins.pastefromword.heuristics;h.setListSymbol.removeRedundancies=function(a,b){(1===b&&"disc"===a["list-style-type"]||"decimal"===a["list-style-type"])&&delete a["list-style-type"]};CKEDITOR.plugins.pastefromword.createAttributeStack=z;CKEDITOR.config.pasteFromWord_heuristicsEdgeList=!0})(); \ No newline at end of file +(function(){function r(){return!1}var n=CKEDITOR.tools,B=CKEDITOR.plugins.pastetools,t=B.filters.common,k=t.styles,C=t.createAttributeStack,z=t.lists.getElementIndentation,D=["o:p","xml","script","meta","link"],E="v:arc v:curve v:line v:oval v:polyline v:rect v:roundrect v:group".split(" "),A={},y=0,q={},g,p;CKEDITOR.plugins.pastetools.filters.word=q;CKEDITOR.plugins.pastefromword=q;q.rules=function(c,b,d){function e(a){(a.attributes["o:gfxdata"]||"v:group"===a.parent.name)&&l.push(a.attributes.id)} +var f=Boolean(c.match(/mso-list:\s*l\d+\s+level\d+\s+lfo\d+/)),l=[],w={root:function(a){a.filterChildren(d);CKEDITOR.plugins.pastefromword.lists.cleanup(g.createLists(a))},elementNames:[[/^\?xml:namespace$/,""],[/^v:shapetype/,""],[new RegExp(D.join("|")),""]],elements:{a:function(a){if(a.attributes.name){if("_GoBack"==a.attributes.name){delete a.name;return}if(a.attributes.name.match(/^OLE_LINK\d+$/)){delete a.name;return}}if(a.attributes.href&&a.attributes.href.match(/#.+$/)){var b=a.attributes.href.match(/#(.+)$/)[1]; +A[b]=a}a.attributes.name&&A[a.attributes.name]&&(a=A[a.attributes.name],a.attributes.href=a.attributes.href.replace(/.*#(.*)$/,"#$1"))},div:function(a){if(b.plugins.pagebreak&&a.attributes["data-cke-pagebreak"])return a;k.createStyleStack(a,d,b)},img:function(a){if(a.parent&&a.parent.attributes){var b=a.parent.attributes;(b=b.style||b.STYLE)&&b.match(/mso\-list:\s?Ignore/)&&(a.attributes["cke-ignored"]=!0)}k.mapCommonStyles(a);a.attributes.src&&a.attributes.src.match(/^file:\/\//)&&a.attributes.alt&& +a.attributes.alt.match(/^https?:\/\//)&&(a.attributes.src=a.attributes.alt);a=a.attributes["v:shapes"]?a.attributes["v:shapes"].split(" "):[];b=CKEDITOR.tools.array.every(a,function(a){return-1/)?!0:!1},convertToFakeListItem:function(c,b){p.isDegenerateListItem(c,b)&&p.assignListLevels(c, +b);this.getListItemInfo(b);if(!b.attributes["cke-dissolved"]){var d;b.forEach(function(b){!d&&"img"==b.name&&b.attributes["cke-ignored"]&&"*"==b.attributes.alt&&(d="·",b.remove())},CKEDITOR.NODE_ELEMENT);b.forEach(function(b){d||b.value.match(/^ /)||(d=b.value)},CKEDITOR.NODE_TEXT);if("undefined"==typeof d)return;b.attributes["cke-symbol"]=d.replace(/(?: | ).*$/,"");g.removeSymbolText(b)}var e=b.attributes&&n.parseCssText(b.attributes.style);if(e["margin-left"]){var f=e["margin-left"],l=b.attributes["cke-list-level"]; +(f=Math.max(CKEDITOR.tools.convertToPx(f)-40*l,0))?e["margin-left"]=f+"px":delete e["margin-left"];b.attributes.style=CKEDITOR.tools.writeCssText(e)}b.name="cke:li"},convertToRealListItems:function(c){var b=[];c.forEach(function(c){"cke:li"==c.name&&(c.name="li",b.push(c))},CKEDITOR.NODE_ELEMENT,!1);return b},removeSymbolText:function(c){var b=c.attributes["cke-symbol"],d=c.findOne(function(c){return c.value&&-1b&&(c.attributes.dir="rtl")},createList:function(c){return(c.attributes["cke-symbol"].match(/([\da-np-zA-NP-Z]).?/)||[])[1]? +new CKEDITOR.htmlParser.element("ol"):new CKEDITOR.htmlParser.element("ul")},createLists:function(c){function b(b){return CKEDITOR.tools.array.reduce(b,function(b,a){if(a.attributes&&a.attributes.style)var c=CKEDITOR.tools.parseCssText(a.attributes.style)["margin-left"];return c?b+parseInt(c,10):b},0)}var d,e,f,l=g.convertToRealListItems(c);if(0===l.length)return[];var k=g.groupLists(l);for(c=0;ch.length;){var v=g.createList(d),x=m.children;0f;f++)d[f]&&delete d[f];d[c[l].attributes["cke-list-level"]]=h;e[e.length-1].push(c[l]);f=a}[].splice.apply(b,[].concat([n.indexOf(b,c),1],e))},isAListContinuation:function(c){var b=c;do if((b=b.previous)&&b.type===CKEDITOR.NODE_ELEMENT){if(void 0===b.attributes["cke-list-level"])break;if(b.attributes["cke-list-level"]===c.attributes["cke-list-level"])return b.attributes["cke-list-id"]===c.attributes["cke-list-id"]}while(b);return!1},toArabic:function(c){return c.match(/[ivxl]/i)?c.match(/^l/i)? +50+g.toArabic(c.slice(1)):c.match(/^lx/i)?40+g.toArabic(c.slice(1)):c.match(/^x/i)?10+g.toArabic(c.slice(1)):c.match(/^ix/i)?9+g.toArabic(c.slice(2)):c.match(/^v/i)?5+g.toArabic(c.slice(1)):c.match(/^iv/i)?4+g.toArabic(c.slice(2)):c.match(/^i/i)?1+g.toArabic(c.slice(1)):g.toArabic(c.slice(1)):0},getSymbolInfo:function(c,b){var d=c.toUpperCase()==c?"upper-":"lower-",e={"·":["disc",-1],o:["circle",-2],"§":["square",-3]};if(c in e||b&&b.match(/(disc|circle|square)/))return{index:e[c][1],type:e[c][0]}; +if(c.match(/\d/))return{index:c?parseInt(g.getSubsectionSymbol(c),10):0,type:"decimal"};c=c.replace(/\W/g,"").toLowerCase();return!b&&c.match(/[ivxl]+/i)||b&&"alpha"!=b||"roman"==b?{index:g.toArabic(c),type:d+"roman"}:c.match(/[a-z]/i)?{index:c.charCodeAt(0)-97,type:d+"alpha"}:{index:-1,type:"disc"}},getListItemInfo:function(c){if(void 0!==c.attributes["cke-list-id"])return{id:c.attributes["cke-list-id"],level:c.attributes["cke-list-level"]};var b=n.parseCssText(c.attributes.style)["mso-list"],d= +{id:"0",level:"1"};b&&(b+=" ",d.level=b.match(/level(.+?)\s+/)[1],d.id=b.match(/l(\d+?)\s+/)[1]);c.attributes["cke-list-level"]=void 0!==c.attributes["cke-list-level"]?c.attributes["cke-list-level"]:d.level;c.attributes["cke-list-id"]=d.id;return d}};g=q.lists;q.heuristics={isEdgeListItem:function(c,b){if(!CKEDITOR.env.edge||!c.config.pasteFromWord_heuristicsEdgeList)return!1;var d="";b.forEach&&b.forEach(function(b){d+=b.value},CKEDITOR.NODE_TEXT);return d.match(/^(?: | )*\(?[a-zA-Z0-9]+?[\.\)](?: | ){2,}/)? +!0:p.isDegenerateListItem(c,b)},cleanupEdgeListItem:function(c){var b=!1;c.forEach(function(c){b||(c.value=c.value.replace(/^(?: |[\s])+/,""),c.value.length&&(b=!0))},CKEDITOR.NODE_TEXT)},isDegenerateListItem:function(c,b){return!!b.attributes["cke-list-level"]||b.attributes.style&&!b.attributes.style.match(/mso\-list/)&&!!b.find(function(c){if(c.type==CKEDITOR.NODE_ELEMENT&&b.name.match(/h\d/i)&&c.getHtml().match(/^[a-zA-Z0-9]+?[\.\)]$/))return!0;var e=n.parseCssText(c.attributes&&c.attributes.style, +!0);if(!e)return!1;var f=e["font-family"]||"";return(e.font||e["font-size"]||"").match(/7pt/i)&&!!c.previous||f.match(/symbol/i)},!0).length},assignListLevels:function(c,b){if(!b.attributes||void 0===b.attributes["cke-list-level"]){for(var d=[z(b)],e=[b],f=[],g=CKEDITOR.tools.array,k=g.map;b.next&&b.next.attributes&&!b.next.attributes["cke-list-level"]&&p.isDegenerateListItem(c,b.next);)b=b.next,d.push(z(b)),e.push(b);var a=k(d,function(a,b){return 0===b?0:a-d[b-1]}),h=this.guessIndentationStep(g.filter(d, +function(a){return 0!==a})),f=k(d,function(a){return Math.round(a/h)});-1!==g.indexOf(f,0)&&(f=k(f,function(a){return a+1}));g.forEach(e,function(a,b){a.attributes["cke-list-level"]=f[b]});return{indents:d,levels:f,diffs:a}}},guessIndentationStep:function(c){return c.length?Math.min.apply(null,c):null},correctLevelShift:function(c){if(this.isShifted(c)){var b=CKEDITOR.tools.array.filter(c.children,function(b){return"ul"==b.name||"ol"==b.name}),d=CKEDITOR.tools.array.reduce(b,function(b,c){return(c.children&& +1==c.children.length&&p.isShifted(c.children[0])?[c]:c.children).concat(b)},[]);CKEDITOR.tools.array.forEach(b,function(b){b.remove()});CKEDITOR.tools.array.forEach(d,function(b){c.add(b)});delete c.name}},isShifted:function(c){return"li"!==c.name?!1:0===CKEDITOR.tools.array.filter(c.children,function(b){return b.name&&("ul"==b.name||"ol"==b.name||"p"==b.name&&0===b.children.length)?!1:!0}).length}};p=q.heuristics;g.setListSymbol.removeRedundancies=function(c,b){(1===b&&"disc"===c["list-style-type"]|| +"decimal"===c["list-style-type"])&&delete c["list-style-type"]};CKEDITOR.cleanWord=CKEDITOR.pasteFilters.word=B.createFilter({rules:[t.rules,q.rules],additionalTransforms:function(c){CKEDITOR.plugins.clipboard.isCustomDataTypesSupported&&(c=t.styles.inliner.inline(c).getBody().getHtml());return c.replace(//g,"]--\x3e")}});CKEDITOR.config.pasteFromWord_heuristicsEdgeList=!0})(); \ No newline at end of file diff --git a/htdocs/includes/ckeditor/ckeditor/plugins/pastetools/filter/common.js b/htdocs/includes/ckeditor/ckeditor/plugins/pastetools/filter/common.js new file mode 100644 index 00000000000..bce639a9dd8 --- /dev/null +++ b/htdocs/includes/ckeditor/ckeditor/plugins/pastetools/filter/common.js @@ -0,0 +1,24 @@ +/* + Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. + For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license +*/ +(function(){function q(a,b,c){b+=c;for(var d=a[b],e=/[\s]/;d&&e.test(d);)b+=c,d=a[b];return d}function r(a){return/%$/.test(a)?a:a+"px"}function t(a){var b=a.margin?"margin":a.MARGIN?"MARGIN":!1,c,d;if(b){d=CKEDITOR.tools.style.parse.margin(a[b]);for(c in d)a["margin-"+c]=d[c];delete a[b]}}function u(a){var b="background-color:transparent;background:transparent;background-color:none;background:none;background-position:initial initial;background-repeat:initial initial;caret-color;font-family:-webkit-standard;font-variant-caps;letter-spacing:normal;orphans;widows;text-transform:none;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;text-indent:0px;margin-bottom:0in".split(";"), +c=CKEDITOR.tools.parseCssText(a.attributes.style),d,e;for(d in c)e=d+":"+c[d],CKEDITOR.tools.array.some(b,function(a){return e.substring(0,a.length).toLowerCase()===a})&&delete c[d];c=CKEDITOR.tools.writeCssText(c);""!==c?a.attributes.style=c:delete a.attributes.style}function v(a){a=a.config.font_names;var b=[];if(!a||!a.length)return!1;b=CKEDITOR.tools.array.map(a.split(";"),function(a){return-1===a.indexOf("/")?a:a.split("/")[1]});return b.length?b:!1}function w(a,b){var c=a.split(",");return CKEDITOR.tools.array.find(b, +function(a){for(var e=0;e]+src="([^"]+)[^>]+/g,b=[],e;e=c.exec(a);)b.push(e[1]);return b}function t(a){var c=CKEDITOR.tools.array.find(CKEDITOR.pasteFilters.image.recognizableImageTypes, +function(b){return b.marker.test(a)});return c?c.type:"unknown"}function h(a){var c=-1!==CKEDITOR.tools.array.indexOf(CKEDITOR.pasteFilters.image.supportedImageTypes,a.type),b=a.hex;if(!c)return null;"string"===typeof b&&(b=CKEDITOR.tools.convertHexStringToBytes(a.hex));return a.type?"data:"+a.type+";base64,"+CKEDITOR.tools.convertBytesToBase64(b):null}function m(a){return new CKEDITOR.tools.promise(function(c){CKEDITOR.ajax.load(a,function(a){a=new Uint8Array(a);var e=r(a);a=h({type:e,hex:a});c(a)}, +"arraybuffer")})}function r(a){a=a.subarray(0,4);var c=CKEDITOR.tools.array.map(a,function(a){return a.toString(16)}).join("");return(a=CKEDITOR.tools.array.find(CKEDITOR.pasteFilters.image.recognizableImageSignatures,function(a){return 0===c.indexOf(a.signature)}))?a.type:null}CKEDITOR.pasteFilters.image=function(a,c,b){var e;if(c.activeFilter&&!c.activeFilter.check("img[src]"))return a;e=q(a);return 0===e.length?a:b?u(a,b,e):v(c,a,e)};CKEDITOR.pasteFilters.image.extractFromRtf=l;CKEDITOR.pasteFilters.image.extractTagsFromHtml= +q;CKEDITOR.pasteFilters.image.getImageType=t;CKEDITOR.pasteFilters.image.createSrcWithBase64=h;CKEDITOR.pasteFilters.image.convertBlobUrlToBase64=m;CKEDITOR.pasteFilters.image.getImageTypeFromSignature=r;CKEDITOR.pasteFilters.image.supportedImageTypes=["image/png","image/jpeg","image/gif"];CKEDITOR.pasteFilters.image.recognizableImageTypes=[{marker:/\\pngblip/,type:"image/png"},{marker:/\\jpegblip/,type:"image/jpeg"},{marker:/\\emfblip/,type:"image/emf"},{marker:/\\wmetafile\d/,type:"image/wmf"}]; +CKEDITOR.pasteFilters.image.recognizableImageSignatures=[{signature:"ffd8ff",type:"image/jpeg"},{signature:"47494638",type:"image/gif"},{signature:"89504e47",type:"image/png"}]})(); \ No newline at end of file diff --git a/htdocs/includes/ckeditor/ckeditor/plugins/preview/images/pagebreak.gif b/htdocs/includes/ckeditor/ckeditor/plugins/preview/images/pagebreak.gif new file mode 100644 index 0000000000000000000000000000000000000000..a27b1684983977a00de52fc565142df615eb8c0c GIT binary patch literal 99 zcmZ?wbhEHb6lP#&_{abPGiS~O(+r9~Sr{1@m>3lQb9?3{rlp&&(p=f)}return p}function t(a){return function(){var f=this.getValue(),f=!!(CKEDITOR.dialog.validate.integer().call(this,f)&&0r.getSize("width")?"100%":500:0,getValue:v,validate:CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1", -a.lang.common.width)),onChange:function(){var a=this.getDialog().getContentElement("advanced","advStyles");a&&a.updateStyle("width",this.getValue())},setup:function(a){a=a.getStyle("width");this.setValue(a)},commit:n}]},{type:"hbox",widths:["5em"],children:[{type:"text",id:"txtHeight",requiredContent:"table{height}",controlStyle:"width:5em",label:a.lang.common.height,title:a.lang.common.cssLengthTooltip,"default":"",getValue:v,validate:CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1", -a.lang.common.height)),onChange:function(){var a=this.getDialog().getContentElement("advanced","advStyles");a&&a.updateStyle("height",this.getValue())},setup:function(a){(a=a.getStyle("height"))&&this.setValue(a)},commit:n}]},{type:"html",html:"\x26nbsp;"},{type:"text",id:"txtCellSpace",requiredContent:"table[cellspacing]",controlStyle:"width:3em",label:a.lang.table.cellSpace,"default":a.filter.check("table[cellspacing]")?1:0,validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidCellSpacing), -setup:function(a){this.setValue(a.getAttribute("cellSpacing")||"")},commit:function(a,d){this.getValue()?d.setAttribute("cellSpacing",this.getValue()):d.removeAttribute("cellSpacing")}},{type:"text",id:"txtCellPad",requiredContent:"table[cellpadding]",controlStyle:"width:3em",label:a.lang.table.cellPad,"default":a.filter.check("table[cellpadding]")?1:0,validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidCellPadding),setup:function(a){this.setValue(a.getAttribute("cellPadding")||"")},commit:function(a, -d){this.getValue()?d.setAttribute("cellPadding",this.getValue()):d.removeAttribute("cellPadding")}}]}]},{type:"html",align:"right",html:""},{type:"vbox",padding:0,children:[{type:"text",id:"txtCaption",requiredContent:"caption",label:a.lang.table.caption,setup:function(a){this.enable();a=a.getElementsByTag("caption");if(0p&&(p=f)}return p}function t(a){return function(){var f=this.getValue(),f=!!(CKEDITOR.dialog.validate.integer().call(this,f)&&0r.getSize("width")?"100%":500:0,getValue:v,validate:CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1",a.lang.common.width)),onChange:function(){var a=this.getDialog().getContentElement("advanced","advStyles");a&&a.updateStyle("width",this.getValue())},setup:function(a){a=a.getStyle("width");this.setValue(a)},commit:n}]},{type:"hbox",widths:["5em"],children:[{type:"text",id:"txtHeight",requiredContent:"table{height}",controlStyle:"width:5em", +label:a.lang.common.height,title:a.lang.common.cssLengthTooltip,"default":"",getValue:v,validate:CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1",a.lang.common.height)),onChange:function(){var a=this.getDialog().getContentElement("advanced","advStyles");a&&a.updateStyle("height",this.getValue())},setup:function(a){(a=a.getStyle("height"))&&this.setValue(a)},commit:n}]},{type:"html",html:"\x26nbsp;"},{type:"text",id:"txtCellSpace",requiredContent:"table[cellspacing]", +controlStyle:"width:3em",label:a.lang.table.cellSpace,"default":a.filter.check("table[cellspacing]")?1:0,validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidCellSpacing),setup:function(a){this.setValue(a.getAttribute("cellSpacing")||"")},commit:function(a,e){this.getValue()?e.setAttribute("cellSpacing",this.getValue()):e.removeAttribute("cellSpacing")}},{type:"text",id:"txtCellPad",requiredContent:"table[cellpadding]",controlStyle:"width:3em",label:a.lang.table.cellPad,"default":a.filter.check("table[cellpadding]")? +1:0,validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidCellPadding),setup:function(a){this.setValue(a.getAttribute("cellPadding")||"")},commit:function(a,e){this.getValue()?e.setAttribute("cellPadding",this.getValue()):e.removeAttribute("cellPadding")}}]}]},{type:"html",align:"right",html:""},{type:"vbox",padding:0,children:[{type:"text",id:"txtCaption",requiredContent:"caption",label:a.lang.table.caption,setup:function(a){this.enable();a=a.getElementsByTag("caption");if(0=m/2?h[2].children.push(a):h[0].children.push(a)});CKEDITOR.tools.array.forEach(h,function(a){a.isSpacer||(a=a.children,a[a.length-1].isSpacer&&a.pop())});return{title:c.title,minWidth:1===h.length?205:410,minHeight:50,contents:[{id:"info",label:c.title,accessKey:"I",elements:[{type:"hbox",widths:1===h.length?["100%"]:["40%","5%","40%"],children:h}]}],onShow:function(){this.cells= -CKEDITOR.plugins.tabletools.getSelectedCells(this._.editor.getSelection());this.setupContent(this.cells)},onOk:function(){for(var a=this._.editor.getSelection(),b=a.createBookmarks(),c=this.cells,d=0;d=m/2?g[2].children.push(a):g[0].children.push(a)});CKEDITOR.tools.array.forEach(g,function(a){a.isSpacer||(a=a.children,a[a.length-1].isSpacer&&a.pop())});return{title:d.title,minWidth:1===g.length?205:410,minHeight:50,contents:[{id:"info",label:d.title,accessKey:"I",elements:[{type:"hbox",widths:1===g.length?["100%"]:["40%","5%","40%"],children:g}]}],getModel:function(a){return CKEDITOR.plugins.tabletools.getSelectedCells(a.getSelection())},onShow:function(){var a=this.getModel(this.getParentEditor()); +this.setupContent(a)},onOk:function(){for(var a=this._.editor.getSelection(),b=a.createBookmarks(),c=this.getParentEditor(),d=this.getModel(c),e=0;ea.cke_dialog_ui_button{margin-top:4px}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:2px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_contents_body .cke_accessibility_legend{margin:2px 7px 2px 2px}.cke_dialog_contents_body .cke_accessibility_legend:focus,.cke_dialog_contents_body .cke_accessibility_legend:active{outline:0;border:2px solid #139ff7;margin:0 5px 0 0}.cke_dialog_contents_body input[type=file]:focus,.cke_dialog_contents_body input[type=file]:active{border:2px solid #139ff7}.cke_dialog_find_fieldset{margin-top:10px!important}.cke_dialog_image_ratiolock{margin-top:52px!important}.cke_dialog_forms_select_order label.cke_dialog_ui_labeled_label{margin-left:0}.cke_dialog_forms_select_order div.cke_dialog_ui_input_select{width:100%}.cke_dialog_forms_select_order_txtsize .cke_dialog_ui_hbox_last{padding-top:4px}.cke_dialog_image_url .cke_dialog_ui_hbox_last,.cke_dialog_flash_url .cke_dialog_ui_hbox_last{vertical-align:bottom}a.cke_dialog_ui_button.cke_dialog_image_browse{margin-top:10px}.cke_dialog_contents_body .cke_tpl_list{border:#bcbcbc 1px solid;margin:1px}.cke_dialog_contents_body .cke_tpl_list:focus,.cke_dialog_contents_body .cke_tpl_list:active{outline:0;margin:0;border:2px solid #139ff7}.cke_dialog_contents_body .cke_tpl_list a:focus,.cke_dialog_contents_body .cke_tpl_list a:active{outline:0}.cke_dialog_contents_body .cke_tpl_list a:focus .cke_tpl_item,.cke_dialog_contents_body .cke_tpl_list a:active .cke_tpl_item{border:2px solid #139ff7;padding:6px} \ No newline at end of file +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#fff}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:12px;cursor:move;position:relative;color:#484848;border-bottom:1px solid #d1d1d1;padding:12px 19px 12px 12px;background:#f8f8f8;letter-spacing:.3px}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border:2px solid rgba(102,102,102,0.2);border-left-color:rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:43px;border-top:1px solid #d1d1d1}.cke_dialog_contents_body{overflow:auto;padding:9px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:33px;display:inline-block;margin:9px 0 0;position:absolute;z-index:2;left:11px}.cke_rtl .cke_dialog_tabs{left:auto;right:11px}a.cke_dialog_tab{height:25px;padding:4px 8px;display:inline-block;cursor:pointer;line-height:26px;outline:0;color:#484848;border:1px solid #d1d1d1;border-radius:3px 3px 0 0;background:#f8f8f8;min-width:90px;text-align:center;margin-left:-1px;letter-spacing:.3px}a.cke_dialog_tab:hover{background-color:#fff}a.cke_dialog_tab:focus{border:2px solid #139ff7;border-bottom-color:#d1d1d1;padding:3px 7px;position:relative;z-index:1}a.cke_dialog_tab_selected{background:#fff;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus{border-bottom-color:#fff}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_hc a.cke_dialog_tab:focus{text-decoration:underline}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:16px;width:16px;top:11px;z-index:5;opacity:.7;filter:alpha(opacity = 70)}.cke_rtl .cke_dialog_close_button{left:12px}.cke_ltr .cke_dialog_close_button{right:12px}.cke_hc a.cke_dialog_close_button{background-image:none}.cke_hidpi a.cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}a.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}a.cke_dialog_close_button span{display:none}.cke_hc a.cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%;margin-top:12px}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_tel,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,input.cke_dialog_ui_input_tel,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #bcbcbc;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:2px;min-height:28px;margin-left:1px}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,input.cke_dialog_ui_input_tel:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,input.cke_dialog_ui_input_tel:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:2px solid #139ff7}input.cke_dialog_ui_input_text:focus{padding-left:5px}textarea.cke_dialog_ui_input_textarea:focus{padding:3px 5px}select.cke_dialog_ui_input_select:focus{margin:0;width:100%!important}input.cke_dialog_ui_checkbox_input,input.cke_dialog_ui_radio_input{margin-left:1px;margin-right:2px}input.cke_dialog_ui_checkbox_input:focus,input.cke_dialog_ui_checkbox_input:active,input.cke_dialog_ui_radio_input:focus,input.cke_dialog_ui_radio_input:active{border:0;outline:2px solid #139ff7}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 1px;margin:0;text-align:center;color:#484848;vertical-align:middle;cursor:pointer;border:1px solid #bcbcbc;border-radius:2px;background:#f8f8f8;letter-spacing:.3px;line-height:18px;box-sizing:border-box}.cke_hc a.cke_dialog_ui_button{border-width:3px}span.cke_dialog_ui_button{padding:0 10px;cursor:pointer}a.cke_dialog_ui_button:hover{background:#fff}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border:2px solid #139ff7;outline:0;padding:3px 0}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;background:#09863e;border:1px solid #09863e}.cke_hc a.cke_dialog_ui_button{border:1px solid #bcbcbc}a.cke_dialog_ui_button_ok:hover{background:#53aa78;border-color:#53aa78}a.cke_dialog_ui_button_ok:focus{box-shadow:inset 0 0 0 2px #FFF}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#139ff7}.cke_hc a.cke_dialog_ui_button_ok:hover,.cke_hc a.cke_dialog_ui_button_ok:focus,.cke_hc a.cke_dialog_ui_button_ok:active{border-color:#484848}a.cke_dialog_ui_button_ok.cke_disabled{background:#d1d1d1;border-color:#d1d1d1;cursor:default}a.cke_dialog_ui_button_ok.cke_disabled span{cursor:default}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:28px;line-height:28px;background-color:#fff;border:1px solid #bcbcbc;padding:3px 3px 3px 6px;outline:0;border-radius:2px;margin:0 1px;box-sizing:border-box;width:calc(100% - 2px)!important}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog_ui_labeled_label{margin-left:1px}.cke_dialog_ui_labeled_required{font-weight:bold;font-size:1.2em}.cke_dialog .cke_dark_background{background-color:transparent}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked,.cke_dialog a.cke_btn_reset{margin:2px}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_dialog a.cke_btn_over,.cke_dialog a.cke_btn_locked:hover,.cke_dialog a.cke_btn_locked:focus,.cke_dialog a.cke_btn_locked:active,.cke_dialog a.cke_btn_unlocked:hover,.cke_dialog a.cke_btn_unlocked:focus,.cke_dialog a.cke_btn_unlocked:active,.cke_dialog a.cke_btn_reset:hover,.cke_dialog a.cke_btn_reset:focus,.cke_dialog a.cke_btn_reset:active{cursor:pointer;outline:0;margin:0;border:2px solid #139ff7}.cke_dialog fieldset{border:1px solid #bcbcbc}.cke_dialog fieldset legend{padding:0 6px}.cke_dialog_ui_checkbox,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{display:inline-block}.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{padding-top:5px}.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label{vertical-align:middle}.cke_dialog .ImagePreviewBox{border:1px ridge #bcbcbc;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;cursor:default;letter-spacing:.3px}.cke_dialog_body label+.cke_dialog_ui_labeled_content{margin-top:2px}.cke_dialog_contents_body .cke_dialog_ui_text,.cke_dialog_contents_body .cke_dialog_ui_select,.cke_dialog_contents_body .cke_dialog_ui_hbox_last>a.cke_dialog_ui_button{margin-top:4px}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:2px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_contents_body .cke_accessibility_legend{margin:2px 7px 2px 2px}.cke_dialog_contents_body .cke_accessibility_legend:focus,.cke_dialog_contents_body .cke_accessibility_legend:active{outline:0;border:2px solid #139ff7;margin:0 5px 0 0}.cke_dialog_contents_body input[type=file]:focus,.cke_dialog_contents_body input[type=file]:active{border:2px solid #139ff7}.cke_dialog_find_fieldset{margin-top:10px!important}.cke_dialog_image_ratiolock{margin-top:52px!important}.cke_dialog_forms_select_order label.cke_dialog_ui_labeled_label{margin-left:0}.cke_dialog_forms_select_order div.cke_dialog_ui_input_select{width:100%}.cke_dialog_forms_select_order_txtsize .cke_dialog_ui_hbox_last{padding-top:4px}.cke_dialog_image_url .cke_dialog_ui_hbox_last{vertical-align:bottom}a.cke_dialog_ui_button.cke_dialog_image_browse{margin-top:10px}.cke_dialog_contents_body .cke_tpl_list{border:#bcbcbc 1px solid;margin:1px}.cke_dialog_contents_body .cke_tpl_list:focus,.cke_dialog_contents_body .cke_tpl_list:active{outline:0;margin:0;border:2px solid #139ff7}.cke_dialog_contents_body .cke_tpl_list a:focus,.cke_dialog_contents_body .cke_tpl_list a:active{outline:0}.cke_dialog_contents_body .cke_tpl_list a:focus .cke_tpl_item,.cke_dialog_contents_body .cke_tpl_list a:active .cke_tpl_item{border:2px solid #139ff7;padding:6px} \ No newline at end of file diff --git a/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/dialog_ie.css b/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/dialog_ie.css index 4a9d1b9adda..bbc2fea5696 100644 --- a/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/dialog_ie.css +++ b/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/dialog_ie.css @@ -1,5 +1,5 @@ /* -Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. +Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ -.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#fff}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:12px;cursor:move;position:relative;color:#484848;border-bottom:1px solid #d1d1d1;padding:12px 19px 12px 12px;background:#f8f8f8;letter-spacing:.3px}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border:2px solid rgba(102,102,102,0.2);border-left-color:rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:43px;border-top:1px solid #d1d1d1}.cke_dialog_contents_body{overflow:auto;padding:9px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:33px;display:inline-block;margin:9px 0 0;position:absolute;z-index:2;left:11px}.cke_rtl .cke_dialog_tabs{left:auto;right:11px}a.cke_dialog_tab{height:25px;padding:4px 8px;display:inline-block;cursor:pointer;line-height:26px;outline:0;color:#484848;border:1px solid #d1d1d1;border-radius:3px 3px 0 0;background:#f8f8f8;min-width:90px;text-align:center;margin-left:-1px;letter-spacing:.3px}a.cke_dialog_tab:hover{background-color:#fff}a.cke_dialog_tab:focus{border:2px solid #139ff7;border-bottom-color:#d1d1d1;padding:3px 7px;position:relative;z-index:1}a.cke_dialog_tab_selected{background:#fff;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus{border-bottom-color:#fff}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:16px;width:16px;top:11px;z-index:5;opacity:.7;filter:alpha(opacity = 70)}.cke_rtl .cke_dialog_close_button{left:12px}.cke_ltr .cke_dialog_close_button{right:12px}.cke_hc a.cke_dialog_close_button{background-image:none}.cke_hidpi a.cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}a.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}a.cke_dialog_close_button span{display:none}.cke_hc a.cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%;margin-top:12px}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_tel,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,input.cke_dialog_ui_input_tel,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #bcbcbc;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:2px;min-height:28px;margin-left:1px}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,input.cke_dialog_ui_input_tel:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,input.cke_dialog_ui_input_tel:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:2px solid #139ff7}input.cke_dialog_ui_input_text:focus{padding-left:5px}textarea.cke_dialog_ui_input_textarea:focus{padding:3px 5px}select.cke_dialog_ui_input_select:focus{margin:0;width:100%!important}input.cke_dialog_ui_checkbox_input,input.cke_dialog_ui_radio_input{margin-left:1px;margin-right:2px}input.cke_dialog_ui_checkbox_input:focus,input.cke_dialog_ui_checkbox_input:active,input.cke_dialog_ui_radio_input:focus,input.cke_dialog_ui_radio_input:active{border:0;outline:2px solid #139ff7}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 1px;margin:0;text-align:center;color:#484848;vertical-align:middle;cursor:pointer;border:1px solid #bcbcbc;border-radius:2px;background:#f8f8f8;letter-spacing:.3px;line-height:18px;box-sizing:border-box}.cke_hc a.cke_dialog_ui_button{border-width:3px}span.cke_dialog_ui_button{padding:0 10px;cursor:pointer}a.cke_dialog_ui_button:hover{background:#fff}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border:2px solid #139ff7;outline:0;padding:3px 0}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;background:#09863e;border:1px solid #09863e}.cke_hc a.cke_dialog_ui_button{border:3px solid #bcbcbc}a.cke_dialog_ui_button_ok:hover{background:#53aa78;border-color:#53aa78}a.cke_dialog_ui_button_ok:focus{box-shadow:inset 0 0 0 2px #FFF}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#139ff7}.cke_hc a.cke_dialog_ui_button_ok:hover,.cke_hc a.cke_dialog_ui_button_ok:focus,.cke_hc a.cke_dialog_ui_button_ok:active{border-color:#484848}a.cke_dialog_ui_button_ok.cke_disabled{background:#d1d1d1;border-color:#d1d1d1;cursor:default}a.cke_dialog_ui_button_ok.cke_disabled span{cursor:default}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:28px;line-height:28px;background-color:#fff;border:1px solid #bcbcbc;padding:3px 3px 3px 6px;outline:0;border-radius:2px;margin:0 1px;box-sizing:border-box;width:calc(100% - 2px)!important}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog_ui_labeled_label{margin-left:1px}.cke_dialog .cke_dark_background{background-color:transparent}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked,.cke_dialog a.cke_btn_reset{margin:2px}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_dialog a.cke_btn_over,.cke_dialog a.cke_btn_locked:hover,.cke_dialog a.cke_btn_locked:focus,.cke_dialog a.cke_btn_locked:active,.cke_dialog a.cke_btn_unlocked:hover,.cke_dialog a.cke_btn_unlocked:focus,.cke_dialog a.cke_btn_unlocked:active,.cke_dialog a.cke_btn_reset:hover,.cke_dialog a.cke_btn_reset:focus,.cke_dialog a.cke_btn_reset:active{cursor:pointer;outline:0;margin:0;border:2px solid #139ff7}.cke_dialog fieldset{border:1px solid #bcbcbc}.cke_dialog fieldset legend{padding:0 6px}.cke_dialog_ui_checkbox,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{display:inline-block}.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{padding-top:5px}.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label{vertical-align:middle}.cke_dialog .ImagePreviewBox{border:1px ridge #bcbcbc;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:1px solid #bcbcbc;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;cursor:default;letter-spacing:.3px}.cke_dialog_body label+.cke_dialog_ui_labeled_content{margin-top:2px}.cke_dialog_contents_body .cke_dialog_ui_text,.cke_dialog_contents_body .cke_dialog_ui_select,.cke_dialog_contents_body .cke_dialog_ui_hbox_last>a.cke_dialog_ui_button{margin-top:4px}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:2px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_contents_body .cke_accessibility_legend{margin:2px 7px 2px 2px}.cke_dialog_contents_body .cke_accessibility_legend:focus,.cke_dialog_contents_body .cke_accessibility_legend:active{outline:0;border:2px solid #139ff7;margin:0 5px 0 0}.cke_dialog_contents_body input[type=file]:focus,.cke_dialog_contents_body input[type=file]:active{border:2px solid #139ff7}.cke_dialog_find_fieldset{margin-top:10px!important}.cke_dialog_image_ratiolock{margin-top:52px!important}.cke_dialog_forms_select_order label.cke_dialog_ui_labeled_label{margin-left:0}.cke_dialog_forms_select_order div.cke_dialog_ui_input_select{width:100%}.cke_dialog_forms_select_order_txtsize .cke_dialog_ui_hbox_last{padding-top:4px}.cke_dialog_image_url .cke_dialog_ui_hbox_last,.cke_dialog_flash_url .cke_dialog_ui_hbox_last{vertical-align:bottom}a.cke_dialog_ui_button.cke_dialog_image_browse{margin-top:10px}.cke_dialog_contents_body .cke_tpl_list{border:#bcbcbc 1px solid;margin:1px}.cke_dialog_contents_body .cke_tpl_list:focus,.cke_dialog_contents_body .cke_tpl_list:active{outline:0;margin:0;border:2px solid #139ff7}.cke_dialog_contents_body .cke_tpl_list a:focus,.cke_dialog_contents_body .cke_tpl_list a:active{outline:0}.cke_dialog_contents_body .cke_tpl_list a:focus .cke_tpl_item,.cke_dialog_contents_body .cke_tpl_list a:active .cke_tpl_item{border:2px solid #139ff7;padding:6px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password,.cke_rtl input.cke_dialog_ui_input_tel{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password,.cke_rtl div.cke_dialog_ui_input_tel{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_tel,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0} \ No newline at end of file +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#fff}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:12px;cursor:move;position:relative;color:#484848;border-bottom:1px solid #d1d1d1;padding:12px 19px 12px 12px;background:#f8f8f8;letter-spacing:.3px}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border:2px solid rgba(102,102,102,0.2);border-left-color:rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:43px;border-top:1px solid #d1d1d1}.cke_dialog_contents_body{overflow:auto;padding:9px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:33px;display:inline-block;margin:9px 0 0;position:absolute;z-index:2;left:11px}.cke_rtl .cke_dialog_tabs{left:auto;right:11px}a.cke_dialog_tab{height:25px;padding:4px 8px;display:inline-block;cursor:pointer;line-height:26px;outline:0;color:#484848;border:1px solid #d1d1d1;border-radius:3px 3px 0 0;background:#f8f8f8;min-width:90px;text-align:center;margin-left:-1px;letter-spacing:.3px}a.cke_dialog_tab:hover{background-color:#fff}a.cke_dialog_tab:focus{border:2px solid #139ff7;border-bottom-color:#d1d1d1;padding:3px 7px;position:relative;z-index:1}a.cke_dialog_tab_selected{background:#fff;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus{border-bottom-color:#fff}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_hc a.cke_dialog_tab:focus{text-decoration:underline}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:16px;width:16px;top:11px;z-index:5;opacity:.7;filter:alpha(opacity = 70)}.cke_rtl .cke_dialog_close_button{left:12px}.cke_ltr .cke_dialog_close_button{right:12px}.cke_hc a.cke_dialog_close_button{background-image:none}.cke_hidpi a.cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}a.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}a.cke_dialog_close_button span{display:none}.cke_hc a.cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%;margin-top:12px}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_tel,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,input.cke_dialog_ui_input_tel,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #bcbcbc;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:2px;min-height:28px;margin-left:1px}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,input.cke_dialog_ui_input_tel:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,input.cke_dialog_ui_input_tel:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:2px solid #139ff7}input.cke_dialog_ui_input_text:focus{padding-left:5px}textarea.cke_dialog_ui_input_textarea:focus{padding:3px 5px}select.cke_dialog_ui_input_select:focus{margin:0;width:100%!important}input.cke_dialog_ui_checkbox_input,input.cke_dialog_ui_radio_input{margin-left:1px;margin-right:2px}input.cke_dialog_ui_checkbox_input:focus,input.cke_dialog_ui_checkbox_input:active,input.cke_dialog_ui_radio_input:focus,input.cke_dialog_ui_radio_input:active{border:0;outline:2px solid #139ff7}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 1px;margin:0;text-align:center;color:#484848;vertical-align:middle;cursor:pointer;border:1px solid #bcbcbc;border-radius:2px;background:#f8f8f8;letter-spacing:.3px;line-height:18px;box-sizing:border-box}.cke_hc a.cke_dialog_ui_button{border-width:3px}span.cke_dialog_ui_button{padding:0 10px;cursor:pointer}a.cke_dialog_ui_button:hover{background:#fff}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border:2px solid #139ff7;outline:0;padding:3px 0}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;background:#09863e;border:1px solid #09863e}.cke_hc a.cke_dialog_ui_button{border:1px solid #bcbcbc}a.cke_dialog_ui_button_ok:hover{background:#53aa78;border-color:#53aa78}a.cke_dialog_ui_button_ok:focus{box-shadow:inset 0 0 0 2px #FFF}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#139ff7}.cke_hc a.cke_dialog_ui_button_ok:hover,.cke_hc a.cke_dialog_ui_button_ok:focus,.cke_hc a.cke_dialog_ui_button_ok:active{border-color:#484848}a.cke_dialog_ui_button_ok.cke_disabled{background:#d1d1d1;border-color:#d1d1d1;cursor:default}a.cke_dialog_ui_button_ok.cke_disabled span{cursor:default}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:28px;line-height:28px;background-color:#fff;border:1px solid #bcbcbc;padding:3px 3px 3px 6px;outline:0;border-radius:2px;margin:0 1px;box-sizing:border-box;width:calc(100% - 2px)!important}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog_ui_labeled_label{margin-left:1px}.cke_dialog_ui_labeled_required{font-weight:bold;font-size:1.2em}.cke_dialog .cke_dark_background{background-color:transparent}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked,.cke_dialog a.cke_btn_reset{margin:2px}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_dialog a.cke_btn_over,.cke_dialog a.cke_btn_locked:hover,.cke_dialog a.cke_btn_locked:focus,.cke_dialog a.cke_btn_locked:active,.cke_dialog a.cke_btn_unlocked:hover,.cke_dialog a.cke_btn_unlocked:focus,.cke_dialog a.cke_btn_unlocked:active,.cke_dialog a.cke_btn_reset:hover,.cke_dialog a.cke_btn_reset:focus,.cke_dialog a.cke_btn_reset:active{cursor:pointer;outline:0;margin:0;border:2px solid #139ff7}.cke_dialog fieldset{border:1px solid #bcbcbc}.cke_dialog fieldset legend{padding:0 6px}.cke_dialog_ui_checkbox,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{display:inline-block}.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{padding-top:5px}.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label{vertical-align:middle}.cke_dialog .ImagePreviewBox{border:1px ridge #bcbcbc;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;cursor:default;letter-spacing:.3px}.cke_dialog_body label+.cke_dialog_ui_labeled_content{margin-top:2px}.cke_dialog_contents_body .cke_dialog_ui_text,.cke_dialog_contents_body .cke_dialog_ui_select,.cke_dialog_contents_body .cke_dialog_ui_hbox_last>a.cke_dialog_ui_button{margin-top:4px}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:2px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_contents_body .cke_accessibility_legend{margin:2px 7px 2px 2px}.cke_dialog_contents_body .cke_accessibility_legend:focus,.cke_dialog_contents_body .cke_accessibility_legend:active{outline:0;border:2px solid #139ff7;margin:0 5px 0 0}.cke_dialog_contents_body input[type=file]:focus,.cke_dialog_contents_body input[type=file]:active{border:2px solid #139ff7}.cke_dialog_find_fieldset{margin-top:10px!important}.cke_dialog_image_ratiolock{margin-top:52px!important}.cke_dialog_forms_select_order label.cke_dialog_ui_labeled_label{margin-left:0}.cke_dialog_forms_select_order div.cke_dialog_ui_input_select{width:100%}.cke_dialog_forms_select_order_txtsize .cke_dialog_ui_hbox_last{padding-top:4px}.cke_dialog_image_url .cke_dialog_ui_hbox_last{vertical-align:bottom}a.cke_dialog_ui_button.cke_dialog_image_browse{margin-top:10px}.cke_dialog_contents_body .cke_tpl_list{border:#bcbcbc 1px solid;margin:1px}.cke_dialog_contents_body .cke_tpl_list:focus,.cke_dialog_contents_body .cke_tpl_list:active{outline:0;margin:0;border:2px solid #139ff7}.cke_dialog_contents_body .cke_tpl_list a:focus,.cke_dialog_contents_body .cke_tpl_list a:active{outline:0}.cke_dialog_contents_body .cke_tpl_list a:focus .cke_tpl_item,.cke_dialog_contents_body .cke_tpl_list a:active .cke_tpl_item{border:2px solid #139ff7;padding:6px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password,.cke_rtl input.cke_dialog_ui_input_tel{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password,.cke_rtl div.cke_dialog_ui_input_tel{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_tel,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0} \ No newline at end of file diff --git a/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/dialog_ie8.css b/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/dialog_ie8.css index 625d1349b8a..8627bc8b458 100644 --- a/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/dialog_ie8.css +++ b/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/dialog_ie8.css @@ -1,5 +1,5 @@ /* -Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. +Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ -.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#fff}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:12px;cursor:move;position:relative;color:#484848;border-bottom:1px solid #d1d1d1;padding:12px 19px 12px 12px;background:#f8f8f8;letter-spacing:.3px}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border:2px solid rgba(102,102,102,0.2);border-left-color:rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:43px;border-top:1px solid #d1d1d1}.cke_dialog_contents_body{overflow:auto;padding:9px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:33px;display:inline-block;margin:9px 0 0;position:absolute;z-index:2;left:11px}.cke_rtl .cke_dialog_tabs{left:auto;right:11px}a.cke_dialog_tab{height:25px;padding:4px 8px;display:inline-block;cursor:pointer;line-height:26px;outline:0;color:#484848;border:1px solid #d1d1d1;border-radius:3px 3px 0 0;background:#f8f8f8;min-width:90px;text-align:center;margin-left:-1px;letter-spacing:.3px}a.cke_dialog_tab:hover{background-color:#fff}a.cke_dialog_tab:focus{border:2px solid #139ff7;border-bottom-color:#d1d1d1;padding:3px 7px;position:relative;z-index:1}a.cke_dialog_tab_selected{background:#fff;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus{border-bottom-color:#fff}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:16px;width:16px;top:11px;z-index:5;opacity:.7;filter:alpha(opacity = 70)}.cke_rtl .cke_dialog_close_button{left:12px}.cke_ltr .cke_dialog_close_button{right:12px}.cke_hc a.cke_dialog_close_button{background-image:none}.cke_hidpi a.cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}a.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}a.cke_dialog_close_button span{display:none}.cke_hc a.cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%;margin-top:12px}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_tel,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,input.cke_dialog_ui_input_tel,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #bcbcbc;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:2px;min-height:28px;margin-left:1px}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,input.cke_dialog_ui_input_tel:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,input.cke_dialog_ui_input_tel:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:2px solid #139ff7}input.cke_dialog_ui_input_text:focus{padding-left:5px}textarea.cke_dialog_ui_input_textarea:focus{padding:3px 5px}select.cke_dialog_ui_input_select:focus{margin:0;width:100%!important}input.cke_dialog_ui_checkbox_input,input.cke_dialog_ui_radio_input{margin-left:1px;margin-right:2px}input.cke_dialog_ui_checkbox_input:focus,input.cke_dialog_ui_checkbox_input:active,input.cke_dialog_ui_radio_input:focus,input.cke_dialog_ui_radio_input:active{border:0;outline:2px solid #139ff7}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 1px;margin:0;text-align:center;color:#484848;vertical-align:middle;cursor:pointer;border:1px solid #bcbcbc;border-radius:2px;background:#f8f8f8;letter-spacing:.3px;line-height:18px;box-sizing:border-box}.cke_hc a.cke_dialog_ui_button{border-width:3px}span.cke_dialog_ui_button{padding:0 10px;cursor:pointer}a.cke_dialog_ui_button:hover{background:#fff}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border:2px solid #139ff7;outline:0;padding:3px 0}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;background:#09863e;border:1px solid #09863e}.cke_hc a.cke_dialog_ui_button{border:3px solid #bcbcbc}a.cke_dialog_ui_button_ok:hover{background:#53aa78;border-color:#53aa78}a.cke_dialog_ui_button_ok:focus{box-shadow:inset 0 0 0 2px #FFF}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#139ff7}.cke_hc a.cke_dialog_ui_button_ok:hover,.cke_hc a.cke_dialog_ui_button_ok:focus,.cke_hc a.cke_dialog_ui_button_ok:active{border-color:#484848}a.cke_dialog_ui_button_ok.cke_disabled{background:#d1d1d1;border-color:#d1d1d1;cursor:default}a.cke_dialog_ui_button_ok.cke_disabled span{cursor:default}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:28px;line-height:28px;background-color:#fff;border:1px solid #bcbcbc;padding:3px 3px 3px 6px;outline:0;border-radius:2px;margin:0 1px;box-sizing:border-box;width:calc(100% - 2px)!important}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog_ui_labeled_label{margin-left:1px}.cke_dialog .cke_dark_background{background-color:transparent}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked,.cke_dialog a.cke_btn_reset{margin:2px}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_dialog a.cke_btn_over,.cke_dialog a.cke_btn_locked:hover,.cke_dialog a.cke_btn_locked:focus,.cke_dialog a.cke_btn_locked:active,.cke_dialog a.cke_btn_unlocked:hover,.cke_dialog a.cke_btn_unlocked:focus,.cke_dialog a.cke_btn_unlocked:active,.cke_dialog a.cke_btn_reset:hover,.cke_dialog a.cke_btn_reset:focus,.cke_dialog a.cke_btn_reset:active{cursor:pointer;outline:0;margin:0;border:2px solid #139ff7}.cke_dialog fieldset{border:1px solid #bcbcbc}.cke_dialog fieldset legend{padding:0 6px}.cke_dialog_ui_checkbox,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{display:inline-block}.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{padding-top:5px}.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label{vertical-align:middle}.cke_dialog .ImagePreviewBox{border:1px ridge #bcbcbc;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:1px solid #bcbcbc;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;cursor:default;letter-spacing:.3px}.cke_dialog_body label+.cke_dialog_ui_labeled_content{margin-top:2px}.cke_dialog_contents_body .cke_dialog_ui_text,.cke_dialog_contents_body .cke_dialog_ui_select,.cke_dialog_contents_body .cke_dialog_ui_hbox_last>a.cke_dialog_ui_button{margin-top:4px}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:2px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_contents_body .cke_accessibility_legend{margin:2px 7px 2px 2px}.cke_dialog_contents_body .cke_accessibility_legend:focus,.cke_dialog_contents_body .cke_accessibility_legend:active{outline:0;border:2px solid #139ff7;margin:0 5px 0 0}.cke_dialog_contents_body input[type=file]:focus,.cke_dialog_contents_body input[type=file]:active{border:2px solid #139ff7}.cke_dialog_find_fieldset{margin-top:10px!important}.cke_dialog_image_ratiolock{margin-top:52px!important}.cke_dialog_forms_select_order label.cke_dialog_ui_labeled_label{margin-left:0}.cke_dialog_forms_select_order div.cke_dialog_ui_input_select{width:100%}.cke_dialog_forms_select_order_txtsize .cke_dialog_ui_hbox_last{padding-top:4px}.cke_dialog_image_url .cke_dialog_ui_hbox_last,.cke_dialog_flash_url .cke_dialog_ui_hbox_last{vertical-align:bottom}a.cke_dialog_ui_button.cke_dialog_image_browse{margin-top:10px}.cke_dialog_contents_body .cke_tpl_list{border:#bcbcbc 1px solid;margin:1px}.cke_dialog_contents_body .cke_tpl_list:focus,.cke_dialog_contents_body .cke_tpl_list:active{outline:0;margin:0;border:2px solid #139ff7}.cke_dialog_contents_body .cke_tpl_list a:focus,.cke_dialog_contents_body .cke_tpl_list a:active{outline:0}.cke_dialog_contents_body .cke_tpl_list a:focus .cke_tpl_item,.cke_dialog_contents_body .cke_tpl_list a:active .cke_tpl_item{border:2px solid #139ff7;padding:6px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password,.cke_rtl input.cke_dialog_ui_input_tel{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password,.cke_rtl div.cke_dialog_ui_input_tel{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_tel,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}a.cke_dialog_ui_button{min-height:18px}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,input.cke_dialog_ui_input_tel,textarea.cke_dialog_ui_input_textarea{min-height:18px}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,input.cke_dialog_ui_input_tel:focus,textarea.cke_dialog_ui_input_textarea:focus{padding-top:4px;padding-bottom:2px}select.cke_dialog_ui_input_select{width:100%!important}select.cke_dialog_ui_input_select:focus{margin-left:1px;width:100%!important;padding-top:2px;padding-bottom:2px} \ No newline at end of file +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#fff}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:12px;cursor:move;position:relative;color:#484848;border-bottom:1px solid #d1d1d1;padding:12px 19px 12px 12px;background:#f8f8f8;letter-spacing:.3px}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border:2px solid rgba(102,102,102,0.2);border-left-color:rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:43px;border-top:1px solid #d1d1d1}.cke_dialog_contents_body{overflow:auto;padding:9px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:33px;display:inline-block;margin:9px 0 0;position:absolute;z-index:2;left:11px}.cke_rtl .cke_dialog_tabs{left:auto;right:11px}a.cke_dialog_tab{height:25px;padding:4px 8px;display:inline-block;cursor:pointer;line-height:26px;outline:0;color:#484848;border:1px solid #d1d1d1;border-radius:3px 3px 0 0;background:#f8f8f8;min-width:90px;text-align:center;margin-left:-1px;letter-spacing:.3px}a.cke_dialog_tab:hover{background-color:#fff}a.cke_dialog_tab:focus{border:2px solid #139ff7;border-bottom-color:#d1d1d1;padding:3px 7px;position:relative;z-index:1}a.cke_dialog_tab_selected{background:#fff;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus{border-bottom-color:#fff}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_hc a.cke_dialog_tab:focus{text-decoration:underline}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:16px;width:16px;top:11px;z-index:5;opacity:.7;filter:alpha(opacity = 70)}.cke_rtl .cke_dialog_close_button{left:12px}.cke_ltr .cke_dialog_close_button{right:12px}.cke_hc a.cke_dialog_close_button{background-image:none}.cke_hidpi a.cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}a.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}a.cke_dialog_close_button span{display:none}.cke_hc a.cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%;margin-top:12px}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_tel,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,input.cke_dialog_ui_input_tel,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #bcbcbc;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:2px;min-height:28px;margin-left:1px}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,input.cke_dialog_ui_input_tel:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,input.cke_dialog_ui_input_tel:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:2px solid #139ff7}input.cke_dialog_ui_input_text:focus{padding-left:5px}textarea.cke_dialog_ui_input_textarea:focus{padding:3px 5px}select.cke_dialog_ui_input_select:focus{margin:0;width:100%!important}input.cke_dialog_ui_checkbox_input,input.cke_dialog_ui_radio_input{margin-left:1px;margin-right:2px}input.cke_dialog_ui_checkbox_input:focus,input.cke_dialog_ui_checkbox_input:active,input.cke_dialog_ui_radio_input:focus,input.cke_dialog_ui_radio_input:active{border:0;outline:2px solid #139ff7}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 1px;margin:0;text-align:center;color:#484848;vertical-align:middle;cursor:pointer;border:1px solid #bcbcbc;border-radius:2px;background:#f8f8f8;letter-spacing:.3px;line-height:18px;box-sizing:border-box}.cke_hc a.cke_dialog_ui_button{border-width:3px}span.cke_dialog_ui_button{padding:0 10px;cursor:pointer}a.cke_dialog_ui_button:hover{background:#fff}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border:2px solid #139ff7;outline:0;padding:3px 0}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;background:#09863e;border:1px solid #09863e}.cke_hc a.cke_dialog_ui_button{border:1px solid #bcbcbc}a.cke_dialog_ui_button_ok:hover{background:#53aa78;border-color:#53aa78}a.cke_dialog_ui_button_ok:focus{box-shadow:inset 0 0 0 2px #FFF}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#139ff7}.cke_hc a.cke_dialog_ui_button_ok:hover,.cke_hc a.cke_dialog_ui_button_ok:focus,.cke_hc a.cke_dialog_ui_button_ok:active{border-color:#484848}a.cke_dialog_ui_button_ok.cke_disabled{background:#d1d1d1;border-color:#d1d1d1;cursor:default}a.cke_dialog_ui_button_ok.cke_disabled span{cursor:default}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:28px;line-height:28px;background-color:#fff;border:1px solid #bcbcbc;padding:3px 3px 3px 6px;outline:0;border-radius:2px;margin:0 1px;box-sizing:border-box;width:calc(100% - 2px)!important}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog_ui_labeled_label{margin-left:1px}.cke_dialog_ui_labeled_required{font-weight:bold;font-size:1.2em}.cke_dialog .cke_dark_background{background-color:transparent}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked,.cke_dialog a.cke_btn_reset{margin:2px}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_dialog a.cke_btn_over,.cke_dialog a.cke_btn_locked:hover,.cke_dialog a.cke_btn_locked:focus,.cke_dialog a.cke_btn_locked:active,.cke_dialog a.cke_btn_unlocked:hover,.cke_dialog a.cke_btn_unlocked:focus,.cke_dialog a.cke_btn_unlocked:active,.cke_dialog a.cke_btn_reset:hover,.cke_dialog a.cke_btn_reset:focus,.cke_dialog a.cke_btn_reset:active{cursor:pointer;outline:0;margin:0;border:2px solid #139ff7}.cke_dialog fieldset{border:1px solid #bcbcbc}.cke_dialog fieldset legend{padding:0 6px}.cke_dialog_ui_checkbox,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{display:inline-block}.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{padding-top:5px}.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label{vertical-align:middle}.cke_dialog .ImagePreviewBox{border:1px ridge #bcbcbc;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;cursor:default;letter-spacing:.3px}.cke_dialog_body label+.cke_dialog_ui_labeled_content{margin-top:2px}.cke_dialog_contents_body .cke_dialog_ui_text,.cke_dialog_contents_body .cke_dialog_ui_select,.cke_dialog_contents_body .cke_dialog_ui_hbox_last>a.cke_dialog_ui_button{margin-top:4px}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:2px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_contents_body .cke_accessibility_legend{margin:2px 7px 2px 2px}.cke_dialog_contents_body .cke_accessibility_legend:focus,.cke_dialog_contents_body .cke_accessibility_legend:active{outline:0;border:2px solid #139ff7;margin:0 5px 0 0}.cke_dialog_contents_body input[type=file]:focus,.cke_dialog_contents_body input[type=file]:active{border:2px solid #139ff7}.cke_dialog_find_fieldset{margin-top:10px!important}.cke_dialog_image_ratiolock{margin-top:52px!important}.cke_dialog_forms_select_order label.cke_dialog_ui_labeled_label{margin-left:0}.cke_dialog_forms_select_order div.cke_dialog_ui_input_select{width:100%}.cke_dialog_forms_select_order_txtsize .cke_dialog_ui_hbox_last{padding-top:4px}.cke_dialog_image_url .cke_dialog_ui_hbox_last{vertical-align:bottom}a.cke_dialog_ui_button.cke_dialog_image_browse{margin-top:10px}.cke_dialog_contents_body .cke_tpl_list{border:#bcbcbc 1px solid;margin:1px}.cke_dialog_contents_body .cke_tpl_list:focus,.cke_dialog_contents_body .cke_tpl_list:active{outline:0;margin:0;border:2px solid #139ff7}.cke_dialog_contents_body .cke_tpl_list a:focus,.cke_dialog_contents_body .cke_tpl_list a:active{outline:0}.cke_dialog_contents_body .cke_tpl_list a:focus .cke_tpl_item,.cke_dialog_contents_body .cke_tpl_list a:active .cke_tpl_item{border:2px solid #139ff7;padding:6px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password,.cke_rtl input.cke_dialog_ui_input_tel{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password,.cke_rtl div.cke_dialog_ui_input_tel{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_tel,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}a.cke_dialog_ui_button{min-height:18px}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,input.cke_dialog_ui_input_tel,textarea.cke_dialog_ui_input_textarea{min-height:18px}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,input.cke_dialog_ui_input_tel:focus,textarea.cke_dialog_ui_input_textarea:focus{padding-top:4px;padding-bottom:2px}select.cke_dialog_ui_input_select{width:100%!important}select.cke_dialog_ui_input_select:focus{margin-left:1px;width:100%!important;padding-top:2px;padding-bottom:2px} \ No newline at end of file diff --git a/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/dialog_iequirks.css b/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/dialog_iequirks.css index c634bfae056..a9a450db99a 100644 --- a/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/dialog_iequirks.css +++ b/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/dialog_iequirks.css @@ -1,5 +1,5 @@ /* -Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. +Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ -.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#fff}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:12px;cursor:move;position:relative;color:#484848;border-bottom:1px solid #d1d1d1;padding:12px 19px 12px 12px;background:#f8f8f8;letter-spacing:.3px}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border:2px solid rgba(102,102,102,0.2);border-left-color:rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:43px;border-top:1px solid #d1d1d1}.cke_dialog_contents_body{overflow:auto;padding:9px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:33px;display:inline-block;margin:9px 0 0;position:absolute;z-index:2;left:11px}.cke_rtl .cke_dialog_tabs{left:auto;right:11px}a.cke_dialog_tab{height:25px;padding:4px 8px;display:inline-block;cursor:pointer;line-height:26px;outline:0;color:#484848;border:1px solid #d1d1d1;border-radius:3px 3px 0 0;background:#f8f8f8;min-width:90px;text-align:center;margin-left:-1px;letter-spacing:.3px}a.cke_dialog_tab:hover{background-color:#fff}a.cke_dialog_tab:focus{border:2px solid #139ff7;border-bottom-color:#d1d1d1;padding:3px 7px;position:relative;z-index:1}a.cke_dialog_tab_selected{background:#fff;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus{border-bottom-color:#fff}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:16px;width:16px;top:11px;z-index:5;opacity:.7;filter:alpha(opacity = 70)}.cke_rtl .cke_dialog_close_button{left:12px}.cke_ltr .cke_dialog_close_button{right:12px}.cke_hc a.cke_dialog_close_button{background-image:none}.cke_hidpi a.cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}a.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}a.cke_dialog_close_button span{display:none}.cke_hc a.cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%;margin-top:12px}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_tel,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,input.cke_dialog_ui_input_tel,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #bcbcbc;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:2px;min-height:28px;margin-left:1px}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,input.cke_dialog_ui_input_tel:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,input.cke_dialog_ui_input_tel:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:2px solid #139ff7}input.cke_dialog_ui_input_text:focus{padding-left:5px}textarea.cke_dialog_ui_input_textarea:focus{padding:3px 5px}select.cke_dialog_ui_input_select:focus{margin:0;width:100%!important}input.cke_dialog_ui_checkbox_input,input.cke_dialog_ui_radio_input{margin-left:1px;margin-right:2px}input.cke_dialog_ui_checkbox_input:focus,input.cke_dialog_ui_checkbox_input:active,input.cke_dialog_ui_radio_input:focus,input.cke_dialog_ui_radio_input:active{border:0;outline:2px solid #139ff7}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 1px;margin:0;text-align:center;color:#484848;vertical-align:middle;cursor:pointer;border:1px solid #bcbcbc;border-radius:2px;background:#f8f8f8;letter-spacing:.3px;line-height:18px;box-sizing:border-box}.cke_hc a.cke_dialog_ui_button{border-width:3px}span.cke_dialog_ui_button{padding:0 10px;cursor:pointer}a.cke_dialog_ui_button:hover{background:#fff}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border:2px solid #139ff7;outline:0;padding:3px 0}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;background:#09863e;border:1px solid #09863e}.cke_hc a.cke_dialog_ui_button{border:3px solid #bcbcbc}a.cke_dialog_ui_button_ok:hover{background:#53aa78;border-color:#53aa78}a.cke_dialog_ui_button_ok:focus{box-shadow:inset 0 0 0 2px #FFF}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#139ff7}.cke_hc a.cke_dialog_ui_button_ok:hover,.cke_hc a.cke_dialog_ui_button_ok:focus,.cke_hc a.cke_dialog_ui_button_ok:active{border-color:#484848}a.cke_dialog_ui_button_ok.cke_disabled{background:#d1d1d1;border-color:#d1d1d1;cursor:default}a.cke_dialog_ui_button_ok.cke_disabled span{cursor:default}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:28px;line-height:28px;background-color:#fff;border:1px solid #bcbcbc;padding:3px 3px 3px 6px;outline:0;border-radius:2px;margin:0 1px;box-sizing:border-box;width:calc(100% - 2px)!important}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog_ui_labeled_label{margin-left:1px}.cke_dialog .cke_dark_background{background-color:transparent}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked,.cke_dialog a.cke_btn_reset{margin:2px}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_dialog a.cke_btn_over,.cke_dialog a.cke_btn_locked:hover,.cke_dialog a.cke_btn_locked:focus,.cke_dialog a.cke_btn_locked:active,.cke_dialog a.cke_btn_unlocked:hover,.cke_dialog a.cke_btn_unlocked:focus,.cke_dialog a.cke_btn_unlocked:active,.cke_dialog a.cke_btn_reset:hover,.cke_dialog a.cke_btn_reset:focus,.cke_dialog a.cke_btn_reset:active{cursor:pointer;outline:0;margin:0;border:2px solid #139ff7}.cke_dialog fieldset{border:1px solid #bcbcbc}.cke_dialog fieldset legend{padding:0 6px}.cke_dialog_ui_checkbox,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{display:inline-block}.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{padding-top:5px}.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label{vertical-align:middle}.cke_dialog .ImagePreviewBox{border:1px ridge #bcbcbc;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:1px solid #bcbcbc;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;cursor:default;letter-spacing:.3px}.cke_dialog_body label+.cke_dialog_ui_labeled_content{margin-top:2px}.cke_dialog_contents_body .cke_dialog_ui_text,.cke_dialog_contents_body .cke_dialog_ui_select,.cke_dialog_contents_body .cke_dialog_ui_hbox_last>a.cke_dialog_ui_button{margin-top:4px}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:2px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_contents_body .cke_accessibility_legend{margin:2px 7px 2px 2px}.cke_dialog_contents_body .cke_accessibility_legend:focus,.cke_dialog_contents_body .cke_accessibility_legend:active{outline:0;border:2px solid #139ff7;margin:0 5px 0 0}.cke_dialog_contents_body input[type=file]:focus,.cke_dialog_contents_body input[type=file]:active{border:2px solid #139ff7}.cke_dialog_find_fieldset{margin-top:10px!important}.cke_dialog_image_ratiolock{margin-top:52px!important}.cke_dialog_forms_select_order label.cke_dialog_ui_labeled_label{margin-left:0}.cke_dialog_forms_select_order div.cke_dialog_ui_input_select{width:100%}.cke_dialog_forms_select_order_txtsize .cke_dialog_ui_hbox_last{padding-top:4px}.cke_dialog_image_url .cke_dialog_ui_hbox_last,.cke_dialog_flash_url .cke_dialog_ui_hbox_last{vertical-align:bottom}a.cke_dialog_ui_button.cke_dialog_image_browse{margin-top:10px}.cke_dialog_contents_body .cke_tpl_list{border:#bcbcbc 1px solid;margin:1px}.cke_dialog_contents_body .cke_tpl_list:focus,.cke_dialog_contents_body .cke_tpl_list:active{outline:0;margin:0;border:2px solid #139ff7}.cke_dialog_contents_body .cke_tpl_list a:focus,.cke_dialog_contents_body .cke_tpl_list a:active{outline:0}.cke_dialog_contents_body .cke_tpl_list a:focus .cke_tpl_item,.cke_dialog_contents_body .cke_tpl_list a:active .cke_tpl_item{border:2px solid #139ff7;padding:6px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password,.cke_rtl input.cke_dialog_ui_input_tel{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password,.cke_rtl div.cke_dialog_ui_input_tel{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_tel,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_footer{filter:""} \ No newline at end of file +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#fff}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:12px;cursor:move;position:relative;color:#484848;border-bottom:1px solid #d1d1d1;padding:12px 19px 12px 12px;background:#f8f8f8;letter-spacing:.3px}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border:2px solid rgba(102,102,102,0.2);border-left-color:rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:43px;border-top:1px solid #d1d1d1}.cke_dialog_contents_body{overflow:auto;padding:9px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:33px;display:inline-block;margin:9px 0 0;position:absolute;z-index:2;left:11px}.cke_rtl .cke_dialog_tabs{left:auto;right:11px}a.cke_dialog_tab{height:25px;padding:4px 8px;display:inline-block;cursor:pointer;line-height:26px;outline:0;color:#484848;border:1px solid #d1d1d1;border-radius:3px 3px 0 0;background:#f8f8f8;min-width:90px;text-align:center;margin-left:-1px;letter-spacing:.3px}a.cke_dialog_tab:hover{background-color:#fff}a.cke_dialog_tab:focus{border:2px solid #139ff7;border-bottom-color:#d1d1d1;padding:3px 7px;position:relative;z-index:1}a.cke_dialog_tab_selected{background:#fff;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus{border-bottom-color:#fff}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_hc a.cke_dialog_tab:focus{text-decoration:underline}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:16px;width:16px;top:11px;z-index:5;opacity:.7;filter:alpha(opacity = 70)}.cke_rtl .cke_dialog_close_button{left:12px}.cke_ltr .cke_dialog_close_button{right:12px}.cke_hc a.cke_dialog_close_button{background-image:none}.cke_hidpi a.cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}a.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}a.cke_dialog_close_button span{display:none}.cke_hc a.cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%;margin-top:12px}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_tel,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,input.cke_dialog_ui_input_tel,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #bcbcbc;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:2px;min-height:28px;margin-left:1px}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,input.cke_dialog_ui_input_tel:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,input.cke_dialog_ui_input_tel:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:2px solid #139ff7}input.cke_dialog_ui_input_text:focus{padding-left:5px}textarea.cke_dialog_ui_input_textarea:focus{padding:3px 5px}select.cke_dialog_ui_input_select:focus{margin:0;width:100%!important}input.cke_dialog_ui_checkbox_input,input.cke_dialog_ui_radio_input{margin-left:1px;margin-right:2px}input.cke_dialog_ui_checkbox_input:focus,input.cke_dialog_ui_checkbox_input:active,input.cke_dialog_ui_radio_input:focus,input.cke_dialog_ui_radio_input:active{border:0;outline:2px solid #139ff7}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 1px;margin:0;text-align:center;color:#484848;vertical-align:middle;cursor:pointer;border:1px solid #bcbcbc;border-radius:2px;background:#f8f8f8;letter-spacing:.3px;line-height:18px;box-sizing:border-box}.cke_hc a.cke_dialog_ui_button{border-width:3px}span.cke_dialog_ui_button{padding:0 10px;cursor:pointer}a.cke_dialog_ui_button:hover{background:#fff}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border:2px solid #139ff7;outline:0;padding:3px 0}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;background:#09863e;border:1px solid #09863e}.cke_hc a.cke_dialog_ui_button{border:1px solid #bcbcbc}a.cke_dialog_ui_button_ok:hover{background:#53aa78;border-color:#53aa78}a.cke_dialog_ui_button_ok:focus{box-shadow:inset 0 0 0 2px #FFF}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#139ff7}.cke_hc a.cke_dialog_ui_button_ok:hover,.cke_hc a.cke_dialog_ui_button_ok:focus,.cke_hc a.cke_dialog_ui_button_ok:active{border-color:#484848}a.cke_dialog_ui_button_ok.cke_disabled{background:#d1d1d1;border-color:#d1d1d1;cursor:default}a.cke_dialog_ui_button_ok.cke_disabled span{cursor:default}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:28px;line-height:28px;background-color:#fff;border:1px solid #bcbcbc;padding:3px 3px 3px 6px;outline:0;border-radius:2px;margin:0 1px;box-sizing:border-box;width:calc(100% - 2px)!important}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog_ui_labeled_label{margin-left:1px}.cke_dialog_ui_labeled_required{font-weight:bold;font-size:1.2em}.cke_dialog .cke_dark_background{background-color:transparent}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked,.cke_dialog a.cke_btn_reset{margin:2px}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_dialog a.cke_btn_over,.cke_dialog a.cke_btn_locked:hover,.cke_dialog a.cke_btn_locked:focus,.cke_dialog a.cke_btn_locked:active,.cke_dialog a.cke_btn_unlocked:hover,.cke_dialog a.cke_btn_unlocked:focus,.cke_dialog a.cke_btn_unlocked:active,.cke_dialog a.cke_btn_reset:hover,.cke_dialog a.cke_btn_reset:focus,.cke_dialog a.cke_btn_reset:active{cursor:pointer;outline:0;margin:0;border:2px solid #139ff7}.cke_dialog fieldset{border:1px solid #bcbcbc}.cke_dialog fieldset legend{padding:0 6px}.cke_dialog_ui_checkbox,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{display:inline-block}.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{padding-top:5px}.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label{vertical-align:middle}.cke_dialog .ImagePreviewBox{border:1px ridge #bcbcbc;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;cursor:default;letter-spacing:.3px}.cke_dialog_body label+.cke_dialog_ui_labeled_content{margin-top:2px}.cke_dialog_contents_body .cke_dialog_ui_text,.cke_dialog_contents_body .cke_dialog_ui_select,.cke_dialog_contents_body .cke_dialog_ui_hbox_last>a.cke_dialog_ui_button{margin-top:4px}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:2px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_contents_body .cke_accessibility_legend{margin:2px 7px 2px 2px}.cke_dialog_contents_body .cke_accessibility_legend:focus,.cke_dialog_contents_body .cke_accessibility_legend:active{outline:0;border:2px solid #139ff7;margin:0 5px 0 0}.cke_dialog_contents_body input[type=file]:focus,.cke_dialog_contents_body input[type=file]:active{border:2px solid #139ff7}.cke_dialog_find_fieldset{margin-top:10px!important}.cke_dialog_image_ratiolock{margin-top:52px!important}.cke_dialog_forms_select_order label.cke_dialog_ui_labeled_label{margin-left:0}.cke_dialog_forms_select_order div.cke_dialog_ui_input_select{width:100%}.cke_dialog_forms_select_order_txtsize .cke_dialog_ui_hbox_last{padding-top:4px}.cke_dialog_image_url .cke_dialog_ui_hbox_last{vertical-align:bottom}a.cke_dialog_ui_button.cke_dialog_image_browse{margin-top:10px}.cke_dialog_contents_body .cke_tpl_list{border:#bcbcbc 1px solid;margin:1px}.cke_dialog_contents_body .cke_tpl_list:focus,.cke_dialog_contents_body .cke_tpl_list:active{outline:0;margin:0;border:2px solid #139ff7}.cke_dialog_contents_body .cke_tpl_list a:focus,.cke_dialog_contents_body .cke_tpl_list a:active{outline:0}.cke_dialog_contents_body .cke_tpl_list a:focus .cke_tpl_item,.cke_dialog_contents_body .cke_tpl_list a:active .cke_tpl_item{border:2px solid #139ff7;padding:6px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password,.cke_rtl input.cke_dialog_ui_input_tel{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password,.cke_rtl div.cke_dialog_ui_input_tel{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_tel,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_footer{filter:""} \ No newline at end of file diff --git a/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/editor.css b/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/editor.css index d6f888e9831..f706e84427d 100644 --- a/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/editor.css +++ b/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/editor.css @@ -1,5 +1,5 @@ /* -Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. +Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ -.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #d1d1d1;padding:0}.cke_inner{display:block;background:#fff;padding:0;-webkit-touch-callout:none}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #d1d1d1;background:#f8f8f8;padding:6px 8px 2px;white-space:normal}.cke_float .cke_top{border:1px solid #d1d1d1}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #bcbcbc transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #bcbcbc;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #d1d1d1}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_block:focus{outline:0}.cke_panel_list{margin:0;padding:0;list-style-type:none;white-space:nowrap}.cke_panel_listItem{margin:0;padding:0}.cke_panel_listItem a{padding:6px 7px;display:block;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}.cke_hc .cke_panel_listItem a{border-style:none}.cke_panel_listItem.cke_selected a,.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{background-color:#e9e9e9}.cke_panel_listItem a:focus{outline:1px dotted #000}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:4px 5px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:6px 6px 7px 6px;color:#484848;border-bottom:1px solid #d1d1d1;background:#f8f8f8}.cke_colorblock{padding:10px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}a.cke_colorbox{padding:2px;float:left;width:20px;height:20px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{outline:0;padding:0;border:2px solid #139ff7}a:hover.cke_colorbox{border-color:#bcbcbc}span.cke_colorbox{width:20px;height:20px;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:3px;display:block;cursor:pointer}a.cke_colorauto{padding:0;border:1px solid transparent;margin-bottom:6px;height:26px;line-height:26px}a.cke_colormore{margin-top:10px;height:20px;line-height:19px}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{outline:0;border:#139ff7 1px solid;background-color:#f8f8f8}a:hover.cke_colorauto,a:hover.cke_colormore{border-color:#bcbcbc}.cke_colorauto span.cke_colorbox{width:18px;height:18px;border:1px solid #808080;margin-left:1px;margin-top:3px}.cke_rtl .cke_colorauto span.cke_colorbox{margin-left:0;margin-right:1px}span.cke_colorbox[style*="#ffffff"],span.cke_colorbox[style*="#FFFFFF"],span.cke_colorbox[style="background-color:#fff"],span.cke_colorbox[style="background-color:#FFF"],span.cke_colorbox[style*="rgb(255,255,255)"],span.cke_colorbox[style*="rgb(255, 255, 255)"]{border:1px solid #808080;width:18px;height:18px}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{border:0;float:left;margin:1px 2px 6px 0;padding-right:3px}.cke_rtl .cke_toolgroup{float:right;margin:1px 0 6px 2px;padding-left:3px;padding-right:0}.cke_hc .cke_toolgroup{margin-right:5px;margin-bottom:5px}.cke_hc.cke_rtl .cke_toolgroup{margin-right:0;margin-left:5px}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0;position:relative}a.cke_button_expandable{padding:4px 5px}.cke_rtl a.cke_button{float:right}.cke_hc a.cke_button{border:1px solid black;padding:3px 5px;margin:0 3px 5px 0}.cke_hc.cke_rtl a.cke_button{margin:0 0 5px 3px}a.cke_button_on{background:#fff;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_on{padding:3px 4px}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_off:hover,a.cke_button_expandable.cke_button_off:focus,a.cke_button_expandable.cke_button_off:active{padding:3px 4px}.cke_hc a.cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active{background:#e5e5e5;border:3px solid #000;padding:1px 3px}a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{border:0;padding:4px 6px;background-color:transparent}a.cke_button_expandable.cke_button_disabled:hover,a.cke_button_expandable.cke_button_disabled:active{padding:4px 5px}a.cke_button_disabled:focus{border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_disabled:focus{padding:3px 4px}.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border:1px solid #acacac;padding:3px 5px;margin:0 3px 5px 0}.cke_hc a.cke_button_disabled:focus{border:3px solid #000;padding:1px 3px}.cke_hc.cke_rtl a.cke_button_disabled:hover,.cke_hc.cke_rtl a.cke_button_disabled:focus,.cke_hc.cke_rtl a.cke_button_disabled:active{margin:0 0 5px 3px}a.cke_button_disabled .cke_button_icon,a.cke_button_disabled .cke_button_arrow{opacity:.3}.cke_hc a.cke_button_disabled{border-color:#acacac}.cke_hc a.cke_button_disabled .cke_button_icon,.cke_hc a.cke_button_disabled .cke_button_label{opacity:.5}.cke_toolgroup a.cke_button:last-child:after,.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:0;right:-3px}.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-right:0;right:auto;border-left:1px solid #bcbcbc;top:0;left:-3px}.cke_hc .cke_toolgroup a.cke_button:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-color:#000;top:0;right:-7px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{top:0;right:auto;left:-7px}.cke_toolgroup a.cke_button:hover:last-child:after,.cke_toolgroup a.cke_button:focus:last-child:after,.cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:-4px}.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_rtl .cke_toolgroup a.cke_button:focus:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:auto;left:-4px}.cke_hc .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:-9px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:auto;left:-9px}.cke_toolbar.cke_toolbar_last .cke_toolgroup a.cke_button:last-child:after{content:none;border:0;width:0;height:0}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#484848}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 3px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px 0 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#bcbcbc;margin:4px 2px 0 2px;height:18px;width:1px}.cke_rtl .cke_toolbar_separator{float:right}.cke_hc .cke_toolbar_separator{background-color:#000;margin-left:2px;margin-right:5px;margin-bottom:9px}.cke_hc.cke_rtl .cke_toolbar_separator{margin-left:5px;margin-right:2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #bcbcbc}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser:hover{background:#e5e5e5}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border:3px solid transparent;border-bottom-color:#484848}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#484848}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0}.cke_menuitem span{cursor:default}.cke_menubutton{display:block}.cke_hc .cke_menubutton{padding:2px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#e9e9e9;display:block;outline:1px dotted}.cke_menubutton:hover{outline:0}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_disabled:hover,.cke_menubutton_disabled:focus,.cke_menubutton_disabled:active{background-color:transparent;outline:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#f8f8f8;padding:6px 4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#e9e9e9}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{background-color:#f8f8f8;outline:0}.cke_menuitem .cke_menubutton_on{background-color:#e9e9e9;border:1px solid #dedede;outline:0}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px;background-color:#e9e9e9}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_shortcut{color:#979797}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d1d1d1;height:1px}.cke_menuarrow{background:transparent url(images/arrow.png) no-repeat 0 10px;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_hc .cke_menuarrow{background-image:none}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left;position:relative;margin-bottom:5px}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:1px;margin-bottom:10px}.cke_combo:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:5px;top:0;right:0}.cke_rtl .cke_combo:after{border-right:0;border-left:1px solid #bcbcbc;right:auto;left:0}.cke_hc .cke_combo:after{border-color:#000}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0;padding:1px}.cke_rtl a.cke_combo_button{float:right}.cke_hc a.cke_combo_button{padding:4px}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:active{background:#e5e5e5;border:1px solid #bcbcbc;padding:0 0 0 1px;margin-left:-1px}.cke_combo_off a.cke_combo_button:focus{outline:0}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:active{background:#fff}.cke_rtl .cke_combo_on a.cke_combo_button,.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:0 1px 0 0;margin-left:0;margin-right:-1px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border:3px solid #000;padding:1px 1px 1px 2px}.cke_hc.cke_rtl .cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:1px 2px 1px 1px}.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 0 0 3px;margin-left:-3px}.cke_rtl .cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 3px 0 0;margin-left:0;margin-right:-3px}.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 1px 1px 7px;margin-left:-6px}.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 7px 1px 1px;margin-left:0;margin-right:-6px}.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0;margin:0}.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px;margin:0}.cke_toolbar .cke_combo+.cke_toolbar_end,.cke_toolbar .cke_combo+.cke_toolgroup{margin-right:0;margin-left:2px}.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:2px}.cke_hc .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:5px}.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:5px}.cke_toolbar.cke_toolbar_last .cke_combo:nth-last-child(-n+2):after{content:none;border:0;width:0;height:0}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#484848;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 10px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#484848;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#e5e5e5}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combopanel__fontsize{width:135px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;text-align:center;opacity:.95;filter:alpha(opacity = 95);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_button__about_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -456px !important;}.cke_button__copyformatting_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -480px !important;}.cke_button__creatediv_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -504px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -528px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -552px !important;}.cke_button__replace_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -576px !important;}.cke_button__flash_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -600px !important;}.cke_button__button_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -624px !important;}.cke_button__checkbox_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -648px !important;}.cke_button__form_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -672px !important;}.cke_button__hiddenfield_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -696px !important;}.cke_button__imagebutton_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -720px !important;}.cke_button__radio_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -744px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -768px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -792px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -816px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -840px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -864px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -888px !important;}.cke_button__horizontalrule_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -912px !important;}.cke_button__iframe_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -936px !important;}.cke_button__image_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -960px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -984px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1008px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1032px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1056px !important;}.cke_button__smiley_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1080px !important;}.cke_button__justifyblock_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1104px !important;}.cke_button__justifycenter_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1128px !important;}.cke_button__justifyleft_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1152px !important;}.cke_button__justifyright_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1176px !important;}.cke_button__language_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1200px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1224px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1248px !important;}.cke_button__link_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1272px !important;}.cke_button__unlink_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1296px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1320px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1344px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1368px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1392px !important;}.cke_button__maximize_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1608px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1632px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1656px !important;}.cke_button__print_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1680px !important;}.cke_button__removeformat_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1704px !important;}.cke_button__save_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1728px !important;}.cke_button__selectall_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1800px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1824px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1848px !important;}.cke_button__specialchar_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1872px !important;}.cke_button__scayt_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1896px !important;}.cke_button__table_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1968px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1992px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -2016px !important;}.cke_button__spellchecker_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -2040px !important;}.cke_rtl .cke_button__sourcedialog_icon, .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -2064px !important;}.cke_ltr .cke_button__sourcedialog_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -2088px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__copyformatting_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_hidpi .cke_button__language_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1992px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -2016px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -2040px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__sourcedialog_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -2064px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__sourcedialog_icon,.cke_ltr.cke_hidpi .cke_button__sourcedialog_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -2088px !important;background-size: 16px !important;} \ No newline at end of file +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all select[multiple] option:checked{background-color:#cecece}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #d1d1d1;padding:0}.cke_inner{display:block;background:#fff;padding:0;-webkit-touch-callout:none}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #d1d1d1;background:#f8f8f8;padding:6px 8px 2px;white-space:normal}.cke_float .cke_top{border:1px solid #d1d1d1}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #bcbcbc transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #bcbcbc;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #d1d1d1}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_block:focus{outline:0}.cke_panel_list{margin:0;padding:0;list-style-type:none;white-space:nowrap}.cke_panel_listItem{margin:0;padding:0}.cke_panel_listItem a{padding:6px 7px;display:block;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}.cke_hc .cke_panel_listItem a{border-style:none}.cke_panel_listItem.cke_selected a,.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{background-color:#e9e9e9}.cke_panel_listItem a:focus{outline:1px dotted #000}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:4px 5px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:6px 6px 7px 6px;color:#484848;border-bottom:1px solid #d1d1d1;background:#f8f8f8}.cke_colorblock{padding:10px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}a.cke_colorbox{padding:2px;float:left;width:20px;height:20px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{outline:0;padding:0;border:2px solid #139ff7}a:hover.cke_colorbox{border-color:#bcbcbc}span.cke_colorbox{width:20px;height:20px;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:3px;display:block;cursor:pointer}a.cke_colorauto{padding:0;border:1px solid transparent;margin-bottom:6px;height:26px;line-height:26px}a.cke_colormore{margin-top:10px;height:20px;line-height:19px}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{outline:0;border:#139ff7 1px solid;background-color:#f8f8f8}a:hover.cke_colorauto,a:hover.cke_colormore{border-color:#bcbcbc}.cke_colorauto span.cke_colorbox{width:18px;height:18px;border:1px solid #808080;margin-left:1px;margin-top:3px}.cke_rtl .cke_colorauto span.cke_colorbox{margin-left:0;margin-right:1px}span.cke_colorbox[style*="#ffffff"],span.cke_colorbox[style*="#FFFFFF"],span.cke_colorbox[style="background-color:#fff"],span.cke_colorbox[style="background-color:#FFF"],span.cke_colorbox[style*="rgb(255,255,255)"],span.cke_colorbox[style*="rgb(255, 255, 255)"]{border:1px solid #808080;width:18px;height:18px}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{border:0;float:left;margin:1px 2px 6px 0;padding-right:3px}.cke_rtl .cke_toolgroup{float:right;margin:1px 0 6px 2px;padding-left:3px;padding-right:0}.cke_hc .cke_toolgroup{margin-right:5px;margin-bottom:5px}.cke_hc.cke_rtl .cke_toolgroup{margin-right:0;margin-left:5px}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0;position:relative}a.cke_button_expandable{padding:4px 5px}.cke_rtl a.cke_button{float:right}.cke_hc a.cke_button{border:1px solid black;padding:3px 5px;margin:0 3px 5px 0}.cke_hc.cke_rtl a.cke_button{margin:0 0 5px 3px}a.cke_button_on{background:#fff;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_on{padding:3px 4px}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_off:hover,a.cke_button_expandable.cke_button_off:focus,a.cke_button_expandable.cke_button_off:active{padding:3px 4px}.cke_hc a.cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active{background:#e5e5e5;border:3px solid #000;padding:1px 3px}@media screen and (hover:none){a.cke_button_off:hover{background:transparent;border:0;padding:4px 6px}a.cke_button_expandable.cke_button_off:hover{padding:4px 5px}a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_off:active{padding:3px 4px}}a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{border:0;padding:4px 6px;background-color:transparent}a.cke_button_expandable.cke_button_disabled:hover,a.cke_button_expandable.cke_button_disabled:active{padding:4px 5px}a.cke_button_disabled:focus{border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_disabled:focus{padding:3px 4px}.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border:1px solid #acacac;padding:3px 5px;margin:0 3px 5px 0}.cke_hc a.cke_button_disabled:focus{border:3px solid #000;padding:1px 3px}.cke_hc.cke_rtl a.cke_button_disabled:hover,.cke_hc.cke_rtl a.cke_button_disabled:focus,.cke_hc.cke_rtl a.cke_button_disabled:active{margin:0 0 5px 3px}a.cke_button_disabled .cke_button_icon,a.cke_button_disabled .cke_button_arrow{opacity:.3}.cke_hc a.cke_button_disabled{border-color:#acacac}.cke_hc a.cke_button_disabled .cke_button_icon,.cke_hc a.cke_button_disabled .cke_button_label{opacity:.5}.cke_toolgroup a.cke_button:last-child:after,.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:0;right:-3px}.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-right:0;right:auto;border-left:1px solid #bcbcbc;top:0;left:-3px}.cke_hc .cke_toolgroup a.cke_button:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-color:#000;top:0;right:-7px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{top:0;right:auto;left:-7px}.cke_toolgroup a.cke_button:hover:last-child:after,.cke_toolgroup a.cke_button:focus:last-child:after,.cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:-4px}.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_rtl .cke_toolgroup a.cke_button:focus:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:auto;left:-4px}.cke_hc .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:-9px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:auto;left:-9px}.cke_toolbar.cke_toolbar_last .cke_toolgroup a.cke_button:last-child:after{content:none;border:0;width:0;height:0}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#484848}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 3px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px 0 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#bcbcbc;margin:4px 2px 0 2px;height:18px;width:1px}.cke_rtl .cke_toolbar_separator{float:right}.cke_hc .cke_toolbar_separator{background-color:#000;margin-left:2px;margin-right:5px;margin-bottom:9px}.cke_hc.cke_rtl .cke_toolbar_separator{margin-left:5px;margin-right:2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #bcbcbc}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser:hover{background:#e5e5e5}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border:3px solid transparent;border-bottom-color:#484848}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#484848}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0}.cke_menuitem span{cursor:default}.cke_menubutton{display:block}.cke_hc .cke_menubutton{padding:2px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#e9e9e9;display:block;outline:1px dotted}.cke_menubutton:hover{outline:0}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_disabled:hover,.cke_menubutton_disabled:focus,.cke_menubutton_disabled:active{background-color:transparent;outline:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#f8f8f8;padding:6px 4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#e9e9e9}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{background-color:#f8f8f8;outline:0}.cke_menuitem .cke_menubutton_on{background-color:#e9e9e9;border:1px solid #dedede;outline:0}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px;background-color:#e9e9e9}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_shortcut{color:#979797}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d1d1d1;height:1px}.cke_menuarrow{background:transparent url(images/arrow.png) no-repeat 0 10px;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_hc .cke_menuarrow{background-image:none}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left;position:relative;margin-bottom:5px}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:1px;margin-bottom:10px}.cke_combo:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:5px;top:0;right:0}.cke_rtl .cke_combo:after{border-right:0;border-left:1px solid #bcbcbc;right:auto;left:0}.cke_hc .cke_combo:after{border-color:#000}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0;padding:1px}.cke_rtl a.cke_combo_button{float:right}.cke_hc a.cke_combo_button{padding:4px}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:active{background:#e5e5e5;border:1px solid #bcbcbc;padding:0 0 0 1px;margin-left:-1px}.cke_combo_off a.cke_combo_button:focus{outline:0}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:active{background:#fff}@media screen and (hover:none){.cke_combo_off a.cke_combo_button:hover{background:transparent;border-color:transparent}.cke_combo_off a.cke_combo_button:active{background:#fff;border:1px solid #bcbcbc}}.cke_rtl .cke_combo_on a.cke_combo_button,.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:0 1px 0 0;margin-left:0;margin-right:-1px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border:3px solid #000;padding:1px 1px 1px 2px}.cke_hc.cke_rtl .cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:1px 2px 1px 1px}.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 0 0 3px;margin-left:-3px}.cke_rtl .cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 3px 0 0;margin-left:0;margin-right:-3px}.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 1px 1px 7px;margin-left:-6px}.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 7px 1px 1px;margin-left:0;margin-right:-6px}.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0;margin:0}.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px;margin:0}.cke_toolbar .cke_combo+.cke_toolbar_end,.cke_toolbar .cke_combo+.cke_toolgroup{margin-right:0;margin-left:2px}.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:2px}.cke_hc .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:5px}.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:5px}.cke_toolbar.cke_toolbar_last .cke_combo:nth-last-child(-n+2):after{content:none;border:0;width:0;height:0}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#484848;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 10px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#484848;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#e5e5e5}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combopanel__fontsize{width:135px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;text-align:center;opacity:.95;filter:alpha(opacity = 95);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_button__about_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -456px !important;}.cke_button__copyformatting_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -480px !important;}.cke_button__creatediv_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -504px !important;}.cke_button__exportpdf_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -528px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -552px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -576px !important;}.cke_button__replace_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -600px !important;}.cke_button__button_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -624px !important;}.cke_button__checkbox_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -648px !important;}.cke_button__form_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -672px !important;}.cke_button__hiddenfield_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -696px !important;}.cke_button__imagebutton_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -720px !important;}.cke_button__radio_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -744px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -768px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -792px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -816px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -840px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -864px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -888px !important;}.cke_button__horizontalrule_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -912px !important;}.cke_button__iframe_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -936px !important;}.cke_button__image_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -960px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -984px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1008px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1032px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1056px !important;}.cke_button__smiley_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1080px !important;}.cke_button__justifyblock_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1104px !important;}.cke_button__justifycenter_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1128px !important;}.cke_button__justifyleft_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1152px !important;}.cke_button__justifyright_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1176px !important;}.cke_button__language_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1200px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1224px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1248px !important;}.cke_button__link_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1272px !important;}.cke_button__unlink_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1296px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1320px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1344px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1368px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1392px !important;}.cke_button__maximize_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1608px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1632px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1656px !important;}.cke_button__print_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1680px !important;}.cke_button__removeformat_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1704px !important;}.cke_button__save_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1728px !important;}.cke_button__selectall_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1800px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1824px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1848px !important;}.cke_button__specialchar_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1872px !important;}.cke_button__scayt_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1896px !important;}.cke_button__table_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1968px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1992px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -2016px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__copyformatting_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__exportpdf_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_hidpi .cke_button__language_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1992px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -2016px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/editor_gecko.css b/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/editor_gecko.css index ac2bc8c3290..b9080ae9529 100644 --- a/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/editor_gecko.css +++ b/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/editor_gecko.css @@ -1,5 +1,5 @@ /* -Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. +Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ -.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #d1d1d1;padding:0}.cke_inner{display:block;background:#fff;padding:0;-webkit-touch-callout:none}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #d1d1d1;background:#f8f8f8;padding:6px 8px 2px;white-space:normal}.cke_float .cke_top{border:1px solid #d1d1d1}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #bcbcbc transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #bcbcbc;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #d1d1d1}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_block:focus{outline:0}.cke_panel_list{margin:0;padding:0;list-style-type:none;white-space:nowrap}.cke_panel_listItem{margin:0;padding:0}.cke_panel_listItem a{padding:6px 7px;display:block;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}.cke_hc .cke_panel_listItem a{border-style:none}.cke_panel_listItem.cke_selected a,.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{background-color:#e9e9e9}.cke_panel_listItem a:focus{outline:1px dotted #000}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:4px 5px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:6px 6px 7px 6px;color:#484848;border-bottom:1px solid #d1d1d1;background:#f8f8f8}.cke_colorblock{padding:10px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}a.cke_colorbox{padding:2px;float:left;width:20px;height:20px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{outline:0;padding:0;border:2px solid #139ff7}a:hover.cke_colorbox{border-color:#bcbcbc}span.cke_colorbox{width:20px;height:20px;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:3px;display:block;cursor:pointer}a.cke_colorauto{padding:0;border:1px solid transparent;margin-bottom:6px;height:26px;line-height:26px}a.cke_colormore{margin-top:10px;height:20px;line-height:19px}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{outline:0;border:#139ff7 1px solid;background-color:#f8f8f8}a:hover.cke_colorauto,a:hover.cke_colormore{border-color:#bcbcbc}.cke_colorauto span.cke_colorbox{width:18px;height:18px;border:1px solid #808080;margin-left:1px;margin-top:3px}.cke_rtl .cke_colorauto span.cke_colorbox{margin-left:0;margin-right:1px}span.cke_colorbox[style*="#ffffff"],span.cke_colorbox[style*="#FFFFFF"],span.cke_colorbox[style="background-color:#fff"],span.cke_colorbox[style="background-color:#FFF"],span.cke_colorbox[style*="rgb(255,255,255)"],span.cke_colorbox[style*="rgb(255, 255, 255)"]{border:1px solid #808080;width:18px;height:18px}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{border:0;float:left;margin:1px 2px 6px 0;padding-right:3px}.cke_rtl .cke_toolgroup{float:right;margin:1px 0 6px 2px;padding-left:3px;padding-right:0}.cke_hc .cke_toolgroup{margin-right:5px;margin-bottom:5px}.cke_hc.cke_rtl .cke_toolgroup{margin-right:0;margin-left:5px}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0;position:relative}a.cke_button_expandable{padding:4px 5px}.cke_rtl a.cke_button{float:right}.cke_hc a.cke_button{border:1px solid black;padding:3px 5px;margin:0 3px 5px 0}.cke_hc.cke_rtl a.cke_button{margin:0 0 5px 3px}a.cke_button_on{background:#fff;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_on{padding:3px 4px}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_off:hover,a.cke_button_expandable.cke_button_off:focus,a.cke_button_expandable.cke_button_off:active{padding:3px 4px}.cke_hc a.cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active{background:#e5e5e5;border:3px solid #000;padding:1px 3px}a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{border:0;padding:4px 6px;background-color:transparent}a.cke_button_expandable.cke_button_disabled:hover,a.cke_button_expandable.cke_button_disabled:active{padding:4px 5px}a.cke_button_disabled:focus{border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_disabled:focus{padding:3px 4px}.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border:1px solid #acacac;padding:3px 5px;margin:0 3px 5px 0}.cke_hc a.cke_button_disabled:focus{border:3px solid #000;padding:1px 3px}.cke_hc.cke_rtl a.cke_button_disabled:hover,.cke_hc.cke_rtl a.cke_button_disabled:focus,.cke_hc.cke_rtl a.cke_button_disabled:active{margin:0 0 5px 3px}a.cke_button_disabled .cke_button_icon,a.cke_button_disabled .cke_button_arrow{opacity:.3}.cke_hc a.cke_button_disabled{border-color:#acacac}.cke_hc a.cke_button_disabled .cke_button_icon,.cke_hc a.cke_button_disabled .cke_button_label{opacity:.5}.cke_toolgroup a.cke_button:last-child:after,.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:0;right:-3px}.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-right:0;right:auto;border-left:1px solid #bcbcbc;top:0;left:-3px}.cke_hc .cke_toolgroup a.cke_button:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-color:#000;top:0;right:-7px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{top:0;right:auto;left:-7px}.cke_toolgroup a.cke_button:hover:last-child:after,.cke_toolgroup a.cke_button:focus:last-child:after,.cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:-4px}.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_rtl .cke_toolgroup a.cke_button:focus:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:auto;left:-4px}.cke_hc .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:-9px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:auto;left:-9px}.cke_toolbar.cke_toolbar_last .cke_toolgroup a.cke_button:last-child:after{content:none;border:0;width:0;height:0}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#484848}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 3px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px 0 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#bcbcbc;margin:4px 2px 0 2px;height:18px;width:1px}.cke_rtl .cke_toolbar_separator{float:right}.cke_hc .cke_toolbar_separator{background-color:#000;margin-left:2px;margin-right:5px;margin-bottom:9px}.cke_hc.cke_rtl .cke_toolbar_separator{margin-left:5px;margin-right:2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #bcbcbc}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser:hover{background:#e5e5e5}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border:3px solid transparent;border-bottom-color:#484848}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#484848}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0}.cke_menuitem span{cursor:default}.cke_menubutton{display:block}.cke_hc .cke_menubutton{padding:2px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#e9e9e9;display:block;outline:1px dotted}.cke_menubutton:hover{outline:0}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_disabled:hover,.cke_menubutton_disabled:focus,.cke_menubutton_disabled:active{background-color:transparent;outline:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#f8f8f8;padding:6px 4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#e9e9e9}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{background-color:#f8f8f8;outline:0}.cke_menuitem .cke_menubutton_on{background-color:#e9e9e9;border:1px solid #dedede;outline:0}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px;background-color:#e9e9e9}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_shortcut{color:#979797}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d1d1d1;height:1px}.cke_menuarrow{background:transparent url(images/arrow.png) no-repeat 0 10px;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_hc .cke_menuarrow{background-image:none}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left;position:relative;margin-bottom:5px}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:1px;margin-bottom:10px}.cke_combo:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:5px;top:0;right:0}.cke_rtl .cke_combo:after{border-right:0;border-left:1px solid #bcbcbc;right:auto;left:0}.cke_hc .cke_combo:after{border-color:#000}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0;padding:1px}.cke_rtl a.cke_combo_button{float:right}.cke_hc a.cke_combo_button{padding:4px}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:active{background:#e5e5e5;border:1px solid #bcbcbc;padding:0 0 0 1px;margin-left:-1px}.cke_combo_off a.cke_combo_button:focus{outline:0}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:active{background:#fff}.cke_rtl .cke_combo_on a.cke_combo_button,.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:0 1px 0 0;margin-left:0;margin-right:-1px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border:3px solid #000;padding:1px 1px 1px 2px}.cke_hc.cke_rtl .cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:1px 2px 1px 1px}.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 0 0 3px;margin-left:-3px}.cke_rtl .cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 3px 0 0;margin-left:0;margin-right:-3px}.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 1px 1px 7px;margin-left:-6px}.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 7px 1px 1px;margin-left:0;margin-right:-6px}.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0;margin:0}.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px;margin:0}.cke_toolbar .cke_combo+.cke_toolbar_end,.cke_toolbar .cke_combo+.cke_toolgroup{margin-right:0;margin-left:2px}.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:2px}.cke_hc .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:5px}.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:5px}.cke_toolbar.cke_toolbar_last .cke_combo:nth-last-child(-n+2):after{content:none;border:0;width:0;height:0}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#484848;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 10px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#484848;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#e5e5e5}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combopanel__fontsize{width:135px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;text-align:center;opacity:.95;filter:alpha(opacity = 95);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_bottom{padding-bottom:3px}.cke_combo_text{margin-bottom:-1px;margin-top:1px}.cke_button__about_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -456px !important;}.cke_button__copyformatting_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -480px !important;}.cke_button__creatediv_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -504px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -528px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -552px !important;}.cke_button__replace_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -576px !important;}.cke_button__flash_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -600px !important;}.cke_button__button_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -624px !important;}.cke_button__checkbox_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -648px !important;}.cke_button__form_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -672px !important;}.cke_button__hiddenfield_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -696px !important;}.cke_button__imagebutton_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -720px !important;}.cke_button__radio_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -744px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -768px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -792px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -816px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -840px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -864px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -888px !important;}.cke_button__horizontalrule_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -912px !important;}.cke_button__iframe_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -936px !important;}.cke_button__image_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -960px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -984px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1008px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1032px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1056px !important;}.cke_button__smiley_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1080px !important;}.cke_button__justifyblock_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1104px !important;}.cke_button__justifycenter_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1128px !important;}.cke_button__justifyleft_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1152px !important;}.cke_button__justifyright_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1176px !important;}.cke_button__language_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1200px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1224px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1248px !important;}.cke_button__link_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1272px !important;}.cke_button__unlink_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1296px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1320px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1344px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1368px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1392px !important;}.cke_button__maximize_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1608px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1632px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1656px !important;}.cke_button__print_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1680px !important;}.cke_button__removeformat_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1704px !important;}.cke_button__save_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1728px !important;}.cke_button__selectall_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1800px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1824px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1848px !important;}.cke_button__specialchar_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1872px !important;}.cke_button__scayt_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1896px !important;}.cke_button__table_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1968px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1992px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -2016px !important;}.cke_button__spellchecker_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -2040px !important;}.cke_rtl .cke_button__sourcedialog_icon, .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -2064px !important;}.cke_ltr .cke_button__sourcedialog_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -2088px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__copyformatting_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_hidpi .cke_button__language_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1992px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -2016px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -2040px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__sourcedialog_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -2064px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__sourcedialog_icon,.cke_ltr.cke_hidpi .cke_button__sourcedialog_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -2088px !important;background-size: 16px !important;} \ No newline at end of file +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all select[multiple] option:checked{background-color:#cecece}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #d1d1d1;padding:0}.cke_inner{display:block;background:#fff;padding:0;-webkit-touch-callout:none}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #d1d1d1;background:#f8f8f8;padding:6px 8px 2px;white-space:normal}.cke_float .cke_top{border:1px solid #d1d1d1}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #bcbcbc transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #bcbcbc;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #d1d1d1}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_block:focus{outline:0}.cke_panel_list{margin:0;padding:0;list-style-type:none;white-space:nowrap}.cke_panel_listItem{margin:0;padding:0}.cke_panel_listItem a{padding:6px 7px;display:block;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}.cke_hc .cke_panel_listItem a{border-style:none}.cke_panel_listItem.cke_selected a,.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{background-color:#e9e9e9}.cke_panel_listItem a:focus{outline:1px dotted #000}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:4px 5px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:6px 6px 7px 6px;color:#484848;border-bottom:1px solid #d1d1d1;background:#f8f8f8}.cke_colorblock{padding:10px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}a.cke_colorbox{padding:2px;float:left;width:20px;height:20px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{outline:0;padding:0;border:2px solid #139ff7}a:hover.cke_colorbox{border-color:#bcbcbc}span.cke_colorbox{width:20px;height:20px;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:3px;display:block;cursor:pointer}a.cke_colorauto{padding:0;border:1px solid transparent;margin-bottom:6px;height:26px;line-height:26px}a.cke_colormore{margin-top:10px;height:20px;line-height:19px}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{outline:0;border:#139ff7 1px solid;background-color:#f8f8f8}a:hover.cke_colorauto,a:hover.cke_colormore{border-color:#bcbcbc}.cke_colorauto span.cke_colorbox{width:18px;height:18px;border:1px solid #808080;margin-left:1px;margin-top:3px}.cke_rtl .cke_colorauto span.cke_colorbox{margin-left:0;margin-right:1px}span.cke_colorbox[style*="#ffffff"],span.cke_colorbox[style*="#FFFFFF"],span.cke_colorbox[style="background-color:#fff"],span.cke_colorbox[style="background-color:#FFF"],span.cke_colorbox[style*="rgb(255,255,255)"],span.cke_colorbox[style*="rgb(255, 255, 255)"]{border:1px solid #808080;width:18px;height:18px}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{border:0;float:left;margin:1px 2px 6px 0;padding-right:3px}.cke_rtl .cke_toolgroup{float:right;margin:1px 0 6px 2px;padding-left:3px;padding-right:0}.cke_hc .cke_toolgroup{margin-right:5px;margin-bottom:5px}.cke_hc.cke_rtl .cke_toolgroup{margin-right:0;margin-left:5px}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0;position:relative}a.cke_button_expandable{padding:4px 5px}.cke_rtl a.cke_button{float:right}.cke_hc a.cke_button{border:1px solid black;padding:3px 5px;margin:0 3px 5px 0}.cke_hc.cke_rtl a.cke_button{margin:0 0 5px 3px}a.cke_button_on{background:#fff;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_on{padding:3px 4px}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_off:hover,a.cke_button_expandable.cke_button_off:focus,a.cke_button_expandable.cke_button_off:active{padding:3px 4px}.cke_hc a.cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active{background:#e5e5e5;border:3px solid #000;padding:1px 3px}@media screen and (hover:none){a.cke_button_off:hover{background:transparent;border:0;padding:4px 6px}a.cke_button_expandable.cke_button_off:hover{padding:4px 5px}a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_off:active{padding:3px 4px}}a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{border:0;padding:4px 6px;background-color:transparent}a.cke_button_expandable.cke_button_disabled:hover,a.cke_button_expandable.cke_button_disabled:active{padding:4px 5px}a.cke_button_disabled:focus{border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_disabled:focus{padding:3px 4px}.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border:1px solid #acacac;padding:3px 5px;margin:0 3px 5px 0}.cke_hc a.cke_button_disabled:focus{border:3px solid #000;padding:1px 3px}.cke_hc.cke_rtl a.cke_button_disabled:hover,.cke_hc.cke_rtl a.cke_button_disabled:focus,.cke_hc.cke_rtl a.cke_button_disabled:active{margin:0 0 5px 3px}a.cke_button_disabled .cke_button_icon,a.cke_button_disabled .cke_button_arrow{opacity:.3}.cke_hc a.cke_button_disabled{border-color:#acacac}.cke_hc a.cke_button_disabled .cke_button_icon,.cke_hc a.cke_button_disabled .cke_button_label{opacity:.5}.cke_toolgroup a.cke_button:last-child:after,.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:0;right:-3px}.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-right:0;right:auto;border-left:1px solid #bcbcbc;top:0;left:-3px}.cke_hc .cke_toolgroup a.cke_button:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-color:#000;top:0;right:-7px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{top:0;right:auto;left:-7px}.cke_toolgroup a.cke_button:hover:last-child:after,.cke_toolgroup a.cke_button:focus:last-child:after,.cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:-4px}.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_rtl .cke_toolgroup a.cke_button:focus:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:auto;left:-4px}.cke_hc .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:-9px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:auto;left:-9px}.cke_toolbar.cke_toolbar_last .cke_toolgroup a.cke_button:last-child:after{content:none;border:0;width:0;height:0}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#484848}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 3px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px 0 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#bcbcbc;margin:4px 2px 0 2px;height:18px;width:1px}.cke_rtl .cke_toolbar_separator{float:right}.cke_hc .cke_toolbar_separator{background-color:#000;margin-left:2px;margin-right:5px;margin-bottom:9px}.cke_hc.cke_rtl .cke_toolbar_separator{margin-left:5px;margin-right:2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #bcbcbc}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser:hover{background:#e5e5e5}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border:3px solid transparent;border-bottom-color:#484848}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#484848}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0}.cke_menuitem span{cursor:default}.cke_menubutton{display:block}.cke_hc .cke_menubutton{padding:2px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#e9e9e9;display:block;outline:1px dotted}.cke_menubutton:hover{outline:0}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_disabled:hover,.cke_menubutton_disabled:focus,.cke_menubutton_disabled:active{background-color:transparent;outline:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#f8f8f8;padding:6px 4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#e9e9e9}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{background-color:#f8f8f8;outline:0}.cke_menuitem .cke_menubutton_on{background-color:#e9e9e9;border:1px solid #dedede;outline:0}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px;background-color:#e9e9e9}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_shortcut{color:#979797}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d1d1d1;height:1px}.cke_menuarrow{background:transparent url(images/arrow.png) no-repeat 0 10px;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_hc .cke_menuarrow{background-image:none}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left;position:relative;margin-bottom:5px}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:1px;margin-bottom:10px}.cke_combo:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:5px;top:0;right:0}.cke_rtl .cke_combo:after{border-right:0;border-left:1px solid #bcbcbc;right:auto;left:0}.cke_hc .cke_combo:after{border-color:#000}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0;padding:1px}.cke_rtl a.cke_combo_button{float:right}.cke_hc a.cke_combo_button{padding:4px}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:active{background:#e5e5e5;border:1px solid #bcbcbc;padding:0 0 0 1px;margin-left:-1px}.cke_combo_off a.cke_combo_button:focus{outline:0}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:active{background:#fff}@media screen and (hover:none){.cke_combo_off a.cke_combo_button:hover{background:transparent;border-color:transparent}.cke_combo_off a.cke_combo_button:active{background:#fff;border:1px solid #bcbcbc}}.cke_rtl .cke_combo_on a.cke_combo_button,.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:0 1px 0 0;margin-left:0;margin-right:-1px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border:3px solid #000;padding:1px 1px 1px 2px}.cke_hc.cke_rtl .cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:1px 2px 1px 1px}.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 0 0 3px;margin-left:-3px}.cke_rtl .cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 3px 0 0;margin-left:0;margin-right:-3px}.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 1px 1px 7px;margin-left:-6px}.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 7px 1px 1px;margin-left:0;margin-right:-6px}.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0;margin:0}.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px;margin:0}.cke_toolbar .cke_combo+.cke_toolbar_end,.cke_toolbar .cke_combo+.cke_toolgroup{margin-right:0;margin-left:2px}.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:2px}.cke_hc .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:5px}.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:5px}.cke_toolbar.cke_toolbar_last .cke_combo:nth-last-child(-n+2):after{content:none;border:0;width:0;height:0}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#484848;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 10px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#484848;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#e5e5e5}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combopanel__fontsize{width:135px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;text-align:center;opacity:.95;filter:alpha(opacity = 95);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_bottom{padding-bottom:3px}.cke_combo_text{margin-bottom:-1px;margin-top:1px}.cke_button__about_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -456px !important;}.cke_button__copyformatting_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -480px !important;}.cke_button__creatediv_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -504px !important;}.cke_button__exportpdf_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -528px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -552px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -576px !important;}.cke_button__replace_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -600px !important;}.cke_button__button_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -624px !important;}.cke_button__checkbox_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -648px !important;}.cke_button__form_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -672px !important;}.cke_button__hiddenfield_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -696px !important;}.cke_button__imagebutton_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -720px !important;}.cke_button__radio_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -744px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -768px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -792px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -816px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -840px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -864px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -888px !important;}.cke_button__horizontalrule_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -912px !important;}.cke_button__iframe_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -936px !important;}.cke_button__image_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -960px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -984px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1008px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1032px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1056px !important;}.cke_button__smiley_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1080px !important;}.cke_button__justifyblock_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1104px !important;}.cke_button__justifycenter_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1128px !important;}.cke_button__justifyleft_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1152px !important;}.cke_button__justifyright_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1176px !important;}.cke_button__language_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1200px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1224px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1248px !important;}.cke_button__link_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1272px !important;}.cke_button__unlink_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1296px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1320px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1344px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1368px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1392px !important;}.cke_button__maximize_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1608px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1632px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1656px !important;}.cke_button__print_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1680px !important;}.cke_button__removeformat_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1704px !important;}.cke_button__save_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1728px !important;}.cke_button__selectall_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1800px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1824px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1848px !important;}.cke_button__specialchar_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1872px !important;}.cke_button__scayt_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1896px !important;}.cke_button__table_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1968px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1992px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -2016px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__copyformatting_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__exportpdf_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_hidpi .cke_button__language_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1992px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -2016px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/editor_ie.css b/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/editor_ie.css index d4d1e68c6af..b5797adf434 100644 --- a/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/editor_ie.css +++ b/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/editor_ie.css @@ -1,5 +1,5 @@ /* -Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. +Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ -.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #d1d1d1;padding:0}.cke_inner{display:block;background:#fff;padding:0;-webkit-touch-callout:none}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #d1d1d1;background:#f8f8f8;padding:6px 8px 2px;white-space:normal}.cke_float .cke_top{border:1px solid #d1d1d1}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #bcbcbc transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #bcbcbc;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #d1d1d1}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_block:focus{outline:0}.cke_panel_list{margin:0;padding:0;list-style-type:none;white-space:nowrap}.cke_panel_listItem{margin:0;padding:0}.cke_panel_listItem a{padding:6px 7px;display:block;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}.cke_hc .cke_panel_listItem a{border-style:none}.cke_panel_listItem.cke_selected a,.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{background-color:#e9e9e9}.cke_panel_listItem a:focus{outline:1px dotted #000}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:4px 5px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:6px 6px 7px 6px;color:#484848;border-bottom:1px solid #d1d1d1;background:#f8f8f8}.cke_colorblock{padding:10px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}a.cke_colorbox{padding:2px;float:left;width:20px;height:20px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{outline:0;padding:0;border:2px solid #139ff7}a:hover.cke_colorbox{border-color:#bcbcbc}span.cke_colorbox{width:20px;height:20px;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:3px;display:block;cursor:pointer}a.cke_colorauto{padding:0;border:1px solid transparent;margin-bottom:6px;height:26px;line-height:26px}a.cke_colormore{margin-top:10px;height:20px;line-height:19px}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{outline:0;border:#139ff7 1px solid;background-color:#f8f8f8}a:hover.cke_colorauto,a:hover.cke_colormore{border-color:#bcbcbc}.cke_colorauto span.cke_colorbox{width:18px;height:18px;border:1px solid #808080;margin-left:1px;margin-top:3px}.cke_rtl .cke_colorauto span.cke_colorbox{margin-left:0;margin-right:1px}span.cke_colorbox[style*="#ffffff"],span.cke_colorbox[style*="#FFFFFF"],span.cke_colorbox[style="background-color:#fff"],span.cke_colorbox[style="background-color:#FFF"],span.cke_colorbox[style*="rgb(255,255,255)"],span.cke_colorbox[style*="rgb(255, 255, 255)"]{border:1px solid #808080;width:18px;height:18px}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{border:0;float:left;margin:1px 2px 6px 0;padding-right:3px}.cke_rtl .cke_toolgroup{float:right;margin:1px 0 6px 2px;padding-left:3px;padding-right:0}.cke_hc .cke_toolgroup{margin-right:5px;margin-bottom:5px}.cke_hc.cke_rtl .cke_toolgroup{margin-right:0;margin-left:5px}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0;position:relative}a.cke_button_expandable{padding:4px 5px}.cke_rtl a.cke_button{float:right}.cke_hc a.cke_button{border:1px solid black;padding:3px 5px;margin:0 3px 5px 0}.cke_hc.cke_rtl a.cke_button{margin:0 0 5px 3px}a.cke_button_on{background:#fff;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_on{padding:3px 4px}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_off:hover,a.cke_button_expandable.cke_button_off:focus,a.cke_button_expandable.cke_button_off:active{padding:3px 4px}.cke_hc a.cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active{background:#e5e5e5;border:3px solid #000;padding:1px 3px}a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{border:0;padding:4px 6px;background-color:transparent}a.cke_button_expandable.cke_button_disabled:hover,a.cke_button_expandable.cke_button_disabled:active{padding:4px 5px}a.cke_button_disabled:focus{border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_disabled:focus{padding:3px 4px}.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border:1px solid #acacac;padding:3px 5px;margin:0 3px 5px 0}.cke_hc a.cke_button_disabled:focus{border:3px solid #000;padding:1px 3px}.cke_hc.cke_rtl a.cke_button_disabled:hover,.cke_hc.cke_rtl a.cke_button_disabled:focus,.cke_hc.cke_rtl a.cke_button_disabled:active{margin:0 0 5px 3px}a.cke_button_disabled .cke_button_icon,a.cke_button_disabled .cke_button_arrow{opacity:.3}.cke_hc a.cke_button_disabled{border-color:#acacac}.cke_hc a.cke_button_disabled .cke_button_icon,.cke_hc a.cke_button_disabled .cke_button_label{opacity:.5}.cke_toolgroup a.cke_button:last-child:after,.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:0;right:-3px}.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-right:0;right:auto;border-left:1px solid #bcbcbc;top:0;left:-3px}.cke_hc .cke_toolgroup a.cke_button:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-color:#000;top:0;right:-7px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{top:0;right:auto;left:-7px}.cke_toolgroup a.cke_button:hover:last-child:after,.cke_toolgroup a.cke_button:focus:last-child:after,.cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:-4px}.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_rtl .cke_toolgroup a.cke_button:focus:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:auto;left:-4px}.cke_hc .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:-9px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:auto;left:-9px}.cke_toolbar.cke_toolbar_last .cke_toolgroup a.cke_button:last-child:after{content:none;border:0;width:0;height:0}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#484848}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 3px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px 0 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#bcbcbc;margin:4px 2px 0 2px;height:18px;width:1px}.cke_rtl .cke_toolbar_separator{float:right}.cke_hc .cke_toolbar_separator{background-color:#000;margin-left:2px;margin-right:5px;margin-bottom:9px}.cke_hc.cke_rtl .cke_toolbar_separator{margin-left:5px;margin-right:2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #bcbcbc}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser:hover{background:#e5e5e5}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border:3px solid transparent;border-bottom-color:#484848}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#484848}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0}.cke_menuitem span{cursor:default}.cke_menubutton{display:block}.cke_hc .cke_menubutton{padding:2px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#e9e9e9;display:block;outline:1px dotted}.cke_menubutton:hover{outline:0}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_disabled:hover,.cke_menubutton_disabled:focus,.cke_menubutton_disabled:active{background-color:transparent;outline:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#f8f8f8;padding:6px 4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#e9e9e9}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{background-color:#f8f8f8;outline:0}.cke_menuitem .cke_menubutton_on{background-color:#e9e9e9;border:1px solid #dedede;outline:0}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px;background-color:#e9e9e9}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_shortcut{color:#979797}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d1d1d1;height:1px}.cke_menuarrow{background:transparent url(images/arrow.png) no-repeat 0 10px;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_hc .cke_menuarrow{background-image:none}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left;position:relative;margin-bottom:5px}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:1px;margin-bottom:10px}.cke_combo:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:5px;top:0;right:0}.cke_rtl .cke_combo:after{border-right:0;border-left:1px solid #bcbcbc;right:auto;left:0}.cke_hc .cke_combo:after{border-color:#000}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0;padding:1px}.cke_rtl a.cke_combo_button{float:right}.cke_hc a.cke_combo_button{padding:4px}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:active{background:#e5e5e5;border:1px solid #bcbcbc;padding:0 0 0 1px;margin-left:-1px}.cke_combo_off a.cke_combo_button:focus{outline:0}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:active{background:#fff}.cke_rtl .cke_combo_on a.cke_combo_button,.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:0 1px 0 0;margin-left:0;margin-right:-1px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border:3px solid #000;padding:1px 1px 1px 2px}.cke_hc.cke_rtl .cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:1px 2px 1px 1px}.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 0 0 3px;margin-left:-3px}.cke_rtl .cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 3px 0 0;margin-left:0;margin-right:-3px}.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 1px 1px 7px;margin-left:-6px}.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 7px 1px 1px;margin-left:0;margin-right:-6px}.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0;margin:0}.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px;margin:0}.cke_toolbar .cke_combo+.cke_toolbar_end,.cke_toolbar .cke_combo+.cke_toolgroup{margin-right:0;margin-left:2px}.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:2px}.cke_hc .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:5px}.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:5px}.cke_toolbar.cke_toolbar_last .cke_combo:nth-last-child(-n+2):after{content:none;border:0;width:0;height:0}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#484848;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 10px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#484848;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#e5e5e5}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combopanel__fontsize{width:135px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;text-align:center;opacity:.95;filter:alpha(opacity = 95);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_button__about_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -456px !important;}.cke_button__copyformatting_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -480px !important;}.cke_button__creatediv_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -504px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -528px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -552px !important;}.cke_button__replace_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -576px !important;}.cke_button__flash_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -600px !important;}.cke_button__button_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -624px !important;}.cke_button__checkbox_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -648px !important;}.cke_button__form_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -672px !important;}.cke_button__hiddenfield_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -696px !important;}.cke_button__imagebutton_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -720px !important;}.cke_button__radio_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -744px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -768px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -792px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -816px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -840px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -864px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -888px !important;}.cke_button__horizontalrule_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -912px !important;}.cke_button__iframe_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -936px !important;}.cke_button__image_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -960px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -984px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1008px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1032px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1056px !important;}.cke_button__smiley_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1080px !important;}.cke_button__justifyblock_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1104px !important;}.cke_button__justifycenter_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1128px !important;}.cke_button__justifyleft_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1152px !important;}.cke_button__justifyright_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1176px !important;}.cke_button__language_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1200px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1224px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1248px !important;}.cke_button__link_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1272px !important;}.cke_button__unlink_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1296px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1320px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1344px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1368px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1392px !important;}.cke_button__maximize_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1608px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1632px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1656px !important;}.cke_button__print_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1680px !important;}.cke_button__removeformat_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1704px !important;}.cke_button__save_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1728px !important;}.cke_button__selectall_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1800px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1824px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1848px !important;}.cke_button__specialchar_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1872px !important;}.cke_button__scayt_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1896px !important;}.cke_button__table_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1968px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1992px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -2016px !important;}.cke_button__spellchecker_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -2040px !important;}.cke_rtl .cke_button__sourcedialog_icon, .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -2064px !important;}.cke_ltr .cke_button__sourcedialog_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -2088px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__copyformatting_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_hidpi .cke_button__language_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1992px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -2016px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -2040px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__sourcedialog_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -2064px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__sourcedialog_icon,.cke_ltr.cke_hidpi .cke_button__sourcedialog_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -2088px !important;background-size: 16px !important;} \ No newline at end of file +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all select[multiple] option:checked{background-color:#cecece}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #d1d1d1;padding:0}.cke_inner{display:block;background:#fff;padding:0;-webkit-touch-callout:none}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #d1d1d1;background:#f8f8f8;padding:6px 8px 2px;white-space:normal}.cke_float .cke_top{border:1px solid #d1d1d1}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #bcbcbc transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #bcbcbc;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #d1d1d1}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_block:focus{outline:0}.cke_panel_list{margin:0;padding:0;list-style-type:none;white-space:nowrap}.cke_panel_listItem{margin:0;padding:0}.cke_panel_listItem a{padding:6px 7px;display:block;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}.cke_hc .cke_panel_listItem a{border-style:none}.cke_panel_listItem.cke_selected a,.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{background-color:#e9e9e9}.cke_panel_listItem a:focus{outline:1px dotted #000}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:4px 5px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:6px 6px 7px 6px;color:#484848;border-bottom:1px solid #d1d1d1;background:#f8f8f8}.cke_colorblock{padding:10px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}a.cke_colorbox{padding:2px;float:left;width:20px;height:20px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{outline:0;padding:0;border:2px solid #139ff7}a:hover.cke_colorbox{border-color:#bcbcbc}span.cke_colorbox{width:20px;height:20px;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:3px;display:block;cursor:pointer}a.cke_colorauto{padding:0;border:1px solid transparent;margin-bottom:6px;height:26px;line-height:26px}a.cke_colormore{margin-top:10px;height:20px;line-height:19px}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{outline:0;border:#139ff7 1px solid;background-color:#f8f8f8}a:hover.cke_colorauto,a:hover.cke_colormore{border-color:#bcbcbc}.cke_colorauto span.cke_colorbox{width:18px;height:18px;border:1px solid #808080;margin-left:1px;margin-top:3px}.cke_rtl .cke_colorauto span.cke_colorbox{margin-left:0;margin-right:1px}span.cke_colorbox[style*="#ffffff"],span.cke_colorbox[style*="#FFFFFF"],span.cke_colorbox[style="background-color:#fff"],span.cke_colorbox[style="background-color:#FFF"],span.cke_colorbox[style*="rgb(255,255,255)"],span.cke_colorbox[style*="rgb(255, 255, 255)"]{border:1px solid #808080;width:18px;height:18px}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{border:0;float:left;margin:1px 2px 6px 0;padding-right:3px}.cke_rtl .cke_toolgroup{float:right;margin:1px 0 6px 2px;padding-left:3px;padding-right:0}.cke_hc .cke_toolgroup{margin-right:5px;margin-bottom:5px}.cke_hc.cke_rtl .cke_toolgroup{margin-right:0;margin-left:5px}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0;position:relative}a.cke_button_expandable{padding:4px 5px}.cke_rtl a.cke_button{float:right}.cke_hc a.cke_button{border:1px solid black;padding:3px 5px;margin:0 3px 5px 0}.cke_hc.cke_rtl a.cke_button{margin:0 0 5px 3px}a.cke_button_on{background:#fff;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_on{padding:3px 4px}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_off:hover,a.cke_button_expandable.cke_button_off:focus,a.cke_button_expandable.cke_button_off:active{padding:3px 4px}.cke_hc a.cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active{background:#e5e5e5;border:3px solid #000;padding:1px 3px}@media screen and (hover:none){a.cke_button_off:hover{background:transparent;border:0;padding:4px 6px}a.cke_button_expandable.cke_button_off:hover{padding:4px 5px}a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_off:active{padding:3px 4px}}a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{border:0;padding:4px 6px;background-color:transparent}a.cke_button_expandable.cke_button_disabled:hover,a.cke_button_expandable.cke_button_disabled:active{padding:4px 5px}a.cke_button_disabled:focus{border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_disabled:focus{padding:3px 4px}.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border:1px solid #acacac;padding:3px 5px;margin:0 3px 5px 0}.cke_hc a.cke_button_disabled:focus{border:3px solid #000;padding:1px 3px}.cke_hc.cke_rtl a.cke_button_disabled:hover,.cke_hc.cke_rtl a.cke_button_disabled:focus,.cke_hc.cke_rtl a.cke_button_disabled:active{margin:0 0 5px 3px}a.cke_button_disabled .cke_button_icon,a.cke_button_disabled .cke_button_arrow{opacity:.3}.cke_hc a.cke_button_disabled{border-color:#acacac}.cke_hc a.cke_button_disabled .cke_button_icon,.cke_hc a.cke_button_disabled .cke_button_label{opacity:.5}.cke_toolgroup a.cke_button:last-child:after,.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:0;right:-3px}.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-right:0;right:auto;border-left:1px solid #bcbcbc;top:0;left:-3px}.cke_hc .cke_toolgroup a.cke_button:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-color:#000;top:0;right:-7px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{top:0;right:auto;left:-7px}.cke_toolgroup a.cke_button:hover:last-child:after,.cke_toolgroup a.cke_button:focus:last-child:after,.cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:-4px}.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_rtl .cke_toolgroup a.cke_button:focus:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:auto;left:-4px}.cke_hc .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:-9px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:auto;left:-9px}.cke_toolbar.cke_toolbar_last .cke_toolgroup a.cke_button:last-child:after{content:none;border:0;width:0;height:0}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#484848}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 3px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px 0 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#bcbcbc;margin:4px 2px 0 2px;height:18px;width:1px}.cke_rtl .cke_toolbar_separator{float:right}.cke_hc .cke_toolbar_separator{background-color:#000;margin-left:2px;margin-right:5px;margin-bottom:9px}.cke_hc.cke_rtl .cke_toolbar_separator{margin-left:5px;margin-right:2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #bcbcbc}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser:hover{background:#e5e5e5}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border:3px solid transparent;border-bottom-color:#484848}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#484848}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0}.cke_menuitem span{cursor:default}.cke_menubutton{display:block}.cke_hc .cke_menubutton{padding:2px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#e9e9e9;display:block;outline:1px dotted}.cke_menubutton:hover{outline:0}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_disabled:hover,.cke_menubutton_disabled:focus,.cke_menubutton_disabled:active{background-color:transparent;outline:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#f8f8f8;padding:6px 4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#e9e9e9}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{background-color:#f8f8f8;outline:0}.cke_menuitem .cke_menubutton_on{background-color:#e9e9e9;border:1px solid #dedede;outline:0}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px;background-color:#e9e9e9}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_shortcut{color:#979797}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d1d1d1;height:1px}.cke_menuarrow{background:transparent url(images/arrow.png) no-repeat 0 10px;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_hc .cke_menuarrow{background-image:none}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left;position:relative;margin-bottom:5px}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:1px;margin-bottom:10px}.cke_combo:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:5px;top:0;right:0}.cke_rtl .cke_combo:after{border-right:0;border-left:1px solid #bcbcbc;right:auto;left:0}.cke_hc .cke_combo:after{border-color:#000}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0;padding:1px}.cke_rtl a.cke_combo_button{float:right}.cke_hc a.cke_combo_button{padding:4px}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:active{background:#e5e5e5;border:1px solid #bcbcbc;padding:0 0 0 1px;margin-left:-1px}.cke_combo_off a.cke_combo_button:focus{outline:0}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:active{background:#fff}@media screen and (hover:none){.cke_combo_off a.cke_combo_button:hover{background:transparent;border-color:transparent}.cke_combo_off a.cke_combo_button:active{background:#fff;border:1px solid #bcbcbc}}.cke_rtl .cke_combo_on a.cke_combo_button,.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:0 1px 0 0;margin-left:0;margin-right:-1px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border:3px solid #000;padding:1px 1px 1px 2px}.cke_hc.cke_rtl .cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:1px 2px 1px 1px}.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 0 0 3px;margin-left:-3px}.cke_rtl .cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 3px 0 0;margin-left:0;margin-right:-3px}.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 1px 1px 7px;margin-left:-6px}.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 7px 1px 1px;margin-left:0;margin-right:-6px}.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0;margin:0}.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px;margin:0}.cke_toolbar .cke_combo+.cke_toolbar_end,.cke_toolbar .cke_combo+.cke_toolgroup{margin-right:0;margin-left:2px}.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:2px}.cke_hc .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:5px}.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:5px}.cke_toolbar.cke_toolbar_last .cke_combo:nth-last-child(-n+2):after{content:none;border:0;width:0;height:0}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#484848;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 10px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#484848;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#e5e5e5}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combopanel__fontsize{width:135px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;text-align:center;opacity:.95;filter:alpha(opacity = 95);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_button__about_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -456px !important;}.cke_button__copyformatting_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -480px !important;}.cke_button__creatediv_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -504px !important;}.cke_button__exportpdf_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -528px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -552px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -576px !important;}.cke_button__replace_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -600px !important;}.cke_button__button_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -624px !important;}.cke_button__checkbox_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -648px !important;}.cke_button__form_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -672px !important;}.cke_button__hiddenfield_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -696px !important;}.cke_button__imagebutton_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -720px !important;}.cke_button__radio_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -744px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -768px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -792px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -816px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -840px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -864px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -888px !important;}.cke_button__horizontalrule_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -912px !important;}.cke_button__iframe_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -936px !important;}.cke_button__image_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -960px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -984px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1008px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1032px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1056px !important;}.cke_button__smiley_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1080px !important;}.cke_button__justifyblock_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1104px !important;}.cke_button__justifycenter_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1128px !important;}.cke_button__justifyleft_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1152px !important;}.cke_button__justifyright_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1176px !important;}.cke_button__language_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1200px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1224px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1248px !important;}.cke_button__link_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1272px !important;}.cke_button__unlink_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1296px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1320px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1344px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1368px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1392px !important;}.cke_button__maximize_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1608px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1632px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1656px !important;}.cke_button__print_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1680px !important;}.cke_button__removeformat_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1704px !important;}.cke_button__save_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1728px !important;}.cke_button__selectall_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1800px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1824px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1848px !important;}.cke_button__specialchar_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1872px !important;}.cke_button__scayt_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1896px !important;}.cke_button__table_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1968px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1992px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -2016px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__copyformatting_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__exportpdf_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_hidpi .cke_button__language_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1992px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -2016px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/editor_ie8.css b/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/editor_ie8.css index 7f1f2167a7b..acf8132314e 100644 --- a/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/editor_ie8.css +++ b/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/editor_ie8.css @@ -1,5 +1,5 @@ /* -Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. +Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ -.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #d1d1d1;padding:0}.cke_inner{display:block;background:#fff;padding:0;-webkit-touch-callout:none}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #d1d1d1;background:#f8f8f8;padding:6px 8px 2px;white-space:normal}.cke_float .cke_top{border:1px solid #d1d1d1}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #bcbcbc transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #bcbcbc;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #d1d1d1}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_block:focus{outline:0}.cke_panel_list{margin:0;padding:0;list-style-type:none;white-space:nowrap}.cke_panel_listItem{margin:0;padding:0}.cke_panel_listItem a{padding:6px 7px;display:block;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}.cke_hc .cke_panel_listItem a{border-style:none}.cke_panel_listItem.cke_selected a,.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{background-color:#e9e9e9}.cke_panel_listItem a:focus{outline:1px dotted #000}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:4px 5px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:6px 6px 7px 6px;color:#484848;border-bottom:1px solid #d1d1d1;background:#f8f8f8}.cke_colorblock{padding:10px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}a.cke_colorbox{padding:2px;float:left;width:20px;height:20px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{outline:0;padding:0;border:2px solid #139ff7}a:hover.cke_colorbox{border-color:#bcbcbc}span.cke_colorbox{width:20px;height:20px;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:3px;display:block;cursor:pointer}a.cke_colorauto{padding:0;border:1px solid transparent;margin-bottom:6px;height:26px;line-height:26px}a.cke_colormore{margin-top:10px;height:20px;line-height:19px}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{outline:0;border:#139ff7 1px solid;background-color:#f8f8f8}a:hover.cke_colorauto,a:hover.cke_colormore{border-color:#bcbcbc}.cke_colorauto span.cke_colorbox{width:18px;height:18px;border:1px solid #808080;margin-left:1px;margin-top:3px}.cke_rtl .cke_colorauto span.cke_colorbox{margin-left:0;margin-right:1px}span.cke_colorbox[style*="#ffffff"],span.cke_colorbox[style*="#FFFFFF"],span.cke_colorbox[style="background-color:#fff"],span.cke_colorbox[style="background-color:#FFF"],span.cke_colorbox[style*="rgb(255,255,255)"],span.cke_colorbox[style*="rgb(255, 255, 255)"]{border:1px solid #808080;width:18px;height:18px}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{border:0;float:left;margin:1px 2px 6px 0;padding-right:3px}.cke_rtl .cke_toolgroup{float:right;margin:1px 0 6px 2px;padding-left:3px;padding-right:0}.cke_hc .cke_toolgroup{margin-right:5px;margin-bottom:5px}.cke_hc.cke_rtl .cke_toolgroup{margin-right:0;margin-left:5px}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0;position:relative}a.cke_button_expandable{padding:4px 5px}.cke_rtl a.cke_button{float:right}.cke_hc a.cke_button{border:1px solid black;padding:3px 5px;margin:0 3px 5px 0}.cke_hc.cke_rtl a.cke_button{margin:0 0 5px 3px}a.cke_button_on{background:#fff;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_on{padding:3px 4px}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_off:hover,a.cke_button_expandable.cke_button_off:focus,a.cke_button_expandable.cke_button_off:active{padding:3px 4px}.cke_hc a.cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active{background:#e5e5e5;border:3px solid #000;padding:1px 3px}a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{border:0;padding:4px 6px;background-color:transparent}a.cke_button_expandable.cke_button_disabled:hover,a.cke_button_expandable.cke_button_disabled:active{padding:4px 5px}a.cke_button_disabled:focus{border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_disabled:focus{padding:3px 4px}.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border:1px solid #acacac;padding:3px 5px;margin:0 3px 5px 0}.cke_hc a.cke_button_disabled:focus{border:3px solid #000;padding:1px 3px}.cke_hc.cke_rtl a.cke_button_disabled:hover,.cke_hc.cke_rtl a.cke_button_disabled:focus,.cke_hc.cke_rtl a.cke_button_disabled:active{margin:0 0 5px 3px}a.cke_button_disabled .cke_button_icon,a.cke_button_disabled .cke_button_arrow{opacity:.3}.cke_hc a.cke_button_disabled{border-color:#acacac}.cke_hc a.cke_button_disabled .cke_button_icon,.cke_hc a.cke_button_disabled .cke_button_label{opacity:.5}.cke_toolgroup a.cke_button:last-child:after,.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:0;right:-3px}.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-right:0;right:auto;border-left:1px solid #bcbcbc;top:0;left:-3px}.cke_hc .cke_toolgroup a.cke_button:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-color:#000;top:0;right:-7px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{top:0;right:auto;left:-7px}.cke_toolgroup a.cke_button:hover:last-child:after,.cke_toolgroup a.cke_button:focus:last-child:after,.cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:-4px}.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_rtl .cke_toolgroup a.cke_button:focus:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:auto;left:-4px}.cke_hc .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:-9px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:auto;left:-9px}.cke_toolbar.cke_toolbar_last .cke_toolgroup a.cke_button:last-child:after{content:none;border:0;width:0;height:0}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#484848}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 3px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px 0 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#bcbcbc;margin:4px 2px 0 2px;height:18px;width:1px}.cke_rtl .cke_toolbar_separator{float:right}.cke_hc .cke_toolbar_separator{background-color:#000;margin-left:2px;margin-right:5px;margin-bottom:9px}.cke_hc.cke_rtl .cke_toolbar_separator{margin-left:5px;margin-right:2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #bcbcbc}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser:hover{background:#e5e5e5}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border:3px solid transparent;border-bottom-color:#484848}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#484848}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0}.cke_menuitem span{cursor:default}.cke_menubutton{display:block}.cke_hc .cke_menubutton{padding:2px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#e9e9e9;display:block;outline:1px dotted}.cke_menubutton:hover{outline:0}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_disabled:hover,.cke_menubutton_disabled:focus,.cke_menubutton_disabled:active{background-color:transparent;outline:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#f8f8f8;padding:6px 4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#e9e9e9}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{background-color:#f8f8f8;outline:0}.cke_menuitem .cke_menubutton_on{background-color:#e9e9e9;border:1px solid #dedede;outline:0}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px;background-color:#e9e9e9}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_shortcut{color:#979797}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d1d1d1;height:1px}.cke_menuarrow{background:transparent url(images/arrow.png) no-repeat 0 10px;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_hc .cke_menuarrow{background-image:none}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left;position:relative;margin-bottom:5px}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:1px;margin-bottom:10px}.cke_combo:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:5px;top:0;right:0}.cke_rtl .cke_combo:after{border-right:0;border-left:1px solid #bcbcbc;right:auto;left:0}.cke_hc .cke_combo:after{border-color:#000}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0;padding:1px}.cke_rtl a.cke_combo_button{float:right}.cke_hc a.cke_combo_button{padding:4px}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:active{background:#e5e5e5;border:1px solid #bcbcbc;padding:0 0 0 1px;margin-left:-1px}.cke_combo_off a.cke_combo_button:focus{outline:0}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:active{background:#fff}.cke_rtl .cke_combo_on a.cke_combo_button,.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:0 1px 0 0;margin-left:0;margin-right:-1px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border:3px solid #000;padding:1px 1px 1px 2px}.cke_hc.cke_rtl .cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:1px 2px 1px 1px}.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 0 0 3px;margin-left:-3px}.cke_rtl .cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 3px 0 0;margin-left:0;margin-right:-3px}.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 1px 1px 7px;margin-left:-6px}.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 7px 1px 1px;margin-left:0;margin-right:-6px}.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0;margin:0}.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px;margin:0}.cke_toolbar .cke_combo+.cke_toolbar_end,.cke_toolbar .cke_combo+.cke_toolgroup{margin-right:0;margin-left:2px}.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:2px}.cke_hc .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:5px}.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:5px}.cke_toolbar.cke_toolbar_last .cke_combo:nth-last-child(-n+2):after{content:none;border:0;width:0;height:0}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#484848;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 10px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#484848;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#e5e5e5}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combopanel__fontsize{width:135px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;text-align:center;opacity:.95;filter:alpha(opacity = 95);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_toolbar{position:relative}.cke_rtl .cke_toolbar_end{right:auto;left:0}.cke_toolbar_end:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:1px;right:2px}.cke_rtl .cke_toolbar_end:after{right:auto;left:2px}.cke_hc .cke_toolbar_end:after{top:2px;right:5px;border-color:#000}.cke_hc.cke_rtl .cke_toolbar_end:after{right:auto;left:5px}.cke_combo+.cke_toolbar_end:after,.cke_toolbar.cke_toolbar_last .cke_toolbar_end:after{content:none;border:0}.cke_combo+.cke_toolgroup+.cke_toolbar_end:after{right:0}.cke_rtl .cke_combo+.cke_toolgroup+.cke_toolbar_end:after{right:auto;left:0}.cke_button__about_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -456px !important;}.cke_button__copyformatting_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -480px !important;}.cke_button__creatediv_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -504px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -528px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -552px !important;}.cke_button__replace_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -576px !important;}.cke_button__flash_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -600px !important;}.cke_button__button_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -624px !important;}.cke_button__checkbox_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -648px !important;}.cke_button__form_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -672px !important;}.cke_button__hiddenfield_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -696px !important;}.cke_button__imagebutton_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -720px !important;}.cke_button__radio_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -744px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -768px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -792px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -816px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -840px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -864px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -888px !important;}.cke_button__horizontalrule_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -912px !important;}.cke_button__iframe_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -936px !important;}.cke_button__image_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -960px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -984px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1008px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1032px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1056px !important;}.cke_button__smiley_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1080px !important;}.cke_button__justifyblock_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1104px !important;}.cke_button__justifycenter_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1128px !important;}.cke_button__justifyleft_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1152px !important;}.cke_button__justifyright_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1176px !important;}.cke_button__language_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1200px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1224px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1248px !important;}.cke_button__link_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1272px !important;}.cke_button__unlink_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1296px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1320px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1344px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1368px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1392px !important;}.cke_button__maximize_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1608px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1632px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1656px !important;}.cke_button__print_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1680px !important;}.cke_button__removeformat_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1704px !important;}.cke_button__save_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1728px !important;}.cke_button__selectall_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1800px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1824px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1848px !important;}.cke_button__specialchar_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1872px !important;}.cke_button__scayt_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1896px !important;}.cke_button__table_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1968px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1992px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -2016px !important;}.cke_button__spellchecker_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -2040px !important;}.cke_rtl .cke_button__sourcedialog_icon, .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -2064px !important;}.cke_ltr .cke_button__sourcedialog_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -2088px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__copyformatting_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_hidpi .cke_button__language_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1992px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -2016px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -2040px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__sourcedialog_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -2064px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__sourcedialog_icon,.cke_ltr.cke_hidpi .cke_button__sourcedialog_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -2088px !important;background-size: 16px !important;} \ No newline at end of file +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all select[multiple] option:checked{background-color:#cecece}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #d1d1d1;padding:0}.cke_inner{display:block;background:#fff;padding:0;-webkit-touch-callout:none}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #d1d1d1;background:#f8f8f8;padding:6px 8px 2px;white-space:normal}.cke_float .cke_top{border:1px solid #d1d1d1}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #bcbcbc transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #bcbcbc;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #d1d1d1}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_block:focus{outline:0}.cke_panel_list{margin:0;padding:0;list-style-type:none;white-space:nowrap}.cke_panel_listItem{margin:0;padding:0}.cke_panel_listItem a{padding:6px 7px;display:block;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}.cke_hc .cke_panel_listItem a{border-style:none}.cke_panel_listItem.cke_selected a,.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{background-color:#e9e9e9}.cke_panel_listItem a:focus{outline:1px dotted #000}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:4px 5px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:6px 6px 7px 6px;color:#484848;border-bottom:1px solid #d1d1d1;background:#f8f8f8}.cke_colorblock{padding:10px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}a.cke_colorbox{padding:2px;float:left;width:20px;height:20px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{outline:0;padding:0;border:2px solid #139ff7}a:hover.cke_colorbox{border-color:#bcbcbc}span.cke_colorbox{width:20px;height:20px;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:3px;display:block;cursor:pointer}a.cke_colorauto{padding:0;border:1px solid transparent;margin-bottom:6px;height:26px;line-height:26px}a.cke_colormore{margin-top:10px;height:20px;line-height:19px}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{outline:0;border:#139ff7 1px solid;background-color:#f8f8f8}a:hover.cke_colorauto,a:hover.cke_colormore{border-color:#bcbcbc}.cke_colorauto span.cke_colorbox{width:18px;height:18px;border:1px solid #808080;margin-left:1px;margin-top:3px}.cke_rtl .cke_colorauto span.cke_colorbox{margin-left:0;margin-right:1px}span.cke_colorbox[style*="#ffffff"],span.cke_colorbox[style*="#FFFFFF"],span.cke_colorbox[style="background-color:#fff"],span.cke_colorbox[style="background-color:#FFF"],span.cke_colorbox[style*="rgb(255,255,255)"],span.cke_colorbox[style*="rgb(255, 255, 255)"]{border:1px solid #808080;width:18px;height:18px}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{border:0;float:left;margin:1px 2px 6px 0;padding-right:3px}.cke_rtl .cke_toolgroup{float:right;margin:1px 0 6px 2px;padding-left:3px;padding-right:0}.cke_hc .cke_toolgroup{margin-right:5px;margin-bottom:5px}.cke_hc.cke_rtl .cke_toolgroup{margin-right:0;margin-left:5px}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0;position:relative}a.cke_button_expandable{padding:4px 5px}.cke_rtl a.cke_button{float:right}.cke_hc a.cke_button{border:1px solid black;padding:3px 5px;margin:0 3px 5px 0}.cke_hc.cke_rtl a.cke_button{margin:0 0 5px 3px}a.cke_button_on{background:#fff;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_on{padding:3px 4px}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_off:hover,a.cke_button_expandable.cke_button_off:focus,a.cke_button_expandable.cke_button_off:active{padding:3px 4px}.cke_hc a.cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active{background:#e5e5e5;border:3px solid #000;padding:1px 3px}@media screen and (hover:none){a.cke_button_off:hover{background:transparent;border:0;padding:4px 6px}a.cke_button_expandable.cke_button_off:hover{padding:4px 5px}a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_off:active{padding:3px 4px}}a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{border:0;padding:4px 6px;background-color:transparent}a.cke_button_expandable.cke_button_disabled:hover,a.cke_button_expandable.cke_button_disabled:active{padding:4px 5px}a.cke_button_disabled:focus{border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_disabled:focus{padding:3px 4px}.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border:1px solid #acacac;padding:3px 5px;margin:0 3px 5px 0}.cke_hc a.cke_button_disabled:focus{border:3px solid #000;padding:1px 3px}.cke_hc.cke_rtl a.cke_button_disabled:hover,.cke_hc.cke_rtl a.cke_button_disabled:focus,.cke_hc.cke_rtl a.cke_button_disabled:active{margin:0 0 5px 3px}a.cke_button_disabled .cke_button_icon,a.cke_button_disabled .cke_button_arrow{opacity:.3}.cke_hc a.cke_button_disabled{border-color:#acacac}.cke_hc a.cke_button_disabled .cke_button_icon,.cke_hc a.cke_button_disabled .cke_button_label{opacity:.5}.cke_toolgroup a.cke_button:last-child:after,.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:0;right:-3px}.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-right:0;right:auto;border-left:1px solid #bcbcbc;top:0;left:-3px}.cke_hc .cke_toolgroup a.cke_button:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-color:#000;top:0;right:-7px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{top:0;right:auto;left:-7px}.cke_toolgroup a.cke_button:hover:last-child:after,.cke_toolgroup a.cke_button:focus:last-child:after,.cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:-4px}.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_rtl .cke_toolgroup a.cke_button:focus:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:auto;left:-4px}.cke_hc .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:-9px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:auto;left:-9px}.cke_toolbar.cke_toolbar_last .cke_toolgroup a.cke_button:last-child:after{content:none;border:0;width:0;height:0}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#484848}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 3px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px 0 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#bcbcbc;margin:4px 2px 0 2px;height:18px;width:1px}.cke_rtl .cke_toolbar_separator{float:right}.cke_hc .cke_toolbar_separator{background-color:#000;margin-left:2px;margin-right:5px;margin-bottom:9px}.cke_hc.cke_rtl .cke_toolbar_separator{margin-left:5px;margin-right:2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #bcbcbc}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser:hover{background:#e5e5e5}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border:3px solid transparent;border-bottom-color:#484848}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#484848}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0}.cke_menuitem span{cursor:default}.cke_menubutton{display:block}.cke_hc .cke_menubutton{padding:2px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#e9e9e9;display:block;outline:1px dotted}.cke_menubutton:hover{outline:0}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_disabled:hover,.cke_menubutton_disabled:focus,.cke_menubutton_disabled:active{background-color:transparent;outline:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#f8f8f8;padding:6px 4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#e9e9e9}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{background-color:#f8f8f8;outline:0}.cke_menuitem .cke_menubutton_on{background-color:#e9e9e9;border:1px solid #dedede;outline:0}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px;background-color:#e9e9e9}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_shortcut{color:#979797}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d1d1d1;height:1px}.cke_menuarrow{background:transparent url(images/arrow.png) no-repeat 0 10px;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_hc .cke_menuarrow{background-image:none}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left;position:relative;margin-bottom:5px}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:1px;margin-bottom:10px}.cke_combo:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:5px;top:0;right:0}.cke_rtl .cke_combo:after{border-right:0;border-left:1px solid #bcbcbc;right:auto;left:0}.cke_hc .cke_combo:after{border-color:#000}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0;padding:1px}.cke_rtl a.cke_combo_button{float:right}.cke_hc a.cke_combo_button{padding:4px}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:active{background:#e5e5e5;border:1px solid #bcbcbc;padding:0 0 0 1px;margin-left:-1px}.cke_combo_off a.cke_combo_button:focus{outline:0}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:active{background:#fff}@media screen and (hover:none){.cke_combo_off a.cke_combo_button:hover{background:transparent;border-color:transparent}.cke_combo_off a.cke_combo_button:active{background:#fff;border:1px solid #bcbcbc}}.cke_rtl .cke_combo_on a.cke_combo_button,.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:0 1px 0 0;margin-left:0;margin-right:-1px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border:3px solid #000;padding:1px 1px 1px 2px}.cke_hc.cke_rtl .cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:1px 2px 1px 1px}.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 0 0 3px;margin-left:-3px}.cke_rtl .cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 3px 0 0;margin-left:0;margin-right:-3px}.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 1px 1px 7px;margin-left:-6px}.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 7px 1px 1px;margin-left:0;margin-right:-6px}.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0;margin:0}.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px;margin:0}.cke_toolbar .cke_combo+.cke_toolbar_end,.cke_toolbar .cke_combo+.cke_toolgroup{margin-right:0;margin-left:2px}.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:2px}.cke_hc .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:5px}.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:5px}.cke_toolbar.cke_toolbar_last .cke_combo:nth-last-child(-n+2):after{content:none;border:0;width:0;height:0}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#484848;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 10px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#484848;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#e5e5e5}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combopanel__fontsize{width:135px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;text-align:center;opacity:.95;filter:alpha(opacity = 95);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_toolbar{position:relative}.cke_rtl .cke_toolbar_end{right:auto;left:0}.cke_toolbar_end:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:1px;right:2px}.cke_rtl .cke_toolbar_end:after{right:auto;left:2px}.cke_hc .cke_toolbar_end:after{top:2px;right:5px;border-color:#000}.cke_hc.cke_rtl .cke_toolbar_end:after{right:auto;left:5px}.cke_combo+.cke_toolbar_end:after,.cke_toolbar.cke_toolbar_last .cke_toolbar_end:after{content:none;border:0}.cke_combo+.cke_toolgroup+.cke_toolbar_end:after{right:0}.cke_rtl .cke_combo+.cke_toolgroup+.cke_toolbar_end:after{right:auto;left:0}.cke_button__about_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -456px !important;}.cke_button__copyformatting_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -480px !important;}.cke_button__creatediv_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -504px !important;}.cke_button__exportpdf_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -528px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -552px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -576px !important;}.cke_button__replace_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -600px !important;}.cke_button__button_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -624px !important;}.cke_button__checkbox_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -648px !important;}.cke_button__form_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -672px !important;}.cke_button__hiddenfield_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -696px !important;}.cke_button__imagebutton_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -720px !important;}.cke_button__radio_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -744px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -768px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -792px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -816px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -840px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -864px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -888px !important;}.cke_button__horizontalrule_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -912px !important;}.cke_button__iframe_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -936px !important;}.cke_button__image_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -960px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -984px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1008px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1032px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1056px !important;}.cke_button__smiley_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1080px !important;}.cke_button__justifyblock_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1104px !important;}.cke_button__justifycenter_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1128px !important;}.cke_button__justifyleft_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1152px !important;}.cke_button__justifyright_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1176px !important;}.cke_button__language_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1200px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1224px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1248px !important;}.cke_button__link_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1272px !important;}.cke_button__unlink_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1296px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1320px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1344px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1368px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1392px !important;}.cke_button__maximize_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1608px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1632px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1656px !important;}.cke_button__print_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1680px !important;}.cke_button__removeformat_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1704px !important;}.cke_button__save_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1728px !important;}.cke_button__selectall_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1800px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1824px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1848px !important;}.cke_button__specialchar_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1872px !important;}.cke_button__scayt_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1896px !important;}.cke_button__table_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1968px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1992px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -2016px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__copyformatting_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__exportpdf_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_hidpi .cke_button__language_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1992px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -2016px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/editor_iequirks.css b/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/editor_iequirks.css index 6a94fa6a3c6..e383bb7cb82 100644 --- a/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/editor_iequirks.css +++ b/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/editor_iequirks.css @@ -1,5 +1,5 @@ /* -Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. +Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ -.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #d1d1d1;padding:0}.cke_inner{display:block;background:#fff;padding:0;-webkit-touch-callout:none}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #d1d1d1;background:#f8f8f8;padding:6px 8px 2px;white-space:normal}.cke_float .cke_top{border:1px solid #d1d1d1}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #bcbcbc transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #bcbcbc;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #d1d1d1}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_block:focus{outline:0}.cke_panel_list{margin:0;padding:0;list-style-type:none;white-space:nowrap}.cke_panel_listItem{margin:0;padding:0}.cke_panel_listItem a{padding:6px 7px;display:block;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}.cke_hc .cke_panel_listItem a{border-style:none}.cke_panel_listItem.cke_selected a,.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{background-color:#e9e9e9}.cke_panel_listItem a:focus{outline:1px dotted #000}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:4px 5px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:6px 6px 7px 6px;color:#484848;border-bottom:1px solid #d1d1d1;background:#f8f8f8}.cke_colorblock{padding:10px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}a.cke_colorbox{padding:2px;float:left;width:20px;height:20px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{outline:0;padding:0;border:2px solid #139ff7}a:hover.cke_colorbox{border-color:#bcbcbc}span.cke_colorbox{width:20px;height:20px;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:3px;display:block;cursor:pointer}a.cke_colorauto{padding:0;border:1px solid transparent;margin-bottom:6px;height:26px;line-height:26px}a.cke_colormore{margin-top:10px;height:20px;line-height:19px}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{outline:0;border:#139ff7 1px solid;background-color:#f8f8f8}a:hover.cke_colorauto,a:hover.cke_colormore{border-color:#bcbcbc}.cke_colorauto span.cke_colorbox{width:18px;height:18px;border:1px solid #808080;margin-left:1px;margin-top:3px}.cke_rtl .cke_colorauto span.cke_colorbox{margin-left:0;margin-right:1px}span.cke_colorbox[style*="#ffffff"],span.cke_colorbox[style*="#FFFFFF"],span.cke_colorbox[style="background-color:#fff"],span.cke_colorbox[style="background-color:#FFF"],span.cke_colorbox[style*="rgb(255,255,255)"],span.cke_colorbox[style*="rgb(255, 255, 255)"]{border:1px solid #808080;width:18px;height:18px}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{border:0;float:left;margin:1px 2px 6px 0;padding-right:3px}.cke_rtl .cke_toolgroup{float:right;margin:1px 0 6px 2px;padding-left:3px;padding-right:0}.cke_hc .cke_toolgroup{margin-right:5px;margin-bottom:5px}.cke_hc.cke_rtl .cke_toolgroup{margin-right:0;margin-left:5px}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0;position:relative}a.cke_button_expandable{padding:4px 5px}.cke_rtl a.cke_button{float:right}.cke_hc a.cke_button{border:1px solid black;padding:3px 5px;margin:0 3px 5px 0}.cke_hc.cke_rtl a.cke_button{margin:0 0 5px 3px}a.cke_button_on{background:#fff;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_on{padding:3px 4px}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_off:hover,a.cke_button_expandable.cke_button_off:focus,a.cke_button_expandable.cke_button_off:active{padding:3px 4px}.cke_hc a.cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active{background:#e5e5e5;border:3px solid #000;padding:1px 3px}a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{border:0;padding:4px 6px;background-color:transparent}a.cke_button_expandable.cke_button_disabled:hover,a.cke_button_expandable.cke_button_disabled:active{padding:4px 5px}a.cke_button_disabled:focus{border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_disabled:focus{padding:3px 4px}.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border:1px solid #acacac;padding:3px 5px;margin:0 3px 5px 0}.cke_hc a.cke_button_disabled:focus{border:3px solid #000;padding:1px 3px}.cke_hc.cke_rtl a.cke_button_disabled:hover,.cke_hc.cke_rtl a.cke_button_disabled:focus,.cke_hc.cke_rtl a.cke_button_disabled:active{margin:0 0 5px 3px}a.cke_button_disabled .cke_button_icon,a.cke_button_disabled .cke_button_arrow{opacity:.3}.cke_hc a.cke_button_disabled{border-color:#acacac}.cke_hc a.cke_button_disabled .cke_button_icon,.cke_hc a.cke_button_disabled .cke_button_label{opacity:.5}.cke_toolgroup a.cke_button:last-child:after,.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:0;right:-3px}.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-right:0;right:auto;border-left:1px solid #bcbcbc;top:0;left:-3px}.cke_hc .cke_toolgroup a.cke_button:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-color:#000;top:0;right:-7px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{top:0;right:auto;left:-7px}.cke_toolgroup a.cke_button:hover:last-child:after,.cke_toolgroup a.cke_button:focus:last-child:after,.cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:-4px}.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_rtl .cke_toolgroup a.cke_button:focus:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:auto;left:-4px}.cke_hc .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:-9px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:auto;left:-9px}.cke_toolbar.cke_toolbar_last .cke_toolgroup a.cke_button:last-child:after{content:none;border:0;width:0;height:0}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#484848}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 3px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px 0 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#bcbcbc;margin:4px 2px 0 2px;height:18px;width:1px}.cke_rtl .cke_toolbar_separator{float:right}.cke_hc .cke_toolbar_separator{background-color:#000;margin-left:2px;margin-right:5px;margin-bottom:9px}.cke_hc.cke_rtl .cke_toolbar_separator{margin-left:5px;margin-right:2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #bcbcbc}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser:hover{background:#e5e5e5}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border:3px solid transparent;border-bottom-color:#484848}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#484848}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0}.cke_menuitem span{cursor:default}.cke_menubutton{display:block}.cke_hc .cke_menubutton{padding:2px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#e9e9e9;display:block;outline:1px dotted}.cke_menubutton:hover{outline:0}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_disabled:hover,.cke_menubutton_disabled:focus,.cke_menubutton_disabled:active{background-color:transparent;outline:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#f8f8f8;padding:6px 4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#e9e9e9}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{background-color:#f8f8f8;outline:0}.cke_menuitem .cke_menubutton_on{background-color:#e9e9e9;border:1px solid #dedede;outline:0}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px;background-color:#e9e9e9}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_shortcut{color:#979797}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d1d1d1;height:1px}.cke_menuarrow{background:transparent url(images/arrow.png) no-repeat 0 10px;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_hc .cke_menuarrow{background-image:none}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left;position:relative;margin-bottom:5px}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:1px;margin-bottom:10px}.cke_combo:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:5px;top:0;right:0}.cke_rtl .cke_combo:after{border-right:0;border-left:1px solid #bcbcbc;right:auto;left:0}.cke_hc .cke_combo:after{border-color:#000}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0;padding:1px}.cke_rtl a.cke_combo_button{float:right}.cke_hc a.cke_combo_button{padding:4px}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:active{background:#e5e5e5;border:1px solid #bcbcbc;padding:0 0 0 1px;margin-left:-1px}.cke_combo_off a.cke_combo_button:focus{outline:0}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:active{background:#fff}.cke_rtl .cke_combo_on a.cke_combo_button,.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:0 1px 0 0;margin-left:0;margin-right:-1px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border:3px solid #000;padding:1px 1px 1px 2px}.cke_hc.cke_rtl .cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:1px 2px 1px 1px}.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 0 0 3px;margin-left:-3px}.cke_rtl .cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 3px 0 0;margin-left:0;margin-right:-3px}.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 1px 1px 7px;margin-left:-6px}.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 7px 1px 1px;margin-left:0;margin-right:-6px}.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0;margin:0}.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px;margin:0}.cke_toolbar .cke_combo+.cke_toolbar_end,.cke_toolbar .cke_combo+.cke_toolgroup{margin-right:0;margin-left:2px}.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:2px}.cke_hc .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:5px}.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:5px}.cke_toolbar.cke_toolbar_last .cke_combo:nth-last-child(-n+2):after{content:none;border:0;width:0;height:0}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#484848;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 10px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#484848;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#e5e5e5}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combopanel__fontsize{width:135px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;text-align:center;opacity:.95;filter:alpha(opacity = 95);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_top,.cke_contents,.cke_bottom{width:100%}.cke_button_arrow{font-size:0}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon{display:inline-block;vertical-align:top}.cke_rtl .cke_button_icon{float:none}.cke_resizer{width:10px}.cke_source{white-space:normal}.cke_bottom{position:static}.cke_colorbox{font-size:0}.cke_button__about_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -456px !important;}.cke_button__copyformatting_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -480px !important;}.cke_button__creatediv_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -504px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -528px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -552px !important;}.cke_button__replace_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -576px !important;}.cke_button__flash_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -600px !important;}.cke_button__button_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -624px !important;}.cke_button__checkbox_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -648px !important;}.cke_button__form_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -672px !important;}.cke_button__hiddenfield_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -696px !important;}.cke_button__imagebutton_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -720px !important;}.cke_button__radio_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -744px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -768px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -792px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -816px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -840px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -864px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -888px !important;}.cke_button__horizontalrule_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -912px !important;}.cke_button__iframe_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -936px !important;}.cke_button__image_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -960px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -984px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1008px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1032px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1056px !important;}.cke_button__smiley_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1080px !important;}.cke_button__justifyblock_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1104px !important;}.cke_button__justifycenter_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1128px !important;}.cke_button__justifyleft_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1152px !important;}.cke_button__justifyright_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1176px !important;}.cke_button__language_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1200px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1224px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1248px !important;}.cke_button__link_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1272px !important;}.cke_button__unlink_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1296px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1320px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1344px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1368px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1392px !important;}.cke_button__maximize_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1608px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1632px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1656px !important;}.cke_button__print_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1680px !important;}.cke_button__removeformat_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1704px !important;}.cke_button__save_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1728px !important;}.cke_button__selectall_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1800px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1824px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1848px !important;}.cke_button__specialchar_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1872px !important;}.cke_button__scayt_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1896px !important;}.cke_button__table_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1968px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -1992px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -2016px !important;}.cke_button__spellchecker_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -2040px !important;}.cke_rtl .cke_button__sourcedialog_icon, .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -2064px !important;}.cke_ltr .cke_button__sourcedialog_icon {background: url(icons.png?t=64749bb245) no-repeat 0 -2088px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__copyformatting_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_hidpi .cke_button__language_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -1992px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -2016px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -2040px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__sourcedialog_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -2064px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__sourcedialog_icon,.cke_ltr.cke_hidpi .cke_button__sourcedialog_icon {background: url(icons_hidpi.png?t=64749bb245) no-repeat 0 -2088px !important;background-size: 16px !important;} \ No newline at end of file +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all select[multiple] option:checked{background-color:#cecece}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #d1d1d1;padding:0}.cke_inner{display:block;background:#fff;padding:0;-webkit-touch-callout:none}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #d1d1d1;background:#f8f8f8;padding:6px 8px 2px;white-space:normal}.cke_float .cke_top{border:1px solid #d1d1d1}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #bcbcbc transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #bcbcbc;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #d1d1d1}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_block:focus{outline:0}.cke_panel_list{margin:0;padding:0;list-style-type:none;white-space:nowrap}.cke_panel_listItem{margin:0;padding:0}.cke_panel_listItem a{padding:6px 7px;display:block;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}.cke_hc .cke_panel_listItem a{border-style:none}.cke_panel_listItem.cke_selected a,.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{background-color:#e9e9e9}.cke_panel_listItem a:focus{outline:1px dotted #000}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:4px 5px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:6px 6px 7px 6px;color:#484848;border-bottom:1px solid #d1d1d1;background:#f8f8f8}.cke_colorblock{padding:10px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}a.cke_colorbox{padding:2px;float:left;width:20px;height:20px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{outline:0;padding:0;border:2px solid #139ff7}a:hover.cke_colorbox{border-color:#bcbcbc}span.cke_colorbox{width:20px;height:20px;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:3px;display:block;cursor:pointer}a.cke_colorauto{padding:0;border:1px solid transparent;margin-bottom:6px;height:26px;line-height:26px}a.cke_colormore{margin-top:10px;height:20px;line-height:19px}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{outline:0;border:#139ff7 1px solid;background-color:#f8f8f8}a:hover.cke_colorauto,a:hover.cke_colormore{border-color:#bcbcbc}.cke_colorauto span.cke_colorbox{width:18px;height:18px;border:1px solid #808080;margin-left:1px;margin-top:3px}.cke_rtl .cke_colorauto span.cke_colorbox{margin-left:0;margin-right:1px}span.cke_colorbox[style*="#ffffff"],span.cke_colorbox[style*="#FFFFFF"],span.cke_colorbox[style="background-color:#fff"],span.cke_colorbox[style="background-color:#FFF"],span.cke_colorbox[style*="rgb(255,255,255)"],span.cke_colorbox[style*="rgb(255, 255, 255)"]{border:1px solid #808080;width:18px;height:18px}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{border:0;float:left;margin:1px 2px 6px 0;padding-right:3px}.cke_rtl .cke_toolgroup{float:right;margin:1px 0 6px 2px;padding-left:3px;padding-right:0}.cke_hc .cke_toolgroup{margin-right:5px;margin-bottom:5px}.cke_hc.cke_rtl .cke_toolgroup{margin-right:0;margin-left:5px}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0;position:relative}a.cke_button_expandable{padding:4px 5px}.cke_rtl a.cke_button{float:right}.cke_hc a.cke_button{border:1px solid black;padding:3px 5px;margin:0 3px 5px 0}.cke_hc.cke_rtl a.cke_button{margin:0 0 5px 3px}a.cke_button_on{background:#fff;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_on{padding:3px 4px}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_off:hover,a.cke_button_expandable.cke_button_off:focus,a.cke_button_expandable.cke_button_off:active{padding:3px 4px}.cke_hc a.cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active{background:#e5e5e5;border:3px solid #000;padding:1px 3px}@media screen and (hover:none){a.cke_button_off:hover{background:transparent;border:0;padding:4px 6px}a.cke_button_expandable.cke_button_off:hover{padding:4px 5px}a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_off:active{padding:3px 4px}}a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{border:0;padding:4px 6px;background-color:transparent}a.cke_button_expandable.cke_button_disabled:hover,a.cke_button_expandable.cke_button_disabled:active{padding:4px 5px}a.cke_button_disabled:focus{border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_disabled:focus{padding:3px 4px}.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border:1px solid #acacac;padding:3px 5px;margin:0 3px 5px 0}.cke_hc a.cke_button_disabled:focus{border:3px solid #000;padding:1px 3px}.cke_hc.cke_rtl a.cke_button_disabled:hover,.cke_hc.cke_rtl a.cke_button_disabled:focus,.cke_hc.cke_rtl a.cke_button_disabled:active{margin:0 0 5px 3px}a.cke_button_disabled .cke_button_icon,a.cke_button_disabled .cke_button_arrow{opacity:.3}.cke_hc a.cke_button_disabled{border-color:#acacac}.cke_hc a.cke_button_disabled .cke_button_icon,.cke_hc a.cke_button_disabled .cke_button_label{opacity:.5}.cke_toolgroup a.cke_button:last-child:after,.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:0;right:-3px}.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-right:0;right:auto;border-left:1px solid #bcbcbc;top:0;left:-3px}.cke_hc .cke_toolgroup a.cke_button:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-color:#000;top:0;right:-7px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{top:0;right:auto;left:-7px}.cke_toolgroup a.cke_button:hover:last-child:after,.cke_toolgroup a.cke_button:focus:last-child:after,.cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:-4px}.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_rtl .cke_toolgroup a.cke_button:focus:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:auto;left:-4px}.cke_hc .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:-9px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:auto;left:-9px}.cke_toolbar.cke_toolbar_last .cke_toolgroup a.cke_button:last-child:after{content:none;border:0;width:0;height:0}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#484848}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 3px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px 0 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#bcbcbc;margin:4px 2px 0 2px;height:18px;width:1px}.cke_rtl .cke_toolbar_separator{float:right}.cke_hc .cke_toolbar_separator{background-color:#000;margin-left:2px;margin-right:5px;margin-bottom:9px}.cke_hc.cke_rtl .cke_toolbar_separator{margin-left:5px;margin-right:2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #bcbcbc}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser:hover{background:#e5e5e5}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border:3px solid transparent;border-bottom-color:#484848}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#484848}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0}.cke_menuitem span{cursor:default}.cke_menubutton{display:block}.cke_hc .cke_menubutton{padding:2px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#e9e9e9;display:block;outline:1px dotted}.cke_menubutton:hover{outline:0}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_disabled:hover,.cke_menubutton_disabled:focus,.cke_menubutton_disabled:active{background-color:transparent;outline:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#f8f8f8;padding:6px 4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#e9e9e9}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{background-color:#f8f8f8;outline:0}.cke_menuitem .cke_menubutton_on{background-color:#e9e9e9;border:1px solid #dedede;outline:0}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px;background-color:#e9e9e9}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_shortcut{color:#979797}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d1d1d1;height:1px}.cke_menuarrow{background:transparent url(images/arrow.png) no-repeat 0 10px;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_hc .cke_menuarrow{background-image:none}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left;position:relative;margin-bottom:5px}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:1px;margin-bottom:10px}.cke_combo:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:5px;top:0;right:0}.cke_rtl .cke_combo:after{border-right:0;border-left:1px solid #bcbcbc;right:auto;left:0}.cke_hc .cke_combo:after{border-color:#000}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0;padding:1px}.cke_rtl a.cke_combo_button{float:right}.cke_hc a.cke_combo_button{padding:4px}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:active{background:#e5e5e5;border:1px solid #bcbcbc;padding:0 0 0 1px;margin-left:-1px}.cke_combo_off a.cke_combo_button:focus{outline:0}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:active{background:#fff}@media screen and (hover:none){.cke_combo_off a.cke_combo_button:hover{background:transparent;border-color:transparent}.cke_combo_off a.cke_combo_button:active{background:#fff;border:1px solid #bcbcbc}}.cke_rtl .cke_combo_on a.cke_combo_button,.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:0 1px 0 0;margin-left:0;margin-right:-1px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border:3px solid #000;padding:1px 1px 1px 2px}.cke_hc.cke_rtl .cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:1px 2px 1px 1px}.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 0 0 3px;margin-left:-3px}.cke_rtl .cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 3px 0 0;margin-left:0;margin-right:-3px}.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 1px 1px 7px;margin-left:-6px}.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 7px 1px 1px;margin-left:0;margin-right:-6px}.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0;margin:0}.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px;margin:0}.cke_toolbar .cke_combo+.cke_toolbar_end,.cke_toolbar .cke_combo+.cke_toolgroup{margin-right:0;margin-left:2px}.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:2px}.cke_hc .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:5px}.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:5px}.cke_toolbar.cke_toolbar_last .cke_combo:nth-last-child(-n+2):after{content:none;border:0;width:0;height:0}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#484848;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 10px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#484848;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#e5e5e5}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combopanel__fontsize{width:135px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;text-align:center;opacity:.95;filter:alpha(opacity = 95);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_top,.cke_contents,.cke_bottom{width:100%}.cke_button_arrow{font-size:0}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon{display:inline-block;vertical-align:top}.cke_rtl .cke_button_icon{float:none}.cke_resizer{width:10px}.cke_source{white-space:normal}.cke_bottom{position:static}.cke_colorbox{font-size:0}.cke_button__about_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -456px !important;}.cke_button__copyformatting_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -480px !important;}.cke_button__creatediv_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -504px !important;}.cke_button__exportpdf_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -528px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -552px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -576px !important;}.cke_button__replace_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -600px !important;}.cke_button__button_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -624px !important;}.cke_button__checkbox_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -648px !important;}.cke_button__form_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -672px !important;}.cke_button__hiddenfield_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -696px !important;}.cke_button__imagebutton_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -720px !important;}.cke_button__radio_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -744px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -768px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -792px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -816px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -840px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -864px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -888px !important;}.cke_button__horizontalrule_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -912px !important;}.cke_button__iframe_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -936px !important;}.cke_button__image_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -960px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -984px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1008px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1032px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1056px !important;}.cke_button__smiley_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1080px !important;}.cke_button__justifyblock_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1104px !important;}.cke_button__justifycenter_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1128px !important;}.cke_button__justifyleft_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1152px !important;}.cke_button__justifyright_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1176px !important;}.cke_button__language_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1200px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1224px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1248px !important;}.cke_button__link_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1272px !important;}.cke_button__unlink_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1296px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1320px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1344px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1368px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1392px !important;}.cke_button__maximize_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1608px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1632px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1656px !important;}.cke_button__print_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1680px !important;}.cke_button__removeformat_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1704px !important;}.cke_button__save_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1728px !important;}.cke_button__selectall_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1800px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1824px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1848px !important;}.cke_button__specialchar_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1872px !important;}.cke_button__scayt_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1896px !important;}.cke_button__table_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1968px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -1992px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png?t=5fe059002f) no-repeat 0 -2016px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__copyformatting_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__exportpdf_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_hidpi .cke_button__language_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -1992px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png?t=5fe059002f) no-repeat 0 -2016px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/icons.png b/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/icons.png index 8cd0b9b72cf7874ddf7d31d8d060659c0491d2b7..b2f6d6d634cfaba0a5a0c341bb9597e3b69b32b5 100644 GIT binary patch literal 12237 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 Q{x#@7Qqn|~D_VyC4`zyhmjD0& literal 12453 zcmXY&cRZE<`^Rtl*vE?OgOIJv>|-Y5kdm@TQuf~SkWC+ZWMvDHy*ClcUfDX?qKvHH z+xPK1e>gbq``q_=U+?R>UeDJh0;Q!&N<>ctK@jOfH6>l}42K|?JPaRv$NFF6Z}1g* zsHC9hnYrudlSma>&Ij+=6*h05^t;!} z$o#l3^EryIa1k?W?Nhq#b6&Q!w_jHAuat<6Lv4YuTgV=PHr&0exm$3ZIJ9wfp90H5 z1BS@cy6mm~xE4YvlF9yFOO68#A#fANwnO1XaOB>RmiEhNzXz!%n%0K_t3xQ-2Qp;T_{>+PQJ9R6!2<7$j?WGaeM1RHG9Qr% zu4V?*^!3t*Jl*B6*g1Jzs9_*%HAw9@UuVaVci3}lWi?9Bo(7q@BQthQpCXuSx-ppK zKzR>kjSQzPwRukSD4Ea3=Gila6+6YyAk%0!VuZ@S+pr)wc6wp?$cFP!*BP%dC!#0z zn*$WMCV{yfhS+OZi@m4F_*d-KMv#?3Pc8+s3CZ$}IXCG~jtAmh9 zs0qwsw%TgV$J_f#@z$M`A)};lc^Fo=kdlW-eRi^XK`bez>^UxSpc@^ZV)?v8Z_b{s z&m-gvoX5pKR$5H+$bH(a5;~BCvMWmzaQ*37rE)nH8iEjLPZTre=*;d=q7SW2O0JIM0V zpIk|mc#G<>pHf38b$u}<$W$7dsq=dw8mx9XH$Sh!02cH2|s+tqyAr4lSU-=FXA?)rrY z9|xf0N9XG<2l5{#knJoq9#QEqIlaS$Ska#K@Kt8@yT)D{N!2bD+sS{AmH%?xgHEun z-lkmmAd=KI?@|-Rg<4TlQ-|RMi&f#ubD>*!vq#&>pfEEH>`zP`_CwX2Dio*q$}mKn z2{GK^+D-wAd?2E|tubY{kS-;Euxiajq5a%$LyhT(4%TvSBq+xU%iv*43xGTxiq5#Jh9k z0jJ%TER5abRU+cz?QeGHYAf|819i8EUnDC_V3hnVsiS%$N4^ldK};%dI(X9CfI! zQz0<5FWkpWi_F}*TzCXKa~L_3>)mjmTcL`Y zkP=TbncsHX5PGL=n*K7E-hj~;d)jS&Z1c}>X97C@T3rKzV%K~*-)k)i1h|Y;vY{_H zgcYbIFw-2&KGPz*=Z%JYgU|EdfmBN1+_+#}W>ujcKZ=>(rg@4&(P_cNt4sd{a-SZv zMvxb)$M+EE-6W>F4@F^0)>xpz?<>F{yT;GX0$`$*K``Zyhwf)cxcmBpv%=m z&GA8G^j1ZWp}>iO`X&x36*Tyko0}2e6y)lRVR|PFE&uaBxvmc`BTVVBpm7oHTgZ#H zxnFn|JERCS%boFw3D>0^gzIxrjr% z*gGF|j1@f6h8*z`>pr~t6$=c?pL|aC?6sxZgG>4sKniM3()GTBxj544imqD1;SP&Z zk@?xqBIEt%7x*Bq^U$<{#=d#*)#l8j86j-EP(@;FrMLp@z(Sj)femMqk}s619duNM zHdi8BnM#vS=`oowgsfTm&(a3zhu%Wr+fB53!_@j{j&R0?SoZwHim#X>mdd-R54uAi z-CASp*w76>L!V7K6y$B}Q zpxp{NBqj)wKf??4;34Vubo-vCY~AzTI{N)iuM2j#vGnqfUi07L;VilW+n*vL;6iH0h!^zqwuV#KEGgtgV{N=&q9P7WlI$8p=fkxT$Z_Vzq2G?FD!$^KF|%)DR4V zN3VI62@Gr6?b2p$v8UJ~*o&QiY_9fAl%}R;|J!k+>Guhvm?87(*X40~_jP5bIO)T_ zv!Lcp(%3Tvd328-Llv}0Mp9M>gQs(kFi03qV7blQGzeO89ud>%T^vV-KqfT&SJM@{ zm;KjNVVnH}Z4miJvRqcU$ndJQ{8{>ryEqa8%19RoK% zW*ym?m*@>*Nk|1vS*NHMm^^)DGTQH+HmSvdNV>U)P>({C94zv4(z|nn5>fsNXQ8F^ z===C!c@K$+h;&#X#~*IfqIQcdjZ&XvQT%^?I1llEh?UxtsJFe$c<|lYU@E-yWou)j zR~>v6M_3_;KM+G}UeV?RQl$1RqEI;3k4JLaNvlFsWJhY~46$^uQakK|#UTa#rT z=&>eBDwKL9ZlDI|=er4CF0dgH&1P<41=a~?fxtV^x7k^nJ8Z1zkMH`+%gal=j(!%b zJ7|vY6+aX*?+K5?hAeg*nwy&TOxpb~FT>0XcWjQoI9^qA#la8%f%9)9?p(t%pJSUA zq+kS*;a{w9tIML`hf8T1Ke?yfM#%+htkZw?CXT%|n!Zefug<@#WqPFb>Ose`3FBPevz=jqqOD*E?CEb7`R4 zJlN?u?ZK_HTOx&!;aY+ZW1Bz1Fy#%zDTdBpPJc9e>_@Q0zJ9Orw|t2KeoBK_Csg0` z)@DyFY~)UD&r?94U*SONn~i6_{;e9~Bo@Shn-$xO_#sKOwdbh-Fa{Loer$*FIN zUo2x|dDx)nvi3Y=6Cp#xMoQv^SE*>Vu@bYuTMGL%lnF#^pg_ zslmv5dLPwqk3f_2u#L@nb?n zoR3v3Q)V>7hJl^IRJ8`@{l&Un87OD_-^Y=Wk)m$g38Cm>MBWjdg`kJK`<~2dIJ*cE z#@K&mo{0Y-P$bas6b)Z})tCCL_B9Qb{Me?erAfNsh~+!Dx!stk-cTe2fwg;IXfs=k zr}#Q%C;7dtgTp9FUCL6=Rk6DZT=QzN@9N{Git~}lx?M)ZIyyF%3~Z06Ppy9lllcq|uND^jkwJyvId*FF;ZDAgn1jYtA;DBXlpZ>EoD}*q%$`7}rAlb?dsbKaD@%q6S4@8Um zGVVveWcw%1&T6Zn!s9=Gq*;q)v}^qM@k94CE$zPb>tw5UH&0L& z1v00;{^aZ#DV;?b8cqv&_Emqpy`tes>z8=7k`WZ_K@^EXdlLnC~$yEb43%Qpm%w!ZgP#MmLAySq~X_^()Ardh4}xqSs6^FY#nxlnc3nw z24Bdy@63F66BXhcO2_Vq)BkMOT!l|$!S@+#z>-=Q9&QfwA@QK#Dej;k$6JuDyXj&C zTsVIpyLQoq{Z?6Mj3g^EU3&Q7ecP1Vj|^$Szc18nv;;Cyxe9vZ$=glZ>cn@@bPR?P z2ptLu4EeKU(6?*9NdAkZ-RuC4cV-KQzJKiatq()!e_496%}Tgc6%o>e!b{`Gzu8z^ z^mh_Q{tktiomSz6ne9Y2zi!~BK~SUP#Y5rcXm~?~k4`S?G~1ED=)hw(Lo)aG$P7SKqm!(XXJe%}ND^Hxa+`%s0HnD5c^jc9&Z0|l3 zfR5R#V*5(k*JIEL#qaCqFV&Y)i zK|KkE(|%KRcHJVHJm}NHOic=fWkLBT$K3b(WMQT*wW?`wXJ6Uulau=~K56#1kiMK8 z7j`3F>rh*8a2GuAYnIHpA81VizPtVCN$`UqzKM{YAMZ*TvxwU-Oi8-@G+iHfms8`u zZ8F!@)+Q@`IKV!-9lQ1m)Y0Y4?z-J{7o!a?&G8(Y^a^4`jt#x-yo!s93mbp1(t{g1 zQr+$?FRG~+5FjU_`AFnReK2d1`t0^}<=etuEsZ#tN zN!J)R{3S7x<@&(y#i^kt_P7WJWTc#v&vddT-xo|;JbzD^SDi{D)?JZmDQglLko1^6gMJ7RP#vn9%vziwIp|J-1B^| z!J;0&uh=8d}uj{JVFR47=F#EsUF2wKKE$26$IBkDYsoeS65hB&fUZO9(yFn)c$6=LIxc# zJL2{C$#&jNXFm)Hz5JTGh84(XP;KcA!Z+DFf^Uc|y6VVP`}EmRwfh96d9)n`Qe)c9 zj}3Ah(I0x><&N9Oz+Qwfa{aEXx;tO*@Boot_W84mxR7c2U>}3b)Ij9!*4DrKP&B>h zYj+f<&Yi4)tFwewop0g+$DgxXImU-Xio^Ey_KI4{Qj|6BjIp}@ZO0u2&yIg1O)Kw_ z1{3cO)({IcEWg^{@(Hmbf1QIP@8ffxUpyDE79-A#7g%M{-^QyhHB=p*rC#t7)Q(-9 zVc*&I28X3K%9bGi+aH!?B2u2bAajd?oBwm_XA=LH{KDSrzJLiwr!uY4pFO|x<5qRp z?2u&K!v1r%LjhMeH#>rxvp%(jR{&T-iVa~hT}A|9h(}u#)X0xszjEIu|95{xVlAV! zwe{y?Z5h$#x|tWL00R7^U{_iH@`WpVA>e$sUi^#JzXPHyd9M%u!GnMPd?^td!dux= ztrpd5KCYw66lz`to3C4G5-^+&U6c4^#}K;~2oEkS>-z^#Qefc4nwlEZg$Ac*jm~%c&*zuSCyI6aRomd$O@%fNdvmpAwY9Z0C3-~l zOa4+<7Z|yy(VJ0>$6eemtW~J{f=kpWV}T{I|RC=#R*QWOf_Tw zvkez5sa=teM$Na%o|bnlw)&VE+~U;EidJRuqdr;m5$ua&`4u(a=)(1KG%F^;h_#twO|r-~k)GVmt2{U!ERMXWj0LY|qt*nMr#Z zYU)M%o?g=n;=ll6JQ2SL7h?)Z7SRyo-WRcKm$vVZGPuw)C>LeyzEsobA1^j8TB~@e zg!-=T%zU+qzEo3Dy4QEX)ZMal%@#nA;dQM7OA`zYg$D>~!w^@-|9N^{l?Ma*XYez} zF&-C^z%Ya;?kLjQYrwE9Y_mKr)*MyR`sgxfUELH&+c?lO%Oz*z3Y5r!IMBN-(^%mI z{`wuJV!xKdlCK~)NJK=Whz^s=gK`QAtipD})6EQ~?*D}`gb6#YbZS5k7fAI;{ih`? zc1Am8@Ss3=b%u*<6}^HZ;oG%t6V6)n5KNkqtsY;kNdTq1FI(^@`#)G8CFtf@rWECa zf_$FGp-?ZsX`8b}cPZ0lr4{ z@83W7&Bd1~5$KRNu~)0K?W|#D6Vrt3yJkWS8{aAyRIykSzUc9N*P#tslQ=0H-;7)= z>%ryc=kIT*IAgZBB|WDQ z$=YLdd@WE)$8Ub%bqiH+q8G$K4vUaq_CY+{1zn|yCakg7DU*C>sXaj3NEsY3o;dcx z)hIjHX3oVK+bfTptXoKc6aA4D?b}he%MUJ;mn)up%jiY{I>ij!?+s{RG`JP(gs;}bihtSfa+4qu zP3YX8o_(VNLLujygzpg5f}J#BvY?5qh>J)PzGC1EVdukm&zCRsI+mp#o{SlGG;E#V0%O#hVxRja*%72KB| z6o=zU*g+2wV_m$1A8M*^o*D|&3nzThsJ8QwLac)>gk9cC@yH3$Qw5X<)+tHgX5v^s zmh_!^vR^wp3%T3>sG;^mX`>)i~qoedNGWdk`x4f~>Ebk!(2w2S-2#sk<; z^#}#BAx-1uSXU@9mtJIY_lZVR1&1>72*8Wo#|g9=N@n6md$uo#c2(l2 zZ{A2`qj~xjv?ip;Vev8W(XmZVGzJafgQ;K)U;YL7%!R0)OO1 z>osozC8YM0VAFN(Pm6n+#_B%aw3`bud`M$lS~%5M0ff7p6U(Z!R>hDU$PY5o)ql_}Yg!gn^vDgIPqa9Tk_Jos84dbpj6$ge zav1$oJa1*)HJn-Owb30H-~eyBAF3q9t7^nwg+Iorvg?nEDb`3(ut9Y`4dJeOQgJT8 z_#Z~zPmsGs5l)MIM}k~NK{Wh6 zQ2dQxwYPa;paGWdcM?OXTLW8%ivnw0MDAD9-b>B#pBU%H82K~D6@27Cv;^q6F-O{z z$d?Tj&AA#lg0}0pBWF9nx)|oY6~(|^Ah>>XX0w=-?P28c8Z^)sfZp0!M%&?kigCHp zxgF=~&y)1v76c@#U6#sYoH<$s5XKbK&(CuKpBC2?ACJ3W8blaFeh_KJ zn{RBiVHJ3NVWAW_s*3dUaSRX$_q=`>~?nU z4mzJ21*;)p%a@l-@?ZftzO8Cm-b?cuFVti>?;;kwFcA%o46Ct8H~FjK0Y3u-%SKhT z-#Cr+Qf;D1!psa30??GXTZr{COyt_FUBj&1>6Zz{Ono`+kF|6FDk*1Gj1uWTESXKE zabNR@3K^aqw%3tl6&zC+@z&-}TRHB{65}o{rxnhwG}&`{>WjlrJ(%^@>cvuBB3jES4V`<%1QJeb2EG)g#xnyrZ=+yKe8#2LQbna-#q|4&WLy` zPtrYuYif`3%W0eXXLxqGUJl9SSn-$iM$yJ)OM5xTMJH$7vr<=q{q_Kh@!>_i{f}pl zL&TSSKNCZMH8)T|9g=dS@+sR*^V{Ey6;_zYCFdoaB|k6w;`PlKK$exqZzVD9*wP8f zjx>3yIP6Oq>%A7VQ-p8eZ@ooQ6=A=l;#sd(u-zCymmEgY`EI`v67!P7IF1DD7U=s; zhS+UrVuk!J=FqkzFU@5pmEB3>fexfFZ!LFQR!INK|KXXK0 zz3OoGx6C>RY~|3TdlW`cYq%71MKLT%(SS!|ePOlbaU9Q%gyQ>y<-@ zLhiNL`cvwihH}fH5UwbDi^So|M_B!rESHL=oLCM6|RiM71H z`y%Kd&}{)a7E+N>&M^*C4M{7bAc$qb8}vxMim;p4A0na9L0Q#<3|Kal)$_V*rN(q| zKvl8=rh{Q)vFe*Cbj(Y6x+|=Yl0b*smZlYY#R31QpYX|Ur?BSH-s|1`PpvSAQD0yi z|L6UH_QD8ExuA96KR_F9P&-y`WXh8 zKXDv+=;;1_ali#cQLOMWpHTSxfTWxa>VF$D`dL)sgceDR30-0g!G%-blK4j~fakQt zNG!BlacR1h(C`eGtkMnk3*k9d1$Hx}KSfL9f}0fm52~vVBIA?~vqKcGSwUk;-qS|> z(8Ks-Db!Z%%^)o|V+%q&oB-dr+E#44vH&CQ25<>k$1GuuY_lHEWi|5LTegLOXv zYQ8+1IZ_?$C+)Ps9&BI;gnaoQ_wK|=aMuB_{@A|KQ~W7xe9a|7UOu*y#%rS!jm zv^OT|252R0H_ak*zuiu%|47DNKwe*4t67w2pO-kYl9>Q}1cSt}Sn#I@&Q(dcz*@`l|AByZ_+W!0`#m{d3Z9^eKAzhKeh| zfF{cTok0Zj$@0s8o9Trzm?rxNkvZnk%FoUFowBT=bKBclDz--isfieF6vJ7=b`u0< zePV|;oCSMJn3O!X{N)g6tXED(;`*8>KPhe!!QwMwMWFyhUE|W?Viw_Z^JzCZLvCt+ zni1NPAZmMi`>b9`uEa6P#4*jRQO^cWkgB_Zkosuw`KJv8R9|~xViqtalg+C<&GH8U zsKPL8J!jzFAXq1Plv2aR%h3eO0J^oR9|#y3wSV~^Ot)Jrz#!HS;1dkB4yHjp0@HX`Xzk*u$< zBBbOQ5&Q%lPrTZe*4jF^_nB{~UR@*+@sy74mp&M(5|Vh|{TvIju+4^>+X7DJ>NL`? zqg~sC4!K7YYlS)&?6E3UVcwoAEl0i!XSKmBe0wDilVnBHJ&wai$K%LoDxjw04jXD~{}Q-SL3G3v;CnpCS*g#3!g?(%Gk1ut1ZiZ%R@KNzrP@CT|EaD2J}rm^pPi}DKk5??CtLeQMdFPWYW5U2=Sn;48R>rl5^7jr0ByAP z-qSl^`L4;9dH=!&;U5l8yND1yMF}t}csQZLyl0A8#f0^oo( ziRyr)Ux~V4a>W9mEdY~(?dE|Ml#|Goq@MJyp(0AR1f7+|OdX{R1!~>xE!O#9n$D>b z#~cHGX}i!s@!5J5u;KgM1y;B+GBTd0D{pmplJH?L1UOaK4Mua{dG;zj3=lc#qp$aA zaAVhUnwuG#J=!O+r$XTX!~v`apxdwQ?GQNI)0?tR1xT_W7r2I*8XGE=7<#;ZC&1@E zSq@RHI(8T4~=t$ zH(y7H#*-(YIb4nE4+U^V>F&QIQHf>Tl+&x0UGE+r9}n5vvj=qO6{$)zUC`B)zed`< zf;^HqxvPeFOR!zq!el$Yrrp1}2}ZB=cTiwmofzT?*!Jr+<62Q!{wQv0rN@t{z`f6kiORt*p;=_cT|2Cv-NDYe$0oEF;D{A^n|Ud@ ziRDKzP5B#sV-t5-`-eLm;dUiFq>D|+^6QW(R(D^s->bbWTl@RhMhiC`rxxfqyQ^@s z4jv|3T?+e-2t{ue=-Lnm*5`$icBe9TK0eA&Kbf#Oq5BRdTw*T(p{l0~qtHhm4^R;i zy(N3-2MD|o{D8$y{ylL;@4vYGV+WzIB4jb&X}bWiG#w*8J;x!IVtEi5iL_aP?q;q; zCrGN}(-lVN&n6_9AnBFc$yPE{PLovU=jYkVUms^!{_Q%D&`7)HJ|cFKW!>S;*9eZ{ z<`%p=`3DgWfIBbUzlu4 zj2J{$@vpSdP{=h^+@G&&Gz=7!=V`erFhIu_SsFcgbz}D1q}MS9j?m3xDB4M&rV5j1 z+|*eW253V8kFugRMin_QU1@7=jq!`vf&hf{GMXMuyc3?GtQ(eJ9vkVk9}^Eou5QvW zfy*`CCUL$)xFUzbgZKV=FsI~`Ba%^74tCRMJ10gAAEd7?3l({{Tb?fOFg%Y5RyD$azd2 zTCj2bzgvi&b1dMuya^mM%~D2&*P`Jlb-DDR4S&v20L5d968Esc$U?8AwH3WkAM<)< zC4-dvjuPa^h`F*AJE!n69Brl)Vm`@mbDan8jZyBjXt)VT4WrE!=ZPuDDJVSu&%kjW1<|Sl-7rLA9k+rUM>@9C z2U3dx{C}iUpS}|?;Z%j05hHBVRz7|nK}ztajy_`Xe6KD2TM3fD?x0|~SngOQj$J#o z0m*^nwMMq=5ACBX{B*DM!XWq<0mPNIVo*x%&a>C+m&P*-3kxzH zdxrf&(Qnc4Y_dW0Z%OC~yPXy!ZjWrIzT3K|$up7AH!kGQEm?o>; z8_Z1gG#7>v*qwATaQ>~7-#meA2@cA@gvHyNVU0=1{$XBq#r6@9F5>@a)k;gzcJmB$ z7Sl;KtQ3#YEpT&t$9IHCn0moj@!##~lSCV^StK;a?O}Zf00@X+E&vKu<4H zPLF4j;(s~g5)`MnXx(<;y#n4Z;$Z5dFnsvbCmxJxmv9CFQQ?T>UqX#@5+VBN!w>>3 z2VK8)FjNeaI0R%n!X#^DD}M%rZ-LoDd?DJ7s*3Hf^Vw#;A$r<}@n0-|&epZ&CW~c# zZw+&~N-$me=k^fII{=xkbcM15DDUw~U>*zTIKydC#d}uD@xtj$i>YJ8O%>Ks4<1~| zx&(9$b;Ng)E*9c*vqPW27Ta*L7=nbroFDss^L|_FJFc?XQ;rxCfMvR|2L+WB&q850 zy!#;b?Urg}*p{m9r5X`YH?2Yl8`36EMOMBdgFqgJh(w0xeO>NlPb$DW^4cVjV=kF) zwiSLTJ=U?aa_E_#=g~%3%oL|bjihFXQKby>ts-X!L(KO@e_$nY7JKGHCw>kH%ft(FH8!92Ucx4F4F zpMRT0QD;XOu2|K%naN2}LAtn!v9apkD{on}nBzno7F)jf9PgwNK&s4M>wPf{;!`Yf zHI6G?U!YI^m)5iKng;(Lx7@ov diff --git a/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/icons_hidpi.png b/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/icons_hidpi.png index 185b99188265aedc5bdb8757884dc6ec1784e178..bc5403c2569676be79af205c23cffb7a31fd56a9 100644 GIT binary patch literal 38309 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 J+ZKlt{sjf(O?ChP literal 41377 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 V$ajA79UTIXix+g&%T%qx{{w79#~%Oy diff --git a/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/readme.md b/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/readme.md index 76d1e72727b..dc2b1440f8b 100644 --- a/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/readme.md +++ b/htdocs/includes/ckeditor/ckeditor/skins/moono-lisa/readme.md @@ -41,6 +41,6 @@ Other parts: License ------- -Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. +Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. For licensing, see LICENSE.md or [https://ckeditor.com/legal/ckeditor-oss-license](https://ckeditor.com/legal/ckeditor-oss-license) diff --git a/htdocs/includes/ckeditor/ckeditor/styles.js b/htdocs/includes/ckeditor/ckeditor/styles.js index 69b040ab23b..8682bcb4646 100644 --- a/htdocs/includes/ckeditor/ckeditor/styles.js +++ b/htdocs/includes/ckeditor/ckeditor/styles.js @@ -1,5 +1,5 @@ /** - * Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved. + * Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ diff --git a/htdocs/theme/eldy/ckeditor/config.js b/htdocs/theme/eldy/ckeditor/config.js index 0ecf42b09e1..4ec222217a1 100644 --- a/htdocs/theme/eldy/ckeditor/config.js +++ b/htdocs/theme/eldy/ckeditor/config.js @@ -47,7 +47,7 @@ CKEDITOR.editorConfig = function( config ) ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'], ['BidiLtr', 'BidiRtl'], ['Link','Unlink','Anchor'], - ['Image','Table','HorizontalRule','Smiley','SpecialChar','PageBreak','Iframe'], + ['Image','Table','HorizontalRule','Smiley','SpecialChar'], ['Styles','Format','Font','FontSize'], ['TextColor','BGColor'], ['Source'] diff --git a/htdocs/theme/md/ckeditor/config.js b/htdocs/theme/md/ckeditor/config.js index 8cd703c957d..06fa5746e7f 100644 --- a/htdocs/theme/md/ckeditor/config.js +++ b/htdocs/theme/md/ckeditor/config.js @@ -47,7 +47,7 @@ CKEDITOR.editorConfig = function( config ) ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'], ['BidiLtr', 'BidiRtl'], ['Link','Unlink','Anchor'], - ['Image','Table','HorizontalRule','Smiley','SpecialChar','PageBreak','Iframe'], + ['Image','Table','HorizontalRule','Smiley','SpecialChar'], ['Styles','Format','Font','FontSize'], ['TextColor','BGColor'], ['Source'] diff --git a/htdocs/website/index.php b/htdocs/website/index.php index 02926e2add8..715ea21d182 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -3067,7 +3067,7 @@ if (!GETPOST('hide_websitemenu')) { // Allow some non-standard markup that we used in the introduction. extraAllowedContent: \'span(*);cite(*);q(*);dl(*);dt(*);dd(*);ul(*);li(*);header(*);button(*);h1(*);h2(*);\', //extraPlugins: \'sourcedialog\', - removePlugins: \'flash,stylescombo\', + removePlugins: \'flash,stylescombo,exportpdf,scayt,wsc\', // Show toolbar on startup (optional). // startupFocus: true }); From dd02c0607a98d456a244c7d3058137035deb80b9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 May 2022 20:44:58 +0200 Subject: [PATCH 538/738] Removed unexpected plugins --- htdocs/website/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/website/index.php b/htdocs/website/index.php index 715ea21d182..968094cad18 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -3067,7 +3067,7 @@ if (!GETPOST('hide_websitemenu')) { // Allow some non-standard markup that we used in the introduction. extraAllowedContent: \'span(*);cite(*);q(*);dl(*);dt(*);dd(*);ul(*);li(*);header(*);button(*);h1(*);h2(*);\', //extraPlugins: \'sourcedialog\', - removePlugins: \'flash,stylescombo,exportpdf,scayt,wsc\', + removePlugins: \'flash,stylescombo,exportpdf,scayt,wsc,pagebreak,iframe,smiley\', // Show toolbar on startup (optional). // startupFocus: true }); From 7890d6f7f6b0571040e9ec4398a1a36a94bd0dda Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 May 2022 21:01:48 +0200 Subject: [PATCH 539/738] Update card.php --- htdocs/compta/facture/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index d3132a0cb4a..f2e57c8b536 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -305,7 +305,7 @@ if (empty($reshook)) { $object->fetch($id); if (!empty($conf->global-> INVOICE_CHECK_POSTERIOR_DATE)) { - $last_of_type = $object->willBeLastOfSameType($allow_validated_drafts = true); + $last_of_type = $object->willBeLastOfSameType(true); if (empty($object->date_validation) && !$last_of_type[0]) { setEventMessages($langs->transnoentities("ErrorInvoiceIsNotLastOfSameType", $object->ref, dol_print_date($object->date, 'day'), dol_print_date($last_of_type[1], 'day')), null, 'errors'); $action = ''; From d13cb10c8bb253045d6cd59e70fffd75eab318e4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 May 2022 21:02:09 +0200 Subject: [PATCH 540/738] Update facture.class.php --- htdocs/compta/facture/class/facture.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 435b358ae32..a5cb99c2260 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -3009,7 +3009,7 @@ class Facture extends CommonInvoice return -1; } if (!empty($conf->global-> INVOICE_CHECK_POSTERIOR_DATE)) { - $last_of_type = $this->willBeLastOfSameType($allow_validated_drafts = true); + $last_of_type = $this->willBeLastOfSameType(true); if (!$last_of_type[0]) { $this->error = $langs->transnoentities("ErrorInvoiceIsNotLastOfSameType", $this->ref, dol_print_date($this->date, 'day'), dol_print_date($last_of_type[1], 'day')); return -1; From 1900bfe68b5b074c50f2bca0e5952a0823df5054 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 16 May 2022 21:06:03 +0200 Subject: [PATCH 541/738] Merge branch 'develop' of git@github.com:Dolibarr/dolibarr.git into develop --- htdocs/langs/en_US/ticket.lang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/langs/en_US/ticket.lang b/htdocs/langs/en_US/ticket.lang index 76d6923e43c..8ff20570316 100644 --- a/htdocs/langs/en_US/ticket.lang +++ b/htdocs/langs/en_US/ticket.lang @@ -99,8 +99,8 @@ TicketNewEmailBodyHelp=The text specified here will be inserted into the email c TicketParamPublicInterface=Public interface setup TicketsEmailMustExist=Require an existing email address to create a ticket TicketsEmailMustExistHelp=In the public interface, the email address should already be filled in the database to create a new ticket. -TicketCreateThirdPartyWithContactIfNotExist=Create a third party with contact if it does not exist with the given email -TicketCreateThirdPartyWithContactIfNotExistHelp=Create a third party with contact if it does not exist with the given email +TicketCreateThirdPartyWithContactIfNotExist=Ask name and company name for unknown emails. +TicketCreateThirdPartyWithContactIfNotExistHelp=Check if a thirdparty or a contact exists for the email entered. If not, ask a name and a company name to create a third party with contact. PublicInterface=Public interface TicketUrlPublicInterfaceLabelAdmin=Alternative URL for public interface TicketUrlPublicInterfaceHelpAdmin=It is possible to define an alias to the web server and thus make available the public interface with another URL (the server must act as a proxy on this new URL) From 37f7fed0032d6e326fcf41fc77df92a34d56f90a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 17 May 2022 00:50:59 +0200 Subject: [PATCH 542/738] Maxi debug of export profiles for v16 --- htdocs/core/class/html.form.class.php | 4 +- htdocs/core/lib/ajax.lib.php | 51 +++++++++++--------- htdocs/core/modules/modCategorie.class.php | 2 +- htdocs/core/modules/modCommande.class.php | 2 +- htdocs/core/modules/modContrat.class.php | 2 +- htdocs/core/modules/modDeplacement.class.php | 2 +- htdocs/core/modules/modExpedition.class.php | 2 +- htdocs/core/modules/modFournisseur.class.php | 4 +- htdocs/core/modules/modProjet.class.php | 6 +-- htdocs/core/modules/modPropale.class.php | 2 +- htdocs/core/modules/modReception.class.php | 2 +- htdocs/core/modules/modSociete.class.php | 4 +- htdocs/core/modules/modStock.class.php | 6 +-- htdocs/core/modules/modUser.class.php | 25 +++++++--- htdocs/exports/class/export.class.php | 21 +++++++- htdocs/exports/export.php | 18 +++++-- htdocs/langs/en_US/members.lang | 2 + htdocs/langs/en_US/users.lang | 2 +- htdocs/societe/ajax/company.php | 1 - 19 files changed, 102 insertions(+), 56 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 05ac16fbfa6..94ae9fb0fbc 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -1277,7 +1277,7 @@ class Form } // mode 1 - $urloption = 'htmlname='.urlencode($htmlname).'&outjson=1&filter='.urlencode($filter).(empty($excludeids) ? '' : '&excludeids='.join(',', $excludeids)).($showtype ? '&showtype='.urlencode($showtype) : ''); + $urloption = 'htmlname='.urlencode(str_replace('.', '_', $htmlname)).'&outjson=1&filter='.urlencode($filter).(empty($excludeids) ? '' : '&excludeids='.join(',', $excludeids)).($showtype ? '&showtype='.urlencode($showtype) : ''); $out .= ajax_autocompleter($selected, $htmlname, DOL_URL_ROOT.'/societe/ajax/company.php', $urloption, $conf->global->COMPANY_USE_SEARCH_TO_SELECT, 0, $ajaxoptions); $out .= ''; @@ -1638,7 +1638,7 @@ class Form * @param int $socid Id ot third party or 0 for all or -1 for empty list * @param array|int $selected Array of ID of pre-selected contact id * @param string $htmlname Name of HTML field ('none' for a not editable field) - * @param int $showempty 0=no empty value, 1=add an empty value, 2=add line 'Internal' (used by user edit), 3=add an empty value only if more than one record into list + * @param int|string $showempty 0=no empty value, 1=add an empty value, 2=add line 'Internal' (used by user edit), 3=add an empty value only if more than one record into list * @param string $exclude List of contacts id to exclude * @param string $limitto Disable answers that are not id in this array list * @param integer $showfunction Add function into label diff --git a/htdocs/core/lib/ajax.lib.php b/htdocs/core/lib/ajax.lib.php index e7bea722e0c..3e1af30ddd2 100644 --- a/htdocs/core/lib/ajax.lib.php +++ b/htdocs/core/lib/ajax.lib.php @@ -62,6 +62,8 @@ function ajax_autocompleter($selected, $htmlname, $url, $urloption = '', $minLen $dataforitem = constant('JS_QUERY_AUTOCOMPLETE_ITEM'); } + $htmlnamejquery = str_replace('.', '\\\\.', $htmlname); + // Input search_htmlname is original field // Input htmlname is a second input field used when using ajax autocomplete. $script = ''; @@ -73,21 +75,21 @@ function ajax_autocompleter($selected, $htmlname, $url, $urloption = '', $minLen var options = '.json_encode($ajaxoptions).'; /* Option of actions to do after keyup, or after select */ /* Remove selected id as soon as we type or delete a char (it means old selection is wrong). Use keyup/down instead of change to avoid loosing the product id. This is needed only for select of predefined product */ - $("input#search_'.$htmlname.'").keydown(function(e) { + $("input#search_'.$htmlnamejquery.'").keydown(function(e) { if (e.keyCode != 9) /* If not "Tab" key */ { if (e.keyCode == 13) { return false; } /* disable "ENTER" key useful for barcode readers */ console.log("Clear id previously selected for field '.$htmlname.'"); - $("#'.$htmlname.'").val(""); + $("#'.$htmlnamejquery.'").val(""); } }); // Check options for secondary actions when keyup - $("input#search_'.$htmlname.'").keyup(function() { + $("input#search_'.$htmlnamejquery.'").keyup(function() { if ($(this).val().length == 0) { - $("#search_'.$htmlname.'").val(""); - $("#'.$htmlname.'").val("").trigger("change"); + $("#search_'.$htmlnamejquery.'").val(""); + $("#'.$htmlnamejquery.'").val("").trigger("change"); if (options.option_disabled) { $("#" + options.option_disabled).removeAttr("disabled"); } @@ -118,15 +120,15 @@ function ajax_autocompleter($selected, $htmlname, $url, $urloption = '', $minLen } }); - $("input#search_'.$htmlname.'").autocomplete({ + $("input#search_'.$htmlnamejquery.'").autocomplete({ source: function( request, response ) { - $.get("'.$url.($urloption ? '?'.$urloption : '').'", { '.$htmlname.': request.term }, function(data){ + $.get("'.$url.($urloption ? '?'.$urloption : '').'", { "'.str_replace('.', '_', $htmlname).'": request.term }, function(data){ if (data != null) { response($.map( data, function(item) { if (autoselect == 1 && data.length == 1) { - $("#search_'.$htmlname.'").val(item.value); - $("#'.$htmlname.'").val(item.key).trigger("change"); + $("#search_'.$htmlnamejquery.'").val(item.value); + $("#'.$htmlnamejquery.'").val(item.key).trigger("change"); } var label = item.label.toString(); var update = {}; @@ -151,12 +153,13 @@ function ajax_autocompleter($selected, $htmlname, $url, $urloption = '', $minLen description : item.description, ref_customer: item.ref_customer } })); + } else { + console.error("Error: Ajax url '.$url.($urloption ? '?'.$urloption : '').' has returned an empty page. Should be an empty json array."); } - else console.error("Error: Ajax url '.$url.($urloption ? '?'.$urloption : '').' has returned an empty page. Should be an empty json array."); }, "json"); }, dataType: "json", - minLength: '.$minLength.', + minLength: '.((int) $minLength).', select: function( event, ui ) { // Function ran once new value has been selected into javascript combo console.log("We will trigger change on input '.$htmlname.' because of the select definition of autocomplete code for input#search_'.$htmlname.'"); console.log("Selected id = "+ui.item.id+" - If this value is null, it means you select a record with key that is null so selection is not effective"); @@ -164,25 +167,25 @@ function ajax_autocompleter($selected, $htmlname, $url, $urloption = '', $minLen console.log("Propagate before some properties retrieved by ajax into data-xxx properties"); // For supplier price and customer when price by quantity is off - $("#'.$htmlname.'").attr("data-up", ui.item.price_ht); - $("#'.$htmlname.'").attr("data-base", ui.item.pricebasetype); - $("#'.$htmlname.'").attr("data-qty", ui.item.qty); - $("#'.$htmlname.'").attr("data-discount", ui.item.discount); - $("#'.$htmlname.'").attr("data-description", ui.item.description); - $("#'.$htmlname.'").attr("data-ref-customer", ui.item.ref_customer); + $("#'.$htmlnamejquery.'").attr("data-up", ui.item.price_ht); + $("#'.$htmlnamejquery.'").attr("data-base", ui.item.pricebasetype); + $("#'.$htmlnamejquery.'").attr("data-qty", ui.item.qty); + $("#'.$htmlnamejquery.'").attr("data-discount", ui.item.discount); + $("#'.$htmlnamejquery.'").attr("data-description", ui.item.description); + $("#'.$htmlnamejquery.'").attr("data-ref-customer", ui.item.ref_customer); '; if (!empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY)) { $script .= ' // For customer price when PRODUIT_CUSTOMER_PRICES_BY_QTY is on - $("#'.$htmlname.'").attr("data-pbq", ui.item.pbq); - $("#'.$htmlname.'").attr("data-pbqup", ui.item.price_ht); - $("#'.$htmlname.'").attr("data-pbqbase", ui.item.pricebasetype); - $("#'.$htmlname.'").attr("data-pbqqty", ui.item.qty); - $("#'.$htmlname.'").attr("data-pbqpercent", ui.item.discount); + $("#'.$htmlnamejquery.'").attr("data-pbq", ui.item.pbq); + $("#'.$htmlnamejquery.'").attr("data-pbqup", ui.item.price_ht); + $("#'.$htmlnamejquery.'").attr("data-pbqbase", ui.item.pricebasetype); + $("#'.$htmlnamejquery.'").attr("data-pbqqty", ui.item.qty); + $("#'.$htmlnamejquery.'").attr("data-pbqpercent", ui.item.discount); '; } $script .= ' - $("#'.$htmlname.'").val(ui.item.id).trigger("change"); // Select new value + $("#'.$htmlnamejquery.'").val(ui.item.id).trigger("change"); // Select new value // Disable an element if (options.option_disabled) { @@ -236,7 +239,7 @@ function ajax_autocompleter($selected, $htmlname, $url, $urloption = '', $minLen } console.log("ajax_autocompleter new value selected, we trigger change also on original component so on field #search_'.$htmlname.'"); - $("#search_'.$htmlname.'").trigger("change"); // We have changed value of the combo select, we must be sure to trigger all js hook binded on this event. This is required to trigger other javascript change method binded on original field by other code. + $("#search_'.$htmlnamejquery.'").trigger("change"); // We have changed value of the combo select, we must be sure to trigger all js hook binded on this event. This is required to trigger other javascript change method binded on original field by other code. } ,delay: 500 }).data("'.$dataforrenderITem.'")._renderItem = function( ul, item ) { diff --git a/htdocs/core/modules/modCategorie.class.php b/htdocs/core/modules/modCategorie.class.php index c3b7f256b4b..6ee294eff58 100644 --- a/htdocs/core/modules/modCategorie.class.php +++ b/htdocs/core/modules/modCategorie.class.php @@ -382,7 +382,7 @@ class modCategorie extends DolibarrModules $this->export_enabled[$r] = '!empty($conf->projet->enabled)'; $this->export_permission[$r] = array(array("categorie", "lire"), array("projet", "export")); $this->export_fields_array[$r] = array('cat.rowid'=>"CategId", 'cat.label'=>"Label", 'cat.description'=>"Description", 'cat.fk_parent'=>"ParentCategory", 'p.rowid'=>'ProjectId', 'p.ref'=>'Ref', 's.rowid'=>"IdThirdParty", 's.nom'=>"Name"); - $this->export_TypeFields_array[$r] = array('cat.label'=>"Text", 'cat.description'=>"Text", 'cat.fk_parent'=>'List:categorie:label:rowid', 'p.ref'=>'Text', 's.rowid'=>"List:societe:nom:rowid", 's.nom'=>"Text"); + $this->export_TypeFields_array[$r] = array('cat.label'=>"Text", 'cat.description'=>"Text", 'cat.fk_parent'=>'List:categorie:label:rowid', 'p.ref'=>'Text', 's.rowid'=>"Numeric", 's.nom'=>"Text"); $this->export_entities_array[$r] = array('p.rowid'=>'project', 'p.ref'=>'project', 's.rowid'=>"company", 's.nom'=>"company"); // We define here only fields that use another picto $keyforselect = 'projet'; diff --git a/htdocs/core/modules/modCommande.class.php b/htdocs/core/modules/modCommande.class.php index 9aac30fe8a5..80e5468b140 100644 --- a/htdocs/core/modules/modCommande.class.php +++ b/htdocs/core/modules/modCommande.class.php @@ -218,7 +218,7 @@ class modCommande extends DolibarrModules } } //$this->export_TypeFields_array[$r]=array( - // 's.rowid'=>"List:societe:nom",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','co.label'=>'List:c_country:label:label', + // 's.rowid'=>"Numeric",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','co.label'=>'List:c_country:label:label', // 'co.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','c.ref'=>"Text",'c.ref_client'=>"Text", // 'c.date_creation'=>"Date",'c.date_commande'=>"Date",'c.amount_ht'=>"Numeric",'c.total_ht'=>"Numeric", // 'c.total_ttc'=>"Numeric",'c.facture'=>"Boolean",'c.fk_statut'=>'Status','c.note_public'=>"Text",'c.date_livraison'=>'Date','cd.description'=>"Text", diff --git a/htdocs/core/modules/modContrat.class.php b/htdocs/core/modules/modContrat.class.php index 2fc0c7f1e0d..89081551ddc 100644 --- a/htdocs/core/modules/modContrat.class.php +++ b/htdocs/core/modules/modContrat.class.php @@ -181,7 +181,7 @@ class modContrat extends DolibarrModules 'cod.date_ouverture'=>"contract_line", 'cod.date_ouverture_prevue'=>"contract_line", 'cod.date_fin_validite'=>"contract_line", 'cod.date_cloture'=>"contract_line", 'p.rowid'=>'product', 'p.ref'=>'product', 'p.label'=>'product'); - $this->export_TypeFields_array[$r] = array('s.rowid'=>"List:societe:nom", 's.nom'=>'Text', 's.address'=>'Text', 's.zip'=>'Text', 's.town'=>'Text', 'c.code'=>'Text', + $this->export_TypeFields_array[$r] = array('s.rowid'=>"Numeric", 's.nom'=>'Text', 's.address'=>'Text', 's.zip'=>'Text', 's.town'=>'Text', 'c.code'=>'Text', 's.phone'=>'Text', 's.siren'=>'Text', 's.siret'=>'Text', 's.ape'=>'Text', 's.idprof4'=>'Text', 's.code_compta'=>'Text', 's.code_compta_fournisseur'=>'Text', 's.tva_intra'=>'Text', 'co.ref'=>"Text", 'co.datec'=>"Date", 'co.date_contrat'=>"Date", diff --git a/htdocs/core/modules/modDeplacement.class.php b/htdocs/core/modules/modDeplacement.class.php index 450aa76258e..88b239917f6 100644 --- a/htdocs/core/modules/modDeplacement.class.php +++ b/htdocs/core/modules/modDeplacement.class.php @@ -121,7 +121,7 @@ class modDeplacement extends DolibarrModules $this->export_label[$r] = 'ListTripsAndExpenses'; $this->export_permission[$r] = array(array("deplacement", "export")); $this->export_fields_array[$r] = array('u.login'=>'Login', 'u.lastname'=>'Lastname', 'u.firstname'=>'Firstname', 'd.rowid'=>"TripId", 'd.type'=>"Type", 'd.km'=>"FeesKilometersOrAmout", 'd.dated'=>"Date", 'd.note_private'=>'NotePrivate', 'd.note_public'=>'NotePublic', 's.nom'=>'ThirdParty'); - $this->export_TypeFields_array[$r] = array('u.rowid'=>'List:user:name', 'u.login'=>'Text', 'u.lastname'=>'Text', 'u.firstname'=>'Text', 'd.type'=>"Text", 'd.km'=>"Numeric", 'd.dated'=>"Date", 'd.note_private'=>'Text', 'd.note_public'=>'Text', 's.rowid'=>"List:societe:CompanyName", 's.nom'=>'Text'); + $this->export_TypeFields_array[$r] = array('u.rowid'=>'List:user:name', 'u.login'=>'Text', 'u.lastname'=>'Text', 'u.firstname'=>'Text', 'd.type'=>"Text", 'd.km'=>"Numeric", 'd.dated'=>"Date", 'd.note_private'=>'Text', 'd.note_public'=>'Text', 's.rowid'=>"Numeric", 's.nom'=>'Text'); $this->export_entities_array[$r] = array('u.login'=>'user', 'u.lastname'=>'user', 'u.firstname'=>'user', 'd.rowid'=>"trip", 'd.type'=>"trip", 'd.km'=>"trip", 'd.dated'=>"trip", 'd.note_private'=>'trip', 'd.note_public'=>'trip', 's.nom'=>'company'); $this->export_dependencies_array[$r] = array('trip'=>'d.rowid'); // To add unique key if we ask a field of a child to avoid the DISTINCT to discard them diff --git a/htdocs/core/modules/modExpedition.class.php b/htdocs/core/modules/modExpedition.class.php index c10e13a46d8..80625817b22 100644 --- a/htdocs/core/modules/modExpedition.class.php +++ b/htdocs/core/modules/modExpedition.class.php @@ -255,7 +255,7 @@ class modExpedition extends DolibarrModules $this->export_fields_array[$r] += array('sp.rowid'=>'IdContact', 'sp.lastname'=>'Lastname', 'sp.firstname'=>'Firstname', 'sp.note_public'=>'NotePublic'); } //$this->export_TypeFields_array[$r]=array( - // 's.rowid'=>"List:societe:nom",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','co.label'=>'List:c_country:label:label', + // 's.rowid'=>"Numeric",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','co.label'=>'List:c_country:label:label', // 'co.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','c.ref'=>"Text",'c.ref_client'=>"Text", // 'c.date_creation'=>"Date",'c.date_commande'=>"Date",'c.amount_ht'=>"Numeric",'c.remise_percent'=>"Numeric",'c.total_ht'=>"Numeric", // 'c.total_ttc'=>"Numeric",'c.facture'=>"Boolean",'c.fk_statut'=>'Status','c.note_public'=>"Text",'c.date_livraison'=>'Date','ed.qty'=>"Text" diff --git a/htdocs/core/modules/modFournisseur.class.php b/htdocs/core/modules/modFournisseur.class.php index aef28514c61..afc6fec4fc6 100644 --- a/htdocs/core/modules/modFournisseur.class.php +++ b/htdocs/core/modules/modFournisseur.class.php @@ -325,7 +325,7 @@ class modFournisseur extends DolibarrModules $this->export_fields_array[$r]['f.multicurrency_total_ttc'] = 'MulticurrencyAmountTTC'; } //$this->export_TypeFields_array[$r]=array( - // 's.rowid'=>"List:societe:CompanyName",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text', + // 's.rowid'=>"Numeric",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text', // 's.ape'=>'Text','s.idprof4'=>'Text','s.tva_intra'=>'Text','f.ref'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.total_ht'=>"Numeric",'f.total_ttc'=>"Numeric",'f.total_tva'=>"Numeric", // 'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note_public'=>"Text",'fd.description'=>"Text",'fd.tva_tx'=>"Text",'fd.qty'=>"Numeric",'fd.total_ht'=>"Numeric",'fd.total_ttc'=>"Numeric", // 'fd.tva'=>"Numeric",'fd.product_type'=>'Numeric','fd.fk_product'=>'List:product:label','p.ref'=>'Text','p.label'=>'Text' @@ -399,7 +399,7 @@ class modFournisseur extends DolibarrModules $this->export_fields_array[$r]['f.multicurrency_total_ttc'] = 'MulticurrencyAmountTTC'; } //$this->export_TypeFields_array[$r]=array( - // 's.rowid'=>"List:societe:CompanyName",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.phone'=>'Text', + // 's.rowid'=>"Numeric",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.phone'=>'Text', // 's.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.tva_intra'=>'Text','f.ref'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date", // 'f.total_ht'=>"Numeric",'f.total_ttc'=>"Numeric",'f.total_tva'=>"Numeric",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note_public'=>"Text", // 'pf.amount'=>'Numeric','p.datep'=>'Date','p.num_paiement'=>'Numeric' diff --git a/htdocs/core/modules/modProjet.class.php b/htdocs/core/modules/modProjet.class.php index f8b82e8faa3..ebfba5d95b9 100644 --- a/htdocs/core/modules/modProjet.class.php +++ b/htdocs/core/modules/modProjet.class.php @@ -224,13 +224,13 @@ class modProjet extends DolibarrModules $this->export_dependencies_array[$r] = array('projecttask'=>'pt.rowid', 'task_time'=>'ptt.rowid'); $this->export_TypeFields_array[$r] = array( - 's.rowid'=>"List:societe:nom::thirdparty", 's.nom'=>'Text', 's.address'=>'Text', 's.zip'=>'Text', 's.town'=>'Text', 's.fk_pays'=>'List:c_country:label', + 's.rowid'=>"Numeric", 's.nom'=>'Text', 's.address'=>'Text', 's.zip'=>'Text', 's.town'=>'Text', 's.fk_pays'=>'List:c_country:label', 's.phone'=>'Text', 's.email'=>'Text', 's.siren'=>'Text', 's.siret'=>'Text', 's.ape'=>'Text', 's.idprof4'=>'Text', 's.code_compta'=>'Text', 's.code_compta_fournisseur'=>'Text', - 'p.rowid'=>"List:projet:ref::project", 'p.ref'=>"Text", 'p.title'=>"Text", + 'p.rowid'=>"Numeric", 'p.ref'=>"Text", 'p.title'=>"Text", 'p.usage_opportunity'=>'Boolean', 'p.usage_task'=>'Boolean', 'p.usage_bill_time'=>'Boolean', 'p.datec'=>"Date", 'p.dateo'=>"Date", 'p.datee'=>"Date", 'p.fk_statut'=>'Status', 'cls.code'=>"Text", 'p.opp_percent'=>'Numeric', 'p.opp_amount'=>'Numeric', 'p.description'=>"Text", 'p.entity'=>'Numeric', 'p.budget_amount'=>'Numeric', 'pt.rowid'=>'Numeric', 'pt.ref'=>'Text', 'pt.label'=>'Text', 'pt.dateo'=>"Date", 'pt.datee'=>"Date", 'pt.duration_effective'=>"Duree", 'pt.planned_workload'=>"Numeric", 'pt.progress'=>"Numeric", 'pt.description'=>"Text", - 'ptt.rowid'=>'Numeric', 'ptt.task_date'=>'Date', 'ptt.task_duration'=>"Duree", 'ptt.fk_user'=>"List:user:CONCAT(lastname,' ',firstname)", 'ptt.note'=>"Text" + 'ptt.rowid'=>'Numeric', 'ptt.task_date'=>'Date', 'ptt.task_duration'=>"Duree", 'ptt.fk_user'=>"FormSelect:select_dolusers", 'ptt.note'=>"Text" ); $this->export_entities_array[$r] = array( 's.rowid'=>"company", 's.nom'=>'company', 's.address'=>'company', 's.zip'=>'company', 's.town'=>'company', 's.fk_pays'=>'company', diff --git a/htdocs/core/modules/modPropale.class.php b/htdocs/core/modules/modPropale.class.php index 3419d4c866e..f6443e6c992 100644 --- a/htdocs/core/modules/modPropale.class.php +++ b/htdocs/core/modules/modPropale.class.php @@ -212,7 +212,7 @@ class modPropale extends DolibarrModules } } //$this->export_TypeFields_array[$r]=array( - // 's.rowid'=>"List:societe:nom",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','co.code'=>'Text','s.phone'=>'Text', + // 's.rowid'=>"Numeric",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','co.code'=>'Text','s.phone'=>'Text', // 's.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','c.ref'=>"Text",'c.ref_client'=>"Text",'c.datec'=>"Date",'c.datep'=>"Date", // 'c.fin_validite'=>"Date",'c.total_ht'=>"Numeric",'c.total_ttc'=>"Numeric",'c.fk_statut'=>'Status','c.note_public'=>"Text", // 'c.date_livraison'=>'Date','cd.description'=>"Text",'cd.product_type'=>'Boolean','cd.tva_tx'=>"Numeric",'cd.qty'=>"Numeric",'cd.total_ht'=>"Numeric", diff --git a/htdocs/core/modules/modReception.class.php b/htdocs/core/modules/modReception.class.php index 29c10ccb3e5..6e7cba2b053 100644 --- a/htdocs/core/modules/modReception.class.php +++ b/htdocs/core/modules/modReception.class.php @@ -189,7 +189,7 @@ class modReception extends DolibarrModules if ($idcontacts && !empty($conf->global->RECEPTION_ADD_CONTACTS_IN_EXPORT)) { $this->export_fields_array[$r] += array('sp.rowid'=>'IdContact', 'sp.lastname'=>'Lastname', 'sp.firstname'=>'Firstname', 'sp.note_public'=>'NotePublic'); } - //$this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:nom",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','co.label'=>'List:c_country:label:label','co.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','c.ref'=>"Text",'c.ref_client'=>"Text",'c.date_creation'=>"Date",'c.date_commande'=>"Date",'c.amount_ht'=>"Numeric",'c.remise_percent'=>"Numeric",'c.total_ht'=>"Numeric",'c.total_ttc'=>"Numeric",'c.facture'=>"Boolean",'c.fk_statut'=>'Status','c.note_public'=>"Text",'c.date_livraison'=>'Date','ed.qty'=>"Text"); + //$this->export_TypeFields_array[$r]=array('s.rowid'=>"Numeric",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','co.label'=>'List:c_country:label:label','co.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','c.ref'=>"Text",'c.ref_client'=>"Text",'c.date_creation'=>"Date",'c.date_commande'=>"Date",'c.amount_ht'=>"Numeric",'c.remise_percent'=>"Numeric",'c.total_ht'=>"Numeric",'c.total_ttc'=>"Numeric",'c.facture'=>"Boolean",'c.fk_statut'=>'Status','c.note_public'=>"Text",'c.date_livraison'=>'Date','ed.qty'=>"Text"); $this->export_TypeFields_array[$r] = array( 's.nom'=>'Text', 's.address'=>'Text', 's.zip'=>'Text', 's.town'=>'Text', 'co.label'=>'List:c_country:label:label', 'co.code'=>'Text', 's.phone'=>'Text', 's.siren'=>'Text', 's.siret'=>'Text', 's.ape'=>'Text', 's.idprof4'=>'Text', diff --git a/htdocs/core/modules/modSociete.class.php b/htdocs/core/modules/modSociete.class.php index e4cf484df58..997c2ac43b1 100644 --- a/htdocs/core/modules/modSociete.class.php +++ b/htdocs/core/modules/modSociete.class.php @@ -306,7 +306,7 @@ class modSociete extends DolibarrModules $this->export_fields_array[$r] += array('u.login'=>'SaleRepresentativeLogin', 'u.firstname'=>'SaleRepresentativeFirstname', 'u.lastname'=>'SaleRepresentativeLastname'); //$this->export_TypeFields_array[$r]=array( - // 's.rowid'=>"List:societe:nom",'s.nom'=>"Text",'s.status'=>"Text",'s.client'=>"Boolean",'s.fournisseur'=>"Boolean",'s.datec'=>"Date",'s.tms'=>"Date", + // 's.rowid'=>"Numeric",'s.nom'=>"Text",'s.status'=>"Text",'s.client'=>"Boolean",'s.fournisseur'=>"Boolean",'s.datec'=>"Date",'s.tms'=>"Date", // 's.code_client'=>"Text",'s.code_fournisseur'=>"Text",'s.address'=>"Text",'s.zip'=>"Text",'s.town'=>"Text",'c.label'=>"List:c_country:label:label", // 'c.code'=>"Text",'s.phone'=>"Text",'s.fax'=>"Text",'s.url'=>"Text",'s.email'=>"Text",'s.default_lang'=>"Text",'s.canvas' => "Canvas",'s.siret'=>"Text",'s.siren'=>"Text", // 's.ape'=>"Text",'s.idprof4'=>"Text",'s.idprof5'=>"Text",'s.idprof6'=>"Text",'s.tva_intra'=>"Text",'s.capital'=>"Numeric",'s.note'=>"Text", @@ -397,7 +397,7 @@ class modSociete extends DolibarrModules 'c.address'=>"Text", 'c.zip'=>"Text", 'c.town'=>"Text", 'd.nom'=>'Text', 'r.nom'=>'Text', 'co.label'=>"List:c_country:label:rowid", 'co.code'=>"Text", 'c.phone'=>"Text", 'c.fax'=>"Text", 'c.email'=>"Text", 'c.statut'=>"Status", - 's.rowid'=>"List:societe:nom::thirdparty", 's.nom'=>"Text", 's.status'=>"Status", 's.code_client'=>"Text", 's.code_fournisseur'=>"Text", + 's.rowid'=>"Numeric", 's.nom'=>"Text", 's.status'=>"Status", 's.code_client'=>"Text", 's.code_fournisseur'=>"Text", 's.code_compta'=>"Text", 's.code_compta_fournisseur'=>"Text", 's.client'=>"Text", 's.fournisseur'=>"Text", 's.address'=>"Text", 's.zip'=>"Text", 's.town'=>"Text", 's.phone'=>"Text", 's.email'=>"Text", diff --git a/htdocs/core/modules/modStock.class.php b/htdocs/core/modules/modStock.class.php index 52a3843fd12..7aa9abb3bff 100644 --- a/htdocs/core/modules/modStock.class.php +++ b/htdocs/core/modules/modStock.class.php @@ -239,7 +239,7 @@ class modStock extends DolibarrModules ); $this->export_TypeFields_array[$r] = array( 'e.rowid'=>'List:entrepot:ref::stock', 'e.ref'=>'Text', 'e.lieu'=>'Text', 'e.address'=>'Text', 'e.zip'=>'Text', 'e.town'=>'Text', - 'p.rowid'=>"List:product:label::product", 'p.ref'=>"Text", 'p.fk_product_type'=>"Text", 'p.label'=>"Text", 'p.description'=>"Text", 'p.note'=>"Text", + 'p.rowid'=>"Numeric", 'p.ref'=>"Text", 'p.fk_product_type'=>"Text", 'p.label'=>"Text", 'p.description'=>"Text", 'p.note'=>"Text", 'p.price'=>"Numeric", 'p.tva_tx'=>'Numeric', 'p.tosell'=>"Boolean", 'p.tobuy'=>"Boolean", 'p.duration'=>"Duree", 'p.datec'=>'Date', 'p.tms'=>'Date', 'p.pmp'=>'Numeric', 'p.cost_price'=>'Numeric', 'ps.reel'=>'Numeric', @@ -286,7 +286,7 @@ class modStock extends DolibarrModules ); $this->export_TypeFields_array[$r] = array( 'e.rowid'=>'List:entrepot:ref::stock', 'e.ref'=>'Text', 'e.lieu'=>'Text', 'e.description'=>'Text', 'e.address'=>'Text', 'e.zip'=>'Text', 'e.town'=>'Text', - 'p.rowid'=>"List:product:label::product", 'p.ref'=>"Text", 'p.fk_product_type'=>"Text", 'p.label'=>"Text", 'p.description'=>"Text", 'p.note'=>"Text", + 'p.rowid'=>"Numeric", 'p.ref'=>"Text", 'p.fk_product_type'=>"Text", 'p.label'=>"Text", 'p.description'=>"Text", 'p.note'=>"Text", 'p.price'=>"Numeric", 'p.tva_tx'=>'Numeric', 'p.tosell'=>"Boolean", 'p.tobuy'=>"Boolean", 'p.duration'=>"Duree", 'p.datec'=>'DateCreation', 'p.tms'=>'DateModification', 'p.pmp'=>'PMPValue', 'p.cost_price'=>'CostPrice', 'pb.batch'=>'Text', 'pb.qty'=>'Numeric', @@ -332,7 +332,7 @@ class modStock extends DolibarrModules $this->export_TypeFields_array[$r] = array( 'sm.rowid'=>'Numeric', 'sm.value'=>'Numeric', 'sm.datem'=>'Date', 'sm.batch'=>'Text', 'sm.label'=>'Text', 'sm.inventorycode'=>'Text', 'e.rowid'=>'List:entrepot:ref::stock', 'e.ref'=>'Text', 'e.description'=>'Text', 'e.lieu'=>'Text', 'e.address'=>'Text', 'e.zip'=>'Text', 'e.town'=>'Text', - 'p.rowid'=>"List:product:label::product", 'p.ref'=>"Text", 'p.fk_product_type'=>"Text", 'p.label'=>"Text", 'p.description'=>"Text", 'p.note'=>"Text", + 'p.rowid'=>"Numeric", 'p.ref'=>"Text", 'p.fk_product_type'=>"Text", 'p.label'=>"Text", 'p.description'=>"Text", 'p.note'=>"Text", 'p.price'=>"Numeric", 'p.tva_tx'=>'Numeric', 'p.tosell'=>"Boolean", 'p.tobuy'=>"Boolean", 'p.duration'=>"Duree", 'p.datec'=>'Date', 'p.tms'=>'Date' ); $this->export_entities_array[$r] = array( diff --git a/htdocs/core/modules/modUser.class.php b/htdocs/core/modules/modUser.class.php index f77f1dacedf..719c90c6dab 100644 --- a/htdocs/core/modules/modUser.class.php +++ b/htdocs/core/modules/modUser.class.php @@ -227,11 +227,14 @@ class modUser extends DolibarrModules 'u.office_phone'=>'Phone', 'u.user_mobile'=>"Mobile", 'u.office_fax'=>'Fax', 'u.email'=>"Email", 'u.note'=>"Note", 'u.signature'=>'Signature', 'u.fk_user'=>'HierarchicalResponsible', 'u.thm'=>'THM', 'u.tjm'=>'TJM', 'u.weeklyhours'=>'WeeklyHours', - 'u.dateemployment'=>'DateEmployment', 'u.salary'=>'Salary', 'u.color'=>'Color', 'u.api_key'=>'ApiKey', + 'u.dateemployment'=>'DateEmploymentStart', 'u.dateemploymentend'=>'DateEmploymentEnd', 'u.salary'=>'Salary', 'u.color'=>'Color', 'u.api_key'=>'ApiKey', 'u.birth'=>'DateOfBirth', 'u.datec'=>"DateCreation", 'u.tms'=>"DateLastModification", 'u.admin'=>"Administrator", 'u.statut'=>'Status', 'u.datelastlogin'=>'LastConnexion', 'u.datepreviouslogin'=>'PreviousConnexion', - 'u.fk_socpeople'=>"IdContact", 'u.fk_soc'=>"IdCompany", 'u.fk_member'=>"MemberId", + 'u.fk_socpeople'=>"IdContact", 'u.fk_soc'=>"IdCompany", + 'u.fk_member'=>"MemberId", + "a.firstname"=>"MemberFirstname", + "a.lastname"=>"MemberLastname", 'g.nom'=>"Group" ); $this->export_TypeFields_array[$r] = array( @@ -240,9 +243,17 @@ class modUser extends DolibarrModules 'u.address'=>"Text", 'u.zip'=>"Text", 'u.town'=>"Text", 'u.office_phone'=>'Text', 'u.user_mobile'=>'Text', 'u.office_fax'=>'Text', 'u.email'=>'Text', 'u.datec'=>"Date", 'u.tms'=>"Date", 'u.admin'=>"Boolean", 'u.statut'=>'Status', 'u.note'=>"Text", 'u.signature'=>"Text", 'u.datelastlogin'=>'Date', - 'u.fk_user'=>"List:user:login", + 'u.fk_user'=>"FormSelect:select_dolusers", 'u.birth'=>'Date', - 'u.datepreviouslogin'=>'Date', 'u.fk_soc'=>"List:societe:nom:rowid", 'u.fk_member'=>"List:adherent:firstname", + 'u.datepreviouslogin'=>'Date', + 'u.fk_socpeople'=>'FormSelect:selectcontacts', + 'u.fk_soc'=>"FormSelect:select_company", + 'u.tjm'=>"Numeric", 'u.thm'=>"Numeric", 'u.fk_member'=>"Numeric", + 'u.weeklyhours'=>"Numeric", + 'u.dateemployment'=>"Date", 'u.dateemploymentend'=>"Date", 'u.salary'=>"Numeric", + 'u.color'=>'Text', 'u.api_key'=>'Text', + 'a.firstname'=>'Text', + 'a.lastname'=>'Text', 'g.nom'=>"Text" ); $this->export_entities_array[$r] = array( @@ -252,11 +263,12 @@ class modUser extends DolibarrModules 'u.office_phone'=>'user', 'u.user_mobile'=>'user', 'u.office_fax'=>'user', 'u.email'=>'user', 'u.note'=>"user", 'u.signature'=>'user', 'u.fk_user'=>'user', 'u.thm'=>'user', 'u.tjm'=>'user', 'u.weeklyhours'=>'user', - 'u.dateemployment'=>'user', 'u.salary'=>'user', 'u.color'=>'user', 'u.api_key'=>'user', + 'u.dateemployment'=>'user', 'u.dateemploymentend'=>'user', 'u.salary'=>'user', 'u.color'=>'user', 'u.api_key'=>'user', 'u.birth'=>'user', 'u.datec'=>"user", 'u.tms'=>"user", 'u.admin'=>"user", 'u.statut'=>'user', 'u.datelastlogin'=>'user', 'u.datepreviouslogin'=>'user', 'u.fk_socpeople'=>"contact", 'u.fk_soc'=>"company", 'u.fk_member'=>"member", + 'a.firstname'=>"member", 'a.lastname'=>"member", 'g.nom'=>"Group" ); $keyforselect = 'user'; @@ -272,6 +284,7 @@ class modUser extends DolibarrModules $this->export_sql_end[$r] .= ' LEFT JOIN '.MAIN_DB_PREFIX.'user_extrafields as extra ON u.rowid = extra.fk_object'; $this->export_sql_end[$r] .= ' LEFT JOIN '.MAIN_DB_PREFIX.'usergroup_user as ug ON u.rowid = ug.fk_user'; $this->export_sql_end[$r] .= ' LEFT JOIN '.MAIN_DB_PREFIX.'usergroup as g ON ug.fk_usergroup = g.rowid'; + $this->export_sql_end[$r] .= ' LEFT JOIN '.MAIN_DB_PREFIX.'adherent as a ON u.fk_member = a.rowid'; $this->export_sql_end[$r] .= ' WHERE u.entity IN ('.getEntity('user').')'; // Imports @@ -292,7 +305,7 @@ class modUser extends DolibarrModules 'u.office_phone'=>"Phone", 'u.user_mobile'=>"Mobile", 'u.office_fax'=>"Fax", 'u.email'=>"Email", 'u.note'=>"Note", 'u.signature'=>'Signature', 'u.fk_user'=>'HierarchicalResponsible', 'u.thm'=>'THM', 'u.tjm'=>'TJM', 'u.weeklyhours'=>'WeeklyHours', - 'u.dateemployment'=>'DateEmployment', 'u.salary'=>'Salary', 'u.color'=>'Color', 'u.api_key'=>'ApiKey', + 'u.dateemployment'=>'DateEmploymentStart', 'u.dateemploymentend'=>'DateEmploymentEnd', 'u.salary'=>'Salary', 'u.color'=>'Color', 'u.api_key'=>'ApiKey', 'u.birth'=>'DateOfBirth', 'u.datec'=>"DateCreation", 'u.statut'=>'Status' diff --git a/htdocs/exports/class/export.class.php b/htdocs/exports/class/export.class.php index 89d0caaa24f..f25192578be 100644 --- a/htdocs/exports/class/export.class.php +++ b/htdocs/exports/class/export.class.php @@ -268,7 +268,7 @@ class Export continue; } if ($value != '') { - $sqlWhere .= " and ".$this->build_filterQuery($this->array_export_TypeFields[$indice][$key], $key, $array_filterValue[$key]); + $sqlWhere .= " AND ".$this->build_filterQuery($this->array_export_TypeFields[$indice][$key], $key, $array_filterValue[$key]); } } $sql .= $sqlWhere; @@ -350,6 +350,13 @@ class Export case 'Boolean': $szFilterQuery = " ".$NameField."=".(is_numeric($ValueField) ? $ValueField : ($ValueField == 'yes' ? 1 : 0)); break; + case 'FormSelect': + if (is_numeric($ValueField) && $ValueField > 0) { + $szFilterQuery = " ".$NameField." = ".((float) $ValueField); + } else { + $szFilterQuery = " 1=1"; // Test always true + } + break; case 'Status': case 'List': if (is_numeric($ValueField)) { @@ -402,7 +409,7 @@ class Export public function build_filterField($TypeField, $NameField, $ValueField) { // phpcs:enable - global $conf, $langs; + global $conf, $langs, $form; $szFilterField = ''; $InfoFieldList = explode(":", $TypeField); @@ -443,6 +450,16 @@ class Export $szFilterField .= ' value="0">'.yn(0).''; $szFilterField .= ""; break; + case 'FormSelect': + //var_dump($NameField); + if ($InfoFieldList[1] == 'select_company') { + $szFilterField .= $form->select_company('', $NameField, '', 1); + } elseif ($InfoFieldList[1] == 'selectcontacts') { + $szFilterField .= $form->selectcontacts(0, '', $NameField, ' '); + } elseif ($InfoFieldList[1] == 'select_dolusers') { + $szFilterField .= $form->select_dolusers('', $NameField, 1); + } + break; case 'List': // 0 : Type du champ // 1 : Nom de la table diff --git a/htdocs/exports/export.php b/htdocs/exports/export.php index b07d68f8591..4f001238134 100644 --- a/htdocs/exports/export.php +++ b/htdocs/exports/export.php @@ -519,7 +519,7 @@ if ($step == 2 && $datatoexport) { print ''.$langs->trans("SelectExportFields").' '; $htmlother->select_export_model($exportmodelid, 'exportmodelid', $datatoexport, 1, $user->id); print ' '; - print ''; + print ''; print ''; print ''; @@ -868,12 +868,18 @@ if ($step == 4 && $datatoexport) { print ''.$list.''; print ''; - // List of filtered fiels + // List of filtered fields if (isset($objexport->array_export_TypeFields[0]) && is_array($objexport->array_export_TypeFields[0])) { print ''.$langs->trans("FilteredFields").''; $list = ''; if (!empty($array_filtervalue)) { foreach ($array_filtervalue as $code => $value) { + if (preg_match('/^FormSelect:/', $objexport->array_export_TypeFields[0][$code])) { + // We discard this filter if it is a FromSelect field with a value of -1. + if ($value == -1) { + continue; + } + } if (isset($objexport->array_export_fields[0][$code])) { $list .= ($list ? ', ' : ''); if (isset($array_filtervalue[$code]) && preg_match('/^\s*[<>]/', $array_filtervalue[$code])) { @@ -1015,7 +1021,7 @@ if ($step == 4 && $datatoexport) { print $form->selectarray('visibility', $arrayvisibility, 'private'); print ''; print ''; - print ''; + print ''; print ''; $tmpuser = new User($db); @@ -1148,6 +1154,12 @@ if ($step == 5 && $datatoexport) { $list = ''; if (!empty($array_filtervalue)) { foreach ($array_filtervalue as $code => $value) { + if (preg_match('/^FormSelect:/', $objexport->array_export_TypeFields[0][$code])) { + // We discard this filter if it is a FromSelect field with a value of -1. + if ($value == -1) { + continue; + } + } if (isset($objexport->array_export_fields[0][$code])) { $list .= ($list ? ', ' : ''); if (isset($array_filtervalue[$code]) && preg_match('/^\s*[<>]/', $array_filtervalue[$code])) { diff --git a/htdocs/langs/en_US/members.lang b/htdocs/langs/en_US/members.lang index faa2e0d0fcd..22060706a36 100644 --- a/htdocs/langs/en_US/members.lang +++ b/htdocs/langs/en_US/members.lang @@ -218,3 +218,5 @@ XExternalUserCreated=%s external user(s) created ForceMemberNature=Force member nature (Individual or Corporation) CreateDolibarrLoginDesc=The creation of a user login for members allows them to connect to the application. Depending on the authorizations granted, they will be able, for example, to consult or modify their file themselves. CreateDolibarrThirdPartyDesc=A thirdparty is the legal entity that will be used on the invoice if you decide to generate invoice for each contribution. You will be able to create it later during the process of recording the contribution. +MemberFirstname=Member firstname +MemberLastname=Member lastname \ No newline at end of file diff --git a/htdocs/langs/en_US/users.lang b/htdocs/langs/en_US/users.lang index 5bfbec87294..c98c1f4902f 100644 --- a/htdocs/langs/en_US/users.lang +++ b/htdocs/langs/en_US/users.lang @@ -114,7 +114,7 @@ UserLogoff=User logout UserLogged=User logged DateOfEmployment=Employment date DateEmployment=Employment -DateEmploymentstart=Employment Start Date +DateEmploymentStart=Employment Start Date DateEmploymentEnd=Employment End Date RangeOfLoginValidity=Access validity date range CantDisableYourself=You can't disable your own user record diff --git a/htdocs/societe/ajax/company.php b/htdocs/societe/ajax/company.php index 9dfe3909393..5c02afe85dc 100644 --- a/htdocs/societe/ajax/company.php +++ b/htdocs/societe/ajax/company.php @@ -109,7 +109,6 @@ if (!empty($action) && $action == 'fetch' && !empty($id)) { // When used from jQuery, the search term is added as GET param "term". $searchkey = (($id && GETPOST($id, 'alpha')) ? GETPOST($id, 'alpha') : (($htmlname && GETPOST($htmlname, 'alpha')) ?GETPOST($htmlname, 'alpha') : '')); - if (!$searchkey) { return; } From b0c96455ced21667d2bb20cb801272ff4a152a4b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 17 May 2022 00:59:00 +0200 Subject: [PATCH 543/738] Prepare 15.0.2 --- ChangeLog | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/ChangeLog b/ChangeLog index e55cfad84d1..b67cbabafb4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,103 @@ English Dolibarr ChangeLog -------------------------------------------------------------- +***** ChangeLog for 15.0.2 compared to 15.0.1 ***** + +FIX: #19777 #20281 +FIX: #20140 #20301 +FIX: #20279 Accountancy - PostGreSQL - Error on mass update lines already binded +FIX: #20476 migration postgresql 14.0.x to 15.0.x packaging type +FIX: #20733 Inventory: Do not use batch qty even if present if batch module is disabled. +FIX: action comm list: holiday last day not included + handle duration with halfdays +FIX: Add missing entity on salary's payment +FIX: Add 'recruitment' into check array +FIX: add tools to fix bad bank amount in accounting with multicurrency +FIX: assign member cateogry to a member +FIX: backport +FIX: bad bank amount in accounting with multicurrency +FIX: Bad condition on remx +FIX: Bad filter on date on salary list +FIX: bad link to add a customer price (token duplicated) +FIX: bad status of member on widget by type and status +FIX: better error management at product selling price update +FIX: Can't edit bank record +FIX: check mandatory thirdparty fields for mass action +FIX: check thirdparty object loaded and properties exist +FIX: comment +FIX: compatibility for ticket number sharing +FIX: compatibility with multicompany sharings +FIX: contact card: single extrafield update failed +FIX: country not visible into list of states +FIX: Delete an extrafield where type is double +FIX: deprecated module are not more viewed as external modules +FIX: Disable customer type by default if type prospect/customer is disabled +FIX: each time we create a supplier order, we need to give it a ref_supplier +FIX: Error management +FIX: fatal error for $db usage in tpl +FIX: filter into the list of product lots +FIX: Filter on Object Referent page give CRSF page +FIX: Fix default options ($hidedetails, $hidedesc, $hideref) with globales when generate PDF in mass actions +FIX: Fix search by filters +FIX: Fix the adding of lines in the create invoice functions +FIX: forgotten form confirm before various payment delete +FIX: holiday/leave requests: write status change emails in HTML +FIX: include discount price for PMP after a reception (Issue #20029) +FIX: incrementation +FIX: in salary stats and payment list, we must check right perms as well as salary list +FIX: intervention entity missing +FIX: label tax cat trad +FIX: Mass action ship orders +FIX: missing advanced perms +FIX: missing call to executeHooks() +FIX: Missing entity on adding new VAT +FIX: missing hook for row ordering +FIX: missing hook parameter ($possiblelinks) +FIX: missing parenthesis +FIX: missing picto in combo of mass actions of thirdparties. +FIX: missing signature library when ODT model is used +FIX: Missing unset fields after updateline expensereport +FIX: ModuileBuilder - Fix getLinesArray() error reporting +FIX: Move delete task time trigger position +FIX: Navigation between invoices +FIX: No empty line inserted into accounting_bookkeeping +FIX: Numbering of sepa files +FIX: object cloning: set unique extrafield values to null to prevent duplicates +FIX: on update with action reminder in future there is user key error +FIX: originproductline array td identification data-id +FIX: out of memory when more than 100 000 invoices. +FIX: permit access to medias when logged in a different entity +FIX: phpcs +FIX: project creation prevented if PROJECTLEADER contact role renamed, de-activated or deleted +FIX: project timesheet by week: cleanup unused code +FIX: project timesheet: public holidays offset by 1 day +FIX: project timesheets: assume Saturday and Sunday as default weekend days when working days conf is empty or badly formed +FIX: propal list: bad error management when setting "not signed" mass action +FIX: propal list mass action translations and error management (v14 edition) +FIX: propal list: missing not signed massaction translation keys for transifex +FIX: PR returns +FIX: ref_client doesn't exists on supplier invoice, then ref_fourn needs to have a default value when we want to bill several supplier orders +FIX: replenish and manage product stock by warhouse +FIX: sending email on payment of registration of event +FIX: SEPA ICS is not mandatory for bank transfer +FIX: Set datec when add time spent on a project task +FIX: status filter on supplierOrder stats doesn't work +FIX: stickler-ci +FIX: still prevent project creation if PROJECTLEADER role unavailable, but with a specific error message +FIX: Supplier order stats +FIX: Tabulation must be allowed for HTML content +FIX: tool to fix bank account not in main currency for vendor invoice +FIX: translations +FIX: Travis + Update dev +FIX: truncate Customer Reference too long on PDF header (PR #20718) +FIX: uniformize code +FIX: Update of sale price (log not correctly updated) +FIX: user actions rights when mulit-company transverse mode is enabled +FIX: user employee tab: offset in open days messes up holiday length calculation +FIX: We need to have a different default_ref_supplier for each new fourn invoice +FIX: "WHERE" clause missing on resource export +FIX: #yogosha9754 + + ***** ChangeLog for 15.0.1 compared to 15.0.0 ***** FIX: #19777 #20281 FIX: bad position of extrafields for interventions From ddd0848acc6b8624409dd7108675b298c2f24649 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 17 May 2022 01:21:33 +0200 Subject: [PATCH 544/738] Look and feel v16 --- htdocs/core/class/html.form.class.php | 5 +++-- htdocs/theme/eldy/global.inc.php | 2 +- htdocs/theme/md/style.css.php | 2 +- htdocs/user/class/user.class.php | 1 + htdocs/user/list.php | 22 ++++++++++++++++++---- 5 files changed, 24 insertions(+), 8 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 94ae9fb0fbc..c96db183a3f 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -8922,10 +8922,11 @@ class Form $addgendertxt .= ''; break; case 'other': - $addgendertxt .= ''; + $addgendertxt .= ''; break; } } + /* $addadmin = ''; if (property_exists($object, 'admin')) { @@ -9067,7 +9068,7 @@ class Form $ret .= dol_htmlentities($fullname).$addgendertxt.((!empty($object->societe) && $object->societe != $fullname) ? ' ('.dol_htmlentities($object->societe).')' : ''); } } elseif (in_array($object->element, array('contact', 'user', 'usergroup'))) { - $ret .= dol_htmlentities($object->getFullName($langs)); + $ret .= dol_htmlentities($object->getFullName($langs)).$addgendertxt; } elseif (in_array($object->element, array('action', 'agenda'))) { $ret .= $object->ref.'
    '.$object->label; } elseif (in_array($object->element, array('adherent_type'))) { diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 76e7a74450d..d01e3b8d55d 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -901,7 +901,7 @@ div.urllink, div.urllink a { color: #339 !important; } -i.fa-mars::before, i.fa-venus::before, i.fa-genderless::before { +i.fa-mars::before, i.fa-venus::before, i.fa-genderless::before, i.fa-transgender::before { color: #888 !important; opacity: 0.4; padding-: 3px; diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 879bd52e864..fe54b2365b5 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -1050,7 +1050,7 @@ div.urllink, div.urllink a { .fa-info-circle { padding-: 3px; } -i.fa-mars::before, i.fa-venus::before, i.fa-genderless::before { +i.fa-mars::before, i.fa-venus::before, i.fa-genderless::before, i.fa-transgender::before { color: #888 !important; opacity: 0.4; padding-: 3px; diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index b0630f0394e..9f25d49bd50 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -80,6 +80,7 @@ class User extends CommonObject * @var string gender */ public $gender; + public $birth; /** diff --git a/htdocs/user/list.php b/htdocs/user/list.php index 422d36d791f..2ec8ac37b87 100644 --- a/htdocs/user/list.php +++ b/htdocs/user/list.php @@ -661,7 +661,7 @@ if (!empty($arrayfields['u.firstname']['checked'])) { print ''; } if (!empty($arrayfields['u.gender']['checked'])) { - print ''; + print ''; $arraygender = array('man'=>$langs->trans("Genderman"), 'woman'=>$langs->trans("Genderwoman"), 'other'=>$langs->trans("Genderother")); print $form->selectarray('search_gender', $arraygender, $search_gender, 1); print ''; @@ -748,7 +748,7 @@ if (!empty($arrayfields['u.firstname']['checked'])) { print_liste_field_titre("FirstName", $_SERVER['PHP_SELF'], "u.firstname", $param, "", "", $sortfield, $sortorder); } if (!empty($arrayfields['u.gender']['checked'])) { - print_liste_field_titre("Gender", $_SERVER['PHP_SELF'], "u.gender", $param, "", "", $sortfield, $sortorder); + print_liste_field_titre("Gender", $_SERVER['PHP_SELF'], "u.gender", $param, "", "", $sortfield, $sortorder, 'center '); } if (!empty($arrayfields['u.employee']['checked'])) { print_liste_field_titre("Employee", $_SERVER['PHP_SELF'], "u.employee", $param, "", "", $sortfield, $sortorder, 'center '); @@ -891,9 +891,23 @@ while ($i < ($limit ? min($num, $limit) : $num)) { } } if (!empty($arrayfields['u.gender']['checked'])) { - print ''; + print ''; if ($obj->gender) { - print $langs->trans("Gender".$obj->gender); + // Preparing gender's display if there is one + $addgendertxt = ''; + switch ($obj->gender) { + case 'man': + $addgendertxt .= 'gender)).'">'; + break; + case 'woman': + $addgendertxt .= 'gender)).'">'; + break; + case 'other': + $addgendertxt .= 'gender)).'">'; + break; + } + print $addgendertxt; + //print $langs->trans("Gender".$obj->gender); } print ''; if (!$i) { From a2e814b07972a5f06b673a69731e50440d02291c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 17 May 2022 07:30:02 +0200 Subject: [PATCH 545/738] Fix permissions --- htdocs/core/lib/security.lib.php | 1 + htdocs/ticket/index.php | 308 ++++++++++++++++--------------- 2 files changed, 159 insertions(+), 150 deletions(-) diff --git a/htdocs/core/lib/security.lib.php b/htdocs/core/lib/security.lib.php index 28e3a4a22f8..f5910e3b921 100644 --- a/htdocs/core/lib/security.lib.php +++ b/htdocs/core/lib/security.lib.php @@ -378,6 +378,7 @@ function restrictedArea($user, $features, $objectid = 0, $tableandshare = '', $f $nbko++; } } elseif (!empty($feature) && ($feature != 'user' && $feature != 'usergroup')) { // This is permissions on 1 level + var_dump($user->rights); if (empty($user->rights->$feature->lire) && empty($user->rights->$feature->read) && empty($user->rights->$feature->run)) { diff --git a/htdocs/ticket/index.php b/htdocs/ticket/index.php index 8e6e09f3fcf..8071d222748 100644 --- a/htdocs/ticket/index.php +++ b/htdocs/ticket/index.php @@ -52,9 +52,6 @@ if ($user->socid) { } $userid = $user->id; -// Security check -$result = restrictedArea($user, 'ticket', 0, '', '', '', ''); - $nowarray = dol_getdate(dol_now(), true); $nowyear = $nowarray['year']; $year = GETPOST('year', 'int') > 0 ? GETPOST('year', 'int') : $nowyear; @@ -63,6 +60,12 @@ $endyear = $year; $object = new Ticket($db); +// Security check +//$result = restrictedArea($user, 'ticket|knowledgemanagement', 0, '', '', '', ''); +if (empty($user->rights->ticket->read) && empty($user->rights->knowledgemanagement->knowledgerecord->read)) { + accessforbidden('Not enought permissions'); +} + /* * Actions @@ -240,63 +243,67 @@ $stringtoshow .= ''; -print ''; -print ''; +if (!empty($user->rights->ticket->read)) { + print '
    '; + print '
    '.$langs->trans("Statistics").' '.$endyear.' '.img_picto('', 'filter.png', 'id="idsubimgDOLUSERCOOKIE_ticket_by_status" class="linkobject"').'
    '; + print ''; -print ''; + + print '
    '.$langs->trans("Statistics").' '.$endyear.' '.img_picto('', 'filter.png', 'id="idsubimgDOLUSERCOOKIE_ticket_by_status" class="linkobject"').'
    '; -print $stringtoshow; + print '
    '; + print $stringtoshow; -// don't display graph if no series -if (!empty($dataseries) && count($dataseries) > 1) { - $totalnb = 0; - foreach ($dataseries as $key => $value) { - $totalnb += $value['data']; - } - - $data = array(); - foreach ($dataseries as $key => $value) { - $data[] = array($value['label'], $value['data']); - } - $px1 = new DolGraph(); - $mesg = $px1->isGraphKo(); - if (!$mesg) { - $px1->SetData($data); - $px1->SetDataColor(array_values($colorseries)); - - unset($data1); - $i = $startyear; - $legend = array(); - while ($i <= $endyear) { - $legend[] = $i; - $i++; + // don't display graph if no series + if (!empty($dataseries) && count($dataseries) > 1) { + $totalnb = 0; + foreach ($dataseries as $key => $value) { + $totalnb += $value['data']; } - $px1->setShowLegend(2); - $px1->SetType(array('pie')); - $px1->SetLegend($legend); - $px1->SetMaxValue($px1->GetCeilMaxValue()); - //$px1->SetWidth($WIDTH); - $px1->SetHeight($HEIGHT); - $px1->SetYLabel($langs->trans("TicketStatByStatus")); - $px1->SetShading(3); - $px1->SetHorizTickIncrement(1); - $px1->SetCssPrefix("cssboxes"); - $px1->mode = 'depth'; - //$px1->SetTitle($langs->trans("TicketStatByStatus")); - $px1->draw($filenamenb, $fileurlnb); - print $px1->show($totalnb ? 0 : 1); + $data = array(); + foreach ($dataseries as $key => $value) { + $data[] = array($value['label'], $value['data']); + } + $px1 = new DolGraph(); + $mesg = $px1->isGraphKo(); + if (!$mesg) { + $px1->SetData($data); + $px1->SetDataColor(array_values($colorseries)); + + unset($data1); + $i = $startyear; + $legend = array(); + while ($i <= $endyear) { + $legend[] = $i; + $i++; + } + $px1->setShowLegend(2); + $px1->SetType(array('pie')); + $px1->SetLegend($legend); + $px1->SetMaxValue($px1->GetCeilMaxValue()); + //$px1->SetWidth($WIDTH); + $px1->SetHeight($HEIGHT); + $px1->SetYLabel($langs->trans("TicketStatByStatus")); + $px1->SetShading(3); + $px1->SetHorizTickIncrement(1); + $px1->SetCssPrefix("cssboxes"); + $px1->mode = 'depth'; + //$px1->SetTitle($langs->trans("TicketStatByStatus")); + + $px1->draw($filenamenb, $fileurlnb); + print $px1->show($totalnb ? 0 : 1); + } } + print '
    '; + print ''; } -print ''; -print ''; -print ''; +if (!empty($user->rights->ticket->read)) { + // Build graphic number of object + $data = $stats->getNbByMonthWithPrevYear($endyear, $startyear); -// Build graphic number of object -$data = $stats->getNbByMonthWithPrevYear($endyear, $startyear); - -print '
    '."\n"; + print '
    '."\n"; +} print $resultboxes['boxlista']; @@ -304,127 +311,128 @@ print ''."\n"; print '
    '; -/* - * Latest unread tickets - */ +if (!empty($user->rights->ticket->read)) { + /* + * Latest unread tickets + */ -$max = 10; + $max = 10; -$sql = "SELECT t.rowid, t.ref, t.track_id, t.datec, t.subject, t.type_code, t.category_code, t.severity_code, t.fk_statut, t.progress,"; -$sql .= " type.code as type_code, type.label as type_label,"; -$sql .= " category.code as category_code, category.label as category_label,"; -$sql .= " severity.code as severity_code, severity.label as severity_label"; -$sql .= " FROM ".MAIN_DB_PREFIX."ticket as t"; -$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_ticket_type as type ON type.code=t.type_code"; -$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_ticket_category as category ON category.code=t.category_code"; -$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_ticket_severity as severity ON severity.code=t.severity_code"; -if (empty($user->rights->societe->client->voir) && !$socid) { - $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; -} - -$sql .= ' WHERE t.entity IN ('.getEntity('ticket').')'; -$sql .= " AND t.fk_statut=0"; -if (empty($user->rights->societe->client->voir) && !$socid) { - $sql .= " AND t.fk_soc = sc.fk_soc AND sc.fk_user = ".((int) $user->id); -} - -if ($user->socid > 0) { - $sql .= " AND t.fk_soc= ".((int) $user->socid); -} else { - // Restricted to assigned user only - if (!empty($conf->global->TICKET_LIMIT_VIEW_ASSIGNED_ONLY) && !$user->rights->ticket->manage) { - $sql .= " AND t.fk_user_assign = ".((int) $user->id); + $sql = "SELECT t.rowid, t.ref, t.track_id, t.datec, t.subject, t.type_code, t.category_code, t.severity_code, t.fk_statut, t.progress,"; + $sql .= " type.code as type_code, type.label as type_label,"; + $sql .= " category.code as category_code, category.label as category_label,"; + $sql .= " severity.code as severity_code, severity.label as severity_label"; + $sql .= " FROM ".MAIN_DB_PREFIX."ticket as t"; + $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_ticket_type as type ON type.code=t.type_code"; + $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_ticket_category as category ON category.code=t.category_code"; + $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_ticket_severity as severity ON severity.code=t.severity_code"; + if (empty($user->rights->societe->client->voir) && !$socid) { + $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; } -} -$sql .= $db->order("t.datec", "DESC"); -$sql .= $db->plimit($max, 0); -//print $sql; -$result = $db->query($sql); -if ($result) { - $num = $db->num_rows($result); + $sql .= ' WHERE t.entity IN ('.getEntity('ticket').')'; + $sql .= " AND t.fk_statut=0"; + if (empty($user->rights->societe->client->voir) && !$socid) { + $sql .= " AND t.fk_soc = sc.fk_soc AND sc.fk_user = ".((int) $user->id); + } - $i = 0; + if ($user->socid > 0) { + $sql .= " AND t.fk_soc= ".((int) $user->socid); + } else { + // Restricted to assigned user only + if (!empty($conf->global->TICKET_LIMIT_VIEW_ASSIGNED_ONLY) && !$user->rights->ticket->manage) { + $sql .= " AND t.fk_user_assign = ".((int) $user->id); + } + } + $sql .= $db->order("t.datec", "DESC"); + $sql .= $db->plimit($max, 0); - $transRecordedType = $langs->trans("LatestNewTickets", $max); + //print $sql; + $result = $db->query($sql); + if ($result) { + $num = $db->num_rows($result); - print '
    '; - print ''; - print ''; - print ''; - print ''; - if ($num > 0) { - while ($i < $num) { - $objp = $db->fetch_object($result); + $i = 0; - $object->id = $objp->rowid; - $object->ref = $objp->ref; - $object->track_id = $objp->track_id; - $object->fk_statut = $objp->fk_statut; - $object->progress = $objp->progress; - $object->subject = $objp->subject; + $transRecordedType = $langs->trans("LatestNewTickets", $max); - print ''; + print '
    '; + print '
    '.$transRecordedType.''.$langs->trans("FullList").'
    '; + print ''; + print ''; + print ''; + if ($num > 0) { + while ($i < $num) { + $objp = $db->fetch_object($result); - // Ref - print '\n"; + $object->id = $objp->rowid; + $object->ref = $objp->ref; + $object->track_id = $objp->track_id; + $object->fk_statut = $objp->fk_statut; + $object->progress = $objp->progress; + $object->subject = $objp->subject; - // Creation date - print '"; + print ''; - // Subject - print '\n"; + // Ref + print '\n"; - // Type - print ''; + // Creation date + print '"; - // Category - print '\n"; + + // Type + print ''; + + // Category + print '"; + + // Severity + print '"; + + print '"; + + print "\n"; + $i++; } - //print $objp->category_label; - print ""; - // Severity - print '"; - - print '"; - - print "\n"; - $i++; + $db->free($result); + } else { + print ''; } - $db->free($result); + print "
    '.$transRecordedType.''.$langs->trans("FullList").'
    '; - print $object->getNomUrl(1); - print "'; - print dol_print_date($db->jdate($objp->datec), 'dayhour'); - print "
    '; - print ''.dol_trunc($objp->subject, 30).''; - print "'; + print $object->getNomUrl(1); + print "'; - $s = $langs->getLabelFromKey($db, 'TicketTypeShort'.$objp->type_code, 'c_ticket_type', 'code', 'label', $objp->type_code); - print ''.$s.''; - print ''; + print dol_print_date($db->jdate($objp->datec), 'dayhour'); + print "'; - if (!empty($obp->category_code)) { - $s = $langs->getLabelFromKey($db, 'TicketCategoryShort'.$objp->category_code, 'c_ticket_category', 'code', 'label', $objp->category_code); + // Subject + print ''; + print ''.dol_trunc($objp->subject, 30).''; + print "'; + $s = $langs->getLabelFromKey($db, 'TicketTypeShort'.$objp->type_code, 'c_ticket_type', 'code', 'label', $objp->type_code); print ''.$s.''; + print ''; + if (!empty($obp->category_code)) { + $s = $langs->getLabelFromKey($db, 'TicketCategoryShort'.$objp->category_code, 'c_ticket_category', 'code', 'label', $objp->category_code); + print ''.$s.''; + } + //print $objp->category_label; + print "'; + $s = $langs->getLabelFromKey($db, 'TicketSeverityShort'.$objp->severity_code, 'c_ticket_severity', 'code', 'label', $objp->severity_code); + print ''.$s.''; + //print $objp->severity_label; + print "'; + print $object->getLibStatut(5); + print "
    '; - $s = $langs->getLabelFromKey($db, 'TicketSeverityShort'.$objp->severity_code, 'c_ticket_severity', 'code', 'label', $objp->severity_code); - print ''.$s.''; - //print $objp->severity_label; - print "'; - print $object->getLibStatut(5); - print "
    '.$langs->trans('NoUnreadTicketsFound').'
    "; + print '
    '; + + print '
    '; } else { - print ''.$langs->trans('NoUnreadTicketsFound').''; + dol_print_error($db); } - - print ""; - print '
    '; - - print '
    '; -} else { - dol_print_error($db); } - print $resultboxes['boxlistb']; print ''; From 07f2b787580dca89ddbe9aa4188a00234d82de12 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 17 May 2022 07:51:45 +0200 Subject: [PATCH 546/738] Clean code of doliwamp. Remove phpmyadmin --- build/exe/doliwamp/doliwamp.iss | 63 +++------------------------------ 1 file changed, 4 insertions(+), 59 deletions(-) diff --git a/build/exe/doliwamp/doliwamp.iss b/build/exe/doliwamp/doliwamp.iss index dbf74a96f67..c316e0f91d6 100644 --- a/build/exe/doliwamp/doliwamp.iss +++ b/build/exe/doliwamp/doliwamp.iss @@ -27,12 +27,12 @@ OutputBaseFilename=__FILENAMEEXEDOLIWAMP__ ;SourceDir=Z:\home\ldestailleur\git\dolibarrxxx SourceDir=..\..\.. AppId=doliwamp -AppPublisher=NLTechno -AppPublisherURL=https://www.nltechno.com +AppPublisher=DoliCloud +AppPublisherURL=https://www.dolicloud.com AppSupportURL=https://www.dolibarr.org AppUpdatesURL=https://www.dolibarr.org AppComments=DoliWamp includes Dolibarr, Apache, PHP and Mysql software. -AppCopyright=Copyright (C) 2008-2020 Laurent Destailleur (NLTechno), Fabian Rodriguez (Le Goût du Libre) +AppCopyright=Copyright (C) 2008-2022 Laurent Destailleur (NLTechno), Fabian Rodriguez (Le Goût du Libre) DefaultDirName=c:\dolibarr DefaultGroupName=Dolibarr ;LicenseFile=COPYING @@ -99,13 +99,12 @@ Source: "build\exe\doliwamp\startdoliwamp_manual_donotuse.bat.install"; DestDir: Source: "build\exe\doliwamp\builddemosslfiles.bat.install"; DestDir: "{app}\"; Flags: ignoreversion; Source: "build\exe\doliwamp\UsedPort.exe"; DestDir: "{app}\"; Flags: ignoreversion; -; PhpMyAdmin, Apache, Php, Mysql +; Apache, Php, Mysql ; Put here path of Wampserver applications ; Value OK: apache 2.2.6, php 5.2.5 (5.2.11, 5.3.0 and 5.3.1 fails if php_exif, php_pgsql, php_zip is on), mysql 5.0.45 ; Value OK: apache 2.2.11, php 5.3.0 (if no php_exif, php_pgsql, php_zip), mysql 5.0.45 ; Value OK: apache 2.4.9, php 5.5.12, mysql 5.0.45 instead of 5.6.17 (wampserver2.5-Apache-2.4.9-Mysql-5.6.17-php5.5.12-32b.exe) ; Value OK: apache 2.4.41, php 7.3.12, mariadb10.4.10 (wampserver3.2.0_x64.exe) -Source: "C:\wamp64\apps\phpmyadmin4.9.2\*.*"; DestDir: "{app}\apps\phpmyadmin4.9.2"; Flags: ignoreversion recursesubdirs; Excludes: "config.inc.php,wampserver.conf,*.log,*_log,darkblue_orange" ;Source: "C:\Program Files\Wamp\bin\apache\apache2.4.9\*.*"; DestDir: "{app}\bin\apache\apache2.4.9"; Flags: ignoreversion recursesubdirs; Excludes: "php.ini,httpd.conf,wampserver.conf,*.log,*_log" Source: "C:\wamp64\bin\apache\apache2.4.41\*.*"; DestDir: "{app}\bin\apache\apache2.4.41"; Flags: ignoreversion recursesubdirs; Excludes: "php.ini,httpd.conf,wampserver.conf,*.log,*_log" ;Source: "C:\Program Files\Wamp\bin\php\php5.5.12\*.*"; DestDir: "{app}\bin\php\php5.5.12"; Flags: ignoreversion recursesubdirs; Excludes: "php.ini,phpForApache.ini,wampserver.conf,*.log,*_log" @@ -125,9 +124,7 @@ Source: "scripts\*.*"; DestDir: "{app}\www\dolibarr\scripts"; Flags: ignoreversi Source: "*.*"; DestDir: "{app}\www\dolibarr"; Flags: ignoreversion; Excludes: ".gitignore,.project,CVS\*,Thumbs.db,default.properties,install.lock" ; Config files -Source: "build\exe\doliwamp\phpmyadmin.conf.install"; DestDir: "{app}\alias"; Flags: ignoreversion; Source: "build\exe\doliwamp\dolibarr.conf.install"; DestDir: "{app}\alias"; Flags: ignoreversion; -Source: "build\exe\doliwamp\config.inc.php.install"; DestDir: "{app}\apps\phpmyadmin4.1.14"; Flags: ignoreversion; ;Source: "build\exe\doliwamp\httpd.conf.install"; DestDir: "{app}\bin\apache\apache2.4.9\conf"; Flags: ignoreversion; Source: "build\exe\doliwamp\httpd.conf.install"; DestDir: "{app}\bin\apache\apache2.4.41\conf"; Flags: ignoreversion; Source: "build\exe\doliwamp\my.ini.install"; DestDir: "{app}\bin\mysql\mysql5.0.45"; Flags: ignoreversion; @@ -196,7 +193,6 @@ var destFileA: String; var srcContents: String; var browser: String; var mysqlVersion: String; -var phpmyadminVersion: String; var phpDllCopy: String; var batFile: String; @@ -246,7 +242,6 @@ begin phpVersion := '7.3.12' ; //mysqlVersion := '5.0.45'; mysqlVersion := '10.4.10'; - phpmyadminVersion := '4.1.14'; smtpServer := 'localhost'; apachePort := '80'; @@ -635,27 +630,6 @@ begin begin - //---------------------------------------------- - // Create file alias phpmyadmin (always) - //---------------------------------------------- - - destFile := pathWithSlashes+'/alias/phpmyadmin.conf'; - srcFile := pathWithSlashes+'/alias/phpmyadmin.conf.install'; - - if FileExists(srcFile) then - begin - LoadStringFromFile (srcFile, srcContents); - - //installDir et version de phpmyadmin - StringChangeEx (srcContents, 'WAMPROOT', pathWithSlashes, True); - StringChangeEx (srcContents, 'WAMPPHPMYADMINVERSION', phpmyadminVersion, True); - - SaveStringToFile(destFile,srcContents, False); - end; - DeleteFile(srcFile); - - - //---------------------------------------------- // Create file alias dolibarr (if not exists) //---------------------------------------------- @@ -691,35 +665,6 @@ begin - //---------------------------------------------- - // Create file configuration for phpmyadmin (if not exists) - //---------------------------------------------- - - destFile := pathWithSlashes+'/apps/phpmyadmin'+phpmyadminVersion+'/config.inc.php'; - srcFile := pathWithSlashes+'/apps/phpmyadmin'+phpmyadminVersion+'/config.inc.php.install'; - - if FileExists(srcFile) then - begin - if not FileExists (destFile) then - begin - LoadStringFromFile (srcFile, srcContents); - StringChangeEx (srcContents, 'WAMPMYSQLNEWPASSWORD', mypass, True); - StringChangeEx (srcContents, 'WAMPMYSQLPORT', myport, True); - SaveStringToFile(destFile,srcContents, False); - end - else - begin - // We must replace to use format 2.4 of apache - DeleteFile(destFile); - LoadStringFromFile (srcFile, srcContents); - StringChangeEx (srcContents, 'WAMPMYSQLNEWPASSWORD', mypass, True); - StringChangeEx (srcContents, 'WAMPMYSQLPORT', myport, True); - SaveStringToFile(destFile,srcContents, False); - end; - end; - - - //---------------------------------------------- // Create file httpd.conf (if not exists) //---------------------------------------------- From 179716ac004ed0840d29f8b6d13c89b7906da8b6 Mon Sep 17 00:00:00 2001 From: Christophe Battarel Date: Tue, 17 May 2022 09:17:36 +0200 Subject: [PATCH 547/738] add constant to hide stock on cart --- htdocs/takepos/invoice.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/takepos/invoice.php b/htdocs/takepos/invoice.php index eec8ab7d363..6aca4e01a5d 100644 --- a/htdocs/takepos/invoice.php +++ b/htdocs/takepos/invoice.php @@ -1560,7 +1560,7 @@ if ($placeid > 0) { $htmlforlines .= ''; if (!empty($conf->stock->enabled) && !empty($user->rights->stock->mouvement->lire)) { $constantforkey = 'CASHDESK_ID_WAREHOUSE'.$_SESSION["takeposterminal"]; - if (!empty($conf->global->$constantforkey) && $line->fk_product > 0) { + if (!empty($conf->global->$constantforkey) && $line->fk_product > 0 && empty($conf->global->TAKEPOS_HIDE_STOCK_ON_LINE)) { $sql = "SELECT e.rowid, e.ref, e.lieu, e.fk_parent, e.statut, ps.reel, ps.rowid as product_stock_id, p.pmp"; $sql .= " FROM ".MAIN_DB_PREFIX."entrepot as e,"; $sql .= " ".MAIN_DB_PREFIX."product_stock as ps"; From 61f7c4395b7bf598223c5dc1c6385d0cb6e5f1cc Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Tue, 17 May 2022 11:55:57 +0200 Subject: [PATCH 548/738] fix: module builder template bad error message affactation --- htdocs/modulebuilder/template/admin/setup.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/modulebuilder/template/admin/setup.php b/htdocs/modulebuilder/template/admin/setup.php index fe92596d228..e94a2678b4a 100644 --- a/htdocs/modulebuilder/template/admin/setup.php +++ b/htdocs/modulebuilder/template/admin/setup.php @@ -436,7 +436,7 @@ if ($action == 'edit') { if ($resprod > 0) { print $product->ref; } elseif ($resprod < 0) { - setEventMessages(null, $object->errors, "errors"); + setEventMessages(null, $product->errors, "errors"); } } else { print $conf->global->{$constname}; From ada81750c10ded375b2697a001043be6207da5d4 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Tue, 17 May 2022 12:53:50 +0200 Subject: [PATCH 549/738] NEW: Add Customer Ref on Intervention --- htdocs/fichinter/card.php | 20 ++++- htdocs/fichinter/class/fichinter.class.php | 76 ++++++++++++++++++- htdocs/fichinter/list.php | 29 ++++++- .../install/mysql/migration/15.0.0-16.0.0.sql | 2 + htdocs/install/mysql/tables/llx_fichinter.sql | 1 + 5 files changed, 123 insertions(+), 5 deletions(-) diff --git a/htdocs/fichinter/card.php b/htdocs/fichinter/card.php index 0d7e5278a14..a2271dbb063 100644 --- a/htdocs/fichinter/card.php +++ b/htdocs/fichinter/card.php @@ -55,6 +55,7 @@ $langs->loadLangs(array('bills', 'companies', 'interventions', 'stocks')); $id = GETPOST('id', 'int'); $ref = GETPOST('ref', 'alpha'); +$ref_client = GETPOST('ref_client', 'alpha'); $socid = (int) GETPOST('socid', 'int'); $contratid = (int) GETPOST('contratid', 'int'); $action = GETPOST('action', 'alpha'); @@ -222,6 +223,7 @@ if (empty($reshook)) { $object->author = $user->id; $object->description = GETPOST('description', 'restricthtml'); $object->ref = $ref; + $object->ref_client = $ref_client; $object->model_pdf = GETPOST('model', 'alpha'); $object->note_private = GETPOST('note_private', 'restricthtml'); $object->note_public = GETPOST('note_public', 'restricthtml'); @@ -432,6 +434,7 @@ if (empty($reshook)) { $object->author = $user->id; $object->description = GETPOST('description', 'restricthtml'); $object->ref = $ref; + $object->ref_client = $ref_client; $result = $object->update($user); if ($result < 0) { @@ -449,6 +452,12 @@ if (empty($reshook)) { if ($result < 0) { dol_print_error($db, $object->error); } + } elseif ($action == 'setref_client' && $user->rights->ficheinter->creer) { + // Positionne ref client + $result = $object->setRefClient($user, GETPOST('ref_client','alpha')); + if ($result < 0) { + setEventMessages($object->error, $object->errors, 'errors'); + } } elseif ($action == 'confirm_delete' && $confirm == 'yes' && $user->rights->ficheinter->supprimer) { $result = $object->delete($user); if ($result < 0) { @@ -879,6 +888,11 @@ if ($action == 'create') { // Ref print ''.$langs->trans('Ref').''.$langs->trans("Draft").''; + // Ref customer + print ''.$langs->trans('RefCustomer').''; + print ''; + print ''; + // Description (must be a textarea and not html must be allowed (used in list view) print ''.$langs->trans("Description").''; print ''; @@ -1134,10 +1148,10 @@ if ($action == 'create') { $morehtmlref = '
    '; // Ref customer - //$morehtmlref.=$form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, $user->rights->fichinter->creer, 'string', '', 0, 1); - //$morehtmlref.=$form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, $user->rights->fichinter->creer, 'string', '', null, null, '', 1); + $morehtmlref.=$form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, $user->rights->ficheinter->creer, 'string', '', 0, 1); + $morehtmlref.=$form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, $user->rights->ficheinter->creer, 'string', '', null, null, '', 1); // Thirdparty - $morehtmlref .= $langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1); + $morehtmlref .= '
    '.$langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1, 'customer'); // Project if (!empty($conf->projet->enabled)) { $langs->load("projects"); diff --git a/htdocs/fichinter/class/fichinter.class.php b/htdocs/fichinter/class/fichinter.class.php index b5e3a13f3c0..ec603defd62 100644 --- a/htdocs/fichinter/class/fichinter.class.php +++ b/htdocs/fichinter/class/fichinter.class.php @@ -44,6 +44,7 @@ class Fichinter extends CommonObject 'fk_contrat' =>array('type'=>'integer', 'label'=>'Fk contrat', 'enabled'=>1, 'visible'=>-1, 'position'=>25), 'ref' =>array('type'=>'varchar(30)', 'label'=>'Ref', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'showoncombobox'=>1, 'position'=>30), 'ref_ext' =>array('type'=>'varchar(255)', 'label'=>'Ref ext', 'enabled'=>1, 'visible'=>0, 'position'=>35), + 'ref_client' =>array('type'=>'varchar(255)', 'label'=>'RefCustomer', 'enabled'=>1, 'visible'=>-1, 'position'=>36), 'entity' =>array('type'=>'integer', 'label'=>'Entity', 'default'=>1, 'enabled'=>1, 'visible'=>-2, 'notnull'=>1, 'position'=>40, 'index'=>1), 'tms' =>array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>45), 'datec' =>array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>1, 'visible'=>-1, 'position'=>50), @@ -146,6 +147,12 @@ class Fichinter extends CommonObject */ public $fk_project = 0; + /** + * Customer Ref + * @var string + */ + public $ref_client; + /** * @var array extraparams */ @@ -253,6 +260,9 @@ class Fichinter extends CommonObject if (!is_numeric($this->duration)) { $this->duration = 0; } + if (isset($this->ref_client)) { + $this->ref_client = trim($this->ref_client); + } if ($this->socid <= 0) { $this->error = 'ErrorFicheinterCompanyDoesNotExist'; @@ -271,6 +281,7 @@ class Fichinter extends CommonObject $sql .= "fk_soc"; $sql .= ", datec"; $sql .= ", ref"; + $sql .= ", ref_client"; $sql .= ", entity"; $sql .= ", fk_user_author"; $sql .= ", fk_user_modif"; @@ -286,6 +297,7 @@ class Fichinter extends CommonObject $sql .= $this->socid; $sql .= ", '".$this->db->idate($now)."'"; $sql .= ", '".$this->db->escape($this->ref)."'"; + $sql .= ", '".($this->ref_client ? "'".$this->db->escape($this->ref_client)."'" : "null")."'"; $sql .= ", ".((int) $conf->entity); $sql .= ", ".((int) $user->id); $sql .= ", ".((int) $user->id); @@ -372,6 +384,9 @@ class Fichinter extends CommonObject if (!dol_strlen($this->fk_project)) { $this->fk_project = 0; } + if (isset($this->ref_client)) { + $this->ref_client = trim($this->ref_client); + } $error = 0; @@ -380,6 +395,7 @@ class Fichinter extends CommonObject $sql = "UPDATE ".MAIN_DB_PREFIX."fichinter SET "; $sql .= "description = '".$this->db->escape($this->description)."'"; $sql .= ", duree = ".((int) $this->duration); + $sql .= ", ref_client = ".($this->ref_client ? "'".$this->db->escape($this->ref_client)."'" : "null"); $sql .= ", fk_projet = ".((int) $this->fk_project); $sql .= ", note_private = ".($this->note_private ? "'".$this->db->escape($this->note_private)."'" : "null"); $sql .= ", note_public = ".($this->note_public ? "'".$this->db->escape($this->note_public)."'" : "null"); @@ -422,7 +438,7 @@ class Fichinter extends CommonObject */ public function fetch($rowid, $ref = '') { - $sql = "SELECT f.rowid, f.ref, f.description, f.fk_soc, f.fk_statut,"; + $sql = "SELECT f.rowid, f.ref, f.ref_client, f.description, f.fk_soc, f.fk_statut,"; $sql .= " f.datec, f.dateo, f.datee, f.datet, f.fk_user_author,"; $sql .= " f.date_valid as datev,"; $sql .= " f.tms as datem,"; @@ -443,6 +459,7 @@ class Fichinter extends CommonObject $this->id = $obj->rowid; $this->ref = $obj->ref; + $this->ref_client = $obj->ref_client; $this->description = $obj->description; $this->socid = $obj->fk_soc; $this->statut = $obj->fk_statut; @@ -1289,6 +1306,7 @@ class Fichinter extends CommonObject // Initialise parametres $this->id = 0; $this->ref = 'SPECIMEN'; + $this->ref_client = 'SPECIMEN CLIENT'; $this->specimen = 1; $this->socid = 1; $this->datec = $now; @@ -1377,6 +1395,62 @@ class Fichinter extends CommonObject return CommonObject::commonReplaceThirdparty($db, $origin_id, $dest_id, $tables); } + + /** + * Set customer reference number + * + * @param User $user Object user that modify + * @param string $ref_client Customer reference + * @param int $notrigger 1=Does not execute triggers, 0= execute triggers + * @return int <0 if ko, >0 if ok + */ + public function setRefClient($user, $ref_client, $notrigger = 0) + { + // phpcs:enable + if (!empty($user->rights->ficheinter->creer)) { + $error = 0; + + $this->db->begin(); + + $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element." SET ref_client = ".(empty($ref_client) ? 'NULL' : "'".$this->db->escape($ref_client)."'"); + $sql .= " WHERE rowid = ".((int) $this->id); + + dol_syslog(__METHOD__.' $this->id='.$this->id.', ref_client='.$ref_client, LOG_DEBUG); + $resql = $this->db->query($sql); + if (!$resql) { + $this->errors[] = $this->db->error(); + $error++; + } + + if (!$error) { + $this->oldcopy = clone $this; + $this->ref_client = $ref_client; + } + + if (!$notrigger && empty($error)) { + // Call trigger + $result = $this->call_trigger('FICHINTER_MODIFY', $user); + if ($result < 0) { + $error++; + } + // End call triggers + } + + if (!$error) { + $this->db->commit(); + return 1; + } else { + foreach ($this->errors as $errmsg) { + dol_syslog(__METHOD__.' Error: '.$errmsg, LOG_ERR); + $this->error .= ($this->error ? ', '.$errmsg : $errmsg); + } + $this->db->rollback(); + return -1 * $error; + } + } else { + return -1; + } + } } /** diff --git a/htdocs/fichinter/list.php b/htdocs/fichinter/list.php index f0e028ea92f..d83a1438f1a 100644 --- a/htdocs/fichinter/list.php +++ b/htdocs/fichinter/list.php @@ -58,6 +58,7 @@ $toselect = GETPOST('toselect', 'array'); $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'interventionlist'; $search_ref = GETPOST('search_ref') ?GETPOST('search_ref', 'alpha') : GETPOST('search_inter', 'alpha'); +$search_ref_client = GETPOST('search_ref_client', 'alpha'); $search_company = GETPOST('search_company', 'alpha'); $search_desc = GETPOST('search_desc', 'alpha'); $search_projet_ref = GETPOST('search_projet_ref', 'alpha'); @@ -122,6 +123,7 @@ if (!empty($conf->global->FICHINTER_DISABLE_DETAILS)) { // Definition of fields for list $arrayfields = array( 'f.ref'=>array('label'=>'Ref', 'checked'=>1), + 'f.ref_client'=>array('label'=>'RefCustomer', 'checked'=>1), 's.nom'=>array('label'=>'ThirdParty', 'checked'=>1), 'pr.ref'=>array('label'=>'Project', 'checked'=>1, 'enabled'=>(empty($conf->projet->enabled) ? 0 : 1)), 'c.ref'=>array('label'=>'Contract', 'checked'=>1, 'enabled'=>(empty($conf->contrat->enabled) ? 0 : 1)), @@ -166,6 +168,7 @@ if (empty($reshook)) { // Purge search criteria if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers $search_ref = ""; + $search_ref_client = ""; $search_company = ""; $search_projet_ref = ""; $search_contrat_ref = ""; @@ -218,7 +221,7 @@ foreach ($arrayfields as $tmpkey => $tmpval) { } $sql = "SELECT"; -$sql .= " f.ref, f.rowid, f.fk_statut as status, f.description, f.datec as date_creation, f.tms as date_update, f.note_public, f.note_private,"; +$sql .= " f.ref, f.ref_client, f.rowid, f.fk_statut as status, f.description, f.datec as date_creation, f.tms as date_update, f.note_public, f.note_private,"; if (empty($conf->global->FICHINTER_DISABLE_DETAILS) && $atleastonefieldinlines) { $sql .= " fd.rowid as lineid, fd.description as descriptiondetail, fd.date as dp, fd.duree,"; } @@ -267,6 +270,9 @@ $sql .= " AND f.fk_soc = s.rowid"; if ($search_ref) { $sql .= natural_search('f.ref', $search_ref); } +if ($search_ref_client) { + $sql .= natural_search('f.ref_client', $search_ref_client); +} if ($search_company) { $sql .= natural_search('s.nom', $search_company); } @@ -351,6 +357,9 @@ if ($resql) { if ($search_ref) { $param .= "&search_ref=".urlencode($search_ref); } + if ($search_ref_client) { + $param .= "&search_ref_client=".urlencode($search_ref_client); + } if ($search_company) { $param .= "&search_company=".urlencode($search_company); } @@ -447,6 +456,11 @@ if ($resql) { print ''; print ''; } + if (!empty($arrayfields['f.ref_client']['checked'])) { + print ''; + print ''; + print ''; + } if (!empty($arrayfields['s.nom']['checked'])) { print ''; print ''; @@ -526,6 +540,9 @@ if ($resql) { if (!empty($arrayfields['f.ref']['checked'])) { print_liste_field_titre($arrayfields['f.ref']['label'], $_SERVER["PHP_SELF"], "f.ref", "", $param, '', $sortfield, $sortorder); } + if (!empty($arrayfields['f.ref_client']['checked'])) { + print_liste_field_titre($arrayfields['f.ref_client']['label'], $_SERVER["PHP_SELF"], "f.ref_client", "", $param, '', $sortfield, $sortorder); + } if (!empty($arrayfields['s.nom']['checked'])) { print_liste_field_titre($arrayfields['s.nom']['label'], $_SERVER["PHP_SELF"], "s.nom", "", $param, '', $sortfield, $sortorder); } @@ -582,6 +599,7 @@ if ($resql) { $objectstatic->id = $obj->rowid; $objectstatic->ref = $obj->ref; + $objectstatic->ref_client = $obj->ref_client; $objectstatic->statut = $obj->status; $objectstatic->status = $obj->status; @@ -630,6 +648,15 @@ if ($resql) { $totalarray['nbfield']++; } } + if (!empty($arrayfields['f.ref_client']['checked'])) { + // Customer ref + print ''; + print $obj->ref_client; + print ''; + if (!$i) { + $totalarray['nbfield']++; + } + } if (!empty($arrayfields['s.nom']['checked'])) { print ''; print $companystatic->getNomUrl(1, '', 44); diff --git a/htdocs/install/mysql/migration/15.0.0-16.0.0.sql b/htdocs/install/mysql/migration/15.0.0-16.0.0.sql index 501aa0fe751..8b00bee9b3c 100644 --- a/htdocs/install/mysql/migration/15.0.0-16.0.0.sql +++ b/htdocs/install/mysql/migration/15.0.0-16.0.0.sql @@ -361,4 +361,6 @@ ALTER TABLE llx_c_email_template ADD COLUMN email_to varchar(255); ALTER TABLE llx_c_email_template ADD COLUMN email_tocc varchar(255); ALTER TABLE llx_c_email_template ADD COLUMN email_tobcc varchar(255); +ALTER TABLE llx_fichinter ADD COLUMN ref_client varchar(255) after ref_ext; + diff --git a/htdocs/install/mysql/tables/llx_fichinter.sql b/htdocs/install/mysql/tables/llx_fichinter.sql index 7c1ef4cf184..999dd55b7f3 100644 --- a/htdocs/install/mysql/tables/llx_fichinter.sql +++ b/htdocs/install/mysql/tables/llx_fichinter.sql @@ -25,6 +25,7 @@ create table llx_fichinter fk_contrat integer DEFAULT 0, -- contrat auquel est rattache la fiche ref varchar(30) NOT NULL, -- number ref_ext varchar(255), + ref_client varchar(255), -- customer intervention number entity integer DEFAULT 1 NOT NULL, -- multi company id tms timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, datec datetime, -- date de creation From 8950ae160b563529126169b317f9039db045d4ea Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Tue, 17 May 2022 11:00:13 +0000 Subject: [PATCH 550/738] Fixing style errors. --- htdocs/fichinter/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/fichinter/card.php b/htdocs/fichinter/card.php index a2271dbb063..eeb5261ef19 100644 --- a/htdocs/fichinter/card.php +++ b/htdocs/fichinter/card.php @@ -454,7 +454,7 @@ if (empty($reshook)) { } } elseif ($action == 'setref_client' && $user->rights->ficheinter->creer) { // Positionne ref client - $result = $object->setRefClient($user, GETPOST('ref_client','alpha')); + $result = $object->setRefClient($user, GETPOST('ref_client', 'alpha')); if ($result < 0) { setEventMessages($object->error, $object->errors, 'errors'); } From 480b48e5e1d34a65bd5187798cc8f2e7377ba789 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 17 May 2022 14:36:56 +0200 Subject: [PATCH 551/738] Fix var_dump --- htdocs/core/lib/security.lib.php | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/core/lib/security.lib.php b/htdocs/core/lib/security.lib.php index f5910e3b921..28e3a4a22f8 100644 --- a/htdocs/core/lib/security.lib.php +++ b/htdocs/core/lib/security.lib.php @@ -378,7 +378,6 @@ function restrictedArea($user, $features, $objectid = 0, $tableandshare = '', $f $nbko++; } } elseif (!empty($feature) && ($feature != 'user' && $feature != 'usergroup')) { // This is permissions on 1 level - var_dump($user->rights); if (empty($user->rights->$feature->lire) && empty($user->rights->$feature->read) && empty($user->rights->$feature->run)) { From 4de50da0dd11ab9ddb225f932ddc5414a65422e5 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 17 May 2022 14:55:38 +0200 Subject: [PATCH 552/738] Repare code to forbidden var_dump() into code --- dev/tools/test/namespacemig/main.inc.php | 2 +- htdocs/accountancy/journal/bankjournal.php | 22 +++++----- htdocs/admin/holiday.php | 22 +++++----- htdocs/admin/system/filecheck.php | 8 ++-- htdocs/admin/system/xcache.php | 17 -------- htdocs/admin/translation.php | 6 +-- htdocs/api/class/api_documents.class.php | 7 ++-- htdocs/blockedlog/ajax/block-info.php | 10 ++--- htdocs/comm/action/index.php | 3 +- htdocs/comm/action/pertype.php | 4 +- htdocs/comm/action/peruser.php | 4 +- .../class/bonprelevement.class.php | 4 +- htdocs/core/class/commoninvoice.class.php | 10 ++--- htdocs/core/class/html.form.class.php | 6 +-- htdocs/core/customreports.php | 4 +- htdocs/core/lib/files.lib.php | 6 +-- htdocs/core/lib/phpsessionindb.lib.php | 9 ++--- htdocs/core/lib/sendings.lib.php | 2 +- htdocs/core/lib/usergroups.lib.php | 10 ++--- htdocs/core/menus/standard/auguria_menu.php | 4 +- htdocs/core/menus/standard/eldy_menu.php | 8 +++- htdocs/core/menus/standard/empty.php | 8 +++- .../core/modules/bank/doc/pdf_ban.modules.php | 2 +- .../bank/doc/pdf_sepamandate.modules.php | 10 ++--- .../modules/import/import_csv.modules.php | 2 +- .../modules/import/import_xlsx.modules.php | 2 +- .../project/doc/pdf_baleine.modules.php | 2 +- .../project/doc/pdf_timespent.modules.php | 2 +- .../class/emailcollector.class.php | 40 ++++++++++--------- .../class/emailcollectoraction.class.php | 3 +- .../class/emailcollectorfilter.class.php | 3 +- .../class/conferenceorboothattendee.class.php | 3 +- htdocs/expedition/card.php | 6 ++- .../tpl/expensereport_linktofile.tpl.php | 4 +- .../class/fournisseur.commande.class.php | 12 +++--- htdocs/fourn/facture/card.php | 8 ++-- htdocs/holiday/class/holiday.class.php | 8 ++-- .../class/knowledgerecord.class.php | 3 +- htdocs/modulebuilder/index.php | 33 ++++++++++----- .../template/class/myobject.class.php | 3 +- htdocs/mrp/class/mo.class.php | 3 +- .../partnership/class/partnership.class.php | 3 +- .../class/productfournisseurprice.class.php | 3 +- htdocs/product/stock/massstockmove.php | 6 ++- htdocs/projet/activity/perday.php | 6 +-- htdocs/projet/activity/permonth.php | 3 +- htdocs/projet/activity/perweek.php | 3 +- .../class/recruitmentcandidature.class.php | 3 +- .../class/recruitmentjobposition.class.php | 3 +- ...tandard_recruitmentjobposition.modules.php | 3 +- htdocs/salaries/card.php | 4 +- htdocs/societe/paymentmodes.php | 4 +- htdocs/stripe/class/stripe.class.php | 25 ++++++------ htdocs/supplier_proposal/card.php | 4 +- htdocs/ticket/class/cticketcategory.class.php | 3 +- htdocs/ticket/class/ticket.class.php | 3 +- htdocs/ticket/list.php | 4 +- htdocs/website/index.php | 3 +- .../workstation/class/workstation.class.php | 3 +- 59 files changed, 225 insertions(+), 186 deletions(-) diff --git a/dev/tools/test/namespacemig/main.inc.php b/dev/tools/test/namespacemig/main.inc.php index 555a4b36ff5..d46d8e38c1c 100644 --- a/dev/tools/test/namespacemig/main.inc.php +++ b/dev/tools/test/namespacemig/main.inc.php @@ -1,7 +1,7 @@ begin(); // Introduce a protection. Total of tabtp must be total of tabbq - /*var_dump($tabpay); - var_dump($tabtp); - var_dump($tabbq);exit;*/ + //var_dump($tabpay); + //var_dump($tabtp); + //var_dump($tabbq);exit; // Bank if (!$errorforline && is_array($tabbq[$key])) { @@ -1267,9 +1267,9 @@ if (empty($action) || $action == 'view') { $accounttoshowsubledger = length_accounta($k); if ($accounttoshow != $accounttoshowsubledger) { if (empty($accounttoshowsubledger) || $accounttoshowsubledger == 'NotDefined') { - /*var_dump($tabpay[$key]); - var_dump($tabtype[$key]); - var_dump($tabbq[$key]);*/ + //var_dump($tabpay[$key]); + //var_dump($tabtype[$key]); + //var_dump($tabbq[$key]); //print ''.$langs->trans("ThirdpartyAccountNotDefined").''; if (!empty($tabcompany[$key]['code_compta'])) { if (in_array($tabtype[$key], array('payment_various', 'payment_salary'))) { diff --git a/htdocs/admin/holiday.php b/htdocs/admin/holiday.php index c1755b17edf..7b0aa577a87 100644 --- a/htdocs/admin/holiday.php +++ b/htdocs/admin/holiday.php @@ -442,23 +442,23 @@ print ''.$langs->trans("Parameter").''; print ''.$langs->trans("Value").''; print "\n"; -/*var_dump($conf->global->MAIN_NON_WORKING_DAYS_INCLUDE_MONDAY); -var_dump($conf->global->MAIN_NON_WORKING_DAYS_INCLUDE_FRIDAY); -var_dump($conf->global->MAIN_NON_WORKING_DAYS_INCLUDE_SATURDAY); -var_dump($conf->global->MAIN_NON_WORKING_DAYS_INCLUDE_SUNDAY); -*/ +//var_dump($conf->global->MAIN_NON_WORKING_DAYS_INCLUDE_MONDAY); +//var_dump($conf->global->MAIN_NON_WORKING_DAYS_INCLUDE_FRIDAY); +//var_dump($conf->global->MAIN_NON_WORKING_DAYS_INCLUDE_SATURDAY); +//var_dump($conf->global->MAIN_NON_WORKING_DAYS_INCLUDE_SUNDAY); + if (!isset($conf->global->MAIN_NON_WORKING_DAYS_INCLUDE_SATURDAY)) { $conf->global->MAIN_NON_WORKING_DAYS_INCLUDE_SATURDAY = 1; } if (!isset($conf->global->MAIN_NON_WORKING_DAYS_INCLUDE_SUNDAY)) { $conf->global->MAIN_NON_WORKING_DAYS_INCLUDE_SUNDAY = 1; } -/* -var_dump($conf->global->MAIN_NON_WORKING_DAYS_INCLUDE_MONDAY); -var_dump($conf->global->MAIN_NON_WORKING_DAYS_INCLUDE_FRIDAY); -var_dump($conf->global->MAIN_NON_WORKING_DAYS_INCLUDE_SATURDAY); -var_dump($conf->global->MAIN_NON_WORKING_DAYS_INCLUDE_SUNDAY); -*/ + +//var_dump($conf->global->MAIN_NON_WORKING_DAYS_INCLUDE_MONDAY); +//var_dump($conf->global->MAIN_NON_WORKING_DAYS_INCLUDE_FRIDAY); +//var_dump($conf->global->MAIN_NON_WORKING_DAYS_INCLUDE_SATURDAY); +//var_dump($conf->global->MAIN_NON_WORKING_DAYS_INCLUDE_SUNDAY); + // Set working days print ''; diff --git a/htdocs/admin/system/filecheck.php b/htdocs/admin/system/filecheck.php index 10edae1a24b..58c27cbb1e4 100644 --- a/htdocs/admin/system/filecheck.php +++ b/htdocs/admin/system/filecheck.php @@ -407,10 +407,10 @@ if (empty($error) && !empty($xml)) { $checksumget = md5(join(',', $checksumconcat)); $checksumtoget = trim((string) $xml->dolibarr_htdocs_dir_checksum); - /*var_dump(count($file_list['added'])); - var_dump($checksumget); - var_dump($checksumtoget); - var_dump($checksumget == $checksumtoget);*/ + //var_dump(count($file_list['added'])); + //var_dump($checksumget); + //var_dump($checksumtoget); + //var_dump($checksumget == $checksumtoget); $resultcomment = ''; diff --git a/htdocs/admin/system/xcache.php b/htdocs/admin/system/xcache.php index 8bdca5be40e..4e2f881a14c 100644 --- a/htdocs/admin/system/xcache.php +++ b/htdocs/admin/system/xcache.php @@ -58,23 +58,6 @@ print $langs->trans("xcache.optimizer").': '.yn(ini_get('xcache.optimizer')).' ( print $langs->trans("xcache.stat").': '.yn(ini_get('xcache.stat')).'
    '."\n"; print $langs->trans("xcache.coverager").': '.yn(ini_get('xcache.coverager')).'
    '."\n"; -//print xcache_get(); -/* -$cacheinfos = array(); -for ($i = 0; $i < 10; $i ++) -{ - $data = xcache_info(XC_TYPE_PHP, $i); - $data['cacheid'] = $i; - $cacheinfos[] = $data; -} - -var_dump($cacheinfos); - -if ($action == 'clear') -{ - xcache_clear_cache(); -} -*/ // End of page llxFooter(); diff --git a/htdocs/admin/translation.php b/htdocs/admin/translation.php index 18ce707c839..4968e75989a 100644 --- a/htdocs/admin/translation.php +++ b/htdocs/admin/translation.php @@ -444,9 +444,9 @@ if ($mode == 'overwrite') { if ($mode == 'searchkey') { $nbempty = 0; - /*var_dump($langcode); - var_dump($transkey); - var_dump($transvalue);*/ + //var_dump($langcode); + //var_dump($transkey); + //var_dump($transvalue); if (empty($langcode) || $langcode == '-1') { $nbempty++; } diff --git a/htdocs/api/class/api_documents.class.php b/htdocs/api/class/api_documents.class.php index 81ba8e3b09d..d4d652f3e74 100644 --- a/htdocs/api/class/api_documents.class.php +++ b/htdocs/api/class/api_documents.class.php @@ -568,10 +568,9 @@ class Documents extends DolibarrApi { global $db, $conf; - /*var_dump($modulepart); - var_dump($filename); - var_dump($filecontent); - exit;*/ + //var_dump($modulepart); + //var_dump($filename); + //var_dump($filecontent);exit; if (empty($modulepart)) { throw new RestException(400, 'Modulepart not provided.'); diff --git a/htdocs/blockedlog/ajax/block-info.php b/htdocs/blockedlog/ajax/block-info.php index eb851af169a..e6f9ea0de15 100644 --- a/htdocs/blockedlog/ajax/block-info.php +++ b/htdocs/blockedlog/ajax/block-info.php @@ -92,11 +92,11 @@ function formatObject($objtoshow, $prefix) $s .= ''.($prefix ? $prefix.' > ' : '').$key.''; $s .= ''; if (in_array($key, array('date', 'datef', 'dateh', 'datec', 'datem', 'datep'))) { - /*var_dump(is_object($val)); - var_dump(is_array($val)); - var_dump(is_array($val)); - var_dump(@get_class($val)); - var_dump($val);*/ + //var_dump(is_object($val)); + //var_dump(is_array($val)); + //var_dump(is_array($val)); + //var_dump(@get_class($val)); + //var_dump($val); $s .= dol_print_date($val, 'dayhour'); } else { $s .= $val; diff --git a/htdocs/comm/action/index.php b/htdocs/comm/action/index.php index 4f8b8509f4e..920fe69025d 100644 --- a/htdocs/comm/action/index.php +++ b/htdocs/comm/action/index.php @@ -1191,7 +1191,8 @@ if (count($listofextcals)) { foreach ($icalevents as $icalevent) { //var_dump($icalevent); - //print $icalevent['SUMMARY'].'->'.var_dump($icalevent).'
    ';exit; + //print $icalevent['SUMMARY'].'->'; + //var_dump($icalevent);exit; if (!empty($icalevent['RRULE'])) { continue; // We found a repeatable event. It was already split into unitary events, so we discard general rule. } diff --git a/htdocs/comm/action/pertype.php b/htdocs/comm/action/pertype.php index 9869bd2d305..64b635d169d 100644 --- a/htdocs/comm/action/pertype.php +++ b/htdocs/comm/action/pertype.php @@ -961,7 +961,9 @@ function show_day_events_pertype($username, $day, $month, $year, $monthshown, $s $ymd = sprintf("%04d", $year).sprintf("%02d", $month).sprintf("%02d", $day); $nextindextouse = count($colorindexused); // At first run, this is 0, so fist user has 0, next 1, ... - //if ($username->id && $day==1) var_dump($eventarray); + //if ($username->id && $day==1) { + //var_dump($eventarray); + //} // We are in a particular day for $username, now we scan all events foreach ($eventarray as $daykey => $notused) { diff --git a/htdocs/comm/action/peruser.php b/htdocs/comm/action/peruser.php index 68c9088815d..07bcd90e972 100644 --- a/htdocs/comm/action/peruser.php +++ b/htdocs/comm/action/peruser.php @@ -1130,7 +1130,9 @@ function show_day_events2($username, $day, $month, $year, $monthshown, $style, & $colorindexused[$user->id] = 0; // Color index for current user (user->id) is always 0 $nextindextouse = count($colorindexused); // At first run this is 0, so first user has 0, next 1, ... - //if ($username->id && $day==1) var_dump($eventarray); + //if ($username->id && $day==1) { + //var_dump($eventarray); + //} // We are in a particular day for $username, now we scan all events foreach ($eventarray as $daykey => $notused) { diff --git a/htdocs/compta/prelevement/class/bonprelevement.class.php b/htdocs/compta/prelevement/class/bonprelevement.class.php index 4f9eb4e456e..df142fb6531 100644 --- a/htdocs/compta/prelevement/class/bonprelevement.class.php +++ b/htdocs/compta/prelevement/class/bonprelevement.class.php @@ -1066,8 +1066,8 @@ class BonPrelevement extends CommonObject // This also set the property $this->total with amount that is included into file $result = $this->generate($format, $executiondate, $type); if ($result < 0) { - /*var_dump($this->error); - var_dump($this->invoice_in_error); */ + //var_dump($this->error); + //var_dump($this->invoice_in_error); $error++; } } diff --git a/htdocs/core/class/commoninvoice.class.php b/htdocs/core/class/commoninvoice.class.php index e49f8a6a728..dc35cfbc7aa 100644 --- a/htdocs/core/class/commoninvoice.class.php +++ b/htdocs/core/class/commoninvoice.class.php @@ -862,11 +862,11 @@ abstract class CommonInvoice extends CommonObject $pricewithtax = implode(unpack("H*", price2num($pricewithtaxstring, 2))); $pricetax = implode(unpack("H*", $pricetaxstring)); - var_dump(strlen($this->thirdparty->name)); - var_dump(str_pad(dechex('9'), 2, '0', STR_PAD_LEFT)); - var_dump($this->thirdparty->name); - var_dump(implode(unpack("H*", $this->thirdparty->name))); - var_dump(price($this->total_tva, 0, $tmplang, 0, -1, 2)); + //var_dump(strlen($this->thirdparty->name)); + //var_dump(str_pad(dechex('9'), 2, '0', STR_PAD_LEFT)); + //var_dump($this->thirdparty->name); + //var_dump(implode(unpack("H*", $this->thirdparty->name))); + //var_dump(price($this->total_tva, 0, $tmplang, 0, -1, 2)); $s = '01'.str_pad(dechex(strlen($this->thirdparty->name)), 2, '0', STR_PAD_LEFT).$name; $s .= '02'.str_pad(dechex(strlen($this->thirdparty->tva_intra)), 2, '0', STR_PAD_LEFT).$vatnumber; diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index c96db183a3f..08ebac1c5e7 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -8321,9 +8321,9 @@ class Form $listcheckedstring = ''; foreach ($array as $key => $val) { - /* var_dump($val); - var_dump(array_key_exists('enabled', $val)); - var_dump(!$val['enabled']);*/ + // var_dump($val); + // var_dump(array_key_exists('enabled', $val)); + // var_dump(!$val['enabled']); if (array_key_exists('enabled', $val) && isset($val['enabled']) && !$val['enabled']) { unset($array[$key]); // We don't want this field continue; diff --git a/htdocs/core/customreports.php b/htdocs/core/customreports.php index 2d00677b20a..ace78c5199a 100644 --- a/htdocs/core/customreports.php +++ b/htdocs/core/customreports.php @@ -880,8 +880,8 @@ if ($mode == 'graph') { $px1 = new DolGraph(); $mesg = $px1->isGraphKo(); if (!$mesg) { - /*var_dump($legend); - var_dump($data);*/ + //var_dump($legend); + //var_dump($data); $px1->SetData($data); unset($data); diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index 2cf0beb013f..6b0852e4784 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -330,9 +330,9 @@ function completeFileArrayWithDatabaseInfo(&$filearray, $relativedir) } } - /*var_dump($relativedir); - var_dump($filearray); - var_dump($filearrayindatabase);*/ + //var_dump($relativedir); + //var_dump($filearray); + //var_dump($filearrayindatabase); // Complete filearray with properties found into $filearrayindatabase foreach ($filearray as $key => $val) { diff --git a/htdocs/core/lib/phpsessionindb.lib.php b/htdocs/core/lib/phpsessionindb.lib.php index 8001b3ece60..0af40522bfc 100644 --- a/htdocs/core/lib/phpsessionindb.lib.php +++ b/htdocs/core/lib/phpsessionindb.lib.php @@ -104,10 +104,9 @@ function dolSessionWrite($sess_id, $val) global $sessionlastvalueread; global $sessionidfound; - /*var_dump('write '.$sess_id); - var_dump($val); - var_dump('sessionlastvalueread='.$sessionlastvalueread.' sessionidfound='.$sessionidfound); - */ + //var_dump('write '.$sess_id); + //var_dump($val); + //var_dump('sessionlastvalueread='.$sessionlastvalueread.' sessionidfound='.$sessionidfound); //$sessionlastvalueread=''; if ($sessionlastvalueread != $val) { @@ -141,7 +140,7 @@ function dolSessionWrite($sess_id, $val) $insert_query = "INSERT INTO ".MAIN_DB_PREFIX."session"; $insert_query .= "(session_id, session_variable, last_accessed, fk_user, remote_ip, user_agent)"; $insert_query .= " VALUES ('".$dbsession->escape($sess_id)."', '".$dbsession->escape($val)."', '".$dbsession->idate($time_stamp)."', 0, '".$dbsession->escape(getUserRemoteIP())."', '".$dbsession->escape(substr($_SERVER['HTTP_USER_AGENT'], 0, 255)."')"; - var_dump($insert_query); + //var_dump($insert_query); $result = $dbsession->query($insert_query); if (!$result) { dol_print_error($dbsession); diff --git a/htdocs/core/lib/sendings.lib.php b/htdocs/core/lib/sendings.lib.php index e2ab74b8cfc..4988be3cefd 100644 --- a/htdocs/core/lib/sendings.lib.php +++ b/htdocs/core/lib/sendings.lib.php @@ -398,7 +398,7 @@ function show_list_sending_receive($origin, $origin_id, $filter = '') /*TODO Add link to expeditiondet_batch if (! empty($conf->productbatch->enabled)) { - var_dump($objp->edrowid); + //var_dump($objp->edrowid); $lines[$i]->detail_batch if (isset($lines[$i]->detail_batch)) { diff --git a/htdocs/core/lib/usergroups.lib.php b/htdocs/core/lib/usergroups.lib.php index e14302da340..0589ca6c1c5 100644 --- a/htdocs/core/lib/usergroups.lib.php +++ b/htdocs/core/lib/usergroups.lib.php @@ -1048,17 +1048,15 @@ function showSkins($fuser, $edit = 0, $foruserprofile = false) print ''; print ''; } else { - /*var_dump($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER); + //var_dump($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER); + /* $default=$langs->trans('No'); print ''; print ''.$langs->trans("MAIN_OPTIMIZEFORTEXTBROWSER").''; print ''; - if ($edit) - { + if ($edit) { print $form->selectyesno('MAIN_OPTIMIZEFORTEXTBROWSER', $conf->global->MAIN_OPTIMIZEFORTEXTBROWSER, 1); - } - else - { + } else { print yn($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER); } print '   wspan class="opacitymedium">'.$langs->trans("Default").': '.$default.' '; diff --git a/htdocs/core/menus/standard/auguria_menu.php b/htdocs/core/menus/standard/auguria_menu.php index ebb5edc1c3b..45fd15dc325 100644 --- a/htdocs/core/menus/standard/auguria_menu.php +++ b/htdocs/core/menus/standard/auguria_menu.php @@ -115,7 +115,9 @@ class MenuManager $this->tabMenu = $tabMenu; //var_dump($tabMenu); - //if ($forcemainmenu == 'all') { var_dump($this->tabMenu); exit; } + //if ($forcemainmenu == 'all') { + //var_dump($this->tabMenu); + //} } diff --git a/htdocs/core/menus/standard/eldy_menu.php b/htdocs/core/menus/standard/eldy_menu.php index 5b426199a6e..0493a503fa5 100644 --- a/htdocs/core/menus/standard/eldy_menu.php +++ b/htdocs/core/menus/standard/eldy_menu.php @@ -198,8 +198,12 @@ class MenuManager $submenu = new Menu(); print_left_eldy_menu($this->db, $this->menu_array, $this->menu_array_after, $this->tabMenu, $submenu, 1, $tmpmainmenu, $tmpleftmenu, null, $this->type_user); // Fill $submenu (example with tmpmainmenu='home' tmpleftmenu='all', return left menu tree of Home) // Note: $submenu contains menu entry with substitution not yet done - //if ($tmpmainmenu.'-'.$tmpleftmenu == 'home-all') { var_dump($submenu); exit; } - //if ($tmpmainmenu=='accountancy') { var_dump($submenu->liste); exit; } + //if ($tmpmainmenu.'-'.$tmpleftmenu == 'home-all') { + //var_dump($submenu); exit; + //} + //if ($tmpmainmenu=='accountancy') { + //var_dump($submenu->liste); exit; + //} $nexturl = dol_buildpath($submenu->liste[0]['url'], 1); $canonrelurl = preg_replace('/\?.*$/', '', $relurl); diff --git a/htdocs/core/menus/standard/empty.php b/htdocs/core/menus/standard/empty.php index cc9db4cb769..62ea755c548 100644 --- a/htdocs/core/menus/standard/empty.php +++ b/htdocs/core/menus/standard/empty.php @@ -208,8 +208,12 @@ class MenuManager $submenu->add("/admin/dict.php?mainmenu=home", $langs->trans("DictionarySetup"), 1); $submenu->add("/admin/const.php?mainmenu=home", $langs->trans("OtherSetup"), 1); - //if ($tmpmainmenu.'-'.$tmpleftmenu == 'home-all') { var_dump($submenu); exit; } - //if ($tmpmainmenu=='accountancy') { var_dump($submenu->liste); exit; } + //if ($tmpmainmenu.'-'.$tmpleftmenu == 'home-all') { + //var_dump($submenu); exit; + //} + //if ($tmpmainmenu=='accountancy') { + //var_dump($submenu->liste); exit; + //} $nexturl = dol_buildpath($submenu->liste[0]['url'], 1); $canonrelurl = preg_replace('/\?.*$/', '', $relurl); diff --git a/htdocs/core/modules/bank/doc/pdf_ban.modules.php b/htdocs/core/modules/bank/doc/pdf_ban.modules.php index 2a76b04fa41..bfa313bad0b 100644 --- a/htdocs/core/modules/bank/doc/pdf_ban.modules.php +++ b/htdocs/core/modules/bank/doc/pdf_ban.modules.php @@ -356,7 +356,7 @@ class pdf_ban extends ModeleBankAccountDoc foreach($object->linkedObjects as $objecttype => $objects) { - var_dump($objects);exit; + //var_dump($objects);exit; if ($objecttype == 'commande') { $outputlangs->load('orders'); diff --git a/htdocs/core/modules/bank/doc/pdf_sepamandate.modules.php b/htdocs/core/modules/bank/doc/pdf_sepamandate.modules.php index b73a173e015..2194358afab 100644 --- a/htdocs/core/modules/bank/doc/pdf_sepamandate.modules.php +++ b/htdocs/core/modules/bank/doc/pdf_sepamandate.modules.php @@ -397,11 +397,11 @@ class pdf_sepamandate extends ModeleBankAccountDoc $bottomlasttab = $this->page_hauteur - $heightforinfotot - $heightforfreetext - $heightforfooter + 1; } - /*var_dump($tab_top); - var_dump($heightforinfotot); - var_dump($heightforfreetext); - var_dump($heightforfooter); - var_dump($bottomlasttab);*/ + //var_dump($tab_top); + //var_dump($heightforinfotot); + //var_dump($heightforfreetext); + //var_dump($heightforfooter); + //var_dump($bottomlasttab); // Affiche zone infos $posy = $this->_tableau_info($pdf, $object, $bottomlasttab, $outputlangs); diff --git a/htdocs/core/modules/import/import_csv.modules.php b/htdocs/core/modules/import/import_csv.modules.php index e45630df298..b57fa1bf655 100644 --- a/htdocs/core/modules/import/import_csv.modules.php +++ b/htdocs/core/modules/import/import_csv.modules.php @@ -439,7 +439,7 @@ class ImportCsv extends ModeleImports /*include_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountancysystem.class.php'; $tmpchartofaccount = new AccountancySystem($this->db); $tmpchartofaccount->fetch($conf->global->CHARTOFACCOUNTS); - var_dump($tmpchartofaccount->ref.' - '.$arrayrecord[0]['val']); + //var_dump($tmpchartofaccount->ref.' - '.$arrayrecord[0]['val']); if ((! ($conf->global->CHARTOFACCOUNTS > 0)) || $tmpchartofaccount->ref != $arrayrecord[0]['val']) { $this->errors[$error]['lib']=$langs->trans('ErrorImportOfChartLimitedToCurrentChart', $tmpchartofaccount->ref); diff --git a/htdocs/core/modules/import/import_xlsx.modules.php b/htdocs/core/modules/import/import_xlsx.modules.php index 9fa5cbf2c44..d9fe3048e2f 100644 --- a/htdocs/core/modules/import/import_xlsx.modules.php +++ b/htdocs/core/modules/import/import_xlsx.modules.php @@ -481,7 +481,7 @@ class ImportXlsx extends ModeleImports /*include_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountancysystem.class.php'; $tmpchartofaccount = new AccountancySystem($this->db); $tmpchartofaccount->fetch($conf->global->CHARTOFACCOUNTS); - var_dump($tmpchartofaccount->ref.' - '.$arrayrecord[0]['val']); + //var_dump($tmpchartofaccount->ref.' - '.$arrayrecord[0]['val']); if ((! ($conf->global->CHARTOFACCOUNTS > 0)) || $tmpchartofaccount->ref != $arrayrecord[0]['val']) { $this->errors[$error]['lib']=$langs->trans('ErrorImportOfChartLimitedToCurrentChart', $tmpchartofaccount->ref); diff --git a/htdocs/core/modules/project/doc/pdf_baleine.modules.php b/htdocs/core/modules/project/doc/pdf_baleine.modules.php index 776f2f9d1e6..2df5e28ab9e 100644 --- a/htdocs/core/modules/project/doc/pdf_baleine.modules.php +++ b/htdocs/core/modules/project/doc/pdf_baleine.modules.php @@ -662,7 +662,7 @@ class pdf_baleine extends ModelePDFProjects foreach($object->linkedObjects as $objecttype => $objects) { - var_dump($objects);exit; + //var_dump($objects);exit; if ($objecttype == 'commande') { $outputlangs->load('orders'); diff --git a/htdocs/core/modules/project/doc/pdf_timespent.modules.php b/htdocs/core/modules/project/doc/pdf_timespent.modules.php index 991ff794d72..2c954e19b7e 100644 --- a/htdocs/core/modules/project/doc/pdf_timespent.modules.php +++ b/htdocs/core/modules/project/doc/pdf_timespent.modules.php @@ -658,7 +658,7 @@ class pdf_timespent extends ModelePDFProjects foreach($object->linkedObjects as $objecttype => $objects) { - var_dump($objects);exit; + //var_dump($objects);exit; if ($objecttype == 'commande') { $outputlangs->load('orders'); diff --git a/htdocs/emailcollector/class/emailcollector.class.php b/htdocs/emailcollector/class/emailcollector.class.php index 39686c6e82f..ef1557f4f00 100644 --- a/htdocs/emailcollector/class/emailcollector.class.php +++ b/htdocs/emailcollector/class/emailcollector.class.php @@ -1228,7 +1228,8 @@ class EmailCollector extends CommonObject $header = imap_fetchheader($connection, $imapemail, 0); $overview = imap_fetch_overview($connection, $imapemail, 0); - /* print $header; var_dump($overview); */ + // print $header; + // var_dump($overview); // Process $header of email $header = preg_replace('/\r\n\s+/m', ' ', $header); // When a header line is on several lines, merge lines @@ -1336,19 +1337,20 @@ class EmailCollector extends CommonObject $this->getmsg($connection, $imapemail); - //print $plainmsg; var_dump($plainmsg); exit; + //print $plainmsg; + //var_dump($plainmsg); exit; //$htmlmsg,$plainmsg,$charset,$attachments $messagetext = $plainmsg ? $plainmsg : dol_string_nohtmltag($htmlmsg, 0); // Removed emojis $messagetext = preg_replace('/[\x{10000}-\x{10FFFF}]/u', "\xEF\xBF\xBD", $messagetext); - /*var_dump($plainmsg); - var_dump($htmlmsg); - var_dump($messagetext);*/ - /*var_dump($charset); - var_dump($attachments); - exit;*/ + //var_dump($plainmsg); + //var_dump($htmlmsg); + //var_dump($messagetext); + //var_dump($charset); + //var_dump($attachments); + //exit; // Parse IMAP email structure /* @@ -1381,11 +1383,13 @@ class EmailCollector extends CommonObject } } } - //var_dump($result); var_dump($partplain); var_dump($parthtml); + //var_dump($result); + //var_dump($partplain); + //var_dump($parthtml); - var_dump($structure); - var_dump($parthtml); - var_dump($partplain); + //var_dump($structure); + //var_dump($parthtml); + //var_dump($partplain); $messagetext = imap_fetchbody($connection, $imapemail, ($parthtml != '-1' ? $parthtml : ($partplain != '-1' ? $partplain : 1)), FT_PEEK); */ @@ -1891,12 +1895,12 @@ class EmailCollector extends CommonObject // Overwrite values with values extracted from source email $errorforthisaction = $this->overwritePropertiesOfObject($actioncomm, $operation['actionparam'], $messagetext, $subject, $header); - /*var_dump($fk_element_id); - var_dump($fk_element_type); - var_dump($alreadycreated); - var_dump($operation['type']); - var_dump($actioncomm); - exit;*/ + //var_dump($fk_element_id); + //var_dump($fk_element_type); + //var_dump($alreadycreated); + //var_dump($operation['type']); + //var_dump($actioncomm); + //exit; if ($errorforthisaction) { $errorforactions++; diff --git a/htdocs/emailcollector/class/emailcollectoraction.class.php b/htdocs/emailcollector/class/emailcollectoraction.class.php index eaa4b0737b9..5ce35541a16 100644 --- a/htdocs/emailcollector/class/emailcollectoraction.class.php +++ b/htdocs/emailcollector/class/emailcollectoraction.class.php @@ -233,7 +233,8 @@ class EmailCollectorAction extends CommonObject foreach ($object->array_options as $key => $option) { $shortkey = preg_replace('/options_/', '', $key); if (!empty($extrafields->attributes[$this->element]['unique'][$shortkey])) { - //var_dump($key); var_dump($clonedObj->array_options[$key]); exit; + //var_dump($key); + //var_dump($clonedObj->array_options[$key]); exit; unset($object->array_options[$key]); } } diff --git a/htdocs/emailcollector/class/emailcollectorfilter.class.php b/htdocs/emailcollector/class/emailcollectorfilter.class.php index a99c5198d72..ec42ce53a34 100644 --- a/htdocs/emailcollector/class/emailcollectorfilter.class.php +++ b/htdocs/emailcollector/class/emailcollectorfilter.class.php @@ -207,7 +207,8 @@ class EmailCollectorFilter extends CommonObject foreach ($object->array_options as $key => $option) { $shortkey = preg_replace('/options_/', '', $key); if (!empty($extrafields->attributes[$this->element]['unique'][$shortkey])) { - //var_dump($key); var_dump($clonedObj->array_options[$key]); exit; + //var_dump($key); + //var_dump($clonedObj->array_options[$key]); exit; unset($object->array_options[$key]); } } diff --git a/htdocs/eventorganization/class/conferenceorboothattendee.class.php b/htdocs/eventorganization/class/conferenceorboothattendee.class.php index 2f0c54ef2d4..3dfbb2e1a6c 100644 --- a/htdocs/eventorganization/class/conferenceorboothattendee.class.php +++ b/htdocs/eventorganization/class/conferenceorboothattendee.class.php @@ -318,7 +318,8 @@ class ConferenceOrBoothAttendee extends CommonObject foreach ($object->array_options as $key => $option) { $shortkey = preg_replace('/options_/', '', $key); if (!empty($extrafields->attributes[$this->table_element]['unique'][$shortkey])) { - //var_dump($key); var_dump($clonedObj->array_options[$key]); exit; + //var_dump($key); + //var_dump($clonedObj->array_options[$key]); exit; unset($object->array_options[$key]); } } diff --git a/htdocs/expedition/card.php b/htdocs/expedition/card.php index 8045edde410..d341f293827 100644 --- a/htdocs/expedition/card.php +++ b/htdocs/expedition/card.php @@ -268,7 +268,10 @@ if (empty($reshook)) { $sub_qty[$j]['id_batch'] = GETPOST($batch, 'int'); // the id into llx_product_batch of stock record to move $subtotalqty += $sub_qty[$j]['q']; - //var_dump($qty);var_dump($batch);var_dump($sub_qty[$j]['q']);var_dump($sub_qty[$j]['id_batch']); + //var_dump($qty); + //var_dump($batch); + //var_dump($sub_qty[$j]['q']); + //var_dump($sub_qty[$j]['id_batch']); $j++; $batch = "batchl".$i."_".$j; @@ -325,7 +328,6 @@ if (empty($reshook)) { //var_dump($batch_line[2]); if ($totalqty > 0) { // There is at least one thing to ship - //var_dump($_POST);exit; for ($i = 0; $i < $num; $i++) { $qty = "qtyl".$i; if (!isset($batch_line[$i])) { diff --git a/htdocs/expensereport/tpl/expensereport_linktofile.tpl.php b/htdocs/expensereport/tpl/expensereport_linktofile.tpl.php index 76a11c7121b..3835740dd40 100644 --- a/htdocs/expensereport/tpl/expensereport_linktofile.tpl.php +++ b/htdocs/expensereport/tpl/expensereport_linktofile.tpl.php @@ -102,7 +102,9 @@ if (empty($conf->global->EXPENSEREPORT_DISABLE_ATTACHMENT_ON_LINES)) { } print '
    '; $checked = ''; - //var_dump(GETPOST($file['relativename'])); var_dump($file['relativename']); var_dump($_FILES['userfile']['name']); + //var_dump(GETPOST($file['relativename'])); + //var_dump($file['relativename']); + //var_dump($_FILES['userfile']['name']); // If a file was just uploaded, we check to preselect it if (is_array($_FILES['userfile']['name'])) { foreach ($_FILES['userfile']['name'] as $tmpfile) { diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php index b08e31381a1..bafe606b4e8 100644 --- a/htdocs/fourn/class/fournisseur.commande.class.php +++ b/htdocs/fourn/class/fournisseur.commande.class.php @@ -3399,12 +3399,12 @@ class CommandeFournisseur extends CommonOrder $diff_array = array_diff_assoc($qtydelivered, $qtywished); // Warning: $diff_array is done only on common keys. $keysinwishednotindelivered = array_diff(array_keys($qtywished), array_keys($qtydelivered)); // To check we also have same number of keys $keysindeliverednotinwished = array_diff(array_keys($qtydelivered), array_keys($qtywished)); // To check we also have same number of keys - /*var_dump(array_keys($qtydelivered)); - var_dump(array_keys($qtywished)); - var_dump($diff_array); - var_dump($keysinwishednotindelivered); - var_dump($keysindeliverednotinwished); - exit;*/ + //var_dump(array_keys($qtydelivered)); + //var_dump(array_keys($qtywished)); + //var_dump($diff_array); + //var_dump($keysinwishednotindelivered); + //var_dump($keysindeliverednotinwished); + //exit; if (count($diff_array) == 0 && count($keysinwishednotindelivered) == 0 && count($keysindeliverednotinwished) == 0) { //No diff => mean everythings is received if ($closeopenorder) { diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php index 0aa8eb93d9d..287327f2a6a 100644 --- a/htdocs/fourn/facture/card.php +++ b/htdocs/fourn/facture/card.php @@ -714,10 +714,10 @@ if (empty($reshook)) { $dateinvoice = dol_mktime(0, 0, 0, GETPOST('remonth', 'int'), GETPOST('reday', 'int'), GETPOST('reyear', 'int'), 'tzserver'); // If we enter the 02 january, we need to save the 02 january for server $datedue = dol_mktime(0, 0, 0, GETPOST('echmonth', 'int'), GETPOST('echday', 'int'), GETPOST('echyear', 'int'), 'tzserver'); - /*var_dump($dateinvoice.' '.dol_print_date($dateinvoice, 'dayhour')); - var_dump(dol_now('tzuserrel').' '.dol_get_last_hour(dol_now('tzuserrel')).' '.dol_print_date(dol_now('tzuserrel'),'dayhour').' '.dol_print_date(dol_get_last_hour(dol_now('tzuserrel')), 'dayhour')); - var_dump($db->idate($dateinvoice)); - exit;*/ + //var_dump($dateinvoice.' '.dol_print_date($dateinvoice, 'dayhour')); + //var_dump(dol_now('tzuserrel').' '.dol_get_last_hour(dol_now('tzuserrel')).' '.dol_print_date(dol_now('tzuserrel'),'dayhour').' '.dol_print_date(dol_get_last_hour(dol_now('tzuserrel')), 'dayhour')); + //var_dump($db->idate($dateinvoice)); + //exit; // Replacement invoice if (GETPOST('type') == FactureFournisseur::TYPE_REPLACEMENT) { diff --git a/htdocs/holiday/class/holiday.class.php b/htdocs/holiday/class/holiday.class.php index 1e11e81f543..1582317f27f 100644 --- a/htdocs/holiday/class/holiday.class.php +++ b/htdocs/holiday/class/holiday.class.php @@ -1117,11 +1117,9 @@ class Holiday extends CommonObject if ($infos_CP['statut'] == 5) { continue; // ignore not validated holidays } - /* - var_dump("--"); - var_dump("old: ".dol_print_date($infos_CP['date_debut'],'dayhour').' '.dol_print_date($infos_CP['date_fin'],'dayhour').' '.$infos_CP['halfday']); - var_dump("new: ".dol_print_date($dateStart,'dayhour').' '.dol_print_date($dateEnd,'dayhour').' '.$halfday); - */ + //var_dump("--"); + //var_dump("old: ".dol_print_date($infos_CP['date_debut'],'dayhour').' '.dol_print_date($infos_CP['date_fin'],'dayhour').' '.$infos_CP['halfday']); + //var_dump("new: ".dol_print_date($dateStart,'dayhour').' '.dol_print_date($dateEnd,'dayhour').' '.$halfday); if ($halfday == 0) { if ($dateStart >= $infos_CP['date_debut'] && $dateStart <= $infos_CP['date_fin']) { diff --git a/htdocs/knowledgemanagement/class/knowledgerecord.class.php b/htdocs/knowledgemanagement/class/knowledgerecord.class.php index a2f03a64e41..3d9b8979079 100644 --- a/htdocs/knowledgemanagement/class/knowledgerecord.class.php +++ b/htdocs/knowledgemanagement/class/knowledgerecord.class.php @@ -284,7 +284,8 @@ class KnowledgeRecord extends CommonObject foreach ($object->array_options as $key => $option) { $shortkey = preg_replace('/options_/', '', $key); if (!empty($extrafields->attributes[$this->table_element]['unique'][$shortkey])) { - //var_dump($key); var_dump($clonedObj->array_options[$key]); exit; + //var_dump($key); + //var_dump($clonedObj->array_options[$key]); exit; unset($object->array_options[$key]); } } diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php index 43cb73fb36c..3feeed0afad 100644 --- a/htdocs/modulebuilder/index.php +++ b/htdocs/modulebuilder/index.php @@ -393,7 +393,8 @@ if ($dirins && in_array($action, array('initapi', 'initphpunit', 'initpagecontac $varnametoupdate = 'showtabofpageagenda'; } - //var_dump($srcfile);var_dump($destfile); + //var_dump($srcfile); + //var_dump($destfile); $result = dol_copy($srcfile, $destfile, 0, 0); if ($result > 0) { @@ -437,11 +438,13 @@ if ($dirins && $action == 'initsqlextrafields' && !empty($module)) { $srcdir = DOL_DOCUMENT_ROOT.'/modulebuilder/template'; $srcfile1 = $srcdir.'/sql/llx_mymodule_myobject_extrafields.sql'; $destfile1 = $dirins.'/'.strtolower($module).'/sql/llx_'.strtolower($module).'_'.strtolower($objectname).'_extrafields.sql'; - //var_dump($srcfile);var_dump($destfile); + //var_dump($srcfile); + //var_dump($destfile); $result1 = dol_copy($srcfile1, $destfile1, 0, 0); $srcfile2 = $srcdir.'/sql/llx_mymodule_myobject_extrafields.key.sql'; $destfile2 = $dirins.'/'.strtolower($module).'/sql/llx_'.strtolower($module).'_'.strtolower($objectname).'_extrafields.key.sql'; - //var_dump($srcfile);var_dump($destfile); + //var_dump($srcfile); + //var_dump($destfile); $result2 = dol_copy($srcfile2, $destfile2, 0, 0); if ($result1 > 0 && $result2 > 0) { @@ -489,7 +492,8 @@ if ($dirins && $action == 'inithook' && !empty($module)) { $srcdir = DOL_DOCUMENT_ROOT.'/modulebuilder/template'; $srcfile = $srcdir.'/class/actions_mymodule.class.php'; $destfile = $dirins.'/'.strtolower($module).'/class/actions_'.strtolower($module).'.class.php'; - //var_dump($srcfile);var_dump($destfile); + //var_dump($srcfile); + //var_dump($destfile); $result = dol_copy($srcfile, $destfile, 0, 0); if ($result > 0) { @@ -522,7 +526,8 @@ if ($dirins && $action == 'inittrigger' && !empty($module)) { $srcdir = DOL_DOCUMENT_ROOT.'/modulebuilder/template'; $srcfile = $srcdir.'/core/triggers/interface_99_modMyModule_MyModuleTriggers.class.php'; $destfile = $dirins.'/'.strtolower($module).'/core/triggers/interface_99_mod'.$module.'_'.$module.'Triggers.class.php'; - //var_dump($srcfile);var_dump($destfile); + //var_dump($srcfile); + //var_dump($destfile); $result = dol_copy($srcfile, $destfile, 0, 0); if ($result > 0) { @@ -555,7 +560,8 @@ if ($dirins && $action == 'initwidget' && !empty($module)) { $srcdir = DOL_DOCUMENT_ROOT.'/modulebuilder/template'; $srcfile = $srcdir.'/core/boxes/mymodulewidget1.php'; $destfile = $dirins.'/'.strtolower($module).'/core/boxes/'.strtolower($module).'widget1.php'; - //var_dump($srcfile);var_dump($destfile); + //var_dump($srcfile); + //var_dump($destfile); $result = dol_copy($srcfile, $destfile, 0, 0); if ($result > 0) { @@ -588,7 +594,8 @@ if ($dirins && $action == 'initcss' && !empty($module)) { $srcdir = DOL_DOCUMENT_ROOT.'/modulebuilder/template'; $srcfile = $srcdir.'/css/mymodule.css.php'; $destfile = $dirins.'/'.strtolower($module).'/css/'.strtolower($module).'.css.php'; - //var_dump($srcfile);var_dump($destfile); + //var_dump($srcfile); + //var_dump($destfile); $result = dol_copy($srcfile, $destfile, 0, 0); if ($result > 0) { @@ -626,7 +633,8 @@ if ($dirins && $action == 'initjs' && !empty($module)) { $srcdir = DOL_DOCUMENT_ROOT.'/modulebuilder/template'; $srcfile = $srcdir.'/js/mymodule.js.php'; $destfile = $dirins.'/'.strtolower($module).'/js/'.strtolower($module).'.js.php'; - //var_dump($srcfile);var_dump($destfile); + //var_dump($srcfile); + //var_dump($destfile); $result = dol_copy($srcfile, $destfile, 0, 0); if ($result > 0) { @@ -664,7 +672,8 @@ if ($dirins && $action == 'initcli' && !empty($module)) { $srcdir = DOL_DOCUMENT_ROOT.'/modulebuilder/template'; $srcfile = $srcdir.'/scripts/mymodule.php'; $destfile = $dirins.'/'.strtolower($module).'/scripts/'.strtolower($module).'.php'; - //var_dump($srcfile);var_dump($destfile); + //var_dump($srcfile); + //var_dump($destfile); $result = dol_copy($srcfile, $destfile, 0, 0); if ($result > 0) { @@ -702,7 +711,8 @@ if ($dirins && $action == 'initdoc' && !empty($module)) { $srcdir = DOL_DOCUMENT_ROOT.'/modulebuilder/template'; $srcfile = $srcdir.'/doc/Documentation.asciidoc'; $destfile = $dirins.'/'.strtolower($module).'/doc/Documentation.asciidoc'; - //var_dump($srcfile);var_dump($destfile); + //var_dump($srcfile); + //var_dump($destfile); $result = dol_copy($srcfile, $destfile, 0, 0); if ($result > 0) { @@ -2632,7 +2642,8 @@ if ($module == 'initmodule') { $pathtoobjlib = strtolower($module).'/lib/'.strtolower($module).'_'.strtolower($tabobj).'.lib.php'; $pathtopicto = strtolower($module).'/img/object_'.strtolower($tabobj).'.png'; - //var_dump($pathtoclass); var_dump($dirread); + //var_dump($pathtoclass); + //var_dump($dirread); $realpathtoclass = $dirread.'/'.$pathtoclass; $realpathtoapi = $dirread.'/'.$pathtoapi; $realpathtoagenda = $dirread.'/'.$pathtoagenda; diff --git a/htdocs/modulebuilder/template/class/myobject.class.php b/htdocs/modulebuilder/template/class/myobject.class.php index f5e1a18abff..245d9726048 100644 --- a/htdocs/modulebuilder/template/class/myobject.class.php +++ b/htdocs/modulebuilder/template/class/myobject.class.php @@ -338,7 +338,8 @@ class MyObject extends CommonObject foreach ($object->array_options as $key => $option) { $shortkey = preg_replace('/options_/', '', $key); if (!empty($extrafields->attributes[$this->table_element]['unique'][$shortkey])) { - //var_dump($key); var_dump($clonedObj->array_options[$key]); exit; + //var_dump($key); + //var_dump($clonedObj->array_options[$key]); exit; unset($object->array_options[$key]); } } diff --git a/htdocs/mrp/class/mo.class.php b/htdocs/mrp/class/mo.class.php index 2c0773dd9be..ecc3684e4fe 100644 --- a/htdocs/mrp/class/mo.class.php +++ b/htdocs/mrp/class/mo.class.php @@ -342,7 +342,8 @@ class Mo extends CommonObject foreach ($object->array_options as $key => $option) { $shortkey = preg_replace('/options_/', '', $key); if (!empty($extrafields->attributes[$this->element]['unique'][$shortkey])) { - //var_dump($key); var_dump($clonedObj->array_options[$key]); exit; + //var_dump($key); + //var_dump($clonedObj->array_options[$key]); exit; unset($object->array_options[$key]); } } diff --git a/htdocs/partnership/class/partnership.class.php b/htdocs/partnership/class/partnership.class.php index 83a6acc933a..126ea58076b 100644 --- a/htdocs/partnership/class/partnership.class.php +++ b/htdocs/partnership/class/partnership.class.php @@ -311,7 +311,8 @@ class Partnership extends CommonObject foreach ($object->array_options as $key => $option) { $shortkey = preg_replace('/options_/', '', $key); if (!empty($extrafields->attributes[$this->table_element]['unique'][$shortkey])) { - //var_dump($key); var_dump($clonedObj->array_options[$key]); exit; + //var_dump($key); + //var_dump($clonedObj->array_options[$key]); exit; unset($object->array_options[$key]); } } diff --git a/htdocs/product/class/productfournisseurprice.class.php b/htdocs/product/class/productfournisseurprice.class.php index ef9b2a49117..8f166f702b1 100644 --- a/htdocs/product/class/productfournisseurprice.class.php +++ b/htdocs/product/class/productfournisseurprice.class.php @@ -244,7 +244,8 @@ class ProductFournisseurPrice extends CommonObject foreach ($object->array_options as $key => $option) { $shortkey = preg_replace('/options_/', '', $key); if (!empty($extrafields->attributes[$this->table_element]['unique'][$shortkey])) { - //var_dump($key); var_dump($clonedObj->array_options[$key]); exit; + //var_dump($key); + //var_dump($clonedObj->array_options[$key]); exit; unset($object->array_options[$key]); } } diff --git a/htdocs/product/stock/massstockmove.php b/htdocs/product/stock/massstockmove.php index 781f2037dba..b6abd4b153a 100644 --- a/htdocs/product/stock/massstockmove.php +++ b/htdocs/product/stock/massstockmove.php @@ -232,7 +232,11 @@ if ($action == 'createmovements' && !empty($user->rights->stock->mouvement->cree $firstrecord = array_shift($arraybatchinfo); $dlc = $firstrecord['eatby']; $dluo = $firstrecord['sellby']; - //var_dump($batch); var_dump($arraybatchinfo); var_dump($firstrecord); var_dump($dlc); var_dump($dluo); exit; + //var_dump($batch); + //var_dump($arraybatchinfo); + //var_dump($firstrecord); + //var_dump($dlc); + //var_dump($dluo); exit; } else { $dlc = ''; $dluo = ''; diff --git a/htdocs/projet/activity/perday.php b/htdocs/projet/activity/perday.php index 4066e164cc9..4f30054155a 100644 --- a/htdocs/projet/activity/perday.php +++ b/htdocs/projet/activity/perday.php @@ -84,9 +84,9 @@ $monthofday = GETPOST('addtimemonth'); $dayofday = GETPOST('addtimeday'); $yearofday = GETPOST('addtimeyear'); -/*var_dump(GETPOST('remonth')); -var_dump(GETPOST('button_search_x')); -var_dump(GETPOST('button_addtime'));*/ +//var_dump(GETPOST('remonth')); +//var_dump(GETPOST('button_search_x')); +//var_dump(GETPOST('button_addtime')); $daytoparse = $now; if ($year && $month && $day) { diff --git a/htdocs/projet/activity/permonth.php b/htdocs/projet/activity/permonth.php index c8af7348716..156080eefb3 100644 --- a/htdocs/projet/activity/permonth.php +++ b/htdocs/projet/activity/permonth.php @@ -239,7 +239,8 @@ if ($action == 'addtime' && $user->rights->projet->lire) { if (!$updateoftaskdone) { // Check to update progress if no update were done on task. $object->fetch($taskid); - //var_dump($object->progress);var_dump(GETPOST($taskid . 'progress', 'int')); exit; + //var_dump($object->progress); + //var_dump(GETPOST($taskid . 'progress', 'int')); exit; if ($object->progress != GETPOST($taskid.'progress', 'int')) { $object->progress = GETPOST($taskid.'progress', 'int'); $result = $object->update($user); diff --git a/htdocs/projet/activity/perweek.php b/htdocs/projet/activity/perweek.php index 768a23a7b9a..0152f968c0c 100644 --- a/htdocs/projet/activity/perweek.php +++ b/htdocs/projet/activity/perweek.php @@ -308,7 +308,8 @@ if ($action == 'addtime' && $user->rights->projet->lire && GETPOST('formfilterac if (!$updateoftaskdone) { // Check to update progress if no update were done on task. $object->fetch($taskid); - //var_dump($object->progress);var_dump(GETPOST($taskid . 'progress', 'int')); exit; + //var_dump($object->progress); + //var_dump(GETPOST($taskid . 'progress', 'int')); exit; if ($object->progress != GETPOST($taskid.'progress', 'int')) { $object->progress = GETPOST($taskid.'progress', 'int'); $result = $object->update($user); diff --git a/htdocs/recruitment/class/recruitmentcandidature.class.php b/htdocs/recruitment/class/recruitmentcandidature.class.php index fb08409eb27..835cfe0b7cd 100644 --- a/htdocs/recruitment/class/recruitmentcandidature.class.php +++ b/htdocs/recruitment/class/recruitmentcandidature.class.php @@ -270,7 +270,8 @@ class RecruitmentCandidature extends CommonObject foreach ($object->array_options as $key => $option) { $shortkey = preg_replace('/options_/', '', $key); if (!empty($extrafields->attributes[$this->table_element]['unique'][$shortkey])) { - //var_dump($key); var_dump($clonedObj->array_options[$key]); exit; + //var_dump($key); + //var_dump($clonedObj->array_options[$key]); exit; unset($object->array_options[$key]); } } diff --git a/htdocs/recruitment/class/recruitmentjobposition.class.php b/htdocs/recruitment/class/recruitmentjobposition.class.php index bc46b40f186..43e20858f69 100644 --- a/htdocs/recruitment/class/recruitmentjobposition.class.php +++ b/htdocs/recruitment/class/recruitmentjobposition.class.php @@ -279,7 +279,8 @@ class RecruitmentJobPosition extends CommonObject foreach ($object->array_options as $key => $option) { $shortkey = preg_replace('/options_/', '', $key); if (!empty($extrafields->attributes[$this->element]['unique'][$shortkey])) { - //var_dump($key); var_dump($clonedObj->array_options[$key]); exit; + //var_dump($key); + //var_dump($clonedObj->array_options[$key]); exit; unset($object->array_options[$key]); } } diff --git a/htdocs/recruitment/core/modules/recruitment/doc/pdf_standard_recruitmentjobposition.modules.php b/htdocs/recruitment/core/modules/recruitment/doc/pdf_standard_recruitmentjobposition.modules.php index ba1d0a8d9f5..45483ea51f9 100644 --- a/htdocs/recruitment/core/modules/recruitment/doc/pdf_standard_recruitmentjobposition.modules.php +++ b/htdocs/recruitment/core/modules/recruitment/doc/pdf_standard_recruitmentjobposition.modules.php @@ -611,7 +611,8 @@ class pdf_standard_recruitmentjobposition extends ModelePDFRecruitmentJobPositio $pageposafter = $pdf->getPage(); $posyafter = $pdf->GetY(); - //var_dump($posyafter); var_dump(($this->page_hauteur - ($heightforfooter+$heightforfreetext+$heightforinfotot))); exit; + //var_dump($posyafter); + //var_dump(($this->page_hauteur - ($heightforfooter+$heightforfreetext+$heightforinfotot))); exit; if ($posyafter > ($this->page_hauteur - ($heightforfooter + $heightforfreetext + $heightforinfotot))) { // There is no space left for total+free text if ($i == ($nblines - 1)) { // No more lines, and no space left to show total, so we create a new page $pdf->AddPage('', '', true); diff --git a/htdocs/salaries/card.php b/htdocs/salaries/card.php index 3f077255a1c..3a673b0bbd5 100644 --- a/htdocs/salaries/card.php +++ b/htdocs/salaries/card.php @@ -135,8 +135,8 @@ if (empty($reshook)) { } if ($cancel) { - /*var_dump($cancel); - var_dump($backtopage);exit;*/ + //var_dump($cancel); + //var_dump($backtopage);exit; if (!empty($backtopageforcancel)) { header("Location: ".$backtopageforcancel); exit; diff --git a/htdocs/societe/paymentmodes.php b/htdocs/societe/paymentmodes.php index 8629044f83b..bdbf7453c35 100644 --- a/htdocs/societe/paymentmodes.php +++ b/htdocs/societe/paymentmodes.php @@ -545,7 +545,9 @@ if (empty($reshook)) { $resql = $db->query($sql); } } - //var_dump($sql); var_dump($newcu); var_dump($num); exit; + //var_dump($sql); + //var_dump($newcu); + //var_dump($num); exit; if (!$error) { $stripecu = $newcu; diff --git a/htdocs/stripe/class/stripe.class.php b/htdocs/stripe/class/stripe.class.php index 18ebce96f8b..36e67d2827c 100644 --- a/htdocs/stripe/class/stripe.class.php +++ b/htdocs/stripe/class/stripe.class.php @@ -531,12 +531,12 @@ class Stripe extends CommonObject $this->code = $e->getStripeCode(); $this->declinecode = $e->getDeclineCode(); } catch (Exception $e) { - /*var_dump($dataforintent); - var_dump($description); - var_dump($key); - var_dump($paymentintent); - var_dump($e->getMessage()); - var_dump($e);*/ + //var_dump($dataforintent); + //var_dump($description); + //var_dump($key); + //var_dump($paymentintent); + //var_dump($e->getMessage()); + //var_dump($e); $error++; $this->error = $e->getMessage(); $this->code = ''; @@ -695,11 +695,11 @@ class Stripe extends CommonObject $_SESSION["stripe_setup_intent"] = $setupintent; }*/ } catch (Exception $e) { - /*var_dump($dataforintent); - var_dump($description); - var_dump($key); - var_dump($setupintent); - var_dump($e->getMessage());*/ + //var_dump($dataforintent); + //var_dump($description); + //var_dump($key); + //var_dump($setupintent); + //var_dump($e->getMessage()); $error++; $this->error = $e->getMessage(); } @@ -780,7 +780,8 @@ class Stripe extends CommonObject ); //$a = \Stripe\Stripe::getApiKey(); - //var_dump($a);var_dump($stripeacc);exit; + //var_dump($a); + //var_dump($stripeacc);exit; try { if (empty($stripeacc)) { // If the Stripe connect account not set, we use common API usage if (empty($conf->global->STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION)) { diff --git a/htdocs/supplier_proposal/card.php b/htdocs/supplier_proposal/card.php index 369dcf3742f..df54da4132c 100644 --- a/htdocs/supplier_proposal/card.php +++ b/htdocs/supplier_proposal/card.php @@ -741,7 +741,9 @@ if (empty($reshook)) { $date_end ); - //var_dump($tva_tx);var_dump($productsupplier->fourn_pu);var_dump($price_base_type);exit; + //var_dump($tva_tx); + //var_dump($productsupplier->fourn_pu); + //var_dump($price_base_type);exit; if ($result < 0) { $error++; setEventMessages($object->error, $object->errors, 'errors'); diff --git a/htdocs/ticket/class/cticketcategory.class.php b/htdocs/ticket/class/cticketcategory.class.php index aa0dd68ec19..5de60a48d85 100644 --- a/htdocs/ticket/class/cticketcategory.class.php +++ b/htdocs/ticket/class/cticketcategory.class.php @@ -290,7 +290,8 @@ class CTicketCategory extends CommonObject foreach ($object->array_options as $key => $option) { $shortkey = preg_replace('/options_/', '', $key); if (!empty($extrafields->attributes[$this->table_element]['unique'][$shortkey])) { - //var_dump($key); var_dump($clonedObj->array_options[$key]); exit; + //var_dump($key); + //var_dump($clonedObj->array_options[$key]); exit; unset($object->array_options[$key]); } } diff --git a/htdocs/ticket/class/ticket.class.php b/htdocs/ticket/class/ticket.class.php index b14285121a7..98a9ac23355 100644 --- a/htdocs/ticket/class/ticket.class.php +++ b/htdocs/ticket/class/ticket.class.php @@ -2494,7 +2494,8 @@ class Ticket extends CommonObject if (!$error && $id > 0) { setEventMessages($langs->trans('TicketMessageSuccessfullyAdded'), null, 'mesgs'); - //var_dump($_SESSION); var_dump($listofpaths);exit; + //var_dump($_SESSION); + //var_dump($listofpaths);exit; /* * Public area diff --git a/htdocs/ticket/list.php b/htdocs/ticket/list.php index 5204b0ffea7..d3f97620f91 100644 --- a/htdocs/ticket/list.php +++ b/htdocs/ticket/list.php @@ -836,7 +836,9 @@ foreach ($object->fields as $key => $val) { $arrayofstatus[$key2] = $val2; } print ''; - //var_dump($arrayofstatus);var_dump($search['fk_statut']);var_dump(array_values($search[$key])); + //var_dump($arrayofstatus); + //var_dump($search['fk_statut']); + //var_dump(array_values($search[$key])); $selectedarray = null; if (!empty($search[$key])) { $selectedarray = array_values($search[$key]); diff --git a/htdocs/website/index.php b/htdocs/website/index.php index 968094cad18..a170a2b777e 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -410,7 +410,8 @@ if ($sortorder) { include DOL_DOCUMENT_ROOT.'/core/actions_linkedfiles.inc.php'; // This manage 'sendit' action when submitting new file. $backtopage = $savbacktopage; -//var_dump($backtopage); var_dump($action); +//var_dump($backtopage); +//var_dump($action); if ($action == 'renamefile') { // Must be after include DOL_DOCUMENT_ROOT.'/core/actions_linkedfiles.inc.php'; If action were renamefile, we set it to 'file_manager' $action = 'file_manager'; diff --git a/htdocs/workstation/class/workstation.class.php b/htdocs/workstation/class/workstation.class.php index 4131f074e85..2f084916a75 100644 --- a/htdocs/workstation/class/workstation.class.php +++ b/htdocs/workstation/class/workstation.class.php @@ -318,7 +318,8 @@ class Workstation extends CommonObject foreach ($object->array_options as $key => $option) { $shortkey = preg_replace('/options_/', '', $key); if (!empty($extrafields->attributes[$this->table_element]['unique'][$shortkey])) { - //var_dump($key); var_dump($clonedObj->array_options[$key]); exit; + //var_dump($key); + //var_dump($clonedObj->array_options[$key]); exit; unset($object->array_options[$key]); } } From 5f0a34166de05cbaaae8f0ceb8954335bfcf13a1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 17 May 2022 15:10:20 +0200 Subject: [PATCH 553/738] NEW Add a protection into PHPunit to avoid to forget a var_dump --- htdocs/core/lib/admin.lib.php | 4 ++-- htdocs/install/step2.php | 8 +++---- .../demo_wsclient_category.php-NORUN | 2 +- test/phpunit/CodingPhpTest.php | 21 +++++++++++++++++++ 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/htdocs/core/lib/admin.lib.php b/htdocs/core/lib/admin.lib.php index 6054b05aab3..8682939f267 100644 --- a/htdocs/core/lib/admin.lib.php +++ b/htdocs/core/lib/admin.lib.php @@ -210,8 +210,8 @@ function run_sql($sqlfile, $silent = 1, $entity = '', $usesavepoint = 1, $handle if (!empty($reg[2])) { if (is_numeric($reg[2])) { // This is a version $versionrequest = explode('.', $reg[2]); - //print var_dump($versionrequest); - //print var_dump($versionarray); + //var_dump($versionrequest); + //var_dump($versionarray); if (!count($versionrequest) || !count($versionarray) || versioncompare($versionrequest, $versionarray) > 0) { $qualified = 0; } diff --git a/htdocs/install/step2.php b/htdocs/install/step2.php index 33e69377904..fac191feec5 100644 --- a/htdocs/install/step2.php +++ b/htdocs/install/step2.php @@ -295,8 +295,8 @@ if ($action == "set") { // MySQL if ($choix == 1 && preg_match('/^--\sV([0-9\.]+)/i', $buf, $reg)) { $versioncommande = explode('.', $reg[1]); - //print var_dump($versioncommande); - //print var_dump($versionarray); + //var_dump($versioncommande); + //var_dump($versionarray); if (count($versioncommande) && count($versionarray) && versioncompare($versioncommande, $versionarray) <= 0) { // Version qualified, delete SQL comments @@ -307,8 +307,8 @@ if ($action == "set") { // PGSQL if ($choix == 2 && preg_match('/^--\sPOSTGRESQL\sV([0-9\.]+)/i', $buf, $reg)) { $versioncommande = explode('.', $reg[1]); - //print var_dump($versioncommande); - //print var_dump($versionarray); + //var_dump($versioncommande); + //var_dump($versionarray); if (count($versioncommande) && count($versionarray) && versioncompare($versioncommande, $versionarray) <= 0) { // Version qualified, delete SQL comments diff --git a/htdocs/webservices/demo_wsclient_category.php-NORUN b/htdocs/webservices/demo_wsclient_category.php-NORUN index 955253034d9..37029067093 100755 --- a/htdocs/webservices/demo_wsclient_category.php-NORUN +++ b/htdocs/webservices/demo_wsclient_category.php-NORUN @@ -56,7 +56,7 @@ dol_syslog("Call method ".$WS_METHOD); $result = $soapclient->call($WS_METHOD,$parameters); if (! $result) { - var_dump($soapclient); + //var_dump($soapclient); print '

    Erreur SOAP 1

    '.$soapclient->error_str; exit; } diff --git a/test/phpunit/CodingPhpTest.php b/test/phpunit/CodingPhpTest.php index 5637f0194ac..bff78d47b94 100644 --- a/test/phpunit/CodingPhpTest.php +++ b/test/phpunit/CodingPhpTest.php @@ -199,6 +199,7 @@ class CodingPhpTest extends PHPUnit\Framework\TestCase || preg_match('/modules\/.*\/doc\/(doc|pdf)_/', $file['relativename']) || preg_match('/modules\/(import|mailings|printing)\//', $file['relativename']) || in_array($file['name'], array('modules_boxes.php', 'rapport.pdf.php', 'TraceableDB.php'))) { + // Check into Class files if (! in_array($file['name'], array( 'api.class.php', 'commonobject.class.php', @@ -224,6 +225,7 @@ class CodingPhpTest extends PHPUnit\Framework\TestCase //exit; } } else { + // Check into Include files if (! in_array($file['name'], array( 'objectline_view.tpl.php', 'extrafieldsinexport.inc.php', @@ -245,6 +247,25 @@ class CodingPhpTest extends PHPUnit\Framework\TestCase } } + // Check if a var_dump has been forgotten + if (!preg_match('/test\/phpunit/', $file['fullname'])) { + $ok=true; + $matches=array(); + preg_match_all('/(.)\s*var_dump/', $filecontent, $matches, PREG_SET_ORDER); + //var_dump($matches); + foreach ($matches as $key => $val) { + if ($val[1] != '/' && $val[1] != '*') { + $ok=false; + break; + } + break; + } + //print __METHOD__." Result for checking we don't have non escaped string in sql requests for file ".$file."\n"; + $this->assertTrue($ok, 'Found string var_dump that is not just after /* or // in '.$file['relativename']); + //exit; + } + + // Check get_class followed by __METHOD__ $ok=true; $matches=array(); preg_match_all('/'.preg_quote('get_class($this)."::".__METHOD__', '/').'/', $filecontent, $matches, PREG_SET_ORDER); From 50b4eaf82f10de384d9fc9ce555fbc1d872e15ea Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 17 May 2022 15:29:05 +0200 Subject: [PATCH 554/738] Clean code --- htdocs/imports/import.php | 6 ++++-- htdocs/theme/eldy/global.inc.php | 6 ++++++ htdocs/theme/md/style.css.php | 6 ++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/htdocs/imports/import.php b/htdocs/imports/import.php index c12b5746e82..da917c31044 100644 --- a/htdocs/imports/import.php +++ b/htdocs/imports/import.php @@ -1016,7 +1016,7 @@ if ($step == 4 && $datatoimport) { //var_dump($array_match_file_to_database); - print ''; + print ''; $fieldsplaced = array(); $valforsourcefieldnb = array(); @@ -1047,6 +1047,7 @@ if ($step == 4 && $datatoimport) { //var_dump($valforsourcefieldnb); // Complete source fields from count($fieldssource)+1 to count($fieldstarget) + /* $more = 1; $num = count($fieldssource); while ($lefti <= $num) { @@ -1058,12 +1059,13 @@ if ($step == 4 && $datatoimport) { $lefti++; $more++; } + */ print "
    \n"; print "\n"; - print ''; + print ''; // List of target fields $optionsnotused = ""; diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index d01e3b8d55d..ab0e9ff4b87 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -818,6 +818,12 @@ textarea.centpercent { .nopaddingright { padding-right: 0; } +.nopaddingleftimp { + padding-left: 0 !important; +} +.nopaddingrightimp { + padding-right: 0 !important; +} .paddingleft { padding-: 4px; } diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index fe54b2365b5..0d6801a120b 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -969,6 +969,12 @@ textarea.centpercent { .nopaddingright { padding-right: 0; } +.nopaddingleftimp { + padding-left: 0 !important; +} +.nopaddingrightimp { + padding-right: 0 !important; +} .paddingleft { padding-: 4px; } From 978db41f37cd61ef59b0d4a8f383b6c024d899b1 Mon Sep 17 00:00:00 2001 From: lvessiller Date: Tue, 17 May 2022 15:50:45 +0200 Subject: [PATCH 555/738] FIX qty received label in Squille PDF model --- .../reception/doc/pdf_squille.modules.php | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/htdocs/core/modules/reception/doc/pdf_squille.modules.php b/htdocs/core/modules/reception/doc/pdf_squille.modules.php index 38344a5f486..d81a01bea92 100644 --- a/htdocs/core/modules/reception/doc/pdf_squille.modules.php +++ b/htdocs/core/modules/reception/doc/pdf_squille.modules.php @@ -523,9 +523,9 @@ class pdf_squille extends ModelePdfReception while ($pagenb < $pageposafter) { $pdf->setPage($pagenb); if ($pagenb == 1) { - $this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforfooter, 0, $outputlangs, 0, 1); + $this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforfooter, 0, $outputlangs, 0, 1, $object); } else { - $this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforfooter, 0, $outputlangs, 1, 1); + $this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforfooter, 0, $outputlangs, 1, 1, $object); } $this->_pagefoot($pdf, $object, $outputlangs, 1); $pagenb++; @@ -534,9 +534,9 @@ class pdf_squille extends ModelePdfReception } if (isset($object->lines[$i + 1]->pagebreak) && $object->lines[$i + 1]->pagebreak) { if ($pagenb == 1) { - $this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforfooter, 0, $outputlangs, 0, 1); + $this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforfooter, 0, $outputlangs, 0, 1, $object); } else { - $this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforfooter, 0, $outputlangs, 1, 1); + $this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforfooter, 0, $outputlangs, 1, 1, $object); } $this->_pagefoot($pdf, $object, $outputlangs, 1); // New page @@ -550,10 +550,10 @@ class pdf_squille extends ModelePdfReception // Show square if ($pagenb == 1) { - $this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforinfotot - $heightforfreetext - $heightforfooter, 0, $outputlangs, 0, 0); + $this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforinfotot - $heightforfreetext - $heightforfooter, 0, $outputlangs, 0, 0, $object); $bottomlasttab = $this->page_hauteur - $heightforinfotot - $heightforfreetext - $heightforfooter + 1; } else { - $this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforinfotot - $heightforfreetext - $heightforfooter, 0, $outputlangs, 1, 0); + $this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforinfotot - $heightforfreetext - $heightforfooter, 0, $outputlangs, 1, 0, $object); $bottomlasttab = $this->page_hauteur - $heightforinfotot - $heightforfreetext - $heightforfooter + 1; } @@ -719,9 +719,10 @@ class pdf_squille extends ModelePdfReception * @param Translate $outputlangs Langs object * @param int $hidetop Hide top bar of array * @param int $hidebottom Hide bottom bar of array + * @param Object|NULL $object Object reception to generate * @return void */ - protected function _tableau(&$pdf, $tab_top, $tab_height, $nexY, $outputlangs, $hidetop = 0, $hidebottom = 0) + protected function _tableau(&$pdf, $tab_top, $tab_height, $nexY, $outputlangs, $hidetop = 0, $hidebottom = 0, $object = null) { global $conf; @@ -767,7 +768,18 @@ class pdf_squille extends ModelePdfReception $pdf->line($this->posxqtytoship - 1, $tab_top, $this->posxqtytoship - 1, $tab_top + $tab_height); if (empty($hidetop)) { $pdf->SetXY($this->posxqtytoship, $tab_top + 1); - $pdf->MultiCell(($this->posxpuht - $this->posxqtytoship), 2, $outputlangs->transnoentities("QtyToReceive"), '', 'C'); + $statusreceived = Reception::STATUS_CLOSED; + if (getDolGlobalInt("STOCK_CALCULATE_ON_RECEPTION")) { + $statusreceived = Reception::STATUS_VALIDATED; + } + if (getDolGlobalInt("STOCK_CALCULATE_ON_RECEPTION_CLOSE")) { + $statusreceived = Reception::STATUS_CLOSED; + } + if ($object && $object->statut < $statusreceived) { + $pdf->MultiCell(($this->posxpuht - $this->posxqtytoship), 2, $outputlangs->transnoentities('QtyToReceive'), '', 'C'); + } else { + $pdf->MultiCell(($this->posxpuht - $this->posxqtytoship), 2, $outputlangs->transnoentities('QtyReceived'), '', 'C'); + } } if (!empty($conf->global->MAIN_PDF_RECEPTION_DISPLAY_AMOUNT_HT)) { From f18dc89bdf23dba705aee39ecf4984adf690c6ad Mon Sep 17 00:00:00 2001 From: atm-lena Date: Tue, 17 May 2022 16:26:43 +0200 Subject: [PATCH 556/738] Add ddate signature in fetch propal --- htdocs/comm/propal/class/propal.class.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index ef193898df7..c18e0e7a6df 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -1455,6 +1455,7 @@ class Propal extends CommonObject $sql = "SELECT p.rowid, p.ref, p.entity, p.remise, p.remise_percent, p.remise_absolue, p.fk_soc"; $sql .= ", p.total_ttc, p.total_tva, p.localtax1, p.localtax2, p.total_ht"; $sql .= ", p.datec"; + $sql .= ", p.date_signature as dates"; $sql .= ", p.date_valid as datev"; $sql .= ", p.datep as dp"; $sql .= ", p.fin_validite as dfv"; @@ -1538,6 +1539,7 @@ class Propal extends CommonObject $this->date_creation = $this->db->jdate($obj->datec); //Creation date $this->date_validation = $this->db->jdate($obj->datev); //Validation date $this->date_modification = $this->db->jdate($obj->date_modification); // tms + $this->date_signature = $this->db->jdate($obj->dates); // Signature date $this->date = $this->db->jdate($obj->dp); // Proposal date $this->datep = $this->db->jdate($obj->dp); // deprecated $this->fin_validite = $this->db->jdate($obj->dfv); From 5ccf4145e315f575df14d59ce83985a81e8ef742 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 17 May 2022 17:25:09 +0200 Subject: [PATCH 557/738] Clean import process --- htdocs/imports/import.php | 194 ++++++++++++++++++++++---------------- 1 file changed, 115 insertions(+), 79 deletions(-) diff --git a/htdocs/imports/import.php b/htdocs/imports/import.php index da917c31044..069f39d66e3 100644 --- a/htdocs/imports/import.php +++ b/htdocs/imports/import.php @@ -1002,7 +1002,7 @@ if ($step == 4 && $datatoimport) { print $s; print ' '; $htmlother->select_import_model($importmodelid, 'importmodelid', $datatoimport, 1, $user->id); - print ''; + print ''; print ''; print ''; @@ -1016,7 +1016,7 @@ if ($step == 4 && $datatoimport) { //var_dump($array_match_file_to_database); - print ''; + print ''; $fieldsplaced = array(); $valforsourcefieldnb = array(); @@ -1034,7 +1034,6 @@ if ($step == 4 && $datatoimport) { foreach ($fieldssource as $key => $val) { $var = !$var; show_elem($fieldssource, $key, $val, $var); // key is field number in source file - //print '> '.$lefti.'-'.$key.'-'.$val; $listofkeys[$key] = 1; $fieldsplaced[$key] = 1; $valforsourcefieldnb[$lefti] = $key; @@ -1046,39 +1045,26 @@ if ($step == 4 && $datatoimport) { } //var_dump($valforsourcefieldnb); - // Complete source fields from count($fieldssource)+1 to count($fieldstarget) - /* - $more = 1; - $num = count($fieldssource); - while ($lefti <= $num) { - $var = !$var; - $newkey = getnewkey($fieldssource, $listofkeys); - show_elem($fieldssource, $newkey, '', $var); // key start after field number in source file - //print '> '.$lefti.'-'.$newkey; - $listofkeys[$key] = 1; - $lefti++; - $more++; - } - */ - print "\n"; print "\n"; - print ''; + print ''; // List of target fields $optionsnotused = ""; + $optionsall = array(); foreach ($fieldstarget as $code => $line) { + $text = ''; if (!$line["imported"]) { - $text = ''; $optionsnotused .= $text; } + $optionsall[$code] = array('label'=>$langs->trans($line["label"]), 'required'=>(empty($line["required"]) ? 0 : 1)); } $height = '32px'; //needs px for css height attribute below @@ -1099,39 +1085,46 @@ if ($step == 4 && $datatoimport) { $entityicon = !empty($entitytoicon[$entity]) ? $entitytoicon[$entity] : $entity; // $entityicon must string name of picto of the field like 'project', 'company', 'contact', 'modulename', ... $entitylang = $entitytolang[$entity] ? $entitytolang[$entity] : $objimport->array_import_label[0]; // $entitylang must be a translation key to describe object the field is related to, like 'Company', 'Contact', 'MyModyle', ... - print '=> '.img_object('', $entityicon).' '.$langs->trans($entitylang).''; + //print '=> '.img_object('', $entityicon).' '.$langs->trans($entitylang).''; + print '=> '; print ''; print ''; //print ajax_combobox('selectorderimport_'.($i+1)); print ""; print ''; - $filecolumn = !empty($array_match_database_to_file[$code])?$array_match_database_to_file[$code]:0; + $filecolumn = ($i + 1); // Source field info $htmltext = ''.$langs->trans("FieldSource").'
    '; if ($filecolumn > count($fieldssource)) { $htmltext .= $langs->trans("DataComeFromNoWhere").'
    '; } else { if (empty($objimport->array_import_convertvalue[0][$code])) { // If source file does not need convertion - $filecolumntoshow = $filecolumn; + $filecolumntoshow = $i + 1; $htmltext .= $langs->trans("DataComeFromFileFieldNb", $filecolumntoshow).'
    '; } else { if ($objimport->array_import_convertvalue[0][$code]['rule'] == 'fetchidfromref') { @@ -1143,7 +1136,6 @@ if ($step == 4 && $datatoimport) { } } // Source required - $htmltext .= $langs->trans("SourceRequired").': '.yn($line["label"]).'
    '; $example = !empty($objimport->array_import_examplevalues[0][$code])?$objimport->array_import_examplevalues[0][$code]:""; // Example if (empty($objimport->array_import_convertvalue[0][$code])) { // If source file does not need convertion @@ -1166,6 +1158,7 @@ if ($step == 4 && $datatoimport) { $htmltext .= '
    '; // Target field info $htmltext .= ''.$langs->trans("FieldTarget").'
    '; + //$htmltext .= $langs->trans("SourceRequired").': '.yn($line["label"]).'
    '; if (empty($objimport->array_import_convertvalue[0][$code])) { // If source file does not need convertion $htmltext .= $langs->trans("DataIsInsertedInto").'
    '; } else { @@ -1236,49 +1229,87 @@ if ($step == 4 && $datatoimport) { print ''."\n"; } @@ -1315,6 +1346,7 @@ if ($step == 4 && $datatoimport) { print ''; print ''; print ''; + print ''; print ''; print ''; @@ -1333,7 +1365,7 @@ if ($step == 4 && $datatoimport) { print $form->selectarray('visibility', $arrayvisibility, 'private'); print ''; print ''; - print ''; + print ''; print ''; // List of existing import profils @@ -2201,14 +2233,15 @@ function show_elem($fieldssource, $pos, $key, $var, $nostyle = '') } if (($pos && $pos > count($fieldssource)) && (!isset($fieldssource[$pos]["imported"]))) { // No fields + /* print ''; print ''; - //print img_picto(($pos > 0 ? $langs->trans("MoveField", $pos) : ''), 'grip_title', 'class="boxhandle" style="cursor:move;"'); print ''; print ''; print $langs->trans("NoFields"); print ''; print ''; + */ } elseif ($key == 'none') { // Empty line print ''; print ''; @@ -2224,6 +2257,7 @@ function show_elem($fieldssource, $pos, $key, $var, $nostyle = '') print ''; // The image must have the class 'boxhandle' beause it's value used in DOM draggable objects to define the area used to catch the full object //print img_picto($langs->trans("MoveField", $pos), 'grip_title', 'class="boxhandle" style="cursor:move;"'); + print img_picto($langs->trans("Field").' '.$pos, 'file', 'class="pictofixedwith"'); print ''; if (isset($fieldssource[$pos]['imported']) && $fieldssource[$pos]['imported'] == false) { print ''; @@ -2240,7 +2274,9 @@ function show_elem($fieldssource, $pos, $key, $var, $nostyle = '') if (!utf8_check($example)) { $example = utf8_encode($example); } - print ' ('.$example.')'; + print ' - '; + //print ''.$langs->trans("ExampleOnFirstLine").': '; + print ''.$example.''; } print ''; print ''; From 9c00e087fe7b2e62b008e37ff62a56828e3f8597 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 17 May 2022 17:47:35 +0200 Subject: [PATCH 558/738] css --- htdocs/theme/eldy/global.inc.php | 4 ++-- htdocs/theme/md/style.css.php | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index ab0e9ff4b87..f9e780d2ce5 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -1573,7 +1573,7 @@ table[summary="list_of_modules"] .fa-cog { .minheight30 { min-height: 30px; } .minheight40 { min-height: 40px; } .titlefieldcreate { width: 20%; } -.titlefield { /* width: 25%; */ width: 250px; } +.titlefield { /* width: 25%; */ min-width: 250px; } .titlefieldmiddle { width: 45%; } .titlefieldmax45 { max-width: 45%; } .imgmaxwidth180 { max-width: 180px; } @@ -1779,7 +1779,7 @@ select.widthcentpercentminusxx, span.widthcentpercentminusxx:not(.select2-select .minwidth300imp { min-width: 120px !important; } .minwidth400imp { min-width: 150px !important; } .minwidth500imp { min-width: 250px !important; } - .titlefield { width: auto; } + .titlefield { width: auto; min-width: unset; } .titlefieldcreate { width: auto; } #tooltip { diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 0d6801a120b..6f135aa7f14 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -1662,7 +1662,7 @@ tr.nobottom td { .minheight30 { min-height: 30px; } .minheight40 { min-height: 40px; } .titlefieldcreate { width: 20%; } -.titlefield { /* width: 25%; */ width: 250px; } +.titlefield { /* width: 25%; */ min-width: 250px; } .titlefieldmiddle { width: 50%; } .imgmaxwidth180 { max-width: 180px; } .imgmaxheight50 { max-height: 50px; } @@ -1864,7 +1864,7 @@ select.widthcentpercentminusxx, span.widthcentpercentminusxx:not(.select2-select .minwidth300imp { min-width: 120px !important; } .minwidth400imp { min-width: 150px !important; } .minwidth500imp { min-width: 250px !important; } - .titlefield { width: auto; } + .titlefield { width: auto; min-width: unset; } .titlefieldcreate { width: auto; } #tooltip { @@ -7227,6 +7227,7 @@ div.clipboardCPValue.hidewithsize { .titlefield { width: auto !important; /* We want to ignore the 30%, try to use more if you can */ + min-width: unset; } .tableforfield>tr>td:first-child, .tableforfield>tbody>tr>td:first-child, div.tableforfield div.tagtr>div.tagtd:first-of-type { /* max-width: 100px; */ /* but no more than 100px */ From 2a34d6354fc11dfaa42852dc4c059e6fdc6a6868 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 17 May 2022 20:08:59 +0200 Subject: [PATCH 559/738] Fix scrutinizer --- htdocs/core/class/html.form.class.php | 6 +++--- htdocs/core/lib/functions.lib.php | 2 +- htdocs/core/menus/standard/eldy.lib.php | 2 +- htdocs/fourn/class/fournisseur.commande.class.php | 12 ++++++------ htdocs/recruitment/recruitmentcandidature_list.php | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 08ebac1c5e7..f1a93868809 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -4033,12 +4033,12 @@ class Form * @param string $deposit_percent < 0 : deposit_percent input makes no sense (for example, in list filters) * 0 : use default deposit percentage from entry * > 0 : force deposit percentage (for example, from company object) - * @return string + * @return string String for the HTML select component */ public function getSelectConditionsPaiements($selected = 0, $htmlname = 'condid', $filtertype = -1, $addempty = 0, $noinfoadmin = 0, $morecss = '', $deposit_percent = -1) { - global $langs, $user, $conf; + $out = ''; dol_syslog(__METHOD__." selected=".$selected.", htmlname=".$htmlname, LOG_DEBUG); @@ -4125,7 +4125,7 @@ class Form * @param int $active Active or not, -1 = all * @param string $morecss Add more CSS on select tag * @param int $nooutput 1=Return string, do not send to output - * @return void + * @return string|void String for the HTML select component */ public function select_types_paiements($selected = '', $htmlname = 'paiementtype', $filtertype = '', $format = 0, $empty = 1, $noadmininfo = 0, $maxlength = 0, $active = 1, $morecss = '', $nooutput = 0) { diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 559d2516e0a..4999aba895d 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -1593,7 +1593,7 @@ function dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $di $url .= '?dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup='.urlencode($name); } - $out .= ''; + $out = ''; $backtopagejsfieldsid = ''; $backtopagejsfieldslabel = ''; if ($backtopagejsfields) { diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index f81fc3ae482..d48402ab0fb 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -770,7 +770,7 @@ function print_left_eldy_menu($db, $menu_array_before, $menu_array_after, &$tabM * Menu COMPTA-FINANCIAL */ if ($mainmenu == 'accountancy') { - get_left_menu_accountancy($mainmenu, $newmenu, $usemenuhider, $leftmenu, $type_user, $db); + get_left_menu_accountancy($mainmenu, $newmenu, $usemenuhider, $leftmenu, $type_user); } /* diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php index bafe606b4e8..b780cbde926 100644 --- a/htdocs/fourn/class/fournisseur.commande.class.php +++ b/htdocs/fourn/class/fournisseur.commande.class.php @@ -3491,6 +3491,8 @@ class CommandeFournisseur extends CommonOrder { $this->receptions = array(); + dol_syslog(get_class($this)."::loadReceptions", LOG_DEBUG); + $sql = 'SELECT cd.rowid, cd.fk_product,'; $sql .= ' sum(cfd.qty) as qty'; $sql .= ' FROM '.MAIN_DB_PREFIX.'commande_fournisseur_dispatch as cfd,'; @@ -3512,14 +3514,12 @@ class CommandeFournisseur extends CommonOrder } $sql .= ' GROUP BY cd.rowid, cd.fk_product'; - - dol_syslog(get_class($this)."::loadReceptions", LOG_DEBUG); - $result = $this->db->query($sql); - if ($result) { - $num = $this->db->num_rows($result); + $resql = $this->db->query($sql); + if ($resql) { + $num = $this->db->num_rows($resql); $i = 0; while ($i < $num) { - $obj = $this->db->fetch_object($result); + $obj = $this->db->fetch_object($resql); empty($this->receptions[$obj->rowid]) ? $this->receptions[$obj->rowid] = $obj->qty : $this->receptions[$obj->rowid] += $obj->qty; $i++; } diff --git a/htdocs/recruitment/recruitmentcandidature_list.php b/htdocs/recruitment/recruitmentcandidature_list.php index 2f3c73c16c4..4ce262c8c92 100644 --- a/htdocs/recruitment/recruitmentcandidature_list.php +++ b/htdocs/recruitment/recruitmentcandidature_list.php @@ -450,7 +450,7 @@ if ($jobposition->id > 0 && (empty($action) || ($action != 'edit' && $action != $morehtmlref .= '
    '; $morehtmlref .= ''; $morehtmlref .= ''; - $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1); + $morehtmlref .= $formproject->select_projects(0, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1); $morehtmlref .= ''; $morehtmlref .= '
    '; } else { From 180d94b43c93a5d165f6d7a9d326e84ad9aa8fa3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 17 May 2022 20:31:50 +0200 Subject: [PATCH 560/738] More log --- htdocs/website/index.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/website/index.php b/htdocs/website/index.php index 0e192ff0212..b7062b4f599 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -2741,6 +2741,7 @@ if (!GETPOST('hide_websitemenu')) { $htmltext .= '

    '; } if (!empty($conf->global->WEBSITE_REPLACE_INFO_ABOUT_USAGE_WITH_WEBSERVER)) { + $htmltext .= ''; $htmltext .= '
    '.$langs->trans($conf->global->WEBSITE_REPLACE_INFO_ABOUT_USAGE_WITH_WEBSERVER); } else { $htmltext .= $langs->trans("SetHereVirtualHost", $dataroot); From 2f959306f78f3c3119a1c9ec9154774eb46915d6 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Tue, 17 May 2022 22:50:42 +0200 Subject: [PATCH 561/738] fix travis --- htdocs/install/mysql/migration/15.0.0-16.0.0.sql | 2 -- htdocs/install/mysql/tables/llx_fichinter.sql | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/htdocs/install/mysql/migration/15.0.0-16.0.0.sql b/htdocs/install/mysql/migration/15.0.0-16.0.0.sql index 8b00bee9b3c..6288a6a2e3a 100644 --- a/htdocs/install/mysql/migration/15.0.0-16.0.0.sql +++ b/htdocs/install/mysql/migration/15.0.0-16.0.0.sql @@ -362,5 +362,3 @@ ALTER TABLE llx_c_email_template ADD COLUMN email_tocc varchar(255); ALTER TABLE llx_c_email_template ADD COLUMN email_tobcc varchar(255); ALTER TABLE llx_fichinter ADD COLUMN ref_client varchar(255) after ref_ext; - - diff --git a/htdocs/install/mysql/tables/llx_fichinter.sql b/htdocs/install/mysql/tables/llx_fichinter.sql index 999dd55b7f3..b9f9008f202 100644 --- a/htdocs/install/mysql/tables/llx_fichinter.sql +++ b/htdocs/install/mysql/tables/llx_fichinter.sql @@ -25,7 +25,7 @@ create table llx_fichinter fk_contrat integer DEFAULT 0, -- contrat auquel est rattache la fiche ref varchar(30) NOT NULL, -- number ref_ext varchar(255), - ref_client varchar(255), -- customer intervention number + ref_client varchar(255), -- customer intervention number entity integer DEFAULT 1 NOT NULL, -- multi company id tms timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, datec datetime, -- date de creation From c47578943327436113ba4ef8137888b578500f69 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 17 May 2022 23:23:50 +0200 Subject: [PATCH 562/738] Debug v16 --- htdocs/comm/propal/list.php | 4 ++-- htdocs/commande/list.php | 4 ++-- htdocs/compta/bank/list.php | 12 ++++++------ htdocs/compta/bank/various_payment/list.php | 6 +++--- htdocs/contrat/index.php | 10 +++++----- htdocs/fourn/commande/list.php | 2 +- htdocs/fourn/paiement/list.php | 8 ++++---- .../class/knowledgerecord.class.php | 4 ++-- htdocs/knowledgemanagement/knowledgerecord_list.php | 2 +- htdocs/modulebuilder/template/myobject_list.php | 2 +- htdocs/societe/list.php | 8 ++++---- htdocs/supplier_proposal/list.php | 4 ++-- htdocs/ticket/list.php | 2 +- 13 files changed, 34 insertions(+), 34 deletions(-) diff --git a/htdocs/comm/propal/list.php b/htdocs/comm/propal/list.php index 0056716972b..43f369faef2 100644 --- a/htdocs/comm/propal/list.php +++ b/htdocs/comm/propal/list.php @@ -765,12 +765,12 @@ if ($resql) { if ($socid > 0) { $soc = new Societe($db); $soc->fetch($socid); - $title = $langs->trans('ListOfProposals').' - '.$soc->name; + $title = $langs->trans('Proposals').' - '.$soc->name; if (empty($search_societe)) { $search_societe = $soc->name; } } else { - $title = $langs->trans('ListOfProposals'); + $title = $langs->trans('Proposals'); } $num = $db->num_rows($resql); diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index 5a85038bddc..b047c413b6c 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -1015,12 +1015,12 @@ if ($resql) { if ($socid > 0) { $soc = new Societe($db); $soc->fetch($socid); - $title = $langs->trans('ListOfOrders').' - '.$soc->name; + $title = $langs->trans('CustomersOrders').' - '.$soc->name; if (empty($search_company)) { $search_company = $soc->name; } } else { - $title = $langs->trans('ListOfOrders'); + $title = $langs->trans('CustomersOrders'); } if (strval($search_status) == '0') { $title .= ' - '.$langs->trans('StatusOrderDraftShort'); diff --git a/htdocs/compta/bank/list.php b/htdocs/compta/bank/list.php index 19b47430fad..90bc79483bf 100644 --- a/htdocs/compta/bank/list.php +++ b/htdocs/compta/bank/list.php @@ -534,7 +534,7 @@ foreach ($accounts as $key => $type) { // Ref if (!empty($arrayfields['b.ref']['checked'])) { - print ''.$objecttmp->getNomUrl(1).''; + print ''.$objecttmp->getNomUrl(1).''; if (!$i) { $totalarray['nbfield']++; } @@ -586,7 +586,7 @@ foreach ($accounts as $key => $type) { // Accountancy journal if (!empty($arrayfields['b.fk_accountancy_journal']['checked'])) { - print ''; + print ''; if (!empty($conf->accounting->enabled)) { if (empty($objecttmp->fk_accountancy_journal)) { print img_warning($langs->trans("Mandatory")); @@ -606,7 +606,7 @@ foreach ($accounts as $key => $type) { // Currency if (!empty($arrayfields['b.currency_code']['checked'])) { - print ''; + print ''; print $objecttmp->currency_code; print ''; if (!$i) { @@ -616,7 +616,7 @@ foreach ($accounts as $key => $type) { // Transactions to reconcile if (!empty($arrayfields['toreconcile']['checked'])) { - print ''; + print ''; $conciliate = $objecttmp->canBeConciliated(); if ($conciliate == -2) { @@ -663,7 +663,7 @@ foreach ($accounts as $key => $type) { print $hookmanager->resPrint; // Date creation if (!empty($arrayfields['b.datec']['checked'])) { - print ''; + print ''; print dol_print_date($objecttmp->date_creation, 'dayhour'); print ''; if (!$i) { @@ -672,7 +672,7 @@ foreach ($accounts as $key => $type) { } // Date modification if (!empty($arrayfields['b.tms']['checked'])) { - print ''; + print ''; print dol_print_date($objecttmp->date_update, 'dayhour'); print ''; if (!$i) { diff --git a/htdocs/compta/bank/various_payment/list.php b/htdocs/compta/bank/various_payment/list.php index bbec4f23fc6..4d0c9eb19c5 100644 --- a/htdocs/compta/bank/various_payment/list.php +++ b/htdocs/compta/bank/various_payment/list.php @@ -535,7 +535,7 @@ if ($result) { $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; - print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'maxwidthsearch '); + print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'maxwidthsearch center '); print ''; @@ -652,7 +652,7 @@ if ($result) { if ($arrayfields['account']['checked']) { $accountingaccount->fetch('', $obj->accountancy_code, 1); - print ''.$accountingaccount->getNomUrl(0, 1, 1, '', 1).''; + print ''.$accountingaccount->getNomUrl(0, 1, 1, '', 1).''; if (!$i) { $totalarray['nbfield']++; } @@ -660,7 +660,7 @@ if ($result) { // Accounting subledger account if ($arrayfields['subledger']['checked']) { - print ''.length_accounta($obj->subledger_account).''; + print ''.length_accounta($obj->subledger_account).''; if (!$i) { $totalarray['nbfield']++; } diff --git a/htdocs/contrat/index.php b/htdocs/contrat/index.php index 99739260b36..b3ed6191535 100644 --- a/htdocs/contrat/index.php +++ b/htdocs/contrat/index.php @@ -356,12 +356,12 @@ if ($result) { print img_warning($langs->trans("Late")); } print ''; - print ''; + print ''; $staticcompany->id = $obj->socid; $staticcompany->name = $obj->name; print $staticcompany->getNomUrl(1, '', 20); print ''; - print ''.dol_print_date($db->jdate($obj->tms), 'dayhour').''; + print ''.dol_print_date($db->jdate($obj->tms), 'dayhour').''; //print ''.$staticcontrat->LibStatut($obj->statut,2).''; print ''.($obj->nb_initial > 0 ? ''.$obj->nb_initial.''.$staticcontratligne->LibStatut(0, 3, -1, 'class="paddingleft"') : '').''; print ''.($obj->nb_running > 0 ? ''.$obj->nb_running.''.$staticcontratligne->LibStatut(4, 3, 0, 'class="marginleft"') : '').''; @@ -439,7 +439,7 @@ if ($resql) { } } print ''; - print ''; + print ''; $staticcompany->id = $obj->fk_soc; $staticcompany->name = $obj->name; print $staticcompany->getNomUrl(1, '', 20); @@ -521,7 +521,7 @@ if ($resql) { } } print ''; - print ''; + print ''; $staticcompany->id = $obj->fk_soc; $staticcompany->name = $obj->name; print $staticcompany->getNomUrl(1, '', 20); @@ -603,7 +603,7 @@ if ($resql) { } } print ''; - print ''; + print ''; $staticcompany->id = $obj->fk_soc; $staticcompany->name = $obj->name; print $staticcompany->getNomUrl(1, '', 20); diff --git a/htdocs/fourn/commande/list.php b/htdocs/fourn/commande/list.php index 98df5e11170..3551ab27856 100644 --- a/htdocs/fourn/commande/list.php +++ b/htdocs/fourn/commande/list.php @@ -711,7 +711,7 @@ $formorder = new FormOrder($db); $formother = new FormOther($db); $formcompany = new FormCompany($db); -$title = $langs->trans("ListOfSupplierOrders"); +$title = $langs->trans("SuppliersOrders"); if ($socid > 0) { $fourn = new Fournisseur($db); $fourn->fetch($socid); diff --git a/htdocs/fourn/paiement/list.php b/htdocs/fourn/paiement/list.php index 0f8f9050755..13812e3595f 100644 --- a/htdocs/fourn/paiement/list.php +++ b/htdocs/fourn/paiement/list.php @@ -485,7 +485,7 @@ while ($i < min($num, $limit)) { // No if (!empty($conf->global->MAIN_VIEW_LINE_NUMBER_IN_LIST)) { - print ''.(($offset * $limit) + $i).''; + print ''.(($offset * $limit) + $i).''; if (!$i) { $totalarray['nbfield']++; } @@ -493,7 +493,7 @@ while ($i < min($num, $limit)) { // Ref if (!empty($arrayfields['p.ref']['checked'])) { - print ''.$paymentfournstatic->getNomUrl(1).''; + print ''.$paymentfournstatic->getNomUrl(1).''; if (!$i) { $totalarray['nbfield']++; } @@ -510,7 +510,7 @@ while ($i < min($num, $limit)) { // Thirdparty if (!empty($arrayfields['s.nom']['checked'])) { - print ''; + print ''; if ($objp->socid > 0) { print $companystatic->getNomUrl(1, '', 24); } @@ -539,7 +539,7 @@ while ($i < min($num, $limit)) { // Bank account if (!empty($arrayfields['ba.label']['checked'])) { - print ''; + print ''; if ($objp->bid) { $accountstatic->id = $objp->bid; $accountstatic->ref = $objp->bref; diff --git a/htdocs/knowledgemanagement/class/knowledgerecord.class.php b/htdocs/knowledgemanagement/class/knowledgerecord.class.php index a2f03a64e41..590b31263e2 100644 --- a/htdocs/knowledgemanagement/class/knowledgerecord.class.php +++ b/htdocs/knowledgemanagement/class/knowledgerecord.class.php @@ -101,10 +101,10 @@ class KnowledgeRecord extends CommonObject */ public $fields=array( 'rowid' => array('type'=>'integer', 'label'=>'TechnicalID', 'enabled'=>'1', 'position'=>1, 'notnull'=>1, 'visible'=>0, 'noteditable'=>'1', 'index'=>1, 'css'=>'left', 'comment'=>"Id"), - 'ref' => array('type'=>'varchar(128)', 'label'=>'Ref', 'enabled'=>'1', 'position'=>10, 'notnull'=>1, 'default'=>'(PROV)', 'visible'=>5, 'index'=>1, 'searchall'=>1, 'comment'=>"Reference of object", "showoncombobox"=>1), + 'ref' => array('type'=>'varchar(128)', 'label'=>'Ref', 'enabled'=>'1', 'position'=>10, 'notnull'=>1, 'default'=>'(PROV)', 'visible'=>5, 'index'=>1, 'searchall'=>1, 'comment'=>"Reference of object", "csslist"=>"nowraponall", "showoncombobox"=>1), 'entity' =>array('type'=>'integer', 'label'=>'Entity', 'default'=>1, 'enabled'=>1, 'visible'=>0, 'notnull'=>1, 'position'=>20, 'index'=>1), 'question' => array('type'=>'text', 'label'=>'Question', 'enabled'=>'1', 'position'=>30, 'notnull'=>1, 'visible'=>1, 'csslist'=>'tdoverflowmax300', 'copytoclipboard'=>1, 'tdcss'=>'titlefieldcreate nowraponall'), - 'lang' => array('type'=>'varchar(6)', 'label'=>'Language', 'enabled'=>'1', 'position'=>40, 'notnull'=>0, 'visible'=>1, 'tdcss'=>'titlefieldcreate nowraponall'), + 'lang' => array('type'=>'varchar(6)', 'label'=>'Language', 'enabled'=>'1', 'position'=>40, 'notnull'=>0, 'visible'=>1, 'tdcss'=>'titlefieldcreate nowraponall', "csslist"=>"tdoverflowmax100"), 'answer' => array('type'=>'html', 'label'=>'Solution', 'enabled'=>'1', 'position'=>50, 'notnull'=>0, 'visible'=>3, 'csslist'=>'tdoverflowmax300', 'copytoclipboard'=>1, 'tdcss'=>'titlefieldcreate nowraponall'), 'date_creation' => array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>'1', 'position'=>500, 'notnull'=>1, 'visible'=>-2,), 'tms' => array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>'1', 'position'=>501, 'notnull'=>0, 'visible'=>2,), diff --git a/htdocs/knowledgemanagement/knowledgerecord_list.php b/htdocs/knowledgemanagement/knowledgerecord_list.php index feadd8d9800..1e93abd31e9 100644 --- a/htdocs/knowledgemanagement/knowledgerecord_list.php +++ b/htdocs/knowledgemanagement/knowledgerecord_list.php @@ -222,7 +222,7 @@ $now = dol_now(); //$help_url="EN:Module_KnowledgeRecord|FR:Module_KnowledgeRecord_FR|ES:Módulo_KnowledgeRecord"; $help_url = ''; -$title = $langs->trans('ListKnowledgeRecord'); +$title = $langs->trans('KnowledgeRecords'); $morejs = array(); $morecss = array(); diff --git a/htdocs/modulebuilder/template/myobject_list.php b/htdocs/modulebuilder/template/myobject_list.php index 050c99bfed0..5803b8c94aa 100644 --- a/htdocs/modulebuilder/template/myobject_list.php +++ b/htdocs/modulebuilder/template/myobject_list.php @@ -259,7 +259,7 @@ $now = dol_now(); //$help_url = "EN:Module_MyObject|FR:Module_MyObject_FR|ES:Módulo_MyObject"; $help_url = ''; -$title = $langs->trans('ListOf', $langs->transnoentitiesnoconv("MyObjects")); +$title = $langs->trans("MyObjects"); $morejs = array(); $morecss = array(); diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php index 5884679950f..563add49938 100644 --- a/htdocs/societe/list.php +++ b/htdocs/societe/list.php @@ -420,15 +420,15 @@ $prospectstatic->client = 2; $prospectstatic->loadCacheOfProspStatus(); -$title = $langs->trans("ListOfThirdParties"); +$title = $langs->trans("ThirdParties"); if ($type == 'c' && (empty($search_type) || ($search_type == '1,3'))) { - $title = $langs->trans("ListOfCustomers"); + $title = $langs->trans("Customers"); } if ($type == 'p' && (empty($search_type) || ($search_type == '2,3'))) { - $title = $langs->trans("ListOfProspects"); + $title = $langs->trans("Prospects"); } if ($type == 'f' && (empty($search_type) || ($search_type == '4'))) { - $title = $langs->trans("ListOfSuppliers"); + $title = $langs->trans("Suppliers"); } // Select every potentiels, and note each potentiels which fit in search parameters diff --git a/htdocs/supplier_proposal/list.php b/htdocs/supplier_proposal/list.php index 55fdaf6f413..a0e404dbd89 100644 --- a/htdocs/supplier_proposal/list.php +++ b/htdocs/supplier_proposal/list.php @@ -448,9 +448,9 @@ if ($resql) { if ($socid > 0) { $soc = new Societe($db); $soc->fetch($socid); - $title = $langs->trans('ListOfSupplierProposals').' - '.$soc->name; + $title = $langs->trans('SupplierProposals').' - '.$soc->name; } else { - $title = $langs->trans('ListOfSupplierProposals'); + $title = $langs->trans('SupplierProposals'); } $num = $db->num_rows($resql); diff --git a/htdocs/ticket/list.php b/htdocs/ticket/list.php index a8314c4bf89..4eaadb3fc74 100644 --- a/htdocs/ticket/list.php +++ b/htdocs/ticket/list.php @@ -333,7 +333,7 @@ $user_temp = new User($db); $socstatic = new Societe($db); $help_url = ''; -$title = $langs->trans('TicketList'); +$title = $langs->trans('Tickets'); $morejs = array(); $morecss = array(); From 68b25b35b445254f11e08da1aae40a90cfc4a1c2 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 17 May 2022 23:53:36 +0200 Subject: [PATCH 563/738] Look and feel v16 --- htdocs/comm/index.php | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/htdocs/comm/index.php b/htdocs/comm/index.php index dafc1e7ee16..5903b7e4bdb 100644 --- a/htdocs/comm/index.php +++ b/htdocs/comm/index.php @@ -634,7 +634,11 @@ if (!empty($conf->societe->enabled) && $user->rights->societe->lire) { print $s; print ''; - print ''.dol_print_date($db->jdate($objp->tms), 'day').''; + + $datem = $db->jdate($objp->tms); + print ''; + print dol_print_date($datem, 'day', 'tzuserrel'); + print ''; print ''; $i++; @@ -725,7 +729,11 @@ if (((!empty($conf->fournisseur->enabled) && empty($conf->global->MAIN_USE_NEW_S print $s; print ''; - print ''.dol_print_date($db->jdate($objp->dm), 'day').''; + + $datem = $db->jdate($objp->dm); + print ''; + print dol_print_date($datem, 'day', 'tzuserrel'); + print ''; print ''; $i++; @@ -922,7 +930,10 @@ if (!empty($conf->propal->enabled) && $user->rights->propal->lire) { print ''; print ''.$companystatic->getNomUrl(1, 'customer', 44).''; - print ''.dol_print_date($db->jdate($obj->dp), 'day').''; + $datem = $db->jdate($obj->dp); + print ''; + print dol_print_date($datem, 'day', 'tzserver'); + print ''; print ''.price(!empty($conf->global->MAIN_DASHBOARD_USE_TOTAL_HT) ? $obj->total_ht : $obj->total_ttc).''; print ''.$propalstatic->LibStatut($obj->fk_statut, 3).''; @@ -1039,7 +1050,11 @@ if (!empty($conf->commande->enabled) && $user->rights->commande->lire) { print ''; print ''.$companystatic->getNomUrl(1, 'customer', 44).''; - print ''.dol_print_date($db->jdate($obj->dv), 'day').''; + $datem = $db->jdate($obj->dv); + print ''; + print dol_print_date($datem, 'day', 'tzserver'); + print ''; + print ''.price(!empty($conf->global->MAIN_DASHBOARD_USE_TOTAL_HT) ? $obj->total_ht : $obj->total_ttc).''; print ''.$orderstatic->LibStatut($obj->fk_statut, $obj->billed, 3).''; From 2e15a14c140b887b9bf459837ad9dae8047d4786 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 18 May 2022 00:10:44 +0200 Subject: [PATCH 564/738] css --- htdocs/commande/card.php | 8 ++++---- htdocs/core/class/html.form.class.php | 16 +++++++++------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index b1d0cdb9223..f1423ffa12b 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -1733,10 +1733,10 @@ if ($action == 'create' && $usercancreate) { $form->selectAvailabilityDelay($availability_id, 'availability_id', '', 1, 'maxwidth200 widthcentpercentminusx'); print ''; - // Terms of the settlement + // Terms of payment print ''.$langs->trans('PaymentConditionsShort').''; - print img_picto('', 'paiment', 'class="pictofixedwidth"'); - $form->select_conditions_paiements($cond_reglement_id, 'cond_reglement_id', 1, 1, 0, '', $deposit_percent); + print img_picto('', 'payment', 'class="pictofixedwidth"'); + $form->select_conditions_paiements($cond_reglement_id, 'cond_reglement_id', 1, 1, 0, 'maxwidth200 widthcentpercentminusx', $deposit_percent); print ''; // Payment mode @@ -1836,7 +1836,7 @@ if ($action == 'create' && $usercancreate) { print ''; print ''.$form->editfieldkey("Currency", 'multicurrency_code', '', $object, 0).''; print ''; - print img_picto('', 'currency', 'class="pictofixedwidth"').$form->selectMultiCurrency($currency_code, 'multicurrency_code'); + print img_picto('', 'currency', 'class="pictofixedwidth"').$form->selectMultiCurrency($currency_code, 'multicurrency_code', 0, '', false, 'maxwidth200 widthcentpercentminusx'); print ''; } diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index f1a93868809..81fbb83b264 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -5883,14 +5883,16 @@ class Form /** * Return array of currencies in user language * - * @param string $selected preselected currency code - * @param string $htmlname name of HTML select list - * @param integer $useempty 1=Add empty line - * @param string $filter Optional filters criteras (example: 'code <> x', ' in (1,3)') - * @param bool $excludeConfCurrency false = If company current currency not in table, we add it into list. Should always be available. true = we are in currency_rate update , we don't want to see conf->currency in select + * @param string $selected Preselected currency code + * @param string $htmlname Name of HTML select list + * @param integer $useempty 1=Add empty line + * @param string $filter Optional filters criteras (example: 'code <> x', ' in (1,3)') + * @param bool $excludeConfCurrency false = If company current currency not in table, we add it into list. Should always be available. + * true = we are in currency_rate update , we don't want to see conf->currency in select + * @param string $morecss More css * @return string */ - public function selectMultiCurrency($selected = '', $htmlname = 'multicurrency_code', $useempty = 0, $filter = '', $excludeConfCurrency = false) + public function selectMultiCurrency($selected = '', $htmlname = 'multicurrency_code', $useempty = 0, $filter = '', $excludeConfCurrency = false, $morecss = '') { global $conf, $langs; @@ -5911,7 +5913,7 @@ class Form } $out = ''; - $out .= ''; if ($useempty) { $out .= ''; } From 7de1fe864626311b454cfd3763a19701fffbd776 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 18 May 2022 00:17:46 +0200 Subject: [PATCH 565/738] Look and feel v16 --- htdocs/projet/index.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/htdocs/projet/index.php b/htdocs/projet/index.php index 51e78f23d57..b519f298ecc 100644 --- a/htdocs/projet/index.php +++ b/htdocs/projet/index.php @@ -288,7 +288,10 @@ if ($resql) { print ''; // Date - print ''.dol_print_date($db->jdate($obj->datem), 'day').''; + $datem = $db->jdate($obj->datem); + print ''; + print dol_print_date($datem, 'day', 'tzuserrel'); + print ''; // Status print ''.$projectstatic->LibStatut($obj->status, 3).''; From 1a0e416c1a24c5a08e34f82067abd8e6b9223d64 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 18 May 2022 00:51:20 +0200 Subject: [PATCH 566/738] WIP --- htdocs/core/lib/functions.lib.php | 2 +- htdocs/projet/card.php | 2 +- htdocs/societe/card.php | 10 ++++++++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 4999aba895d..e6852cdde03 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -1628,7 +1628,7 @@ function dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $di close: function (event, ui) { returnedid = jQuery("#varforreturndialogid'.$name.'").text(); returnedlabel = jQuery("#varforreturndialoglabel'.$name.'").text(); - console.log("popup has been closed. returnedid="+returnedid+" returnedlabel="+returnedlabel); + console.log("popup has been closed. returnedid (js var defined into parent page)="+returnedid+" returnedlabel="+returnedlabel); if (returnedid != "" && returnedid != "div for returned id") { jQuery("#'.(empty($backtopagejsfieldsid)?"none":$backtopagejsfieldsid).'").val(returnedid); } diff --git a/htdocs/projet/card.php b/htdocs/projet/card.php index df50f0703e0..98e0bd099fc 100644 --- a/htdocs/projet/card.php +++ b/htdocs/projet/card.php @@ -619,7 +619,7 @@ if ($action == 'create' && $user->rights->projet->creer) { if (!GETPOSTISSET('backtopage')) { $url = '/societe/card.php?action=create&client=3&fournisseur=0&backtopage='.urlencode($_SERVER["PHP_SELF"].'?action=create'); $newbutton = ''; - // TODO @LDR Impletment this + // TODO @LDR Implement this //$tmpbacktopagejsfields = 'socid:search_socid'; //print dolButtonToOpenUrlInDialogPopup('addthirdparty', $langs->transnoentitiesnoconv('AddThirdParty'), $newbutton, $url, '', '', $tmpbacktopagejsfields); print ' '.$newbutton.''; diff --git a/htdocs/societe/card.php b/htdocs/societe/card.php index cbb8de3cf28..d29870b413e 100644 --- a/htdocs/societe/card.php +++ b/htdocs/societe/card.php @@ -704,8 +704,14 @@ if (empty($reshook)) { $url = DOL_URL_ROOT."/fourn/card.php?socid=".$object->id; } - header("Location: ".$url); - exit; + // TODO @LDR + if ($dol_openinpopup && $backtopagejsfields) { + print 'TODO Set js var of parent with id, then close popup.'; + exit; + } else { + header("Location: ".$url); + exit; + } } } else { $db->rollback(); From ed2e1bda46099dc306631f213e1078482683a6ff Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 18 May 2022 11:00:43 +0200 Subject: [PATCH 567/738] Clean code v16 --- htdocs/admin/expensereport_ik.php | 13 +- htdocs/admin/expensereport_rules.php | 48 +- .../bank/class/paymentvarious.class.php | 2 +- .../deplacement/class/deplacement.class.php | 2 +- .../facture/class/facture-rec.class.php | 2 +- htdocs/compta/facture/class/facture.class.php | 2 +- .../facture/class/facturestats.class.php | 2 +- .../facture/class/paymentterm.class.php | 2 +- .../sociales/class/chargesociales.class.php | 2 +- .../class/paymentsocialcontribution.class.php | 2 +- htdocs/core/class/coreobject.class.php | 413 ------------------ htdocs/core/customreports.php | 2 +- htdocs/core/db/sqlite3.class.php | 2 +- .../expedition/doc/pdf_espadon.modules.php | 2 +- .../class/expensereport_ik.class.php | 71 ++- .../class/expensereport_rule.class.php | 75 +++- 16 files changed, 183 insertions(+), 459 deletions(-) delete mode 100644 htdocs/core/class/coreobject.class.php diff --git a/htdocs/admin/expensereport_ik.php b/htdocs/admin/expensereport_ik.php index 900754ef4b4..10b14f8ee99 100644 --- a/htdocs/admin/expensereport_ik.php +++ b/htdocs/admin/expensereport_ik.php @@ -36,10 +36,10 @@ $langs->loadLangs(array("admin", "trips", "errors", "other", "dict")); $error = 0; $action = GETPOST('action', 'aZ09'); + $id = GETPOST('id', 'int'); $ikoffset = GETPOST('ikoffset', 'int'); $coef = GETPOST('coef', 'int'); - $fk_c_exp_tax_cat = GETPOST('fk_c_exp_tax_cat'); $fk_range = GETPOST('fk_range', 'int'); @@ -62,9 +62,16 @@ if ($action == 'updateik') { } } - $expIk->setValues($_POST); - $result = $expIk->create($user); + $expIk->coef = $coef; + $expIk->ikoffset = $ikoffset; + $expIk->fk_c_exp_tax_cat = $fk_c_exp_tax_cat; + $expIk->fk_range = $fk_range; + if ($expIk->id > 0) { + $result = $expIk->update($user); + } else { + $result = $expIk->create($user); + } if ($result > 0) { setEventMessages('SetupSaved', null, 'mesgs'); diff --git a/htdocs/admin/expensereport_rules.php b/htdocs/admin/expensereport_rules.php index 62fb097841b..7c27ee6e408 100644 --- a/htdocs/admin/expensereport_rules.php +++ b/htdocs/admin/expensereport_rules.php @@ -34,13 +34,19 @@ require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport_rule.class.ph // Load translation files required by the page $langs->loadLangs(array("admin", "other", "trips", "errors", "dict")); +// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context +$hookmanager->initHooks(array('admin', 'dictionaryadmin','expensereport_rules')); + +$object = new ExpenseReportRule($db); + if (!$user->admin) { accessforbidden(); } -// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context -$hookmanager->initHooks(array('admin', 'dictionaryadmin','expensereport_rules')); +/* + * Action + */ $parameters = array(); $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks @@ -51,7 +57,6 @@ if ($reshook < 0) { if (empty($reshook)) { //Init error $error = false; - $message = false; $action = GETPOST('action', 'aZ09'); $id = GETPOST('id', 'int'); @@ -59,21 +64,20 @@ if (empty($reshook)) { $apply_to = GETPOST('apply_to'); $fk_user = GETPOST('fk_user', 'int'); $fk_usergroup = GETPOST('fk_usergroup', 'int'); - - $fk_c_type_fees = GETPOST('fk_c_type_fees'); + $restrictive = GETPOST('restrictive', 'int'); + $fk_c_type_fees = GETPOST('fk_c_type_fees', 'int'); $code_expense_rules_type = GETPOST('code_expense_rules_type'); $dates = dol_mktime(12, 0, 0, GETPOST('startmonth'), GETPOST('startday'), GETPOST('startyear')); $datee = dol_mktime(12, 0, 0, GETPOST('endmonth'), GETPOST('endday'), GETPOST('endyear')); - $amount = GETPOST('amount'); + $amount = price2num(GETPOST('amount'), 'MT', 2); - $object = new ExpenseReportRule($db); if (!empty($id)) { $result = $object->fetch($id); if ($result < 0) { dol_print_error('', $object->error, $object->errors); } } - // TODO do action + if ($action == 'save') { $error = 0; @@ -104,8 +108,6 @@ if (empty($reshook)) { } if (empty($error)) { - $object->setValues($_POST); - if ($apply_to == 'U') { $object->fk_user = (int) $fk_user; $object->fk_usergroup = 0; @@ -122,18 +124,30 @@ if (empty($reshook)) { $object->dates = $dates; $object->datee = $datee; - + $object->restrictive = $restrictive; + $object->fk_c_type_fees = $fk_c_type_fees; + $object->code_expense_rules_type = $code_expense_rules_type; + $object->amount = $amount; $object->entity = $conf->entity; - $res = $object->create($user); + if ($object->id > 0) { + $res = $object->update($user); + } else { + $res = $object->create($user); + } if ($res > 0) { setEventMessages($langs->trans('ExpenseReportRuleSave'), null); } else { dol_print_error($object->db); + $error++; } - header('Location: ' . $_SERVER['PHP_SELF']); - exit; + if (!$error) { + header('Location: ' . $_SERVER['PHP_SELF']); + exit; + } else { + $action = ''; + } } } elseif ($action == 'delete') { // TODO add confirm @@ -207,7 +221,7 @@ if ($action != 'edit') { echo '' . $form->selectarray('code_expense_rules_type', $tab_rules_type, '', 0) . ''; echo '' . $form->selectDate(strtotime(date('Y-m-01', dol_now())), 'start', '', '', 0, '', 1, 0) . ''; echo ' ' . $conf->currency . ''; + echo ''; echo '' . $form->selectyesno('restrictive', 0, 1) . ''; echo ''; echo ''; @@ -304,10 +318,10 @@ foreach ($rules as $rule) { } echo ''; - + // Amount echo ''; if ($action == 'edit' && $object->id == $rule->id) { - echo '' . $conf->currency; + echo ''; } else { echo price($rule->amount, 0, $langs, 1, -1, -1, $conf->currency); } diff --git a/htdocs/compta/bank/class/paymentvarious.class.php b/htdocs/compta/bank/class/paymentvarious.class.php index cdcd26490a3..77aded9c594 100644 --- a/htdocs/compta/bank/class/paymentvarious.class.php +++ b/htdocs/compta/bank/class/paymentvarious.class.php @@ -165,7 +165,7 @@ class PaymentVarious extends CommonObject * * @param DoliDB $db Database handler */ - public function __construct($db) + public function __construct(DoliDB $db) { $this->db = $db; $this->element = 'payment_various'; diff --git a/htdocs/compta/deplacement/class/deplacement.class.php b/htdocs/compta/deplacement/class/deplacement.class.php index e05750918da..c09943540bc 100644 --- a/htdocs/compta/deplacement/class/deplacement.class.php +++ b/htdocs/compta/deplacement/class/deplacement.class.php @@ -121,7 +121,7 @@ class Deplacement extends CommonObject * * @param DoliDB $db Database handler */ - public function __construct($db) + public function __construct(DoliDB $db) { $this->db = $db; diff --git a/htdocs/compta/facture/class/facture-rec.class.php b/htdocs/compta/facture/class/facture-rec.class.php index a406a48c7f6..af6d4dc606b 100644 --- a/htdocs/compta/facture/class/facture-rec.class.php +++ b/htdocs/compta/facture/class/facture-rec.class.php @@ -222,7 +222,7 @@ class FactureRec extends CommonInvoice * * @param DoliDB $db Database handler */ - public function __construct($db) + public function __construct(DoliDB $db) { $this->db = $db; } diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index a5cb99c2260..e971262208c 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -428,7 +428,7 @@ class Facture extends CommonInvoice * * @param DoliDB $db Database handler */ - public function __construct($db) + public function __construct(DoliDB $db) { $this->db = $db; } diff --git a/htdocs/compta/facture/class/facturestats.class.php b/htdocs/compta/facture/class/facturestats.class.php index a54cd1a6668..522fe9aa2e2 100644 --- a/htdocs/compta/facture/class/facturestats.class.php +++ b/htdocs/compta/facture/class/facturestats.class.php @@ -57,7 +57,7 @@ class FactureStats extends Stats * @param int $typentid Id typent of thirdpary for filter * @param int $categid Id category of thirdpary for filter */ - public function __construct($db, $socid, $mode, $userid = 0, $typentid = 0, $categid = 0) + public function __construct(DoliDB $db, $socid, $mode, $userid = 0, $typentid = 0, $categid = 0) { global $user, $conf; diff --git a/htdocs/compta/facture/class/paymentterm.class.php b/htdocs/compta/facture/class/paymentterm.class.php index f94ad573a81..a4441804570 100644 --- a/htdocs/compta/facture/class/paymentterm.class.php +++ b/htdocs/compta/facture/class/paymentterm.class.php @@ -68,7 +68,7 @@ class PaymentTerm // extends CommonObject * * @param DoliDB $db Database handler */ - public function __construct($db) + public function __construct(DoliDB $db) { $this->db = $db; } diff --git a/htdocs/compta/sociales/class/chargesociales.class.php b/htdocs/compta/sociales/class/chargesociales.class.php index 6996c689922..70d8da4c27b 100644 --- a/htdocs/compta/sociales/class/chargesociales.class.php +++ b/htdocs/compta/sociales/class/chargesociales.class.php @@ -123,7 +123,7 @@ class ChargeSociales extends CommonObject * * @param DoliDB $db Database handler */ - public function __construct($db) + public function __construct(DoliDB $db) { $this->db = $db; } diff --git a/htdocs/compta/sociales/class/paymentsocialcontribution.class.php b/htdocs/compta/sociales/class/paymentsocialcontribution.class.php index 9a4b50e3474..b6a611a47ee 100644 --- a/htdocs/compta/sociales/class/paymentsocialcontribution.class.php +++ b/htdocs/compta/sociales/class/paymentsocialcontribution.class.php @@ -105,7 +105,7 @@ class PaymentSocialContribution extends CommonObject * * @param DoliDB $db Database handler */ - public function __construct($db) + public function __construct(DoliDB $db) { $this->db = $db; } diff --git a/htdocs/core/class/coreobject.class.php b/htdocs/core/class/coreobject.class.php deleted file mode 100644 index 1bb4e92a0c9..00000000000 --- a/htdocs/core/class/coreobject.class.php +++ /dev/null @@ -1,413 +0,0 @@ - - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/** - * \file htdocs/core/class/coreobject.class.php - * \ingroup core - * \brief File of class to manage all object. Might be replace or merge into commonobject - */ - -require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php'; - -// TODO Remove this class (used in Expensereportik and ExpenseReportRule -/** - * CoreObject - */ -class CoreObject extends CommonObject -{ - public $withChild = true; - - /** - * @var Array $_fields Fields to synchronize with Database - */ - protected $fields = array(); - - /** - * Constructor - * - * @param DoliDB $db Database handler - */ - public function __construct(DoliDB &$db) - { - $this->db = $db; - } - - /** - * Function to init fields - * - * @return bool - */ - protected function init() - { - $this->id = 0; - $this->datec = 0; - $this->tms = 0; - - if (!empty($this->fields)) { - foreach ($this->fields as $field => $info) { - if ($this->isDate($info)) { - $this->{$field} = time(); - } elseif ($this->isArray($info)) { - $this->{$field} = array(); - } elseif ($this->isInt($info)) { - $this->{$field} = (int) 0; - } elseif ($this->isFloat($info)) { - $this->{$field} = (double) 0; - } else { - $this->{$field} = ''; - } - } - - $this->to_delete = false; - $this->is_clone = false; - - return true; - } else { - return false; - } - } - - /** - * Test type of field - * - * @param string $field name of field - * @param string $type type of field to test - * @return boolean value of field or false - */ - private function checkFieldType($field, $type) - { - if (isset($this->fields[$field]) && method_exists($this, 'is_'.$type)) { - return $this->{'is_'.$type}($this->fields[$field]); - } else { - return false; - } - } - - /** - * Get object and children from database - * - * @param int $id Id of object to load - * @param bool $loadChild used to load children from database - * @return int >0 if OK, <0 if KO, 0 if not found - */ - public function fetch($id, $loadChild = true) - { - $res = $this->fetchCommon($id); - if ($res > 0) { - if ($loadChild) { - $this->fetchChild(); - } - } - - return $res; - } - - - /** - * Function to instantiate a new child - * - * @param string $tabName Table name of child - * @param int $id If id is given, we try to return his key if exist or load if we try_to_load - * @param string $key Attribute name of the object id - * @param bool $try_to_load Force the fetch if an id is given - * @return int - */ - public function addChild($tabName, $id = 0, $key = 'id', $try_to_load = false) - { - if (!empty($id)) { - foreach ($this->{$tabName} as $k => &$object) { - if ($object->{$key} === $id) { - return $k; - } - } - } - - $k = count($this->{$tabName}); - - $className = ucfirst($tabName); - $this->{$tabName}[$k] = new $className($this->db); - if ($id > 0 && $key === 'id' && $try_to_load) { - $this->{$tabName}[$k]->fetch($id); - } - - return $k; - } - - - /** - * Function to set a child as to delete - * - * @param string $tabName Table name of child - * @param int $id Id of child to set as to delete - * @param string $key Attribute name of the object id - * @return bool - */ - public function removeChild($tabName, $id, $key = 'id') - { - foreach ($this->{$tabName} as &$object) { - if ($object->{$key} == $id) { - $object->to_delete = true; - return true; - } - } - return false; - } - - - /** - * Function to fetch children objects - * - * @return void - */ - public function fetchChild() - { - if ($this->withChild && !empty($this->childtables) && !empty($this->fk_element)) { - foreach ($this->childtables as &$childTable) { - $className = ucfirst($childTable); - - $this->{$className} = array(); - - $sql = "SELECT rowid FROM ".$this->db->prefix().$childTable." WHERE ".$this->fk_element." = ".((int) $this->id); - $res = $this->db->query($sql); - - if ($res) { - while ($obj = $this->db->fetch_object($res)) { - $o = new $className($this->db); - $o->fetch($obj->rowid); - - $this->{$className}[] = $o; - } - } else { - $this->errors[] = $this->db->lasterror(); - } - } - } - } - - /** - * Function to update children data - * - * @param User $user user object - * @return void - */ - public function saveChild(User &$user) - { - if ($this->withChild && !empty($this->childtables) && !empty($this->fk_element)) { - foreach ($this->childtables as &$childTable) { - $className = ucfirst($childTable); - if (!empty($this->{$className})) { - foreach ($this->{$className} as $i => &$object) { - $object->{$this->fk_element} = $this->id; - - $object->update($user); - if ($this->unsetChildDeleted && isset($object->to_delete) && $object->to_delete == true) { - unset($this->{$className}[$i]); - } - } - } - } - } - } - - - /** - * Function to update object or create or delete if needed - * - * @param User $user User object - * @return int < 0 if KO, > 0 if OK - */ - public function update(User &$user) - { - if (empty($this->id)) { - return $this->create($user); // To test, with that, no need to test on high level object, the core decide it, update just needed - } elseif (isset($this->to_delete) && $this->to_delete == true) { - return $this->delete($user); - } - - $error = 0; - $this->db->begin(); - - $res = $this->updateCommon($user); - if ($res) { - $result = $this->call_trigger(strtoupper($this->element).'_MODIFY', $user); - if ($result < 0) { - $error++; - } else { - $this->saveChild($user); - } - } else { - $error++; - $this->error = $this->db->lasterror(); - $this->errors[] = $this->error; - } - - if (empty($error)) { - $this->db->commit(); - return $this->id; - } else { - $this->db->rollback(); - return -1; - } - } - - /** - * Function to create object in database - * - * @param User $user User object - * @return int < 0 if KO, > 0 if OK - */ - public function create(User $user) - { - if ($this->id > 0) { - return $this->update($user); - } - - $error = 0; - $this->db->begin(); - - $res = $this->createCommon($user); - if ($res) { - $this->id = $this->db->last_insert_id($this->table_element); - - $result = $this->call_trigger(strtoupper($this->element).'_CREATE', $user); - if ($result < 0) { - $error++; - } else { - $this->saveChild($user); - } - } else { - $error++; - $this->error = $this->db->lasterror(); - $this->errors[] = $this->error; - } - - if (empty($error)) { - $this->db->commit(); - return $this->id; - } else { - $this->db->rollback(); - return -1; - } - } - - /** - * Function to delete object in database - * - * @param User $user user object - * @return int < 0 if KO, > 0 if OK - */ - public function delete(User &$user) - { - if ($this->id <= 0) { - return 0; - } - - $error = 0; - $this->db->begin(); - - $result = $this->call_trigger(strtoupper($this->element).'_DELETE', $user); - if ($result < 0) { - $error++; - } - - if (!$error) { - $this->deleteCommon($user); - if ($this->withChild && !empty($this->childtables)) { - foreach ($this->childtables as &$childTable) { - $className = ucfirst($childTable); - if (!empty($this->{$className})) { - foreach ($this->{$className} as &$object) { - $object->delete($user); - } - } - } - } - } - - if (empty($error)) { - $this->db->commit(); - return 1; - } else { - $this->error = $this->db->lasterror(); - $this->errors[] = $this->error; - $this->db->rollback(); - return -1; - } - } - - - /** - * Function to get a formatted date - * - * @param string $field Attribute to return - * @param string $format Output date format - * @return string - */ - public function getDate($field, $format = '') - { - if (empty($this->{$field})) { - return ''; - } else { - return dol_print_date($this->{$field}, $format); - } - } - - /** - * Function to set date in field - * - * @param string $field field to set - * @param string $date formatted date to convert - * @return mixed - */ - public function setDate($field, $date) - { - if (empty($date)) { - $this->{$field} = 0; - } else { - require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; - $this->{$field} = dol_stringtotime($date); - } - - return $this->{$field}; - } - - - /** - * Function to update current object - * - * @param array $Tab Array of values - * @return int - */ - public function setValues(&$Tab) - { - foreach ($Tab as $key => $value) { - if ($this->checkFieldType($key, 'date')) { - $this->setDate($key, $value); - } elseif ($this->checkFieldType($key, 'float')) { - $this->{$key} = (double) price2num($value); - } elseif ($this->checkFieldType($key, 'int')) { - $this->{$key} = (int) price2num($value); - } else { - $this->{$key} = dol_string_nohtmltag($value); - } - } - - return 1; - } -} diff --git a/htdocs/core/customreports.php b/htdocs/core/customreports.php index ace78c5199a..476b1d5a4da 100644 --- a/htdocs/core/customreports.php +++ b/htdocs/core/customreports.php @@ -465,7 +465,7 @@ print ''; $count = 0; print '
    '; print '
    '; -print $formother->selectGroupByField($object, $search_groupby, $arrayofgroupby, 'minwidth200 maxwidth250', $langs->trans("GroupBy")); // Fill the array $arrayofgroupby with possible fields +print $formother->selectGroupByField($object, $search_groupby, $arrayofgroupby, 'minwidth250 maxwidth300', $langs->trans("GroupBy")); // Fill the array $arrayofgroupby with possible fields print '
    '; diff --git a/htdocs/core/db/sqlite3.class.php b/htdocs/core/db/sqlite3.class.php index 10f9c021c0d..7aabf0eace7 100644 --- a/htdocs/core/db/sqlite3.class.php +++ b/htdocs/core/db/sqlite3.class.php @@ -1026,7 +1026,7 @@ class DoliDBSqlite3 extends DoliDB * * @param string $table Name of table * @param string $field Optionnel : Name of field if we want description of field - * @return SQLite3Result Resource + * @return bool|SQLite3Result Resource */ public function DDLDescTable($table, $field = "") { diff --git a/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php b/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php index efc061b9e67..cc2d3f57052 100644 --- a/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php +++ b/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php @@ -120,7 +120,7 @@ class pdf_espadon extends ModelePdfExpedition * * @param DoliDB $db Database handler */ - public function __construct($db = 0) + public function __construct($db) { global $conf, $langs, $mysoc; diff --git a/htdocs/expensereport/class/expensereport_ik.class.php b/htdocs/expensereport/class/expensereport_ik.class.php index 53cf3695b12..49ac0af9857 100644 --- a/htdocs/expensereport/class/expensereport_ik.class.php +++ b/htdocs/expensereport/class/expensereport_ik.class.php @@ -22,12 +22,12 @@ * \brief File of class to manage expense ik */ -require_once DOL_DOCUMENT_ROOT.'/core/class/coreobject.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php'; /** * Class to manage inventories */ -class ExpenseReportIk extends CoreObject +class ExpenseReportIk extends CommonObject { /** * @var string ID to identify managed object @@ -68,6 +68,7 @@ class ExpenseReportIk extends CoreObject */ public $ikoffset; + /** * Attribute object linked with database * @var array @@ -80,17 +81,75 @@ class ExpenseReportIk extends CoreObject ,'ikoffset'=>array('type'=>'double') ); + /** * Constructor * * @param DoliDB $db Database handler */ - public function __construct(DoliDB &$db) + public function __construct(DoliDB $db) { - parent::__construct($db); - parent::init(); + $this->db = $db; + } - $this->errors = array(); + + /** + * Create object into database + * + * @param User $user User that creates + * @param bool $notrigger false=launch triggers after, true=disable triggers + * @return int <0 if KO, Id of created object if OK + */ + public function create(User $user, $notrigger = false) + { + $resultcreate = $this->createCommon($user, $notrigger); + + //$resultvalidate = $this->validate($user, $notrigger); + + return $resultcreate; + } + + + /** + * Load object in memory from the database + * + * @param int $id Id object + * @param string $ref Ref + * @return int <0 if KO, 0 if not found, >0 if OK + */ + public function fetch($id, $ref = null) + { + $result = $this->fetchCommon($id, $ref); + if ($result > 0 && !empty($this->table_element_line)) { + $this->fetchLines(); + } + return $result; + } + + + /** + * Update object into database + * + * @param User $user User that modifies + * @param bool $notrigger false=launch triggers after, true=disable triggers + * @return int <0 if KO, >0 if OK + */ + public function update(User $user, $notrigger = false) + { + return $this->updateCommon($user, $notrigger); + } + + /** + * Delete object in database + * + * @param User $user User that deletes + * @param bool $notrigger false=launch triggers after, true=disable triggers + * @return int <0 if KO, >0 if OK + */ + public function delete(User $user, $notrigger = false) + { + return $this->deleteCommon($user, $notrigger); + //return $this->deleteCommon($user, $notrigger, 1); } diff --git a/htdocs/expensereport/class/expensereport_rule.class.php b/htdocs/expensereport/class/expensereport_rule.class.php index ae89b4b0f51..02bf8b8ce5c 100644 --- a/htdocs/expensereport/class/expensereport_rule.class.php +++ b/htdocs/expensereport/class/expensereport_rule.class.php @@ -22,12 +22,12 @@ * \brief File of class to manage expense ik */ -require_once DOL_DOCUMENT_ROOT.'/core/class/coreobject.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php'; /** * Class to manage inventories */ -class ExpenseReportRule extends CoreObject +class ExpenseReportRule extends CommonObject { /** * @var string ID to identify managed object @@ -125,21 +125,78 @@ class ExpenseReportRule extends CoreObject ,'entity'=>array('type'=>'integer') ); + /** * Constructor * * @param DoliDB $db Database handler */ - public function __construct(DoliDB &$db) + public function __construct(DoliDB $db) { - global $conf; - - parent::__construct($db); - parent::init(); - - $this->errors = array(); + $this->db = $db; } + + /** + * Create object into database + * + * @param User $user User that creates + * @param bool $notrigger false=launch triggers after, true=disable triggers + * @return int <0 if KO, Id of created object if OK + */ + public function create(User $user, $notrigger = false) + { + $resultcreate = $this->createCommon($user, $notrigger); + + //$resultvalidate = $this->validate($user, $notrigger); + + return $resultcreate; + } + + + /** + * Load object in memory from the database + * + * @param int $id Id object + * @param string $ref Ref + * @return int <0 if KO, 0 if not found, >0 if OK + */ + public function fetch($id, $ref = null) + { + $result = $this->fetchCommon($id, $ref); + if ($result > 0 && !empty($this->table_element_line)) { + $this->fetchLines(); + } + return $result; + } + + + /** + * Update object into database + * + * @param User $user User that modifies + * @param bool $notrigger false=launch triggers after, true=disable triggers + * @return int <0 if KO, >0 if OK + */ + public function update(User $user, $notrigger = false) + { + return $this->updateCommon($user, $notrigger); + } + + /** + * Delete object in database + * + * @param User $user User that deletes + * @param bool $notrigger false=launch triggers after, true=disable triggers + * @return int <0 if KO, >0 if OK + */ + public function delete(User $user, $notrigger = false) + { + return $this->deleteCommon($user, $notrigger); + //return $this->deleteCommon($user, $notrigger, 1); + } + + /** * Return all rules or filtered by something * From 8c62363ad1b58217e298d1695f17be1ee14bf823 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Wed, 18 May 2022 11:14:20 +0200 Subject: [PATCH 568/738] fix deprecated for fk_statut --- htdocs/ticket/card.php | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/htdocs/ticket/card.php b/htdocs/ticket/card.php index 99913e6c997..586eff0bca6 100755 --- a/htdocs/ticket/card.php +++ b/htdocs/ticket/card.php @@ -205,7 +205,7 @@ if (empty($reshook)) { $fk_user_assign = GETPOST("fk_user_assign", 'int'); if ($fk_user_assign > 0) { $object->fk_user_assign = $fk_user_assign; - $object->fk_statut = $object::STATUS_ASSIGNED; + $object->fk_status = $object::STATUS_ASSIGNED; } $object->fk_project = $projectid; @@ -285,7 +285,7 @@ if (empty($reshook)) { } } - if ($action == 'update' && $user->rights->ticket->write && $object->fk_statut < Ticket::STATUS_CLOSED) { + if ($action == 'update' && $user->rights->ticket->write && $object->fk_status < Ticket::STATUS_CLOSED) { $error = 0; $ret = $object->fetch(GETPOST('id', 'int'), GETPOST('ref', 'alpha'), GETPOST('track_id', 'alpha')); @@ -543,7 +543,7 @@ if (empty($reshook)) { if ($action == 'confirm_reopen' && $user->rights->ticket->manage && !GETPOST('cancel')) { if ($object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha')) >= 0) { // prevent browser refresh from reopening ticket several times - if ($object->fk_statut == Ticket::STATUS_CLOSED || $object->fk_statut == Ticket::STATUS_CANCELED) { + if ($object->fk_status == Ticket::STATUS_CLOSED || $object->fk_status == Ticket::STATUS_CANCELED) { $res = $object->setStatut(Ticket::STATUS_ASSIGNED); if ($res) { // Log action in ticket logs table @@ -602,7 +602,7 @@ if (empty($reshook)) { // Reopen ticket if ($object->fetch(GETPOST('id', 'int'), GETPOST('track_id', 'alpha')) >= 0) { $new_status = GETPOST('new_status', 'int'); - $old_status = $object->fk_statut; + $old_status = $object->fk_status; $res = $object->setStatut($new_status); if ($res) { // Log action in ticket logs table @@ -721,7 +721,7 @@ if ($action == 'create' || $action == 'presend') { $formticket->withcancel = 1; $formticket->showForm(1, 'create', 0); - /*} elseif ($action == 'edit' && $user->rights->ticket->write && $object->fk_statut < Ticket::STATUS_CLOSED) { + /*} elseif ($action == 'edit' && $user->rights->ticket->write && $object->fk_status < Ticket::STATUS_CLOSED) { $formticket = new FormTicket($db); $head = ticket_prepare_head($object); @@ -934,7 +934,7 @@ if ($action == 'create' || $action == 'presend') { // Thirdparty if (!empty($conf->societe->enabled)) { $morehtmlref .= '
    '.$langs->trans('ThirdParty').' '; - if ($action != 'editcustomer' && $object->fk_statut < 8 && !$user->socid && $user->rights->ticket->write) { + if ($action != 'editcustomer' && $object->fk_status < 8 && !$user->socid && $user->rights->ticket->write) { $morehtmlref .= ''.img_edit($langs->transnoentitiesnoconv('Edit'), 0).' : '; } if ($action == 'editcustomer') { @@ -1034,7 +1034,7 @@ if ($action == 'create' || $action == 'presend') { print ''; print '
    '; print $langs->trans("AssignedTo"); - if ($object->fk_statut < $object::STATUS_CLOSED && GETPOST('set', 'alpha') != "assign_ticket" && $user->rights->ticket->manage) { + if ($object->fk_status < $object::STATUS_CLOSED && GETPOST('set', 'alpha') != "assign_ticket" && $user->rights->ticket->manage) { print ''.img_edit($langs->trans('Modify'), '').''; } print '
    '; @@ -1045,7 +1045,7 @@ if ($action == 'create' || $action == 'presend') { } // Show user list to assignate one if status is "read" - if (GETPOST('set', 'alpha') == "assign_ticket" && $object->fk_statut < 8 && !$user->socid && $user->rights->ticket->write) { + if (GETPOST('set', 'alpha') == "assign_ticket" && $object->fk_status < 8 && !$user->socid && $user->rights->ticket->write) { print '
    '; print ''; print ''; @@ -1062,7 +1062,7 @@ if ($action == 'create' || $action == 'presend') { print ''; - if ($action != 'progression' && $object->fk_statut < $object::STATUS_CLOSED && !$user->socid) { + if ($action != 'progression' && $object->fk_status < $object::STATUS_CLOSED && !$user->socid) { print ''; } print '
    '; print $langs->trans('Progression').''; print ''.img_edit($langs->trans('Modify')).'
    '; @@ -1185,7 +1185,7 @@ if ($action == 'create' || $action == 'presend') { print ''; } else { // Button to edit Properties - if ($object->fk_statut < $object::STATUS_NEED_MORE_INFO && $user->rights->ticket->write) { + if ($object->fk_status < $object::STATUS_NEED_MORE_INFO && $user->rights->ticket->write) { print ' '.img_edit($langs->trans('Modify')).''; } } @@ -1244,7 +1244,7 @@ if ($action == 'create' || $action == 'presend') { // Display navbar with links to change ticket status print ''; - if (!$user->socid && $user->rights->ticket->write && $object->fk_statut < $object::STATUS_CLOSED && GETPOST('set') !== 'properties') { + if (!$user->socid && $user->rights->ticket->write && $object->fk_status < $object::STATUS_CLOSED && GETPOST('set') !== 'properties') { $actionobject->viewStatusActions($object); } @@ -1379,7 +1379,7 @@ if ($action == 'create' || $action == 'presend') { if (empty($reshook)) { // Show link to add a message (if read and not closed) - if ($object->fk_statut < Ticket::STATUS_CLOSED && $action != "presend" && $action != "presend_addmessage") { + if ($object->fk_status < Ticket::STATUS_CLOSED && $action != "presend" && $action != "presend_addmessage") { print dolGetButtonAction('', $langs->trans('TicketAddMessage'), 'default', $_SERVER["PHP_SELF"].'?action=presend_addmessage&mode=init&token='.newToken().'&track_id='.$object->track_id, ''); } @@ -1388,28 +1388,28 @@ if ($action == 'create' || $action == 'presend') { if (!$object->fk_soc && $user->rights->ficheinter->creer) { print dolGetButtonAction($langs->trans('UnableToCreateInterIfNoSocid'), $langs->trans('TicketAddIntervention'), 'default', $_SERVER['PHP_SELF']. '#', '', false); } - if ($object->fk_soc > 0 && $object->fk_statut < Ticket::STATUS_CLOSED && $user->rights->ficheinter->creer) { + if ($object->fk_soc > 0 && $object->fk_status < Ticket::STATUS_CLOSED && $user->rights->ficheinter->creer) { print dolGetButtonAction('', $langs->trans('TicketAddIntervention'), 'default', DOL_URL_ROOT.'/fichinter/card.php?action=create&token='.newToken().'&socid='. $object->fk_soc.'&origin=ticket_ticket&originid='. $object->id, ''); } /* This is useless. We can already modify each field individually - if ($user->rights->ticket->write && $object->fk_statut < Ticket::STATUS_CLOSED) { + if ($user->rights->ticket->write && $object->fk_status < Ticket::STATUS_CLOSED) { print ''; } */ // Close ticket if statut is read - if ($object->fk_statut > 0 && $object->fk_statut < Ticket::STATUS_CLOSED && $user->rights->ticket->write) { + if ($object->fk_status > 0 && $object->fk_status < Ticket::STATUS_CLOSED && $user->rights->ticket->write) { print dolGetButtonAction('', $langs->trans('CloseTicket'), 'default', $_SERVER["PHP_SELF"].'?action=close&token='.newToken().'&track_id='.$object->track_id, ''); } // Abadon ticket if statut is read - if ($object->fk_statut > 0 && $object->fk_statut < Ticket::STATUS_CLOSED && $user->rights->ticket->write) { + if ($object->fk_status > 0 && $object->fk_status < Ticket::STATUS_CLOSED && $user->rights->ticket->write) { print dolGetButtonAction('', $langs->trans('AbandonTicket'), 'default', $_SERVER["PHP_SELF"].'?action=abandon&token='.newToken().'&track_id='.$object->track_id, ''); } // Re-open ticket - if (!$user->socid && ($object->fk_statut == Ticket::STATUS_CLOSED || $object->fk_statut == Ticket::STATUS_CANCELED) && !$user->socid) { + if (!$user->socid && ($object->fk_status == Ticket::STATUS_CLOSED || $object->fk_status == Ticket::STATUS_CANCELED) && !$user->socid) { print dolGetButtonAction('', $langs->trans('ReOpen'), 'default', $_SERVER["PHP_SELF"].'?action=reopen&token='.newToken().'&track_id='.$object->track_id, ''); } @@ -1513,12 +1513,12 @@ if ($action == 'create' || $action == 'presend') { $morehtmlright .= dolGetButtonTitle($langs->trans('MessageListViewType'), '', 'fa fa-list-alt imgforviewmode', $messagingUrl, '', 1); // Show link to add a message (if read and not closed) - $btnstatus = $object->fk_statut < Ticket::STATUS_CLOSED && $action != "presend" && $action != "presend_addmessage" && $action != "add_message"; + $btnstatus = $object->fk_status < Ticket::STATUS_CLOSED && $action != "presend" && $action != "presend_addmessage" && $action != "add_message"; $url = 'card.php?track_id='.$object->track_id.'&action=presend_addmessage&mode=init'; $morehtmlright .= dolGetButtonTitle($langs->trans('TicketAddMessage'), '', 'fa fa-comment-dots', $url, 'add-new-ticket-title-button', $btnstatus); // Show link to add event (if read and not closed) - $btnstatus = $object->fk_statut < Ticket::STATUS_CLOSED && $action != "presend" && $action != "presend_addmessage" && $action != "add_message"; ; + $btnstatus = $object->fk_status < Ticket::STATUS_CLOSED && $action != "presend" && $action != "presend_addmessage" && $action != "add_message"; ; $url = dol_buildpath('/comm/action/card.php', 1).'?action=create&datep='.date('YmdHi').'&origin=ticket&originid='.$object->id.'&projectid='.$object->fk_project.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?track_id='.$object->track_id); $morehtmlright .= dolGetButtonTitle($langs->trans('AddAction'), '', 'fa fa-plus-circle', $url, 'add-new-ticket-even-button', $btnstatus); From 177e8c17fb8c7905c36504199207dec206328601 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 18 May 2022 11:23:21 +0200 Subject: [PATCH 569/738] Fix scrutinizer --- htdocs/comm/action/class/actioncomm.class.php | 2 +- htdocs/comm/action/index.php | 2 +- htdocs/core/class/commonobject.class.php | 2 +- htdocs/core/class/html.form.class.php | 2 +- htdocs/core/class/utils.class.php | 2 +- htdocs/core/modules/expedition/doc/pdf_espadon.modules.php | 2 +- htdocs/core/modules/expedition/doc/pdf_merou.modules.php | 2 +- htdocs/core/modules/expedition/doc/pdf_rouget.modules.php | 2 +- htdocs/core/modules/reception/doc/pdf_squille.modules.php | 2 +- htdocs/expedition/class/expedition.class.php | 2 +- htdocs/fourn/class/fournisseur.facture-rec.class.php | 7 +++++++ htdocs/install/fileconf.php | 6 +++--- htdocs/product/card.php | 2 +- htdocs/societe/class/societe.class.php | 7 ++++--- 14 files changed, 25 insertions(+), 17 deletions(-) diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php index f22cea8d04e..aeb20e6c7b4 100644 --- a/htdocs/comm/action/class/actioncomm.class.php +++ b/htdocs/comm/action/class/actioncomm.class.php @@ -1621,7 +1621,7 @@ class ActionComm extends CommonObject $label = $langs->trans("ShowAction"); $linkclose .= ' alt="'.dol_escape_htmltag($tooltip, 1).'"'; } - $linkclose .= ' title="'.dol_escape_htmltag($tooltip, 1, 0, 0, '', 1).'"'; + $linkclose .= ' title="'.dol_escape_htmltag($tooltip, 1, 0, '', 1).'"'; $linkclose .= ' class="'.$classname.' classfortooltip"'; /* $hookmanager->initHooks(array('actiondao')); diff --git a/htdocs/comm/action/index.php b/htdocs/comm/action/index.php index 920fe69025d..f5bbeb6467d 100644 --- a/htdocs/comm/action/index.php +++ b/htdocs/comm/action/index.php @@ -110,7 +110,7 @@ $week = GETPOST("week", "int") ?GETPOST("week", "int") : date("W"); $day = GETPOST("day", "int") ?GETPOST("day", "int") : date("d"); $pid = GETPOST("search_projectid", "int", 3) ? GETPOST("search_projectid", "int", 3) : GETPOST("projectid", "int", 3); $status = GETPOSTISSET("search_status") ? GETPOST("search_status", 'aZ09') : GETPOST("status", 'aZ09'); // status may be 0, 50, 100, 'todo' -$type = GETPOSTISSET("search_type", 'aZ09') ? GETPOST("search_type", 'aZ09') : GETPOST("type", 'aZ09'); +$type = GETPOSTISSET("search_type") ? GETPOST("search_type", 'aZ09') : GETPOST("type", 'aZ09'); $maxprint = GETPOSTISSET("maxprint") ? GETPOST("maxprint", 'int') : $conf->global->AGENDA_MAX_EVENTS_DAY_VIEW; $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print') diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 6466754f241..b4bac9b1d73 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -201,7 +201,7 @@ abstract class CommonObject public $user; /** - * @var string The type of originating object ('commande', 'facture', ...) + * @var string The type of originating object ('commande', 'facture', ...). Note: on some object this field is called $origin_type * @see fetch_origin() */ public $origin; diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 81fbb83b264..c21434b49de 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -7621,7 +7621,7 @@ class Form if (!empty($objecttmp->fields)) { // For object that declare it, it is better to use declared fields (like societe, contact, ...) $tmpfieldstoshow = ''; foreach ($objecttmp->fields as $key => $val) { - if (!dol_eval($val['enabled'], 1, 1, 1, '1')) { + if (!dol_eval($val['enabled'], 1, 1, '1')) { continue; } if (!empty($val['showoncombobox'])) { diff --git a/htdocs/core/class/utils.class.php b/htdocs/core/class/utils.class.php index f3d46e09f30..8b74609bfa3 100644 --- a/htdocs/core/class/utils.class.php +++ b/htdocs/core/class/utils.class.php @@ -342,7 +342,7 @@ class Utils $handle = ''; - $lowmemorydump = GETPOSTISSET("lowmemorydump", "alpha") ? GETPOST("lowmemorydump") : getDolGlobalString('MAIN_LOW_MEMORY_DUMP'); + $lowmemorydump = GETPOSTISSET("lowmemorydump") ? GETPOST("lowmemorydump") : getDolGlobalString('MAIN_LOW_MEMORY_DUMP'); // Start call method to execute dump $fullcommandcrypted = $command." ".$paramcrypted." 2>&1"; diff --git a/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php b/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php index cc2d3f57052..fa47f7be159 100644 --- a/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php +++ b/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php @@ -120,7 +120,7 @@ class pdf_espadon extends ModelePdfExpedition * * @param DoliDB $db Database handler */ - public function __construct($db) + public function __construct(DoliDB $db) { global $conf, $langs, $mysoc; diff --git a/htdocs/core/modules/expedition/doc/pdf_merou.modules.php b/htdocs/core/modules/expedition/doc/pdf_merou.modules.php index 9a905422ff1..87098733502 100644 --- a/htdocs/core/modules/expedition/doc/pdf_merou.modules.php +++ b/htdocs/core/modules/expedition/doc/pdf_merou.modules.php @@ -121,7 +121,7 @@ class pdf_merou extends ModelePdfExpedition * * @param DoliDB $db Database handler */ - public function __construct($db = 0) + public function __construct(DoliDB $db) { global $conf, $langs, $mysoc; diff --git a/htdocs/core/modules/expedition/doc/pdf_rouget.modules.php b/htdocs/core/modules/expedition/doc/pdf_rouget.modules.php index 94e048382dc..64d8a2c65e6 100644 --- a/htdocs/core/modules/expedition/doc/pdf_rouget.modules.php +++ b/htdocs/core/modules/expedition/doc/pdf_rouget.modules.php @@ -121,7 +121,7 @@ class pdf_rouget extends ModelePdfExpedition * * @param DoliDB $db Database handler */ - public function __construct($db = 0) + public function __construct(DoliDB $db) { global $conf, $langs, $mysoc; diff --git a/htdocs/core/modules/reception/doc/pdf_squille.modules.php b/htdocs/core/modules/reception/doc/pdf_squille.modules.php index 9f03abef52c..1ad02edc46b 100644 --- a/htdocs/core/modules/reception/doc/pdf_squille.modules.php +++ b/htdocs/core/modules/reception/doc/pdf_squille.modules.php @@ -44,7 +44,7 @@ class pdf_squille extends ModelePdfReception * * @param DoliDB $db Database handler */ - public function __construct($db = 0) + public function __construct(DoliDB $db) { global $conf, $langs, $mysoc; diff --git a/htdocs/expedition/class/expedition.class.php b/htdocs/expedition/class/expedition.class.php index 0dec85b2e4f..acb54dde6f3 100644 --- a/htdocs/expedition/class/expedition.class.php +++ b/htdocs/expedition/class/expedition.class.php @@ -752,7 +752,7 @@ class Expedition extends CommonObject //var_dump($this->lines[$i]); $mouvS = new MouvementStock($this->db); - $mouvS->origin = dol_clone($this, 1); + //$mouvS->origin = dol_clone($this, 1); $mouvS->setOrigin($this->element, $this->id); if (empty($obj->edbrowid)) { diff --git a/htdocs/fourn/class/fournisseur.facture-rec.class.php b/htdocs/fourn/class/fournisseur.facture-rec.class.php index ab68cd3ecc6..a43e4a3ff9b 100644 --- a/htdocs/fourn/class/fournisseur.facture-rec.class.php +++ b/htdocs/fourn/class/fournisseur.facture-rec.class.php @@ -127,6 +127,13 @@ class FactureFournisseurRec extends CommonInvoice public $model_pdf; + /** + * Invoice lines + * @var FactureFournisseurLigneRec[] + */ + public $lines = array(); + + /* Override fields in CommonObject public $entity; public $date_creation; diff --git a/htdocs/install/fileconf.php b/htdocs/install/fileconf.php index 16d8a919dbe..14f1ee2a1cd 100644 --- a/htdocs/install/fileconf.php +++ b/htdocs/install/fileconf.php @@ -143,7 +143,7 @@ if (!empty($force_install_message)) { @@ -178,7 +178,7 @@ if (!empty($force_install_noedit)) { $dolibarr_main_data_root = @$force_install_main_data_root; } if (empty($dolibarr_main_data_root)) { - $dolibarr_main_data_root = GETPOSTISSET('main_data_dir', 'alpha') ? GETPOST('main_data_dir') : detect_dolibarr_main_data_root($dolibarr_main_document_root); + $dolibarr_main_data_root = GETPOSTISSET('main_data_dir') ? GETPOST('main_data_dir') : detect_dolibarr_main_data_root($dolibarr_main_document_root); } ?> @@ -207,7 +207,7 @@ if (!empty($force_install_noedit)) { diff --git a/htdocs/product/card.php b/htdocs/product/card.php index 6040e116fa5..c7d26830ebf 100644 --- a/htdocs/product/card.php +++ b/htdocs/product/card.php @@ -1461,7 +1461,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) { if ($type == 1) { print ''.$langs->trans("Duration").''; print ''; - print $formproduct->selectMeasuringUnits("duration_unit", "time", (GETPOSTISSET('duration_value') ? GETPOSTISSET('duration_value', 'alpha') : 'h'), 0, 1); + print $formproduct->selectMeasuringUnits("duration_unit", "time", (GETPOSTISSET('duration_value') ? GETPOST('duration_value', 'alpha') : 'h'), 0, 1); // Mandatory period print '       '; diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 30f8515e92c..686c301af79 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -504,18 +504,19 @@ class Societe extends CommonObject /** * Date of last update - * @var string + * @var integer|string */ public $date_modification; /** * User that made last update - * @var string + * @var User */ public $user_modification; /** - * @var integer|string date_creation + * Date of creation + * @var integer|string */ public $date_creation; From 48cb30bd9babad7335121207a5dceab10d85fe99 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 18 May 2022 11:34:54 +0200 Subject: [PATCH 570/738] Fix scrutinizer --- .../modules/expedition/doc/pdf_espadon.modules.php | 2 +- .../modules/expedition/doc/pdf_merou.modules.php | 2 +- .../core/modules/facture/doc/pdf_crabe.modules.php | 12 ++++++------ .../core/modules/propale/doc/pdf_azur.modules.php | 3 ++- .../supplier_invoice/doc/pdf_canelle.modules.php | 13 +++++++------ .../interface_50_modTicket_TicketEmail.class.php | 2 +- htdocs/install/step5.php | 2 +- 7 files changed, 19 insertions(+), 17 deletions(-) diff --git a/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php b/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php index fa47f7be159..a038705ea22 100644 --- a/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php +++ b/htdocs/core/modules/expedition/doc/pdf_espadon.modules.php @@ -642,7 +642,7 @@ class pdf_espadon extends ModelePdfExpedition if ($this->getColumnStatus('weight')) { - $this->printStdColumnContent($pdf, $curY, 'weight', $weighttxt.(($weighttxt && $voltxt) ? '
    ' : '').$voltxt, array('html'=>1)); + $this->printStdColumnContent($pdf, $curY, 'weight', $weighttxt.(($weighttxt && $voltxt) ? '
    ' : '').$voltxt); $nexY = max($pdf->GetY(), $nexY); } diff --git a/htdocs/core/modules/expedition/doc/pdf_merou.modules.php b/htdocs/core/modules/expedition/doc/pdf_merou.modules.php index 87098733502..69105dd31cc 100644 --- a/htdocs/core/modules/expedition/doc/pdf_merou.modules.php +++ b/htdocs/core/modules/expedition/doc/pdf_merou.modules.php @@ -584,7 +584,7 @@ class pdf_merou extends ModelePdfExpedition $origin_id = $object->origin_id; // Add list of linked elements - $posy = pdf_writeLinkedObjects($pdf, $object, $outputlangs, $posx, $posy, 100, 3, 'R', $default_font_size - 1, $hookmanager); + $posy = pdf_writeLinkedObjects($pdf, $object, $outputlangs, $posx, $posy, 100, 3, 'R', $default_font_size - 1); //$this->Code39($Xoff+43, $Yoff+1, $object->commande->ref,$ext = true, $cks = false, $w = 0.4, $h = 4, $wide = true); //Definition Location of the Company block diff --git a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php index 8046347e881..091b78d2ed5 100644 --- a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php +++ b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php @@ -874,12 +874,12 @@ class pdf_crabe extends ModelePDFFactures /** * Show payments table * - * @param TCPDF $pdf Object PDF - * @param Facture $object Object invoice - * @param int $posy Position y in PDF - * @param Translate $outputlangs Object langs for output - * @param int $heightforfooter height for footer - * @return int <0 if KO, >0 if OK + * @param TCPDF $pdf Object PDF + * @param Facture $object Object invoice + * @param int $posy Position y in PDF + * @param Translate $outputlangs Object langs for output + * @param int $heightforfooter Height for footer + * @return int <0 if KO, >0 if OK */ protected function _tableau_versements(&$pdf, $object, $posy, $outputlangs, $heightforfooter = 0) { diff --git a/htdocs/core/modules/propale/doc/pdf_azur.modules.php b/htdocs/core/modules/propale/doc/pdf_azur.modules.php index c6bb975092d..abf2b843a39 100644 --- a/htdocs/core/modules/propale/doc/pdf_azur.modules.php +++ b/htdocs/core/modules/propale/doc/pdf_azur.modules.php @@ -1458,9 +1458,10 @@ class pdf_azur extends ModelePDFPropales * @param Propal $object Object to show * @param int $showaddress 0=no, 1=yes * @param Translate $outputlangs Object lang for output + * @param Translate $outputlangsbis Object lang for output bis * @return void */ - protected function _pagehead(&$pdf, $object, $showaddress, $outputlangs) + protected function _pagehead(&$pdf, $object, $showaddress, $outputlangs, $outputlangsbis = null) { global $conf, $langs; diff --git a/htdocs/core/modules/supplier_invoice/doc/pdf_canelle.modules.php b/htdocs/core/modules/supplier_invoice/doc/pdf_canelle.modules.php index 23a38b961ec..b026a39791c 100644 --- a/htdocs/core/modules/supplier_invoice/doc/pdf_canelle.modules.php +++ b/htdocs/core/modules/supplier_invoice/doc/pdf_canelle.modules.php @@ -967,13 +967,14 @@ class pdf_canelle extends ModelePDFSuppliersInvoices /** * Show payments table * - * @param TCPDF $pdf Object PDF - * @param Object $object Object to show - * @param int $posy Position y in PDF - * @param Translate $outputlangs Object langs for output - * @return int <0 if KO, >0 if OK + * @param TCPDF $pdf Object PDF + * @param Object $object Object to show + * @param int $posy Position y in PDF + * @param Translate $outputlangs Object langs for output + * @param int $heightforfooter Height for footer + * @return int <0 if KO, >0 if OK */ - protected function _tableau_versements(&$pdf, $object, $posy, $outputlangs) + protected function _tableau_versements(&$pdf, $object, $posy, $outputlangs, $heightforfooter = 0) { // phpcs:enable global $conf; diff --git a/htdocs/core/triggers/interface_50_modTicket_TicketEmail.class.php b/htdocs/core/triggers/interface_50_modTicket_TicketEmail.class.php index e13328e0a2a..840d6d9c3ba 100644 --- a/htdocs/core/triggers/interface_50_modTicket_TicketEmail.class.php +++ b/htdocs/core/triggers/interface_50_modTicket_TicketEmail.class.php @@ -169,7 +169,7 @@ class InterfaceTicketEmail extends DolibarrTriggers } if ($sendto) { - $this->composeAndSendCustomerMessage($sendto, $subject_customer, $body_customer, $see_ticket_customer, $object, $langs, $conf); + $this->composeAndSendCustomerMessage($sendto, $subject_customer, $body_customer, $see_ticket_customer, $object, $langs); } } diff --git a/htdocs/install/step5.php b/htdocs/install/step5.php index 89681794aeb..ee592007522 100644 --- a/htdocs/install/step5.php +++ b/htdocs/install/step5.php @@ -228,7 +228,7 @@ if ($action == "set" || empty($action) || preg_match('/upgrade/i', $action)) { $success = 1; } else { dolibarr_install_syslog('step5: FailedToCreateAdminLogin '.$newuser->error, LOG_ERR); - setEventMessage($langs->trans("FailedToCreateAdminLogin").' '.$newuser->error, null, 'errors'); + setEventMessages($langs->trans("FailedToCreateAdminLogin").' '.$newuser->error, null, 'errors'); //header("Location: step4.php?error=3&selectlang=$setuplang".(isset($login) ? '&login='.$login : '')); print '
    '.$langs->trans("FailedToCreateAdminLogin").': '.$newuser->error.'


    '; print $langs->trans("ErrorGoBackAndCorrectParameters").'

    '; From 86d34af4b0e3687b324b0e3719f26859bf9323df Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 18 May 2022 11:38:56 +0200 Subject: [PATCH 571/738] Fix deprecated code --- htdocs/compta/deplacement/list.php | 2 +- htdocs/compta/paiement/cheque/list.php | 2 +- htdocs/compta/paiement/rapport.php | 2 +- htdocs/contact/consumption.php | 2 +- htdocs/contrat/list.php | 2 +- htdocs/expensereport/list.php | 4 ++-- htdocs/fourn/facture/rapport.php | 2 +- htdocs/holiday/list.php | 8 ++++---- htdocs/opensurvey/results.php | 2 +- htdocs/projet/list.php | 4 ++-- htdocs/projet/tasks.php | 4 ++-- htdocs/projet/tasks/time.php | 2 +- htdocs/societe/consumption.php | 2 +- htdocs/societe/paymentmodes.php | 4 ++-- 14 files changed, 21 insertions(+), 21 deletions(-) diff --git a/htdocs/compta/deplacement/list.php b/htdocs/compta/deplacement/list.php index 9f92cecc4a7..2aa03441e9b 100644 --- a/htdocs/compta/deplacement/list.php +++ b/htdocs/compta/deplacement/list.php @@ -158,7 +158,7 @@ if ($resql) { print ''; } print ''; - $formother->select_year($year ? $year : -1, 'year', 1, 20, 5); + print $formother->selectyear($year ? $year : -1, 'year', 1, 20, 5); print ''; print ''; print ''; diff --git a/htdocs/compta/paiement/cheque/list.php b/htdocs/compta/paiement/cheque/list.php index d12caf36bbe..1c3abfe87bd 100644 --- a/htdocs/compta/paiement/cheque/list.php +++ b/htdocs/compta/paiement/cheque/list.php @@ -172,7 +172,7 @@ if ($resql) { print ''; } print ''; - $formother->select_year($year ? $year : -1, 'year', 1, 20, 5); + print $formother->selectyear($year ? $year : -1, 'year', 1, 20, 5); print ''; print ''; $form->select_comptes($search_account, 'search_account', 0, '', 1); diff --git a/htdocs/compta/paiement/rapport.php b/htdocs/compta/paiement/rapport.php index cf02c2aeb74..326be7144a8 100644 --- a/htdocs/compta/paiement/rapport.php +++ b/htdocs/compta/paiement/rapport.php @@ -102,7 +102,7 @@ $syear = GETPOST("reyear") ?GETPOST("reyear") : date("Y", time()); print $formother->select_month($cmonth, 'remonth'); -print $formother->select_year($syear, 'reyear'); +print $formother->selectyear($syear, 'reyear'); print ''; print ''; diff --git a/htdocs/contact/consumption.php b/htdocs/contact/consumption.php index 02813cee469..7f1d9bdc64b 100644 --- a/htdocs/contact/consumption.php +++ b/htdocs/contact/consumption.php @@ -410,7 +410,7 @@ if ($sql_select) { print ''; print ''; // date print $formother->select_month($month ? $month : -1, 'month', 1, 0, 'valignmiddle'); - $formother->select_year($year ? $year : -1, 'year', 1, 20, 1); + print $formother->selectyear($year ? $year : -1, 'year', 1, 20, 1); print ''; print ''; print ''; diff --git a/htdocs/contrat/list.php b/htdocs/contrat/list.php index 57b4657eab4..e76261010da 100644 --- a/htdocs/contrat/list.php +++ b/htdocs/contrat/list.php @@ -693,7 +693,7 @@ if (!empty($arrayfields['lower_planned_end_date']['checked'])) { print '
    '; print $formother->select_month($search_dfmonth, 'search_dfmonth', 1, 0); print ' '; - $formother->select_year($search_dfyear, 'search_dfyear', 1, 20, 5, 0, 0, ''); + print $formother->selectyear($search_dfyear, 'search_dfyear', 1, 20, 5, 0, 0, ''); print ''; } // Status diff --git a/htdocs/expensereport/list.php b/htdocs/expensereport/list.php index 551957d0a69..24432cb7cf1 100644 --- a/htdocs/expensereport/list.php +++ b/htdocs/expensereport/list.php @@ -580,14 +580,14 @@ if ($resql) { if (!empty($arrayfields['d.date_valid']['checked'])) { print ''; //print ''; - //$formother->select_year($year_end,'year_end',1, $min_year, $max_year); + //print $formother->selectyear($year_end,'year_end',1, $min_year, $max_year); print ''; } // Date approve if (!empty($arrayfields['d.date_approve']['checked'])) { print ''; //print ''; - //$formother->select_year($year_end,'year_end',1, $min_year, $max_year); + //print $formother->selectyear($year_end,'year_end',1, $min_year, $max_year); print ''; } // Amount with no tax diff --git a/htdocs/fourn/facture/rapport.php b/htdocs/fourn/facture/rapport.php index 59b92f349c0..f46871b03e9 100644 --- a/htdocs/fourn/facture/rapport.php +++ b/htdocs/fourn/facture/rapport.php @@ -105,7 +105,7 @@ $syear = GETPOST("reyear") ?GETPOST("reyear") : date("Y", time()); print $formother->select_month($cmonth, 'remonth'); -print $formother->select_year($syear, 'reyear'); +print $formother->selectyear($syear, 'reyear'); print ''; print ''; diff --git a/htdocs/holiday/list.php b/htdocs/holiday/list.php index 5dc05d1c617..ed6e421d302 100644 --- a/htdocs/holiday/list.php +++ b/htdocs/holiday/list.php @@ -625,7 +625,7 @@ if ($resql) { if (!empty($arrayfields['cp.date_debut']['checked'])) { print ''; print ''; - $formother->select_year($search_year_start, 'search_year_start', 1, $min_year, $max_year); + print $formother->selectyear($search_year_start, 'search_year_start', 1, $min_year, $max_year); print ''; } @@ -633,7 +633,7 @@ if ($resql) { if (!empty($arrayfields['cp.date_fin']['checked'])) { print ''; print ''; - $formother->select_year($search_year_end, 'search_year_end', 1, $min_year, $max_year); + print $formother->selectyear($search_year_end, 'search_year_end', 1, $min_year, $max_year); print ''; } @@ -654,7 +654,7 @@ if ($resql) { if (!empty($arrayfields['cp.date_create']['checked'])) { print ''; print ''; - $formother->select_year($search_year_create, 'search_year_create', 1, $min_year, 0); + print $formother->selectyear($search_year_create, 'search_year_create', 1, $min_year, 0); print ''; } @@ -662,7 +662,7 @@ if ($resql) { if (!empty($arrayfields['cp.tms']['checked'])) { print ''; print ''; - $formother->select_year($search_year_update, 'search_year_update', 1, $min_year, 0); + print $formother->selectyear($search_year_update, 'search_year_update', 1, $min_year, 0); print ''; } diff --git a/htdocs/opensurvey/results.php b/htdocs/opensurvey/results.php index bb2e3604627..eda16dec32c 100644 --- a/htdocs/opensurvey/results.php +++ b/htdocs/opensurvey/results.php @@ -609,7 +609,7 @@ if (GETPOST('ajoutsujet')) { print ' '; - print $formother->select_year('', 'nouvelleannee', 1, 0, 5, 0, 1); + print $formother->selectyear('', 'nouvelleannee', 1, 0, 5, 0, 1); print '

    '.$langs->trans("AddStartHour").':

    '."\n"; print ''; } print ''; - $formother->select_year($search_syear ? $search_syear : -1, 'search_syear', 1, 20, 5, 0, 0, '', 'widthauto valignmiddle');*/ + print $formother->selectyear($search_syear ? $search_syear : -1, 'search_syear', 1, 20, 5, 0, 0, '', 'widthauto valignmiddle');*/ print '
    '; print $form->selectDate($search_date_start_start ? $search_date_start_start : -1, 'search_date_start_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From')); print '
    '; @@ -914,7 +914,7 @@ if (!empty($arrayfields['p.datee']['checked'])) { print ''; } print ''; - $formother->select_year($search_eyear ? $search_eyear : -1, 'search_eyear', 1, 20, 5, 0, 0, '', 'widthauto valignmiddle');*/ + print $formother->selectyear($search_eyear ? $search_eyear : -1, 'search_eyear', 1, 20, 5, 0, 0, '', 'widthauto valignmiddle');*/ print '
    '; print $form->selectDate($search_date_end_start ? $search_date_end_start : -1, 'search_date_end_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From')); print '
    '; diff --git a/htdocs/projet/tasks.php b/htdocs/projet/tasks.php index eacd507b35c..24f3874301b 100644 --- a/htdocs/projet/tasks.php +++ b/htdocs/projet/tasks.php @@ -901,7 +901,7 @@ if ($action == 'create' && $user->rights->projet->creer && (empty($object->third print ''; /*print ''; print ''; - $formother->select_year($search_dtstartyear ? $search_dtstartyear : -1, 'search_dtstartyear', 1, 20, 5);*/ + print $formother->selectyear($search_dtstartyear ? $search_dtstartyear : -1, 'search_dtstartyear', 1, 20, 5);*/ print '
    '; print $form->selectDate($search_date_start_start ? $search_date_start_start : -1, 'search_date_start_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From')); print '
    '; @@ -915,7 +915,7 @@ if ($action == 'create' && $user->rights->projet->creer && (empty($object->third print ''; /*print ''; print ''; - $formother->select_year($search_dtendyear ? $search_dtendyear : -1, 'search_dtendyear', 1, 20, 5);*/ + print $formother->selectyear($search_dtendyear ? $search_dtendyear : -1, 'search_dtendyear', 1, 20, 5);*/ print '
    '; print $form->selectDate($search_date_end_start ? $search_date_end_start : -1, 'search_date_end_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From')); print '
    '; diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php index fa987805a25..3718fe55e27 100644 --- a/htdocs/projet/tasks/time.php +++ b/htdocs/projet/tasks/time.php @@ -1562,7 +1562,7 @@ if (($id > 0 || !empty($ref)) || $projectidforalltimes > 0 || $allprojectforuser print ''; } print ''; - $formother->select_year($search_year, 'search_year', 1, 20, 5); + print $formother->selectyear($search_year, 'search_year', 1, 20, 5); print ''; } if (!empty($allprojectforuser)) { diff --git a/htdocs/societe/consumption.php b/htdocs/societe/consumption.php index 2ab5a836c51..5f997a37e9c 100644 --- a/htdocs/societe/consumption.php +++ b/htdocs/societe/consumption.php @@ -443,7 +443,7 @@ if ($sql_select) { print ''; print ''; // date print $formother->select_month($month ? $month : -1, 'month', 1, 0, 'valignmiddle'); - $formother->select_year($year ? $year : -1, 'year', 1, 20, 1, 0, 0, '', 'valignmiddle maxwidth75imp marginleftonly'); + print $formother->selectyear($year ? $year : -1, 'year', 1, 20, 1, 0, 0, '', 'valignmiddle maxwidth75imp marginleftonly'); print ''; print ''; print ''; diff --git a/htdocs/societe/paymentmodes.php b/htdocs/societe/paymentmodes.php index bdbf7453c35..e2ac40f8770 100644 --- a/htdocs/societe/paymentmodes.php +++ b/htdocs/societe/paymentmodes.php @@ -1683,7 +1683,7 @@ if ($socid && $action == 'editcard' && $permissiontoaddupdatepaymentinformation) print ''.$langs->trans("ExpiryDate").''; print ''; print $formother->select_month($companypaymentmode->exp_date_month, 'exp_date_month', 1); - print $formother->select_year($companypaymentmode->exp_date_year, 'exp_date_year', 1, 5, 10, 0, 0, '', 'marginleftonly'); + print $formother->selectyear($companypaymentmode->exp_date_year, 'exp_date_year', 1, 5, 10, 0, 0, '', 'marginleftonly'); print ''; print ''.$langs->trans("CVN").''; @@ -1841,7 +1841,7 @@ if ($socid && $action == 'createcard' && $permissiontoaddupdatepaymentinformatio print ''.$langs->trans("ExpiryDate").''; print ''; print $formother->select_month(GETPOST('exp_date_month', 'int'), 'exp_date_month', 1); - print $formother->select_year(GETPOST('exp_date_year', 'int'), 'exp_date_year', 1, 5, 10, 0, 0, '', 'marginleftonly'); + print $formother->selectyear(GETPOST('exp_date_year', 'int'), 'exp_date_year', 1, 5, 10, 0, 0, '', 'marginleftonly'); print ''; print ''.$langs->trans("CVN").''; From e0c3fa79cb0a616a6c9b894565f6583b742ea0e3 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Wed, 18 May 2022 11:39:47 +0200 Subject: [PATCH 572/738] fix : method was undefined and attached files was nok --- htdocs/core/class/html.formticket.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/html.formticket.class.php b/htdocs/core/class/html.formticket.class.php index a7cc3a996b4..b5b15e3634b 100644 --- a/htdocs/core/class/html.formticket.class.php +++ b/htdocs/core/class/html.formticket.class.php @@ -1267,7 +1267,7 @@ class FormTicket if (GETPOST('mode', 'alpha') == 'init' || (GETPOST('modelmailselected', 'alpha') && GETPOST('modelmailselected', 'alpha') != '-1')) { if (!empty($arraydefaultmessage->joinfiles) && is_array($this->param['fileinit'])) { foreach ($this->param['fileinit'] as $file) { - $this->add_attached_files($file, basename($file), dol_mimetype($file)); + $formmail->add_attached_files($file, basename($file), dol_mimetype($file)); } } } From cf2c46b583311c67c4130158a31dab048cba6bab Mon Sep 17 00:00:00 2001 From: lmarcouiller Date: Wed, 18 May 2022 12:31:09 +0200 Subject: [PATCH 573/738] Fix : php 8.0 warnings --- htdocs/adherents/admin/member.php | 14 +++++++------- htdocs/bom/bom_agenda.php | 3 ++- htdocs/bom/bom_document.php | 1 + htdocs/bom/bom_net_needs.php | 1 + htdocs/bom/bom_note.php | 2 +- htdocs/bom/class/bom.class.php | 13 ++++++++----- htdocs/core/actions_addupdatedelete.inc.php | 4 ++-- htdocs/core/class/commonobject.class.php | 6 +++--- .../modules/holiday/mod_holiday_immaculate.php | 4 ++-- 9 files changed, 27 insertions(+), 21 deletions(-) diff --git a/htdocs/adherents/admin/member.php b/htdocs/adherents/admin/member.php index 64197636d0e..ed2453ef793 100644 --- a/htdocs/adherents/admin/member.php +++ b/htdocs/adherents/admin/member.php @@ -248,8 +248,8 @@ if (!empty($conf->banque->enabled) && !empty($conf->societe->enabled) && !empty( $arraychoices['bankviainvoice'] = $langs->trans("MoreActionBankViaInvoice"); } print ''; -print $form->selectarray('ADHERENT_BANK_USE', $arraychoices, $conf->global->ADHERENT_BANK_USE, 0); -if ($conf->global->ADHERENT_BANK_USE == 'bankdirect' || $conf->global->ADHERENT_BANK_USE == 'bankviainvoice') { +print $form->selectarray('ADHERENT_BANK_USE', $arraychoices, getDolGlobalString('ADHERENT_BANK_USE'), 0); +if (getDolGlobalString('ADHERENT_BANK_USE') == 'bankdirect' || getDolGlobalString('ADHERENT_BANK_USE') == 'bankviainvoice') { print '
    '.$langs->trans("ABankAccountMustBeDefinedOnPaymentModeSetup").'
    '; } print ''; @@ -378,16 +378,16 @@ foreach ($dirmodels as $reldir) { print ''; } else { print ''."\n"; - print 'scandir.'&label='.urlencode($module->name).'">'.img_picto($langs->trans("Disabled"), 'switch_off').''; + print 'scandir) ? $module->scandir : '').'&label='.urlencode($module->name).'">'.img_picto($langs->trans("Disabled"), 'switch_off').''; print ""; } // Defaut print ''; - if ($conf->global->MEMBER_ADDON_PDF == $name) { + if (getDolGlobalString('MEMBER_ADDON_PDF') == $name) { print img_picto($langs->trans("Default"), 'on'); } else { - print 'scandir.'&label='.urlencode($module->name).'" alt="'.$langs->trans("Default").'">'.img_picto($langs->trans("Disabled"), 'off').''; + print 'scandir) ? $module->scandir : '').'&label='.urlencode($module->name).'" alt="'.$langs->trans("Default").'">'.img_picto($langs->trans("Disabled"), 'off').''; } print ''; @@ -398,8 +398,8 @@ foreach ($dirmodels as $reldir) { $htmltooltip .= '
    '.$langs->trans("Width").'/'.$langs->trans("Height").': '.$module->page_largeur.'/'.$module->page_hauteur; } $htmltooltip .= '

    '.$langs->trans("FeaturesSupported").':'; - $htmltooltip .= '
    '.$langs->trans("Logo").': '.yn($module->option_logo, 1, 1); - $htmltooltip .= '
    '.$langs->trans("MultiLanguage").': '.yn($module->option_multilang, 1, 1); + $htmltooltip .= '
    '.$langs->trans("Logo").': '.yn(!empty($module->option_logo) ? $module->option_logo : 0, 1, 1); + $htmltooltip .= '
    '.$langs->trans("MultiLanguage").': '.yn(!empty($module->option_multilang) ? $module->option_multilang : 0, 1, 1); print ''; diff --git a/htdocs/bom/bom_agenda.php b/htdocs/bom/bom_agenda.php index 2b9c6f57bbd..4bc9095a57e 100644 --- a/htdocs/bom/bom_agenda.php +++ b/htdocs/bom/bom_agenda.php @@ -40,6 +40,7 @@ $ref = GETPOST('ref', 'alpha'); $action = GETPOST('action', 'aZ09'); $cancel = GETPOST('cancel', 'aZ09'); $backtopage = GETPOST('backtopage', 'alpha'); +$socid = GETPOST('socid', 'int'); if (GETPOST('actioncode', 'array')) { $actioncode = GETPOST('actioncode', 'array', 3); @@ -79,7 +80,7 @@ $extrafields->fetch_name_optionals_label($object->table_element); // Load object include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once // Must be include, not include_once. Include fetch and fetch_thirdparty but not fetch_optionals if ($id > 0 || !empty($ref)) { - $upload_dir = $conf->bom->multidir_output[$object->entity]."/".$object->id; + $upload_dir = (!empty($conf->bom->multidir_output[$object->entity]) ? $conf->bom->multidir_output[$object->entity] : $conf->bom->dir_output)."/".$object->id; } // Security check - Protection if external user diff --git a/htdocs/bom/bom_document.php b/htdocs/bom/bom_document.php index 64f3cdbfac1..a0390ef5105 100644 --- a/htdocs/bom/bom_document.php +++ b/htdocs/bom/bom_document.php @@ -104,6 +104,7 @@ $form = new Form($db); $title = $langs->trans("BillOfMaterials").' - '.$langs->trans("Files"); $help_url = 'EN:Module_BOM'; +$morehtmlref = ""; llxHeader('', $title, $help_url); diff --git a/htdocs/bom/bom_net_needs.php b/htdocs/bom/bom_net_needs.php index 30cd6792c55..2b0b9a9def5 100644 --- a/htdocs/bom/bom_net_needs.php +++ b/htdocs/bom/bom_net_needs.php @@ -34,6 +34,7 @@ $langs->loadLangs(array("mrp", "other", "stocks")); // Get parameters $id = GETPOST('id', 'int'); +$lineid = GETPOST('lineid', 'int'); $ref = GETPOST('ref', 'alpha'); $action = GETPOST('action', 'aZ09'); $confirm = GETPOST('confirm', 'alpha'); diff --git a/htdocs/bom/bom_note.php b/htdocs/bom/bom_note.php index 8ace40cc900..9984a1498b8 100644 --- a/htdocs/bom/bom_note.php +++ b/htdocs/bom/bom_note.php @@ -54,7 +54,7 @@ $extrafields->fetch_name_optionals_label($object->table_element); // Load object include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once // Must be include, not include_once. Include fetch and fetch_thirdparty but not fetch_optionals if ($id > 0 || !empty($ref)) { - $upload_dir = $conf->bom->multidir_output[$object->entity]."/".$object->id; + $upload_dir = (!empty($conf->bom->multidir_output[$object->entity]) ? $conf->bom->multidir_output[$object->entity] : $conf->bom->dir_output)."/".$object->id; } $permissionnote = $user->rights->bom->write; // Used by the include of actions_setnotes.inc.php diff --git a/htdocs/bom/class/bom.class.php b/htdocs/bom/class/bom.class.php index 86e07ed424d..fb7fd68e13a 100644 --- a/htdocs/bom/class/bom.class.php +++ b/htdocs/bom/class/bom.class.php @@ -916,27 +916,27 @@ class BOM extends CommonObject if ($this->db->num_rows($result)) { $obj = $this->db->fetch_object($result); $this->id = $obj->rowid; - if ($obj->fk_user_author) { + if (!empty($obj->fk_user_author)) { $cuser = new User($this->db); $cuser->fetch($obj->fk_user_author); $this->user_creation = $cuser; } - if ($obj->fk_user_valid) { + if (!empty($obj->fk_user_valid)) { $vuser = new User($this->db); $vuser->fetch($obj->fk_user_valid); $this->user_validation = $vuser; } - if ($obj->fk_user_cloture) { + if (!empty($obj->fk_user_cloture)) { $cluser = new User($this->db); $cluser->fetch($obj->fk_user_cloture); $this->user_cloture = $cluser; } $this->date_creation = $this->db->jdate($obj->datec); - $this->date_modification = $this->db->jdate($obj->datem); - $this->date_validation = $this->db->jdate($obj->datev); + $this->date_modification = !empty($obj->datem) ? $this->db->jdate($obj->datem) : ""; + $this->date_validation = !empty($obj->datev) ? $this->db->jdate($obj->datev) : ""; } $this->db->free($result); @@ -1134,6 +1134,9 @@ class BOM extends CommonObject if (! empty($line->childBom)) { foreach ($line->childBom as $childBom) $childBom->getNetNeeds($TNetNeeds, $line->qty*$qty); } else { + if (empty($TNetNeeds[$line->fk_product])) { + $TNetNeeds[$line->fk_product] = 0; + } $TNetNeeds[$line->fk_product] += $line->qty*$qty; } } diff --git a/htdocs/core/actions_addupdatedelete.inc.php b/htdocs/core/actions_addupdatedelete.inc.php index cec127eeac4..85b854f8ba7 100644 --- a/htdocs/core/actions_addupdatedelete.inc.php +++ b/htdocs/core/actions_addupdatedelete.inc.php @@ -101,10 +101,10 @@ if ($action == 'add' && !empty($permissiontoadd)) { //var_dump($key.' '.$value.' '.$object->fields[$key]['type']); $object->$key = $value; - if ($val['notnull'] > 0 && $object->$key == '' && !is_null($val['default']) && $val['default'] == '(PROV)') { + if (!empty($val['notnull']) && $val['notnull'] > 0 && $object->$key == '' && isset($val['default']) && $val['default'] == '(PROV)') { $object->$key = '(PROV)'; } - if ($val['notnull'] > 0 && $object->$key == '' && is_null($val['default'])) { + if (!empty($val['notnull']) && $val['notnull'] > 0 && $object->$key == '' && !isset($val['default'])) { $error++; setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv($val['label'])), null, 'errors'); } diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 6466754f241..dc7433f64d7 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -4879,7 +4879,7 @@ abstract class CommonObject $product_static->fetch($line->fk_product); $product_static->ref = $line->ref; //can change ref in hook - $product_static->label = $line->label; //can change label in hook + $product_static->label = !empty($line->label) ? $line->label : ""; //can change label in hook $text = $product_static->getNomUrl(1); @@ -4915,7 +4915,7 @@ abstract class CommonObject $description .= (!empty($conf->global->PRODUIT_DESC_IN_FORM) ? '' : dol_htmlentitiesbr($line->description)); // Description is what to show on popup. We shown nothing if already into desc. } - $line->pu_ttc = price2num($line->subprice * (1 + ($line->tva_tx / 100)), 'MU'); + $line->pu_ttc = price2num((!empty($line->subprice) ? $line->subprice : 0) * (1 + ((!empty($line->tva_tx) ? $line->tva_tx : 0) / 100)), 'MU'); // Output template part (modules that overwrite templates must declare this into descriptor) // Use global variables + $dateSelector + $seller and $buyer @@ -6837,7 +6837,7 @@ abstract class CommonObject if ((string) $key == '') { continue; } - list($val, $parent) = explode('|', $val); + if (strpos($val, "|") !== false) list($val, $parent) = explode('|', $val); $out .= ''; } else { - if ($hideunselectables && $disabled && ($selected != $obj->rowid)) { + if ($disabled && ($selected != $obj->rowid)) { $resultat = ''; } else { $resultat = '
    '.$langs->trans("GoTo").' '.$virtualurl.'