/** * Executes a Navigate CMS function taking the 'fid' url parameter * fid can be the name of the package (p.e. "dashboard") or its numeric assignment (p.e. "6") * note: if no "fid" is found, then loads the first available menu function * * @return mixed Navigate CMS package output */ function core_run() { global $layout; global $menu_layout; $content = ""; $fid = 'dashboard'; // default function if (isset($_REQUEST['fid'])) { $fid = $_REQUEST['fid']; } $f = core_load_function($fid); if (empty($f) && ($fid == "dashboard" || empty($fid))) { // load first function available $fid = $menu_layout->menus[0]->items[0]->codename; if (empty($fid)) { $fid = "unknown"; } else { header('location: ' . NAVIGATE_MAIN . '?fid=' . $fid); core_terminate(); } } if (file_exists('lib/packages/' . $f->codename . '/' . $f->codename . '.php')) { include 'lib/packages/' . $f->codename . '/' . $f->codename . '.php'; $content = run(); } else { $content = 'function ' . $fid . ': <strong>' . $f->codename . '</strong> has not been found!'; } return $content; }
public static function action($function, $item = '', $action = '', $item_title = '', $data = '') { global $DB; global $website; global $user; $encoded_data = ''; if ($action == 'save' && function_exists('gzencode')) { $encoded_data = gzencode($data); } // a blank (new) form requested if ($action == 'load' && empty($item)) { return true; } $wid = $website->id; if (empty($wid)) { $wid = 0; } $uid = $user->id; if (empty($uid)) { $uid = 0; } if (!is_numeric($function)) { $func = core_load_function($function); $function = $func->id; } // prepared statement $ok = $DB->execute(' INSERT INTO nv_users_log (id, `date`, user, website, `function`, item, action, item_title, data) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )', array(0, core_time(), $uid, $wid, $function, value_or_default($item, ""), value_or_default($action, ""), value_or_default((string) $item_title, ""), value_or_default($encoded_data, ""))); if (!$ok) { throw new Exception($DB->get_last_error()); } return true; }
public function generate() { global $layout; global $website; $html = array(); $access = array(0 => '', 1 => '<img src="img/icons/silk/lock.png" align="absmiddle" title="' . t(361, 'Web users only') . '" />', 2 => '<img src="img/icons/silk/user_gray.png" align="absmiddle" title="' . t(363, 'Users who have not yet signed up or signed in') . '" />', 3 => '<img src="img/icons/silk/group_key.png" align="absmiddle" title="' . t(512, "Selected web user groups") . '" />'); $permissions = array(0 => '', 1 => '<img src="img/icons/silk/world_dawn.png" align="absmiddle" title="' . t(70, 'Private') . '" />', 2 => '<img src="img/icons/silk/world_night.png" align="absmiddle" title="' . t(81, 'Hidden') . '" />'); $html[] = '<div class="navigate-content-safe ui-corner-all" id="navigate-content-safe">'; $html[] = '<div class="navibrowse" id="' . $this->id . '">'; $html[] = '<div class="navibrowse-path ui-corner-all">'; $html[] = ' <a href="?fid=' . $_REQUEST['fid'] . '"><img src="img/icons/silk/folder_home.png" width="16px" height="16px" align="absbottom" /> ' . t(18, 'Home') . '</a>'; if ($this->parent > 0) { $html[] = ' <a href="?fid=' . $_REQUEST['fid'] . '&parent=' . $this->previous . '"><img src="img/icons/silk/folder_up.png" width="16px" height="16px" align="absbottom" /> ' . t(139, 'Back') . '</a>'; } // recent folders $function_id = $_REQUEST['fid']; if (!is_numeric($function_id)) { $f = core_load_function($_REQUEST['fid']); $function_id = $f->id; } $actions = users_log::recent_actions($function_id, 'list', 8); if (!empty($actions)) { $html[] = ' <a href="#" id="navigate-navibrowse-recent-items-link"><img src="img/icons/silk/folder_bell.png" width="16px" height="16px" align="absbottom" /> ' . t(275, 'Recent elements') . ' <span style=" float: right; " class="ui-icon ui-icon-triangle-1-s"></span></i></a>'; $layout->add_content('<ul id="navigate-navibrowse-recent-items" class="hidden">' . implode("\n", array_map(function ($action) { return '<li>' . '<a href="?fid=' . $_REQUEST['fid'] . '&parent=' . $action->item . '">' . '<img src="img/icons/silk/folder.png" style="vertical-align: text-bottom;" /> ' . file::getFullPathTo($action->item) . '</a>' . '</li>'; }, $actions)) . '</ul>'); $layout->add_script(' $("#navigate-navibrowse-recent-items-link").on("click", function(e) { e.preventDefault(); e.stopPropagation(); $("#navigate-navibrowse-recent-items").css({ position: "absolute", top: $("#navigate-navibrowse-recent-items-link").offset().top + 26, left: $("#navigate-navibrowse-recent-items-link").offset().left, zIndex: 10, "min-width": $("#navigate-navibrowse-recent-items-link").width() + "px" }); $("#navigate-navibrowse-recent-items").addClass("navi-ui-widget-shadow"); $("#navigate-navibrowse-recent-items").removeClass("hidden"); $("#navigate-navibrowse-recent-items").menu().show(); return false; }); '); } // folders hierarchy $html[] = ' <a href="#" onclick="navibrowse_folder_tree_dialog(' . $this->parent . ');"><img src="img/icons/silk/application_side_tree.png" width="16px" height="16px" align="absbottom" /> ' . t(75, 'Path') . ': ' . $this->path . '</a>'; $html[] = ' <div style="float: right;"> <i class="fa fa-filter"></i> <select id="navibrowse-filter-type" name="navibrowse-filter-type"> <option value="" selected="selected">(' . t(443, "All") . ')</option> <option value="folder">' . t(141, "Folder") . '</option> <option value="image">' . t(157, 'Image') . '</option> <option value="audio">' . t(31, 'Audio') . '</option> <option value="document">' . t(539, 'Document') . '</option> <option value="video">' . t(30, 'Video') . '</option> </select> </div> '; $layout->add_script(' $("#navibrowse-filter-type") .select2( { placeholder: "' . t(160, "Type") . '", allowClear: true, minimumResultsForSearch: Infinity, width: 150, templateResult: navibrowse_filter_type_render, templateSelection: navibrowse_filter_type_render }) .on("select2:unselecting", function(e) { $(this).select2("val", ""); $(this).val(""); e.preventDefault(); $(this).trigger("change"); }); function navibrowse_filter_type_render(opt) { if(!opt.id) { return opt.text; } var icon = "fa-file"; switch(opt.element.value) { case "folder": icon = "fa-folder-o"; break; case "image": icon = "fa-image"; break; case "audio": icon = "fa-music"; break; case "document": icon = "fa-file-text-o"; break; case "video": icon = "fa-video-camera"; break; } var html = $(\'<span><i class="fa fa-fw \'+icon+\'"></i> \' + opt.text + \'</span>\'); return html; } $("#navibrowse-filter-type").on("change", function () { $(".navibrowse-items > div").show(); if($("#navibrowse-filter-type").val() != "") { $(".navibrowse-items > div").each(function() { if($(this).data("file-type") == $("#navibrowse-filter-type").val()) $(this).show(); else $(this).hide(); }); } }); '); $html[] = '</div>'; $html[] = '<div class="navibrowse-items">'; if ($this->parent > 0) { $icon = $this->mimeIcon('folder/back'); $html[] = '<div class="navibrowse-folder navibrowse-back ui-corner-all" id="item-' . $this->previous . '">'; $html[] = ' <img src="' . $icon . '" width="' . $this->icon_size . '" height="' . $this->icon_size . '" />'; $html[] = ' <div class="navibrowse-item-name">' . t(139, 'Back') . '</div>'; $html[] = '</div>'; } if (empty($this->items)) { $this->items = array(); } foreach ($this->items as $item) { $icon = $this->mimeIcon($item->mime, $item->type); $thumbnail = ''; if ($item->type == 'image') { $thumbnail = NAVIGATE_DOWNLOAD . '?wid=' . $website->id . '&id=' . $item->id . '&disposition=inline&width=' . intval($this->icon_size) . '&height=' . intval($this->icon_size); } if ($item->type == 'folder') { $html[] = '<div class="navibrowse-folder ui-corner-all" mime="' . $item->mime . '" id="item-' . $item->id . '" data-file-type="' . $item->type . '" data-file-id="' . $item->id . '">'; $html[] = ' <img src="' . $icon . '" width="' . $this->icon_size . '" height="' . $this->icon_size . '" />'; $html[] = ' <div class="navibrowse-item-name">' . $item->name . '</div>'; $html[] = '</div>'; } else { $html[] = '<div class="navibrowse-file ui-corner-all" mime="' . $item->mime . '" id="item-' . $item->id . '" data-file-type="' . $item->type . '" data-file-id="' . $item->id . '">'; $html[] = ' <div class="navibrowse-file-access-icons">' . $permissions[$item->permission] . $access[$item->access] . '</div>'; $html[] = ' <img src="' . $icon . '" data-src="' . $thumbnail . '" width="' . $this->icon_size . '" height="' . $this->icon_size . '" />'; $html[] = ' <div class="navibrowse-item-name">' . $item->name . '</div>'; $html[] = '</div>'; } } $html[] = '<div class="clearer"> </div>'; $html[] = '</div>'; $html[] = '</div>'; $html[] = '</div>'; $hierarchy = file::hierarchy(0); $folders_tree = file::hierarchyList($hierarchy, $item->parent); $html[] = ' <div id="navibrowse-folder-tree-dialog" class="hidden"> <div class="navibrowse_folder_tree" style=" width: 90%; "> <img src="img/icons/silk/folder_home.png" align="absmiddle" /> ' . t(18, 'Home') . '<div class="tree_ul">' . $folders_tree . '</div> </div> </div> '; $html[] = '<script language="javascript" type="text/javascript">'; // replace placeholder images by real thumbnails after document is ready $html[] = ' $(window).on("load", function() { new LazyLoad({ threshold: 200, container: document.getElementById("navigate-content-safe"), elements_selector: ".navibrowse-file img", throttle: 40, data_src: "src", show_while_loading: true }); }); '; // $html[] = '$(".navibrowse-file, .navibrowse-folder").on("mouseover", function() { $(this).css("opacity", 0.7); });'; // $html[] = '$(".navibrowse-file, .navibrowse-folder").on("mouseout", function() { $(this).css("opacity", 1); });'; $html[] = '$(".navibrowse-path a").button();'; $html[] = '$(".navibrowse-items").children().on("click", function(e) { if(e.ctrlKey) { // just add or remove the item as selected if($(this).hasClass("ui-selected")) { $(this).removeClass("ui-selected ui-selectee"); $(this).children().removeClass("ui-selected ui-selectee"); } else $(this).addClass("ui-selected ui-selectee"); navibrowse_selected = $("div.navibrowse-file.ui-selected, div.navibrowse-folder.ui-selected"); } else { // deselect everything except the new selected item $(".navibrowse-items div").removeClass("ui-selectee ui-selected"); $(".navibrowse-items img").removeClass("ui-selectee ui-selected"); $(this).addClass("ui-selected ui-selectee"); } e.stopPropagation(); });'; $html[] = '$(".navibrowse-folder").on("dblclick", function() { window.location.href = "' . $this->url . '" + this.id.substring(5); });'; if (!empty($this->onDblClick)) { $html[] = '$(".navibrowse-file").on("dblclick", function() { ' . $this->onDblClick . '(this); });'; } $html[] = '$(".navibrowse-items").on("click", function() { $(".ui-selectee, .ui-selected").removeClass("ui-selectee ui-selected"); });'; if (!empty($this->onRightClick)) { $html[] = '$(".navibrowse-items").children().on("contextmenu", function(e) { if($(this).attr("id")=="item-0") return; e.preventDefault(); e.stopPropagation(); //$(".ui-selectee, .ui-selected").removeClass("ui-selectee ui-selected"); var ev = e; var trigger = this; setTimeout(function() { ' . $this->onRightClick . '(trigger, ev); }, 150); });'; } $html[] = '$(".navibrowse-items").selectable( { distance: 10, selecting: function(event, ui) { $(".navibrowse-back").removeClass("ui-selectee ui-selected"); }, selected: function(event, ui) { $(".navibrowse-back").removeClass("ui-selectee ui-selected"); $(".navibrowse-back").children().removeClass("ui-selectee ui-selected"); $(".clearer").removeClass("ui-selectee ui-selected"); navibrowse_selected = $("div.navibrowse-file.ui-selected, div.navibrowse-folder.ui-selected"); } });'; $html[] = ' $(".navibrowse_folder_tree .tree_ul").jstree({ plugins: ["changed", "types"], "types" : { "default": { "icon": "img/icons/silk/folder.png" }, "leaf": { "icon": "img/icons/silk/page_white.png" } }, "core" : { "multiple" : false } }).on("dblclick.jstree", function(e, data) { var node = $(e.target).closest("li"); window.location.href = "?fid=' . $_REQUEST['fid'] . '&parent=" + $(node).attr("value"); }); $("#navibrowse-folder-tree-dialog").hide(); function navibrowse_folder_tree_dialog(current) { $("#navibrowse-folder-tree-dialog").removeClass("hidden"); $("#navibrowse-folder-tree-dialog").dialog( { resizable: true, height: 350, width: 500, modal: true, title: "' . t(221, 'Jump to') . '…", buttons: { "' . t(58, 'Cancel') . '": function() { $(this).dialog("close"); } } }); } '; // drag'n'drop support if (!empty($this->onMove)) { $html[] = ' var navibrowse_selected; $(".navibrowse-items").children().not(".navibrowse-back").draggable( { opacity: 0.8, zIndex: 1000, revert: true, //"invalid", start: function(event, ui) { if(navibrowse_selected && navibrowse_selected.length < 1) { $(".navibrowse-items div").removeClass("ui-selectee ui-selected"); $(".navibrowse-items img").removeClass("ui-selectee ui-selected"); } $(this).addClass("ui-selected"); navibrowse_selected = $("div.navibrowse-file.ui-selected, div.navibrowse-folder.ui-selected"); if(navibrowse_selected.length > 1) $(ui.helper).append("<div id=\\"navibrowse-item-badge\\">" + navibrowse_selected.length + "</div>"); }, stop: function() { navibrowse_selected = $("div.navibrowse-file.ui-selected, div.navibrowse-folder.ui-selected"); $("#navibrowse-item-badge").remove(); } }); '; $html[] = ' $(".navibrowse-folder").droppable( { hoverClass: "ui-selected", tolerance: "pointer", drop: function(event, ui) { if(navibrowse_selected!=null && navibrowse_selected.length > 1) { var folder = $(this).attr("id").substring(5); var ids = []; $(navibrowse_selected).each(function() { if($(this).attr("id").substring(5) != folder) ids.push($(this).attr("id").substring(5)); }); navibrowse_selected = jQuery.grep(navibrowse_selected, function(value) { return $(value).attr("id").substring(5) != folder; }); ' . $this->onMove . '(ids, folder, navibrowse_selected); } else { var folder = $(this).attr("id").substring(5); var item = $(ui.draggable).attr("id").substring(5); ' . $this->onMove . '(item, folder, ui.draggable); } $(".navibrowse-items div").removeClass("ui-selectee ui-selected"); $(".navibrowse-items img").removeClass("ui-selectee ui-selected"); } }); '; } $html[] = '</script>'; return implode("\n", $html); }