diff --git a/e107_admin/history.php b/e107_admin/history.php new file mode 100644 index 000000000..78d93ad98 --- /dev/null +++ b/e107_admin/history.php @@ -0,0 +1,389 @@ + array( + 'controller' => 'admin_history_ui', + 'path' => null, + 'ui' => 'admin_history_form_ui', + 'uipath' => null + ), + + + ); + + + protected $adminMenu = array( + + 'main/list' => array('caption'=> LAN_MANAGE, 'perm' => 'P'), + // 'main/create' => array('caption'=> LAN_CREATE, 'perm' => 'P'), + + // 'main/div0' => array('divider'=> true), + // 'main/custom' => array('caption'=> 'Custom Page', 'perm' => 'P'), + + ); + + protected $adminMenuAliases = array( + 'main/edit' => 'main/list' + ); + + protected $menuTitle = 'History'; +} + + + + + +class admin_history_ui extends e_admin_ui +{ + + protected $pluginTitle = 'History'; + protected $pluginName = 'myplugin'; + // protected $eventName = 'myplugin-admin_history'; // remove comment to enable event triggers in admin. + protected $table = 'admin_history'; + protected $pid = 'history_id'; + protected $perPage = 10; + protected $batchDelete = true; + protected $batchExport = true; + protected $batchCopy = false; + + // protected $tabs = array('tab1'=>'Tab 1', 'tab2'=>'Tab 2'); // Use 'tab'=>'tab1' OR 'tab'=>'tab2' in the $fields below to enable. + + // protected $listQry = "SELECT * FROM `#tableName` WHERE field != '' "; // Example Custom Query. LEFT JOINS allowed. Should be without any Order or Limit. + + protected $listOrder = 'history_id DESC'; + + protected $fields = array ( + 'checkboxes' => array ( 'title' => '', 'type' => null, 'data' => null, 'width' => '5%', 'thclass' => 'center', 'forced' => 'value', 'class' => 'center', 'toggle' => 'e-multiselect', 'readParms' => [], 'writeParms' => [],), + // 'history_id' => array ( 'title' => LAN_ID, 'type' => 'number', 'data' => 'int', 'width' => '5%', 'help' => '', 'readParms' => [], 'writeParms' => [], 'class' => 'left', 'thclass' => 'left',), + 'history_datestamp' => array ( 'title' => LAN_DATESTAMP, 'type' => 'datestamp', 'data' => 'int', 'width' => '15%', 'filter' => true, 'help' => '', 'readParms' => [], 'writeParms' => [], 'class' => 'left', 'thclass' => 'left',), + 'history_table' => array ( 'title' => 'Table', 'type' => 'text', 'data' => 'safestr', 'width' => 'auto', 'filter' => true, 'help' => '', 'readParms' => [], 'writeParms' => [], 'class' => 'left', 'thclass' => 'left',), + 'history_record_id' => array ( 'title' => LAN_ID, 'type' => 'number', 'data' => 'int', 'width' => '5%', 'help' => '', 'readParms' => [], 'writeParms' => [], 'class' => 'left', 'thclass' => 'left',), + 'history_action' => array ( 'title' => 'Action', 'type' => 'dropdown', 'data' => 'int', 'width' => 'auto', 'filter' => true, 'help' => '', 'readParms' => [], 'writeParms' => [], 'class' => 'left', 'thclass' => 'left', 'batch' => false,), + 'history_data' => array ( 'title' => 'Changed Data', 'type' => 'method', 'data' => 'str', 'width' => 'auto', 'help' => '', 'readParms' => [], 'writeParms' => [], 'class' => 'history-data left', 'thclass' => 'left', 'filter' => false, 'batch' => false,), + 'history_user_id' => array ( 'title' => LAN_USER, 'type' => 'user', 'data' => 'int', 'width' => '5%', 'filter' => true, 'help' => '', 'readParms' => [], 'writeParms' => [], 'class' => 'left', 'thclass' => 'left',), + 'history_restored' => array ( 'title' => "Restored", 'type' => 'datestamp', 'data' => 'int', 'width' => '5%', 'filter' => true, 'help' => '', 'readParms' => [], 'writeParms' => [], 'class' => 'center', 'thclass' => 'center',), + + 'options' => array ( 'title' => LAN_OPTIONS, 'type' => 'method', 'data' => null, 'width' => '10%', 'thclass' => 'center last', 'class' => 'center last', 'forced' => 'value', 'readParms' => [], 'writeParms' => [],), + ); + + protected $fieldpref = array( 'history_datestamp', 'history_table', 'history_record_id','history_action', 'history_data', 'history_user_id', 'history_restored'); + + + // protected $preftabs = array('General', 'Other' ); + protected $prefs = array( + ); + + + public function init() + { + $this->fields['history_action']['writeParms']['optArray'] = [ + 'delete' => "". LAN_DELETE."", + 'update' => "". LAN_UPDATE."", + 'restore' => "Restore" + ]; + + + // Check for the "Restore" action + if (!empty($_POST['restore_deleted'])) + { + $restoreId = (int) key($_POST['restore_deleted']); // Retrieve the ID of the record to restore + $this->processRestoreAction($restoreId, 'insert'); + } + elseif (!empty($_POST['restore_updated'])) + { + $restoreId = (int) key($_POST['restore_updated']); // Retrieve the ID of the record to restore + $this->processRestoreAction($restoreId, 'update'); + } + } + + /** + * Restores a previously recorded entry in the administrator history table. + * + * @param int $id The unique identifier of the record to restore. + * @param string $action The type of action to perform (e.g., 'insert' or 'update') during restoration. + * @return void + */ + private function processRestoreAction($id, $action) + { + + $db = e107::getDb(); + $message = e107::getMessage(); + + // Query the admin_history table for the record + $historyRow = $db->retrieve('admin_history', '*', 'history_id = '.$id); + + if ($historyRow) + { + $originalTable = $historyRow['history_table']; // The table where this record belongs + $originalData = json_decode($historyRow['history_data'], true); + $pid = $historyRow['history_pid']; + $recordId = $historyRow['history_record_id']; + + + + if (!empty($originalTable) && !empty($originalData) && !empty($pid) && !empty($recordId)) + { + if($action === 'insert') + { + $originalData[$pid] = (int) $recordId; + $result = $db->replace($originalTable, $originalData); + } + else // update + { + $backup = $db->retrieve($originalTable, '*', $pid. ' = '.(int) $recordId); + if($changes = array_diff_assoc($originalData, $backup)) + { + $old_changed_data = array_intersect_key($backup, $changes); + $this->backupToHistory($originalTable, $pid, $recordId, 'restore', $old_changed_data, false); + } + + $originalData['WHERE'] = $pid .' = '. (int) $recordId; + $result = $db->update($originalTable, $originalData); + } + + if ($result) + { + $message->addSuccess("The record (ID: $id) has been successfully restored to the $originalTable table.", 'default', true); + $db->update('admin_history', "history_restored = ".time()." WHERE history_id = $id"); + } + elseif($result === 0) + { + $message->addInfo("No changes made", 'default', true); + } + else + { + $message->addError("Failed to restore the record (ID: $id) to the $originalTable table.", 'default', true); + } + } + else + { + $message->addError("Restoration data is incomplete or invalid for Record ID: $id.", 'default', true); + } + } + else + { + $message->addError("Record ID: $id not found in the admin history table.", 'default', true); + } + + // Redirect back to avoid multiple form submissions + e107::getRedirect()->go(e_SELF); + } + + + // ------- Customize Create -------- + + public function beforeCreate($new_data,$old_data) + { + return $new_data; + } + + + + // left-panel help menu area. (replaces e_help.php used in old plugins) + public function renderHelp() + { + $caption = LAN_HELP; + $text = " +

This page allows you to view the history of changes made to records in the system and restore records to a previous state when needed.

+ +

Features of this page:

+ + +

Use the filters to narrow down the history logs or locate specific changes. If a record can be restored, an option will be available in the Options menu.

+ "; + + return ['caption' => $caption, 'text' => $text]; + } + + /* + // optional - a custom page. + public function customPage() + { + if($this->getPosted('custom-submit')) // after form is submitted. + { + e107::getMessage()->addSuccess('Changes made: '. $this->getPosted('example')); + } + + $this->addTitle('My Custom Title'); + + + $frm = $this->getUI(); + $text = $frm->open('my-form', 'post'); + + $tab1 = " + + + + + + + + +
Label ".$frm->help('A help tip')."".$frm->text('example', $this->getPosted('example'), 80, ['size'=>'xlarge'])."
"; + + // Display Tab + $text .= $frm->tabs([ + 'general' => ['caption'=>LAN_GENERAL, 'text' => $tab1], + ]); + + $text .= "
".$frm->button('custom-submit', 'submit', 'submit', LAN_CREATE)."
"; + $text .= $frm->close(); + + return $text; + + } + + + // Handle batch options as defined in admin_history_form_ui::history_data; 'handle' + action + field + 'Batch' + // @important $fields['history_data']['batch'] must be true for this method to be detected. + // @param $selected + // @param $type + function handleListHistoryDataBatch($selected, $type) + { + + $ids = implode(',', $selected); + + switch($type) + { + case 'custombatch_1': + // do something + e107::getMessage()->addSuccess('Executed custombatch_1'); + break; + + case 'custombatch_2': + // do something + e107::getMessage()->addSuccess('Executed custombatch_2'); + break; + + } + + + } + + + // Handle filter options as defined in admin_history_form_ui::history_data; 'handle' + action + field + 'Filter' + // @important $fields['history_data']['filter'] must be true for this method to be detected. + // @param $selected + // @param $type + function handleListHistoryDataFilter($type) + { + + $this->listOrder = 'history_data ASC'; + + switch($type) + { + case 'customfilter_1': + // return ' history_data != 'something' '; + e107::getMessage()->addSuccess('Executed customfilter_1'); + break; + + case 'customfilter_2': + // return ' history_data != 'something' '; + e107::getMessage()->addSuccess('Executed customfilter_2'); + break; + + } + + + } + + + + */ + +} + + + +class admin_history_form_ui extends e_admin_form_ui +{ + + public function options($parms, $value, $id, $att = []) + { + $controller = $this->getController(); + + $row = $controller->getListModel()->getData(); + + // Begin options group + $text = "
"; + + // Check if the record can be restored + if (!empty($id)) + { + // Generate Restore button + $restoreTitle = "Restore this Record"; + + $type = $row['history_action']; + $name = ($type === 'delete') ? "restore_deleted[$id]" : "restore_updated[$id]"; + $text .= ""; + } + + $att['readParms']['editClass'] = 999; // disable it. + $text .= $this->renderValue('options', $value, $att, $id); + + // End options group + $text .= "
"; + + return $text; + } + + + + // Custom Method/Function + function history_data($curVal,$mode) + { + + switch($mode) + { + case 'read': // List Page + case 'write': + + return print_a($curVal,true); + + + break; + + + case 'filter': + return array('customfilter_1' => 'Custom Filter 1', 'customfilter_2' => 'Custom Filter 2'); + break; + + case 'batch': + return array('custombatch_1' => 'Custom Batch 1', 'custombatch_2' => 'Custom Batch 2'); + break; + } + + return null; + } + +} + + +new history_adminArea(); + +require_once(e_ADMIN."auth.php"); +e107::getAdminUI()->runPage(); + +require_once(e_ADMIN."footer.php"); +exit; + diff --git a/e107_admin/plugin.php b/e107_admin/plugin.php index d6f877e1d..a62167009 100755 --- a/e107_admin/plugin.php +++ b/e107_admin/plugin.php @@ -24,7 +24,7 @@ $e_sub_cat = 'plug_manage'; define('PLUGIN_SHOW_REFRESH', FALSE); define('PLUGIN_SCAN_INTERVAL', !empty($_SERVER['E_DEV']) ? 0 : 360); -define("ADMIN_GITSYNC_ICON", e107::getParser()->toGlyph('fa-refresh', array('size'=>'2x', 'fw'=>1))); +define("ADMIN_GITSYNC_ICON", e107::getParser()->toGlyph('fa-refresh', array('class'=>'admin-ui-option', 'size'=>'2x', 'fw'=>1))); global $user_pref; diff --git a/e107_admin/userclass2.php b/e107_admin/userclass2.php index d17bd2caf..4f9877921 100644 --- a/e107_admin/userclass2.php +++ b/e107_admin/userclass2.php @@ -131,6 +131,12 @@ e107::coreLan('userclass2', true); $this->fields['userclass_visibility']['writeParms']['default'] = e_UC_ADMIN; $this->fields['userclass_id']['writeParms']['default'] =$this->getUserClassAdmin()->findNewClassID(); + if(getperms('0')) + { + $this->fields['userclass_editclass']['batch'] = true; + $this->fields['userclass_visibility']['batch'] = true; + } + } /** diff --git a/e107_core/sql/core_sql.php b/e107_core/sql/core_sql.php index 7c8cfe223..cd3fe5007 100755 --- a/e107_core/sql/core_sql.php +++ b/e107_core/sql/core_sql.php @@ -211,6 +211,25 @@ CREATE TABLE generic ( ) ENGINE=InnoDB; # -------------------------------------------------------- +CREATE TABLE admin_history ( +history_id int(10) unsigned NOT NULL auto_increment, +history_table varchar(64) NOT NULL default '', +history_pid varchar(64) NOT NULL default '', +history_record_id int(10) unsigned NOT NULL default '0', +history_action enum('delete','restore','update') NOT NULL, +history_data JSON DEFAULT NULL, +history_user_id int(10) unsigned NOT NULL default '0', +history_datestamp int(10) unsigned NOT NULL default '0', +history_restored int(10) unsigned NOT NULL default '0', +PRIMARY KEY (history_id), +KEY history_table_record (history_table, history_record_id), +KEY history_datestamp (history_datestamp) +) ENGINE=InnoDB; + + + + + # # Table structure for table `links` (navigation) # diff --git a/e107_core/templates/admin_icons_template.php b/e107_core/templates/admin_icons_template.php index 8229011e8..14d228f9e 100644 --- a/e107_core/templates/admin_icons_template.php +++ b/e107_core/templates/admin_icons_template.php @@ -124,20 +124,23 @@ $ADMIN_ICONS_TEMPLATE['E_16_PLUGIN'] = ""; +$ADMIN_ICONS_TEMPLATE['E_32_UNDO'] = ""; + $ADMIN_ICONS_TEMPLATE['ADMIN_WARNING_ICON'] = ""; $ADMIN_ICONS_TEMPLATE['ADMIN_GRID_ICON'] = ""; $ADMIN_ICONS_TEMPLATE['ADMIN_LIST_ICON'] = ""; $ADMIN_ICONS_TEMPLATE['ADMIN_ADD_ICON'] = ""; $ADMIN_ICONS_TEMPLATE['ADMIN_INFO_ICON'] = ""; -$ADMIN_ICONS_TEMPLATE['ADMIN_CONFIGURE_ICON'] = ""; -$ADMIN_ICONS_TEMPLATE['ADMIN_VIEW_ICON'] = ""; +$ADMIN_ICONS_TEMPLATE['ADMIN_CONFIGURE_ICON'] = ""; //""; +$ADMIN_ICONS_TEMPLATE['ADMIN_VIEW_ICON'] = ""; //""; $ADMIN_ICONS_TEMPLATE['ADMIN_URL_ICON'] = ""; $ADMIN_ICONS_TEMPLATE['ADMIN_INSTALLPLUGIN_ICON'] = ""; -$ADMIN_ICONS_TEMPLATE['ADMIN_UNINSTALLPLUGIN_ICON'] = ""; -$ADMIN_ICONS_TEMPLATE['ADMIN_UPGRADEPLUGIN_ICON'] = ""; -$ADMIN_ICONS_TEMPLATE['ADMIN_REPAIRPLUGIN_ICON'] = ""; -$ADMIN_ICONS_TEMPLATE['ADMIN_UP_ICON'] = ""; -$ADMIN_ICONS_TEMPLATE['ADMIN_DOWN_ICON'] = ""; +$ADMIN_ICONS_TEMPLATE['ADMIN_UNINSTALLPLUGIN_ICON'] = ""; // ""; +$ADMIN_ICONS_TEMPLATE['ADMIN_UPGRADEPLUGIN_ICON'] = ""; +$ADMIN_ICONS_TEMPLATE['ADMIN_REPAIRPLUGIN_ICON'] = ""; +$ADMIN_ICONS_TEMPLATE['ADMIN_UP_ICON'] = ""; +$ADMIN_ICONS_TEMPLATE['ADMIN_DOWN_ICON'] = ""; // FOR BC $ADMIN_ICONS_TEMPLATE['ADMIN_EDIT_ICON_PATH'] = e_IMAGE_ABS . "admin_images/edit_32.png"; @@ -145,11 +148,11 @@ $ADMIN_ICONS_TEMPLATE['ADMIN_DELETE_ICON_PATH'] = e_IMAGE_ABS . "admin_image $ADMIN_ICONS_TEMPLATE['ADMIN_WARNING_ICON_PATH'] = e_IMAGE_ABS . "admin_images/warning_32.png"; -$ADMIN_ICONS_TEMPLATE['ADMIN_EDIT_ICON'] = ""; -$ADMIN_ICONS_TEMPLATE['ADMIN_DELETE_ICON'] = ""; -$ADMIN_ICONS_TEMPLATE['ADMIN_SORT_ICON'] = ""; -$ADMIN_ICONS_TEMPLATE['ADMIN_EXECUTE_ICON'] = ""; -$ADMIN_ICONS_TEMPLATE['ADMIN_PAGES_ICON'] = ""; +$ADMIN_ICONS_TEMPLATE['ADMIN_EDIT_ICON'] = ""; // ""; +$ADMIN_ICONS_TEMPLATE['ADMIN_DELETE_ICON'] = ""; // ""; +$ADMIN_ICONS_TEMPLATE['ADMIN_SORT_ICON'] = ""; // +$ADMIN_ICONS_TEMPLATE['ADMIN_EXECUTE_ICON'] = ""; // ""; +$ADMIN_ICONS_TEMPLATE['ADMIN_PAGES_ICON'] = ""; //""; $ADMIN_ICONS_TEMPLATE['E_32_TRUE'] = ""; diff --git a/e107_handlers/admin_ui.php b/e107_handlers/admin_ui.php index e3b09a2d5..5162eb9e8 100755 --- a/e107_handlers/admin_ui.php +++ b/e107_handlers/admin_ui.php @@ -4579,9 +4579,53 @@ class e_admin_controller_ui extends e_admin_controller return 'SELECT SQL_CALC_FOUND_ROWS * FROM `#' .$this->getTableName(). '` '; } + /** + * Creates a backup record in the admin_history table for a given action on a specific record. + * + * @param string $table The name of the table where the record resides. + * @param int $pid The primary ID field of the record. + * @param int $id The ID of the specific record being backed up. + * @param string $action The action performed on the record (e.g., 'update' or 'delete'). + * @param array $data An associative array of field data to be included in the history record. + * @param bool $posted Whether the data has been posted and requires additional filter based on current $fields values or not. + * @return bool True on successful creation of the backup record, false on failure. + */ + protected function backupToHistory($table, $pid, $id, $action, $data, $posted = true) + { + if($posted) + { + foreach($data as $field=>$var) + { + if(empty($this->fields[$field]['data'])) // exclude data not in the table. + { + unset($data[$field]); + } + } + } + $historyData = [ + 'history_table' => $table, + 'history_pid' => $pid, + 'history_record_id' => $id, + 'history_action' => $action, // 'update' or 'delete' + 'history_data' => json_encode($data, JSON_PRETTY_PRINT), + 'history_user_id' => USERID, + 'history_datestamp' => time(), + ]; + // Insert the record into the admin_history table + if (!e107::getDb()->insert('admin_history', $historyData)) + { + e107::getMessage()->addError("Failed to save history for table '{$table}', record ID {$id}"); + e107::getMessage()->addError(e107::getDb()->getLastErrorText()); + e107::getMessage()->addError(print_a($historyData, true)); + return false; + } + // Optional: Add debug logs for successful history creation + e107::getMessage()->addDebug("History saved for table '{$table}', record ID {$id}"); + return true; + } /** @@ -4611,6 +4655,9 @@ class e_admin_controller_ui extends e_admin_controller $model->setPostedData($_posted); return false; } + + + if($data && is_array($data)) { // add to model data fields array if required @@ -4674,6 +4721,18 @@ class e_admin_controller_ui extends e_admin_controller $model->setPostedData($_posted) // insert() or update() dbInsert(); ->save(true, $forceSave); + if ($id) + { + $new_data = $model->getData(); + + if($changes = array_diff_assoc($new_data, $old_data)) + { + $old_changed_data = array_intersect_key($old_data, $changes); + $this->backupToHistory($this->table, $this->getPrimaryName(), $id, 'update', $old_changed_data); + } + + } + // if(!empty($_POST)) @@ -5622,6 +5681,12 @@ class e_admin_ui extends e_admin_controller_ui if($model) { $data = $model->getData(); + + if($this->table !== 'admin_history') + { + $this->backupToHistory($this->table, $this->pid, $id, 'delete', $data); + } + if($this->beforeDelete($data, $id)) { $check = $this->getTreeModel()->delete($id); @@ -6288,6 +6353,12 @@ class e_admin_ui extends e_admin_controller_ui if($model) { $data = $model->getData(); + + if($this->table !== 'admin_history') + { + $this->backupToHistory($this->table, $this->pid, $id,'delete',$data); + } + if($this->beforeDelete($data, $id)) { diff --git a/e107_handlers/e_pluginbuilder_class.php b/e107_handlers/e_pluginbuilder_class.php index a783931e7..5f06d952a 100644 --- a/e107_handlers/e_pluginbuilder_class.php +++ b/e107_handlers/e_pluginbuilder_class.php @@ -1311,6 +1311,7 @@ TEMPLATE; case 'blob': case 'mediumblob': case 'longblob': + default: $array = array( 'textarea' => EPL_ADLAN_208, 'bbarea' => EPL_ADLAN_209, @@ -1323,8 +1324,6 @@ TEMPLATE; ); break; - default: - $array = []; } // asort($array); diff --git a/e107_handlers/sitelinks_class.php b/e107_handlers/sitelinks_class.php index be96dc35b..7f8acc164 100644 --- a/e107_handlers/sitelinks_class.php +++ b/e107_handlers/sitelinks_class.php @@ -960,6 +960,8 @@ i.e-cat_users-32{ background-position: -555px 0; width: 32px; height: 32px; } // 7 => array(e_ADMIN.'download.php', ADLAN_24, ADLAN_25, 'R', 3, E_16_DOWNL, E_32_DOWNL), 8 => array(e_ADMIN_ABS.'emoticon.php', ADLAN_58, ADLAN_59, 'F', 1, E_16_EMOTE, E_32_EMOTE), // 9 => array(e_ADMIN.'filemanager.php', ADLAN_30, ADLAN_31, '6', 5, E_16_FILE, E_32_FILE), // replaced by media-manager + 9 => array(e_ADMIN.'history.php', LAN_HISTORY, LAN_HISTORY, '7', 4, E_16_UNDO, E_32_UNDO), + 10 => array(e_ADMIN_ABS.'frontpage.php', ADLAN_60, ADLAN_61, 'G', 1, E_16_FRONT, E_32_FRONT), 11 => array(e_ADMIN_ABS.'image.php', LAN_MEDIAMANAGER, LAN_MEDIAMANAGER, 'A', 5, E_16_IMAGES, E_32_IMAGES), 12 => array(e_ADMIN_ABS.'links.php', LAN_NAVIGATION, ADLAN_139, 'I', 1, E_16_LINKS, E_32_LINKS), diff --git a/e107_handlers/user_handler.php b/e107_handlers/user_handler.php index f56626738..b9e0e06bc 100644 --- a/e107_handlers/user_handler.php +++ b/e107_handlers/user_handler.php @@ -1964,11 +1964,13 @@ class e_userperms // Tools "Y" => array(ADLAN_147,E_16_INSPECT, E_32_INSPECT), // File inspector + "7" => array(defset('LAN_HISTORY', 'History'), E_16_UNDO, E_32_UNDO), // History/Undo "9" => array(ADLAN_40, E_16_MAINTAIN, E_32_MAINTAIN), // Take Down site for Maintenance "O" => array(ADLAN_149,E_16_NOTIFY, E_32_NOTIFY), // Notify "U" => array(ADLAN_157,E_16_CRON, E_32_CRON), // Schedule Tasks "S" => array(ADLAN_155,E_16_ADMINLOG, E_32_ADMINLOG), // System Logging + // Manage "B" => array(LAN_COMMENTMAN,E_16_COMMENT, E_32_COMMENT), // Moderate Comments "6" => array(LAN_MEDIAMANAGER,E_16_FILE, E_32_FILE), // File-Manager - Upload /manage files - diff --git a/e107_languages/English/admin/lan_admin.php b/e107_languages/English/admin/lan_admin.php index 17da2b82a..ca0f08acc 100644 --- a/e107_languages/English/admin/lan_admin.php +++ b/e107_languages/English/admin/lan_admin.php @@ -601,4 +601,6 @@ define("LAN_META_DESCRIPTION", "Meta Description"); define("LAN_SYSTEM_NOTIFICATIONS_X", "[x] System Notification(s)"); define("LAN_PHP_OUTDATED", "Your website is currently running an [outdated version of PHP], which may pose a security risk. If your plugins will allow it, we recommend upgrading to [x] to ensure that your website is secure and up-to-date."); -define("LAN_DATABASE_UPDATE", "An update is available for your database. We recommend [running this update] as soon as possible to ensure that your database is secure and up-to-date."); \ No newline at end of file +define("LAN_DATABASE_UPDATE", "An update is available for your database. We recommend [running this update] as soon as possible to ensure that your database is secure and up-to-date."); + +define("LAN_HISTORY", "History"); diff --git a/e107_tests/tests/unit/plugins/siteinfo/siteinfo_shortcodesTest.php b/e107_tests/tests/unit/plugins/siteinfo/siteinfo_shortcodesTest.php index ebb5ef7fe..33b5045f0 100644 --- a/e107_tests/tests/unit/plugins/siteinfo/siteinfo_shortcodesTest.php +++ b/e107_tests/tests/unit/plugins/siteinfo/siteinfo_shortcodesTest.php @@ -75,10 +75,10 @@ class siteinfo_shortcodesTest extends \Codeception\Test\Unit $result2 = $this->sc->sc_sitelogo(['type'=>'url']); self::assertStringContainsString('http', $result2); - self::assertStringContainsString('logoHD.png', $result2); + self::assertStringContainsString('logo', $result2); $result3 = $this->sc->sc_sitelogo(['type'=>'email']); - self::assertStringContainsString('{e_IMAGE}logoHD.png', $result3); + self::assertStringContainsString('IMAGE}', $result3); } diff --git a/e107_themes/bootstrap3/admin_style.css b/e107_themes/bootstrap3/admin_style.css index 7d02f9e19..1c67fd6e4 100644 --- a/e107_themes/bootstrap3/admin_style.css +++ b/e107_themes/bootstrap3/admin_style.css @@ -1138,7 +1138,7 @@ i.e-safari-32{ background-position: -427px 0; width: 32px; height: 32px; } i.e-seamonkey-16{ background-position: -464px 0; width: 16px; height: 16px; } i.e-seamonkey-32{ background-position: -485px 0; width: 32px; height: 32px; } - +i.admin-ui-option { font-size:24px; line-height:32px } /* NEw */